tar-xz 3.1.2 → 3.2.1

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 (61) hide show
  1. package/lib/browser/create.d.ts +27 -0
  2. package/lib/browser/create.d.ts.map +1 -0
  3. package/lib/browser/create.js +113 -0
  4. package/lib/browser/create.js.map +1 -0
  5. package/lib/browser/extract.d.ts +24 -0
  6. package/lib/browser/extract.d.ts.map +1 -0
  7. package/lib/browser/extract.js +112 -0
  8. package/lib/browser/extract.js.map +1 -0
  9. package/lib/browser/index.d.ts +7 -0
  10. package/lib/browser/index.d.ts.map +1 -0
  11. package/lib/browser/index.js +7 -0
  12. package/lib/browser/index.js.map +1 -0
  13. package/lib/browser/list.d.ts +23 -0
  14. package/lib/browser/list.d.ts.map +1 -0
  15. package/lib/browser/list.js +81 -0
  16. package/lib/browser/list.js.map +1 -0
  17. package/lib/index.browser.d.ts +12 -0
  18. package/lib/index.browser.d.ts.map +1 -0
  19. package/lib/index.browser.js +14 -0
  20. package/lib/index.browser.js.map +1 -0
  21. package/lib/index.d.ts +12 -0
  22. package/lib/index.d.ts.map +1 -0
  23. package/lib/index.js +14 -0
  24. package/lib/index.js.map +1 -0
  25. package/lib/node/create.d.ts +22 -0
  26. package/lib/node/create.d.ts.map +1 -0
  27. package/lib/node/create.js +155 -0
  28. package/lib/node/create.js.map +1 -0
  29. package/lib/node/extract.d.ts +30 -0
  30. package/lib/node/extract.d.ts.map +1 -0
  31. package/lib/node/extract.js +283 -0
  32. package/lib/node/extract.js.map +1 -0
  33. package/lib/node/index.d.ts +7 -0
  34. package/lib/node/index.d.ts.map +1 -0
  35. package/lib/node/index.js +7 -0
  36. package/lib/node/index.js.map +1 -0
  37. package/lib/node/list.d.ts +20 -0
  38. package/lib/node/list.d.ts.map +1 -0
  39. package/lib/node/list.js +121 -0
  40. package/lib/node/list.js.map +1 -0
  41. package/lib/tar/checksum.d.ts +40 -0
  42. package/lib/tar/checksum.d.ts.map +1 -0
  43. package/lib/tar/checksum.js +91 -0
  44. package/lib/tar/checksum.js.map +1 -0
  45. package/lib/tar/format.d.ts +87 -0
  46. package/lib/tar/format.d.ts.map +1 -0
  47. package/lib/tar/format.js +244 -0
  48. package/lib/tar/format.js.map +1 -0
  49. package/lib/tar/index.d.ts +8 -0
  50. package/lib/tar/index.d.ts.map +1 -0
  51. package/lib/tar/index.js +6 -0
  52. package/lib/tar/index.js.map +1 -0
  53. package/lib/tar/pax.d.ts +82 -0
  54. package/lib/tar/pax.d.ts.map +1 -0
  55. package/lib/tar/pax.js +185 -0
  56. package/lib/tar/pax.js.map +1 -0
  57. package/lib/types.d.ts +144 -0
  58. package/lib/types.d.ts.map +1 -0
  59. package/lib/types.js +26 -0
  60. package/lib/types.js.map +1 -0
  61. package/package.json +6 -6
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Browser-based TAR creation with XZ compression
3
+ */
4
+ import { type BrowserCreateOptions } from '../types.js';
5
+ /**
6
+ * Create a tar.xz archive in browser
7
+ *
8
+ * @param options - Creation options
9
+ * @returns Compressed archive as Uint8Array
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * const archive = await createTarXz({
14
+ * files: [
15
+ * { name: 'hello.txt', content: 'Hello, World!' },
16
+ * { name: 'data.json', content: JSON.stringify({ foo: 'bar' }) }
17
+ * ],
18
+ * preset: 3
19
+ * });
20
+ *
21
+ * // Download the archive
22
+ * const blob = new Blob([archive], { type: 'application/x-xz' });
23
+ * const url = URL.createObjectURL(blob);
24
+ * ```
25
+ */
26
+ export declare function createTarXz(options: BrowserCreateOptions): Promise<Uint8Array>;
27
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/browser/create.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,OAAO,EAAE,KAAK,oBAAoB,EAAgB,MAAM,aAAa,CAAC;AAsCtE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,CAiEpF"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Browser-based TAR creation with XZ compression
3
+ */
4
+ import { xzAsync } from 'node-liblzma';
5
+ import { calculatePadding, createEndOfArchive, createHeader, createPaxHeaderBlocks, needsPaxHeaders, } from '../tar/index.js';
6
+ import { TarEntryType } from '../types.js';
7
+ /**
8
+ * Convert input content to Uint8Array
9
+ */
10
+ async function toUint8Array(content) {
11
+ if (typeof content === 'string') {
12
+ return new TextEncoder().encode(content);
13
+ }
14
+ if (content instanceof Uint8Array) {
15
+ return content;
16
+ }
17
+ if (content instanceof ArrayBuffer) {
18
+ return new Uint8Array(content);
19
+ }
20
+ if (content instanceof Blob) {
21
+ const buffer = await content.arrayBuffer();
22
+ return new Uint8Array(buffer);
23
+ }
24
+ throw new Error('Unsupported content type');
25
+ }
26
+ /**
27
+ * Concatenate multiple Uint8Arrays
28
+ */
29
+ function concatArrays(arrays) {
30
+ const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0);
31
+ const result = new Uint8Array(totalLength);
32
+ let offset = 0;
33
+ for (const arr of arrays) {
34
+ result.set(arr, offset);
35
+ offset += arr.length;
36
+ }
37
+ return result;
38
+ }
39
+ /**
40
+ * Create a tar.xz archive in browser
41
+ *
42
+ * @param options - Creation options
43
+ * @returns Compressed archive as Uint8Array
44
+ *
45
+ * @example
46
+ * ```ts
47
+ * const archive = await createTarXz({
48
+ * files: [
49
+ * { name: 'hello.txt', content: 'Hello, World!' },
50
+ * { name: 'data.json', content: JSON.stringify({ foo: 'bar' }) }
51
+ * ],
52
+ * preset: 3
53
+ * });
54
+ *
55
+ * // Download the archive
56
+ * const blob = new Blob([archive], { type: 'application/x-xz' });
57
+ * const url = URL.createObjectURL(blob);
58
+ * ```
59
+ */
60
+ export async function createTarXz(options) {
61
+ const { files, preset = 3 } = options;
62
+ const blocks = [];
63
+ for (const file of files) {
64
+ const content = await toUint8Array(file.content);
65
+ const size = content.length;
66
+ // Normalize name
67
+ let name = file.name.replace(/\\/g, '/');
68
+ // Determine if it's a directory (ends with / and has no content)
69
+ const isDir = name.endsWith('/') && size === 0;
70
+ const type = isDir ? TarEntryType.DIRECTORY : TarEntryType.FILE;
71
+ // Check if PAX headers are needed
72
+ if (needsPaxHeaders({ name, size })) {
73
+ const paxBlocks = createPaxHeaderBlocks(name, {
74
+ path: name,
75
+ size,
76
+ });
77
+ blocks.push(...paxBlocks);
78
+ // Truncate name for the regular header
79
+ name = name.slice(-100);
80
+ }
81
+ // Create header
82
+ const mtime = file.mtime
83
+ ? typeof file.mtime === 'number'
84
+ ? file.mtime
85
+ : Math.floor(file.mtime.getTime() / 1000)
86
+ : Math.floor(Date.now() / 1000);
87
+ const header = createHeader({
88
+ name,
89
+ type,
90
+ size,
91
+ mode: file.mode ?? (isDir ? 0o755 : 0o644),
92
+ mtime,
93
+ });
94
+ blocks.push(header);
95
+ // Add content
96
+ if (size > 0) {
97
+ blocks.push(content);
98
+ // Add padding
99
+ const padding = calculatePadding(size);
100
+ if (padding > 0) {
101
+ blocks.push(new Uint8Array(padding));
102
+ }
103
+ }
104
+ }
105
+ // Add end-of-archive marker
106
+ blocks.push(createEndOfArchive());
107
+ // Concatenate all blocks into TAR
108
+ const tarData = concatArrays(blocks);
109
+ // Compress with XZ
110
+ // Cast to any because WASM accepts Uint8Array but types are defined for Node.js Buffer
111
+ return xzAsync(tarData, { preset });
112
+ }
113
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/browser/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Browser-based TAR extraction with XZ decompression
3
+ */
4
+ import { type BrowserExtractOptions, type ExtractedFile } from '../types.js';
5
+ /**
6
+ * Extract a tar.xz archive in browser
7
+ *
8
+ * @param archive - Compressed archive data (ArrayBuffer or Uint8Array)
9
+ * @param options - Extraction options
10
+ * @returns Array of extracted files
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * const response = await fetch('archive.tar.xz');
15
+ * const data = await response.arrayBuffer();
16
+ * const files = await extractTarXz(data);
17
+ *
18
+ * for (const file of files) {
19
+ * console.log(file.name, file.data.length);
20
+ * }
21
+ * ```
22
+ */
23
+ export declare function extractTarXz(archive: ArrayBuffer | Uint8Array, options?: BrowserExtractOptions): Promise<ExtractedFile[]>;
24
+ //# sourceMappingURL=extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/browser/extract.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAGnB,MAAM,aAAa,CAAC;AA4ErB;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,WAAW,GAAG,UAAU,EACjC,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,aAAa,EAAE,CAAC,CAoC1B"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Browser-based TAR extraction 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 data into entries
9
+ */
10
+ function parseTar(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
+ // Extract content
50
+ const contentData = entry.size > 0 ? data.subarray(offset, offset + entry.size) : new Uint8Array(0);
51
+ offset += entry.size + calculatePadding(entry.size);
52
+ entries.push({ ...entry, data: contentData });
53
+ }
54
+ return entries;
55
+ }
56
+ /**
57
+ * Strip leading path components from a path
58
+ */
59
+ function stripPath(filePath, strip) {
60
+ if (strip <= 0) {
61
+ return filePath;
62
+ }
63
+ const parts = filePath.split('/');
64
+ return parts.slice(strip).join('/');
65
+ }
66
+ /**
67
+ * Extract a tar.xz archive in browser
68
+ *
69
+ * @param archive - Compressed archive data (ArrayBuffer or Uint8Array)
70
+ * @param options - Extraction options
71
+ * @returns Array of extracted files
72
+ *
73
+ * @example
74
+ * ```ts
75
+ * const response = await fetch('archive.tar.xz');
76
+ * const data = await response.arrayBuffer();
77
+ * const files = await extractTarXz(data);
78
+ *
79
+ * for (const file of files) {
80
+ * console.log(file.name, file.data.length);
81
+ * }
82
+ * ```
83
+ */
84
+ export async function extractTarXz(archive, options = {}) {
85
+ const { strip = 0, filter } = options;
86
+ // Convert to Uint8Array if needed
87
+ const archiveData = archive instanceof Uint8Array ? archive : new Uint8Array(archive);
88
+ // Decompress XZ
89
+ // Cast to any because WASM accepts Uint8Array but types are defined for Node.js Buffer
90
+ const tarData = await unxzAsync(archiveData);
91
+ // Parse TAR
92
+ const entries = parseTar(tarData);
93
+ // Apply strip and filter
94
+ const results = [];
95
+ for (const entry of entries) {
96
+ const strippedName = stripPath(entry.name, strip);
97
+ if (!strippedName) {
98
+ continue;
99
+ }
100
+ const strippedEntry = { ...entry, name: strippedName };
101
+ if (filter && !filter(strippedEntry)) {
102
+ continue;
103
+ }
104
+ results.push({
105
+ name: strippedName,
106
+ data: entry.data,
107
+ entry: strippedEntry,
108
+ });
109
+ }
110
+ return results;
111
+ }
112
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/browser/extract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Browser API for tar.xz archives
3
+ */
4
+ export { createTarXz } from './create.js';
5
+ export { extractTarXz } from './extract.js';
6
+ export { listTarXz } from './list.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","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,7 @@
1
+ /**
2
+ * Browser API for tar.xz archives
3
+ */
4
+ export { createTarXz } from './create.js';
5
+ export { extractTarXz } from './extract.js';
6
+ export { listTarXz } from './list.js';
7
+ //# sourceMappingURL=index.js.map
@@ -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"}