@js-ak/excel-toolbox 1.2.5 → 1.2.6

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.
@@ -58,7 +58,7 @@ function mergeSheetsToBaseFileProcess(data) {
58
58
  if (!baseFiles[basePath]) {
59
59
  throw new Error(`Base file does not contain ${basePath}`);
60
60
  }
61
- const { lastRowNumber, mergeCells: baseMergeCells, rows: baseRows, } = Xml.extractRowsFromSheet(baseFiles[basePath]);
61
+ const { lastRowNumber, mergeCells: baseMergeCells, rows: baseRows, xml, } = Xml.extractRowsFromSheet(baseFiles[basePath]);
62
62
  const allRows = [...baseRows];
63
63
  const allMergeCells = [...baseMergeCells];
64
64
  let currentRowOffset = lastRowNumber + gap;
@@ -84,19 +84,19 @@ function mergeSheetsToBaseFileProcess(data) {
84
84
  currentRowOffset += Utils.getMaxRowNumber(rows) + gap;
85
85
  }
86
86
  }
87
- const mergedXml = Xml.buildMergedSheet(baseFiles[basePath], allRows, allMergeCells);
87
+ const mergedXml = Xml.buildMergedSheet(xml, allRows, allMergeCells);
88
88
  baseFiles[basePath] = mergedXml;
89
89
  for (const sheetIndex of sheetsToRemove) {
90
90
  const sheetPath = `xl/worksheets/sheet${sheetIndex}.xml`;
91
91
  delete baseFiles[sheetPath];
92
92
  if (baseFiles["xl/workbook.xml"]) {
93
- baseFiles["xl/workbook.xml"] = Utils.removeSheetFromWorkbook(baseFiles["xl/workbook.xml"], sheetIndex);
93
+ baseFiles["xl/workbook.xml"] = Buffer.from(Utils.removeSheetFromWorkbook(baseFiles["xl/workbook.xml"].toString(), sheetIndex));
94
94
  }
95
95
  if (baseFiles["xl/_rels/workbook.xml.rels"]) {
96
- baseFiles["xl/_rels/workbook.xml.rels"] = Utils.removeSheetFromRels(baseFiles["xl/_rels/workbook.xml.rels"], sheetIndex);
96
+ baseFiles["xl/_rels/workbook.xml.rels"] = Buffer.from(Utils.removeSheetFromRels(baseFiles["xl/_rels/workbook.xml.rels"].toString(), sheetIndex));
97
97
  }
98
98
  if (baseFiles["[Content_Types].xml"]) {
99
- baseFiles["[Content_Types].xml"] = Utils.removeSheetFromContentTypes(baseFiles["[Content_Types].xml"], sheetIndex);
99
+ baseFiles["[Content_Types].xml"] = Buffer.from(Utils.removeSheetFromContentTypes(baseFiles["[Content_Types].xml"].toString(), sheetIndex));
100
100
  }
101
101
  }
