{"version":3,"file":"unpackXlsxFileNode.js","names":["unpackXlsxFile","input","entries","stream","Stream","Buffer","Readable","from","fs","createReadStream","Promise","resolve","reject","entryPromises","on","pipe","unzip","Parse","all","then","entry","contents","push","setEncoding","data","toString","path"],"sources":["../../source/read/unpackXlsxFileNode.js"],"sourcesContent":["import fs from 'fs'\r\nimport Stream, { Readable } from 'stream'\r\nimport unzip from 'unzipper'\r\n\r\n/**\r\n * Reads XLSX file in Node.js.\r\n * @param  {(string|Stream)} input - A Node.js readable stream or a path to a file.\r\n * @return {Promise} Resolves to an object holding XLSX file entries.\r\n */\r\nexport default function unpackXlsxFile(input) {\r\n  // XLSX file is a zip archive.\r\n  // The `entries` object stores the files\r\n  // and their contents from this XLSX zip archive.\r\n  const entries = {}\r\n\r\n  const stream = input instanceof Stream\r\n    ? input\r\n    : (\r\n      input instanceof Buffer\r\n        ? Readable.from(input)\r\n        : fs.createReadStream(input)\r\n    )\r\n\r\n  return new Promise((resolve, reject) => {\r\n    const entryPromises = []\r\n\r\n    stream\r\n      // This first \"error\" listener is for the original stream errors.\r\n      .on('error', reject)\r\n      .pipe(unzip.Parse())\r\n      // This second \"error\" listener is for the unzip stream errors.\r\n      .on('error', reject)\r\n      .on('close', () =>  Promise.all(entryPromises).then(() => resolve(entries)))\r\n      .on('entry', (entry) => {\r\n        let contents = ''\r\n        // To ignore an entry: `entry.autodrain()`.\r\n        entryPromises.push(new Promise((resolve) => {\r\n          // It's not clear what encoding are the files inside XLSX in.\r\n          // https://stackoverflow.com/questions/45194771/are-xlsx-files-utf-8-encoded-by-definition\r\n          // For example, for XML files, encoding is specified at the top node:\r\n          // `<?xml version=\"1.0\" encoding=\"UTF-8\"/>`.\r\n          //\r\n          // `unzipper` supports setting encoding when reading an `entry`.\r\n          // https://github.com/ZJONSSON/node-unzipper/issues/35\r\n          // https://gitlab.com/catamphetamine/read-excel-file/-/issues/54\r\n          //\r\n          // If the `entry.setEncoding('utf8')` line would be commented out,\r\n          // there's a `nonAsciiCharacterEncoding` test that wouldn't pass.\r\n          //\r\n          entry.setEncoding('utf8')\r\n          //\r\n          entry\r\n            .on('data', data => contents += data.toString())\r\n            .on('end', () => resolve(entries[entry.path] = contents))\r\n        }))\r\n      })\r\n  })\r\n}\r\n"],"mappings":";;;;;;;;;AAAA;;AACA;;AACA;;;;;;;;AAEA;AACA;AACA;AACA;AACA;AACe,SAASA,cAAT,CAAwBC,KAAxB,EAA+B;EAC5C;EACA;EACA;EACA,IAAMC,OAAO,GAAG,EAAhB;EAEA,IAAMC,MAAM,GAAGF,KAAK,YAAYG,kBAAjB,GACXH,KADW,GAGXA,KAAK,YAAYI,MAAjB,GACIC,gBAAA,CAASC,IAAT,CAAcN,KAAd,CADJ,GAEIO,cAAA,CAAGC,gBAAH,CAAoBR,KAApB,CALR;EAQA,OAAO,IAAIS,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV,EAAqB;IACtC,IAAMC,aAAa,GAAG,EAAtB;IAEAV,MAAM,CACJ;IADI,CAEHW,EAFH,CAEM,OAFN,EAEeF,MAFf,EAGGG,IAHH,CAGQC,oBAAA,CAAMC,KAAN,EAHR,EAIE;IAJF,CAKGH,EALH,CAKM,OALN,EAKeF,MALf,EAMGE,EANH,CAMM,OANN,EAMe;MAAA,OAAOJ,OAAO,CAACQ,GAAR,CAAYL,aAAZ,EAA2BM,IAA3B,CAAgC;QAAA,OAAMR,OAAO,CAACT,OAAD,CAAb;MAAA,CAAhC,CAAP;IAAA,CANf,EAOGY,EAPH,CAOM,OAPN,EAOe,UAACM,KAAD,EAAW;MACtB,IAAIC,QAAQ,GAAG,EAAf,CADsB,CAEtB;;MACAR,aAAa,CAACS,IAAd,CAAmB,IAAIZ,OAAJ,CAAY,UAACC,OAAD,EAAa;QAC1C;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACAS,KAAK,CAACG,WAAN,CAAkB,MAAlB,EAb0C,CAc1C;;QACAH,KAAK,CACFN,EADH,CACM,MADN,EACc,UAAAU,IAAI;UAAA,OAAIH,QAAQ,IAAIG,IAAI,CAACC,QAAL,EAAhB;QAAA,CADlB,EAEGX,EAFH,CAEM,KAFN,EAEa;UAAA,OAAMH,OAAO,CAACT,OAAO,CAACkB,KAAK,CAACM,IAAP,CAAP,GAAsBL,QAAvB,CAAb;QAAA,CAFb;MAGD,CAlBkB,CAAnB;IAmBD,CA7BH;EA8BD,CAjCM,CAAP;AAkCD"}