{"_id":"@avisenaalwi/oraclesql-to-excel","_rev":"21-1bb78546a409eb2a1764a5bb5b483504","name":"@avisenaalwi/oraclesql-to-excel","dist-tags":{"latest":"2.4.0"},"versions":{"1.0.0":{"name":"@avisenaalwi/oraclesql-to-excel","version":"1.0.0","keywords":["oracle","oracledb","sql","excel","xlsx","exceljs","stream","export"],"author":{"name":"Avisena Alwi","email":"avisena.abdillah98@gmail.com"},"license":"MIT","_id":"@avisenaalwi/oraclesql-to-excel@1.0.0","maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"homepage":"https://github.com/AvisenaAlwi/oraclesql-to-excel#readme","bugs":{"url":"https://github.com/AvisenaAlwi/oraclesql-to-excel/issues"},"dist":{"shasum":"aa84bd41e56c3705430df90946718319e6db09c7","tarball":"https://registry.npmjs.org/@avisenaalwi/oraclesql-to-excel/-/oraclesql-to-excel-1.0.0.tgz","fileCount":7,"integrity":"sha512-YNFNYM4WLBs7aSC3Z/w6n4XHfy8sxZE/546YQGbJYKI2jOvI8Mf7xjQzdaa7clVK0mmetfDV+17isHAmE5Y9Xg==","signatures":[{"sig":"MEUCIHNA+OZPwpGzqcpe3YhAOSiXVw84ZfVAoueBAiyYoin2AiEAiz3Ya2fjqwuh135tDA7KGTh7Y0/CrEz/FzkPqn18MWk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":82173},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./index.mjs","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./index.mjs","require":"./dist/index.js"}},"scripts":{"test":"jest","build":"tsc","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"},"repository":{"url":"git+https://github.com/AvisenaAlwi/oraclesql-to-excel.git","type":"git"},"_npmVersion":"10.8.1","description":"Stream Oracle SQL query results directly into Excel (.xlsx) files. Supports multi-sheet, split sheets, doc headers, streaming to HTTP/Buffer, and more.","directories":{},"sideEffects":false,"_nodeVersion":"22.3.0","dependencies":{"exceljs":"^4.4.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","ts-jest":"^29.4.11","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^25.9.1"},"peerDependencies":{"oracledb":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oraclesql-to-excel_1.0.0_1779773533309_0.04041689972870288","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@avisenaalwi/oraclesql-to-excel","version":"1.1.0","keywords":["oracle","oracledb","sql","excel","xlsx","exceljs","stream","export"],"author":{"name":"Avisena Alwi","email":"avisena.abdillah98@gmail.com"},"license":"MIT","_id":"@avisenaalwi/oraclesql-to-excel@1.1.0","maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"homepage":"https://github.com/AvisenaAlwi/oraclesql-to-excel#readme","bugs":{"url":"https://github.com/AvisenaAlwi/oraclesql-to-excel/issues"},"dist":{"shasum":"5e5d7c44eeb4257a3fd8449e8666bd7965c1f0f8","tarball":"https://registry.npmjs.org/@avisenaalwi/oraclesql-to-excel/-/oraclesql-to-excel-1.1.0.tgz","fileCount":7,"integrity":"sha512-XUyLOzIHng1uCi0bwBYimzE2I0lqOsljer3+p01m0V1aJbDnmHZ7EvdfSFkaJEJnY8mljyh7JyQX4muPmpM2Pg==","signatures":[{"sig":"MEQCHzIWriqyIhBez5sW9dloxOHKp+2V6z7re+1Dz6ZWIwgCIQCfKVz7MRVCysnwzJh2kh6xwvkO2gEWePYEa8XOZPVVmQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86114},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./index.mjs","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./index.mjs","require":"./dist/index.js"}},"gitHead":"8cbbb563f712ae38cee110b296f2b172963e575d","scripts":{"test":"jest","build":"tsc","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"},"repository":{"url":"git+https://github.com/AvisenaAlwi/oraclesql-to-excel.git","type":"git"},"_npmVersion":"10.8.1","description":"Stream Oracle SQL query results directly into Excel (.xlsx) files. Supports multi-sheet, split sheets, doc headers, streaming to HTTP/Buffer, and more.","directories":{},"sideEffects":false,"_nodeVersion":"22.3.0","dependencies":{"exceljs":"^4.4.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","ts-jest":"^29.4.11","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^25.9.1"},"peerDependencies":{"oracledb":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oraclesql-to-excel_1.1.0_1779804993274_0.8083250604875851","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@avisenaalwi/oraclesql-to-excel","version":"1.1.1","keywords":["oracle","oracledb","sql","excel","xlsx","exceljs","stream","export"],"author":{"name":"Avisena Alwi","email":"avisena.abdillah98@gmail.com"},"license":"MIT","_id":"@avisenaalwi/oraclesql-to-excel@1.1.1","maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"homepage":"https://github.com/AvisenaAlwi/oraclesql-to-excel#readme","bugs":{"url":"https://github.com/AvisenaAlwi/oraclesql-to-excel/issues"},"dist":{"shasum":"32397106d7dd6e6643d54be6850697eaca0b7bfe","tarball":"https://registry.npmjs.org/@avisenaalwi/oraclesql-to-excel/-/oraclesql-to-excel-1.1.1.tgz","fileCount":7,"integrity":"sha512-zHCf3aniSQwZy9Mb7zkwWKml8WOXvgJ8+HaIrUEeui0/VXxb2Qz7xq0K3hPw6djrhU+VkpRXXz1CIZkLkxd3nA==","signatures":[{"sig":"MEYCIQC5IKk6jJ0JGLh05s5PZ/cRVVwST0JwJ0gDEIl4mLo3sQIhAIHM01+UDYkBF3aKo5QbgNXCbMHsybr8r73oRYlE7MuO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88445},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./index.mjs","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./index.mjs","require":"./dist/index.js"}},"gitHead":"3344df527ecbd618a4ef9274ace9ada998908056","scripts":{"test":"jest","build":"tsc","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"},"repository":{"url":"git+https://github.com/AvisenaAlwi/oraclesql-to-excel.git","type":"git"},"_npmVersion":"10.8.1","description":"Stream Oracle SQL query results directly into Excel (.xlsx) files. Supports multi-sheet, split sheets, doc headers, streaming to HTTP/Buffer, and more.","directories":{},"sideEffects":false,"_nodeVersion":"22.3.0","dependencies":{"exceljs":"^4.4.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","ts-jest":"^29.4.11","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^25.9.1"},"peerDependencies":{"oracledb":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oraclesql-to-excel_1.1.1_1779891681597_0.6466515891902269","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@avisenaalwi/oraclesql-to-excel","version":"1.1.2","keywords":["oracle","oracledb","sql","excel","xlsx","exceljs","stream","export"],"author":{"name":"Avisena Alwi","email":"avisena.abdillah98@gmail.com"},"license":"MIT","_id":"@avisenaalwi/oraclesql-to-excel@1.1.2","maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"homepage":"https://github.com/AvisenaAlwi/oraclesql-to-excel#readme","bugs":{"url":"https://github.com/AvisenaAlwi/oraclesql-to-excel/issues"},"dist":{"shasum":"bf22a20254e078d27806364a3a374eaaa9914eb8","tarball":"https://registry.npmjs.org/@avisenaalwi/oraclesql-to-excel/-/oraclesql-to-excel-1.1.2.tgz","fileCount":7,"integrity":"sha512-U2zC7oNAxKgNqptLzcHZxEBCnY8H9caSt49S9y60hTNHQEkEWcWo9axYcLs/pMZu3cKNmBbiQ4OS7lOKjgg/Wg==","signatures":[{"sig":"MEUCIQDVrrgWiBOvO3EUQxjKjHnbRj/9QcYZ6h/4BY/Q66MoGQIgVUaozCYkDFdJIsmktCSkmcLMmUp6qBQL/TNVr9NHezI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88903},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./index.mjs","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./index.mjs","require":"./dist/index.js"}},"gitHead":"211ec0523da9a5f9f865708d243bc9d2fa4dbf7a","scripts":{"test":"jest","build":"tsc","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"},"repository":{"url":"git+https://github.com/AvisenaAlwi/oraclesql-to-excel.git","type":"git"},"_npmVersion":"10.8.1","description":"Stream Oracle SQL query results directly into Excel (.xlsx) files. Supports multi-sheet, split sheets, doc headers, streaming to HTTP/Buffer, and more.","directories":{},"sideEffects":false,"_nodeVersion":"22.3.0","dependencies":{"exceljs":"^4.4.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","ts-jest":"^29.4.11","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^25.9.1"},"peerDependencies":{"oracledb":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oraclesql-to-excel_1.1.2_1779968935485_0.861233026544951","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@avisenaalwi/oraclesql-to-excel","version":"1.1.3","keywords":["oracle","oracledb","sql","excel","xlsx","exceljs","stream","export"],"author":{"name":"Avisena Alwi","email":"avisena.abdillah98@gmail.com"},"license":"MIT","_id":"@avisenaalwi/oraclesql-to-excel@1.1.3","maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"homepage":"https://github.com/AvisenaAlwi/oraclesql-to-excel#readme","bugs":{"url":"https://github.com/AvisenaAlwi/oraclesql-to-excel/issues"},"dist":{"shasum":"96abbd6f9f0396059a63867f23746907b5509805","tarball":"https://registry.npmjs.org/@avisenaalwi/oraclesql-to-excel/-/oraclesql-to-excel-1.1.3.tgz","fileCount":7,"integrity":"sha512-n6SAnKLJJTWDOq3WBIzVQGjBcjU+6wTmGE+qJ3LtDRyHzYLJaZeWsSi6DkuxXBxsiLH/r7TYG1iYvNTrUkOw5g==","signatures":[{"sig":"MEUCIQDYPhy9O9mU+zPcregri+bYBTb4OazU1n12TD7N4VPvmgIgJgwIveeC54EZgroWCjWe729YdtEOuFBqFqIstqxyos4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":90469},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./index.mjs","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./index.mjs","require":"./dist/index.js"}},"gitHead":"211ec0523da9a5f9f865708d243bc9d2fa4dbf7a","scripts":{"test":"jest","build":"tsc","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"},"repository":{"url":"git+https://github.com/AvisenaAlwi/oraclesql-to-excel.git","type":"git"},"_npmVersion":"10.8.1","description":"Stream Oracle SQL query results directly into Excel (.xlsx) files. Supports multi-sheet, split sheets, doc headers, streaming to HTTP/Buffer, and more.","directories":{},"sideEffects":false,"_nodeVersion":"22.3.0","dependencies":{"exceljs":"^4.4.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","ts-jest":"^29.4.11","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^25.9.1"},"peerDependencies":{"oracledb":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oraclesql-to-excel_1.1.3_1779971653254_0.8412508614164516","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"@avisenaalwi/oraclesql-to-excel","version":"1.1.4","keywords":["oracle","oracledb","sql","excel","xlsx","exceljs","stream","export"],"author":{"name":"Avisena Alwi","email":"avisena.abdillah98@gmail.com"},"license":"MIT","_id":"@avisenaalwi/oraclesql-to-excel@1.1.4","maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"homepage":"https://github.com/AvisenaAlwi/oraclesql-to-excel#readme","bugs":{"url":"https://github.com/AvisenaAlwi/oraclesql-to-excel/issues"},"dist":{"shasum":"0baf227a6aea4763f1df011ede3eb0b90ef5ff5e","tarball":"https://registry.npmjs.org/@avisenaalwi/oraclesql-to-excel/-/oraclesql-to-excel-1.1.4.tgz","fileCount":7,"integrity":"sha512-F691xhDY1+DXi4pD6vigqnhmeFUgvqszbcfZr4955PVSSJAdgGtrVwdpJZh1jkAEHABNP8dANDGpjGVFXzsCoQ==","signatures":[{"sig":"MEUCIBhbmnpDx30nsFQ05UTp5Wv26WZPFCDDuMKZDEXqHey+AiEAqfmgpkxMkJY0EdFH4DZgeabcKxjX2jafnTxsC2PL0Vg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":91354},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./index.mjs","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./index.mjs","require":"./dist/index.js"}},"gitHead":"da471ed456fd3b97604ec3be026c51500e9c96a4","scripts":{"test":"jest","build":"tsc","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"},"repository":{"url":"git+https://github.com/AvisenaAlwi/oraclesql-to-excel.git","type":"git"},"_npmVersion":"10.8.1","description":"Stream Oracle SQL query results directly into Excel (.xlsx) files. Supports multi-sheet, split sheets, doc headers, streaming to HTTP/Buffer, and more.","directories":{},"sideEffects":false,"_nodeVersion":"22.3.0","dependencies":{"exceljs":"^4.4.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","ts-jest":"^29.4.11","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^25.9.1"},"peerDependencies":{"oracledb":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oraclesql-to-excel_1.1.4_1779977851724_0.48288807193328753","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@avisenaalwi/oraclesql-to-excel","version":"1.3.0","keywords":["oracle","oracledb","sql","excel","xlsx","exceljs","stream","export"],"author":{"name":"Avisena Alwi","email":"avisena.abdillah98@gmail.com"},"license":"MIT","_id":"@avisenaalwi/oraclesql-to-excel@1.3.0","maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"homepage":"https://github.com/AvisenaAlwi/oraclesql-to-excel#readme","bugs":{"url":"https://github.com/AvisenaAlwi/oraclesql-to-excel/issues"},"dist":{"shasum":"defad7a1f00508ed706f848e5ccbabb1306410a5","tarball":"https://registry.npmjs.org/@avisenaalwi/oraclesql-to-excel/-/oraclesql-to-excel-1.3.0.tgz","fileCount":7,"integrity":"sha512-T+KUzARNAu2ob3JmeEmBVjjQj0ra21QKZqp1Xd+Ae4KfA7TPXhOYGWqPzsNhoYnww49GyN+evI67C2UIfN8PEw==","signatures":[{"sig":"MEUCIQDR1C4jp8IuGRXUYu79wpzoBJwBWBMSt1K5wBBoWCDDGwIgb0DwFlypJlSdFPOnvUhKS68uzLTlIBEty9jqgeJkx30=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":136665},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./index.mjs","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./index.mjs","require":"./dist/index.js"}},"gitHead":"c5de4aa534258b3431aca7898685aae4ee919932","scripts":{"test":"jest","build":"tsc","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"},"repository":{"url":"git+https://github.com/AvisenaAlwi/oraclesql-to-excel.git","type":"git"},"_npmVersion":"10.8.1","description":"Stream Oracle SQL query results directly into Excel (.xlsx) files. Supports multi-sheet, split sheets, doc headers, streaming to HTTP/Buffer, and more.","directories":{},"sideEffects":false,"_nodeVersion":"22.3.0","dependencies":{"exceljs":"^4.4.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","ts-jest":"^29.4.11","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^25.9.1"},"peerDependencies":{"oracledb":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oraclesql-to-excel_1.3.0_1780026505265_0.6589842842875848","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@avisenaalwi/oraclesql-to-excel","version":"2.0.0","keywords":["oracle","oracledb","sql","excel","xlsx","exceljs","stream","export"],"author":{"name":"Avisena Alwi","email":"avisena.abdillah98@gmail.com"},"license":"MIT","_id":"@avisenaalwi/oraclesql-to-excel@2.0.0","maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"homepage":"https://github.com/AvisenaAlwi/oraclesql-to-excel#readme","bugs":{"url":"https://github.com/AvisenaAlwi/oraclesql-to-excel/issues"},"dist":{"shasum":"f3374e26756d9c1905f5f0c08ee899777e708ede","tarball":"https://registry.npmjs.org/@avisenaalwi/oraclesql-to-excel/-/oraclesql-to-excel-2.0.0.tgz","fileCount":7,"integrity":"sha512-jxskL9E90xAyrx2i7t3SgNgAy1d5dpJRKFRaD/sakkbRoFvh8cMEJmZgjLkpiVDzPJimgTQ6PSzvfSSsLVn/4w==","signatures":[{"sig":"MEQCIAyhhaQHmPxOUJ7xNRTAj3m0hYSKoo0T3LCYbDkbcCW5AiAGQR9AeEiWqJc+nxDQ8DAzoDjig7fGHH17iAmSNJmnvA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":151520},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./index.mjs","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./index.mjs","require":"./dist/index.js"}},"gitHead":"796e1ad05f6e96b9e3cef76a7bce48a977afdea5","scripts":{"test":"jest","build":"tsc","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"},"repository":{"url":"git+https://github.com/AvisenaAlwi/oraclesql-to-excel.git","type":"git"},"_npmVersion":"10.8.1","description":"Stream Oracle SQL query results directly into Excel (.xlsx) files. Supports multi-sheet, split sheets, doc headers, streaming to HTTP/Buffer, and more.","directories":{},"sideEffects":false,"_nodeVersion":"22.3.0","dependencies":{"exceljs":"^4.4.0","archiver":"^5.3.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","adm-zip":"^0.5.10","ts-jest":"^29.4.11","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^25.9.1","@types/adm-zip":"^0.5.5","@types/archiver":"^5.3.4"},"peerDependencies":{"oracledb":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oraclesql-to-excel_2.0.0_1780046539922_0.15150950025670573","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@avisenaalwi/oraclesql-to-excel","version":"2.0.1","keywords":["oracle","oracledb","sql","excel","xlsx","exceljs","stream","export"],"author":{"name":"Avisena Alwi","email":"avisena.abdillah98@gmail.com"},"license":"MIT","_id":"@avisenaalwi/oraclesql-to-excel@2.0.1","maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"homepage":"https://github.com/AvisenaAlwi/oraclesql-to-excel#readme","bugs":{"url":"https://github.com/AvisenaAlwi/oraclesql-to-excel/issues"},"dist":{"shasum":"d7948c942b60d7e3b2ee9214b382e0f481752828","tarball":"https://registry.npmjs.org/@avisenaalwi/oraclesql-to-excel/-/oraclesql-to-excel-2.0.1.tgz","fileCount":7,"integrity":"sha512-Oppcz/W3pbiNOXkIYiyXXarmoZn9zlMtDUSNl4GyeJgzFNS8t6aIHTjmj7XYU0032i8lfMuPaU2ZxzSS4JP3ug==","signatures":[{"sig":"MEUCIQDANIap7SRhcrEN840Nb1L/WmQF9HvvFI5yUnW2AeVNYQIgcNmXsXGkfH2iTm68bG+G00mpEIcuFQAWgCgzek899u0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":156660},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./index.mjs","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./index.mjs","require":"./dist/index.js"}},"gitHead":"b3b0570d9df27d426b7667c9cea0696d17bebde5","scripts":{"test":"jest","build":"tsc","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"},"repository":{"url":"git+https://github.com/AvisenaAlwi/oraclesql-to-excel.git","type":"git"},"_npmVersion":"10.8.1","description":"Stream Oracle SQL query results directly into Excel (.xlsx) files. Supports multi-sheet, split sheets, doc headers, streaming to HTTP/Buffer, and more.","directories":{},"sideEffects":false,"_nodeVersion":"22.3.0","dependencies":{"exceljs":"^4.4.0","archiver":"^5.3.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","adm-zip":"^0.5.10","ts-jest":"^29.4.11","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^25.9.1","@types/adm-zip":"^0.5.5","@types/archiver":"^5.3.4"},"peerDependencies":{"oracledb":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oraclesql-to-excel_2.0.1_1780066526590_0.007817704745036957","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"@avisenaalwi/oraclesql-to-excel","version":"2.0.2","keywords":["oracle","oracledb","sql","excel","xlsx","exceljs","stream","export"],"author":{"name":"Avisena Alwi","email":"avisena.abdillah98@gmail.com"},"license":"MIT","_id":"@avisenaalwi/oraclesql-to-excel@2.0.2","maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"homepage":"https://github.com/AvisenaAlwi/oraclesql-to-excel#readme","bugs":{"url":"https://github.com/AvisenaAlwi/oraclesql-to-excel/issues"},"dist":{"shasum":"d025a172c3334ad321e2318a906172abdd6ff762","tarball":"https://registry.npmjs.org/@avisenaalwi/oraclesql-to-excel/-/oraclesql-to-excel-2.0.2.tgz","fileCount":7,"integrity":"sha512-PeH0U7/1UZO+MWN/8R2gpzAbgtCokC+YVdR+nkqbneNz8rmnv72DCR7+BSnY57ihFV57R8NxlSuPrDy70u/cGA==","signatures":[{"sig":"MEUCIAJtf0Frst2ChXDfHAMZhzcPqvOb6jRVDlnv8yClCqMqAiEAo1YYixwC+zYpX0TmGIsBRXTJ8Tu/6uapIjAyW1Zqo3U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":157368},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./index.mjs","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./index.mjs","require":"./dist/index.js"}},"gitHead":"aa72825192abf516a946a5d057c9ef6608807a87","scripts":{"test":"jest","build":"tsc","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"},"repository":{"url":"git+https://github.com/AvisenaAlwi/oraclesql-to-excel.git","type":"git"},"_npmVersion":"10.8.1","description":"Stream Oracle SQL query results directly into Excel (.xlsx) files. Supports multi-sheet, split sheets, doc headers, streaming to HTTP/Buffer, and more.","directories":{},"sideEffects":false,"_nodeVersion":"22.3.0","dependencies":{"exceljs":"^4.4.0","archiver":"^5.3.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","adm-zip":"^0.5.10","ts-jest":"^29.4.11","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^25.9.1","@types/adm-zip":"^0.5.5","@types/archiver":"^5.3.4"},"peerDependencies":{"oracledb":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oraclesql-to-excel_2.0.2_1780070494313_0.8805065943789354","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"@avisenaalwi/oraclesql-to-excel","version":"2.0.3","keywords":["oracle","oracledb","sql","excel","xlsx","exceljs","stream","export"],"author":{"name":"Avisena Alwi","email":"avisena.abdillah98@gmail.com"},"license":"MIT","_id":"@avisenaalwi/oraclesql-to-excel@2.0.3","maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"homepage":"https://github.com/AvisenaAlwi/oraclesql-to-excel#readme","bugs":{"url":"https://github.com/AvisenaAlwi/oraclesql-to-excel/issues"},"dist":{"shasum":"cd5b43a9ef463e9a01ae796be197cd6861159bcf","tarball":"https://registry.npmjs.org/@avisenaalwi/oraclesql-to-excel/-/oraclesql-to-excel-2.0.3.tgz","fileCount":7,"integrity":"sha512-B3vlZ0uwtOUfhHRLMN0PowCq2iW7/F/wOyylkkoKPslgxGUQE1dBwmG09rfVXUpDZuy5/E/h08MLSR4H0GjqIw==","signatures":[{"sig":"MEUCIGmH7ZjAruIi7LWaE6fpLniDg52AYxjwdlWN9YEmQbshAiEA5Qz7Jpf9ch9IzK4nnyLWHcW42XbolChNjEi3vA2+Wx4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":158451},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./index.mjs","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./index.mjs","require":"./dist/index.js"}},"gitHead":"3e84f1c14a31a4ed7a556140c935ebed26dcca33","scripts":{"test":"jest","build":"tsc","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"},"repository":{"url":"git+https://github.com/AvisenaAlwi/oraclesql-to-excel.git","type":"git"},"_npmVersion":"10.8.1","description":"Stream Oracle SQL query results directly into Excel (.xlsx) files. Supports multi-sheet, split sheets, doc headers, streaming to HTTP/Buffer, and more.","directories":{},"sideEffects":false,"_nodeVersion":"22.3.0","dependencies":{"exceljs":"^4.4.0","archiver":"^7.0.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","adm-zip":"^0.5.10","ts-jest":"^29.4.11","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^25.9.1","@types/adm-zip":"^0.5.5","@types/archiver":"^7.0.0"},"peerDependencies":{"oracledb":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oraclesql-to-excel_2.0.3_1780106746993_0.3949037546325176","host":"s3://npm-registry-packages-npm-production"}},"2.0.4":{"name":"@avisenaalwi/oraclesql-to-excel","version":"2.0.4","keywords":["oracle","oracledb","sql","excel","xlsx","exceljs","stream","export"],"author":{"name":"Avisena Alwi","email":"avisena.abdillah98@gmail.com"},"license":"MIT","_id":"@avisenaalwi/oraclesql-to-excel@2.0.4","maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"homepage":"https://github.com/AvisenaAlwi/oraclesql-to-excel#readme","bugs":{"url":"https://github.com/AvisenaAlwi/oraclesql-to-excel/issues"},"dist":{"shasum":"3f088c2db8b2d3681aff73070e1c7db223560d0c","tarball":"https://registry.npmjs.org/@avisenaalwi/oraclesql-to-excel/-/oraclesql-to-excel-2.0.4.tgz","fileCount":7,"integrity":"sha512-OlNz1DgIwlvGsDjaAOYAknjTWaWt7drMARoxgRoUj2ooMqr0O30SXMU1KKWrdJTLIJzkA9N0q9nBriOtrAnCnA==","signatures":[{"sig":"MEYCIQCxSeXNwIQX31xzVJZMKjI7lEiAasftEAFDB+EK0cznRwIhAKgJDKc8cAYNGkZHTWlGkw8qM7ksyCZb12xTwV95KCNd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":161489},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./index.mjs","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./index.mjs","require":"./dist/index.js"}},"gitHead":"568439e59a3d75d5aa71ae0db4017c53142e00a4","scripts":{"test":"jest","build":"tsc","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"},"repository":{"url":"git+https://github.com/AvisenaAlwi/oraclesql-to-excel.git","type":"git"},"_npmVersion":"10.8.1","description":"Stream Oracle SQL query results directly into Excel (.xlsx) files. Supports multi-sheet, split sheets, doc headers, streaming to HTTP/Buffer, and more.","directories":{},"sideEffects":false,"_nodeVersion":"22.3.0","dependencies":{"exceljs":"^4.4.0","archiver":"^7.0.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","adm-zip":"^0.5.10","ts-jest":"^29.4.11","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^25.9.1","@types/adm-zip":"^0.5.5","@types/archiver":"^7.0.0"},"peerDependencies":{"oracledb":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oraclesql-to-excel_2.0.4_1780112195225_0.6947439223470722","host":"s3://npm-registry-packages-npm-production"}},"2.0.5":{"name":"@avisenaalwi/oraclesql-to-excel","version":"2.0.5","keywords":["oracle","oracledb","sql","excel","xlsx","exceljs","stream","export"],"author":{"name":"Avisena Alwi","email":"avisena.abdillah98@gmail.com"},"license":"MIT","_id":"@avisenaalwi/oraclesql-to-excel@2.0.5","maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"homepage":"https://github.com/AvisenaAlwi/oraclesql-to-excel#readme","bugs":{"url":"https://github.com/AvisenaAlwi/oraclesql-to-excel/issues"},"dist":{"shasum":"86ad298e198df7fd2392694770c017a200cb0ee9","tarball":"https://registry.npmjs.org/@avisenaalwi/oraclesql-to-excel/-/oraclesql-to-excel-2.0.5.tgz","fileCount":7,"integrity":"sha512-H5WVGSRNPggYa/h+lPQdoIDY0llvPmAiajnvLoOQjRPzNRAFo1QbQ1t7MFc8LXaFo0LmDFuvBtJmppjKXVLn6g==","signatures":[{"sig":"MEUCIQCRhbs6R+1QnW2YduooN76fqhV1eBtTda2eXbvHP3L/CQIgchIrfwksWbjf38hIpCfsdsucdgYjgsthYvBco1dcrpY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":161498},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./index.mjs","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./index.mjs","require":"./dist/index.js"}},"gitHead":"6bac6b356d4e9bf9c2c13cd3ae8db353d90e20c3","scripts":{"test":"jest","build":"tsc","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"},"repository":{"url":"git+https://github.com/AvisenaAlwi/oraclesql-to-excel.git","type":"git"},"_npmVersion":"10.8.1","description":"Stream Oracle SQL query results directly into Excel (.xlsx) files. Supports multi-sheet, split sheets, doc headers, streaming to HTTP/Buffer, and more.","directories":{},"sideEffects":false,"_nodeVersion":"22.3.0","dependencies":{"exceljs":"^4.4.0","archiver":"^7.0.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","adm-zip":"^0.5.10","ts-jest":"^29.4.11","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^25.9.1","@types/adm-zip":"^0.5.5","@types/archiver":"^7.0.0"},"peerDependencies":{"oracledb":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oraclesql-to-excel_2.0.5_1780126660804_0.4241196054418479","host":"s3://npm-registry-packages-npm-production"}},"2.0.6":{"name":"@avisenaalwi/oraclesql-to-excel","version":"2.0.6","keywords":["oracle","oracledb","sql","excel","xlsx","exceljs","stream","export"],"author":{"name":"Avisena Alwi","email":"avisena.abdillah98@gmail.com"},"license":"MIT","_id":"@avisenaalwi/oraclesql-to-excel@2.0.6","maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"homepage":"https://github.com/AvisenaAlwi/oraclesql-to-excel#readme","bugs":{"url":"https://github.com/AvisenaAlwi/oraclesql-to-excel/issues"},"dist":{"shasum":"743ccd245e3191c3089b32bac877bb734471e1d0","tarball":"https://registry.npmjs.org/@avisenaalwi/oraclesql-to-excel/-/oraclesql-to-excel-2.0.6.tgz","fileCount":7,"integrity":"sha512-i2hlYMLmypCB8dk7pct473dAEiw1BTNf1rDywjPCR7yyscFXQeWguR/gH+JQ7g3wAYiBcsCxFxq9WUa8fk9ELA==","signatures":[{"sig":"MEUCIQDyRwfMZ5h6Ey7dnrumbIHNhlkHFzKv7KJwTXFDpFGdVgIgZG3oXgVsdTKQ/7KtLb8OC3EqFZssItBx2Tx8EwA+8nk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":161550},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./index.mjs","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./index.mjs","require":"./dist/index.js"}},"gitHead":"c60f669487388b01243e414a12b81201beec65bc","scripts":{"test":"jest","build":"tsc","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"},"repository":{"url":"git+https://github.com/AvisenaAlwi/oraclesql-to-excel.git","type":"git"},"_npmVersion":"11.13.0","description":"Stream Oracle SQL query results directly into Excel (.xlsx) files. Supports multi-sheet, split sheets, doc headers, streaming to HTTP/Buffer, and more.","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"exceljs":"^4.4.0","archiver":"^7.0.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","adm-zip":"^0.5.10","ts-jest":"^29.4.11","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^25.9.1","@types/adm-zip":"^0.5.5","@types/archiver":"^7.0.0"},"peerDependencies":{"oracledb":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oraclesql-to-excel_2.0.6_1780378216525_0.5172049126904195","host":"s3://npm-registry-packages-npm-production"}},"2.0.7":{"name":"@avisenaalwi/oraclesql-to-excel","version":"2.0.7","keywords":["oracle","oracledb","sql","excel","xlsx","exceljs","stream","export"],"author":{"name":"Avisena Alwi","email":"avisena.abdillah98@gmail.com"},"license":"MIT","_id":"@avisenaalwi/oraclesql-to-excel@2.0.7","maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"homepage":"https://github.com/AvisenaAlwi/oraclesql-to-excel#readme","bugs":{"url":"https://github.com/AvisenaAlwi/oraclesql-to-excel/issues"},"dist":{"shasum":"cfba384d66e93020ae2a5e3a1ea40185375fb719","tarball":"https://registry.npmjs.org/@avisenaalwi/oraclesql-to-excel/-/oraclesql-to-excel-2.0.7.tgz","fileCount":7,"integrity":"sha512-wVPokYFwTMApoT/mEOZuhsQzWWNN0S6YiEgHBQdhBbFjwKLLRd9B0bRhxNW2Vd1Df5O8fhyyWjIWQbIL0g3nwA==","signatures":[{"sig":"MEUCIQDDe6hLJz9/n6kwVVs+mWWrFcnLveSnD9QfCgx51cnlVwIgWx6oBupCCK/fnpyOGn8uvM3LJCHoeQPcIUC4MVJvnn8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":161664},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./index.mjs","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./index.mjs","require":"./dist/index.js"}},"gitHead":"e26f8dba07adf56f9eb484660aecd8584011ad82","scripts":{"test":"jest","build":"tsc","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"},"repository":{"url":"git+https://github.com/AvisenaAlwi/oraclesql-to-excel.git","type":"git"},"_npmVersion":"11.13.0","description":"Stream Oracle SQL query results directly into Excel (.xlsx) files. Supports multi-sheet, split sheets, doc headers, streaming to HTTP/Buffer, and more.","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"exceljs":"^4.4.0","archiver":"^7.0.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","adm-zip":"^0.5.10","ts-jest":"^29.4.11","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^25.9.1","@types/adm-zip":"^0.5.5","@types/archiver":"^7.0.0"},"peerDependencies":{"oracledb":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oraclesql-to-excel_2.0.7_1780390651235_0.18523452409677033","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@avisenaalwi/oraclesql-to-excel","version":"2.1.0","keywords":["oracle","oracledb","sql","excel","xlsx","exceljs","stream","export"],"author":{"name":"Avisena Alwi","email":"avisena.abdillah98@gmail.com"},"license":"MIT","_id":"@avisenaalwi/oraclesql-to-excel@2.1.0","maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"homepage":"https://github.com/AvisenaAlwi/oraclesql-to-excel#readme","bugs":{"url":"https://github.com/AvisenaAlwi/oraclesql-to-excel/issues"},"dist":{"shasum":"c84a696a42f22529a160ba29e20b99702ac18b38","tarball":"https://registry.npmjs.org/@avisenaalwi/oraclesql-to-excel/-/oraclesql-to-excel-2.1.0.tgz","fileCount":7,"integrity":"sha512-6bsH72HCo85nuYDm+0j8uvsLKKfTrL5oDu7EQJYnckSj4KUdubpwmRENR+fZpQJ5vCr0c1W3M8+33Jo0HZpmlg==","signatures":[{"sig":"MEQCIFAPCACCP3iVllyBbNL7vkeCmoEWOLEnIwpRIT5e06WyAiBZn9TiP3vMLIiC86CI16pF6ZPDbLEtQWLTNify75IV2w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":181669},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./index.mjs","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./index.mjs","require":"./dist/index.js"}},"gitHead":"9be7662fb1068ecb785b80688423c2ac288d96a3","scripts":{"test":"jest","build":"tsc","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"},"repository":{"url":"git+https://github.com/AvisenaAlwi/oraclesql-to-excel.git","type":"git"},"_npmVersion":"11.13.0","description":"Stream Oracle SQL query results directly into Excel (.xlsx) files. Supports multi-sheet, split sheets, doc headers, streaming to HTTP/Buffer, and more.","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"exceljs":"^4.4.0","archiver":"^7.0.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","adm-zip":"^0.5.10","ts-jest":"^29.4.11","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^25.9.1","@types/adm-zip":"^0.5.5","@types/archiver":"^7.0.0"},"peerDependencies":{"oracledb":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oraclesql-to-excel_2.1.0_1780539759124_0.14473908173661054","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@avisenaalwi/oraclesql-to-excel","version":"2.2.0","keywords":["oracle","oracledb","sql","excel","xlsx","exceljs","stream","export"],"author":{"name":"Avisena Alwi","email":"avisena.abdillah98@gmail.com"},"license":"MIT","_id":"@avisenaalwi/oraclesql-to-excel@2.2.0","maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"homepage":"https://github.com/AvisenaAlwi/oraclesql-to-excel#readme","bugs":{"url":"https://github.com/AvisenaAlwi/oraclesql-to-excel/issues"},"dist":{"shasum":"cf6aea92f92e4d1de8cea12bc1fc055926e8dcfc","tarball":"https://registry.npmjs.org/@avisenaalwi/oraclesql-to-excel/-/oraclesql-to-excel-2.2.0.tgz","fileCount":7,"integrity":"sha512-ZsJvOB3QBs4gpjip+6MmxvAHZFF9EG4KK1+6DoUE7DC+fZMcTIJDPli8PLQ5BROMZP6V9Cvl8v4Wv4JidWT4Ag==","signatures":[{"sig":"MEUCIEqLmQzEm5cZ+Zm7Pci2/zEfcHODd+47x/NpfZSlTsR0AiEAu8/kf9AA1nA4OjIK4MstwI51gjdkbrMYqSrZifn8Hkc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":181806},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./index.mjs","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./index.mjs","require":"./dist/index.js"}},"gitHead":"768a95aa8904c0186ebace7df8e327d9d5fd1dfe","scripts":{"test":"jest","build":"tsc","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"},"repository":{"url":"git+https://github.com/AvisenaAlwi/oraclesql-to-excel.git","type":"git"},"_npmVersion":"11.13.0","description":"Stream Oracle SQL query results directly into Excel (.xlsx) or CSV files. Supports multi-sheet, split sheets, doc headers, streaming to HTTP/Buffer, and more.","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"exceljs":"^4.4.0","archiver":"^7.0.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","adm-zip":"^0.5.10","ts-jest":"^29.4.11","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^25.9.1","@types/adm-zip":"^0.5.5","@types/archiver":"^7.0.0"},"peerDependencies":{"oracledb":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oraclesql-to-excel_2.2.0_1780543205429_0.8928222324429185","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"@avisenaalwi/oraclesql-to-excel","version":"2.3.0","keywords":["oracle","oracledb","sql","excel","xlsx","exceljs","stream","export"],"author":{"name":"Avisena Alwi","email":"avisena.abdillah98@gmail.com"},"license":"MIT","_id":"@avisenaalwi/oraclesql-to-excel@2.3.0","maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"homepage":"https://github.com/AvisenaAlwi/oraclesql-to-excel#readme","bugs":{"url":"https://github.com/AvisenaAlwi/oraclesql-to-excel/issues"},"dist":{"shasum":"64b7ef1d6e4f63f538a66d21f63bf885c3bcad21","tarball":"https://registry.npmjs.org/@avisenaalwi/oraclesql-to-excel/-/oraclesql-to-excel-2.3.0.tgz","fileCount":7,"integrity":"sha512-mQ4pSD5Jl52bRO1Cg55t5QHDupcQ+jmMH6QuS2CqN7xrILGPcsP0EjODiea0tww49GvcZGj4oGMHHAojdPzuGQ==","signatures":[{"sig":"MEUCICyz7PVVU7vcrUdKvYRCyfUrShn36+zX+o6clI/6yLIYAiEAjhCbmiNFyrSd+72LCMIoosCZOzCo/UdXsMgBXTfAyZs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":190120},"main":"./dist/index.js","types":"./dist/index.d.ts","config":{"tag-version-prefix":""},"module":"./index.mjs","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./index.mjs","require":"./dist/index.js"}},"gitHead":"f77e50d925afc5d46d855dbdbb673addbb7a5493","scripts":{"test":"jest","build":"tsc","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"},"repository":{"url":"git+https://github.com/AvisenaAlwi/oraclesql-to-excel.git","type":"git"},"_npmVersion":"11.13.0","description":"Stream Oracle SQL query results directly into Excel (.xlsx) or CSV files. Supports multi-sheet, split sheets, doc headers, streaming to HTTP/Buffer, and more.","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"exceljs":"^4.4.0","archiver":"^7.0.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","adm-zip":"^0.5.10","ts-jest":"^29.4.11","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^25.9.1","@types/adm-zip":"^0.5.5","@types/archiver":"^7.0.0"},"peerDependencies":{"oracledb":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oraclesql-to-excel_2.3.0_1780552240693_0.5586137589680293","host":"s3://npm-registry-packages-npm-production"}},"2.3.1":{"name":"@avisenaalwi/oraclesql-to-excel","version":"2.3.1","keywords":["oracle","oracledb","sql","excel","xlsx","exceljs","stream","export"],"author":{"name":"Avisena Alwi","email":"avisena.abdillah98@gmail.com"},"license":"MIT","_id":"@avisenaalwi/oraclesql-to-excel@2.3.1","maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"homepage":"https://github.com/AvisenaAlwi/oraclesql-to-excel#readme","bugs":{"url":"https://github.com/AvisenaAlwi/oraclesql-to-excel/issues"},"dist":{"shasum":"f1de1d4115da121409835495ac36c939babe468f","tarball":"https://registry.npmjs.org/@avisenaalwi/oraclesql-to-excel/-/oraclesql-to-excel-2.3.1.tgz","fileCount":7,"integrity":"sha512-fgsBYci2I79LrTFAlN/PcsMBadVyNFodU2/bCE+4RbsM5Xt3+jxLArYiyqZ1MA/wxGIKu3Hqdd50v/kk1RxxOg==","signatures":[{"sig":"MEQCIGdX4fbmo6hyOq2+eXnYf0uOCaJYSIAJX5uOGM7T59ytAiBexbnTBv1OCup87V94fJ0+IsVprx74jQmma+6Ahc36Lg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":191325},"main":"./dist/index.js","types":"./dist/index.d.ts","config":{"tag-version-prefix":""},"module":"./index.mjs","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./index.mjs","require":"./dist/index.js"}},"gitHead":"8e48ae11142fb26a9ddac548b73efca398d17f22","scripts":{"test":"jest","build":"tsc","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"},"repository":{"url":"git+https://github.com/AvisenaAlwi/oraclesql-to-excel.git","type":"git"},"_npmVersion":"11.13.0","description":"Stream Oracle SQL query results directly into Excel (.xlsx) or CSV files. Supports multi-sheet, split sheets, doc headers, streaming to HTTP/Buffer, and more.","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"exceljs":"^4.4.0","archiver":"^7.0.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","adm-zip":"^0.5.10","ts-jest":"^29.4.11","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^25.9.1","@types/adm-zip":"^0.5.5","@types/archiver":"^7.0.0"},"peerDependencies":{"oracledb":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oraclesql-to-excel_2.3.1_1780562802867_0.9368043751802797","host":"s3://npm-registry-packages-npm-production"}},"2.3.2":{"name":"@avisenaalwi/oraclesql-to-excel","version":"2.3.2","keywords":["oracle","oracledb","sql","excel","xlsx","exceljs","stream","export"],"author":{"name":"Avisena Alwi","email":"avisena.abdillah98@gmail.com"},"license":"MIT","_id":"@avisenaalwi/oraclesql-to-excel@2.3.2","maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"homepage":"https://github.com/AvisenaAlwi/oraclesql-to-excel#readme","bugs":{"url":"https://github.com/AvisenaAlwi/oraclesql-to-excel/issues"},"dist":{"shasum":"27f36f964a854bff863b1c248e29efeb67a4fff8","tarball":"https://registry.npmjs.org/@avisenaalwi/oraclesql-to-excel/-/oraclesql-to-excel-2.3.2.tgz","fileCount":7,"integrity":"sha512-JQmPyNuT+KztPDorWMDuBwpYY/B9COAryGZrJMu0jvzcDu/SRzP5sI54aqh0Od5PziXzJ0DdDTDdvZvj5XIYgg==","signatures":[{"sig":"MEQCIGK2Kc0RqUewxUMkGVcIrhg8TI/heVR/OPwZK15bIHMZAiB9JbG/wunmzyygeI7OdOUo28z/fJ36aTtq77BcwBhksA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":191879},"main":"./dist/index.js","types":"./dist/index.d.ts","config":{"tag-version-prefix":""},"module":"./index.mjs","engines":{"node":">=14.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./index.mjs","require":"./dist/index.js"}},"gitHead":"5995cda844ed6ac6887aa23c8e176cdcd1431e09","scripts":{"test":"jest","build":"tsc","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"},"repository":{"url":"git+https://github.com/AvisenaAlwi/oraclesql-to-excel.git","type":"git"},"_npmVersion":"11.13.0","description":"Stream Oracle SQL query results directly into Excel (.xlsx) or CSV files. Supports multi-sheet, split sheets, doc headers, streaming to HTTP/Buffer, and more.","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"exceljs":"^4.4.0","archiver":"^7.0.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","adm-zip":"^0.5.10","ts-jest":"^29.4.11","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^25.9.1","@types/adm-zip":"^0.5.5","@types/archiver":"^7.0.0"},"peerDependencies":{"oracledb":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oraclesql-to-excel_2.3.2_1780581031576_0.41847268812206373","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"name":"@avisenaalwi/oraclesql-to-excel","version":"2.4.0","description":"Stream Oracle SQL query results directly into Excel (.xlsx) or CSV files. Supports multi-sheet, split sheets, doc headers, streaming to HTTP/Buffer, and more.","main":"./dist/index.js","module":"./index.mjs","types":"./dist/index.d.ts","sideEffects":false,"exports":{".":{"types":"./dist/index.d.ts","import":"./index.mjs","require":"./dist/index.js"}},"scripts":{"build":"tsc","prepublishOnly":"npm run build","test":"jest","test:coverage":"jest --coverage"},"keywords":["oracle","oracledb","sql","excel","xlsx","exceljs","stream","export"],"author":{"name":"Avisena Alwi","email":"avisena.abdillah98@gmail.com"},"repository":{"type":"git","url":"git+https://github.com/AvisenaAlwi/oraclesql-to-excel.git"},"bugs":{"url":"https://github.com/AvisenaAlwi/oraclesql-to-excel/issues"},"homepage":"https://github.com/AvisenaAlwi/oraclesql-to-excel#readme","license":"MIT","engines":{"node":">=14.0.0"},"peerDependencies":{"oracledb":">=5.0.0"},"dependencies":{"archiver":"^7.0.1","exceljs":"^4.4.0"},"devDependencies":{"@types/adm-zip":"^0.5.5","@types/archiver":"^7.0.0","@types/jest":"^30.0.0","@types/node":"^25.9.1","adm-zip":"^0.5.10","jest":"^30.4.2","ts-jest":"^29.4.11","typescript":"^5.0.0"},"config":{"tag-version-prefix":""},"gitHead":"889280581812992a1e16695568386d4a75c97791","_id":"@avisenaalwi/oraclesql-to-excel@2.4.0","_nodeVersion":"24.16.0","_npmVersion":"11.13.0","dist":{"integrity":"sha512-ZL13qEqs/XONo5Kjf4L/1AMSBh7NXxgfsZrLzJ5h5QykrXAqE3udUGAw73AEBWi1oXqgbiX+Rc5280fswmJEIw==","shasum":"fbdfa9e1d671a70294a67adaf1d90dbe45133ebd","tarball":"https://registry.npmjs.org/@avisenaalwi/oraclesql-to-excel/-/oraclesql-to-excel-2.4.0.tgz","fileCount":7,"unpackedSize":203346,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDi5jZKXdnf5U71jtKAYECA/ppw6fhy0xi7O6utybpwUQIhAPSLvYWIaHSWhplBZ6xjd2PFTW5r550hijzIiPInqP4U"}]},"_npmUser":{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"},"directories":{},"maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/oraclesql-to-excel_2.4.0_1782876855201_0.834892993240034"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-26T05:32:13.091Z","modified":"2026-07-01T03:34:15.466Z","1.0.0":"2026-05-26T05:32:13.457Z","1.1.0":"2026-05-26T14:16:33.544Z","1.1.1":"2026-05-27T14:21:21.765Z","1.1.2":"2026-05-28T11:48:55.666Z","1.1.3":"2026-05-28T12:34:13.393Z","1.1.4":"2026-05-28T14:17:31.840Z","1.3.0":"2026-05-29T03:48:25.403Z","2.0.0":"2026-05-29T09:22:20.070Z","2.0.1":"2026-05-29T14:55:26.728Z","2.0.2":"2026-05-29T16:01:34.490Z","2.0.3":"2026-05-30T02:05:47.161Z","2.0.4":"2026-05-30T03:36:35.400Z","2.0.5":"2026-05-30T07:37:40.983Z","2.0.6":"2026-06-02T05:30:16.673Z","2.0.7":"2026-06-02T08:57:31.378Z","2.1.0":"2026-06-04T02:22:39.254Z","2.2.0":"2026-06-04T03:20:05.581Z","2.3.0":"2026-06-04T05:50:40.852Z","2.3.1":"2026-06-04T08:46:43.008Z","2.3.2":"2026-06-04T13:50:31.716Z","2.4.0":"2026-07-01T03:34:15.363Z"},"bugs":{"url":"https://github.com/AvisenaAlwi/oraclesql-to-excel/issues"},"author":{"name":"Avisena Alwi","email":"avisena.abdillah98@gmail.com"},"license":"MIT","homepage":"https://github.com/AvisenaAlwi/oraclesql-to-excel#readme","keywords":["oracle","oracledb","sql","excel","xlsx","exceljs","stream","export"],"repository":{"type":"git","url":"git+https://github.com/AvisenaAlwi/oraclesql-to-excel.git"},"description":"Stream Oracle SQL query results directly into Excel (.xlsx) or CSV files. Supports multi-sheet, split sheets, doc headers, streaming to HTTP/Buffer, and more.","maintainers":[{"name":"avisenaalwi","email":"avisena.abdillah98@gmail.com"}],"readme":"# oraclesql-to-excel JS\n\nStream Oracle SQL query results directly into Excel (`.xlsx`) or CSV files with a fluent, chainable API. Built for exports with millions of rows — memory stays bounded regardless of result set size.\n\n- **Streaming** — rows piped from Oracle directly into the output; no full dataset held in memory\n- **Excel & CSV** — choose `.xlsx` for rich formatting or `.csv` for maximum throughput and compatibility\n- **Multi-sheet** — multiple SQL queries, each on its own sheet, in one workbook\n- **Split sheets** — automatically create new sheets when a row limit is reached\n- **Multi-file** — split one export across multiple `.xlsx` files via `.file()` + `.maxRowsPerFile()`\n- **HTTP streaming** — pipe directly to an Express/Fastify response, no temp file\n- **Buffer output** — return as `Buffer` for S3 uploads, email attachments, or DB BLOBs\n- **Document headers** — custom rows above the table (title, period, logo placeholders) with merge and style support\n- **Multi-level column headers** — grouped header rows with horizontal and vertical cell merging via `.headerGroups()`\n- **Row range summary** — \"Showing rows X – Y of Z total\" auto-prepended per sheet via a parallel COUNT query\n- **Auto-filter & freeze header** — one method call each\n- **Per-column formatting** — number formats, alignment, wrap text, font/bg colors\n- **Transform** — per-column and per-row value transforms on both Excel and CSV; sync or async\n\n---\n\n## Installation\n\n```bash\nnpm install @avisenaalwi/oraclesql-to-excel\n```\n\n`oracledb` is a peer dependency — install it separately if not already present:\n\n```bash\nnpm install oracledb\n```\n\n---\n\n## Import Styles\n\n```js\n// CommonJS\nconst { OracleSqlToExcel, OracleSqlToCsv } = require('@avisenaalwi/oraclesql-to-excel');\n```\n\n```js\n// ESM\nimport { OracleSqlToExcel, OracleSqlToCsv } from '@avisenaalwi/oraclesql-to-excel';\n```\n\n```ts\n// TypeScript — full type inference, no extra @types needed\nimport { OracleSqlToExcel, OracleSqlToCsv } from '@avisenaalwi/oraclesql-to-excel';\nimport type {\n  ColumnDef, HeaderStyle, DocHeaderRow,\n  RunResult, MultiRunResult, BufferResult,\n  CsvResult, CsvRunResult, CsvBufferResult,\n} from '@avisenaalwi/oraclesql-to-excel';\n```\n\n---\n\n## Quick Start\n\n### Excel\n\n```js\nconst { OracleSqlToExcel } = require('@avisenaalwi/oraclesql-to-excel');\n\nconst { success, file } = await OracleSqlToExcel()\n  .connectionFactory(() => pool.getConnection())\n  .sheet('Report', s => s\n    .sql('SELECT CODE, NAME, BALANCE FROM ACCOUNTS')\n    .columns([\n      { key: 'CODE',    header: 'Code',    type: 'text',   width: 12 },\n      { key: 'NAME',    header: 'Name',    type: 'text',   width: 30 },\n      { key: 'BALANCE', header: 'Balance', type: 'number', width: 18, numFmt: '#,##0.00' },\n    ])\n    .freezeHeader()\n    .autoFilter()\n    .headerStyle({ bgColor: '4472C4', fontColor: 'FFFFFF' })\n  )\n  .filePrefix('account-report')\n  .run();\n\nconsole.log(success, file); // true, '/path/to/account-report.xlsx'\n```\n\n### CSV\n\n```js\nconst { OracleSqlToCsv } = require('@avisenaalwi/oraclesql-to-excel');\n\n// Write to file\nconst { success, file, rowsWritten } = await OracleSqlToCsv()\n  .connectionFactory(() => pool.getConnection())\n  .sql('SELECT CODE, NAME, BALANCE FROM ACCOUNTS')\n  .columns([\n    { key: 'CODE',    header: 'Code'    },\n    { key: 'NAME',    header: 'Name'    },\n    { key: 'BALANCE', header: 'Balance' },\n  ])\n  .run('/var/reports/accounts.csv');\n\nconsole.log(success, file, rowsWritten);\n```\n\n---\n\n## API Reference\n\n### `OracleSqlToExcel()`\n\nReturns a new `OracleSqlToExcelBuilder`. All methods are chainable.\n\n#### Workbook-level methods\n\n| Method | Default | Description |\n|--------|---------|-------------|\n| `.connectionFactory(fn)` | — | **Required.** `fn` must return `Promise<Connection>`. Called once per connection needed. |\n| `.executeOptions(obj)` | `{}` | Default Oracle execute options for all sheets. |\n| `.outputDir(path)` | `process.cwd()` | Directory for `.run()` output. |\n| `.filePrefix(name)` | `'export'` | Output filename without extension. Saved as `<name>.xlsx`. |\n| `.compress(bool, level?)` | `false` / `1` | Enable XLSX ZIP compression (and outer ZIP level when using `.asZip()`). `level` is zlib `0`–`9`, default `1`. Slower but smaller file. Recommended for `.run()`, not `.pipe()`. |\n| `.locale(tag)` | `'en-US'` | BCP 47 locale tag for number formatting in the `showTotalRows` summary (e.g. `'id-ID'` → `1.000.000`, `'en-US'` → `1,000,000`). |\n| `.debug(bool)` | `false` | Verbose logging. Active only when `NODE_ENV` is not `production`. |\n| `.onProgress(cb)` | — | Called after each fetch batch. See [Progress Tracking](#progress-tracking-websocket--sse). |\n| `.backpressureThreshold(bytes)` | `268435456` (256 MB) | Pause Oracle fetch when process RSS exceeds this value during `.pipe()`. See [Backpressure & Memory](#backpressure--memory). |\n| `.sheet(name, fn)` | — | Add a sheet. `name` can be a string or array of strings. |\n| `.file(name, fn)` | — | Add a named output file. Only supported with `.run()`. See [Multi-file Export](#multi-file-export). |\n\n#### Terminal methods\n\n| Method | Returns | Description |\n|--------|---------|-------------|\n| `.run()` | `Promise<RunResult \\| MultiRunResult>` | Write workbook to disk. Returns `MultiRunResult` when `.file()` is used. |\n| `.pipe(stream)` | `Promise<Result>` | Stream workbook to any `Writable`. |\n| `.toBuffer()` | `Promise<BufferResult>` | Return workbook as `Buffer`. |\n\n---\n\n### `SheetConfig` — per-sheet methods\n\nReceived as argument `s` inside the `.sheet(name, fn)` callback.\n\n| Method | Default | Description |\n|--------|---------|-------------|\n| `.sql(query, params, opts)` | — | **Required.** Oracle SQL, optional bind params and execute option overrides. |\n| `.columns(defs)` | auto-detect | Array of `ColumnDef`. Omit to auto-detect from Oracle metadata. |\n| `.maxRowsPerSheet(n)` | `1_000_000` | Max data rows before a new physical sheet is created. |\n| `.fetchSize(n)` | `50_000` | Rows fetched per Oracle round-trip. |\n| `.freezeHeader()` | off | Freeze the header row. |\n| `.autoFilter()` | off | Add dropdown filter to every header column. |\n| `.headerStyle(obj)` | bold | Override column header row style. See [`HeaderStyle`](#headerstyle). |\n| `.docHeader(rows)` | none | Custom rows above the table header. First sheet only. See [Document Header](#document-header). |\n| `.headerGroups(rows)` | none | Multi-level grouped header rows written immediately above the column header. Supports `mergeAcross` and `mergeDown`. See [Multi-Level Column Header](#multi-level-column-header-headergroups). |\n| `.showTotalRows()` | off | Prepend \"Showing rows X – Y of Z total\". Runs COUNT in parallel. |\n| `.onRowError(mode)` | `'throw'` | `'throw'` aborts on first bad row. `'skip'` drops it and continues. |\n| `.transform(fn)` | none | Per-row value transform. Receives the assembled row (after all per-column transforms) and must return a new row object. See [Transform](#transform). |\n\n---\n\n### `FileConfig` — per-file methods\n\nReceived as argument `f` inside the `.file(name, fn)` callback. Only applicable with `.run()`.\n\n| Method | Default | Description |\n|--------|---------|-------------|\n| `.maxRowsPerFile(n)` | `0` (no split) | Split into multiple `.xlsx` files when data rows exceed `n`. |\n| `.sheet(name, fn)` | — | Add a sheet to this file. Same API as the builder's `.sheet()`. |\n\n---\n\n### `OracleSqlToCsv()`\n\nReturns a new `OracleSqlToCsvBuilder`. All methods are chainable.\n\nUnlike Excel, CSV writes each row directly to the output stream with no intermediate archiver or ZIP buffer. Memory usage is `O(fetchSize × row_size)` at all times, making it suitable for any dataset size.\n\n#### Methods\n\n| Method | Default | Description |\n|--------|---------|-------------|\n| `.connectionFactory(fn)` | — | **Required.** `fn` must return `Promise<Connection>`. |\n| `.sql(query, params, opts)` | — | **Required.** Oracle SQL with optional bind parameters and execute options. |\n| `.columns(defs)` | auto-detect | Array of `{ key, header, transform? }`. Omit to auto-detect from Oracle metadata. |\n| `.fetchSize(n)` | `50_000` | Rows fetched per Oracle round-trip. |\n| `.separator(char)` | `','` | Field separator. Use `';'` for European Excel, `'\\t'` for TSV. |\n| `.withBom(bool)` | `true` | Prepend UTF-8 BOM so Windows Excel opens the file with correct encoding. |\n| `.docHeader(rows)` | none | Rows prepended above the column header on every file. Only `text` and `columns[].text` are written — style and merge are ignored in CSV. |\n| `.locale(tag)` | `'en-US'` | BCP 47 locale tag for number formatting (e.g. `'id-ID'` → `1.000.000`). |\n| `.onProgress(cb)` | — | Called after each fetch batch with `{ rowsWritten }`. |\n| `.transform(fn)` | none | Per-row value transform. Receives the assembled row (after all per-column transforms) and must return a new row object. See [Transform](#transform). |\n\n#### Terminal methods\n\n| Method | Returns | Description |\n|--------|---------|-------------|\n| `.run(filepath)` | `Promise<CsvRunResult>` | Write CSV to file at `filepath` (absolute or relative, including extension). |\n| `.pipe(stream)` | `Promise<CsvResult>` | Stream CSV to any `Writable` (e.g. Express `res`). |\n| `.toBuffer()` | `Promise<CsvBufferResult>` | Return entire CSV as `Buffer`. |\n\n---\n\n### `ColumnDef`\n\n```js\n{\n  key       : 'COLUMN_NAME',          // Oracle column name — case-sensitive\n  header    : 'Display Label',        // Header text. Defaults to key.\n  type      : 'text',                 // 'text' | 'number' | 'date' | 'datetime'  (Excel only)\n  width     : 18,                     // Column width in Excel character units     (Excel only)\n  numFmt    : '#,##0.00',             // Excel number format string                (Excel only)\n  align     : 'right',                // 'left' | 'center' | 'right'              (Excel only)\n  wrapText  : false,                  // Enable text wrap                          (Excel only)\n  bgColor   : 'FFFF00',               // Cell background color (hex)               (Excel only)\n  fontColor : 'FF0000',               // Cell font color (hex)                     (Excel only)\n  transform : (value, rawRow) => ..., // Value transform function (Excel and CSV)\n}\n```\n\nFor CSV, only `key`, `header`, and `transform` are used. All other fields are Excel-only.\n\n**Type notes (Excel):**\n- `number` — values with > 15 significant digits are cast to string to prevent Excel precision loss.\n- `date` — default format `dd/mm/yyyy`.\n- `datetime` — default format `dd/mm/yyyy hh:mm:ss`.\n- `text` — all values cast via `String()`.\n\n---\n\n### `HeaderStyle`\n\nPassed to `.headerStyle()` on `SheetConfig`. Applies to the column header row.\n\n```js\n{\n  bold      : true,       // Bold text. Default: true.\n  align     : 'center',   // 'left' | 'center' | 'right'\n  bgColor   : '4472C4',   // Background fill color (hex, with or without #)\n  fontColor : 'FFFFFF',   // Font color (hex, with or without #)\n}\n```\n\nExample:\n\n```js\n.headerStyle({ bgColor: '4472C4', fontColor: 'FFFFFF', bold: true, align: 'center' })\n```\n\n---\n\n### Return Values\n\n#### `OracleSqlToExcel().run()` → `RunResult`\n\n```js\n{\n  success     : true,\n  file        : '/output/report.xlsx',\n  sheets      : ['Sheet1', 'Sheet1 2', 'Sheet2'],\n  skippedRows : 0,\n  error       : undefined,   // present only on failure\n}\n```\n\n#### `OracleSqlToExcel().run()` with `.file()` → `MultiRunResult`\n\n```js\n{\n  success     : true,\n  files       : [\n    {\n      file  : '/output/data_1.xlsx',\n      sheets: [{ name: 'Data', startRow: 1, endRow: 1000000 }],\n    },\n    {\n      file  : '/output/data_2.xlsx',\n      sheets: [{ name: 'Data', startRow: 1000001, endRow: 1823400 }],\n    },\n  ],\n  skippedRows : 0,\n  error       : undefined,\n}\n```\n\n#### `.pipe()` → `Result`\n\n```js\n{ success, sheets, skippedRows, error? }\n```\n\n#### `.toBuffer()` → `BufferResult`\n\n```js\n{ success, buffer, sheets, skippedRows, error? }\n```\n\n#### `OracleSqlToCsv().run()` → `CsvRunResult`\n\n```js\n{ success, file, rowsWritten, error? }\n```\n\n#### `OracleSqlToCsv().pipe()` → `CsvResult`\n\n```js\n{ success, rowsWritten, error? }\n```\n\n#### `OracleSqlToCsv().toBuffer()` → `CsvBufferResult`\n\n```js\n{ success, buffer, rowsWritten, error? }\n```\n\n---\n\n## Examples\n\n### Excel — Write to File\n\n```js\nconst { OracleSqlToExcel } = require('@avisenaalwi/oraclesql-to-excel');\n\nconst result = await OracleSqlToExcel()\n  .connectionFactory(() => pool.getConnection())\n  .outputDir('/var/reports')\n  .filePrefix('monthly-report')\n  .sheet('Summary', s => s\n    .sql('SELECT * FROM SUMMARY_VIEW')\n    .columns([\n      { key: 'PERIOD', header: 'Period', type: 'text',   width: 15 },\n      { key: 'TOTAL',  header: 'Total',  type: 'number', width: 20, numFmt: '#,##0' },\n    ])\n    .freezeHeader()\n    .autoFilter()\n  )\n  .compress(true)   // smaller file for disk storage\n  .run();\n\nif (!result.success) {\n  console.error('Export failed:', result.error);\n} else {\n  console.log('Saved to:', result.file);\n}\n```\n\n---\n\n### Excel — Stream to HTTP Response\n\n```js\napp.get('/download/report', async (req, res) => {\n  res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');\n  res.setHeader('Content-Disposition', 'attachment; filename=\"report.xlsx\"');\n\n  const result = await OracleSqlToExcel()\n    .connectionFactory(() => pool.getConnection())\n    .sheet('Data', s => s\n      .sql(\n        'SELECT CODE, NAME, BALANCE FROM ACCOUNTS WHERE PERIOD = :period',\n        { period: req.query.period }\n      )\n      .columns([\n        { key: 'CODE',    header: 'Code',    type: 'text',   width: 12 },\n        { key: 'NAME',    header: 'Name',    type: 'text',   width: 30 },\n        { key: 'BALANCE', header: 'Balance', type: 'number', width: 18, numFmt: '#,##0.00' },\n      ])\n      .freezeHeader()\n    )\n    // compress(false) recommended for HTTP — web server handles gzip separately\n    .pipe(res);\n\n  if (!result.success) {\n    // Headers already sent — cannot send error response, log instead\n    console.error('Export failed mid-stream:', result.error);\n  }\n});\n```\n\n---\n\n### Excel — Return as Buffer (S3 / Email)\n\n```js\nconst { success, buffer, error } = await OracleSqlToExcel()\n  .connectionFactory(() => pool.getConnection())\n  .sheet('Report', s => s.sql('SELECT * FROM MONTHLY_REPORT').columns(COLS))\n  .toBuffer();\n\nif (!success) throw new Error(error);\n\nawait s3.putObject({\n  Bucket     : 'my-bucket',\n  Key        : 'reports/monthly.xlsx',\n  Body       : buffer,\n  ContentType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n}).promise();\n```\n\n---\n\n### Excel — Multi-Sheet Workbook\n\n```js\nconst result = await OracleSqlToExcel()\n  .connectionFactory(() => pool.getConnection())\n  .filePrefix('full-report')\n  .sheet('Summary', s => s\n    .sql('SELECT * FROM V_MONTHLY_SUMMARY WHERE YEAR = :year', { year: 2026 })\n    .columns(COLS_SUMMARY)\n    .freezeHeader()\n    .autoFilter()\n    .headerStyle({ bgColor: '4472C4', fontColor: 'FFFFFF' })\n  )\n  .sheet('Detail', s => s\n    .sql('SELECT * FROM V_TRANSACTION_DETAIL WHERE YEAR = :year', { year: 2026 })\n    .columns(COLS_DETAIL)\n    .freezeHeader()\n    .onRowError('skip')   // skip bad rows instead of aborting\n  )\n  .run();\n\nconsole.log('Sheets written:', result.sheets);\n// → ['Summary', 'Detail', 'Detail 2', ...]\n```\n\n---\n\n### Multi-file Export\n\nSplit one large result across multiple `.xlsx` files. Oracle's `ResultSet` stays open across files — only one query per sheet regardless of how many files are produced.\n\n```js\nconst { files } = await OracleSqlToExcel()\n  .connectionFactory(() => pool.getConnection())\n  .outputDir('/var/reports')\n  .file('transactions', f => f\n    .maxRowsPerFile(1_000_000)   // one .xlsx per million rows\n    .sheet('Data', s => s\n      .sql('SELECT * FROM TRANSACTIONS WHERE YEAR = :y', { y: 2026 })\n      .columns(COLS)\n      .maxRowsPerSheet(900_000)  // split sheet within each file too\n    )\n  )\n  .run();\n\n// files → [\n//   { file: '/var/reports/transactions_1.xlsx' },\n//   { file: '/var/reports/transactions_2.xlsx' },\n// ]\nconsole.log(`${files.length} file(s) written`);\n```\n\n> **Cross-file navigation notes** — when a query spans multiple files, the library automatically inserts informational rows at file boundaries so the reader knows where data continues:\n> - **Start of file 2+** (before \"Showing rows…\" and column headers): `\"Previous data on file: transactions_1.xlsx\"` — italic, gray\n> - **End of files 1 to N-1** (after last data row): `\"Next data available on file: transactions_2.xlsx\"` — italic, gray\n>\n> These use the same visual style as the within-file sheet continuation notes (`\"Continued on sheet: …\"`).\n\n> **`maxRowsPerSheet` and `maxRowsPerFile` interaction** — if `maxRowsPerSheet` is set larger than `maxRowsPerFile`, it is automatically capped at the file limit. Each file segment will never split into more sheets than needed.\n\nMultiple `.file()` calls produce independent output files:\n\n```js\nawait OracleSqlToExcel()\n  .connectionFactory(() => pool.getConnection())\n  .outputDir('/var/reports')\n  .file('summary', f => f.sheet('Summary', s => s.sql(SQL1).columns(COLS1)))\n  .file('detail',  f => f.sheet('Detail',  s => s.sql(SQL2).columns(COLS2)))\n  .run();\n// → /var/reports/summary.xlsx, /var/reports/detail.xlsx\n```\n\n> `.file()` is only supported with `.run()`. Using it with `.pipe()` or `.toBuffer()` throws an error.\n\n---\n\n## ZIP Streaming\n\nWhen `.file()` produces multiple `.xlsx` files, use `.asZip()` to deliver them as a single ZIP archive. This is the only way to stream multi-file output via `.pipe()` or `.toBuffer()`.\n\n### Stream ZIP to HTTP response\n\n```js\n// Express / Fastify\nres.setHeader('Content-Type', 'application/zip');\nres.setHeader('Content-Disposition', 'attachment; filename=\"export.zip\"');\n\nawait OracleSqlToExcel()\n  .connectionFactory(() => pool.getConnection())\n  .file('report', (f) => f\n    .maxRowsPerFile(1_000_000)\n    .sheet('Data', (s) => s\n      .sql('SELECT * FROM BIG_TABLE')\n      .columns(COLS)\n      .maxRowsPerSheet(500_000)\n    )\n  )\n  .asZip()\n  .pipe(res); // streams ZIP directly — no temp file\n```\n\n### Write ZIP to disk\n\n```js\nconst result = await OracleSqlToExcel()\n  .connectionFactory(() => pool.getConnection())\n  .outputDir('/tmp')\n  .filePrefix('export-2026')      // ZIP written as /tmp/export-2026.zip\n  .file('report', (f) => f\n    .maxRowsPerFile(1_000_000)\n    .sheet('Data', (s) => s.sql(SQL).columns(COLS))\n  )\n  .asZip()\n  .run();\n\nconsole.log(result.file); // /tmp/export-2026.zip\n```\n\n### ZIP entry names\n\nEntries inside the ZIP use sequential naming:\n\n```\nexport-2026.zip\n  ├─ report_1.xlsx   ← rows 1–1,000,000\n  ├─ report_2.xlsx   ← rows 1,000,001–2,000,000\n  └─ report_3.xlsx   ← rows 2,000,001–2,700,000\n```\n\n`.asZip()` is only effective when `.file()` is also used. Without `.file()`, it is ignored and output is a plain `.xlsx`.\n\n---\n\n## Memory guide\n\nThe library streams rows from Oracle in batches and writes them through ExcelJS to the output. Memory stays bounded by the batch size, not the total row count — **for most use cases**.\n\n### What controls memory\n\n| Setting | Default | Effect |\n|---------|---------|--------|\n| `.fetchSize(n)` (per sheet) | 50,000 | Rows fetched per Oracle round-trip. Reduce for very wide rows. |\n| `.backpressureThreshold(bytes)` | 256 MB | RSS threshold — Oracle fetch pauses when exceeded. |\n| `.maxRowsPerFile(n)` (per file) | unlimited | Bounds the size of each XLSX file processed at once. |\n\n### When OOM can still occur\n\nRSS polling is **reactive** — it checks after each batch, not during. If a single batch generates more RSS than available memory, the process will OOM before the pause fires.\n\n**Mitigation for very wide rows or limited server RAM:**\n\n```js\nOracleSqlToExcel()\n  .backpressureThreshold(128 * 1024 * 1024) // 128 MB — pause earlier\n  .file('report', (f) => f\n    .maxRowsPerFile(500_000)                  // smaller files = lower peak\n    .sheet('Data', (s) => s\n      .fetchSize(10_000)                      // smaller batches for wide rows\n      .sql(SQL).columns(COLS)\n    )\n  )\n  .asZip()\n  .pipe(res);\n```\n\n### `.toBuffer()` warning\n\n`.toBuffer()` holds the **entire ZIP in memory** before returning. For large exports this will OOM. Use `.run()` (disk) or `.pipe()` (stream) instead.\n\n---\n\n### CSV — Write to File\n\n```js\nconst { OracleSqlToCsv } = require('@avisenaalwi/oraclesql-to-excel');\n\nconst { success, file, rowsWritten } = await OracleSqlToCsv()\n  .connectionFactory(() => pool.getConnection())\n  .sql('SELECT CODE, NAME, AMOUNT FROM BIG_TABLE')\n  .columns([\n    { key: 'CODE',   header: 'Code'   },\n    { key: 'NAME',   header: 'Name'   },\n    { key: 'AMOUNT', header: 'Amount' },\n  ])\n  .run('/var/reports/export.csv');\n\nconsole.log(`${rowsWritten} rows → ${file}`);\n```\n\n---\n\n### CSV — Stream to HTTP Response\n\nMemory stays `O(fetchSize × row_size)` regardless of total row count — no backpressure issues even for 10M+ rows.\n\n```js\napp.get('/download/csv', async (req, res) => {\n  res.setHeader('Content-Type', 'text/csv; charset=utf-8');\n  res.setHeader('Content-Disposition', 'attachment; filename=\"report.csv\"');\n\n  const result = await OracleSqlToCsv()\n    .connectionFactory(() => pool.getConnection())\n    .sql('SELECT CODE, NAME, AMOUNT FROM BIG_TABLE WHERE PERIOD = :p', { p: req.query.period })\n    .columns([\n      { key: 'CODE',   header: 'Code'   },\n      { key: 'NAME',   header: 'Name'   },\n      { key: 'AMOUNT', header: 'Amount' },\n    ])\n    .pipe(res);\n\n  if (!result.success) {\n    console.error('CSV export failed mid-stream:', result.error);\n  }\n});\n```\n\n---\n\n### CSV — Custom Separator\n\n```js\n// Semicolon — European Excel (avoids conflict with decimal comma)\nOracleSqlToCsv().separator(';')\n\n// Tab-separated values (TSV)\nOracleSqlToCsv().separator('\\t')\n\n// No BOM — for non-Windows consumers\nOracleSqlToCsv().withBom(false)\n```\n\n---\n\n### Transform\n\nTransform cell values — map status codes, format strings, compute derived columns — without touching your SQL. Works on both Excel and CSV.\n\n#### Per-column transform (Excel)\n\n`transform` in `ColumnDef` receives the value **after** `castCell` (already typed for Excel) and the original raw DB row. Return value is written directly to the cell.\n\n```js\ns.columns([\n  {\n    key      : 'STATUS',\n    header   : 'Status',\n    transform: (val) => val === 'Y' ? 'Active' : 'Inactive',\n  },\n  {\n    key      : 'AMOUNT',\n    header   : 'Amount',\n    type     : 'number',\n    numFmt   : '#,##0.00',\n    transform: (val) => (val as number) * 1.1,   // +10%\n  },\n])\n```\n\n#### Per-column transform (CSV)\n\nSame API. In CSV the value is the **raw Oracle value** (no castCell step).\n\n```js\nOracleSqlToCsv()\n  .columns([\n    { key: 'STATUS', transform: (val) => val === 'Y' ? 'Active' : 'Inactive' },\n    { key: 'AMOUNT' },\n  ])\n```\n\n#### Per-row transform (Excel and CSV)\n\n`.transform(fn)` on `SheetConfig` (Excel) or `OracleSqlToCsvBuilder` (CSV) receives the assembled row **after** all per-column transforms. Use it to add computed columns or cross-column logic.\n\n```js\n// Excel — compute FULL_NAME from two columns\ns.columns([\n  { key: 'FIRST_NAME' },\n  { key: 'LAST_NAME'  },\n  { key: 'AMOUNT', type: 'number' },\n  { key: 'FULL_NAME' },   // populated by transform\n])\n.transform((row) => ({\n  ...row,\n  FULL_NAME: `${row.FIRST_NAME} ${row.LAST_NAME}`,\n}))\n```\n\n```js\n// CSV — same pattern\nOracleSqlToCsv()\n  .columns([{ key: 'A' }, { key: 'B' }, { key: 'C' }])\n  .transform((row) => ({ ...row, C: `${row.A}-${row.B}` }))\n```\n\n#### Async transforms\n\nBoth per-column and per-row transforms may return a `Promise`. The library `await`s the result.\n\n```js\n.transform(async (row) => ({\n  ...row,\n  ENRICHED: await fetchFromCache(row.ID),\n}))\n```\n\n> **Warning:** Async transforms run per-row and add one `await` per row. For exports with millions of rows this can significantly slow down the export. A warning is logged once per unique transform key in non-production environments (`NODE_ENV` not `production` or `prod`).\n\n#### `rawRow` argument\n\nPer-column `transform` receives the original DB row as its second argument — useful when the transformed value depends on another column:\n\n```js\n{\n  key      : 'AMOUNT',\n  type     : 'number',\n  transform: (val, rawRow) => rawRow.CURRENCY === 'USD' ? (val as number) * 1000 : val,\n}\n```\n\n---\n\n### Bind Parameters\n\n```js\n// Named binds (recommended for Oracle)\ns.sql(\n  'SELECT * FROM TRANSACTIONS WHERE BRANCH_CODE = :branch AND PERIOD = :period',\n  { branch: '019', period: '202601' }\n)\n\n// Multiple conditions with date binds\ns.sql(\n  'SELECT * FROM TRANSACTIONS WHERE STATUS = :status AND TXN_DATE >= :from AND TXN_DATE <= :to',\n  { status: 'A', from: new Date('2026-01-01'), to: new Date('2026-01-31') }\n)\n```\n\n---\n\n### Document Header\n\nAdd custom rows above the table header — company name, report title, period, etc.\n\n```js\ns.docHeader([\n  {\n    text  : 'ACME CORPORATION',\n    style : { bold: true, fontSize: 14, align: 'center' },\n    height: 24,\n  },\n  {\n    text  : 'BANK STATEMENT REPORT',\n    style : { bold: true, fontSize: 12, align: 'center' },\n    height: 20,\n  },\n  {\n    text  : 'Period: January 2026',\n    style : { italic: true, align: 'center' },\n  },\n  { text: '' },  // spacer row\n])\n```\n\n**Multi-column doc header** — for logo + title side-by-side:\n\n```js\ns.docHeader([\n  {\n    columns: [\n      // Columns 1-2, spans 2 rows downward\n      {\n        text       : '[LOGO]',\n        mergeAcross: 1,\n        mergeDown  : 1,\n        style      : { align: 'center', bold: true, bgColor: 'E9EFF7' },\n      },\n      // Columns 3-10, row 1\n      {\n        text       : 'BANK STATEMENT REPORT',\n        mergeAcross: 7,\n        style      : { bold: true, fontSize: 14, align: 'center' },\n      },\n    ],\n    height: 30,\n  },\n  {\n    columns: [\n      // Columns 1-2 blocked by mergeDown above — skipped automatically\n      // Columns 3-10, row 2\n      {\n        text       : 'Period: January 2026',\n        mergeAcross: 7,\n        style      : { italic: true, align: 'center' },\n      },\n    ],\n    height: 20,\n  },\n  { text: '' },  // spacer\n])\n```\n\n---\n\n### Multi-Level Column Header (headerGroups)\n\nAdd grouped header rows immediately above the column header row — useful for tables with\ncategory spans like financial reports. Supports the same `mergeAcross` / `mergeDown`\nmechanics as `.docHeader()`.\n\n- **`mergeAcross: N`** — span N additional columns to the right (total = N + 1).\n- **`mergeDown: N`** — span N additional rows downward (total = N + 1). Columns blocked by a `mergeDown` cell are skipped automatically in subsequent rows.\n- `freezeHeader` and `autoFilter` still target the **column header row** (the last row, produced by `.columns()`), not the group rows.\n\n```js\nsheet\n  .columns([\n    { key: 'NO',         header: '(1)' },\n    { key: 'UNIT_CODE',  header: '(2)' },\n    { key: 'DESCRIPTION',header: '(3)' },\n    { key: 'INV_2025',   header: '(4)' },\n    { key: 'INV_2024',   header: '(5)' },\n    { key: 'INV_CHG',    header: '(6)' },\n    { key: 'INV_PCT',    header: '(7)' },\n    { key: 'LAND_2025',  header: '(8)' },\n    { key: 'LAND_2024',  header: '(9)' },\n    { key: 'LAND_CHG',   header: '(10)' },\n    { key: 'LAND_PCT',   header: '(11)' },\n  ])\n  .headerGroups([\n    // ── Row 1: column labels that span 2 rows + category headers ──────────────\n    {\n      columns: [\n        { text: 'No.',         mergeDown: 1, style: { bold: true, align: 'center' } },\n        { text: 'Unit Code',   mergeDown: 1, style: { bold: true, align: 'center' } },\n        { text: 'Description', mergeDown: 1, style: { bold: true, align: 'center' } },\n        // mergeAcross: 3 → spans columns 4-7 (4 columns total)\n        { text: 'Inventory', mergeAcross: 3, style: { bold: true, align: 'center' } },\n        // mergeAcross: 3 → spans columns 8-11\n        { text: 'Land',      mergeAcross: 3, style: { bold: true, align: 'center' } },\n      ],\n    },\n    // ── Row 2: sub-column headers (cols 1-3 auto-skipped due to mergeDown) ─────\n    {\n      columns: [\n        { text: 'FY 2025 (Audited)',           style: { bold: true, align: 'center' } },\n        { text: 'FY 2024 (Audited)',           style: { bold: true, align: 'center' } },\n        { text: 'Increase/\\n(Decrease)',       style: { bold: true, align: 'center' } },\n        { text: '% Increase/\\n(Decrease)',     style: { bold: true, align: 'center' } },\n        { text: 'FY 2025 (Audited)',           style: { bold: true, align: 'center' } },\n        { text: 'FY 2024 (Audited)',           style: { bold: true, align: 'center' } },\n        { text: 'Increase/\\n(Decrease)',       style: { bold: true, align: 'center' } },\n        { text: '% Increase/\\n(Decrease)',     style: { bold: true, align: 'center' } },\n      ],\n    },\n  ])\n  .freezeHeader(true)   // freezes the (1)(2)(3)... column header row, not the groups\n  .autoFilter(true)\n```\n\nThe resulting sheet layout:\n\n```\nRow 1 (group)   │ No. ↕ │ Unit Code ↕ │ Description ↕ │  Inventory →→→→  │  Land →→→→  │\nRow 2 (group)   │       │             │               │FY25│FY24│Chg│% │FY25│FY24│Chg│%│\nRow 3 (header)  │  (1)  │     (2)     │      (3)      │ (4)│ (5)│(6)│(7)│(8)│(9) │…  │▼│\nRow 4+  (data)  │   1   │    A001     │  Agency Name… │  1,000,000  │ …                  │\n```\n\n> **`mergeDown` vs rowspan** — `mergeDown: 1` means the cell extends 1 row *downward* (2 rows total), equivalent to `rowspan=\"2\"` in HTML. `mergeAcross: 3` spans 3 additional columns (4 columns total), equivalent to `colspan=\"4\"`.\n\n---\n\n### Row Range Summary (`showTotalRows`)\n\nPrepends `\"Showing rows 1 – 50,000 of 182,400 total\"` on each sheet.\nRuns `SELECT COUNT(*)` in parallel — no overhead during the stream itself.\n\n```js\ns.sql('SELECT * FROM LARGE_TABLE')\n .showTotalRows()\n```\n\nOutput example across split sheets:\n```\nSheet 1 → \"Showing rows 1 – 1,000,000 of 1,800,000 total\"\nSheet 2 → \"Showing rows 1,000,001 – 1,800,000 of 1,800,000 total\"\n```\n\n> **Note:** Silently skipped when the SQL uses a CTE (`WITH ... AS`) or the COUNT query fails.\n\n---\n\n### Split Sheets (`maxRowsPerSheet`)\n\nWhen a result set exceeds the row limit, the library automatically creates new sheets.\n\n```js\ns.sql('SELECT * FROM HUGE_TABLE')\n .columns(COLS)\n .maxRowsPerSheet(500_000)   // split every 500k rows\n```\n\nControl split names with an array:\n\n```js\n.sheet(['Part A', 'Part B'], s => s\n  .sql(SQL)\n  .maxRowsPerSheet(200_000)\n)\n// → 'Part A', 'Part B', 'Part B 2', 'Part B 3', ...\n```\n\nEach sheet gets a `\"Continued from sheet: <prev>\"` notice at the top and a `\"Continued on sheet: <next>\"` footer at the bottom.\n\n---\n\n### Progress Tracking (WebSocket / SSE)\n\n**Excel:**\n\n```js\nawait OracleSqlToExcel()\n  .connectionFactory(() => pool.getConnection())\n  .onProgress(({ sheet, rowsWritten, skippedRows, totalRowsWritten }) => {\n    io.emit('export-progress', { sheet, rowsWritten, skippedRows, totalRowsWritten });\n  })\n  .sheet('Data', s => s.sql(SQL).columns(COLS))\n  .run();\n```\n\n**CSV:**\n\n```js\nawait OracleSqlToCsv()\n  .connectionFactory(() => pool.getConnection())\n  .sql(SQL).columns(COLS)\n  .onProgress(({ rowsWritten }) => {\n    io.emit('export-progress', { rowsWritten });\n  })\n  .run('/tmp/export.csv');\n```\n\nCallback fires once per Oracle fetch batch (default 50,000 rows).\n\n---\n\n### Error Handling\n\n```js\n// 'throw' mode (default) — abort on first bad row\ns.onRowError('throw')\n\n// 'skip' mode — drop bad rows, continue export\ns.onRowError('skip')\n```\n\nCheck skipped row count in the result:\n\n```js\nconst { success, skippedRows } = await OracleSqlToExcel()\n  .connectionFactory(() => pool.getConnection())\n  .sheet('Data', s => s.sql(SQL).columns(COLS).onRowError('skip'))\n  .run();\n\nif (skippedRows > 0) {\n  console.warn(`Export complete — ${skippedRows} rows skipped.`);\n}\n```\n\n---\n\n### Auto-detect Columns\n\nOmit `.columns()` to auto-detect from Oracle metadata. Column names and types are inferred automatically.\n\n```js\n// Excel\ns.sql('SELECT CODE, NAME, BALANCE FROM ACCOUNTS')\n// → all 3 columns, Oracle names as headers, types inferred from DB metadata\n\n// CSV\nOracleSqlToCsv().sql('SELECT CODE, NAME, BALANCE FROM ACCOUNTS')\n// → all 3 columns, Oracle names as headers\n```\n\n> A warning is emitted in non-production environments. Column order depends on the SELECT clause. Use `.columns()` for stable, long-term output.\n\n---\n\n### Backpressure & Memory\n\n**Excel (`.pipe()`):** After each Oracle fetch batch, the library checks process RSS. If it exceeds `.backpressureThreshold()` (default: 256 MB), the Oracle fetch pauses and polls every 200 ms until RSS drops. This handles the common case where Node.js sits behind a reverse proxy (nginx, etc.) that accepts data instantly — `stream.write()` always returns `true`, yet data accumulates in Node.js output buffers.\n\n> `.backpressureThreshold()` has no effect on `.run()` (file writes drain naturally) or `.toBuffer()` (data collected in memory by design).\n\n#### Why the stream appears to freeze during a pause\n\nThe pause happens **between** Oracle batches — after ExcelJS finishes writing a batch but before the next `getRows()` call. During the pause:\n\n- No new rows → ExcelJS produces no new XML → no new bytes flow to the browser\n- Data already flushed **before** the pause was already received by the browser — only the production of new data stops\n\nIn a browser's Network DevTools you will see the download size counter stall for a few seconds, then resume. This is expected and correct behavior.\n\n#### RSS stays near the threshold — why?\n\nEach batch follows this cycle:\n\n```\ngetRows(fetchSize) → ExcelJS writes XML → RSS rises\n                                         ↓\n                              RSS > threshold → pause\n                                         ↓\n                              GC recovers some RAM\n                              (active ZIP entry stays open → not all RAM freed)\n                                         ↓\n                              RSS < threshold → resume → next batch\n```\n\nRSS does not drop all the way back to baseline because the active ExcelJS workbook and open archiver ZIP entry hold live buffers. GC only reclaims the overhead from the previous batch. The result is that RSS oscillates just below and above the threshold for the entire export — this is normal.\n\n#### Estimating RSS per batch\n\nEach batch costs roughly:\n\n```\nRSS_per_batch ≈ fetchSize × avg_bytes_per_row × 3\n```\n\nThe `× 3` factor accounts for ExcelJS XML expansion (raw data → XML tags) plus archiver ZIP buffering. This is a rough estimate — actual values vary by column count, data types, and string length.\n\n| Row width | `fetchSize 50 000` | `fetchSize 10 000` |\n|-----------|-------------------|-------------------|\n| Narrow — ~100 B/row (few short columns) | ~15 MB | ~3 MB |\n| Average — ~300 B/row (10–15 mixed columns) | ~45 MB | ~9 MB |\n| Wide — ~1 KB/row (many columns or long strings) | ~150 MB | ~30 MB |\n\n**Rule of thumb for setting `backpressureThreshold`:**\n\n```\nthreshold = baseline_RSS + (2 × RSS_per_batch)\n```\n\n- `baseline_RSS` — process RSS before any export starts (check with `process.memoryUsage().rss`)\n- Leaving headroom of `2 × RSS_per_batch` ensures one full batch can be processed before the pause triggers\n\n#### Tuning example — 2.7 M rows, average row width\n\n```js\n// Baseline RSS ~80 MB, average row ~300 B, fetchSize 10 000 → ~9 MB/batch\n// threshold = 80 + (2 × 9) ≈ 100 MB\nOracleSqlToExcel()\n  .fetchSize(10_000)                          // smaller batches → smaller RSS spike\n  .backpressureThreshold(100 * 1024 * 1024)  // pause earlier → GC more effective\n  .file('report', f => f\n    .sheet('Data', s => s.sql(SQL).columns(COLS))\n  )\n  .asZip()\n  .pipe(res);\n```\n\nSmaller `fetchSize` is the most effective lever: it directly reduces RSS spike per batch and makes pauses shorter and less visible to the end user.\n\n**CSV (`.pipe()`):** CSV rows are plain text — far smaller than Excel's XML+ZIP output. At 50,000 rows/batch, a typical batch is a few MB of text and flushes quickly through the TCP stack. Backpressure is generally not a concern for CSV streams.\n\n---\n\n### Custom Execute Options\n\n```js\n// Workbook-level default (applies to all sheets)\nOracleSqlToExcel()\n  .executeOptions({ autoCommit: false })\n\n// Sheet-level override (merged over workbook-level)\ns.sql('SELECT * FROM T', {}, { autoCommit: false })\n```\n\n> `outFormat`, `resultSet`, and `fetchArraySize` are always overridden internally and cannot be changed.\n\n---\n\n## Excel vs CSV — When to Use Which\n\n| | Excel (`.xlsx`) | CSV |\n|---|---|---|\n| **Formatting** | Number formats, colors, fonts, freeze header, auto-filter | None |\n| **Multiple sheets** | Yes | No |\n| **Max rows per sheet** | 1,048,576 (auto-split) | Unlimited |\n| **File size** | Larger (XML inside ZIP) | Smaller (~3–10× smaller) |\n| **Memory (stream)** | Bounded via RSS polling | `O(fetchSize × row_size)` — minimal |\n| **Speed** | Slower (XML generation + ZIP) | Faster |\n| **Best for** | Formatted reports, pivot tables | Raw data exports, BI tools, large datasets |\n\n---\n\n## Requirements\n\n| Dependency | Version |\n|------------|---------|\n| Node.js    | >= 14.0.0 |\n| exceljs    | >= 4.x |\n| oracledb   | >= 5.x (peer) |\n\n---\n\n## Changelog\n\nSee [CHANGELOG.md](CHANGELOG.md) for release history.\n\n---\n\n## License\n\n[MIT](LICENSE) © Avisena Alwi\n","readmeFilename":"README.md"}