102
102
  for (const sheetName of sheetNamesToRemove) {
@@ -8,8 +8,8 @@ exports.removeSheetByName = removeSheetByName;
8
8
  * @returns {void}
9
9
  */
10
10
  function removeSheetByName(files, sheetName) {
11
- const workbookXml = files["xl/workbook.xml"];
12
- const relsXml = files["xl/_rels/workbook.xml.rels"];
11
+ const workbookXml = files["xl/workbook.xml"]?.toString();
12
+ const relsXml = files["xl/_rels/workbook.xml.rels"]?.toString();
13
13
  if (!workbookXml || !relsXml) {
14
14
  return;
15
15
  }
@@ -34,11 +34,13 @@ function removeSheetByName(files, sheetName) {
34
34
  return;
35
35
  }
36
36
  const targetPath = `xl/${targetMatch[1]}`.replace(/\\/g, "/");
37
- delete files[targetPath];
38
- files["xl/workbook.xml"] = workbookXml.replace(sheetTag, "");
39
- files["xl/_rels/workbook.xml.rels"] = relsXml.replace(relTag, "");
40
- const contentTypes = files["[Content_Types].xml"];
37
+ if (targetPath) {
38
+ delete files[targetPath];
39
+ }
40
+ files["xl/workbook.xml"] = Buffer.from(workbookXml.replace(sheetTag, ""));
41
+ files["xl/_rels/workbook.xml.rels"] = Buffer.from(relsXml.replace(relTag, ""));
42
+ const contentTypes = files["[Content_Types].xml"]?.toString();
41
43
  if (contentTypes) {
42
- files["[Content_Types].xml"] = contentTypes.replace(new RegExp(`<Override[^>]+PartName=["']/${targetPath}["'][^>]*/>`, "g"), "");
44
+ files["[Content_Types].xml"] = Buffer.from(contentTypes.replace(new RegExp(`<Override[^>]+PartName=["']/${targetPath}["'][^>]*/>`, "g"), ""));
43
45
  }
44
46
  }
@@ -12,7 +12,7 @@ exports.buildMergedSheet = buildMergedSheet;
12
12
  * @param {string[]} mergedRows - Array of XML strings representing each row in the merged sheet.
13
13
  * @param {Object[]} [mergeCells] - Optional array of merge cell definitions.
14
14
  * Each object should have a 'ref' property specifying the merge range (e.g., "A1:B2").
15
- * @returns {string} - The reconstructed XML string with merged content.
15
+ * @returns {Buffer} - The reconstructed XML string with merged content.
16
16
  */
17
17
  function buildMergedSheet(originalXml, mergedRows, mergeCells = []) {
18
18
  // Remove any existing <mergeCells> section from the XML
@@ -27,5 +27,5 @@ function buildMergedSheet(originalXml, mergedRows, mergeCells = []) {
27
27
  // Insert <mergeCells> after </sheetData> and before the next XML tag
28
28
  xmlData = xmlData.replace(/(<\/sheetData>)(\s*<)/, `$1\n${mergeCellsXml}\n$2`);
29
29
  }
30
- return xmlData;
30
+ return Buffer.from(xmlData);
31
31
  }
@@ -60,5 +60,6 @@ function extractRowsFromSheet(sheet) {
60
60
  lastRowNumber,
61
61
  mergeCells,
62
62
  rows,
63
+ xml,
63
64
  };
64
65
  }
@@ -1,45 +1,45 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.readSync = readSync;
4
- const node_zlib_1 = require("node:zlib");
7
+ const node_zlib_1 = __importDefault(require("node:zlib"));
5
8
  /**
6
9
  * Parses a ZIP archive from a buffer and extracts the files within.
7
10
  *
8
11
  * @param {Buffer} buffer - The buffer containing the ZIP archive data.
9
- * @returns {Object.<string, string>} - An object where keys are file names and values are file contents.
12
+ * @returns {Object.<string, Buffer>} - An object where keys are file names and values are file contents as Buffers.
10
13
  * @throws {Error} - Throws an error if an unsupported compression method is encountered or if decompression fails.
11
14
  */
12
15
  function readSync(buffer) {
13
16
  const files = {};
14
17
  let offset = 0;
15
- while (offset + 4 <= buffer.length) {
18
+ while (offset + 30 <= buffer.length) {
16
19
  const signature = buffer.readUInt32LE(offset);
17
20
  if (signature !== 0x04034b50)
18
- break;
21
+ break; // not a local file header
22
+ const generalPurposeBitFlag = buffer.readUInt16LE(offset + 6);
19
23
  const compressionMethod = buffer.readUInt16LE(offset + 8);
20
24
  const fileNameLength = buffer.readUInt16LE(offset + 26);
21
- const extraLength = buffer.readUInt16LE(offset + 28);
25
+ const extraFieldLength = buffer.readUInt16LE(offset + 28);
22
26
  const fileNameStart = offset + 30;
23
27
  const fileNameEnd = fileNameStart + fileNameLength;
24
28
  const fileName = buffer.subarray(fileNameStart, fileNameEnd).toString();
25
- const dataStart = fileNameEnd + extraLength;
26
- let nextOffset = dataStart;
27
- while (nextOffset + 4 <= buffer.length) {
28
- if (buffer.readUInt32LE(nextOffset) === 0x04034b50)
29
- break;
30
- nextOffset++;
29
+ const dataStart = fileNameEnd + extraFieldLength;
30
+ const compressedSize = buffer.readUInt32LE(offset + 18);
31
+ const useDataDescriptor = (generalPurposeBitFlag & 0x08) !== 0;
32
+ if (useDataDescriptor) {
33
+ throw new Error(`File ${fileName} uses data descriptor. Not supported in this minimal parser.`);
31
34
  }
32
- if (nextOffset + 4 > buffer.length) {
33
- nextOffset = buffer.length;
34
- }
35
- const compressedData = buffer.subarray(dataStart, nextOffset);
36
- let content = "";
35
+ const compressedData = buffer.subarray(dataStart, dataStart + compressedSize);
36
+ let content;
37
37
  try {
38
38
  if (compressionMethod === 0) {
39
- content = compressedData.toString();
39
+ content = compressedData;
40
40
  }
41
41
  else if (compressionMethod === 8) {
42
- content = (0, node_zlib_1.inflateRawSync)(new Uint8Array(compressedData)).toString();
42
+ content = node_zlib_1.default.inflateRawSync(compressedData);
43
43
  }
44
44
  else {
45
45
  throw new Error(`Unsupported compression method ${compressionMethod}`);
@@ -50,7 +50,7 @@ function readSync(buffer) {
50
50
  throw new Error(`Error unpacking file ${fileName}: ${message}`);
51
51
  }
52
52
  files[fileName] = content;
53
- offset = nextOffset;
53
+ offset = dataStart + compressedSize;
54
54
  }
55
55
  return files;
56
56
  }
@@ -11,40 +11,37 @@ const inflateRaw = node_util_1.default.promisify(node_zlib_1.default.inflateRaw)
11
11
  * Parses a ZIP archive from a buffer and extracts the files within.
12
12
  *
13
13
  * @param {Buffer} buffer - The buffer containing the ZIP archive data.
14
- * @returns {Object.<string, string>} - An object where keys are file names and values are file contents.
14
+ * @returns {Object.<string, Buffer>} - An object where keys are file names and values are file contents as Buffers.
15
15
  * @throws {Error} - Throws an error if an unsupported compression method is encountered or if decompression fails.
16
16
  */
17
17
  async function read(buffer) {
18
18
  const files = {};
19
19
  let offset = 0;
20
- while (offset + 4 <= buffer.length) {
20
+ while (offset + 30 <= buffer.length) {
21
21
  const signature = buffer.readUInt32LE(offset);
22
22
  if (signature !== 0x04034b50)
23
- break;
23
+ break; // not a local file header
24
+ const generalPurposeBitFlag = buffer.readUInt16LE(offset + 6);
24
25
  const compressionMethod = buffer.readUInt16LE(offset + 8);
25
26
  const fileNameLength = buffer.readUInt16LE(offset + 26);
26
- const extraLength = buffer.readUInt16LE(offset + 28);
27
+ const extraFieldLength = buffer.readUInt16LE(offset + 28);
27
28
  const fileNameStart = offset + 30;
28
29
  const fileNameEnd = fileNameStart + fileNameLength;
29
30
  const fileName = buffer.subarray(fileNameStart, fileNameEnd).toString();
30
- const dataStart = fileNameEnd + extraLength;
31
- let nextOffset = dataStart;
32
- while (nextOffset + 4 <= buffer.length) {
33
- if (buffer.readUInt32LE(nextOffset) === 0x04034b50)
34
- break;
35
- nextOffset++;
31
+ const dataStart = fileNameEnd + extraFieldLength;
32
+ const compressedSize = buffer.readUInt32LE(offset + 18);
33
+ const useDataDescriptor = (generalPurposeBitFlag & 0x08) !== 0;
34
+ if (useDataDescriptor) {
35
+ throw new Error(`File ${fileName} uses data descriptor. Not supported in this minimal parser.`);
36
36
  }
37
- if (nextOffset + 4 > buffer.length) {
38
- nextOffset = buffer.length;
39
- }
40
- const compressedData = buffer.subarray(dataStart, nextOffset);
41
- let content = "";
37
+ const compressedData = buffer.subarray(dataStart, dataStart + compressedSize);
38
+ let content;
42
39
  try {
43
40
  if (compressionMethod === 0) {
44
- content = compressedData.toString();
41
+ content = compressedData;
45
42
  }
46
43
  else if (compressionMethod === 8) {
47
- content = (await inflateRaw(new Uint8Array(compressedData))).toString();
44
+ content = await inflateRaw(compressedData);
48
45
  }
49
46
  else {
50
47
  throw new Error(`Unsupported compression method ${compressionMethod}`);
@@ -55,7 +52,7 @@ async function read(buffer) {
55
52
  throw new Error(`Error unpacking file ${fileName}: ${message}`);
56
53
  }
57
54
  files[fileName] = content;
58
- offset = nextOffset;
55
+ offset = dataStart + compressedSize;
59
56
  }
60
57
  return files;
61
58
  }
@@ -22,7 +22,7 @@ export function mergeSheetsToBaseFileProcess(data) {
22
22
  if (!baseFiles[basePath]) {
23
23
  throw new Error(`Base file does not contain ${basePath}`);
24
24
  }
25
- const { lastRowNumber, mergeCells: baseMergeCells, rows: baseRows, } = Xml.extractRowsFromSheet(baseFiles[basePath]);
25
+ const { lastRowNumber, mergeCells: baseMergeCells, rows: baseRows, xml, } = Xml.extractRowsFromSheet(baseFiles[basePath]);
26
26
  const allRows = [...baseRows];
27
27
  const allMergeCells = [...baseMergeCells];
28
28
  let currentRowOffset = lastRowNumber + gap;
@@ -48,19 +48,19 @@ export function mergeSheetsToBaseFileProcess(data) {
48
48
  currentRowOffset += Utils.getMaxRowNumber(rows) + gap;
49
49
  }
50
50
  }
51
- const mergedXml = Xml.buildMergedSheet(baseFiles[basePath], allRows, allMergeCells);
51
+ const mergedXml = Xml.buildMergedSheet(xml, allRows, allMergeCells);
52
52
  baseFiles[basePath] = mergedXml;
53
53
  for (const sheetIndex of sheetsToRemove) {
54
54
  const sheetPath = `xl/worksheets/sheet${sheetIndex}.xml`;
55
55
  delete baseFiles[sheetPath];
56
56
  if (baseFiles["xl/workbook.xml"]) {
57
- baseFiles["xl/workbook.xml"] = Utils.removeSheetFromWorkbook(baseFiles["xl/workbook.xml"], sheetIndex);
57
+ baseFiles["xl/workbook.xml"] = Buffer.from(Utils.removeSheetFromWorkbook(baseFiles["xl/workbook.xml"].toString(), sheetIndex));
58
58
  }
59
59
  if (baseFiles["xl/_rels/workbook.xml.rels"]) {
60
- baseFiles["xl/_rels/workbook.xml.rels"] = Utils.removeSheetFromRels(baseFiles["xl/_rels/workbook.xml.rels"], sheetIndex);
60
+ baseFiles["xl/_rels/workbook.xml.rels"] = Buffer.from(Utils.removeSheetFromRels(baseFiles["xl/_rels/workbook.xml.rels"].toString(), sheetIndex));
61
61
  }
62
62
  if (baseFiles["[Content_Types].xml"]) {
63
- baseFiles["[Content_Types].xml"] = Utils.removeSheetFromContentTypes(baseFiles["[Content_Types].xml"], sheetIndex);
63
+ baseFiles["[Content_Types].xml"] = Buffer.from(Utils.removeSheetFromContentTypes(baseFiles["[Content_Types].xml"].toString(), sheetIndex));
64
64
  }
65
65
  }
66
66
  for (const sheetName of sheetNamesToRemove) {
@@ -5,8 +5,8 @@
5
5
  * @returns {void}
6
6
  */
7
7
  export function removeSheetByName(files, sheetName) {
8
- const workbookXml = files["xl/workbook.xml"];
9
- const relsXml = files["xl/_rels/workbook.xml.rels"];
8
+ const workbookXml = files["xl/workbook.xml"]?.toString();
9
+ const relsXml = files["xl/_rels/workbook.xml.rels"]?.toString();
10
10
  if (!workbookXml || !relsXml) {
11
11
  return;
12
12
  }
@@ -31,11 +31,13 @@ export function removeSheetByName(files, sheetName) {
31
31
  return;
32
32
  }
33
33
  const targetPath = `xl/${targetMatch[1]}`.replace(/\\/g, "/");
34
- delete files[targetPath];
35
- files["xl/workbook.xml"] = workbookXml.replace(sheetTag, "");
36
- files["xl/_rels/workbook.xml.rels"] = relsXml.replace(relTag, "");
37
- const contentTypes = files["[Content_Types].xml"];
34
+ if (targetPath) {
35
+ delete files[targetPath];
36
+ }
37
+ files["xl/workbook.xml"] = Buffer.from(workbookXml.replace(sheetTag, ""));
38
+ files["xl/_rels/workbook.xml.rels"] = Buffer.from(relsXml.replace(relTag, ""));
39
+ const contentTypes = files["[Content_Types].xml"]?.toString();
38
40
  if (contentTypes) {
39
- files["[Content_Types].xml"] = contentTypes.replace(new RegExp(`<Override[^>]+PartName=["']/${targetPath}["'][^>]*/>`, "g"), "");
41
+ files["[Content_Types].xml"] = Buffer.from(contentTypes.replace(new RegExp(`<Override[^>]+PartName=["']/${targetPath}["'][^>]*/>`, "g"), ""));
40
42
  }
41
43
  }
@@ -9,7 +9,7 @@
9
9
  * @param {string[]} mergedRows - Array of XML strings representing each row in the merged sheet.
10
10
  * @param {Object[]} [mergeCells] - Optional array of merge cell definitions.
11
11
  * Each object should have a 'ref' property specifying the merge range (e.g., "A1:B2").
12
- * @returns {string} - The reconstructed XML string with merged content.
12
+ * @returns {Buffer} - The reconstructed XML string with merged content.
13
13
  */
14
14
  export function buildMergedSheet(originalXml, mergedRows, mergeCells = []) {
15
15
  // Remove any existing <mergeCells> section from the XML
@@ -24,5 +24,5 @@ export function buildMergedSheet(originalXml, mergedRows, mergeCells = []) {
24
24
  // Insert <mergeCells> after </sheetData> and before the next XML tag
25
25
  xmlData = xmlData.replace(/(<\/sheetData>)(\s*<)/, `$1\n${mergeCellsXml}\n$2`);
26
26
  }
27
- return xmlData;
27
+ return Buffer.from(xmlData);
28
28
  }
@@ -57,5 +57,6 @@ export function extractRowsFromSheet(sheet) {
57
57
  lastRowNumber,
58
58
  mergeCells,
59
59
  rows,
60
+ xml,
60
61
  };
61
62
  }
@@ -1,42 +1,39 @@
1
- import { inflateRawSync } from "node:zlib";
1
+ import zlib from "node:zlib";
2
2
  /**
3
3
  * Parses a ZIP archive from a buffer and extracts the files within.
4
4
  *
5
5
  * @param {Buffer} buffer - The buffer containing the ZIP archive data.
6
- * @returns {Object.<string, string>} - An object where keys are file names and values are file contents.
6
+ * @returns {Object.<string, Buffer>} - An object where keys are file names and values are file contents as Buffers.
7
7
  * @throws {Error} - Throws an error if an unsupported compression method is encountered or if decompression fails.
8
8
  */
9
9
  export function readSync(buffer) {
10
10
  const files = {};
11
11
  let offset = 0;
12
- while (offset + 4 <= buffer.length) {
12
+ while (offset + 30 <= buffer.length) {
13
13
  const signature = buffer.readUInt32LE(offset);
14
14
  if (signature !== 0x04034b50)
15
- break;
15
+ break; // not a local file header
16
+ const generalPurposeBitFlag = buffer.readUInt16LE(offset + 6);
16
17
  const compressionMethod = buffer.readUInt16LE(offset + 8);
17
18
  const fileNameLength = buffer.readUInt16LE(offset + 26);
18
- const extraLength = buffer.readUInt16LE(offset + 28);
19
+ const extraFieldLength = buffer.readUInt16LE(offset + 28);
19
20
  const fileNameStart = offset + 30;
20
21
  const fileNameEnd = fileNameStart + fileNameLength;
21
22
  const fileName = buffer.subarray(fileNameStart, fileNameEnd).toString();
22
- const dataStart = fileNameEnd + extraLength;
23
- let nextOffset = dataStart;
24
- while (nextOffset + 4 <= buffer.length) {
25
- if (buffer.readUInt32LE(nextOffset) === 0x04034b50)
26
- break;
27
- nextOffset++;
23
+ const dataStart = fileNameEnd + extraFieldLength;
24
+ const compressedSize = buffer.readUInt32LE(offset + 18);
25
+ const useDataDescriptor = (generalPurposeBitFlag & 0x08) !== 0;
26
+ if (useDataDescriptor) {
27
+ throw new Error(`File ${fileName} uses data descriptor. Not supported in this minimal parser.`);
28
28
  }
29
- if (nextOffset + 4 > buffer.length) {
30
- nextOffset = buffer.length;
31
- }
32
- const compressedData = buffer.subarray(dataStart, nextOffset);
33
- let content = "";
29
+ const compressedData = buffer.subarray(dataStart, dataStart + compressedSize);
30
+ let content;
34
31
  try {
35
32
  if (compressionMethod === 0) {
36
- content = compressedData.toString();
33
+ content = compressedData;
37
34
  }
38
35
  else if (compressionMethod === 8) {
39
- content = inflateRawSync(new Uint8Array(compressedData)).toString();
36
+ content = zlib.inflateRawSync(compressedData);
40
37
  }
41
38
  else {
42
39
  throw new Error(`Unsupported compression method ${compressionMethod}`);
@@ -47,7 +44,7 @@ export function readSync(buffer) {
47
44
  throw new Error(`Error unpacking file ${fileName}: ${message}`);
48
45
  }
49
46
  files[fileName] = content;
50
- offset = nextOffset;
47
+ offset = dataStart + compressedSize;
51
48
  }
52
49
  return files;
53
50
  }
@@ -5,40 +5,37 @@ const inflateRaw = util.promisify(zlib.inflateRaw);
5
5
  * Parses a ZIP archive from a buffer and extracts the files within.
6
6
  *
7
7
  * @param {Buffer} buffer - The buffer containing the ZIP archive data.
8
- * @returns {Object.<string, string>} - An object where keys are file names and values are file contents.
8
+ * @returns {Object.<string, Buffer>} - An object where keys are file names and values are file contents as Buffers.
9
9
  * @throws {Error} - Throws an error if an unsupported compression method is encountered or if decompression fails.
10
10
  */
11
11
  export async function read(buffer) {
12
12
  const files = {};
13
13
  let offset = 0;
14
- while (offset + 4 <= buffer.length) {
14
+ while (offset + 30 <= buffer.length) {
15
15
  const signature = buffer.readUInt32LE(offset);
16
16
  if (signature !== 0x04034b50)
17
- break;
17
+ break; // not a local file header
18
+ const generalPurposeBitFlag = buffer.readUInt16LE(offset + 6);
18
19
  const compressionMethod = buffer.readUInt16LE(offset + 8);
19
20
  const fileNameLength = buffer.readUInt16LE(offset + 26);
20
- const extraLength = buffer.readUInt16LE(offset + 28);
21
+ const extraFieldLength = buffer.readUInt16LE(offset + 28);
21
22
  const fileNameStart = offset + 30;
22
23
  const fileNameEnd = fileNameStart + fileNameLength;
23
24
  const fileName = buffer.subarray(fileNameStart, fileNameEnd).toString();
24
- const dataStart = fileNameEnd + extraLength;
25
- let nextOffset = dataStart;
26
- while (nextOffset + 4 <= buffer.length) {
27
- if (buffer.readUInt32LE(nextOffset) === 0x04034b50)
28
- break;
29
- nextOffset++;
25
+ const dataStart = fileNameEnd + extraFieldLength;
26
+ const compressedSize = buffer.readUInt32LE(offset + 18);
27
+ const useDataDescriptor = (generalPurposeBitFlag & 0x08) !== 0;
28
+ if (useDataDescriptor) {
29
+ throw new Error(`File ${fileName} uses data descriptor. Not supported in this minimal parser.`);
30
30
  }
31
- if (nextOffset + 4 > buffer.length) {
32
- nextOffset = buffer.length;
33
- }
34
- const compressedData = buffer.subarray(dataStart, nextOffset);
35
- let content = "";
31
+ const compressedData = buffer.subarray(dataStart, dataStart + compressedSize);
32
+ let content;
36
33
  try {
37
34
  if (compressionMethod === 0) {
38
- content = compressedData.toString();
35
+ content = compressedData;
39
36
  }
40
37
  else if (compressionMethod === 8) {
41
- content = (await inflateRaw(new Uint8Array(compressedData))).toString();
38
+ content = await inflateRaw(compressedData);
42
39
  }
43
40
  else {
44
41
  throw new Error(`Unsupported compression method ${compressionMethod}`);
@@ -49,7 +46,7 @@ export async function read(buffer) {
49
46
  throw new Error(`Error unpacking file ${fileName}: ${message}`);
50
47
  }
51
48
  files[fileName] = content;
52
- offset = nextOffset;
49
+ offset = dataStart + compressedSize;
53
50
  }
54
51
  return files;
55
52
  }
@@ -16,10 +16,10 @@
16
16
  */
17
17
  export declare function mergeSheetsToBaseFileProcess(data: {
18
18
  additions: {
19
- files: Record<string, string>;
19
+ files: Record<string, Buffer>;
20
20
  sheetIndexes: number[];
21
21
  }[];
22
- baseFiles: Record<string, string>;
22
+ baseFiles: Record<string, Buffer>;
23
23
  baseSheetIndex: number;
24
24
  gap: number;
25
25
  sheetNamesToRemove: string[];
@@ -4,4 +4,4 @@
4
4
  * @param {string} sheetName - The name of the sheet to remove.
5
5
  * @returns {void}
6
6
  */
7
- export declare function removeSheetByName(files: Record<string, string>, sheetName: string): void;
7
+ export declare function removeSheetByName(files: Record<string, Buffer>, sheetName: string): void;
@@ -9,8 +9,8 @@
9
9
  * @param {string[]} mergedRows - Array of XML strings representing each row in the merged sheet.
10
10
  * @param {Object[]} [mergeCells] - Optional array of merge cell definitions.
11
11
  * Each object should have a 'ref' property specifying the merge range (e.g., "A1:B2").
12
- * @returns {string} - The reconstructed XML string with merged content.
12
+ * @returns {Buffer} - The reconstructed XML string with merged content.
13
13
  */
14
14
  export declare function buildMergedSheet(originalXml: string, mergedRows: string[], mergeCells?: {
15
15
  ref: string;
16
- }[]): string;
16
+ }[]): Buffer;
@@ -24,4 +24,5 @@ export declare function extractRowsFromSheet(sheet: Buffer | string): {
24
24
  mergeCells: {
25
25
  ref: string;
26
26
  }[];
27
+ xml: string;
27
28
  };
@@ -2,7 +2,7 @@
2
2
  * Parses a ZIP archive from a buffer and extracts the files within.
3
3
  *
4
4
  * @param {Buffer} buffer - The buffer containing the ZIP archive data.
5
- * @returns {Object.<string, string>} - An object where keys are file names and values are file contents.
5
+ * @returns {Object.<string, Buffer>} - An object where keys are file names and values are file contents as Buffers.
6
6
  * @throws {Error} - Throws an error if an unsupported compression method is encountered or if decompression fails.
7
7
  */
8
- export declare function readSync(buffer: Buffer): Record<string, string>;
8
+ export declare function readSync(buffer: Buffer): Record<string, Buffer>;
@@ -2,7 +2,7 @@
2
2
  * Parses a ZIP archive from a buffer and extracts the files within.
3
3
  *
4
4
  * @param {Buffer} buffer - The buffer containing the ZIP archive data.
5
- * @returns {Object.<string, string>} - An object where keys are file names and values are file contents.
5
+ * @returns {Object.<string, Buffer>} - An object where keys are file names and values are file contents as Buffers.
6
6
  * @throws {Error} - Throws an error if an unsupported compression method is encountered or if decompression fails.
7
7
  */
8
- export declare function read(buffer: Buffer): Promise<Record<string, string>>;
8
+ export declare function read(buffer: Buffer): Promise<Record<string, Buffer>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@js-ak/excel-toolbox",
3
- "version": "1.2.5",
3
+ "version": "1.2.6",
4
4
  "description": "excel-toolbox",
5
5
  "publishConfig": {
6
6
  "access": "public",