han-excel-builder 1.0.2 → 1.0.3

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.
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("exceljs"),t=require("file-saver");class s{listeners=new Map;on(e,t,s={}){this.listeners.has(e)||this.listeners.set(e,[]);const r={type:e,listener:t,options:{once:!1,async:!1,priority:0,stopPropagation:!1,...s},id:this.generateId(),active:!0,timestamp:new Date};return this.listeners.get(e).push(r),this.listeners.get(e).sort((e,t)=>(t.options.priority||0)-(e.options.priority||0)),r.id}once(e,t,s={}){return this.on(e,t,{...s,once:!0})}off(e,t){const s=this.listeners.get(e);if(!s)return!1;const r=s.findIndex(e=>e.id===t);return-1!==r&&(s.splice(r,1),!0)}offAll(e){const t=this.listeners.get(e);if(!t)return 0;const s=t.length;return this.listeners.delete(e),s}async emit(e){const t=e.type||"default",s=this.listeners.get(t);if(!s||0===s.length)return;const r=s.filter(e=>e.active);for(const o of r)try{if(o.options.once&&(o.active=!1),o.options.async?await o.listener(e):o.listener(e),o.options.stopPropagation)break}catch(i){console.error(`Error in event listener for ${t}:`,i)}this.cleanupInactiveListeners(t)}emitSync(e){const t=e.type||"default",s=this.listeners.get(t);if(!s||0===s.length)return;const r=s.filter(e=>e.active);for(const o of r)try{if(o.options.once&&(o.active=!1),o.listener(e),o.options.stopPropagation)break}catch(i){console.error(`Error in event listener for ${t}:`,i)}this.cleanupInactiveListeners(t)}clear(){this.listeners.clear()}getListeners(e){return this.listeners.get(e)||[]}getListenerCount(e){return this.listeners.get(e)?.length||0}getEventTypes(){return Array.from(this.listeners.keys())}generateId(){return Math.random().toString(36).substr(2,9)}cleanupInactiveListeners(e){const t=this.listeners.get(e);if(t){const s=t.filter(e=>e.active);s.length!==t.length&&this.listeners.set(e,s)}}}var r=(e=>(e.STRING="string",e.NUMBER="number",e.BOOLEAN="boolean",e.DATE="date",e.PERCENTAGE="percentage",e.CURRENCY="currency",e.LINK="link",e.FORMULA="formula",e))(r||{}),i=(e=>(e.GENERAL="General",e.NUMBER="#,##0",e.NUMBER_DECIMALS="#,##0.00",e.CURRENCY="$#,##0.00",e.CURRENCY_INTEGER="$#,##0",e.PERCENTAGE="0%",e.PERCENTAGE_DECIMALS="0.00%",e.DATE="dd/mm/yyyy",e.DATE_TIME="dd/mm/yyyy hh:mm",e.TIME="hh:mm:ss",e.CUSTOM="custom",e))(i||{}),o=(e=>(e.LEFT="left",e.CENTER="center",e.RIGHT="right",e.FILL="fill",e.JUSTIFY="justify",e.CENTER_CONTINUOUS="centerContinuous",e.DISTRIBUTED="distributed",e))(o||{}),l=(e=>(e.TOP="top",e.MIDDLE="middle",e.BOTTOM="bottom",e.DISTRIBUTED="distributed",e.JUSTIFY="justify",e))(l||{}),n=(e=>(e.THIN="thin",e.MEDIUM="medium",e.THICK="thick",e.DOTTED="dotted",e.DASHED="dashed",e.DOUBLE="double",e.HAIR="hair",e.MEDIUM_DASHED="mediumDashed",e.DASH_DOT="dashDot",e.MEDIUM_DASH_DOT="mediumDashDot",e.DASH_DOT_DOT="dashDotDot",e.MEDIUM_DASH_DOT_DOT="mediumDashDotDot",e.SLANT_DASH_DOT="slantDashDot",e))(n||{}),a=(e=>(e.NORMAL="normal",e.BOLD="bold",e.ITALIC="italic",e.BOLD_ITALIC="bold italic",e))(a||{}),h=(e=>(e.VALIDATION_ERROR="VALIDATION_ERROR",e.BUILD_ERROR="BUILD_ERROR",e.STYLE_ERROR="STYLE_ERROR",e.WORKSHEET_ERROR="WORKSHEET_ERROR",e.CELL_ERROR="CELL_ERROR",e))(h||{});class d{config;tables=[];currentRow=1;currentCol=1;headerPointers=new Map;isBuilt=!1;headers=[];subHeaders=[];body=[];footers=[];constructor(e){this.config=e}addHeader(e){return this.headers.push(e),this}addSubHeaders(e){return this.subHeaders.push(...e),this}addRow(e){return Array.isArray(e)?this.body.push(...e):this.body.push(e),this}addFooter(e){return Array.isArray(e)?this.footers.push(...e):this.footers.push(e),this}addTable(e={}){const t={name:e.name||`Table_${this.tables.length+1}`,headers:e.headers||[],subHeaders:e.subHeaders||[],body:e.body||[],footers:e.footers||[],showBorders:!1!==e.showBorders,showStripes:!1!==e.showStripes,style:e.style||"TableStyleLight1",...e};return this.tables.push(t),this}finalizeTable(){0===this.tables.length&&this.addTable();const e=this.tables[this.tables.length-1];if(!e)throw new Error("No se pudo obtener la tabla actual");return this.headers.length>0&&(e.headers=[...e.headers||[],...this.headers]),this.subHeaders.length>0&&(e.subHeaders=[...e.subHeaders||[],...this.subHeaders]),this.body.length>0&&(e.body=[...e.body||[],...this.body]),this.footers.length>0&&(e.footers=[...e.footers||[],...this.footers]),this.headers=[],this.subHeaders=[],this.body=[],this.footers=[],this}getTable(e){return this.tables.find(t=>t.name===e)}async build(e,t={}){const s=e.addWorksheet(this.config.name,{properties:{defaultRowHeight:this.config.defaultRowHeight||20,tabColor:this.config.tabColor},pageSetup:this.config.pageSetup});let r=1;if(this.tables.length>0)for(let i=0;i<this.tables.length;i++){const e=this.tables[i];e&&(r=await this.buildTable(s,e,r,i>0))}else r=await this.buildLegacyContent(s,r);this.isBuilt=!0}async buildTable(e,t,s,r=!1){let i=s;if(r&&(i+=2),t.headers&&t.headers.length>0)for(const o of t.headers){if(e.addRow([o.value]),o.mergeCell){const s=this.calculateTableMaxColumns(t);e.mergeCells(i,1,i,s)}o.styles&&e.getRow(i).eachCell(e=>{e.style=this.convertStyle(o.styles)}),i++}if(t.subHeaders&&t.subHeaders.length>0&&(i=this.buildNestedHeaders(e,i,t.subHeaders)),t.body&&t.body.length>0)for(const o of t.body)i=this.addDataRowRecursive(e,i,o);if(t.footers&&t.footers.length>0)for(const o of t.footers)i=this.addFooterRow(e,i,o);return(t.showBorders||t.showStripes)&&this.applyTableStyle(e,t,s,i-1),i}async buildLegacyContent(e,t){let s=t;this.headers.length>0&&this.headers.forEach(t=>{e.addRow([t.value]),t.mergeCell&&e.mergeCells(s,1,s,this.getMaxColumns()||1),t.styles&&e.getRow(s).eachCell(e=>{e.style=this.convertStyle(t.styles)}),s++}),this.subHeaders.length>0&&(s=this.buildNestedHeaders(e,s,this.subHeaders));for(const r of this.body)s=this.addDataRowRecursive(e,s,r);if(this.footers.length>0)for(const r of this.footers)s=this.addFooterRow(e,s,r);return s}calculateTableMaxColumns(e){let t=0;if(e.subHeaders&&e.subHeaders.length>0)for(const s of e.subHeaders)t+=this.calculateHeaderColSpan(s);return t||1}applyTableStyle(e,t,s,r){const i=this.calculateTableMaxColumns(t);if(t.showBorders)for(let o=s;o<=r;o++)for(let t=1;t<=i;t++){const s=e.getRow(o).getCell(t);s.style||(s.style={}),s.style.border||(s.style.border={top:{style:"thin",color:{argb:"FF8EAADB"}},left:{style:"thin",color:{argb:"FF8EAADB"}},bottom:{style:"thin",color:{argb:"FF8EAADB"}},right:{style:"thin",color:{argb:"FF8EAADB"}}})}if(t.showStripes)for(let o=s;o<=r;o++)if((o-s)%2==1)for(let t=1;t<=i;t++){const s=e.getRow(o).getCell(t);s.style||(s.style={}),s.style.fill||(s.style.fill={type:"pattern",pattern:"solid",fgColor:{argb:"FFF2F2F2"}})}}buildNestedHeaders(e,t,s){let r=t;const i=this.getMaxHeaderDepth(s);for(let o=0;o<i;o++){const t=e.getRow(r);let i=1;for(const e of s)if(0===o){const s=this.getHeaderAtDepth(e,o,i),r=t.getCell(i);r.value=s.value,s.style&&(r.style=this.convertStyle(s.style)),i+=s.colSpan}else if(e.children&&e.children.length>0)for(const s of e.children){const r=t.getCell(i);r.value="string"==typeof s.value?s.value:String(s.value||""),(s.styles||e.styles)&&(r.style=this.convertStyle(s.styles||e.styles)),i+=this.calculateHeaderColSpan(s)}else{t.getCell(i).value=null,i+=1}r++}return this.applyAllMerges(e,t,r-1,s),r}getHeaderAtDepth(e,t,s){const r=this.calculateHeaderColSpan(e);if(0===t){console.log(" paso dios mio header",e.value);const t=r>1?{start:s,end:s+r-1}:null;return{value:"string"==typeof e.value?e.value:String(e.value||""),style:e.styles,colSpan:r,mergeRange:t}}if(e.children&&e.children.length>0){const r=e.children[t];if(r){const t=this.calculateHeaderColSpan(r),i=t>1?{start:s,end:s+t-1}:null;return{value:"string"==typeof r.value?r.value:String(r.value||""),style:r.styles||e.styles,colSpan:t,mergeRange:i}}}return{value:null,style:null,colSpan:1}}applyAllMerges(e,t,s,r){this.getMaxHeaderDepth(r)<=1||this.applySmartMerges(e,t,s,r)}applySmartMerges(e,t,s,r){if(this.getMaxHeaderDepth(r)<=1)return;let i=1;for(const o of r)this.applySmartMergesForHeader(e,t,s,o,i),i+=this.calculateHeaderColSpan(o)}applySmartMergesForHeader(e,t,s,r,i){const o=this.calculateHeaderColSpan(r);if(r.children&&0!==r.children.length){o>1&&e.mergeCells(t,i,t,i+o-1);let l=i;for(const i of r.children)this.applySmartMergesForHeader(e,t+1,s,i,l),l+=this.calculateHeaderColSpan(i)}else e.mergeCells(t,i,s,i+o-1)}calculateHeaderColSpan(e){return e.children&&0!==e.children.length?e.children.reduce((e,t)=>e+this.calculateHeaderColSpan(t),0):1}getMaxHeaderDepth(e){let t=1;for(const s of e)if(s.children&&s.children.length>0){const e=this.getMaxHeaderDepth(s.children);t=Math.max(t,e+1)}return t}getMaxColumns(){let e=0;for(const t of this.subHeaders)e+=this.calculateHeaderColSpan(t);return e}validate(){return this.headers.length||this.body.length?{success:!0,data:!0}:{success:!1,error:{type:h.VALIDATION_ERROR,message:"La hoja no tiene datos"}}}calculateDataColumnPositions(){const e={};let t=1;for(const s of this.subHeaders)if(s.children&&s.children.length>0)for(const r of s.children)r.key&&(e[r.key]=t),r.value&&(e[String(r.value)]=t),t++;else s.key&&(e[s.key]=t),s.value&&(e[String(s.value)]=t),t++;return e}addFooterRow(e,t,s){const r=this.calculateDataColumnPositions();let i;s.key&&r[s.key]?i=r[s.key]:s.header&&r[s.header]&&(i=r[s.header]),void 0===i&&(i=1);const o=e.getRow(t),l=o.getCell(i);if(l.value=s.value,s.styles&&(l.style=this.convertStyle(s.styles)),s.numberFormat&&(l.numFmt=s.numberFormat),s.mergeCell&&s.mergeTo&&e.mergeCells(t,i,t,s.mergeTo),s.children&&s.children.length>0)for(const n of s.children)if(n){let e;if(n.key&&r[n.key]?e=r[n.key]:n.header&&r[n.header]&&(e=r[n.header]),void 0!==e){const t=o.getCell(e);t.value=n.value,n.styles&&(t.style=this.convertStyle(n.styles)),n.numberFormat&&(t.numFmt=n.numberFormat)}}return s.jump?t+1:t}addDataRowRecursive(e,t,s){const r=this.calculateDataColumnPositions();let i;console.log("columnPositions",r),s.key&&r[s.key]?i=r[s.key]:s.header&&r[s.header]&&(i=r[s.header]),void 0===i&&(i=1);const o=e.getRow(t),l=o.getCell(i);if(l.value=s.value,s.styles&&(l.style=this.convertStyle(s.styles)),s.numberFormat&&(l.numFmt=s.numberFormat),s.children&&s.children.length>0)for(const n of s.children)if(n){let e;if(n.key&&r[n.key]?e=r[n.key]:n.header&&r[n.header]&&(e=r[n.header]),void 0!==e){const t=o.getCell(e);t.value=n.value,n.styles&&(t.style=this.convertStyle(n.styles)),n.numberFormat&&(t.numFmt=n.numberFormat)}}return s.jump?t+1:t}convertStyle(e){if(!e)return{};const t={};return e.font&&(t.font={name:e.font.family,size:e.font.size,bold:e.font.bold,italic:e.font.italic,underline:e.font.underline,color:e.font.color}),e.fill&&(t.fill={type:e.fill.type,pattern:e.fill.pattern,fgColor:e.fill.foregroundColor,bgColor:e.fill.backgroundColor}),e.border&&(t.border={top:e.border.top,left:e.border.left,bottom:e.border.bottom,right:e.border.right}),e.alignment&&(t.alignment={horizontal:e.alignment.horizontal,vertical:e.alignment.vertical,wrapText:e.alignment.wrapText,indent:e.alignment.indent}),e.numFmt&&(t.numFmt=e.numFmt),t}}var c=(e=>(e.WORKSHEET_ADDED="worksheetAdded",e.WORKSHEET_REMOVED="worksheetRemoved",e.WORKSHEET_UPDATED="worksheetUpdated",e.BUILD_STARTED="buildStarted",e.BUILD_PROGRESS="buildProgress",e.BUILD_COMPLETED="buildCompleted",e.BUILD_ERROR="buildError",e.DOWNLOAD_STARTED="downloadStarted",e.DOWNLOAD_PROGRESS="downloadProgress",e.DOWNLOAD_COMPLETED="downloadCompleted",e.DOWNLOAD_ERROR="downloadError",e))(c||{});class u{config;worksheets=new Map;currentWorksheet;isBuilding=!1;stats;eventEmitter;constructor(e={}){this.config={enableValidation:!0,enableEvents:!0,enablePerformanceMonitoring:!1,maxWorksheets:255,maxRowsPerWorksheet:1048576,maxColumnsPerWorksheet:16384,memoryLimit:104857600,...e},this.stats=this.initializeStats(),this.eventEmitter=new s}addWorksheet(e,t={}){if(this.worksheets.has(e))throw new Error(`Worksheet "${e}" already exists`);const s={name:e,defaultRowHeight:20,defaultColWidth:10,...this.config.defaultWorksheetConfig,...t},r=new d(s);return this.worksheets.set(e,r),this.currentWorksheet=r,this.emitEvent(c.WORKSHEET_ADDED,{worksheetName:e}),r}getWorksheet(e){return this.worksheets.get(e)}removeWorksheet(e){const t=this.worksheets.get(e);return!!t&&(this.worksheets.delete(e),this.currentWorksheet===t&&(this.currentWorksheet=void 0),this.emitEvent(c.WORKSHEET_REMOVED,{worksheetName:e}),!0)}setCurrentWorksheet(e){const t=this.worksheets.get(e);return!!t&&(this.currentWorksheet=t,!0)}async build(t={}){if(this.isBuilding)return{success:!1,error:{type:h.BUILD_ERROR,message:"Build already in progress",stack:(new Error).stack||""}};this.isBuilding=!0;const s=Date.now();try{this.emitEvent(c.BUILD_STARTED);const r=new e.Workbook;this.config.metadata&&(r.creator=this.config.metadata.author||"Han Excel Builder",r.lastModifiedBy=this.config.metadata.author||"Han Excel Builder",r.created=this.config.metadata.created||new Date,r.modified=this.config.metadata.modified||new Date,this.config.metadata.title&&(r.title=this.config.metadata.title),this.config.metadata.subject&&(r.subject=this.config.metadata.subject),this.config.metadata.keywords&&(r.keywords=this.config.metadata.keywords),this.config.metadata.category&&(r.category=this.config.metadata.category),this.config.metadata.description&&(r.description=this.config.metadata.description));for(const e of this.worksheets.values())await e.build(r,t);const i=await r.xlsx.writeBuffer({compression:t.compressionLevel||6}),o=Date.now();this.stats.buildTime=o-s,this.stats.fileSize=i.byteLength;const l={success:!0,data:i};return this.emitEvent(c.BUILD_COMPLETED,{buildTime:this.stats.buildTime,fileSize:this.stats.fileSize}),l}catch(r){const e={success:!1,error:{type:h.BUILD_ERROR,message:r instanceof Error?r.message:"Unknown build error",stack:r instanceof Error&&r.stack||""}};return this.emitEvent(c.BUILD_ERROR,{error:e.error}),e}finally{this.isBuilding=!1}}async generateAndDownload(e,s={}){const r=await this.build(s);if(!r.success)return r;try{this.emitEvent(c.DOWNLOAD_STARTED,{fileName:e});const i=new Blob([r.data],{type:s.mimeType||"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"});return t(i,e),this.emitEvent(c.DOWNLOAD_COMPLETED,{fileName:e}),{success:!0,data:void 0}}catch(i){const e={success:!1,error:{type:h.BUILD_ERROR,message:i instanceof Error?i.message:"Download failed",stack:i instanceof Error&&i.stack||""}};return this.emitEvent(c.DOWNLOAD_ERROR,{error:e.error}),e}}async toBuffer(e={}){return this.build(e)}async toBlob(e={}){const t=await this.build(e);if(!t.success)return t;return{success:!0,data:new Blob([t.data],{type:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"})}}validate(){const e=[];0===this.worksheets.size&&e.push("No worksheets found");for(const[t,s]of this.worksheets.entries()){const r=s.validate();r.success||e.push(`Worksheet "${t}": ${r.error?.message}`)}return e.length>0?{success:!1,error:{type:h.VALIDATION_ERROR,message:e.join("; "),stack:(new Error).stack||""}}:{success:!0,data:!0}}clear(){this.worksheets.clear(),this.currentWorksheet=void 0}getStats(){return{...this.stats}}on(e,t){return this.eventEmitter.on(e,t)}off(e,t){return this.eventEmitter.off(e,t)}removeAllListeners(e){e?this.eventEmitter.offAll(e):this.eventEmitter.clear()}emitEvent(e,t){const s={type:e,data:t||{},timestamp:new Date};this.eventEmitter.emitSync(s)}initializeStats(){return{totalWorksheets:0,totalCells:0,memoryUsage:0,buildTime:0,fileSize:0,stylesUsed:0,formulasUsed:0,conditionalFormatsUsed:0,performance:{headersTime:0,dataTime:0,stylesTime:0,writeTime:0}}}}class y{style={};constructor(){this.style.alignment={horizontal:o.CENTER,vertical:l.MIDDLE,wrapText:!0,shrinkToFit:!0}}static create(){return new y}fontName(e){return this.style.font||(this.style.font={}),this.style.font.name=e,this}fontSize(e){return this.style.font||(this.style.font={}),this.style.font.size=e,this}fontStyle(e){return this.style.font||(this.style.font={}),this.style.font.style=e,this}fontColor(e){return this.style.font||(this.style.font={}),this.style.font.color=e,this}fontBold(){return this.style.font||(this.style.font={}),this.style.font.bold=!0,this}fontItalic(){return this.style.font||(this.style.font={}),this.style.font.italic=!0,this}fontUnderline(){return this.style.font||(this.style.font={}),this.style.font.underline=!0,this}border(e,t){this.style.border||(this.style.border={});const s={style:e};return void 0!==t&&(s.color=t),this.style.border.top=s,this.style.border.left=s,this.style.border.bottom=s,this.style.border.right=s,this}borderTop(e,t){this.style.border||(this.style.border={});const s={style:e};return void 0!==t&&(s.color=t),this.style.border.top=s,this}borderLeft(e,t){this.style.border||(this.style.border={});const s={style:e};return void 0!==t&&(s.color=t),this.style.border.left=s,this}borderBottom(e,t){this.style.border||(this.style.border={});const s={style:e};return void 0!==t&&(s.color=t),this.style.border.bottom=s,this}borderRight(e,t){this.style.border||(this.style.border={});const s={style:e};return void 0!==t&&(s.color=t),this.style.border.right=s,this}backgroundColor(e){return this.style.fill||(this.style.fill={type:"pattern"}),this.style.fill.backgroundColor=e,this.style.fill.pattern="solid",this}horizontalAlign(e){return this.style.alignment||(this.style.alignment={}),this.style.alignment.horizontal=e,this}verticalAlign(e){return this.style.alignment||(this.style.alignment={}),this.style.alignment.vertical=e,this}centerAlign(){return this.style.alignment||(this.style.alignment={}),this.style.alignment.horizontal=o.CENTER,this.style.alignment.vertical=l.MIDDLE,this}leftAlign(){return this.style.alignment||(this.style.alignment={}),this.style.alignment.horizontal=o.LEFT,this}rightAlign(){return this.style.alignment||(this.style.alignment={}),this.style.alignment.horizontal=o.RIGHT,this}wrapText(){return this.style.alignment||(this.style.alignment={}),this.style.alignment.wrapText=!0,this}numberFormat(e){return this.style.numberFormat=e,this}striped(){return this.style.striped=!0,this}conditionalFormat(e){return this.style.conditionalFormats||(this.style.conditionalFormats=[]),this.style.conditionalFormats.push(e),this}build(){return this.style}reset(){return this.style={},this.style.alignment={horizontal:o.CENTER,vertical:l.MIDDLE,wrapText:!0},this}clone(){const e=new y;return e.style=JSON.parse(JSON.stringify(this.style)),e}}var f=(e=>(e.CREATED="created",e.UPDATED="updated",e.DELETED="deleted",e.STYLED="styled",e.VALIDATED="validated",e))(f||{}),g=(e=>(e.CREATED="created",e.UPDATED="updated",e.DELETED="deleted",e.TABLE_ADDED="tableAdded",e.TABLE_REMOVED="tableRemoved",e.CELL_ADDED="cellAdded",e.CELL_UPDATED="cellUpdated",e.CELL_DELETED="cellDeleted",e))(g||{}),m=(e=>(e.HEADER="header",e.SUBHEADER="subheader",e.DATA="data",e.FOOTER="footer",e.TOTAL="total",e.HIGHLIGHT="highlight",e.WARNING="warning",e.ERROR="error",e.SUCCESS="success",e.INFO="info",e))(m||{});exports.BorderStyle=n,exports.BuilderEventType=c,exports.CellEventType=f,exports.CellType=r,exports.ErrorType=h,exports.EventEmitter=s,exports.ExcelBuilder=u,exports.FontStyle=a,exports.HorizontalAlignment=o,exports.NumberFormat=i,exports.StyleBuilder=y,exports.StylePreset=m,exports.VerticalAlignment=l,exports.Worksheet=d,exports.WorksheetEventType=g,exports.default=u;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("exceljs"),t=require("file-saver");class s{listeners=new Map;on(e,t,s={}){this.listeners.has(e)||this.listeners.set(e,[]);const r={type:e,listener:t,options:{once:!1,async:!1,priority:0,stopPropagation:!1,...s},id:this.generateId(),active:!0,timestamp:new Date};return this.listeners.get(e).push(r),this.listeners.get(e).sort((e,t)=>(t.options.priority||0)-(e.options.priority||0)),r.id}once(e,t,s={}){return this.on(e,t,{...s,once:!0})}off(e,t){const s=this.listeners.get(e);if(!s)return!1;const r=s.findIndex(e=>e.id===t);return-1!==r&&(s.splice(r,1),!0)}offAll(e){const t=this.listeners.get(e);if(!t)return 0;const s=t.length;return this.listeners.delete(e),s}async emit(e){const t=e.type||"default",s=this.listeners.get(t);if(!s||0===s.length)return;const r=s.filter(e=>e.active);for(const o of r)try{if(o.options.once&&(o.active=!1),o.options.async?await o.listener(e):o.listener(e),o.options.stopPropagation)break}catch(i){console.error(`Error in event listener for ${t}:`,i)}this.cleanupInactiveListeners(t)}emitSync(e){const t=e.type||"default",s=this.listeners.get(t);if(!s||0===s.length)return;const r=s.filter(e=>e.active);for(const o of r)try{if(o.options.once&&(o.active=!1),o.listener(e),o.options.stopPropagation)break}catch(i){console.error(`Error in event listener for ${t}:`,i)}this.cleanupInactiveListeners(t)}clear(){this.listeners.clear()}getListeners(e){return this.listeners.get(e)||[]}getListenerCount(e){return this.listeners.get(e)?.length||0}getEventTypes(){return Array.from(this.listeners.keys())}generateId(){return Math.random().toString(36).substr(2,9)}cleanupInactiveListeners(e){const t=this.listeners.get(e);if(t){const s=t.filter(e=>e.active);s.length!==t.length&&this.listeners.set(e,s)}}}var r=(e=>(e.STRING="string",e.NUMBER="number",e.BOOLEAN="boolean",e.DATE="date",e.PERCENTAGE="percentage",e.CURRENCY="currency",e.LINK="link",e.FORMULA="formula",e))(r||{}),i=(e=>(e.GENERAL="General",e.NUMBER="#,##0",e.NUMBER_DECIMALS="#,##0.00",e.CURRENCY="$#,##0.00",e.CURRENCY_INTEGER="$#,##0",e.PERCENTAGE="0%",e.PERCENTAGE_DECIMALS="0.00%",e.DATE="dd/mm/yyyy",e.DATE_TIME="dd/mm/yyyy hh:mm",e.TIME="hh:mm:ss",e.CUSTOM="custom",e))(i||{}),o=(e=>(e.LEFT="left",e.CENTER="center",e.RIGHT="right",e.FILL="fill",e.JUSTIFY="justify",e.CENTER_CONTINUOUS="centerContinuous",e.DISTRIBUTED="distributed",e))(o||{}),l=(e=>(e.TOP="top",e.MIDDLE="middle",e.BOTTOM="bottom",e.DISTRIBUTED="distributed",e.JUSTIFY="justify",e))(l||{}),n=(e=>(e.THIN="thin",e.MEDIUM="medium",e.THICK="thick",e.DOTTED="dotted",e.DASHED="dashed",e.DOUBLE="double",e.HAIR="hair",e.MEDIUM_DASHED="mediumDashed",e.DASH_DOT="dashDot",e.MEDIUM_DASH_DOT="mediumDashDot",e.DASH_DOT_DOT="dashDotDot",e.MEDIUM_DASH_DOT_DOT="mediumDashDotDot",e.SLANT_DASH_DOT="slantDashDot",e))(n||{}),a=(e=>(e.NORMAL="normal",e.BOLD="bold",e.ITALIC="italic",e.BOLD_ITALIC="bold italic",e))(a||{}),h=(e=>(e.VALIDATION_ERROR="VALIDATION_ERROR",e.BUILD_ERROR="BUILD_ERROR",e.STYLE_ERROR="STYLE_ERROR",e.WORKSHEET_ERROR="WORKSHEET_ERROR",e.CELL_ERROR="CELL_ERROR",e))(h||{});class d{config;tables=[];currentRow=1;currentCol=1;headerPointers=new Map;isBuilt=!1;headers=[];subHeaders=[];body=[];footers=[];constructor(e){this.config=e}addHeader(e){return this.headers.push(e),this}addSubHeaders(e){return this.subHeaders.push(...e),this}addRow(e){return Array.isArray(e)?this.body.push(...e):this.body.push(e),this}addFooter(e){return Array.isArray(e)?this.footers.push(...e):this.footers.push(e),this}addTable(e={}){const t={name:e.name||`Table_${this.tables.length+1}`,headers:e.headers||[],subHeaders:e.subHeaders||[],body:e.body||[],footers:e.footers||[],showBorders:!1!==e.showBorders,showStripes:!1!==e.showStripes,style:e.style||"TableStyleLight1",...e};return this.tables.push(t),this}finalizeTable(){0===this.tables.length&&this.addTable();const e=this.tables[this.tables.length-1];if(!e)throw new Error("No se pudo obtener la tabla actual");return this.headers.length>0&&(e.headers=[...e.headers||[],...this.headers]),this.subHeaders.length>0&&(e.subHeaders=[...e.subHeaders||[],...this.subHeaders]),this.body.length>0&&(e.body=[...e.body||[],...this.body]),this.footers.length>0&&(e.footers=[...e.footers||[],...this.footers]),this.headers=[],this.subHeaders=[],this.body=[],this.footers=[],this}getTable(e){return this.tables.find(t=>t.name===e)}async build(e,t={}){const s=e.addWorksheet(this.config.name,{properties:{defaultRowHeight:this.config.defaultRowHeight||20,tabColor:this.config.tabColor},pageSetup:this.config.pageSetup});let r=1;if(this.tables.length>0)for(let i=0;i<this.tables.length;i++){const e=this.tables[i];e&&(r=await this.buildTable(s,e,r,i>0))}else r=await this.buildLegacyContent(s,r);this.isBuilt=!0}async buildTable(e,t,s,r=!1){let i=s;if(r&&(i+=2),t.headers&&t.headers.length>0)for(const o of t.headers){if(e.addRow([o.value]),o.mergeCell){const s=this.calculateTableMaxColumns(t);e.mergeCells(i,1,i,s)}o.styles&&e.getRow(i).eachCell(e=>{e.style=this.convertStyle(o.styles)}),i++}if(t.subHeaders&&t.subHeaders.length>0&&(i=this.buildNestedHeaders(e,i,t.subHeaders)),t.body&&t.body.length>0)for(const o of t.body)i=this.addDataRowRecursive(e,i,o);if(t.footers&&t.footers.length>0)for(const o of t.footers)i=this.addFooterRow(e,i,o);return(t.showBorders||t.showStripes)&&this.applyTableStyle(e,t,s,i-1),i}async buildLegacyContent(e,t){let s=t;this.headers.length>0&&this.headers.forEach(t=>{e.addRow([t.value]),t.mergeCell&&e.mergeCells(s,1,s,this.getMaxColumns()||1),t.styles&&e.getRow(s).eachCell(e=>{e.style=this.convertStyle(t.styles)}),s++}),this.subHeaders.length>0&&(s=this.buildNestedHeaders(e,s,this.subHeaders));for(const r of this.body)s=this.addDataRowRecursive(e,s,r);if(this.footers.length>0)for(const r of this.footers)s=this.addFooterRow(e,s,r);return s}calculateTableMaxColumns(e){let t=0;if(e.subHeaders&&e.subHeaders.length>0)for(const s of e.subHeaders)t+=this.calculateHeaderColSpan(s);return t||1}applyTableStyle(e,t,s,r){const i=this.calculateTableMaxColumns(t);if(t.showBorders)for(let o=s;o<=r;o++)for(let t=1;t<=i;t++){const s=e.getRow(o).getCell(t);s.style||(s.style={}),s.style.border||(s.style.border={top:{style:"thin",color:{argb:"FF8EAADB"}},left:{style:"thin",color:{argb:"FF8EAADB"}},bottom:{style:"thin",color:{argb:"FF8EAADB"}},right:{style:"thin",color:{argb:"FF8EAADB"}}})}if(t.showStripes)for(let o=s;o<=r;o++)if((o-s)%2==1)for(let t=1;t<=i;t++){const s=e.getRow(o).getCell(t);s.style||(s.style={}),s.style.fill||(s.style.fill={type:"pattern",pattern:"solid",fgColor:{argb:"FFF2F2F2"}})}}buildNestedHeaders(e,t,s){let r=t;const i=this.getMaxHeaderDepth(s);for(let o=0;o<i;o++){const t=e.getRow(r);let i=1;for(const e of s)if(0===o){const s=this.getHeaderAtDepth(e,o,i),r=t.getCell(i);r.value=s.value,s.style&&(r.style=this.convertStyle(s.style)),i+=s.colSpan}else if(e.children&&e.children.length>0)for(const s of e.children){const r=t.getCell(i);r.value="string"==typeof s.value?s.value:String(s.value||""),(s.styles||e.styles)&&(r.style=this.convertStyle(s.styles||e.styles)),i+=this.calculateHeaderColSpan(s)}else{t.getCell(i).value=null,i+=1}r++}return this.applyAllMerges(e,t,r-1,s),r}getHeaderAtDepth(e,t,s){const r=this.calculateHeaderColSpan(e);if(0===t){const t=r>1?{start:s,end:s+r-1}:null;return{value:"string"==typeof e.value?e.value:String(e.value||""),style:e.styles,colSpan:r,mergeRange:t}}if(e.children&&e.children.length>0){const r=e.children[t];if(r){const t=this.calculateHeaderColSpan(r),i=t>1?{start:s,end:s+t-1}:null;return{value:"string"==typeof r.value?r.value:String(r.value||""),style:r.styles||e.styles,colSpan:t,mergeRange:i}}}return{value:null,style:null,colSpan:1}}applyAllMerges(e,t,s,r){this.getMaxHeaderDepth(r)<=1||this.applySmartMerges(e,t,s,r)}applySmartMerges(e,t,s,r){if(this.getMaxHeaderDepth(r)<=1)return;let i=1;for(const o of r)this.applySmartMergesForHeader(e,t,s,o,i),i+=this.calculateHeaderColSpan(o)}applySmartMergesForHeader(e,t,s,r,i){const o=this.calculateHeaderColSpan(r);if(r.children&&0!==r.children.length){o>1&&e.mergeCells(t,i,t,i+o-1);let l=i;for(const i of r.children)this.applySmartMergesForHeader(e,t+1,s,i,l),l+=this.calculateHeaderColSpan(i)}else e.mergeCells(t,i,s,i+o-1)}calculateHeaderColSpan(e){return e.children&&0!==e.children.length?e.children.reduce((e,t)=>e+this.calculateHeaderColSpan(t),0):1}getMaxHeaderDepth(e){let t=1;for(const s of e)if(s.children&&s.children.length>0){const e=this.getMaxHeaderDepth(s.children);t=Math.max(t,e+1)}return t}getMaxColumns(){let e=0;for(const t of this.subHeaders)e+=this.calculateHeaderColSpan(t);return e}validate(){return this.headers.length||this.body.length?{success:!0,data:!0}:{success:!1,error:{type:h.VALIDATION_ERROR,message:"La hoja no tiene datos"}}}calculateDataColumnPositions(){const e={};let t=1;for(const s of this.subHeaders)if(s.children&&s.children.length>0)for(const r of s.children)r.key&&(e[r.key]=t),r.value&&(e[String(r.value)]=t),t++;else s.key&&(e[s.key]=t),s.value&&(e[String(s.value)]=t),t++;return e}addFooterRow(e,t,s){const r=this.calculateDataColumnPositions();let i;s.key&&r[s.key]?i=r[s.key]:s.header&&r[s.header]&&(i=r[s.header]),void 0===i&&(i=1);const o=e.getRow(t),l=o.getCell(i);if(l.value=s.value,s.styles&&(l.style=this.convertStyle(s.styles)),s.numberFormat&&(l.numFmt=s.numberFormat),s.mergeCell&&s.mergeTo&&e.mergeCells(t,i,t,s.mergeTo),s.children&&s.children.length>0)for(const n of s.children)if(n){let e;if(n.key&&r[n.key]?e=r[n.key]:n.header&&r[n.header]&&(e=r[n.header]),void 0!==e){const t=o.getCell(e);t.value=n.value,n.styles&&(t.style=this.convertStyle(n.styles)),n.numberFormat&&(t.numFmt=n.numberFormat)}}return s.jump?t+1:t}addDataRowRecursive(e,t,s){const r=this.calculateDataColumnPositions();let i;s.key&&r[s.key]?i=r[s.key]:s.header&&r[s.header]&&(i=r[s.header]),void 0===i&&(i=1);const o=e.getRow(t),l=o.getCell(i);if(l.value=s.value,s.styles&&(l.style=this.convertStyle(s.styles)),s.numberFormat&&(l.numFmt=s.numberFormat),s.children&&s.children.length>0)for(const n of s.children)if(n){let e;if(n.key&&r[n.key]?e=r[n.key]:n.header&&r[n.header]&&(e=r[n.header]),void 0!==e){const t=o.getCell(e);t.value=n.value,n.styles&&(t.style=this.convertStyle(n.styles)),n.numberFormat&&(t.numFmt=n.numberFormat)}}return s.jump?t+1:t}convertStyle(e){if(!e)return{};const t={};return e.font&&(t.font={name:e.font.family,size:e.font.size,bold:e.font.bold,italic:e.font.italic,underline:e.font.underline,color:e.font.color}),e.fill&&(t.fill={type:e.fill.type,pattern:e.fill.pattern,fgColor:e.fill.foregroundColor,bgColor:e.fill.backgroundColor}),e.border&&(t.border={top:e.border.top,left:e.border.left,bottom:e.border.bottom,right:e.border.right}),e.alignment&&(t.alignment={horizontal:e.alignment.horizontal,vertical:e.alignment.vertical,wrapText:e.alignment.wrapText,indent:e.alignment.indent}),e.numFmt&&(t.numFmt=e.numFmt),t}}var c=(e=>(e.WORKSHEET_ADDED="worksheetAdded",e.WORKSHEET_REMOVED="worksheetRemoved",e.WORKSHEET_UPDATED="worksheetUpdated",e.BUILD_STARTED="buildStarted",e.BUILD_PROGRESS="buildProgress",e.BUILD_COMPLETED="buildCompleted",e.BUILD_ERROR="buildError",e.DOWNLOAD_STARTED="downloadStarted",e.DOWNLOAD_PROGRESS="downloadProgress",e.DOWNLOAD_COMPLETED="downloadCompleted",e.DOWNLOAD_ERROR="downloadError",e))(c||{});class u{config;worksheets=new Map;currentWorksheet;isBuilding=!1;stats;eventEmitter;constructor(e={}){this.config={enableValidation:!0,enableEvents:!0,enablePerformanceMonitoring:!1,maxWorksheets:255,maxRowsPerWorksheet:1048576,maxColumnsPerWorksheet:16384,memoryLimit:104857600,...e},this.stats=this.initializeStats(),this.eventEmitter=new s}addWorksheet(e,t={}){if(this.worksheets.has(e))throw new Error(`Worksheet "${e}" already exists`);const s={name:e,defaultRowHeight:20,defaultColWidth:10,...this.config.defaultWorksheetConfig,...t},r=new d(s);return this.worksheets.set(e,r),this.currentWorksheet=r,this.emitEvent(c.WORKSHEET_ADDED,{worksheetName:e}),r}getWorksheet(e){return this.worksheets.get(e)}removeWorksheet(e){const t=this.worksheets.get(e);return!!t&&(this.worksheets.delete(e),this.currentWorksheet===t&&(this.currentWorksheet=void 0),this.emitEvent(c.WORKSHEET_REMOVED,{worksheetName:e}),!0)}setCurrentWorksheet(e){const t=this.worksheets.get(e);return!!t&&(this.currentWorksheet=t,!0)}async build(t={}){if(this.isBuilding)return{success:!1,error:{type:h.BUILD_ERROR,message:"Build already in progress",stack:(new Error).stack||""}};this.isBuilding=!0;const s=Date.now();try{this.emitEvent(c.BUILD_STARTED);const r=new e.Workbook;this.config.metadata&&(r.creator=this.config.metadata.author||"Han Excel Builder",r.lastModifiedBy=this.config.metadata.author||"Han Excel Builder",r.created=this.config.metadata.created||new Date,r.modified=this.config.metadata.modified||new Date,this.config.metadata.title&&(r.title=this.config.metadata.title),this.config.metadata.subject&&(r.subject=this.config.metadata.subject),this.config.metadata.keywords&&(r.keywords=this.config.metadata.keywords),this.config.metadata.category&&(r.category=this.config.metadata.category),this.config.metadata.description&&(r.description=this.config.metadata.description));for(const e of this.worksheets.values())await e.build(r,t);const i=await r.xlsx.writeBuffer({compression:t.compressionLevel||6}),o=Date.now();this.stats.buildTime=o-s,this.stats.fileSize=i.byteLength;const l={success:!0,data:i};return this.emitEvent(c.BUILD_COMPLETED,{buildTime:this.stats.buildTime,fileSize:this.stats.fileSize}),l}catch(r){const e={success:!1,error:{type:h.BUILD_ERROR,message:r instanceof Error?r.message:"Unknown build error",stack:r instanceof Error&&r.stack||""}};return this.emitEvent(c.BUILD_ERROR,{error:e.error}),e}finally{this.isBuilding=!1}}async generateAndDownload(e,s={}){const r=await this.build(s);if(!r.success)return r;try{this.emitEvent(c.DOWNLOAD_STARTED,{fileName:e});const i=new Blob([r.data],{type:s.mimeType||"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"});return t(i,e),this.emitEvent(c.DOWNLOAD_COMPLETED,{fileName:e}),{success:!0,data:void 0}}catch(i){const e={success:!1,error:{type:h.BUILD_ERROR,message:i instanceof Error?i.message:"Download failed",stack:i instanceof Error&&i.stack||""}};return this.emitEvent(c.DOWNLOAD_ERROR,{error:e.error}),e}}async toBuffer(e={}){return this.build(e)}async toBlob(e={}){const t=await this.build(e);if(!t.success)return t;return{success:!0,data:new Blob([t.data],{type:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"})}}validate(){const e=[];0===this.worksheets.size&&e.push("No worksheets found");for(const[t,s]of this.worksheets.entries()){const r=s.validate();r.success||e.push(`Worksheet "${t}": ${r.error?.message}`)}return e.length>0?{success:!1,error:{type:h.VALIDATION_ERROR,message:e.join("; "),stack:(new Error).stack||""}}:{success:!0,data:!0}}clear(){this.worksheets.clear(),this.currentWorksheet=void 0}getStats(){return{...this.stats}}on(e,t){return this.eventEmitter.on(e,t)}off(e,t){return this.eventEmitter.off(e,t)}removeAllListeners(e){e?this.eventEmitter.offAll(e):this.eventEmitter.clear()}emitEvent(e,t){const s={type:e,data:t||{},timestamp:new Date};this.eventEmitter.emitSync(s)}initializeStats(){return{totalWorksheets:0,totalCells:0,memoryUsage:0,buildTime:0,fileSize:0,stylesUsed:0,formulasUsed:0,conditionalFormatsUsed:0,performance:{headersTime:0,dataTime:0,stylesTime:0,writeTime:0}}}}class y{style={};constructor(){this.style.alignment={horizontal:o.CENTER,vertical:l.MIDDLE,wrapText:!0,shrinkToFit:!0}}static create(){return new y}fontName(e){return this.style.font||(this.style.font={}),this.style.font.name=e,this}fontSize(e){return this.style.font||(this.style.font={}),this.style.font.size=e,this}fontStyle(e){return this.style.font||(this.style.font={}),this.style.font.style=e,this}fontColor(e){return this.style.font||(this.style.font={}),this.style.font.color=e,this}fontBold(){return this.style.font||(this.style.font={}),this.style.font.bold=!0,this}fontItalic(){return this.style.font||(this.style.font={}),this.style.font.italic=!0,this}fontUnderline(){return this.style.font||(this.style.font={}),this.style.font.underline=!0,this}border(e,t){this.style.border||(this.style.border={});const s={style:e};return void 0!==t&&(s.color=t),this.style.border.top=s,this.style.border.left=s,this.style.border.bottom=s,this.style.border.right=s,this}borderTop(e,t){this.style.border||(this.style.border={});const s={style:e};return void 0!==t&&(s.color=t),this.style.border.top=s,this}borderLeft(e,t){this.style.border||(this.style.border={});const s={style:e};return void 0!==t&&(s.color=t),this.style.border.left=s,this}borderBottom(e,t){this.style.border||(this.style.border={});const s={style:e};return void 0!==t&&(s.color=t),this.style.border.bottom=s,this}borderRight(e,t){this.style.border||(this.style.border={});const s={style:e};return void 0!==t&&(s.color=t),this.style.border.right=s,this}backgroundColor(e){return this.style.fill||(this.style.fill={type:"pattern"}),this.style.fill.backgroundColor=e,this.style.fill.pattern="solid",this}horizontalAlign(e){return this.style.alignment||(this.style.alignment={}),this.style.alignment.horizontal=e,this}verticalAlign(e){return this.style.alignment||(this.style.alignment={}),this.style.alignment.vertical=e,this}centerAlign(){return this.style.alignment||(this.style.alignment={}),this.style.alignment.horizontal=o.CENTER,this.style.alignment.vertical=l.MIDDLE,this}leftAlign(){return this.style.alignment||(this.style.alignment={}),this.style.alignment.horizontal=o.LEFT,this}rightAlign(){return this.style.alignment||(this.style.alignment={}),this.style.alignment.horizontal=o.RIGHT,this}wrapText(){return this.style.alignment||(this.style.alignment={}),this.style.alignment.wrapText=!0,this}numberFormat(e){return this.style.numberFormat=e,this}striped(){return this.style.striped=!0,this}conditionalFormat(e){return this.style.conditionalFormats||(this.style.conditionalFormats=[]),this.style.conditionalFormats.push(e),this}build(){return this.style}reset(){return this.style={},this.style.alignment={horizontal:o.CENTER,vertical:l.MIDDLE,wrapText:!0},this}clone(){const e=new y;return e.style=JSON.parse(JSON.stringify(this.style)),e}}var f=(e=>(e.CREATED="created",e.UPDATED="updated",e.DELETED="deleted",e.STYLED="styled",e.VALIDATED="validated",e))(f||{}),g=(e=>(e.CREATED="created",e.UPDATED="updated",e.DELETED="deleted",e.TABLE_ADDED="tableAdded",e.TABLE_REMOVED="tableRemoved",e.CELL_ADDED="cellAdded",e.CELL_UPDATED="cellUpdated",e.CELL_DELETED="cellDeleted",e))(g||{}),m=(e=>(e.HEADER="header",e.SUBHEADER="subheader",e.DATA="data",e.FOOTER="footer",e.TOTAL="total",e.HIGHLIGHT="highlight",e.WARNING="warning",e.ERROR="error",e.SUCCESS="success",e.INFO="info",e))(m||{});exports.BorderStyle=n,exports.BuilderEventType=c,exports.CellEventType=f,exports.CellType=r,exports.ErrorType=h,exports.EventEmitter=s,exports.ExcelBuilder=u,exports.FontStyle=a,exports.HorizontalAlignment=o,exports.NumberFormat=i,exports.StyleBuilder=y,exports.StylePreset=m,exports.VerticalAlignment=l,exports.Worksheet=d,exports.WorksheetEventType=g,exports.default=u;
2
2
  //# sourceMappingURL=han-excel.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"han-excel.cjs.js","sources":["../src/utils/EventEmitter.ts","../src/types/core.types.ts","../src/core/Worksheet.ts","../src/types/builder.types.ts","../src/core/ExcelBuilder.ts","../src/styles/StyleBuilder.ts","../src/types/cell.types.ts","../src/types/worksheet.types.ts","../src/types/style.types.ts"],"sourcesContent":["/**\r\n * Simple EventEmitter implementation\r\n */\r\n\r\n/**\r\n * Event listener function type\r\n */\r\nexport type EventListener<T = any> = (event: T) => void | Promise<void>;\r\n\r\n/**\r\n * Event listener options\r\n */\r\nexport interface EventListenerOptions {\r\n /** Whether to execute the listener only once */\r\n once?: boolean;\r\n /** Whether to execute the listener asynchronously */\r\n async?: boolean;\r\n /** Priority of the listener (higher = executed first) */\r\n priority?: number;\r\n /** Whether to stop event propagation */\r\n stopPropagation?: boolean;\r\n}\r\n\r\n/**\r\n * Event listener registration\r\n */\r\nexport interface EventListenerRegistration {\r\n /** Event type */\r\n type: string;\r\n /** Listener function */\r\n listener: EventListener;\r\n /** Listener options */\r\n options: EventListenerOptions;\r\n /** Registration ID */\r\n id: string;\r\n /** Whether the listener is active */\r\n active: boolean;\r\n /** Registration timestamp */\r\n timestamp: Date;\r\n}\r\n\r\n/**\r\n * EventEmitter class for handling events\r\n */\r\nexport class EventEmitter {\r\n private listeners: Map<string, EventListenerRegistration[]> = new Map();\r\n\r\n /**\r\n * Add an event listener\r\n */\r\n on<T = any>(type: string, listener: EventListener<T>, options: EventListenerOptions = {}): string {\r\n if (!this.listeners.has(type)) {\r\n this.listeners.set(type, []);\r\n }\r\n\r\n const registration: EventListenerRegistration = {\r\n type,\r\n listener: listener as EventListener,\r\n options: {\r\n once: false,\r\n async: false,\r\n priority: 0,\r\n stopPropagation: false,\r\n ...options\r\n },\r\n id: this.generateId(),\r\n active: true,\r\n timestamp: new Date()\r\n };\r\n\r\n this.listeners.get(type)!.push(registration);\r\n \r\n // Sort by priority (higher priority first)\r\n this.listeners.get(type)!.sort((a, b) => (b.options.priority || 0) - (a.options.priority || 0));\r\n\r\n return registration.id;\r\n }\r\n\r\n /**\r\n * Add a one-time event listener\r\n */\r\n once<T = any>(type: string, listener: EventListener<T>, options: EventListenerOptions = {}): string {\r\n return this.on(type, listener, { ...options, once: true });\r\n }\r\n\r\n /**\r\n * Remove an event listener\r\n */\r\n off(type: string, listenerId: string): boolean {\r\n const listeners = this.listeners.get(type);\r\n if (!listeners) {\r\n return false;\r\n }\r\n\r\n const index = listeners.findIndex(reg => reg.id === listenerId);\r\n if (index === -1) {\r\n return false;\r\n }\r\n\r\n listeners.splice(index, 1);\r\n return true;\r\n }\r\n\r\n /**\r\n * Remove all listeners for an event type\r\n */\r\n offAll(type: string): number {\r\n const listeners = this.listeners.get(type);\r\n if (!listeners) {\r\n return 0;\r\n }\r\n\r\n const count = listeners.length;\r\n this.listeners.delete(type);\r\n return count;\r\n }\r\n\r\n /**\r\n * Emit an event\r\n */\r\n async emit<T = any>(event: T): Promise<void> {\r\n const type = (event as any).type || 'default';\r\n const listeners = this.listeners.get(type);\r\n \r\n if (!listeners || listeners.length === 0) {\r\n return;\r\n }\r\n\r\n const activeListeners = listeners.filter(reg => reg.active);\r\n \r\n for (const registration of activeListeners) {\r\n try {\r\n if (registration.options.once) {\r\n registration.active = false;\r\n }\r\n\r\n if (registration.options.async) {\r\n await registration.listener(event);\r\n } else {\r\n registration.listener(event);\r\n }\r\n\r\n if (registration.options.stopPropagation) {\r\n break;\r\n }\r\n } catch (error) {\r\n console.error(`Error in event listener for ${type}:`, error);\r\n }\r\n }\r\n\r\n // Clean up inactive listeners\r\n this.cleanupInactiveListeners(type);\r\n }\r\n\r\n /**\r\n * Emit an event synchronously\r\n */\r\n emitSync<T = any>(event: T): void {\r\n const type = (event as any).type || 'default';\r\n const listeners = this.listeners.get(type);\r\n \r\n if (!listeners || listeners.length === 0) {\r\n return;\r\n }\r\n\r\n const activeListeners = listeners.filter(reg => reg.active);\r\n \r\n for (const registration of activeListeners) {\r\n try {\r\n if (registration.options.once) {\r\n registration.active = false;\r\n }\r\n\r\n registration.listener(event);\r\n\r\n if (registration.options.stopPropagation) {\r\n break;\r\n }\r\n } catch (error) {\r\n console.error(`Error in event listener for ${type}:`, error);\r\n }\r\n }\r\n\r\n // Clean up inactive listeners\r\n this.cleanupInactiveListeners(type);\r\n }\r\n\r\n /**\r\n * Clear all listeners\r\n */\r\n clear(): void {\r\n this.listeners.clear();\r\n }\r\n\r\n /**\r\n * Get listeners for an event type\r\n */\r\n getListeners(type: string): EventListenerRegistration[] {\r\n return this.listeners.get(type) || [];\r\n }\r\n\r\n /**\r\n * Get listener count for an event type\r\n */\r\n getListenerCount(type: string): number {\r\n return this.listeners.get(type)?.length || 0;\r\n }\r\n\r\n /**\r\n * Get all registered event types\r\n */\r\n getEventTypes(): string[] {\r\n return Array.from(this.listeners.keys());\r\n }\r\n\r\n // Private methods\r\n\r\n private generateId(): string {\r\n return Math.random().toString(36).substr(2, 9);\r\n }\r\n\r\n private cleanupInactiveListeners(type: string): void {\r\n const listeners = this.listeners.get(type);\r\n if (listeners) {\r\n const activeListeners = listeners.filter(reg => reg.active);\r\n if (activeListeners.length !== listeners.length) {\r\n this.listeners.set(type, activeListeners);\r\n }\r\n }\r\n }\r\n} ","/**\r\n * Core type definitions for Han Excel Builder\r\n */\r\n\r\nimport { CellValue } from 'exceljs';\r\n\r\n/**\r\n * Supported cell data types\r\n */\r\nexport enum CellType {\r\n STRING = 'string',\r\n NUMBER = 'number',\r\n BOOLEAN = 'boolean',\r\n DATE = 'date',\r\n PERCENTAGE = 'percentage',\r\n CURRENCY = 'currency',\r\n LINK = 'link',\r\n FORMULA = 'formula'\r\n}\r\n\r\n/**\r\n * Number format options\r\n */\r\nexport enum NumberFormat {\r\n GENERAL = 'General',\r\n NUMBER = '#,##0',\r\n NUMBER_DECIMALS = '#,##0.00',\r\n CURRENCY = '$#,##0.00',\r\n CURRENCY_INTEGER = '$#,##0',\r\n PERCENTAGE = '0%',\r\n PERCENTAGE_DECIMALS = '0.00%',\r\n DATE = 'dd/mm/yyyy',\r\n DATE_TIME = 'dd/mm/yyyy hh:mm',\r\n TIME = 'hh:mm:ss',\r\n CUSTOM = 'custom'\r\n}\r\n\r\n/**\r\n * Horizontal alignment options\r\n */\r\nexport enum HorizontalAlignment {\r\n LEFT = 'left',\r\n CENTER = 'center',\r\n RIGHT = 'right',\r\n FILL = 'fill',\r\n JUSTIFY = 'justify',\r\n CENTER_CONTINUOUS = 'centerContinuous',\r\n DISTRIBUTED = 'distributed'\r\n}\r\n\r\n/**\r\n * Vertical alignment options\r\n */\r\nexport enum VerticalAlignment {\r\n TOP = 'top',\r\n MIDDLE = 'middle',\r\n BOTTOM = 'bottom',\r\n DISTRIBUTED = 'distributed',\r\n JUSTIFY = 'justify'\r\n}\r\n\r\n/**\r\n * Border style options\r\n */\r\nexport enum BorderStyle {\r\n THIN = 'thin',\r\n MEDIUM = 'medium',\r\n THICK = 'thick',\r\n DOTTED = 'dotted',\r\n DASHED = 'dashed',\r\n DOUBLE = 'double',\r\n HAIR = 'hair',\r\n MEDIUM_DASHED = 'mediumDashed',\r\n DASH_DOT = 'dashDot',\r\n MEDIUM_DASH_DOT = 'mediumDashDot',\r\n DASH_DOT_DOT = 'dashDotDot',\r\n MEDIUM_DASH_DOT_DOT = 'mediumDashDotDot',\r\n SLANT_DASH_DOT = 'slantDashDot'\r\n}\r\n\r\n/**\r\n * Font style options\r\n */\r\nexport enum FontStyle {\r\n NORMAL = 'normal',\r\n BOLD = 'bold',\r\n ITALIC = 'italic',\r\n BOLD_ITALIC = 'bold italic'\r\n}\r\n\r\n/**\r\n * Color type - can be hex string, RGB object, or theme color\r\n */\r\nexport type Color = string | { r: number; g: number; b: number } | { theme: number };\r\n\r\n/**\r\n * Base cell properties interface\r\n */\r\nexport interface IBaseCell {\r\n /** Unique identifier for the cell */\r\n key: string;\r\n /** Cell data type */\r\n type: CellType;\r\n /** Cell value */\r\n value: CellValue;\r\n /** Optional cell reference (e.g., A1, B2) */\r\n reference?: string;\r\n /** Whether to merge this cell with others */\r\n mergeCell?: boolean;\r\n /** Number of columns to merge (if mergeCell is true) */\r\n mergeTo?: number;\r\n /** Row height for this cell */\r\n rowHeight?: number;\r\n /** Column width for this cell */\r\n colWidth?: number;\r\n /** Whether to move to next row after this cell */\r\n jump?: boolean;\r\n /** Hyperlink URL */\r\n link?: string;\r\n /** Excel formula */\r\n formula?: string;\r\n /** Number format for numeric cells */\r\n numberFormat?: NumberFormat | string;\r\n /** Custom number format string */\r\n customNumberFormat?: string;\r\n /** Whether the cell is protected */\r\n protected?: boolean;\r\n /** Whether the cell is hidden */\r\n hidden?: boolean;\r\n /** Cell comment */\r\n comment?: string;\r\n /** Data validation rules */\r\n validation?: IDataValidation;\r\n /** Optional styles for the cell */\r\n styles?: import('./style.types').IStyle;\r\n /** Legacy children cells */\r\n childrens?: IBaseCell[];\r\n /** Modern children cells */\r\n children?: IBaseCell[];\r\n}\r\n\r\n/**\r\n * Data validation interface\r\n */\r\nexport interface IDataValidation {\r\n /** Validation type */\r\n type: 'list' | 'whole' | 'decimal' | 'textLength' | 'date' | 'time' | 'custom';\r\n /** Validation operator */\r\n operator?: 'between' | 'notBetween' | 'equal' | 'notEqual' | 'greaterThan' | 'lessThan' | 'greaterThanOrEqual' | 'lessThanOrEqual';\r\n /** Validation formula or values */\r\n formula1?: string | number | Date;\r\n /** Second validation formula or value (for between/notBetween) */\r\n formula2?: string | number | Date;\r\n /** Whether to show error message */\r\n showErrorMessage?: boolean;\r\n /** Error message text */\r\n errorMessage?: string;\r\n /** Whether to show input message */\r\n showInputMessage?: boolean;\r\n /** Input message text */\r\n inputMessage?: string;\r\n /** Whether to allow blank values */\r\n allowBlank?: boolean;\r\n}\r\n\r\n/**\r\n * Workbook metadata interface\r\n */\r\nexport interface IWorkbookMetadata {\r\n /** Workbook author */\r\n author?: string;\r\n /** Workbook title */\r\n title?: string;\r\n /** Workbook subject */\r\n subject?: string;\r\n /** Workbook keywords */\r\n keywords?: string;\r\n /** Workbook category */\r\n category?: string;\r\n /** Workbook description */\r\n description?: string;\r\n /** Workbook company */\r\n company?: string;\r\n /** Workbook manager */\r\n manager?: string;\r\n /** Creation date */\r\n created?: Date;\r\n /** Last modified date */\r\n modified?: Date;\r\n /** Application name */\r\n application?: string;\r\n /** Application version */\r\n appVersion?: string;\r\n /** Hyperlink base */\r\n hyperlinkBase?: string;\r\n}\r\n\r\n/**\r\n * Error types for validation\r\n */\r\nexport enum ErrorType {\r\n VALIDATION_ERROR = 'VALIDATION_ERROR',\r\n BUILD_ERROR = 'BUILD_ERROR',\r\n STYLE_ERROR = 'STYLE_ERROR',\r\n WORKSHEET_ERROR = 'WORKSHEET_ERROR',\r\n CELL_ERROR = 'CELL_ERROR'\r\n}\r\n\r\n/**\r\n * Error interface\r\n */\r\nexport interface IError {\r\n type: ErrorType;\r\n message: string;\r\n code?: string;\r\n details?: Record<string, unknown>;\r\n stack?: string;\r\n}\r\n\r\n/**\r\n * Success result interface\r\n */\r\nexport interface ISuccessResult<T = unknown> {\r\n success: true;\r\n data: T;\r\n message?: string;\r\n}\r\n\r\n/**\r\n * Error result interface\r\n */\r\nexport interface IErrorResult {\r\n success: false;\r\n error: IError;\r\n}\r\n\r\n/**\r\n * Result union type\r\n */\r\nexport type Result<T = unknown> = ISuccessResult<T> | IErrorResult; ","import ExcelJS from 'exceljs';\r\nimport {\r\n IWorksheet,\r\n IWorksheetConfig,\r\n ITable\r\n} from '../types/worksheet.types';\r\nimport {\r\n IDataCell,\r\n IHeaderCell,\r\n IFooterCell\r\n} from '../types/cell.types';\r\nimport { IBuildOptions } from '../types/builder.types';\r\nimport { Result, ErrorType } from '../types/core.types';\r\n\r\n/**\r\n * Worksheet - Representa una hoja de cálculo dentro del builder\r\n *\r\n2 * Soporta headers, subheaders anidados, rows, footers, children y estilos por celda.\r\n */\r\nexport class Worksheet implements IWorksheet {\r\n public config: IWorksheetConfig;\r\n public tables: ITable[] = [];\r\n public currentRow = 1;\r\n public currentCol = 1;\r\n public headerPointers: Map<string, any> = new Map();\r\n public isBuilt = false;\r\n\r\n // Estructuras temporales para la tabla actual\r\n private headers: IHeaderCell[] = [];\r\n private subHeaders: IHeaderCell[] = [];\r\n private body: IDataCell[] = [];\r\n private footers: IFooterCell[] = [];\r\n\r\n constructor(config: IWorksheetConfig) {\r\n this.config = config;\r\n }\r\n\r\n /**\r\n * Agrega un header principal\r\n */\r\n addHeader(header: IHeaderCell): this {\r\n this.headers.push(header);\r\n return this;\r\n }\r\n\r\n /**\r\n * Agrega subheaders (ahora soporta anidación)\r\n */\r\n addSubHeaders(subHeaders: IHeaderCell[]): this {\r\n this.subHeaders.push(...subHeaders);\r\n return this;\r\n }\r\n\r\n /**\r\n * Agrega una fila de datos (puede ser jerárquica con childrens)\r\n */\r\n addRow(row: IDataCell[] | IDataCell): this {\r\n if (Array.isArray(row)) {\r\n this.body.push(...row);\r\n } else {\r\n this.body.push(row);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Agrega un footer o varios\r\n */\r\n addFooter(footer: IFooterCell[] | IFooterCell): this {\r\n if (Array.isArray(footer)) {\r\n this.footers.push(...footer);\r\n } else {\r\n this.footers.push(footer);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Crea una nueva tabla y la agrega al worksheet\r\n */\r\n addTable(tableConfig: Partial<ITable> = {}): this {\r\n const table: ITable = {\r\n name: tableConfig.name || `Table_${this.tables.length + 1}`,\r\n headers: tableConfig.headers || [],\r\n subHeaders: tableConfig.subHeaders || [],\r\n body: tableConfig.body || [],\r\n footers: tableConfig.footers || [],\r\n showBorders: tableConfig.showBorders !== false,\r\n showStripes: tableConfig.showStripes !== false,\r\n style: tableConfig.style || 'TableStyleLight1',\r\n ...tableConfig\r\n };\r\n \r\n this.tables.push(table);\r\n return this;\r\n }\r\n\r\n /**\r\n * Finaliza la tabla actual agregando todos los elementos temporales a la última tabla\r\n */\r\n finalizeTable(): this {\r\n if (this.tables.length === 0) {\r\n // Si no hay tablas, crear una nueva con los datos temporales\r\n this.addTable();\r\n }\r\n \r\n const currentTable = this.tables[this.tables.length - 1];\r\n if (!currentTable) {\r\n throw new Error('No se pudo obtener la tabla actual');\r\n }\r\n \r\n // Agregar headers, subheaders, body y footers a la tabla actual\r\n if (this.headers.length > 0) {\r\n currentTable.headers = [...(currentTable.headers || []), ...this.headers];\r\n }\r\n \r\n if (this.subHeaders.length > 0) {\r\n currentTable.subHeaders = [...(currentTable.subHeaders || []), ...this.subHeaders];\r\n }\r\n \r\n if (this.body.length > 0) {\r\n currentTable.body = [...(currentTable.body || []), ...this.body];\r\n }\r\n \r\n if (this.footers.length > 0) {\r\n currentTable.footers = [...(currentTable.footers || []), ...this.footers];\r\n }\r\n \r\n // Limpiar las estructuras temporales\r\n this.headers = [];\r\n this.subHeaders = [];\r\n this.body = [];\r\n this.footers = [];\r\n \r\n return this;\r\n }\r\n\r\n /**\r\n * Obtiene una tabla por nombre\r\n */\r\n getTable(name: string): ITable | undefined {\r\n return this.tables.find(table => table.name === name);\r\n }\r\n\r\n /**\r\n * Construye la hoja en el workbook de ExcelJS\r\n */\r\n async build(workbook: ExcelJS.Workbook, _options: IBuildOptions = {}): Promise<void> {\r\n const ws = workbook.addWorksheet(this.config.name, {\r\n properties: {\r\n defaultRowHeight: this.config.defaultRowHeight || 20,\r\n tabColor: this.config.tabColor as any\r\n },\r\n pageSetup: this.config.pageSetup as any\r\n });\r\n\r\n let rowPointer = 1;\r\n \r\n // Si hay tablas definidas, construir cada tabla\r\n if (this.tables.length > 0) {\r\n for (let i = 0; i < this.tables.length; i++) {\r\n const table = this.tables[i];\r\n if (table) {\r\n rowPointer = await this.buildTable(ws, table, rowPointer, i > 0);\r\n }\r\n }\r\n } else {\r\n // Construcción tradicional para compatibilidad hacia atrás\r\n rowPointer = await this.buildLegacyContent(ws, rowPointer);\r\n }\r\n \r\n this.isBuilt = true;\r\n }\r\n\r\n /**\r\n * Construye una tabla individual en el worksheet\r\n */\r\n private async buildTable(ws: ExcelJS.Worksheet, table: ITable, startRow: number, addSpacing: boolean = false): Promise<number> {\r\n let rowPointer = startRow;\r\n \r\n // Agregar espacio entre tablas si no es la primera\r\n if (addSpacing) {\r\n rowPointer += 2; // 2 filas de espacio\r\n }\r\n \r\n // Headers principales de la tabla\r\n if (table.headers && table.headers.length > 0) {\r\n for (const header of table.headers) {\r\n ws.addRow([header.value]);\r\n if (header.mergeCell) {\r\n const maxCols = this.calculateTableMaxColumns(table);\r\n ws.mergeCells(rowPointer, 1, rowPointer, maxCols);\r\n }\r\n if (header.styles) {\r\n ws.getRow(rowPointer).eachCell((cell: any) => {\r\n cell.style = this.convertStyle(header.styles);\r\n });\r\n }\r\n rowPointer++;\r\n }\r\n }\r\n \r\n // SubHeaders con soporte para anidación\r\n if (table.subHeaders && table.subHeaders.length > 0) {\r\n rowPointer = this.buildNestedHeaders(ws, rowPointer, table.subHeaders);\r\n }\r\n \r\n // Body (soporta children)\r\n if (table.body && table.body.length > 0) {\r\n for (const row of table.body) {\r\n rowPointer = this.addDataRowRecursive(ws, rowPointer, row);\r\n }\r\n }\r\n \r\n // Footers\r\n if (table.footers && table.footers.length > 0) {\r\n for (const footer of table.footers) {\r\n rowPointer = this.addFooterRow(ws, rowPointer, footer);\r\n }\r\n }\r\n \r\n // Aplicar estilo de tabla si está configurado\r\n if (table.showBorders || table.showStripes) {\r\n this.applyTableStyle(ws, table, startRow, rowPointer - 1);\r\n }\r\n \r\n return rowPointer;\r\n }\r\n\r\n /**\r\n * Construcción tradicional para compatibilidad hacia atrás\r\n */\r\n private async buildLegacyContent(ws: ExcelJS.Worksheet, startRow: number): Promise<number> {\r\n let rowPointer = startRow;\r\n \r\n // Headers principales\r\n if (this.headers.length > 0) {\r\n this.headers.forEach(header => {\r\n ws.addRow([header.value]);\r\n if (header.mergeCell) {\r\n ws.mergeCells(rowPointer, 1, rowPointer, (this.getMaxColumns() || 1));\r\n }\r\n if (header.styles) {\r\n ws.getRow(rowPointer).eachCell((cell: any) => {\r\n cell.style = this.convertStyle(header.styles);\r\n });\r\n }\r\n rowPointer++;\r\n });\r\n }\r\n \r\n // SubHeaders con soporte para anidación\r\n if (this.subHeaders.length > 0) {\r\n rowPointer = this.buildNestedHeaders(ws, rowPointer, this.subHeaders);\r\n }\r\n \r\n // Body (soporta children)\r\n for (const row of this.body) {\r\n rowPointer = this.addDataRowRecursive(ws, rowPointer, row);\r\n }\r\n \r\n // Footers\r\n if (this.footers.length > 0) {\r\n for (const footer of this.footers) {\r\n rowPointer = this.addFooterRow(ws, rowPointer, footer);\r\n }\r\n }\r\n \r\n return rowPointer;\r\n }\r\n\r\n /**\r\n * Calcula el número máximo de columnas para una tabla\r\n */\r\n private calculateTableMaxColumns(table: ITable): number {\r\n let maxCols = 0;\r\n \r\n if (table.subHeaders && table.subHeaders.length > 0) {\r\n for (const header of table.subHeaders) {\r\n maxCols += this.calculateHeaderColSpan(header);\r\n }\r\n }\r\n \r\n return maxCols || 1;\r\n }\r\n\r\n /**\r\n * Aplica el estilo de tabla a un rango específico\r\n */\r\n private applyTableStyle(ws: ExcelJS.Worksheet, table: ITable, startRow: number, endRow: number): void {\r\n const maxCols = this.calculateTableMaxColumns(table);\r\n \r\n // Aplicar bordes si está configurado\r\n if (table.showBorders) {\r\n for (let row = startRow; row <= endRow; row++) {\r\n for (let col = 1; col <= maxCols; col++) {\r\n const cell = ws.getRow(row).getCell(col);\r\n if (!cell.style) cell.style = {};\r\n if (!cell.style.border) {\r\n cell.style.border = {\r\n top: { style: 'thin', color: { argb: 'FF8EAADB' } },\r\n left: { style: 'thin', color: { argb: 'FF8EAADB' } },\r\n bottom: { style: 'thin', color: { argb: 'FF8EAADB' } },\r\n right: { style: 'thin', color: { argb: 'FF8EAADB' } }\r\n };\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Aplicar rayas alternadas si está configurado\r\n if (table.showStripes) {\r\n for (let row = startRow; row <= endRow; row++) {\r\n if ((row - startRow) % 2 === 1) { // Filas impares (empezando desde 0)\r\n for (let col = 1; col <= maxCols; col++) {\r\n const cell = ws.getRow(row).getCell(col);\r\n if (!cell.style) cell.style = {};\r\n if (!cell.style.fill) {\r\n cell.style.fill = {\r\n type: 'pattern',\r\n pattern: 'solid',\r\n fgColor: { argb: 'FFF2F2F2' }\r\n };\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Construye headers anidados recursivamente\r\n * @param ws - Worksheet de ExcelJS\r\n * @param startRow - Fila inicial\r\n * @param headers - Array de headers a procesar\r\n * @returns La siguiente fila disponible\r\n */\r\n private buildNestedHeaders(ws: ExcelJS.Worksheet, startRow: number, headers: IHeaderCell[]): number {\r\n let currentRow = startRow;\r\n const maxDepth = this.getMaxHeaderDepth(headers);\r\n \r\n // Crear filas para cada nivel de profundidad\r\n for (let depth = 0; depth < maxDepth; depth++) {\r\n // Crear la fila primero\r\n const row = ws.getRow(currentRow);\r\n \r\n // Procesar cada header en este nivel\r\n let colIndex = 1;\r\n for (const header of headers) {\r\n if (depth === 0) {\r\n // Nivel principal del header\r\n const headerInfo = this.getHeaderAtDepth(header, depth, colIndex);\r\n const cell = row.getCell(colIndex);\r\n cell.value = headerInfo.value;\r\n if (headerInfo.style) {\r\n cell.style = this.convertStyle(headerInfo.style);\r\n }\r\n colIndex += headerInfo.colSpan;\r\n } else {\r\n // Nivel de children - procesar todos los children directos\r\n if (header.children && header.children.length > 0) {\r\n for (const child of header.children) {\r\n const cell = row.getCell(colIndex);\r\n cell.value = typeof child.value === 'string' ? child.value : String(child.value || '');\r\n if (child.styles || header.styles) {\r\n cell.style = this.convertStyle(child.styles || header.styles);\r\n }\r\n colIndex += this.calculateHeaderColSpan(child);\r\n }\r\n } else {\r\n // Si no tiene children, agregar celda vacía\r\n const cell = row.getCell(colIndex);\r\n cell.value = null;\r\n colIndex += 1;\r\n }\r\n }\r\n }\r\n \r\n currentRow++;\r\n }\r\n \r\n // Aplicar todos los merges después de crear todas las filas\r\n this.applyAllMerges(ws, startRow, currentRow - 1, headers);\r\n \r\n return currentRow;\r\n }\r\n\r\n /**\r\n * Obtiene información del header en una profundidad específica\r\n */\r\n private getHeaderAtDepth(header: IHeaderCell, depth: number, startCol: number): {\r\n value: string | null;\r\n style: any;\r\n colSpan: number;\r\n mergeRange?: { start: number; end: number } | null;\r\n } {\r\n const colSpan = this.calculateHeaderColSpan(header);\r\n if (depth === 0) {\r\n // Nivel principal del header\r\n console.log(' paso dios mio header', header.value);\r\n const mergeRange = colSpan > 1 ? { start: startCol, end: startCol + colSpan - 1 } : null;\r\n return {\r\n value: typeof header.value === 'string' ? header.value : String(header.value || ''),\r\n style: header.styles,\r\n colSpan,\r\n mergeRange: mergeRange\r\n };\r\n } else if (header.children && header.children.length > 0) {\r\n // Nivel de children\r\n const child = header.children[depth];\r\n if (child) {\r\n const childColSpan = this.calculateHeaderColSpan(child);\r\n // Los children también pueden hacer merge si tienen múltiples childrens\r\n const mergeRange = childColSpan > 1 ? { start: startCol, end: startCol + childColSpan - 1 } : null;\r\n \r\n return {\r\n value: typeof child.value === 'string' ? child.value : String(child.value || ''),\r\n style: child.styles || header.styles,\r\n colSpan: childColSpan,\r\n mergeRange: mergeRange\r\n };\r\n }\r\n }\r\n \r\n // Celda vacía para mantener alineación\r\n return {\r\n value: null,\r\n style: null,\r\n colSpan: 1\r\n };\r\n }\r\n\r\n\r\n\r\n\r\n /**\r\n * Aplica todos los merges (horizontales y verticales) después de crear todas las filas\r\n */\r\n private applyAllMerges(ws: ExcelJS.Worksheet, startRow: number, endRow: number, headers: IHeaderCell[]): void {\r\n const maxDepth = this.getMaxHeaderDepth(headers);\r\n \r\n // Solo aplicar merges si hay más de una fila de headers\r\n if (maxDepth <= 1) return;\r\n \r\n // Aplicar merges inteligentes basados en la estructura\r\n this.applySmartMerges(ws, startRow, endRow, headers);\r\n }\r\n\r\n /**\r\n * Aplica merges inteligentes basados en la estructura de headers\r\n */\r\n private applySmartMerges(ws: ExcelJS.Worksheet, startRow: number, endRow: number, headers: IHeaderCell[]): void {\r\n const maxDepth = this.getMaxHeaderDepth(headers);\r\n \r\n // Solo aplicar merges si hay más de una fila de headers\r\n if (maxDepth <= 1) return;\r\n \r\n // Aplicar merges para cada header\r\n let colIndex = 1;\r\n for (const header of headers) {\r\n this.applySmartMergesForHeader(ws, startRow, endRow, header, colIndex);\r\n colIndex += this.calculateHeaderColSpan(header);\r\n }\r\n }\r\n\r\n /**\r\n * Aplica merges inteligentes para un header específico\r\n */\r\n private applySmartMergesForHeader(ws: ExcelJS.Worksheet, startRow: number, endRow: number, header: IHeaderCell, startCol: number): void {\r\n const headerColSpan = this.calculateHeaderColSpan(header);\r\n \r\n if (!header.children || header.children.length === 0) {\r\n // Si no tiene children, hacer merge vertical desde la primera fila hasta la última\r\n ws.mergeCells(startRow, startCol, endRow, startCol + headerColSpan - 1);\r\n } else {\r\n // Si tiene children, aplicar merge horizontal en la primera fila\r\n if (headerColSpan > 1) {\r\n ws.mergeCells(startRow, startCol, startRow, startCol + headerColSpan - 1);\r\n }\r\n \r\n // Procesar children recursivamente\r\n let childColIndex = startCol;\r\n for (const child of header.children) {\r\n this.applySmartMergesForHeader(ws, startRow + 1, endRow, child, childColIndex);\r\n childColIndex += this.calculateHeaderColSpan(child);\r\n }\r\n }\r\n }\r\n\r\n\r\n \r\n /**\r\n * Calcula el span de columnas para un header\r\n */\r\n private calculateHeaderColSpan(header: IHeaderCell): number {\r\n if (!header.children || header.children.length === 0) {\r\n return 1;\r\n }\r\n \r\n return header.children.reduce((total, child) => {\r\n return total + this.calculateHeaderColSpan(child);\r\n }, 0);\r\n }\r\n\r\n /**\r\n * Obtiene la profundidad máxima de headers anidados\r\n */\r\n private getMaxHeaderDepth(headers: IHeaderCell[]): number {\r\n let maxDepth = 1;\r\n \r\n for (const header of headers) {\r\n if (header.children && header.children.length > 0) {\r\n const childDepth = this.getMaxHeaderDepth(header.children);\r\n maxDepth = Math.max(maxDepth, childDepth + 1);\r\n }\r\n }\r\n \r\n return maxDepth;\r\n }\r\n\r\n /**\r\n * Obtiene el número máximo de columnas\r\n */\r\n private getMaxColumns(): number {\r\n let maxCols = 0;\r\n \r\n for (const header of this.subHeaders) {\r\n maxCols += this.calculateHeaderColSpan(header);\r\n }\r\n \r\n return maxCols;\r\n }\r\n\r\n /**\r\n * Valida la hoja\r\n */\r\n validate(): Result<boolean> {\r\n if (!this.headers.length && !this.body.length) {\r\n return {\r\n success: false,\r\n error: {\r\n type: ErrorType.VALIDATION_ERROR,\r\n message: 'La hoja no tiene datos',\r\n }\r\n };\r\n }\r\n return { success: true, data: true };\r\n }\r\n\r\n /**\r\n * Calcula las posiciones de columnas para los datos basándose en la estructura de subheaders\r\n */\r\n private calculateDataColumnPositions(): { [key: string]: number } {\r\n const positions: { [key: string]: number } = {};\r\n let currentCol = 1;\r\n \r\n for (const header of this.subHeaders) {\r\n if (header.children && header.children.length > 0) {\r\n // Si el header tiene children, cada child ocupa una columna\r\n for (const child of header.children) {\r\n if (child.key) {\r\n positions[child.key] = currentCol;\r\n }\r\n if (child.value) {\r\n positions[String(child.value)] = currentCol;\r\n }\r\n currentCol++;\r\n }\r\n } else {\r\n // Si el header no tiene children, ocupa una columna\r\n if (header.key) {\r\n positions[header.key] = currentCol;\r\n }\r\n if (header.value) {\r\n positions[String(header.value)] = currentCol;\r\n }\r\n currentCol++;\r\n }\r\n }\r\n \r\n return positions;\r\n }\r\n\r\n /**\r\n * Agrega una fila de footer\r\n * @returns el siguiente rowPointer disponible\r\n */\r\n private addFooterRow(ws: ExcelJS.Worksheet, rowPointer: number, footer: IFooterCell): number {\r\n // Calcular las columnas basándose en la estructura de subheaders\r\n const columnPositions = this.calculateDataColumnPositions();\r\n \r\n // Buscar la columna correcta para el footer\r\n let footerColPosition: number | undefined;\r\n \r\n // Intentar encontrar por key primero\r\n if (footer.key && columnPositions[footer.key]) {\r\n footerColPosition = columnPositions[footer.key];\r\n }\r\n // Si no se encuentra por key, intentar por header\r\n else if (footer.header && columnPositions[footer.header]) {\r\n footerColPosition = columnPositions[footer.header];\r\n }\r\n \r\n // Si no se encuentra la posición, usar columna 1 por defecto\r\n if (footerColPosition === undefined) {\r\n footerColPosition = 1;\r\n }\r\n \r\n // Escribir el footer en la columna correcta\r\n const excelRow = ws.getRow(rowPointer);\r\n const footerCell = excelRow.getCell(footerColPosition);\r\n footerCell.value = footer.value;\r\n if (footer.styles) {\r\n footerCell.style = this.convertStyle(footer.styles);\r\n }\r\n if (footer.numberFormat) {\r\n footerCell.numFmt = footer.numberFormat;\r\n }\r\n \r\n // Aplicar merge si está configurado\r\n if (footer.mergeCell && footer.mergeTo) {\r\n ws.mergeCells(rowPointer, footerColPosition, rowPointer, footer.mergeTo);\r\n }\r\n \r\n // Si hay children, escribirlos en las columnas correspondientes\r\n if (footer.children && footer.children.length > 0) {\r\n for (const child of footer.children) {\r\n if (child) {\r\n // Buscar la columna correcta basándose en el header del child\r\n let colPosition: number | undefined;\r\n \r\n // Intentar encontrar por key primero\r\n if (child.key && columnPositions[child.key]) {\r\n colPosition = columnPositions[child.key];\r\n }\r\n // Si no se encuentra por key, intentar por header\r\n else if (child.header && columnPositions[child.header]) {\r\n colPosition = columnPositions[child.header];\r\n }\r\n \r\n if (colPosition !== undefined) {\r\n const childCell = excelRow.getCell(colPosition);\r\n childCell.value = child.value;\r\n if (child.styles) {\r\n childCell.style = this.convertStyle(child.styles);\r\n }\r\n if (child.numberFormat) {\r\n childCell.numFmt = child.numberFormat;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Incrementar rowPointer solo si el footer tiene la propiedad jump\r\n if (footer.jump) {\r\n return rowPointer + 1;\r\n }\r\n \r\n return rowPointer;\r\n }\r\n\r\n /**\r\n * Agrega una fila de datos y sus children recursivamente\r\n * @returns el siguiente rowPointer disponible\r\n */\r\n private addDataRowRecursive(ws: ExcelJS.Worksheet, rowPointer: number, row: IDataCell): number {\r\n // Calcular las columnas basándose en la estructura de subheaders\r\n const columnPositions = this.calculateDataColumnPositions();\r\n console.log('columnPositions', columnPositions);\r\n\r\n // Buscar la columna correcta para el dato principal\r\n let mainColPosition: number | undefined;\r\n \r\n // Intentar encontrar por key primero\r\n if (row.key && columnPositions[row.key]) {\r\n mainColPosition = columnPositions[row.key];\r\n }\r\n // Si no se encuentra por key, intentar por header\r\n else if (row.header && columnPositions[row.header]) {\r\n mainColPosition = columnPositions[row.header];\r\n }\r\n \r\n // Si no se encuentra la posición, usar columna 1 por defecto\r\n if (mainColPosition === undefined) {\r\n mainColPosition = 1;\r\n }\r\n \r\n // Escribir el dato principal en la columna correcta\r\n const excelRow = ws.getRow(rowPointer);\r\n const mainCell = excelRow.getCell(mainColPosition);\r\n mainCell.value = row.value;\r\n if (row.styles) {\r\n mainCell.style = this.convertStyle(row.styles);\r\n }\r\n if (row.numberFormat) {\r\n mainCell.numFmt = row.numberFormat;\r\n }\r\n \r\n // Si hay children, escribirlos en las columnas correspondientes\r\n if (row.children && row.children.length > 0) {\r\n for (const child of row.children) {\r\n if (child) {\r\n // Buscar la columna correcta basándose en el header del child\r\n let colPosition: number | undefined;\r\n \r\n // Intentar encontrar por key primero\r\n if (child.key && columnPositions[child.key]) {\r\n colPosition = columnPositions[child.key];\r\n }\r\n // Si no se encuentra por key, intentar por header\r\n else if (child.header && columnPositions[child.header]) {\r\n colPosition = columnPositions[child.header];\r\n }\r\n \r\n if (colPosition !== undefined) {\r\n const childCell = excelRow.getCell(colPosition);\r\n childCell.value = child.value;\r\n if (child.styles) {\r\n childCell.style = this.convertStyle(child.styles);\r\n }\r\n if (child.numberFormat) {\r\n childCell.numFmt = child.numberFormat;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Incrementar rowPointer solo si la celda tiene la propiedad jump\r\n if (row.jump) {\r\n return rowPointer + 1;\r\n }\r\n \r\n return rowPointer;\r\n }\r\n\r\n /**\r\n * Convierte el estilo personalizado a formato compatible con ExcelJS\r\n */\r\n private convertStyle(style: any): Partial<ExcelJS.Style> {\r\n if (!style) return {};\r\n \r\n const converted: Partial<ExcelJS.Style> = {};\r\n \r\n if (style.font) {\r\n converted.font = {\r\n name: style.font.family,\r\n size: style.font.size,\r\n bold: style.font.bold,\r\n italic: style.font.italic,\r\n underline: style.font.underline,\r\n color: style.font.color\r\n };\r\n }\r\n \r\n if (style.fill) {\r\n converted.fill = {\r\n type: style.fill.type,\r\n pattern: style.fill.pattern,\r\n fgColor: style.fill.foregroundColor,\r\n bgColor: style.fill.backgroundColor\r\n };\r\n }\r\n \r\n if (style.border) {\r\n converted.border = {\r\n top: style.border.top,\r\n left: style.border.left,\r\n bottom: style.border.bottom,\r\n right: style.border.right\r\n };\r\n }\r\n \r\n if (style.alignment) {\r\n converted.alignment = {\r\n horizontal: style.alignment.horizontal,\r\n vertical: style.alignment.vertical,\r\n wrapText: style.alignment.wrapText,\r\n indent: style.alignment.indent\r\n };\r\n }\r\n \r\n if (style.numFmt) {\r\n converted.numFmt = style.numFmt;\r\n }\r\n \r\n return converted;\r\n }\r\n}","/**\r\n * Builder-specific type definitions\r\n */\r\n\r\nimport { IWorkbookMetadata, Result } from './core.types';\r\nimport { IWorksheet, IWorksheetConfig } from './worksheet.types';\r\nimport { IStyle } from './style.types';\r\n\r\n// Re-export ErrorType for convenience\r\nexport { ErrorType } from './core.types';\r\n\r\n/**\r\n * Excel builder configuration interface\r\n */\r\nexport interface IExcelBuilderConfig {\r\n /** Workbook metadata */\r\n metadata?: IWorkbookMetadata;\r\n /** Default worksheet configuration */\r\n defaultWorksheetConfig?: Partial<IWorksheetConfig>;\r\n /** Default styles */\r\n defaultStyles?: {\r\n header?: IStyle;\r\n subheader?: IStyle;\r\n data?: IStyle;\r\n footer?: IStyle;\r\n total?: IStyle;\r\n };\r\n /** Whether to enable validation */\r\n enableValidation?: boolean;\r\n /** Whether to enable events */\r\n enableEvents?: boolean;\r\n /** Whether to enable performance monitoring */\r\n enablePerformanceMonitoring?: boolean;\r\n /** Maximum number of worksheets */\r\n maxWorksheets?: number;\r\n /** Maximum number of rows per worksheet */\r\n maxRowsPerWorksheet?: number;\r\n /** Maximum number of columns per worksheet */\r\n maxColumnsPerWorksheet?: number;\r\n /** Memory limit in bytes */\r\n memoryLimit?: number;\r\n}\r\n\r\n/**\r\n * Build options interface\r\n */\r\nexport interface IBuildOptions {\r\n /** Output format */\r\n format?: 'xlsx' | 'xls' | 'csv';\r\n /** Whether to include styles */\r\n includeStyles?: boolean;\r\n /** Whether to include formulas */\r\n includeFormulas?: boolean;\r\n /** Whether to include comments */\r\n includeComments?: boolean;\r\n /** Whether to include data validation */\r\n includeValidation?: boolean;\r\n /** Whether to include conditional formatting */\r\n includeConditionalFormatting?: boolean;\r\n /** Compression level (0-9) */\r\n compressionLevel?: number;\r\n /** Whether to optimize for size */\r\n optimizeForSize?: boolean;\r\n /** Whether to optimize for speed */\r\n optimizeForSpeed?: boolean;\r\n}\r\n\r\n/**\r\n * Download options interface\r\n */\r\nexport interface IDownloadOptions extends IBuildOptions {\r\n /** File name */\r\n fileName?: string;\r\n /** Whether to show download progress */\r\n showProgress?: boolean;\r\n /** Progress callback */\r\n onProgress?: (progress: number) => void;\r\n /** Whether to auto-download */\r\n autoDownload?: boolean;\r\n /** MIME type */\r\n mimeType?: string;\r\n}\r\n\r\n/**\r\n * Excel builder interface\r\n */\r\nexport interface IExcelBuilder {\r\n /** Builder configuration */\r\n config: IExcelBuilderConfig;\r\n /** Worksheets in the workbook */\r\n worksheets: Map<string, IWorksheet>;\r\n /** Current worksheet */\r\n currentWorksheet: IWorksheet | undefined;\r\n /** Whether the builder is building */\r\n isBuilding: boolean;\r\n /** Build statistics */\r\n stats: IBuildStats;\r\n\r\n /** Add a new worksheet */\r\n addWorksheet(name: string, config?: Partial<IWorksheetConfig>): IWorksheet;\r\n /** Get a worksheet by name */\r\n getWorksheet(name: string): IWorksheet | undefined;\r\n /** Remove a worksheet */\r\n removeWorksheet(name: string): boolean;\r\n /** Set the current worksheet */\r\n setCurrentWorksheet(name: string): boolean;\r\n /** Build the workbook */\r\n build(options?: IBuildOptions): Promise<Result<ArrayBuffer>>;\r\n /** Generate and download the file */\r\n generateAndDownload(fileName: string, options?: IDownloadOptions): Promise<Result<void>>;\r\n /** Get workbook as buffer */\r\n toBuffer(options?: IBuildOptions): Promise<Result<ArrayBuffer>>;\r\n /** Get workbook as blob */\r\n toBlob(options?: IBuildOptions): Promise<Result<Blob>>;\r\n /** Validate the workbook */\r\n validate(): Result<boolean>;\r\n /** Clear all worksheets */\r\n clear(): void;\r\n /** Get workbook statistics */\r\n getStats(): IBuildStats;\r\n}\r\n\r\n/**\r\n * Build statistics interface\r\n */\r\nexport interface IBuildStats {\r\n /** Total number of worksheets */\r\n totalWorksheets: number;\r\n /** Total number of cells */\r\n totalCells: number;\r\n /** Total memory usage in bytes */\r\n memoryUsage: number;\r\n /** Build time in milliseconds */\r\n buildTime: number;\r\n /** File size in bytes */\r\n fileSize: number;\r\n /** Number of styles used */\r\n stylesUsed: number;\r\n /** Number of formulas used */\r\n formulasUsed: number;\r\n /** Number of conditional formats used */\r\n conditionalFormatsUsed: number;\r\n /** Performance metrics */\r\n performance: {\r\n /** Time spent building headers */\r\n headersTime: number;\r\n /** Time spent building data */\r\n dataTime: number;\r\n /** Time spent applying styles */\r\n stylesTime: number;\r\n /** Time spent writing to buffer */\r\n writeTime: number;\r\n };\r\n}\r\n\r\n/**\r\n * Builder event types\r\n */\r\nexport enum BuilderEventType {\r\n WORKSHEET_ADDED = 'worksheetAdded',\r\n WORKSHEET_REMOVED = 'worksheetRemoved',\r\n WORKSHEET_UPDATED = 'worksheetUpdated',\r\n BUILD_STARTED = 'buildStarted',\r\n BUILD_PROGRESS = 'buildProgress',\r\n BUILD_COMPLETED = 'buildCompleted',\r\n BUILD_ERROR = 'buildError',\r\n DOWNLOAD_STARTED = 'downloadStarted',\r\n DOWNLOAD_PROGRESS = 'downloadProgress',\r\n DOWNLOAD_COMPLETED = 'downloadCompleted',\r\n DOWNLOAD_ERROR = 'downloadError'\r\n}\r\n\r\n/**\r\n * Builder event interface\r\n */\r\nexport interface IBuilderEvent {\r\n type: BuilderEventType;\r\n data?: Record<string, unknown>;\r\n timestamp: Date;\r\n}\r\n\r\n/**\r\n * Builder event listener interface\r\n */\r\nexport interface IBuilderEventListener {\r\n (event: IBuilderEvent): void;\r\n}\r\n\r\n/**\r\n * Builder validation result interface\r\n */\r\nexport interface IBuilderValidationResult {\r\n /** Whether the builder is valid */\r\n isValid: boolean;\r\n /** Validation errors */\r\n errors: string[];\r\n /** Validation warnings */\r\n warnings: string[];\r\n /** Worksheet validation results */\r\n worksheetResults: Map<string, boolean>;\r\n} ","/**\r\n * ExcelBuilder - Main class for creating Excel workbooks\r\n */\r\n\r\nimport ExcelJS from 'exceljs';\r\nimport saveAs from 'file-saver';\r\nimport { EventEmitter } from '../utils/EventEmitter';\r\nimport { Worksheet } from './Worksheet';\r\nimport {\r\n IExcelBuilder,\r\n IExcelBuilderConfig,\r\n IBuildOptions,\r\n IDownloadOptions,\r\n IBuildStats,\r\n BuilderEventType,\r\n IBuilderEvent,\r\n ErrorType\r\n} from '../types/builder.types';\r\nimport {\r\n IWorksheet,\r\n IWorksheetConfig\r\n} from '../types/worksheet.types';\r\nimport { \r\n Result,\r\n ISuccessResult,\r\n IErrorResult\r\n} from '../types/core.types';\r\n\r\n/**\r\n * ExcelBuilder class for creating Excel workbooks\r\n */\r\nexport class ExcelBuilder implements IExcelBuilder {\r\n public config: IExcelBuilderConfig;\r\n public worksheets: Map<string, IWorksheet> = new Map();\r\n public currentWorksheet: IWorksheet | undefined;\r\n public isBuilding = false;\r\n public stats: IBuildStats;\r\n\r\n private eventEmitter: EventEmitter;\r\n\r\n constructor(config: IExcelBuilderConfig = {}) {\r\n this.config = {\r\n enableValidation: true,\r\n enableEvents: true,\r\n enablePerformanceMonitoring: false,\r\n maxWorksheets: 255,\r\n maxRowsPerWorksheet: 1048576,\r\n maxColumnsPerWorksheet: 16384,\r\n memoryLimit: 100 * 1024 * 1024, // 100MB\r\n ...config\r\n };\r\n\r\n this.stats = this.initializeStats();\r\n this.eventEmitter = new EventEmitter();\r\n }\r\n\r\n /**\r\n * Add a new worksheet to the workbook\r\n */\r\n addWorksheet(name: string, worksheetConfig: Partial<IWorksheetConfig> = {}): IWorksheet {\r\n if (this.worksheets.has(name)) {\r\n throw new Error(`Worksheet \"${name}\" already exists`);\r\n }\r\n\r\n const config: IWorksheetConfig = {\r\n name,\r\n defaultRowHeight: 20,\r\n defaultColWidth: 10,\r\n ...this.config.defaultWorksheetConfig,\r\n ...worksheetConfig\r\n };\r\n\r\n const worksheet = new Worksheet(config);\r\n this.worksheets.set(name, worksheet);\r\n this.currentWorksheet = worksheet;\r\n \r\n this.emitEvent(BuilderEventType.WORKSHEET_ADDED, { worksheetName: name });\r\n \r\n return worksheet;\r\n }\r\n\r\n /**\r\n * Get a worksheet by name\r\n */\r\n getWorksheet(name: string): IWorksheet | undefined {\r\n return this.worksheets.get(name);\r\n }\r\n\r\n /**\r\n * Remove a worksheet by name\r\n */\r\n removeWorksheet(name: string): boolean {\r\n const worksheet = this.worksheets.get(name);\r\n if (!worksheet) {\r\n return false;\r\n }\r\n\r\n this.worksheets.delete(name);\r\n \r\n // If this was the current worksheet, clear it\r\n if (this.currentWorksheet === worksheet) {\r\n this.currentWorksheet = undefined;\r\n }\r\n \r\n this.emitEvent(BuilderEventType.WORKSHEET_REMOVED, { worksheetName: name });\r\n \r\n return true;\r\n }\r\n\r\n /**\r\n * Set the current worksheet\r\n */\r\n setCurrentWorksheet(name: string): boolean {\r\n const worksheet = this.worksheets.get(name);\r\n if (!worksheet) {\r\n return false;\r\n }\r\n \r\n this.currentWorksheet = worksheet;\r\n return true;\r\n }\r\n\r\n /**\r\n * Build the workbook and return as ArrayBuffer\r\n */\r\n async build(options: IBuildOptions = {}): Promise<Result<ArrayBuffer>> {\r\n if (this.isBuilding) {\r\n return {\r\n success: false,\r\n error: {\r\n type: ErrorType.BUILD_ERROR,\r\n message: 'Build already in progress',\r\n stack: new Error().stack || ''\r\n }\r\n };\r\n }\r\n\r\n this.isBuilding = true;\r\n const startTime = Date.now();\r\n \r\n try {\r\n this.emitEvent(BuilderEventType.BUILD_STARTED);\r\n \r\n const workbook = new ExcelJS.Workbook();\r\n \r\n // Add metadata\r\n if (this.config.metadata) {\r\n workbook.creator = this.config.metadata.author || 'Han Excel Builder';\r\n workbook.lastModifiedBy = this.config.metadata.author || 'Han Excel Builder';\r\n workbook.created = this.config.metadata.created || new Date();\r\n workbook.modified = this.config.metadata.modified || new Date();\r\n if (this.config.metadata.title) workbook.title = this.config.metadata.title;\r\n if (this.config.metadata.subject) workbook.subject = this.config.metadata.subject;\r\n if (this.config.metadata.keywords) workbook.keywords = this.config.metadata.keywords;\r\n if (this.config.metadata.category) workbook.category = this.config.metadata.category;\r\n if (this.config.metadata.description) workbook.description = this.config.metadata.description;\r\n }\r\n\r\n // Build each worksheet\r\n for (const worksheet of this.worksheets.values()) {\r\n await (worksheet as Worksheet).build(workbook, options);\r\n }\r\n\r\n // Write to buffer\r\n const buffer = await workbook.xlsx.writeBuffer({\r\n compression: options.compressionLevel || 6\r\n } as any);\r\n\r\n const endTime = Date.now();\r\n this.stats.buildTime = endTime - startTime;\r\n this.stats.fileSize = buffer.byteLength;\r\n \r\n const successResult: ISuccessResult<ArrayBuffer> = {\r\n success: true,\r\n data: buffer\r\n };\r\n\r\n this.emitEvent(BuilderEventType.BUILD_COMPLETED, {\r\n buildTime: this.stats.buildTime,\r\n fileSize: this.stats.fileSize\r\n });\r\n\r\n return successResult;\r\n\r\n } catch (error) {\r\n const errorResult: IErrorResult = {\r\n success: false,\r\n error: {\r\n type: ErrorType.BUILD_ERROR,\r\n message: error instanceof Error ? error.message : 'Unknown build error',\r\n stack: error instanceof Error ? error.stack || '' : ''\r\n }\r\n };\r\n\r\n this.emitEvent(BuilderEventType.BUILD_ERROR, { error: errorResult.error });\r\n return errorResult;\r\n\r\n } finally {\r\n this.isBuilding = false;\r\n }\r\n }\r\n\r\n /**\r\n * Generate and download the file\r\n */\r\n async generateAndDownload(fileName: string, options: IDownloadOptions = {}): Promise<Result<void>> {\r\n const buildResult = await this.build(options);\r\n \r\n if (!buildResult.success) {\r\n return buildResult;\r\n }\r\n\r\n try {\r\n this.emitEvent(BuilderEventType.DOWNLOAD_STARTED, { fileName });\r\n \r\n const blob = new Blob([buildResult.data], { \r\n type: options.mimeType || 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' \r\n });\r\n \r\n saveAs(blob, fileName);\r\n \r\n this.emitEvent(BuilderEventType.DOWNLOAD_COMPLETED, { fileName });\r\n \r\n return { success: true, data: undefined };\r\n\r\n } catch (error) {\r\n const errorResult: IErrorResult = {\r\n success: false,\r\n error: {\r\n type: ErrorType.BUILD_ERROR,\r\n message: error instanceof Error ? error.message : 'Download failed',\r\n stack: error instanceof Error ? error.stack || '' : ''\r\n }\r\n };\r\n\r\n this.emitEvent(BuilderEventType.DOWNLOAD_ERROR, { error: errorResult.error });\r\n return errorResult;\r\n }\r\n }\r\n\r\n /**\r\n * Get workbook as buffer\r\n */\r\n async toBuffer(options: IBuildOptions = {}): Promise<Result<ArrayBuffer>> {\r\n return this.build(options);\r\n }\r\n\r\n /**\r\n * Get workbook as blob\r\n */\r\n async toBlob(options: IBuildOptions = {}): Promise<Result<Blob>> {\r\n const buildResult = await this.build(options);\r\n \r\n if (!buildResult.success) {\r\n return buildResult;\r\n }\r\n\r\n const blob = new Blob([buildResult.data], { \r\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' \r\n });\r\n \r\n return { success: true, data: blob };\r\n }\r\n\r\n /**\r\n * Validate the workbook\r\n */\r\n validate(): Result<boolean> {\r\n const errors: string[] = [];\r\n \r\n if (this.worksheets.size === 0) {\r\n errors.push('No worksheets found');\r\n }\r\n\r\n // Validate each worksheet\r\n for (const [name, worksheet] of this.worksheets.entries()) {\r\n const worksheetValidation = (worksheet as Worksheet).validate();\r\n if (!worksheetValidation.success) {\r\n errors.push(`Worksheet \"${name}\": ${worksheetValidation.error?.message}`);\r\n }\r\n }\r\n\r\n if (errors.length > 0) {\r\n return {\r\n success: false,\r\n error: {\r\n type: ErrorType.VALIDATION_ERROR,\r\n message: errors.join('; '),\r\n stack: new Error().stack || ''\r\n }\r\n };\r\n }\r\n\r\n return { success: true, data: true };\r\n }\r\n\r\n /**\r\n * Clear all worksheets\r\n */\r\n clear(): void {\r\n this.worksheets.clear();\r\n this.currentWorksheet = undefined;\r\n }\r\n\r\n /**\r\n * Get workbook statistics\r\n */\r\n getStats(): IBuildStats {\r\n return { ...this.stats };\r\n }\r\n\r\n /**\r\n * Event handling methods\r\n */\r\n on(eventType: BuilderEventType, listener: (event: IBuilderEvent) => void): string {\r\n return this.eventEmitter.on(eventType, listener);\r\n }\r\n\r\n off(eventType: BuilderEventType, listenerId: string): boolean {\r\n return this.eventEmitter.off(eventType, listenerId);\r\n }\r\n\r\n removeAllListeners(eventType?: BuilderEventType): void {\r\n if (eventType) {\r\n this.eventEmitter.offAll(eventType);\r\n } else {\r\n this.eventEmitter.clear();\r\n }\r\n }\r\n\r\n /**\r\n * Private methods\r\n */\r\n private emitEvent(type: BuilderEventType, data?: Record<string, unknown>): void {\r\n const event: IBuilderEvent = {\r\n type,\r\n data: data || {},\r\n timestamp: new Date()\r\n };\r\n this.eventEmitter.emitSync(event);\r\n }\r\n\r\n private initializeStats(): IBuildStats {\r\n return {\r\n totalWorksheets: 0,\r\n totalCells: 0,\r\n memoryUsage: 0,\r\n buildTime: 0,\r\n fileSize: 0,\r\n stylesUsed: 0,\r\n formulasUsed: 0,\r\n conditionalFormatsUsed: 0,\r\n performance: {\r\n headersTime: 0,\r\n dataTime: 0,\r\n stylesTime: 0,\r\n writeTime: 0\r\n }\r\n };\r\n }\r\n} ","/**\r\n * StyleBuilder - Fluent API for creating Excel styles\r\n */\r\n\r\nimport {\r\n IStyle,\r\n IBorder,\r\n IConditionalFormat,\r\n IStyleBuilder as IStyleBuilderInterface\r\n} from '../types/style.types';\r\nimport { \r\n Color, \r\n HorizontalAlignment,\r\n VerticalAlignment,\r\n BorderStyle, \r\n FontStyle \r\n} from '../types/core.types';\r\n\r\n/**\r\n * StyleBuilder class providing a fluent API for creating Excel styles\r\n */\r\nexport class StyleBuilder implements IStyleBuilderInterface {\r\n private style: Partial<IStyle> = {};\r\n\r\n constructor() {\r\n // Configuración por defecto: wrapText true y alineación al centro\r\n this.style.alignment = {\r\n horizontal: HorizontalAlignment.CENTER,\r\n vertical: VerticalAlignment.MIDDLE,\r\n wrapText: true,\r\n shrinkToFit: true\r\n };\r\n }\r\n\r\n /**\r\n * Create a new StyleBuilder instance\r\n */\r\n static create(): StyleBuilder {\r\n return new StyleBuilder();\r\n }\r\n\r\n /**\r\n * Set font name\r\n */\r\n fontName(name: string): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.name = name;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set font size\r\n */\r\n fontSize(size: number): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.size = size;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set font style\r\n */\r\n fontStyle(style: FontStyle): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.style = style;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set font color\r\n */\r\n fontColor(color: Color): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.color = color;\r\n return this;\r\n }\r\n\r\n /**\r\n * Make font bold\r\n */\r\n fontBold(): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.bold = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Make font italic\r\n */\r\n fontItalic(): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.italic = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Make font underlined\r\n */\r\n fontUnderline(): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.underline = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set border on all sides\r\n */\r\n border(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.top = border;\r\n this.style.border.left = border;\r\n this.style.border.bottom = border;\r\n this.style.border.right = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set top border\r\n */\r\n borderTop(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.top = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set left border\r\n */\r\n borderLeft(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.left = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set bottom border\r\n */\r\n borderBottom(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.bottom = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set right border\r\n */\r\n borderRight(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.right = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set background color\r\n */\r\n backgroundColor(color: Color): StyleBuilder {\r\n if (!this.style.fill) {\r\n this.style.fill = { type: 'pattern' };\r\n }\r\n this.style.fill.backgroundColor = color;\r\n this.style.fill.pattern = 'solid';\r\n return this;\r\n }\r\n\r\n /**\r\n * Set horizontal alignment\r\n */\r\n horizontalAlign(alignment: HorizontalAlignment): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.horizontal = alignment;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set vertical alignment\r\n */\r\n verticalAlign(alignment: VerticalAlignment): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.vertical = alignment;\r\n return this;\r\n }\r\n\r\n /**\r\n * Center align text\r\n */\r\n centerAlign(): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.horizontal = HorizontalAlignment.CENTER;\r\n this.style.alignment.vertical = VerticalAlignment.MIDDLE;\r\n return this;\r\n }\r\n\r\n /**\r\n * Left align text\r\n */\r\n leftAlign(): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.horizontal = HorizontalAlignment.LEFT;\r\n return this;\r\n }\r\n\r\n /**\r\n * Right align text\r\n */\r\n rightAlign(): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.horizontal = HorizontalAlignment.RIGHT;\r\n return this;\r\n }\r\n\r\n /**\r\n * Wrap text\r\n */\r\n wrapText(): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.wrapText = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set number format\r\n */\r\n numberFormat(format: string): StyleBuilder {\r\n this.style.numberFormat = format;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set striped rows\r\n */\r\n striped(): StyleBuilder {\r\n this.style.striped = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Add conditional formatting\r\n */\r\n conditionalFormat(format: IConditionalFormat): StyleBuilder {\r\n if (!this.style.conditionalFormats) {\r\n this.style.conditionalFormats = [];\r\n }\r\n this.style.conditionalFormats.push(format);\r\n return this;\r\n }\r\n\r\n /**\r\n * Build the final style\r\n */\r\n build(): IStyle {\r\n return this.style as IStyle;\r\n }\r\n\r\n /**\r\n * Reset the builder\r\n */\r\n reset(): StyleBuilder {\r\n this.style = {};\r\n // Restaurar configuración por defecto\r\n this.style.alignment = {\r\n horizontal: HorizontalAlignment.CENTER,\r\n vertical: VerticalAlignment.MIDDLE,\r\n wrapText: true\r\n };\r\n return this;\r\n }\r\n\r\n /**\r\n * Clone the current style\r\n */\r\n clone(): StyleBuilder {\r\n const cloned = new StyleBuilder();\r\n cloned.style = JSON.parse(JSON.stringify(this.style));\r\n return cloned;\r\n }\r\n} ","/**\r\n * Cell-specific type definitions\r\n */\r\n\r\nimport { IBaseCell } from './core.types';\r\nimport type { CellValue } from 'exceljs';\r\n\r\n/**\r\n * Header cell interface\r\n */\r\nexport interface IHeaderCell extends IBaseCell {\r\n /** Reference to parent header key */\r\n mainHeaderKey?: string;\r\n /** Child headers */\r\n children?: IHeaderCell[];\r\n /** Whether this is a main header */\r\n isMainHeader?: boolean;\r\n /** Header level (1 = main, 2 = sub, etc.) */\r\n level?: number;\r\n}\r\n\r\n/**\r\n * Data cell interface\r\n */\r\nexport interface IDataCell extends IBaseCell {\r\n /** Reference to header key */\r\n header: string;\r\n /** Reference to main header key */\r\n mainHeaderKey?: string;\r\n /** Child data cells */\r\n children?: IDataCell[];\r\n /** Whether this cell has alternating row color */\r\n striped?: boolean;\r\n /** Row index */\r\n rowIndex?: number;\r\n /** Column index */\r\n colIndex?: number;\r\n}\r\n\r\n/**\r\n * Footer cell interface\r\n */\r\nexport interface IFooterCell extends IBaseCell {\r\n /** Reference to header key */\r\n header: string;\r\n /** Child footer cells */\r\n children?: IDataCell[];\r\n /** Whether this is a total row */\r\n isTotal?: boolean;\r\n /** Footer type */\r\n footerType?: 'total' | 'subtotal' | 'average' | 'count' | 'custom';\r\n}\r\n\r\n/**\r\n * Cell position interface\r\n */\r\nexport interface ICellPosition {\r\n /** Row index (1-based) */\r\n row: number;\r\n /** Column index (1-based) */\r\n col: number;\r\n /** Cell reference (e.g., A1) */\r\n reference: string;\r\n}\r\n\r\n/**\r\n * Cell range interface\r\n */\r\nexport interface ICellRange {\r\n /** Start position */\r\n start: ICellPosition;\r\n /** End position */\r\n end: ICellPosition;\r\n /** Range reference (e.g., A1:B10) */\r\n reference: string;\r\n}\r\n\r\n/**\r\n * Cell data for different types\r\n */\r\nexport interface ICellData {\r\n /** String cell data */\r\n string?: {\r\n value: string;\r\n maxLength?: number;\r\n trim?: boolean;\r\n };\r\n /** Number cell data */\r\n number?: {\r\n value: number;\r\n min?: number;\r\n max?: number;\r\n precision?: number;\r\n allowNegative?: boolean;\r\n };\r\n /** Date cell data */\r\n date?: {\r\n value: Date;\r\n min?: Date;\r\n max?: Date;\r\n format?: string;\r\n };\r\n /** Boolean cell data */\r\n boolean?: {\r\n value: boolean;\r\n trueText?: string;\r\n falseText?: string;\r\n };\r\n /** Percentage cell data */\r\n percentage?: {\r\n value: number;\r\n min?: number;\r\n max?: number;\r\n precision?: number;\r\n showSymbol?: boolean;\r\n };\r\n /** Currency cell data */\r\n currency?: {\r\n value: number;\r\n currency?: string;\r\n precision?: number;\r\n showSymbol?: boolean;\r\n };\r\n /** Link cell data */\r\n link?: {\r\n value: string;\r\n text?: string;\r\n tooltip?: string;\r\n };\r\n /** Formula cell data */\r\n formula?: {\r\n value: string;\r\n result?: CellValue;\r\n };\r\n}\r\n\r\n/**\r\n * Cell validation result\r\n */\r\nexport interface ICellValidationResult {\r\n /** Whether the cell is valid */\r\n isValid: boolean;\r\n /** Validation errors */\r\n errors: string[];\r\n /** Validation warnings */\r\n warnings: string[];\r\n}\r\n\r\n/**\r\n * Cell event types\r\n */\r\nexport enum CellEventType {\r\n CREATED = 'created',\r\n UPDATED = 'updated',\r\n DELETED = 'deleted',\r\n STYLED = 'styled',\r\n VALIDATED = 'validated'\r\n}\r\n\r\n/**\r\n * Cell event interface\r\n */\r\nexport interface ICellEvent {\r\n type: CellEventType;\r\n cell: IDataCell | IHeaderCell | IFooterCell;\r\n position: ICellPosition;\r\n timestamp: Date;\r\n data?: Record<string, unknown>;\r\n} ","/**\r\n * Worksheet-specific type definitions\r\n */\r\n\r\nimport { IHeaderCell, IDataCell, IFooterCell, ICellPosition, ICellRange } from './cell.types';\r\nimport { Color, Result } from './core.types';\r\n\r\n/**\r\n * Worksheet configuration interface\r\n */\r\nexport interface IWorksheetConfig {\r\n /** Worksheet name */\r\n name: string;\r\n /** Tab color */\r\n tabColor?: Color;\r\n /** Default row height */\r\n defaultRowHeight?: number;\r\n /** Default column width */\r\n defaultColWidth?: number;\r\n /** Whether the worksheet is hidden */\r\n hidden?: boolean;\r\n /** Whether the worksheet is protected */\r\n protected?: boolean;\r\n /** Protection password */\r\n protectionPassword?: string;\r\n /** Whether to show grid lines */\r\n showGridLines?: boolean;\r\n /** Whether to show row and column headers */\r\n showRowColHeaders?: boolean;\r\n /** Zoom level (1-400) */\r\n zoom?: number;\r\n /** Freeze panes position */\r\n freezePanes?: ICellPosition;\r\n /** Print area */\r\n printArea?: ICellRange;\r\n /** Fit to page settings */\r\n fitToPage?: {\r\n fitToWidth?: number;\r\n fitToHeight?: number;\r\n };\r\n /** Page setup */\r\n pageSetup?: {\r\n orientation?: 'portrait' | 'landscape';\r\n paperSize?: number;\r\n fitToPage?: boolean;\r\n fitToWidth?: number;\r\n fitToHeight?: number;\r\n scale?: number;\r\n horizontalCentered?: boolean;\r\n verticalCentered?: boolean;\r\n margins?: {\r\n top?: number;\r\n left?: number;\r\n bottom?: number;\r\n right?: number;\r\n header?: number;\r\n footer?: number;\r\n };\r\n };\r\n}\r\n\r\n/**\r\n * Table structure interface\r\n */\r\nexport interface ITable {\r\n /** Table name */\r\n name?: string;\r\n /** Table headers */\r\n headers?: IHeaderCell[];\r\n /** Table sub-headers */\r\n subHeaders?: IHeaderCell[];\r\n /** Table data rows */\r\n body?: IDataCell[];\r\n /** Table footers */\r\n footers?: IFooterCell[];\r\n /** Table range */\r\n range?: ICellRange;\r\n /** Whether to show table borders */\r\n showBorders?: boolean;\r\n /** Whether to show alternating row colors */\r\n showStripes?: boolean;\r\n /** Table style */\r\n style?: 'TableStyleLight1' | 'TableStyleLight2' | 'TableStyleMedium1' | 'TableStyleMedium2' | 'TableStyleDark1' | 'TableStyleDark2';\r\n}\r\n\r\n/**\r\n * Worksheet interface\r\n */\r\nexport interface IWorksheet {\r\n /** Worksheet configuration */\r\n config: IWorksheetConfig;\r\n /** Tables in the worksheet */\r\n tables: ITable[];\r\n /** Current row pointer */\r\n currentRow: number;\r\n /** Current column pointer */\r\n currentCol: number;\r\n /** Header pointers for navigation */\r\n headerPointers: Map<string, ICellPosition>;\r\n /** Whether the worksheet has been built */\r\n isBuilt: boolean;\r\n\r\n /** Add a header */\r\n addHeader(header: IHeaderCell): this;\r\n /** Add subheaders */\r\n addSubHeaders(subHeaders: IHeaderCell[]): this;\r\n /** Add a row or rows */\r\n addRow(row: IDataCell[] | IDataCell): this;\r\n /** Add a footer or footers */\r\n addFooter(footer: IFooterCell[] | IFooterCell): this;\r\n /** Add a new table to the worksheet */\r\n addTable(tableConfig?: Partial<ITable>): this;\r\n /** Finalize the current table with temporary data */\r\n finalizeTable(): this;\r\n /** Get a table by name */\r\n getTable(name: string): ITable | undefined;\r\n /** Build the worksheet */\r\n build(workbook: any, options?: any): Promise<void>;\r\n /** Validate the worksheet */\r\n validate(): Result<boolean>;\r\n}\r\n\r\n/**\r\n * Worksheet event types\r\n */\r\nexport enum WorksheetEventType {\r\n CREATED = 'created',\r\n UPDATED = 'updated',\r\n DELETED = 'deleted',\r\n TABLE_ADDED = 'tableAdded',\r\n TABLE_REMOVED = 'tableRemoved',\r\n CELL_ADDED = 'cellAdded',\r\n CELL_UPDATED = 'cellUpdated',\r\n CELL_DELETED = 'cellDeleted'\r\n}\r\n\r\n/**\r\n * Worksheet event interface\r\n */\r\nexport interface IWorksheetEvent {\r\n type: WorksheetEventType;\r\n worksheet: IWorksheet;\r\n data?: Record<string, unknown>;\r\n timestamp: Date;\r\n}\r\n\r\n/**\r\n * Worksheet validation result\r\n */\r\nexport interface IWorksheetValidationResult {\r\n /** Whether the worksheet is valid */\r\n isValid: boolean;\r\n /** Validation errors */\r\n errors: string[];\r\n /** Validation warnings */\r\n warnings: string[];\r\n /** Cell validation results */\r\n cellResults: Map<string, boolean>;\r\n}\r\n\r\n/**\r\n * Worksheet statistics\r\n */\r\nexport interface IWorksheetStats {\r\n /** Total number of cells */\r\n totalCells: number;\r\n /** Number of header cells */\r\n headerCells: number;\r\n /** Number of data cells */\r\n dataCells: number;\r\n /** Number of footer cells */\r\n footerCells: number;\r\n /** Number of tables */\r\n tables: number;\r\n /** Used range */\r\n usedRange: ICellRange;\r\n /** Memory usage in bytes */\r\n memoryUsage: number;\r\n} ","/**\r\n * Style-specific type definitions\r\n */\r\n\r\nimport { \r\n Color, \r\n HorizontalAlignment, \r\n VerticalAlignment, \r\n BorderStyle, \r\n FontStyle \r\n} from './core.types';\r\n\r\n/**\r\n * Font configuration interface\r\n */\r\nexport interface IFont {\r\n /** Font name */\r\n name?: string;\r\n /** Font size */\r\n size?: number;\r\n /** Font style */\r\n style?: FontStyle;\r\n /** Font color */\r\n color?: Color;\r\n /** Whether the font is bold */\r\n bold?: boolean;\r\n /** Whether the font is italic */\r\n italic?: boolean;\r\n /** Whether the font is underlined */\r\n underline?: boolean;\r\n /** Whether the font is strikethrough */\r\n strikethrough?: boolean;\r\n /** Font family */\r\n family?: string;\r\n /** Font scheme */\r\n scheme?: 'major' | 'minor' | 'none';\r\n}\r\n\r\n/**\r\n * Border configuration interface\r\n */\r\nexport interface IBorder {\r\n /** Border style */\r\n style?: BorderStyle;\r\n /** Border color */\r\n color?: Color;\r\n /** Border width */\r\n width?: number;\r\n}\r\n\r\n/**\r\n * Border sides interface\r\n */\r\nexport interface IBorderSides {\r\n /** Top border */\r\n top?: IBorder;\r\n /** Left border */\r\n left?: IBorder;\r\n /** Bottom border */\r\n bottom?: IBorder;\r\n /** Right border */\r\n right?: IBorder;\r\n /** Diagonal border */\r\n diagonal?: IBorder;\r\n /** Diagonal direction */\r\n diagonalDirection?: 'up' | 'down' | 'both';\r\n}\r\n\r\n/**\r\n * Fill pattern interface\r\n */\r\nexport interface IFill {\r\n /** Fill type */\r\n type: 'pattern' | 'gradient';\r\n /** Pattern type (for pattern fills) */\r\n pattern?: 'none' | 'solid' | 'darkGray' | 'mediumGray' | 'lightGray' | 'gray125' | 'gray0625' | 'darkHorizontal' | 'darkVertical' | 'darkDown' | 'darkUp' | 'darkGrid' | 'darkTrellis' | 'lightHorizontal' | 'lightVertical' | 'lightDown' | 'lightUp' | 'lightGrid' | 'lightTrellis';\r\n /** Background color */\r\n backgroundColor?: Color;\r\n /** Foreground color */\r\n foregroundColor?: Color;\r\n /** Gradient type (for gradient fills) */\r\n gradient?: 'linear' | 'path';\r\n /** Gradient stops */\r\n stops?: Array<{\r\n position: number;\r\n color: Color;\r\n }>;\r\n /** Gradient angle (for linear gradients) */\r\n angle?: number;\r\n}\r\n\r\n/**\r\n * Alignment configuration interface\r\n */\r\nexport interface IAlignment {\r\n /** Horizontal alignment */\r\n horizontal?: HorizontalAlignment;\r\n /** Vertical alignment */\r\n vertical?: VerticalAlignment;\r\n /** Text rotation (0-180 degrees) */\r\n textRotation?: number;\r\n /** Whether to wrap text */\r\n wrapText?: boolean;\r\n /** Whether to shrink text to fit */\r\n shrinkToFit?: boolean;\r\n /** Indent level */\r\n indent?: number;\r\n /** Whether to merge cells */\r\n mergeCell?: boolean;\r\n /** Reading order */\r\n readingOrder?: 'left-to-right' | 'right-to-left';\r\n}\r\n\r\n/**\r\n * Protection configuration interface\r\n */\r\nexport interface IProtection {\r\n /** Whether the cell is locked */\r\n locked?: boolean;\r\n /** Whether the cell is hidden */\r\n hidden?: boolean;\r\n}\r\n\r\n/**\r\n * Conditional formatting interface\r\n */\r\nexport interface IConditionalFormat {\r\n /** Condition type */\r\n type: 'cellIs' | 'containsText' | 'beginsWith' | 'endsWith' | 'containsBlanks' | 'notContainsBlanks' | 'containsErrors' | 'notContainsErrors' | 'timePeriod' | 'top' | 'bottom' | 'aboveAverage' | 'belowAverage' | 'duplicateValues' | 'uniqueValues' | 'expression' | 'colorScale' | 'dataBar' | 'iconSet';\r\n /** Condition operator */\r\n operator?: 'between' | 'notBetween' | 'equal' | 'notEqual' | 'greaterThan' | 'lessThan' | 'greaterThanOrEqual' | 'lessThanOrEqual';\r\n /** Condition values */\r\n values?: Array<string | number | Date>;\r\n /** Condition formula */\r\n formula?: string;\r\n /** Style to apply when condition is met */\r\n style?: IStyle;\r\n /** Priority of the condition */\r\n priority?: number;\r\n /** Whether to stop if true */\r\n stopIfTrue?: boolean;\r\n}\r\n\r\n/**\r\n * Main style interface\r\n */\r\nexport interface IStyle {\r\n /** Font configuration */\r\n font?: IFont;\r\n /** Border configuration */\r\n border?: IBorderSides;\r\n /** Fill configuration */\r\n fill?: IFill;\r\n /** Alignment configuration */\r\n alignment?: IAlignment;\r\n /** Protection configuration */\r\n protection?: IProtection;\r\n /** Conditional formatting */\r\n conditionalFormats?: IConditionalFormat[];\r\n /** Number format */\r\n numberFormat?: string;\r\n /** Whether to apply alternating row colors */\r\n striped?: boolean;\r\n /** Custom CSS-like properties */\r\n custom?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Style preset types\r\n */\r\nexport enum StylePreset {\r\n HEADER = 'header',\r\n SUBHEADER = 'subheader',\r\n DATA = 'data',\r\n FOOTER = 'footer',\r\n TOTAL = 'total',\r\n HIGHLIGHT = 'highlight',\r\n WARNING = 'warning',\r\n ERROR = 'error',\r\n SUCCESS = 'success',\r\n INFO = 'info'\r\n}\r\n\r\n/**\r\n * Style theme interface\r\n */\r\nexport interface IStyleTheme {\r\n /** Theme name */\r\n name: string;\r\n /** Theme description */\r\n description?: string;\r\n /** Color palette */\r\n colors: {\r\n primary: Color;\r\n secondary: Color;\r\n accent: Color;\r\n background: Color;\r\n text: Color;\r\n border: Color;\r\n success: Color;\r\n warning: Color;\r\n error: Color;\r\n info: Color;\r\n };\r\n /** Font family */\r\n fontFamily: string;\r\n /** Base font size */\r\n fontSize: number;\r\n /** Style presets */\r\n presets: Record<StylePreset, IStyle>;\r\n}\r\n\r\n/**\r\n * Style builder interface\r\n */\r\nexport interface IStyleBuilder {\r\n /** Set font name */\r\n fontName(name: string): IStyleBuilder;\r\n /** Set font size */\r\n fontSize(size: number): IStyleBuilder;\r\n /** Set font style */\r\n fontStyle(style: FontStyle): IStyleBuilder;\r\n /** Set font color */\r\n fontColor(color: Color): IStyleBuilder;\r\n /** Make font bold */\r\n fontBold(): IStyleBuilder;\r\n /** Make font italic */\r\n fontItalic(): IStyleBuilder;\r\n /** Make font underlined */\r\n fontUnderline(): IStyleBuilder;\r\n /** Set border */\r\n border(style: BorderStyle, color?: Color): IStyleBuilder;\r\n /** Set specific border */\r\n borderTop(style: BorderStyle, color?: Color): IStyleBuilder;\r\n borderLeft(style: BorderStyle, color?: Color): IStyleBuilder;\r\n borderBottom(style: BorderStyle, color?: Color): IStyleBuilder;\r\n borderRight(style: BorderStyle, color?: Color): IStyleBuilder;\r\n /** Set background color */\r\n backgroundColor(color: Color): IStyleBuilder;\r\n /** Set horizontal alignment */\r\n horizontalAlign(alignment: HorizontalAlignment): IStyleBuilder;\r\n /** Set vertical alignment */\r\n verticalAlign(alignment: VerticalAlignment): IStyleBuilder;\r\n /** Center align text */\r\n centerAlign(): IStyleBuilder;\r\n /** Left align text */\r\n leftAlign(): IStyleBuilder;\r\n /** Right align text */\r\n rightAlign(): IStyleBuilder;\r\n /** Wrap text */\r\n wrapText(): IStyleBuilder;\r\n /** Set number format */\r\n numberFormat(format: string): IStyleBuilder;\r\n /** Set striped rows */\r\n striped(): IStyleBuilder;\r\n /** Add conditional formatting */\r\n conditionalFormat(format: IConditionalFormat): IStyleBuilder;\r\n /** Build the final style */\r\n build(): IStyle;\r\n} "],"names":["EventEmitter","listeners","Map","on","type","listener","options","this","has","set","registration","once","async","priority","stopPropagation","id","generateId","active","timestamp","Date","get","push","sort","a","b","off","listenerId","index","findIndex","reg","splice","offAll","count","length","delete","emit","event","activeListeners","filter","error","console","cleanupInactiveListeners","emitSync","clear","getListeners","getListenerCount","getEventTypes","Array","from","keys","Math","random","toString","substr","CellType","NumberFormat","HorizontalAlignment","VerticalAlignment","BorderStyle","FontStyle","ErrorType","Worksheet","config","tables","currentRow","currentCol","headerPointers","isBuilt","headers","subHeaders","body","footers","constructor","addHeader","header","addSubHeaders","addRow","row","isArray","addFooter","footer","addTable","tableConfig","table","name","showBorders","showStripes","style","finalizeTable","currentTable","Error","getTable","find","build","workbook","_options","ws","addWorksheet","properties","defaultRowHeight","tabColor","pageSetup","rowPointer","i","buildTable","buildLegacyContent","startRow","addSpacing","value","mergeCell","maxCols","calculateTableMaxColumns","mergeCells","styles","getRow","eachCell","cell","convertStyle","buildNestedHeaders","addDataRowRecursive","addFooterRow","applyTableStyle","forEach","getMaxColumns","calculateHeaderColSpan","endRow","col","getCell","border","top","color","argb","left","bottom","right","fill","pattern","fgColor","maxDepth","getMaxHeaderDepth","depth","colIndex","headerInfo","getHeaderAtDepth","colSpan","children","child","String","applyAllMerges","startCol","log","mergeRange","start","end","childColSpan","applySmartMerges","applySmartMergesForHeader","headerColSpan","childColIndex","reduce","total","childDepth","max","validate","success","data","VALIDATION_ERROR","message","calculateDataColumnPositions","positions","key","columnPositions","footerColPosition","excelRow","footerCell","numberFormat","numFmt","mergeTo","colPosition","childCell","jump","mainColPosition","mainCell","converted","font","family","size","bold","italic","underline","foregroundColor","bgColor","backgroundColor","alignment","horizontal","vertical","wrapText","indent","BuilderEventType","ExcelBuilder","worksheets","currentWorksheet","isBuilding","stats","eventEmitter","enableValidation","enableEvents","enablePerformanceMonitoring","maxWorksheets","maxRowsPerWorksheet","maxColumnsPerWorksheet","memoryLimit","initializeStats","worksheetConfig","defaultColWidth","defaultWorksheetConfig","worksheet","emitEvent","WORKSHEET_ADDED","worksheetName","getWorksheet","removeWorksheet","WORKSHEET_REMOVED","setCurrentWorksheet","BUILD_ERROR","stack","startTime","now","BUILD_STARTED","ExcelJS","Workbook","metadata","creator","author","lastModifiedBy","created","modified","title","subject","keywords","category","description","values","buffer","xlsx","writeBuffer","compression","compressionLevel","endTime","buildTime","fileSize","byteLength","successResult","BUILD_COMPLETED","errorResult","generateAndDownload","fileName","buildResult","DOWNLOAD_STARTED","blob","Blob","mimeType","saveAs","DOWNLOAD_COMPLETED","DOWNLOAD_ERROR","toBuffer","toBlob","errors","entries","worksheetValidation","join","getStats","eventType","removeAllListeners","totalWorksheets","totalCells","memoryUsage","stylesUsed","formulasUsed","conditionalFormatsUsed","performance","headersTime","dataTime","stylesTime","writeTime","StyleBuilder","CENTER","MIDDLE","shrinkToFit","create","fontName","fontSize","fontStyle","fontColor","fontBold","fontItalic","fontUnderline","borderTop","borderLeft","borderBottom","borderRight","horizontalAlign","verticalAlign","centerAlign","leftAlign","LEFT","rightAlign","RIGHT","format","striped","conditionalFormat","conditionalFormats","reset","clone","cloned","JSON","parse","stringify","CellEventType","WorksheetEventType","StylePreset"],"mappings":"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"}
1
+ {"version":3,"file":"han-excel.cjs.js","sources":["../src/utils/EventEmitter.ts","../src/types/core.types.ts","../src/core/Worksheet.ts","../src/types/builder.types.ts","../src/core/ExcelBuilder.ts","../src/styles/StyleBuilder.ts","../src/types/cell.types.ts","../src/types/worksheet.types.ts","../src/types/style.types.ts"],"sourcesContent":["/**\r\n * Simple EventEmitter implementation\r\n */\r\n\r\n/**\r\n * Event listener function type\r\n */\r\nexport type EventListener<T = any> = (event: T) => void | Promise<void>;\r\n\r\n/**\r\n * Event listener options\r\n */\r\nexport interface EventListenerOptions {\r\n /** Whether to execute the listener only once */\r\n once?: boolean;\r\n /** Whether to execute the listener asynchronously */\r\n async?: boolean;\r\n /** Priority of the listener (higher = executed first) */\r\n priority?: number;\r\n /** Whether to stop event propagation */\r\n stopPropagation?: boolean;\r\n}\r\n\r\n/**\r\n * Event listener registration\r\n */\r\nexport interface EventListenerRegistration {\r\n /** Event type */\r\n type: string;\r\n /** Listener function */\r\n listener: EventListener;\r\n /** Listener options */\r\n options: EventListenerOptions;\r\n /** Registration ID */\r\n id: string;\r\n /** Whether the listener is active */\r\n active: boolean;\r\n /** Registration timestamp */\r\n timestamp: Date;\r\n}\r\n\r\n/**\r\n * EventEmitter class for handling events\r\n */\r\nexport class EventEmitter {\r\n private listeners: Map<string, EventListenerRegistration[]> = new Map();\r\n\r\n /**\r\n * Add an event listener\r\n */\r\n on<T = any>(type: string, listener: EventListener<T>, options: EventListenerOptions = {}): string {\r\n if (!this.listeners.has(type)) {\r\n this.listeners.set(type, []);\r\n }\r\n\r\n const registration: EventListenerRegistration = {\r\n type,\r\n listener: listener as EventListener,\r\n options: {\r\n once: false,\r\n async: false,\r\n priority: 0,\r\n stopPropagation: false,\r\n ...options\r\n },\r\n id: this.generateId(),\r\n active: true,\r\n timestamp: new Date()\r\n };\r\n\r\n this.listeners.get(type)!.push(registration);\r\n \r\n // Sort by priority (higher priority first)\r\n this.listeners.get(type)!.sort((a, b) => (b.options.priority || 0) - (a.options.priority || 0));\r\n\r\n return registration.id;\r\n }\r\n\r\n /**\r\n * Add a one-time event listener\r\n */\r\n once<T = any>(type: string, listener: EventListener<T>, options: EventListenerOptions = {}): string {\r\n return this.on(type, listener, { ...options, once: true });\r\n }\r\n\r\n /**\r\n * Remove an event listener\r\n */\r\n off(type: string, listenerId: string): boolean {\r\n const listeners = this.listeners.get(type);\r\n if (!listeners) {\r\n return false;\r\n }\r\n\r\n const index = listeners.findIndex(reg => reg.id === listenerId);\r\n if (index === -1) {\r\n return false;\r\n }\r\n\r\n listeners.splice(index, 1);\r\n return true;\r\n }\r\n\r\n /**\r\n * Remove all listeners for an event type\r\n */\r\n offAll(type: string): number {\r\n const listeners = this.listeners.get(type);\r\n if (!listeners) {\r\n return 0;\r\n }\r\n\r\n const count = listeners.length;\r\n this.listeners.delete(type);\r\n return count;\r\n }\r\n\r\n /**\r\n * Emit an event\r\n */\r\n async emit<T = any>(event: T): Promise<void> {\r\n const type = (event as any).type || 'default';\r\n const listeners = this.listeners.get(type);\r\n \r\n if (!listeners || listeners.length === 0) {\r\n return;\r\n }\r\n\r\n const activeListeners = listeners.filter(reg => reg.active);\r\n \r\n for (const registration of activeListeners) {\r\n try {\r\n if (registration.options.once) {\r\n registration.active = false;\r\n }\r\n\r\n if (registration.options.async) {\r\n await registration.listener(event);\r\n } else {\r\n registration.listener(event);\r\n }\r\n\r\n if (registration.options.stopPropagation) {\r\n break;\r\n }\r\n } catch (error) {\r\n console.error(`Error in event listener for ${type}:`, error);\r\n }\r\n }\r\n\r\n // Clean up inactive listeners\r\n this.cleanupInactiveListeners(type);\r\n }\r\n\r\n /**\r\n * Emit an event synchronously\r\n */\r\n emitSync<T = any>(event: T): void {\r\n const type = (event as any).type || 'default';\r\n const listeners = this.listeners.get(type);\r\n \r\n if (!listeners || listeners.length === 0) {\r\n return;\r\n }\r\n\r\n const activeListeners = listeners.filter(reg => reg.active);\r\n \r\n for (const registration of activeListeners) {\r\n try {\r\n if (registration.options.once) {\r\n registration.active = false;\r\n }\r\n\r\n registration.listener(event);\r\n\r\n if (registration.options.stopPropagation) {\r\n break;\r\n }\r\n } catch (error) {\r\n console.error(`Error in event listener for ${type}:`, error);\r\n }\r\n }\r\n\r\n // Clean up inactive listeners\r\n this.cleanupInactiveListeners(type);\r\n }\r\n\r\n /**\r\n * Clear all listeners\r\n */\r\n clear(): void {\r\n this.listeners.clear();\r\n }\r\n\r\n /**\r\n * Get listeners for an event type\r\n */\r\n getListeners(type: string): EventListenerRegistration[] {\r\n return this.listeners.get(type) || [];\r\n }\r\n\r\n /**\r\n * Get listener count for an event type\r\n */\r\n getListenerCount(type: string): number {\r\n return this.listeners.get(type)?.length || 0;\r\n }\r\n\r\n /**\r\n * Get all registered event types\r\n */\r\n getEventTypes(): string[] {\r\n return Array.from(this.listeners.keys());\r\n }\r\n\r\n // Private methods\r\n\r\n private generateId(): string {\r\n return Math.random().toString(36).substr(2, 9);\r\n }\r\n\r\n private cleanupInactiveListeners(type: string): void {\r\n const listeners = this.listeners.get(type);\r\n if (listeners) {\r\n const activeListeners = listeners.filter(reg => reg.active);\r\n if (activeListeners.length !== listeners.length) {\r\n this.listeners.set(type, activeListeners);\r\n }\r\n }\r\n }\r\n} ","/**\r\n * Core type definitions for Han Excel Builder\r\n */\r\n\r\nimport { CellValue } from 'exceljs';\r\n\r\n/**\r\n * Supported cell data types\r\n */\r\nexport enum CellType {\r\n STRING = 'string',\r\n NUMBER = 'number',\r\n BOOLEAN = 'boolean',\r\n DATE = 'date',\r\n PERCENTAGE = 'percentage',\r\n CURRENCY = 'currency',\r\n LINK = 'link',\r\n FORMULA = 'formula'\r\n}\r\n\r\n/**\r\n * Number format options\r\n */\r\nexport enum NumberFormat {\r\n GENERAL = 'General',\r\n NUMBER = '#,##0',\r\n NUMBER_DECIMALS = '#,##0.00',\r\n CURRENCY = '$#,##0.00',\r\n CURRENCY_INTEGER = '$#,##0',\r\n PERCENTAGE = '0%',\r\n PERCENTAGE_DECIMALS = '0.00%',\r\n DATE = 'dd/mm/yyyy',\r\n DATE_TIME = 'dd/mm/yyyy hh:mm',\r\n TIME = 'hh:mm:ss',\r\n CUSTOM = 'custom'\r\n}\r\n\r\n/**\r\n * Horizontal alignment options\r\n */\r\nexport enum HorizontalAlignment {\r\n LEFT = 'left',\r\n CENTER = 'center',\r\n RIGHT = 'right',\r\n FILL = 'fill',\r\n JUSTIFY = 'justify',\r\n CENTER_CONTINUOUS = 'centerContinuous',\r\n DISTRIBUTED = 'distributed'\r\n}\r\n\r\n/**\r\n * Vertical alignment options\r\n */\r\nexport enum VerticalAlignment {\r\n TOP = 'top',\r\n MIDDLE = 'middle',\r\n BOTTOM = 'bottom',\r\n DISTRIBUTED = 'distributed',\r\n JUSTIFY = 'justify'\r\n}\r\n\r\n/**\r\n * Border style options\r\n */\r\nexport enum BorderStyle {\r\n THIN = 'thin',\r\n MEDIUM = 'medium',\r\n THICK = 'thick',\r\n DOTTED = 'dotted',\r\n DASHED = 'dashed',\r\n DOUBLE = 'double',\r\n HAIR = 'hair',\r\n MEDIUM_DASHED = 'mediumDashed',\r\n DASH_DOT = 'dashDot',\r\n MEDIUM_DASH_DOT = 'mediumDashDot',\r\n DASH_DOT_DOT = 'dashDotDot',\r\n MEDIUM_DASH_DOT_DOT = 'mediumDashDotDot',\r\n SLANT_DASH_DOT = 'slantDashDot'\r\n}\r\n\r\n/**\r\n * Font style options\r\n */\r\nexport enum FontStyle {\r\n NORMAL = 'normal',\r\n BOLD = 'bold',\r\n ITALIC = 'italic',\r\n BOLD_ITALIC = 'bold italic'\r\n}\r\n\r\n/**\r\n * Color type - can be hex string, RGB object, or theme color\r\n */\r\nexport type Color = string | { r: number; g: number; b: number } | { theme: number };\r\n\r\n/**\r\n * Base cell properties interface\r\n */\r\nexport interface IBaseCell {\r\n /** Unique identifier for the cell */\r\n key: string;\r\n /** Cell data type */\r\n type: CellType;\r\n /** Cell value */\r\n value: CellValue;\r\n /** Optional cell reference (e.g., A1, B2) */\r\n reference?: string;\r\n /** Whether to merge this cell with others */\r\n mergeCell?: boolean;\r\n /** Number of columns to merge (if mergeCell is true) */\r\n mergeTo?: number;\r\n /** Row height for this cell */\r\n rowHeight?: number;\r\n /** Column width for this cell */\r\n colWidth?: number;\r\n /** Whether to move to next row after this cell */\r\n jump?: boolean;\r\n /** Hyperlink URL */\r\n link?: string;\r\n /** Excel formula */\r\n formula?: string;\r\n /** Number format for numeric cells */\r\n numberFormat?: NumberFormat | string;\r\n /** Custom number format string */\r\n customNumberFormat?: string;\r\n /** Whether the cell is protected */\r\n protected?: boolean;\r\n /** Whether the cell is hidden */\r\n hidden?: boolean;\r\n /** Cell comment */\r\n comment?: string;\r\n /** Data validation rules */\r\n validation?: IDataValidation;\r\n /** Optional styles for the cell */\r\n styles?: import('./style.types').IStyle;\r\n /** Legacy children cells */\r\n childrens?: IBaseCell[];\r\n /** Modern children cells */\r\n children?: IBaseCell[];\r\n}\r\n\r\n/**\r\n * Data validation interface\r\n */\r\nexport interface IDataValidation {\r\n /** Validation type */\r\n type: 'list' | 'whole' | 'decimal' | 'textLength' | 'date' | 'time' | 'custom';\r\n /** Validation operator */\r\n operator?: 'between' | 'notBetween' | 'equal' | 'notEqual' | 'greaterThan' | 'lessThan' | 'greaterThanOrEqual' | 'lessThanOrEqual';\r\n /** Validation formula or values */\r\n formula1?: string | number | Date;\r\n /** Second validation formula or value (for between/notBetween) */\r\n formula2?: string | number | Date;\r\n /** Whether to show error message */\r\n showErrorMessage?: boolean;\r\n /** Error message text */\r\n errorMessage?: string;\r\n /** Whether to show input message */\r\n showInputMessage?: boolean;\r\n /** Input message text */\r\n inputMessage?: string;\r\n /** Whether to allow blank values */\r\n allowBlank?: boolean;\r\n}\r\n\r\n/**\r\n * Workbook metadata interface\r\n */\r\nexport interface IWorkbookMetadata {\r\n /** Workbook author */\r\n author?: string;\r\n /** Workbook title */\r\n title?: string;\r\n /** Workbook subject */\r\n subject?: string;\r\n /** Workbook keywords */\r\n keywords?: string;\r\n /** Workbook category */\r\n category?: string;\r\n /** Workbook description */\r\n description?: string;\r\n /** Workbook company */\r\n company?: string;\r\n /** Workbook manager */\r\n manager?: string;\r\n /** Creation date */\r\n created?: Date;\r\n /** Last modified date */\r\n modified?: Date;\r\n /** Application name */\r\n application?: string;\r\n /** Application version */\r\n appVersion?: string;\r\n /** Hyperlink base */\r\n hyperlinkBase?: string;\r\n}\r\n\r\n/**\r\n * Error types for validation\r\n */\r\nexport enum ErrorType {\r\n VALIDATION_ERROR = 'VALIDATION_ERROR',\r\n BUILD_ERROR = 'BUILD_ERROR',\r\n STYLE_ERROR = 'STYLE_ERROR',\r\n WORKSHEET_ERROR = 'WORKSHEET_ERROR',\r\n CELL_ERROR = 'CELL_ERROR'\r\n}\r\n\r\n/**\r\n * Error interface\r\n */\r\nexport interface IError {\r\n type: ErrorType;\r\n message: string;\r\n code?: string;\r\n details?: Record<string, unknown>;\r\n stack?: string;\r\n}\r\n\r\n/**\r\n * Success result interface\r\n */\r\nexport interface ISuccessResult<T = unknown> {\r\n success: true;\r\n data: T;\r\n message?: string;\r\n}\r\n\r\n/**\r\n * Error result interface\r\n */\r\nexport interface IErrorResult {\r\n success: false;\r\n error: IError;\r\n}\r\n\r\n/**\r\n * Result union type\r\n */\r\nexport type Result<T = unknown> = ISuccessResult<T> | IErrorResult; ","import ExcelJS from 'exceljs';\nimport {\n IWorksheet,\n IWorksheetConfig,\n ITable\n} from '../types/worksheet.types';\nimport {\n IDataCell,\n IHeaderCell,\n IFooterCell\n} from '../types/cell.types';\nimport { IBuildOptions } from '../types/builder.types';\nimport { Result, ErrorType } from '../types/core.types';\n\n/**\n * Worksheet - Representa una hoja de cálculo dentro del builder\n *\n2 * Soporta headers, subheaders anidados, rows, footers, children y estilos por celda.\n */\nexport class Worksheet implements IWorksheet {\n public config: IWorksheetConfig;\n public tables: ITable[] = [];\n public currentRow = 1;\n public currentCol = 1;\n public headerPointers: Map<string, any> = new Map();\n public isBuilt = false;\n\n // Estructuras temporales para la tabla actual\n private headers: IHeaderCell[] = [];\n private subHeaders: IHeaderCell[] = [];\n private body: IDataCell[] = [];\n private footers: IFooterCell[] = [];\n\n constructor(config: IWorksheetConfig) {\n this.config = config;\n }\n\n /**\n * Agrega un header principal\n */\n addHeader(header: IHeaderCell): this {\n this.headers.push(header);\n return this;\n }\n\n /**\n * Agrega subheaders (ahora soporta anidación)\n */\n addSubHeaders(subHeaders: IHeaderCell[]): this {\n this.subHeaders.push(...subHeaders);\n return this;\n }\n\n /**\n * Agrega una fila de datos (puede ser jerárquica con childrens)\n */\n addRow(row: IDataCell[] | IDataCell): this {\n if (Array.isArray(row)) {\n this.body.push(...row);\n } else {\n this.body.push(row);\n }\n return this;\n }\n\n /**\n * Agrega un footer o varios\n */\n addFooter(footer: IFooterCell[] | IFooterCell): this {\n if (Array.isArray(footer)) {\n this.footers.push(...footer);\n } else {\n this.footers.push(footer);\n }\n return this;\n }\n\n /**\n * Crea una nueva tabla y la agrega al worksheet\n */\n addTable(tableConfig: Partial<ITable> = {}): this {\n const table: ITable = {\n name: tableConfig.name || `Table_${this.tables.length + 1}`,\n headers: tableConfig.headers || [],\n subHeaders: tableConfig.subHeaders || [],\n body: tableConfig.body || [],\n footers: tableConfig.footers || [],\n showBorders: tableConfig.showBorders !== false,\n showStripes: tableConfig.showStripes !== false,\n style: tableConfig.style || 'TableStyleLight1',\n ...tableConfig\n };\n \n this.tables.push(table);\n return this;\n }\n\n /**\n * Finaliza la tabla actual agregando todos los elementos temporales a la última tabla\n */\n finalizeTable(): this {\n if (this.tables.length === 0) {\n // Si no hay tablas, crear una nueva con los datos temporales\n this.addTable();\n }\n \n const currentTable = this.tables[this.tables.length - 1];\n if (!currentTable) {\n throw new Error('No se pudo obtener la tabla actual');\n }\n \n // Agregar headers, subheaders, body y footers a la tabla actual\n if (this.headers.length > 0) {\n currentTable.headers = [...(currentTable.headers || []), ...this.headers];\n }\n \n if (this.subHeaders.length > 0) {\n currentTable.subHeaders = [...(currentTable.subHeaders || []), ...this.subHeaders];\n }\n \n if (this.body.length > 0) {\n currentTable.body = [...(currentTable.body || []), ...this.body];\n }\n \n if (this.footers.length > 0) {\n currentTable.footers = [...(currentTable.footers || []), ...this.footers];\n }\n \n // Limpiar las estructuras temporales\n this.headers = [];\n this.subHeaders = [];\n this.body = [];\n this.footers = [];\n \n return this;\n }\n\n /**\n * Obtiene una tabla por nombre\n */\n getTable(name: string): ITable | undefined {\n return this.tables.find(table => table.name === name);\n }\n\n /**\n * Construye la hoja en el workbook de ExcelJS\n */\n async build(workbook: ExcelJS.Workbook, _options: IBuildOptions = {}): Promise<void> {\n const ws = workbook.addWorksheet(this.config.name, {\n properties: {\n defaultRowHeight: this.config.defaultRowHeight || 20,\n tabColor: this.config.tabColor as any\n },\n pageSetup: this.config.pageSetup as any\n });\n\n let rowPointer = 1;\n \n // Si hay tablas definidas, construir cada tabla\n if (this.tables.length > 0) {\n for (let i = 0; i < this.tables.length; i++) {\n const table = this.tables[i];\n if (table) {\n rowPointer = await this.buildTable(ws, table, rowPointer, i > 0);\n }\n }\n } else {\n // Construcción tradicional para compatibilidad hacia atrás\n rowPointer = await this.buildLegacyContent(ws, rowPointer);\n }\n \n this.isBuilt = true;\n }\n\n /**\n * Construye una tabla individual en el worksheet\n */\n private async buildTable(ws: ExcelJS.Worksheet, table: ITable, startRow: number, addSpacing: boolean = false): Promise<number> {\n let rowPointer = startRow;\n \n // Agregar espacio entre tablas si no es la primera\n if (addSpacing) {\n rowPointer += 2; // 2 filas de espacio\n }\n \n // Headers principales de la tabla\n if (table.headers && table.headers.length > 0) {\n for (const header of table.headers) {\n ws.addRow([header.value]);\n if (header.mergeCell) {\n const maxCols = this.calculateTableMaxColumns(table);\n ws.mergeCells(rowPointer, 1, rowPointer, maxCols);\n }\n if (header.styles) {\n ws.getRow(rowPointer).eachCell((cell: any) => {\n cell.style = this.convertStyle(header.styles);\n });\n }\n rowPointer++;\n }\n }\n \n // SubHeaders con soporte para anidación\n if (table.subHeaders && table.subHeaders.length > 0) {\n rowPointer = this.buildNestedHeaders(ws, rowPointer, table.subHeaders);\n }\n \n // Body (soporta children)\n if (table.body && table.body.length > 0) {\n for (const row of table.body) {\n rowPointer = this.addDataRowRecursive(ws, rowPointer, row);\n }\n }\n \n // Footers\n if (table.footers && table.footers.length > 0) {\n for (const footer of table.footers) {\n rowPointer = this.addFooterRow(ws, rowPointer, footer);\n }\n }\n \n // Aplicar estilo de tabla si está configurado\n if (table.showBorders || table.showStripes) {\n this.applyTableStyle(ws, table, startRow, rowPointer - 1);\n }\n \n return rowPointer;\n }\n\n /**\n * Construcción tradicional para compatibilidad hacia atrás\n */\n private async buildLegacyContent(ws: ExcelJS.Worksheet, startRow: number): Promise<number> {\n let rowPointer = startRow;\n \n // Headers principales\n if (this.headers.length > 0) {\n this.headers.forEach(header => {\n ws.addRow([header.value]);\n if (header.mergeCell) {\n ws.mergeCells(rowPointer, 1, rowPointer, (this.getMaxColumns() || 1));\n }\n if (header.styles) {\n ws.getRow(rowPointer).eachCell((cell: any) => {\n cell.style = this.convertStyle(header.styles);\n });\n }\n rowPointer++;\n });\n }\n \n // SubHeaders con soporte para anidación\n if (this.subHeaders.length > 0) {\n rowPointer = this.buildNestedHeaders(ws, rowPointer, this.subHeaders);\n }\n \n // Body (soporta children)\n for (const row of this.body) {\n rowPointer = this.addDataRowRecursive(ws, rowPointer, row);\n }\n \n // Footers\n if (this.footers.length > 0) {\n for (const footer of this.footers) {\n rowPointer = this.addFooterRow(ws, rowPointer, footer);\n }\n }\n \n return rowPointer;\n }\n\n /**\n * Calcula el número máximo de columnas para una tabla\n */\n private calculateTableMaxColumns(table: ITable): number {\n let maxCols = 0;\n \n if (table.subHeaders && table.subHeaders.length > 0) {\n for (const header of table.subHeaders) {\n maxCols += this.calculateHeaderColSpan(header);\n }\n }\n \n return maxCols || 1;\n }\n\n /**\n * Aplica el estilo de tabla a un rango específico\n */\n private applyTableStyle(ws: ExcelJS.Worksheet, table: ITable, startRow: number, endRow: number): void {\n const maxCols = this.calculateTableMaxColumns(table);\n \n // Aplicar bordes si está configurado\n if (table.showBorders) {\n for (let row = startRow; row <= endRow; row++) {\n for (let col = 1; col <= maxCols; col++) {\n const cell = ws.getRow(row).getCell(col);\n if (!cell.style) cell.style = {};\n if (!cell.style.border) {\n cell.style.border = {\n top: { style: 'thin', color: { argb: 'FF8EAADB' } },\n left: { style: 'thin', color: { argb: 'FF8EAADB' } },\n bottom: { style: 'thin', color: { argb: 'FF8EAADB' } },\n right: { style: 'thin', color: { argb: 'FF8EAADB' } }\n };\n }\n }\n }\n }\n \n // Aplicar rayas alternadas si está configurado\n if (table.showStripes) {\n for (let row = startRow; row <= endRow; row++) {\n if ((row - startRow) % 2 === 1) { // Filas impares (empezando desde 0)\n for (let col = 1; col <= maxCols; col++) {\n const cell = ws.getRow(row).getCell(col);\n if (!cell.style) cell.style = {};\n if (!cell.style.fill) {\n cell.style.fill = {\n type: 'pattern',\n pattern: 'solid',\n fgColor: { argb: 'FFF2F2F2' }\n };\n }\n }\n }\n }\n }\n }\n\n /**\n * Construye headers anidados recursivamente\n * @param ws - Worksheet de ExcelJS\n * @param startRow - Fila inicial\n * @param headers - Array de headers a procesar\n * @returns La siguiente fila disponible\n */\n private buildNestedHeaders(ws: ExcelJS.Worksheet, startRow: number, headers: IHeaderCell[]): number {\n let currentRow = startRow;\n const maxDepth = this.getMaxHeaderDepth(headers);\n \n // Crear filas para cada nivel de profundidad\n for (let depth = 0; depth < maxDepth; depth++) {\n // Crear la fila primero\n const row = ws.getRow(currentRow);\n \n // Procesar cada header en este nivel\n let colIndex = 1;\n for (const header of headers) {\n if (depth === 0) {\n // Nivel principal del header\n const headerInfo = this.getHeaderAtDepth(header, depth, colIndex);\n const cell = row.getCell(colIndex);\n cell.value = headerInfo.value;\n if (headerInfo.style) {\n cell.style = this.convertStyle(headerInfo.style);\n }\n colIndex += headerInfo.colSpan;\n } else {\n // Nivel de children - procesar todos los children directos\n if (header.children && header.children.length > 0) {\n for (const child of header.children) {\n const cell = row.getCell(colIndex);\n cell.value = typeof child.value === 'string' ? child.value : String(child.value || '');\n if (child.styles || header.styles) {\n cell.style = this.convertStyle(child.styles || header.styles);\n }\n colIndex += this.calculateHeaderColSpan(child);\n }\n } else {\n // Si no tiene children, agregar celda vacía\n const cell = row.getCell(colIndex);\n cell.value = null;\n colIndex += 1;\n }\n }\n }\n \n currentRow++;\n }\n \n // Aplicar todos los merges después de crear todas las filas\n this.applyAllMerges(ws, startRow, currentRow - 1, headers);\n \n return currentRow;\n }\n\n /**\n * Obtiene información del header en una profundidad específica\n */\n private getHeaderAtDepth(header: IHeaderCell, depth: number, startCol: number): {\n value: string | null;\n style: any;\n colSpan: number;\n mergeRange?: { start: number; end: number } | null;\n } {\n const colSpan = this.calculateHeaderColSpan(header);\n if (depth === 0) {\n // Nivel principal del header\n const mergeRange = colSpan > 1 ? { start: startCol, end: startCol + colSpan - 1 } : null;\n return {\n value: typeof header.value === 'string' ? header.value : String(header.value || ''),\n style: header.styles,\n colSpan,\n mergeRange: mergeRange\n };\n } else if (header.children && header.children.length > 0) {\n // Nivel de children\n const child = header.children[depth];\n if (child) {\n const childColSpan = this.calculateHeaderColSpan(child);\n // Los children también pueden hacer merge si tienen múltiples childrens\n const mergeRange = childColSpan > 1 ? { start: startCol, end: startCol + childColSpan - 1 } : null;\n \n return {\n value: typeof child.value === 'string' ? child.value : String(child.value || ''),\n style: child.styles || header.styles,\n colSpan: childColSpan,\n mergeRange: mergeRange\n };\n }\n }\n \n // Celda vacía para mantener alineación\n return {\n value: null,\n style: null,\n colSpan: 1\n };\n }\n\n\n\n\n /**\n * Aplica todos los merges (horizontales y verticales) después de crear todas las filas\n */\n private applyAllMerges(ws: ExcelJS.Worksheet, startRow: number, endRow: number, headers: IHeaderCell[]): void {\n const maxDepth = this.getMaxHeaderDepth(headers);\n \n // Solo aplicar merges si hay más de una fila de headers\n if (maxDepth <= 1) return;\n \n // Aplicar merges inteligentes basados en la estructura\n this.applySmartMerges(ws, startRow, endRow, headers);\n }\n\n /**\n * Aplica merges inteligentes basados en la estructura de headers\n */\n private applySmartMerges(ws: ExcelJS.Worksheet, startRow: number, endRow: number, headers: IHeaderCell[]): void {\n const maxDepth = this.getMaxHeaderDepth(headers);\n \n // Solo aplicar merges si hay más de una fila de headers\n if (maxDepth <= 1) return;\n \n // Aplicar merges para cada header\n let colIndex = 1;\n for (const header of headers) {\n this.applySmartMergesForHeader(ws, startRow, endRow, header, colIndex);\n colIndex += this.calculateHeaderColSpan(header);\n }\n }\n\n /**\n * Aplica merges inteligentes para un header específico\n */\n private applySmartMergesForHeader(ws: ExcelJS.Worksheet, startRow: number, endRow: number, header: IHeaderCell, startCol: number): void {\n const headerColSpan = this.calculateHeaderColSpan(header);\n \n if (!header.children || header.children.length === 0) {\n // Si no tiene children, hacer merge vertical desde la primera fila hasta la última\n ws.mergeCells(startRow, startCol, endRow, startCol + headerColSpan - 1);\n } else {\n // Si tiene children, aplicar merge horizontal en la primera fila\n if (headerColSpan > 1) {\n ws.mergeCells(startRow, startCol, startRow, startCol + headerColSpan - 1);\n }\n \n // Procesar children recursivamente\n let childColIndex = startCol;\n for (const child of header.children) {\n this.applySmartMergesForHeader(ws, startRow + 1, endRow, child, childColIndex);\n childColIndex += this.calculateHeaderColSpan(child);\n }\n }\n }\n\n\n \n /**\n * Calcula el span de columnas para un header\n */\n private calculateHeaderColSpan(header: IHeaderCell): number {\n if (!header.children || header.children.length === 0) {\n return 1;\n }\n \n return header.children.reduce((total, child) => {\n return total + this.calculateHeaderColSpan(child);\n }, 0);\n }\n\n /**\n * Obtiene la profundidad máxima de headers anidados\n */\n private getMaxHeaderDepth(headers: IHeaderCell[]): number {\n let maxDepth = 1;\n \n for (const header of headers) {\n if (header.children && header.children.length > 0) {\n const childDepth = this.getMaxHeaderDepth(header.children);\n maxDepth = Math.max(maxDepth, childDepth + 1);\n }\n }\n \n return maxDepth;\n }\n\n /**\n * Obtiene el número máximo de columnas\n */\n private getMaxColumns(): number {\n let maxCols = 0;\n \n for (const header of this.subHeaders) {\n maxCols += this.calculateHeaderColSpan(header);\n }\n \n return maxCols;\n }\n\n /**\n * Valida la hoja\n */\n validate(): Result<boolean> {\n if (!this.headers.length && !this.body.length) {\n return {\n success: false,\n error: {\n type: ErrorType.VALIDATION_ERROR,\n message: 'La hoja no tiene datos',\n }\n };\n }\n return { success: true, data: true };\n }\n\n /**\n * Calcula las posiciones de columnas para los datos basándose en la estructura de subheaders\n */\n private calculateDataColumnPositions(): { [key: string]: number } {\n const positions: { [key: string]: number } = {};\n let currentCol = 1;\n \n for (const header of this.subHeaders) {\n if (header.children && header.children.length > 0) {\n // Si el header tiene children, cada child ocupa una columna\n for (const child of header.children) {\n if (child.key) {\n positions[child.key] = currentCol;\n }\n if (child.value) {\n positions[String(child.value)] = currentCol;\n }\n currentCol++;\n }\n } else {\n // Si el header no tiene children, ocupa una columna\n if (header.key) {\n positions[header.key] = currentCol;\n }\n if (header.value) {\n positions[String(header.value)] = currentCol;\n }\n currentCol++;\n }\n }\n \n return positions;\n }\n\n /**\n * Agrega una fila de footer\n * @returns el siguiente rowPointer disponible\n */\n private addFooterRow(ws: ExcelJS.Worksheet, rowPointer: number, footer: IFooterCell): number {\n // Calcular las columnas basándose en la estructura de subheaders\n const columnPositions = this.calculateDataColumnPositions();\n \n // Buscar la columna correcta para el footer\n let footerColPosition: number | undefined;\n \n // Intentar encontrar por key primero\n if (footer.key && columnPositions[footer.key]) {\n footerColPosition = columnPositions[footer.key];\n }\n // Si no se encuentra por key, intentar por header\n else if (footer.header && columnPositions[footer.header]) {\n footerColPosition = columnPositions[footer.header];\n }\n \n // Si no se encuentra la posición, usar columna 1 por defecto\n if (footerColPosition === undefined) {\n footerColPosition = 1;\n }\n \n // Escribir el footer en la columna correcta\n const excelRow = ws.getRow(rowPointer);\n const footerCell = excelRow.getCell(footerColPosition);\n footerCell.value = footer.value;\n if (footer.styles) {\n footerCell.style = this.convertStyle(footer.styles);\n }\n if (footer.numberFormat) {\n footerCell.numFmt = footer.numberFormat;\n }\n \n // Aplicar merge si está configurado\n if (footer.mergeCell && footer.mergeTo) {\n ws.mergeCells(rowPointer, footerColPosition, rowPointer, footer.mergeTo);\n }\n \n // Si hay children, escribirlos en las columnas correspondientes\n if (footer.children && footer.children.length > 0) {\n for (const child of footer.children) {\n if (child) {\n // Buscar la columna correcta basándose en el header del child\n let colPosition: number | undefined;\n \n // Intentar encontrar por key primero\n if (child.key && columnPositions[child.key]) {\n colPosition = columnPositions[child.key];\n }\n // Si no se encuentra por key, intentar por header\n else if (child.header && columnPositions[child.header]) {\n colPosition = columnPositions[child.header];\n }\n \n if (colPosition !== undefined) {\n const childCell = excelRow.getCell(colPosition);\n childCell.value = child.value;\n if (child.styles) {\n childCell.style = this.convertStyle(child.styles);\n }\n if (child.numberFormat) {\n childCell.numFmt = child.numberFormat;\n }\n }\n }\n }\n }\n \n // Incrementar rowPointer solo si el footer tiene la propiedad jump\n if (footer.jump) {\n return rowPointer + 1;\n }\n \n return rowPointer;\n }\n\n /**\n * Agrega una fila de datos y sus children recursivamente\n * @returns el siguiente rowPointer disponible\n */\n private addDataRowRecursive(ws: ExcelJS.Worksheet, rowPointer: number, row: IDataCell): number {\n // Calcular las columnas basándose en la estructura de subheaders\n const columnPositions = this.calculateDataColumnPositions();\n\n // Buscar la columna correcta para el dato principal\n let mainColPosition: number | undefined;\n \n // Intentar encontrar por key primero\n if (row.key && columnPositions[row.key]) {\n mainColPosition = columnPositions[row.key];\n }\n // Si no se encuentra por key, intentar por header\n else if (row.header && columnPositions[row.header]) {\n mainColPosition = columnPositions[row.header];\n }\n \n // Si no se encuentra la posición, usar columna 1 por defecto\n if (mainColPosition === undefined) {\n mainColPosition = 1;\n }\n \n // Escribir el dato principal en la columna correcta\n const excelRow = ws.getRow(rowPointer);\n const mainCell = excelRow.getCell(mainColPosition);\n mainCell.value = row.value;\n if (row.styles) {\n mainCell.style = this.convertStyle(row.styles);\n }\n if (row.numberFormat) {\n mainCell.numFmt = row.numberFormat;\n }\n \n // Si hay children, escribirlos en las columnas correspondientes\n if (row.children && row.children.length > 0) {\n for (const child of row.children) {\n if (child) {\n // Buscar la columna correcta basándose en el header del child\n let colPosition: number | undefined;\n \n // Intentar encontrar por key primero\n if (child.key && columnPositions[child.key]) {\n colPosition = columnPositions[child.key];\n }\n // Si no se encuentra por key, intentar por header\n else if (child.header && columnPositions[child.header]) {\n colPosition = columnPositions[child.header];\n }\n \n if (colPosition !== undefined) {\n const childCell = excelRow.getCell(colPosition);\n childCell.value = child.value;\n if (child.styles) {\n childCell.style = this.convertStyle(child.styles);\n }\n if (child.numberFormat) {\n childCell.numFmt = child.numberFormat;\n }\n }\n }\n }\n }\n \n // Incrementar rowPointer solo si la celda tiene la propiedad jump\n if (row.jump) {\n return rowPointer + 1;\n }\n \n return rowPointer;\n }\n\n /**\n * Convierte el estilo personalizado a formato compatible con ExcelJS\n */\n private convertStyle(style: any): Partial<ExcelJS.Style> {\n if (!style) return {};\n \n const converted: Partial<ExcelJS.Style> = {};\n \n if (style.font) {\n converted.font = {\n name: style.font.family,\n size: style.font.size,\n bold: style.font.bold,\n italic: style.font.italic,\n underline: style.font.underline,\n color: style.font.color\n };\n }\n \n if (style.fill) {\n converted.fill = {\n type: style.fill.type,\n pattern: style.fill.pattern,\n fgColor: style.fill.foregroundColor,\n bgColor: style.fill.backgroundColor\n };\n }\n \n if (style.border) {\n converted.border = {\n top: style.border.top,\n left: style.border.left,\n bottom: style.border.bottom,\n right: style.border.right\n };\n }\n \n if (style.alignment) {\n converted.alignment = {\n horizontal: style.alignment.horizontal,\n vertical: style.alignment.vertical,\n wrapText: style.alignment.wrapText,\n indent: style.alignment.indent\n };\n }\n \n if (style.numFmt) {\n converted.numFmt = style.numFmt;\n }\n \n return converted;\n }\n}","/**\r\n * Builder-specific type definitions\r\n */\r\n\r\nimport { IWorkbookMetadata, Result } from './core.types';\r\nimport { IWorksheet, IWorksheetConfig } from './worksheet.types';\r\nimport { IStyle } from './style.types';\r\n\r\n// Re-export ErrorType for convenience\r\nexport { ErrorType } from './core.types';\r\n\r\n/**\r\n * Excel builder configuration interface\r\n */\r\nexport interface IExcelBuilderConfig {\r\n /** Workbook metadata */\r\n metadata?: IWorkbookMetadata;\r\n /** Default worksheet configuration */\r\n defaultWorksheetConfig?: Partial<IWorksheetConfig>;\r\n /** Default styles */\r\n defaultStyles?: {\r\n header?: IStyle;\r\n subheader?: IStyle;\r\n data?: IStyle;\r\n footer?: IStyle;\r\n total?: IStyle;\r\n };\r\n /** Whether to enable validation */\r\n enableValidation?: boolean;\r\n /** Whether to enable events */\r\n enableEvents?: boolean;\r\n /** Whether to enable performance monitoring */\r\n enablePerformanceMonitoring?: boolean;\r\n /** Maximum number of worksheets */\r\n maxWorksheets?: number;\r\n /** Maximum number of rows per worksheet */\r\n maxRowsPerWorksheet?: number;\r\n /** Maximum number of columns per worksheet */\r\n maxColumnsPerWorksheet?: number;\r\n /** Memory limit in bytes */\r\n memoryLimit?: number;\r\n}\r\n\r\n/**\r\n * Build options interface\r\n */\r\nexport interface IBuildOptions {\r\n /** Output format */\r\n format?: 'xlsx' | 'xls' | 'csv';\r\n /** Whether to include styles */\r\n includeStyles?: boolean;\r\n /** Whether to include formulas */\r\n includeFormulas?: boolean;\r\n /** Whether to include comments */\r\n includeComments?: boolean;\r\n /** Whether to include data validation */\r\n includeValidation?: boolean;\r\n /** Whether to include conditional formatting */\r\n includeConditionalFormatting?: boolean;\r\n /** Compression level (0-9) */\r\n compressionLevel?: number;\r\n /** Whether to optimize for size */\r\n optimizeForSize?: boolean;\r\n /** Whether to optimize for speed */\r\n optimizeForSpeed?: boolean;\r\n}\r\n\r\n/**\r\n * Download options interface\r\n */\r\nexport interface IDownloadOptions extends IBuildOptions {\r\n /** File name */\r\n fileName?: string;\r\n /** Whether to show download progress */\r\n showProgress?: boolean;\r\n /** Progress callback */\r\n onProgress?: (progress: number) => void;\r\n /** Whether to auto-download */\r\n autoDownload?: boolean;\r\n /** MIME type */\r\n mimeType?: string;\r\n}\r\n\r\n/**\r\n * Excel builder interface\r\n */\r\nexport interface IExcelBuilder {\r\n /** Builder configuration */\r\n config: IExcelBuilderConfig;\r\n /** Worksheets in the workbook */\r\n worksheets: Map<string, IWorksheet>;\r\n /** Current worksheet */\r\n currentWorksheet: IWorksheet | undefined;\r\n /** Whether the builder is building */\r\n isBuilding: boolean;\r\n /** Build statistics */\r\n stats: IBuildStats;\r\n\r\n /** Add a new worksheet */\r\n addWorksheet(name: string, config?: Partial<IWorksheetConfig>): IWorksheet;\r\n /** Get a worksheet by name */\r\n getWorksheet(name: string): IWorksheet | undefined;\r\n /** Remove a worksheet */\r\n removeWorksheet(name: string): boolean;\r\n /** Set the current worksheet */\r\n setCurrentWorksheet(name: string): boolean;\r\n /** Build the workbook */\r\n build(options?: IBuildOptions): Promise<Result<ArrayBuffer>>;\r\n /** Generate and download the file */\r\n generateAndDownload(fileName: string, options?: IDownloadOptions): Promise<Result<void>>;\r\n /** Get workbook as buffer */\r\n toBuffer(options?: IBuildOptions): Promise<Result<ArrayBuffer>>;\r\n /** Get workbook as blob */\r\n toBlob(options?: IBuildOptions): Promise<Result<Blob>>;\r\n /** Validate the workbook */\r\n validate(): Result<boolean>;\r\n /** Clear all worksheets */\r\n clear(): void;\r\n /** Get workbook statistics */\r\n getStats(): IBuildStats;\r\n}\r\n\r\n/**\r\n * Build statistics interface\r\n */\r\nexport interface IBuildStats {\r\n /** Total number of worksheets */\r\n totalWorksheets: number;\r\n /** Total number of cells */\r\n totalCells: number;\r\n /** Total memory usage in bytes */\r\n memoryUsage: number;\r\n /** Build time in milliseconds */\r\n buildTime: number;\r\n /** File size in bytes */\r\n fileSize: number;\r\n /** Number of styles used */\r\n stylesUsed: number;\r\n /** Number of formulas used */\r\n formulasUsed: number;\r\n /** Number of conditional formats used */\r\n conditionalFormatsUsed: number;\r\n /** Performance metrics */\r\n performance: {\r\n /** Time spent building headers */\r\n headersTime: number;\r\n /** Time spent building data */\r\n dataTime: number;\r\n /** Time spent applying styles */\r\n stylesTime: number;\r\n /** Time spent writing to buffer */\r\n writeTime: number;\r\n };\r\n}\r\n\r\n/**\r\n * Builder event types\r\n */\r\nexport enum BuilderEventType {\r\n WORKSHEET_ADDED = 'worksheetAdded',\r\n WORKSHEET_REMOVED = 'worksheetRemoved',\r\n WORKSHEET_UPDATED = 'worksheetUpdated',\r\n BUILD_STARTED = 'buildStarted',\r\n BUILD_PROGRESS = 'buildProgress',\r\n BUILD_COMPLETED = 'buildCompleted',\r\n BUILD_ERROR = 'buildError',\r\n DOWNLOAD_STARTED = 'downloadStarted',\r\n DOWNLOAD_PROGRESS = 'downloadProgress',\r\n DOWNLOAD_COMPLETED = 'downloadCompleted',\r\n DOWNLOAD_ERROR = 'downloadError'\r\n}\r\n\r\n/**\r\n * Builder event interface\r\n */\r\nexport interface IBuilderEvent {\r\n type: BuilderEventType;\r\n data?: Record<string, unknown>;\r\n timestamp: Date;\r\n}\r\n\r\n/**\r\n * Builder event listener interface\r\n */\r\nexport interface IBuilderEventListener {\r\n (event: IBuilderEvent): void;\r\n}\r\n\r\n/**\r\n * Builder validation result interface\r\n */\r\nexport interface IBuilderValidationResult {\r\n /** Whether the builder is valid */\r\n isValid: boolean;\r\n /** Validation errors */\r\n errors: string[];\r\n /** Validation warnings */\r\n warnings: string[];\r\n /** Worksheet validation results */\r\n worksheetResults: Map<string, boolean>;\r\n} ","/**\r\n * ExcelBuilder - Main class for creating Excel workbooks\r\n */\r\n\r\nimport ExcelJS from 'exceljs';\r\nimport saveAs from 'file-saver';\r\nimport { EventEmitter } from '../utils/EventEmitter';\r\nimport { Worksheet } from './Worksheet';\r\nimport {\r\n IExcelBuilder,\r\n IExcelBuilderConfig,\r\n IBuildOptions,\r\n IDownloadOptions,\r\n IBuildStats,\r\n BuilderEventType,\r\n IBuilderEvent,\r\n ErrorType\r\n} from '../types/builder.types';\r\nimport {\r\n IWorksheet,\r\n IWorksheetConfig\r\n} from '../types/worksheet.types';\r\nimport { \r\n Result,\r\n ISuccessResult,\r\n IErrorResult\r\n} from '../types/core.types';\r\n\r\n/**\r\n * ExcelBuilder class for creating Excel workbooks\r\n */\r\nexport class ExcelBuilder implements IExcelBuilder {\r\n public config: IExcelBuilderConfig;\r\n public worksheets: Map<string, IWorksheet> = new Map();\r\n public currentWorksheet: IWorksheet | undefined;\r\n public isBuilding = false;\r\n public stats: IBuildStats;\r\n\r\n private eventEmitter: EventEmitter;\r\n\r\n constructor(config: IExcelBuilderConfig = {}) {\r\n this.config = {\r\n enableValidation: true,\r\n enableEvents: true,\r\n enablePerformanceMonitoring: false,\r\n maxWorksheets: 255,\r\n maxRowsPerWorksheet: 1048576,\r\n maxColumnsPerWorksheet: 16384,\r\n memoryLimit: 100 * 1024 * 1024, // 100MB\r\n ...config\r\n };\r\n\r\n this.stats = this.initializeStats();\r\n this.eventEmitter = new EventEmitter();\r\n }\r\n\r\n /**\r\n * Add a new worksheet to the workbook\r\n */\r\n addWorksheet(name: string, worksheetConfig: Partial<IWorksheetConfig> = {}): IWorksheet {\r\n if (this.worksheets.has(name)) {\r\n throw new Error(`Worksheet \"${name}\" already exists`);\r\n }\r\n\r\n const config: IWorksheetConfig = {\r\n name,\r\n defaultRowHeight: 20,\r\n defaultColWidth: 10,\r\n ...this.config.defaultWorksheetConfig,\r\n ...worksheetConfig\r\n };\r\n\r\n const worksheet = new Worksheet(config);\r\n this.worksheets.set(name, worksheet);\r\n this.currentWorksheet = worksheet;\r\n \r\n this.emitEvent(BuilderEventType.WORKSHEET_ADDED, { worksheetName: name });\r\n \r\n return worksheet;\r\n }\r\n\r\n /**\r\n * Get a worksheet by name\r\n */\r\n getWorksheet(name: string): IWorksheet | undefined {\r\n return this.worksheets.get(name);\r\n }\r\n\r\n /**\r\n * Remove a worksheet by name\r\n */\r\n removeWorksheet(name: string): boolean {\r\n const worksheet = this.worksheets.get(name);\r\n if (!worksheet) {\r\n return false;\r\n }\r\n\r\n this.worksheets.delete(name);\r\n \r\n // If this was the current worksheet, clear it\r\n if (this.currentWorksheet === worksheet) {\r\n this.currentWorksheet = undefined;\r\n }\r\n \r\n this.emitEvent(BuilderEventType.WORKSHEET_REMOVED, { worksheetName: name });\r\n \r\n return true;\r\n }\r\n\r\n /**\r\n * Set the current worksheet\r\n */\r\n setCurrentWorksheet(name: string): boolean {\r\n const worksheet = this.worksheets.get(name);\r\n if (!worksheet) {\r\n return false;\r\n }\r\n \r\n this.currentWorksheet = worksheet;\r\n return true;\r\n }\r\n\r\n /**\r\n * Build the workbook and return as ArrayBuffer\r\n */\r\n async build(options: IBuildOptions = {}): Promise<Result<ArrayBuffer>> {\r\n if (this.isBuilding) {\r\n return {\r\n success: false,\r\n error: {\r\n type: ErrorType.BUILD_ERROR,\r\n message: 'Build already in progress',\r\n stack: new Error().stack || ''\r\n }\r\n };\r\n }\r\n\r\n this.isBuilding = true;\r\n const startTime = Date.now();\r\n \r\n try {\r\n this.emitEvent(BuilderEventType.BUILD_STARTED);\r\n \r\n const workbook = new ExcelJS.Workbook();\r\n \r\n // Add metadata\r\n if (this.config.metadata) {\r\n workbook.creator = this.config.metadata.author || 'Han Excel Builder';\r\n workbook.lastModifiedBy = this.config.metadata.author || 'Han Excel Builder';\r\n workbook.created = this.config.metadata.created || new Date();\r\n workbook.modified = this.config.metadata.modified || new Date();\r\n if (this.config.metadata.title) workbook.title = this.config.metadata.title;\r\n if (this.config.metadata.subject) workbook.subject = this.config.metadata.subject;\r\n if (this.config.metadata.keywords) workbook.keywords = this.config.metadata.keywords;\r\n if (this.config.metadata.category) workbook.category = this.config.metadata.category;\r\n if (this.config.metadata.description) workbook.description = this.config.metadata.description;\r\n }\r\n\r\n // Build each worksheet\r\n for (const worksheet of this.worksheets.values()) {\r\n await (worksheet as Worksheet).build(workbook, options);\r\n }\r\n\r\n // Write to buffer\r\n const buffer = await workbook.xlsx.writeBuffer({\r\n compression: options.compressionLevel || 6\r\n } as any);\r\n\r\n const endTime = Date.now();\r\n this.stats.buildTime = endTime - startTime;\r\n this.stats.fileSize = buffer.byteLength;\r\n \r\n const successResult: ISuccessResult<ArrayBuffer> = {\r\n success: true,\r\n data: buffer\r\n };\r\n\r\n this.emitEvent(BuilderEventType.BUILD_COMPLETED, {\r\n buildTime: this.stats.buildTime,\r\n fileSize: this.stats.fileSize\r\n });\r\n\r\n return successResult;\r\n\r\n } catch (error) {\r\n const errorResult: IErrorResult = {\r\n success: false,\r\n error: {\r\n type: ErrorType.BUILD_ERROR,\r\n message: error instanceof Error ? error.message : 'Unknown build error',\r\n stack: error instanceof Error ? error.stack || '' : ''\r\n }\r\n };\r\n\r\n this.emitEvent(BuilderEventType.BUILD_ERROR, { error: errorResult.error });\r\n return errorResult;\r\n\r\n } finally {\r\n this.isBuilding = false;\r\n }\r\n }\r\n\r\n /**\r\n * Generate and download the file\r\n */\r\n async generateAndDownload(fileName: string, options: IDownloadOptions = {}): Promise<Result<void>> {\r\n const buildResult = await this.build(options);\r\n \r\n if (!buildResult.success) {\r\n return buildResult;\r\n }\r\n\r\n try {\r\n this.emitEvent(BuilderEventType.DOWNLOAD_STARTED, { fileName });\r\n \r\n const blob = new Blob([buildResult.data], { \r\n type: options.mimeType || 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' \r\n });\r\n \r\n saveAs(blob, fileName);\r\n \r\n this.emitEvent(BuilderEventType.DOWNLOAD_COMPLETED, { fileName });\r\n \r\n return { success: true, data: undefined };\r\n\r\n } catch (error) {\r\n const errorResult: IErrorResult = {\r\n success: false,\r\n error: {\r\n type: ErrorType.BUILD_ERROR,\r\n message: error instanceof Error ? error.message : 'Download failed',\r\n stack: error instanceof Error ? error.stack || '' : ''\r\n }\r\n };\r\n\r\n this.emitEvent(BuilderEventType.DOWNLOAD_ERROR, { error: errorResult.error });\r\n return errorResult;\r\n }\r\n }\r\n\r\n /**\r\n * Get workbook as buffer\r\n */\r\n async toBuffer(options: IBuildOptions = {}): Promise<Result<ArrayBuffer>> {\r\n return this.build(options);\r\n }\r\n\r\n /**\r\n * Get workbook as blob\r\n */\r\n async toBlob(options: IBuildOptions = {}): Promise<Result<Blob>> {\r\n const buildResult = await this.build(options);\r\n \r\n if (!buildResult.success) {\r\n return buildResult;\r\n }\r\n\r\n const blob = new Blob([buildResult.data], { \r\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' \r\n });\r\n \r\n return { success: true, data: blob };\r\n }\r\n\r\n /**\r\n * Validate the workbook\r\n */\r\n validate(): Result<boolean> {\r\n const errors: string[] = [];\r\n \r\n if (this.worksheets.size === 0) {\r\n errors.push('No worksheets found');\r\n }\r\n\r\n // Validate each worksheet\r\n for (const [name, worksheet] of this.worksheets.entries()) {\r\n const worksheetValidation = (worksheet as Worksheet).validate();\r\n if (!worksheetValidation.success) {\r\n errors.push(`Worksheet \"${name}\": ${worksheetValidation.error?.message}`);\r\n }\r\n }\r\n\r\n if (errors.length > 0) {\r\n return {\r\n success: false,\r\n error: {\r\n type: ErrorType.VALIDATION_ERROR,\r\n message: errors.join('; '),\r\n stack: new Error().stack || ''\r\n }\r\n };\r\n }\r\n\r\n return { success: true, data: true };\r\n }\r\n\r\n /**\r\n * Clear all worksheets\r\n */\r\n clear(): void {\r\n this.worksheets.clear();\r\n this.currentWorksheet = undefined;\r\n }\r\n\r\n /**\r\n * Get workbook statistics\r\n */\r\n getStats(): IBuildStats {\r\n return { ...this.stats };\r\n }\r\n\r\n /**\r\n * Event handling methods\r\n */\r\n on(eventType: BuilderEventType, listener: (event: IBuilderEvent) => void): string {\r\n return this.eventEmitter.on(eventType, listener);\r\n }\r\n\r\n off(eventType: BuilderEventType, listenerId: string): boolean {\r\n return this.eventEmitter.off(eventType, listenerId);\r\n }\r\n\r\n removeAllListeners(eventType?: BuilderEventType): void {\r\n if (eventType) {\r\n this.eventEmitter.offAll(eventType);\r\n } else {\r\n this.eventEmitter.clear();\r\n }\r\n }\r\n\r\n /**\r\n * Private methods\r\n */\r\n private emitEvent(type: BuilderEventType, data?: Record<string, unknown>): void {\r\n const event: IBuilderEvent = {\r\n type,\r\n data: data || {},\r\n timestamp: new Date()\r\n };\r\n this.eventEmitter.emitSync(event);\r\n }\r\n\r\n private initializeStats(): IBuildStats {\r\n return {\r\n totalWorksheets: 0,\r\n totalCells: 0,\r\n memoryUsage: 0,\r\n buildTime: 0,\r\n fileSize: 0,\r\n stylesUsed: 0,\r\n formulasUsed: 0,\r\n conditionalFormatsUsed: 0,\r\n performance: {\r\n headersTime: 0,\r\n dataTime: 0,\r\n stylesTime: 0,\r\n writeTime: 0\r\n }\r\n };\r\n }\r\n} ","/**\r\n * StyleBuilder - Fluent API for creating Excel styles\r\n */\r\n\r\nimport {\r\n IStyle,\r\n IBorder,\r\n IConditionalFormat,\r\n IStyleBuilder as IStyleBuilderInterface\r\n} from '../types/style.types';\r\nimport { \r\n Color, \r\n HorizontalAlignment,\r\n VerticalAlignment,\r\n BorderStyle, \r\n FontStyle \r\n} from '../types/core.types';\r\n\r\n/**\r\n * StyleBuilder class providing a fluent API for creating Excel styles\r\n */\r\nexport class StyleBuilder implements IStyleBuilderInterface {\r\n private style: Partial<IStyle> = {};\r\n\r\n constructor() {\r\n // Configuración por defecto: wrapText true y alineación al centro\r\n this.style.alignment = {\r\n horizontal: HorizontalAlignment.CENTER,\r\n vertical: VerticalAlignment.MIDDLE,\r\n wrapText: true,\r\n shrinkToFit: true\r\n };\r\n }\r\n\r\n /**\r\n * Create a new StyleBuilder instance\r\n */\r\n static create(): StyleBuilder {\r\n return new StyleBuilder();\r\n }\r\n\r\n /**\r\n * Set font name\r\n */\r\n fontName(name: string): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.name = name;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set font size\r\n */\r\n fontSize(size: number): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.size = size;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set font style\r\n */\r\n fontStyle(style: FontStyle): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.style = style;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set font color\r\n */\r\n fontColor(color: Color): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.color = color;\r\n return this;\r\n }\r\n\r\n /**\r\n * Make font bold\r\n */\r\n fontBold(): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.bold = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Make font italic\r\n */\r\n fontItalic(): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.italic = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Make font underlined\r\n */\r\n fontUnderline(): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.underline = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set border on all sides\r\n */\r\n border(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.top = border;\r\n this.style.border.left = border;\r\n this.style.border.bottom = border;\r\n this.style.border.right = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set top border\r\n */\r\n borderTop(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.top = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set left border\r\n */\r\n borderLeft(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.left = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set bottom border\r\n */\r\n borderBottom(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.bottom = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set right border\r\n */\r\n borderRight(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.right = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set background color\r\n */\r\n backgroundColor(color: Color): StyleBuilder {\r\n if (!this.style.fill) {\r\n this.style.fill = { type: 'pattern' };\r\n }\r\n this.style.fill.backgroundColor = color;\r\n this.style.fill.pattern = 'solid';\r\n return this;\r\n }\r\n\r\n /**\r\n * Set horizontal alignment\r\n */\r\n horizontalAlign(alignment: HorizontalAlignment): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.horizontal = alignment;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set vertical alignment\r\n */\r\n verticalAlign(alignment: VerticalAlignment): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.vertical = alignment;\r\n return this;\r\n }\r\n\r\n /**\r\n * Center align text\r\n */\r\n centerAlign(): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.horizontal = HorizontalAlignment.CENTER;\r\n this.style.alignment.vertical = VerticalAlignment.MIDDLE;\r\n return this;\r\n }\r\n\r\n /**\r\n * Left align text\r\n */\r\n leftAlign(): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.horizontal = HorizontalAlignment.LEFT;\r\n return this;\r\n }\r\n\r\n /**\r\n * Right align text\r\n */\r\n rightAlign(): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.horizontal = HorizontalAlignment.RIGHT;\r\n return this;\r\n }\r\n\r\n /**\r\n * Wrap text\r\n */\r\n wrapText(): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.wrapText = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set number format\r\n */\r\n numberFormat(format: string): StyleBuilder {\r\n this.style.numberFormat = format;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set striped rows\r\n */\r\n striped(): StyleBuilder {\r\n this.style.striped = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Add conditional formatting\r\n */\r\n conditionalFormat(format: IConditionalFormat): StyleBuilder {\r\n if (!this.style.conditionalFormats) {\r\n this.style.conditionalFormats = [];\r\n }\r\n this.style.conditionalFormats.push(format);\r\n return this;\r\n }\r\n\r\n /**\r\n * Build the final style\r\n */\r\n build(): IStyle {\r\n return this.style as IStyle;\r\n }\r\n\r\n /**\r\n * Reset the builder\r\n */\r\n reset(): StyleBuilder {\r\n this.style = {};\r\n // Restaurar configuración por defecto\r\n this.style.alignment = {\r\n horizontal: HorizontalAlignment.CENTER,\r\n vertical: VerticalAlignment.MIDDLE,\r\n wrapText: true\r\n };\r\n return this;\r\n }\r\n\r\n /**\r\n * Clone the current style\r\n */\r\n clone(): StyleBuilder {\r\n const cloned = new StyleBuilder();\r\n cloned.style = JSON.parse(JSON.stringify(this.style));\r\n return cloned;\r\n }\r\n} ","/**\r\n * Cell-specific type definitions\r\n */\r\n\r\nimport { IBaseCell } from './core.types';\r\nimport type { CellValue } from 'exceljs';\r\n\r\n/**\r\n * Header cell interface\r\n */\r\nexport interface IHeaderCell extends IBaseCell {\r\n /** Reference to parent header key */\r\n mainHeaderKey?: string;\r\n /** Child headers */\r\n children?: IHeaderCell[];\r\n /** Whether this is a main header */\r\n isMainHeader?: boolean;\r\n /** Header level (1 = main, 2 = sub, etc.) */\r\n level?: number;\r\n}\r\n\r\n/**\r\n * Data cell interface\r\n */\r\nexport interface IDataCell extends IBaseCell {\r\n /** Reference to header key */\r\n header: string;\r\n /** Reference to main header key */\r\n mainHeaderKey?: string;\r\n /** Child data cells */\r\n children?: IDataCell[];\r\n /** Whether this cell has alternating row color */\r\n striped?: boolean;\r\n /** Row index */\r\n rowIndex?: number;\r\n /** Column index */\r\n colIndex?: number;\r\n}\r\n\r\n/**\r\n * Footer cell interface\r\n */\r\nexport interface IFooterCell extends IBaseCell {\r\n /** Reference to header key */\r\n header: string;\r\n /** Child footer cells */\r\n children?: IDataCell[];\r\n /** Whether this is a total row */\r\n isTotal?: boolean;\r\n /** Footer type */\r\n footerType?: 'total' | 'subtotal' | 'average' | 'count' | 'custom';\r\n}\r\n\r\n/**\r\n * Cell position interface\r\n */\r\nexport interface ICellPosition {\r\n /** Row index (1-based) */\r\n row: number;\r\n /** Column index (1-based) */\r\n col: number;\r\n /** Cell reference (e.g., A1) */\r\n reference: string;\r\n}\r\n\r\n/**\r\n * Cell range interface\r\n */\r\nexport interface ICellRange {\r\n /** Start position */\r\n start: ICellPosition;\r\n /** End position */\r\n end: ICellPosition;\r\n /** Range reference (e.g., A1:B10) */\r\n reference: string;\r\n}\r\n\r\n/**\r\n * Cell data for different types\r\n */\r\nexport interface ICellData {\r\n /** String cell data */\r\n string?: {\r\n value: string;\r\n maxLength?: number;\r\n trim?: boolean;\r\n };\r\n /** Number cell data */\r\n number?: {\r\n value: number;\r\n min?: number;\r\n max?: number;\r\n precision?: number;\r\n allowNegative?: boolean;\r\n };\r\n /** Date cell data */\r\n date?: {\r\n value: Date;\r\n min?: Date;\r\n max?: Date;\r\n format?: string;\r\n };\r\n /** Boolean cell data */\r\n boolean?: {\r\n value: boolean;\r\n trueText?: string;\r\n falseText?: string;\r\n };\r\n /** Percentage cell data */\r\n percentage?: {\r\n value: number;\r\n min?: number;\r\n max?: number;\r\n precision?: number;\r\n showSymbol?: boolean;\r\n };\r\n /** Currency cell data */\r\n currency?: {\r\n value: number;\r\n currency?: string;\r\n precision?: number;\r\n showSymbol?: boolean;\r\n };\r\n /** Link cell data */\r\n link?: {\r\n value: string;\r\n text?: string;\r\n tooltip?: string;\r\n };\r\n /** Formula cell data */\r\n formula?: {\r\n value: string;\r\n result?: CellValue;\r\n };\r\n}\r\n\r\n/**\r\n * Cell validation result\r\n */\r\nexport interface ICellValidationResult {\r\n /** Whether the cell is valid */\r\n isValid: boolean;\r\n /** Validation errors */\r\n errors: string[];\r\n /** Validation warnings */\r\n warnings: string[];\r\n}\r\n\r\n/**\r\n * Cell event types\r\n */\r\nexport enum CellEventType {\r\n CREATED = 'created',\r\n UPDATED = 'updated',\r\n DELETED = 'deleted',\r\n STYLED = 'styled',\r\n VALIDATED = 'validated'\r\n}\r\n\r\n/**\r\n * Cell event interface\r\n */\r\nexport interface ICellEvent {\r\n type: CellEventType;\r\n cell: IDataCell | IHeaderCell | IFooterCell;\r\n position: ICellPosition;\r\n timestamp: Date;\r\n data?: Record<string, unknown>;\r\n} ","/**\n * Worksheet-specific type definitions\n */\n\nimport { IHeaderCell, IDataCell, IFooterCell, ICellPosition, ICellRange } from './cell.types';\nimport { Color, Result } from './core.types';\n\n/**\n * Worksheet configuration interface\n */\nexport interface IWorksheetConfig {\n /** Worksheet name */\n name: string;\n /** Tab color */\n tabColor?: Color;\n /** Default row height */\n defaultRowHeight?: number;\n /** Default column width */\n defaultColWidth?: number;\n /** Whether the worksheet is hidden */\n hidden?: boolean;\n /** Whether the worksheet is protected */\n protected?: boolean;\n /** Protection password */\n protectionPassword?: string;\n /** Whether to show grid lines */\n showGridLines?: boolean;\n /** Whether to show row and column headers */\n showRowColHeaders?: boolean;\n /** Zoom level (1-400) */\n zoom?: number;\n /** Freeze panes position */\n freezePanes?: ICellPosition;\n /** Print area */\n printArea?: ICellRange;\n /** Fit to page settings */\n fitToPage?: {\n fitToWidth?: number;\n fitToHeight?: number;\n };\n /** Page setup */\n pageSetup?: {\n orientation?: 'portrait' | 'landscape';\n paperSize?: number;\n fitToPage?: boolean;\n fitToWidth?: number;\n fitToHeight?: number;\n scale?: number;\n horizontalCentered?: boolean;\n verticalCentered?: boolean;\n margins?: {\n top?: number;\n left?: number;\n bottom?: number;\n right?: number;\n header?: number;\n footer?: number;\n };\n };\n}\n\n/**\n * Table structure interface\n */\nexport interface ITable {\n /** Table name */\n name?: string;\n /** Table headers */\n headers?: IHeaderCell[];\n /** Table sub-headers */\n subHeaders?: IHeaderCell[];\n /** Table data rows */\n body?: IDataCell[];\n /** Table footers */\n footers?: IFooterCell[];\n /** Table range */\n range?: ICellRange;\n /** Whether to show table borders */\n showBorders?: boolean;\n /** Whether to show alternating row colors */\n showStripes?: boolean;\n /** Table style */\n style?: 'TableStyleLight1' | 'TableStyleLight2' | 'TableStyleMedium1' | 'TableStyleMedium2' | 'TableStyleDark1' | 'TableStyleDark2';\n}\n\n/**\n * Worksheet interface\n */\nexport interface IWorksheet {\n /** Worksheet configuration */\n config: IWorksheetConfig;\n /** Tables in the worksheet */\n tables: ITable[];\n /** Current row pointer */\n currentRow: number;\n /** Current column pointer */\n currentCol: number;\n /** Header pointers for navigation */\n headerPointers: Map<string, ICellPosition>;\n /** Whether the worksheet has been built */\n isBuilt: boolean;\n\n /** Add a header */\n addHeader(header: IHeaderCell): this;\n /** Add subheaders */\n addSubHeaders(subHeaders: IHeaderCell[]): this;\n /** Add a row or rows */\n addRow(row: IDataCell[] | IDataCell): this;\n /** Add a footer or footers */\n addFooter(footer: IFooterCell[] | IFooterCell): this;\n /** Add a new table to the worksheet */\n addTable(tableConfig?: Partial<ITable>): this;\n /** Finalize the current table with temporary data */\n finalizeTable(): this;\n /** Get a table by name */\n getTable(name: string): ITable | undefined;\n /** Build the worksheet */\n build(workbook: any, options?: any): Promise<void>;\n /** Validate the worksheet */\n validate(): Result<boolean>;\n}\n\n/**\n * Worksheet event types\n */\nexport enum WorksheetEventType {\n CREATED = 'created',\n UPDATED = 'updated',\n DELETED = 'deleted',\n TABLE_ADDED = 'tableAdded',\n TABLE_REMOVED = 'tableRemoved',\n CELL_ADDED = 'cellAdded',\n CELL_UPDATED = 'cellUpdated',\n CELL_DELETED = 'cellDeleted'\n}\n\n/**\n * Worksheet event interface\n */\nexport interface IWorksheetEvent {\n type: WorksheetEventType;\n worksheet: IWorksheet;\n data?: Record<string, unknown>;\n timestamp: Date;\n}\n\n/**\n * Worksheet validation result\n */\nexport interface IWorksheetValidationResult {\n /** Whether the worksheet is valid */\n isValid: boolean;\n /** Validation errors */\n errors: string[];\n /** Validation warnings */\n warnings: string[];\n /** Cell validation results */\n cellResults: Map<string, boolean>;\n}\n\n/**\n * Worksheet statistics\n */\nexport interface IWorksheetStats {\n /** Total number of cells */\n totalCells: number;\n /** Number of header cells */\n headerCells: number;\n /** Number of data cells */\n dataCells: number;\n /** Number of footer cells */\n footerCells: number;\n /** Number of tables */\n tables: number;\n /** Used range */\n usedRange: ICellRange;\n /** Memory usage in bytes */\n memoryUsage: number;\n} ","/**\r\n * Style-specific type definitions\r\n */\r\n\r\nimport { \r\n Color, \r\n HorizontalAlignment, \r\n VerticalAlignment, \r\n BorderStyle, \r\n FontStyle \r\n} from './core.types';\r\n\r\n/**\r\n * Font configuration interface\r\n */\r\nexport interface IFont {\r\n /** Font name */\r\n name?: string;\r\n /** Font size */\r\n size?: number;\r\n /** Font style */\r\n style?: FontStyle;\r\n /** Font color */\r\n color?: Color;\r\n /** Whether the font is bold */\r\n bold?: boolean;\r\n /** Whether the font is italic */\r\n italic?: boolean;\r\n /** Whether the font is underlined */\r\n underline?: boolean;\r\n /** Whether the font is strikethrough */\r\n strikethrough?: boolean;\r\n /** Font family */\r\n family?: string;\r\n /** Font scheme */\r\n scheme?: 'major' | 'minor' | 'none';\r\n}\r\n\r\n/**\r\n * Border configuration interface\r\n */\r\nexport interface IBorder {\r\n /** Border style */\r\n style?: BorderStyle;\r\n /** Border color */\r\n color?: Color;\r\n /** Border width */\r\n width?: number;\r\n}\r\n\r\n/**\r\n * Border sides interface\r\n */\r\nexport interface IBorderSides {\r\n /** Top border */\r\n top?: IBorder;\r\n /** Left border */\r\n left?: IBorder;\r\n /** Bottom border */\r\n bottom?: IBorder;\r\n /** Right border */\r\n right?: IBorder;\r\n /** Diagonal border */\r\n diagonal?: IBorder;\r\n /** Diagonal direction */\r\n diagonalDirection?: 'up' | 'down' | 'both';\r\n}\r\n\r\n/**\r\n * Fill pattern interface\r\n */\r\nexport interface IFill {\r\n /** Fill type */\r\n type: 'pattern' | 'gradient';\r\n /** Pattern type (for pattern fills) */\r\n pattern?: 'none' | 'solid' | 'darkGray' | 'mediumGray' | 'lightGray' | 'gray125' | 'gray0625' | 'darkHorizontal' | 'darkVertical' | 'darkDown' | 'darkUp' | 'darkGrid' | 'darkTrellis' | 'lightHorizontal' | 'lightVertical' | 'lightDown' | 'lightUp' | 'lightGrid' | 'lightTrellis';\r\n /** Background color */\r\n backgroundColor?: Color;\r\n /** Foreground color */\r\n foregroundColor?: Color;\r\n /** Gradient type (for gradient fills) */\r\n gradient?: 'linear' | 'path';\r\n /** Gradient stops */\r\n stops?: Array<{\r\n position: number;\r\n color: Color;\r\n }>;\r\n /** Gradient angle (for linear gradients) */\r\n angle?: number;\r\n}\r\n\r\n/**\r\n * Alignment configuration interface\r\n */\r\nexport interface IAlignment {\r\n /** Horizontal alignment */\r\n horizontal?: HorizontalAlignment;\r\n /** Vertical alignment */\r\n vertical?: VerticalAlignment;\r\n /** Text rotation (0-180 degrees) */\r\n textRotation?: number;\r\n /** Whether to wrap text */\r\n wrapText?: boolean;\r\n /** Whether to shrink text to fit */\r\n shrinkToFit?: boolean;\r\n /** Indent level */\r\n indent?: number;\r\n /** Whether to merge cells */\r\n mergeCell?: boolean;\r\n /** Reading order */\r\n readingOrder?: 'left-to-right' | 'right-to-left';\r\n}\r\n\r\n/**\r\n * Protection configuration interface\r\n */\r\nexport interface IProtection {\r\n /** Whether the cell is locked */\r\n locked?: boolean;\r\n /** Whether the cell is hidden */\r\n hidden?: boolean;\r\n}\r\n\r\n/**\r\n * Conditional formatting interface\r\n */\r\nexport interface IConditionalFormat {\r\n /** Condition type */\r\n type: 'cellIs' | 'containsText' | 'beginsWith' | 'endsWith' | 'containsBlanks' | 'notContainsBlanks' | 'containsErrors' | 'notContainsErrors' | 'timePeriod' | 'top' | 'bottom' | 'aboveAverage' | 'belowAverage' | 'duplicateValues' | 'uniqueValues' | 'expression' | 'colorScale' | 'dataBar' | 'iconSet';\r\n /** Condition operator */\r\n operator?: 'between' | 'notBetween' | 'equal' | 'notEqual' | 'greaterThan' | 'lessThan' | 'greaterThanOrEqual' | 'lessThanOrEqual';\r\n /** Condition values */\r\n values?: Array<string | number | Date>;\r\n /** Condition formula */\r\n formula?: string;\r\n /** Style to apply when condition is met */\r\n style?: IStyle;\r\n /** Priority of the condition */\r\n priority?: number;\r\n /** Whether to stop if true */\r\n stopIfTrue?: boolean;\r\n}\r\n\r\n/**\r\n * Main style interface\r\n */\r\nexport interface IStyle {\r\n /** Font configuration */\r\n font?: IFont;\r\n /** Border configuration */\r\n border?: IBorderSides;\r\n /** Fill configuration */\r\n fill?: IFill;\r\n /** Alignment configuration */\r\n alignment?: IAlignment;\r\n /** Protection configuration */\r\n protection?: IProtection;\r\n /** Conditional formatting */\r\n conditionalFormats?: IConditionalFormat[];\r\n /** Number format */\r\n numberFormat?: string;\r\n /** Whether to apply alternating row colors */\r\n striped?: boolean;\r\n /** Custom CSS-like properties */\r\n custom?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Style preset types\r\n */\r\nexport enum StylePreset {\r\n HEADER = 'header',\r\n SUBHEADER = 'subheader',\r\n DATA = 'data',\r\n FOOTER = 'footer',\r\n TOTAL = 'total',\r\n HIGHLIGHT = 'highlight',\r\n WARNING = 'warning',\r\n ERROR = 'error',\r\n SUCCESS = 'success',\r\n INFO = 'info'\r\n}\r\n\r\n/**\r\n * Style theme interface\r\n */\r\nexport interface IStyleTheme {\r\n /** Theme name */\r\n name: string;\r\n /** Theme description */\r\n description?: string;\r\n /** Color palette */\r\n colors: {\r\n primary: Color;\r\n secondary: Color;\r\n accent: Color;\r\n background: Color;\r\n text: Color;\r\n border: Color;\r\n success: Color;\r\n warning: Color;\r\n error: Color;\r\n info: Color;\r\n };\r\n /** Font family */\r\n fontFamily: string;\r\n /** Base font size */\r\n fontSize: number;\r\n /** Style presets */\r\n presets: Record<StylePreset, IStyle>;\r\n}\r\n\r\n/**\r\n * Style builder interface\r\n */\r\nexport interface IStyleBuilder {\r\n /** Set font name */\r\n fontName(name: string): IStyleBuilder;\r\n /** Set font size */\r\n fontSize(size: number): IStyleBuilder;\r\n /** Set font style */\r\n fontStyle(style: FontStyle): IStyleBuilder;\r\n /** Set font color */\r\n fontColor(color: Color): IStyleBuilder;\r\n /** Make font bold */\r\n fontBold(): IStyleBuilder;\r\n /** Make font italic */\r\n fontItalic(): IStyleBuilder;\r\n /** Make font underlined */\r\n fontUnderline(): IStyleBuilder;\r\n /** Set border */\r\n border(style: BorderStyle, color?: Color): IStyleBuilder;\r\n /** Set specific border */\r\n borderTop(style: BorderStyle, color?: Color): IStyleBuilder;\r\n borderLeft(style: BorderStyle, color?: Color): IStyleBuilder;\r\n borderBottom(style: BorderStyle, color?: Color): IStyleBuilder;\r\n borderRight(style: BorderStyle, color?: Color): IStyleBuilder;\r\n /** Set background color */\r\n backgroundColor(color: Color): IStyleBuilder;\r\n /** Set horizontal alignment */\r\n horizontalAlign(alignment: HorizontalAlignment): IStyleBuilder;\r\n /** Set vertical alignment */\r\n verticalAlign(alignment: VerticalAlignment): IStyleBuilder;\r\n /** Center align text */\r\n centerAlign(): IStyleBuilder;\r\n /** Left align text */\r\n leftAlign(): IStyleBuilder;\r\n /** Right align text */\r\n rightAlign(): IStyleBuilder;\r\n /** Wrap text */\r\n wrapText(): IStyleBuilder;\r\n /** Set number format */\r\n numberFormat(format: string): IStyleBuilder;\r\n /** Set striped rows */\r\n striped(): IStyleBuilder;\r\n /** Add conditional formatting */\r\n conditionalFormat(format: IConditionalFormat): IStyleBuilder;\r\n /** Build the final style */\r\n build(): IStyle;\r\n} "],"names":["EventEmitter","listeners","Map","on","type","listener","options","this","has","set","registration","once","async","priority","stopPropagation","id","generateId","active","timestamp","Date","get","push","sort","a","b","off","listenerId","index","findIndex","reg","splice","offAll","count","length","delete","emit","event","activeListeners","filter","error","console","cleanupInactiveListeners","emitSync","clear","getListeners","getListenerCount","getEventTypes","Array","from","keys","Math","random","toString","substr","CellType","NumberFormat","HorizontalAlignment","VerticalAlignment","BorderStyle","FontStyle","ErrorType","Worksheet","config","tables","currentRow","currentCol","headerPointers","isBuilt","headers","subHeaders","body","footers","constructor","addHeader","header","addSubHeaders","addRow","row","isArray","addFooter","footer","addTable","tableConfig","table","name","showBorders","showStripes","style","finalizeTable","currentTable","Error","getTable","find","build","workbook","_options","ws","addWorksheet","properties","defaultRowHeight","tabColor","pageSetup","rowPointer","i","buildTable","buildLegacyContent","startRow","addSpacing","value","mergeCell","maxCols","calculateTableMaxColumns","mergeCells","styles","getRow","eachCell","cell","convertStyle","buildNestedHeaders","addDataRowRecursive","addFooterRow","applyTableStyle","forEach","getMaxColumns","calculateHeaderColSpan","endRow","col","getCell","border","top","color","argb","left","bottom","right","fill","pattern","fgColor","maxDepth","getMaxHeaderDepth","depth","colIndex","headerInfo","getHeaderAtDepth","colSpan","children","child","String","applyAllMerges","startCol","mergeRange","start","end","childColSpan","applySmartMerges","applySmartMergesForHeader","headerColSpan","childColIndex","reduce","total","childDepth","max","validate","success","data","VALIDATION_ERROR","message","calculateDataColumnPositions","positions","key","columnPositions","footerColPosition","excelRow","footerCell","numberFormat","numFmt","mergeTo","colPosition","childCell","jump","mainColPosition","mainCell","converted","font","family","size","bold","italic","underline","foregroundColor","bgColor","backgroundColor","alignment","horizontal","vertical","wrapText","indent","BuilderEventType","ExcelBuilder","worksheets","currentWorksheet","isBuilding","stats","eventEmitter","enableValidation","enableEvents","enablePerformanceMonitoring","maxWorksheets","maxRowsPerWorksheet","maxColumnsPerWorksheet","memoryLimit","initializeStats","worksheetConfig","defaultColWidth","defaultWorksheetConfig","worksheet","emitEvent","WORKSHEET_ADDED","worksheetName","getWorksheet","removeWorksheet","WORKSHEET_REMOVED","setCurrentWorksheet","BUILD_ERROR","stack","startTime","now","BUILD_STARTED","ExcelJS","Workbook","metadata","creator","author","lastModifiedBy","created","modified","title","subject","keywords","category","description","values","buffer","xlsx","writeBuffer","compression","compressionLevel","endTime","buildTime","fileSize","byteLength","successResult","BUILD_COMPLETED","errorResult","generateAndDownload","fileName","buildResult","DOWNLOAD_STARTED","blob","Blob","mimeType","saveAs","DOWNLOAD_COMPLETED","DOWNLOAD_ERROR","toBuffer","toBlob","errors","entries","worksheetValidation","join","getStats","eventType","removeAllListeners","totalWorksheets","totalCells","memoryUsage","stylesUsed","formulasUsed","conditionalFormatsUsed","performance","headersTime","dataTime","stylesTime","writeTime","StyleBuilder","CENTER","MIDDLE","shrinkToFit","create","fontName","fontSize","fontStyle","fontColor","fontBold","fontItalic","fontUnderline","borderTop","borderLeft","borderBottom","borderRight","horizontalAlign","verticalAlign","centerAlign","leftAlign","LEFT","rightAlign","RIGHT","format","striped","conditionalFormat","conditionalFormats","reset","clone","cloned","JSON","parse","stringify","CellEventType","WorksheetEventType","StylePreset"],"mappings":"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"}
@@ -530,7 +530,6 @@ class Worksheet {
530
530
  getHeaderAtDepth(header, depth, startCol) {
531
531
  const colSpan = this.calculateHeaderColSpan(header);
532
532
  if (depth === 0) {
533
- console.log(" paso dios mio header", header.value);
534
533
  const mergeRange = colSpan > 1 ? { start: startCol, end: startCol + colSpan - 1 } : null;
535
534
  return {
536
535
  value: typeof header.value === "string" ? header.value : String(header.value || ""),
@@ -735,7 +734,6 @@ class Worksheet {
735
734
  */
736
735
  addDataRowRecursive(ws, rowPointer, row) {
737
736
  const columnPositions = this.calculateDataColumnPositions();
738
- console.log("columnPositions", columnPositions);
739
737
  let mainColPosition;
740
738
  if (row.key && columnPositions[row.key]) {
741
739
  mainColPosition = columnPositions[row.key];
@@ -1 +1 @@
1
- {"version":3,"file":"han-excel.es.js","sources":["../src/utils/EventEmitter.ts","../src/types/core.types.ts","../src/core/Worksheet.ts","../src/types/builder.types.ts","../src/core/ExcelBuilder.ts","../src/styles/StyleBuilder.ts","../src/types/cell.types.ts","../src/types/worksheet.types.ts","../src/types/style.types.ts"],"sourcesContent":["/**\r\n * Simple EventEmitter implementation\r\n */\r\n\r\n/**\r\n * Event listener function type\r\n */\r\nexport type EventListener<T = any> = (event: T) => void | Promise<void>;\r\n\r\n/**\r\n * Event listener options\r\n */\r\nexport interface EventListenerOptions {\r\n /** Whether to execute the listener only once */\r\n once?: boolean;\r\n /** Whether to execute the listener asynchronously */\r\n async?: boolean;\r\n /** Priority of the listener (higher = executed first) */\r\n priority?: number;\r\n /** Whether to stop event propagation */\r\n stopPropagation?: boolean;\r\n}\r\n\r\n/**\r\n * Event listener registration\r\n */\r\nexport interface EventListenerRegistration {\r\n /** Event type */\r\n type: string;\r\n /** Listener function */\r\n listener: EventListener;\r\n /** Listener options */\r\n options: EventListenerOptions;\r\n /** Registration ID */\r\n id: string;\r\n /** Whether the listener is active */\r\n active: boolean;\r\n /** Registration timestamp */\r\n timestamp: Date;\r\n}\r\n\r\n/**\r\n * EventEmitter class for handling events\r\n */\r\nexport class EventEmitter {\r\n private listeners: Map<string, EventListenerRegistration[]> = new Map();\r\n\r\n /**\r\n * Add an event listener\r\n */\r\n on<T = any>(type: string, listener: EventListener<T>, options: EventListenerOptions = {}): string {\r\n if (!this.listeners.has(type)) {\r\n this.listeners.set(type, []);\r\n }\r\n\r\n const registration: EventListenerRegistration = {\r\n type,\r\n listener: listener as EventListener,\r\n options: {\r\n once: false,\r\n async: false,\r\n priority: 0,\r\n stopPropagation: false,\r\n ...options\r\n },\r\n id: this.generateId(),\r\n active: true,\r\n timestamp: new Date()\r\n };\r\n\r\n this.listeners.get(type)!.push(registration);\r\n \r\n // Sort by priority (higher priority first)\r\n this.listeners.get(type)!.sort((a, b) => (b.options.priority || 0) - (a.options.priority || 0));\r\n\r\n return registration.id;\r\n }\r\n\r\n /**\r\n * Add a one-time event listener\r\n */\r\n once<T = any>(type: string, listener: EventListener<T>, options: EventListenerOptions = {}): string {\r\n return this.on(type, listener, { ...options, once: true });\r\n }\r\n\r\n /**\r\n * Remove an event listener\r\n */\r\n off(type: string, listenerId: string): boolean {\r\n const listeners = this.listeners.get(type);\r\n if (!listeners) {\r\n return false;\r\n }\r\n\r\n const index = listeners.findIndex(reg => reg.id === listenerId);\r\n if (index === -1) {\r\n return false;\r\n }\r\n\r\n listeners.splice(index, 1);\r\n return true;\r\n }\r\n\r\n /**\r\n * Remove all listeners for an event type\r\n */\r\n offAll(type: string): number {\r\n const listeners = this.listeners.get(type);\r\n if (!listeners) {\r\n return 0;\r\n }\r\n\r\n const count = listeners.length;\r\n this.listeners.delete(type);\r\n return count;\r\n }\r\n\r\n /**\r\n * Emit an event\r\n */\r\n async emit<T = any>(event: T): Promise<void> {\r\n const type = (event as any).type || 'default';\r\n const listeners = this.listeners.get(type);\r\n \r\n if (!listeners || listeners.length === 0) {\r\n return;\r\n }\r\n\r\n const activeListeners = listeners.filter(reg => reg.active);\r\n \r\n for (const registration of activeListeners) {\r\n try {\r\n if (registration.options.once) {\r\n registration.active = false;\r\n }\r\n\r\n if (registration.options.async) {\r\n await registration.listener(event);\r\n } else {\r\n registration.listener(event);\r\n }\r\n\r\n if (registration.options.stopPropagation) {\r\n break;\r\n }\r\n } catch (error) {\r\n console.error(`Error in event listener for ${type}:`, error);\r\n }\r\n }\r\n\r\n // Clean up inactive listeners\r\n this.cleanupInactiveListeners(type);\r\n }\r\n\r\n /**\r\n * Emit an event synchronously\r\n */\r\n emitSync<T = any>(event: T): void {\r\n const type = (event as any).type || 'default';\r\n const listeners = this.listeners.get(type);\r\n \r\n if (!listeners || listeners.length === 0) {\r\n return;\r\n }\r\n\r\n const activeListeners = listeners.filter(reg => reg.active);\r\n \r\n for (const registration of activeListeners) {\r\n try {\r\n if (registration.options.once) {\r\n registration.active = false;\r\n }\r\n\r\n registration.listener(event);\r\n\r\n if (registration.options.stopPropagation) {\r\n break;\r\n }\r\n } catch (error) {\r\n console.error(`Error in event listener for ${type}:`, error);\r\n }\r\n }\r\n\r\n // Clean up inactive listeners\r\n this.cleanupInactiveListeners(type);\r\n }\r\n\r\n /**\r\n * Clear all listeners\r\n */\r\n clear(): void {\r\n this.listeners.clear();\r\n }\r\n\r\n /**\r\n * Get listeners for an event type\r\n */\r\n getListeners(type: string): EventListenerRegistration[] {\r\n return this.listeners.get(type) || [];\r\n }\r\n\r\n /**\r\n * Get listener count for an event type\r\n */\r\n getListenerCount(type: string): number {\r\n return this.listeners.get(type)?.length || 0;\r\n }\r\n\r\n /**\r\n * Get all registered event types\r\n */\r\n getEventTypes(): string[] {\r\n return Array.from(this.listeners.keys());\r\n }\r\n\r\n // Private methods\r\n\r\n private generateId(): string {\r\n return Math.random().toString(36).substr(2, 9);\r\n }\r\n\r\n private cleanupInactiveListeners(type: string): void {\r\n const listeners = this.listeners.get(type);\r\n if (listeners) {\r\n const activeListeners = listeners.filter(reg => reg.active);\r\n if (activeListeners.length !== listeners.length) {\r\n this.listeners.set(type, activeListeners);\r\n }\r\n }\r\n }\r\n} ","/**\r\n * Core type definitions for Han Excel Builder\r\n */\r\n\r\nimport { CellValue } from 'exceljs';\r\n\r\n/**\r\n * Supported cell data types\r\n */\r\nexport enum CellType {\r\n STRING = 'string',\r\n NUMBER = 'number',\r\n BOOLEAN = 'boolean',\r\n DATE = 'date',\r\n PERCENTAGE = 'percentage',\r\n CURRENCY = 'currency',\r\n LINK = 'link',\r\n FORMULA = 'formula'\r\n}\r\n\r\n/**\r\n * Number format options\r\n */\r\nexport enum NumberFormat {\r\n GENERAL = 'General',\r\n NUMBER = '#,##0',\r\n NUMBER_DECIMALS = '#,##0.00',\r\n CURRENCY = '$#,##0.00',\r\n CURRENCY_INTEGER = '$#,##0',\r\n PERCENTAGE = '0%',\r\n PERCENTAGE_DECIMALS = '0.00%',\r\n DATE = 'dd/mm/yyyy',\r\n DATE_TIME = 'dd/mm/yyyy hh:mm',\r\n TIME = 'hh:mm:ss',\r\n CUSTOM = 'custom'\r\n}\r\n\r\n/**\r\n * Horizontal alignment options\r\n */\r\nexport enum HorizontalAlignment {\r\n LEFT = 'left',\r\n CENTER = 'center',\r\n RIGHT = 'right',\r\n FILL = 'fill',\r\n JUSTIFY = 'justify',\r\n CENTER_CONTINUOUS = 'centerContinuous',\r\n DISTRIBUTED = 'distributed'\r\n}\r\n\r\n/**\r\n * Vertical alignment options\r\n */\r\nexport enum VerticalAlignment {\r\n TOP = 'top',\r\n MIDDLE = 'middle',\r\n BOTTOM = 'bottom',\r\n DISTRIBUTED = 'distributed',\r\n JUSTIFY = 'justify'\r\n}\r\n\r\n/**\r\n * Border style options\r\n */\r\nexport enum BorderStyle {\r\n THIN = 'thin',\r\n MEDIUM = 'medium',\r\n THICK = 'thick',\r\n DOTTED = 'dotted',\r\n DASHED = 'dashed',\r\n DOUBLE = 'double',\r\n HAIR = 'hair',\r\n MEDIUM_DASHED = 'mediumDashed',\r\n DASH_DOT = 'dashDot',\r\n MEDIUM_DASH_DOT = 'mediumDashDot',\r\n DASH_DOT_DOT = 'dashDotDot',\r\n MEDIUM_DASH_DOT_DOT = 'mediumDashDotDot',\r\n SLANT_DASH_DOT = 'slantDashDot'\r\n}\r\n\r\n/**\r\n * Font style options\r\n */\r\nexport enum FontStyle {\r\n NORMAL = 'normal',\r\n BOLD = 'bold',\r\n ITALIC = 'italic',\r\n BOLD_ITALIC = 'bold italic'\r\n}\r\n\r\n/**\r\n * Color type - can be hex string, RGB object, or theme color\r\n */\r\nexport type Color = string | { r: number; g: number; b: number } | { theme: number };\r\n\r\n/**\r\n * Base cell properties interface\r\n */\r\nexport interface IBaseCell {\r\n /** Unique identifier for the cell */\r\n key: string;\r\n /** Cell data type */\r\n type: CellType;\r\n /** Cell value */\r\n value: CellValue;\r\n /** Optional cell reference (e.g., A1, B2) */\r\n reference?: string;\r\n /** Whether to merge this cell with others */\r\n mergeCell?: boolean;\r\n /** Number of columns to merge (if mergeCell is true) */\r\n mergeTo?: number;\r\n /** Row height for this cell */\r\n rowHeight?: number;\r\n /** Column width for this cell */\r\n colWidth?: number;\r\n /** Whether to move to next row after this cell */\r\n jump?: boolean;\r\n /** Hyperlink URL */\r\n link?: string;\r\n /** Excel formula */\r\n formula?: string;\r\n /** Number format for numeric cells */\r\n numberFormat?: NumberFormat | string;\r\n /** Custom number format string */\r\n customNumberFormat?: string;\r\n /** Whether the cell is protected */\r\n protected?: boolean;\r\n /** Whether the cell is hidden */\r\n hidden?: boolean;\r\n /** Cell comment */\r\n comment?: string;\r\n /** Data validation rules */\r\n validation?: IDataValidation;\r\n /** Optional styles for the cell */\r\n styles?: import('./style.types').IStyle;\r\n /** Legacy children cells */\r\n childrens?: IBaseCell[];\r\n /** Modern children cells */\r\n children?: IBaseCell[];\r\n}\r\n\r\n/**\r\n * Data validation interface\r\n */\r\nexport interface IDataValidation {\r\n /** Validation type */\r\n type: 'list' | 'whole' | 'decimal' | 'textLength' | 'date' | 'time' | 'custom';\r\n /** Validation operator */\r\n operator?: 'between' | 'notBetween' | 'equal' | 'notEqual' | 'greaterThan' | 'lessThan' | 'greaterThanOrEqual' | 'lessThanOrEqual';\r\n /** Validation formula or values */\r\n formula1?: string | number | Date;\r\n /** Second validation formula or value (for between/notBetween) */\r\n formula2?: string | number | Date;\r\n /** Whether to show error message */\r\n showErrorMessage?: boolean;\r\n /** Error message text */\r\n errorMessage?: string;\r\n /** Whether to show input message */\r\n showInputMessage?: boolean;\r\n /** Input message text */\r\n inputMessage?: string;\r\n /** Whether to allow blank values */\r\n allowBlank?: boolean;\r\n}\r\n\r\n/**\r\n * Workbook metadata interface\r\n */\r\nexport interface IWorkbookMetadata {\r\n /** Workbook author */\r\n author?: string;\r\n /** Workbook title */\r\n title?: string;\r\n /** Workbook subject */\r\n subject?: string;\r\n /** Workbook keywords */\r\n keywords?: string;\r\n /** Workbook category */\r\n category?: string;\r\n /** Workbook description */\r\n description?: string;\r\n /** Workbook company */\r\n company?: string;\r\n /** Workbook manager */\r\n manager?: string;\r\n /** Creation date */\r\n created?: Date;\r\n /** Last modified date */\r\n modified?: Date;\r\n /** Application name */\r\n application?: string;\r\n /** Application version */\r\n appVersion?: string;\r\n /** Hyperlink base */\r\n hyperlinkBase?: string;\r\n}\r\n\r\n/**\r\n * Error types for validation\r\n */\r\nexport enum ErrorType {\r\n VALIDATION_ERROR = 'VALIDATION_ERROR',\r\n BUILD_ERROR = 'BUILD_ERROR',\r\n STYLE_ERROR = 'STYLE_ERROR',\r\n WORKSHEET_ERROR = 'WORKSHEET_ERROR',\r\n CELL_ERROR = 'CELL_ERROR'\r\n}\r\n\r\n/**\r\n * Error interface\r\n */\r\nexport interface IError {\r\n type: ErrorType;\r\n message: string;\r\n code?: string;\r\n details?: Record<string, unknown>;\r\n stack?: string;\r\n}\r\n\r\n/**\r\n * Success result interface\r\n */\r\nexport interface ISuccessResult<T = unknown> {\r\n success: true;\r\n data: T;\r\n message?: string;\r\n}\r\n\r\n/**\r\n * Error result interface\r\n */\r\nexport interface IErrorResult {\r\n success: false;\r\n error: IError;\r\n}\r\n\r\n/**\r\n * Result union type\r\n */\r\nexport type Result<T = unknown> = ISuccessResult<T> | IErrorResult; ","import ExcelJS from 'exceljs';\r\nimport {\r\n IWorksheet,\r\n IWorksheetConfig,\r\n ITable\r\n} from '../types/worksheet.types';\r\nimport {\r\n IDataCell,\r\n IHeaderCell,\r\n IFooterCell\r\n} from '../types/cell.types';\r\nimport { IBuildOptions } from '../types/builder.types';\r\nimport { Result, ErrorType } from '../types/core.types';\r\n\r\n/**\r\n * Worksheet - Representa una hoja de cálculo dentro del builder\r\n *\r\n2 * Soporta headers, subheaders anidados, rows, footers, children y estilos por celda.\r\n */\r\nexport class Worksheet implements IWorksheet {\r\n public config: IWorksheetConfig;\r\n public tables: ITable[] = [];\r\n public currentRow = 1;\r\n public currentCol = 1;\r\n public headerPointers: Map<string, any> = new Map();\r\n public isBuilt = false;\r\n\r\n // Estructuras temporales para la tabla actual\r\n private headers: IHeaderCell[] = [];\r\n private subHeaders: IHeaderCell[] = [];\r\n private body: IDataCell[] = [];\r\n private footers: IFooterCell[] = [];\r\n\r\n constructor(config: IWorksheetConfig) {\r\n this.config = config;\r\n }\r\n\r\n /**\r\n * Agrega un header principal\r\n */\r\n addHeader(header: IHeaderCell): this {\r\n this.headers.push(header);\r\n return this;\r\n }\r\n\r\n /**\r\n * Agrega subheaders (ahora soporta anidación)\r\n */\r\n addSubHeaders(subHeaders: IHeaderCell[]): this {\r\n this.subHeaders.push(...subHeaders);\r\n return this;\r\n }\r\n\r\n /**\r\n * Agrega una fila de datos (puede ser jerárquica con childrens)\r\n */\r\n addRow(row: IDataCell[] | IDataCell): this {\r\n if (Array.isArray(row)) {\r\n this.body.push(...row);\r\n } else {\r\n this.body.push(row);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Agrega un footer o varios\r\n */\r\n addFooter(footer: IFooterCell[] | IFooterCell): this {\r\n if (Array.isArray(footer)) {\r\n this.footers.push(...footer);\r\n } else {\r\n this.footers.push(footer);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Crea una nueva tabla y la agrega al worksheet\r\n */\r\n addTable(tableConfig: Partial<ITable> = {}): this {\r\n const table: ITable = {\r\n name: tableConfig.name || `Table_${this.tables.length + 1}`,\r\n headers: tableConfig.headers || [],\r\n subHeaders: tableConfig.subHeaders || [],\r\n body: tableConfig.body || [],\r\n footers: tableConfig.footers || [],\r\n showBorders: tableConfig.showBorders !== false,\r\n showStripes: tableConfig.showStripes !== false,\r\n style: tableConfig.style || 'TableStyleLight1',\r\n ...tableConfig\r\n };\r\n \r\n this.tables.push(table);\r\n return this;\r\n }\r\n\r\n /**\r\n * Finaliza la tabla actual agregando todos los elementos temporales a la última tabla\r\n */\r\n finalizeTable(): this {\r\n if (this.tables.length === 0) {\r\n // Si no hay tablas, crear una nueva con los datos temporales\r\n this.addTable();\r\n }\r\n \r\n const currentTable = this.tables[this.tables.length - 1];\r\n if (!currentTable) {\r\n throw new Error('No se pudo obtener la tabla actual');\r\n }\r\n \r\n // Agregar headers, subheaders, body y footers a la tabla actual\r\n if (this.headers.length > 0) {\r\n currentTable.headers = [...(currentTable.headers || []), ...this.headers];\r\n }\r\n \r\n if (this.subHeaders.length > 0) {\r\n currentTable.subHeaders = [...(currentTable.subHeaders || []), ...this.subHeaders];\r\n }\r\n \r\n if (this.body.length > 0) {\r\n currentTable.body = [...(currentTable.body || []), ...this.body];\r\n }\r\n \r\n if (this.footers.length > 0) {\r\n currentTable.footers = [...(currentTable.footers || []), ...this.footers];\r\n }\r\n \r\n // Limpiar las estructuras temporales\r\n this.headers = [];\r\n this.subHeaders = [];\r\n this.body = [];\r\n this.footers = [];\r\n \r\n return this;\r\n }\r\n\r\n /**\r\n * Obtiene una tabla por nombre\r\n */\r\n getTable(name: string): ITable | undefined {\r\n return this.tables.find(table => table.name === name);\r\n }\r\n\r\n /**\r\n * Construye la hoja en el workbook de ExcelJS\r\n */\r\n async build(workbook: ExcelJS.Workbook, _options: IBuildOptions = {}): Promise<void> {\r\n const ws = workbook.addWorksheet(this.config.name, {\r\n properties: {\r\n defaultRowHeight: this.config.defaultRowHeight || 20,\r\n tabColor: this.config.tabColor as any\r\n },\r\n pageSetup: this.config.pageSetup as any\r\n });\r\n\r\n let rowPointer = 1;\r\n \r\n // Si hay tablas definidas, construir cada tabla\r\n if (this.tables.length > 0) {\r\n for (let i = 0; i < this.tables.length; i++) {\r\n const table = this.tables[i];\r\n if (table) {\r\n rowPointer = await this.buildTable(ws, table, rowPointer, i > 0);\r\n }\r\n }\r\n } else {\r\n // Construcción tradicional para compatibilidad hacia atrás\r\n rowPointer = await this.buildLegacyContent(ws, rowPointer);\r\n }\r\n \r\n this.isBuilt = true;\r\n }\r\n\r\n /**\r\n * Construye una tabla individual en el worksheet\r\n */\r\n private async buildTable(ws: ExcelJS.Worksheet, table: ITable, startRow: number, addSpacing: boolean = false): Promise<number> {\r\n let rowPointer = startRow;\r\n \r\n // Agregar espacio entre tablas si no es la primera\r\n if (addSpacing) {\r\n rowPointer += 2; // 2 filas de espacio\r\n }\r\n \r\n // Headers principales de la tabla\r\n if (table.headers && table.headers.length > 0) {\r\n for (const header of table.headers) {\r\n ws.addRow([header.value]);\r\n if (header.mergeCell) {\r\n const maxCols = this.calculateTableMaxColumns(table);\r\n ws.mergeCells(rowPointer, 1, rowPointer, maxCols);\r\n }\r\n if (header.styles) {\r\n ws.getRow(rowPointer).eachCell((cell: any) => {\r\n cell.style = this.convertStyle(header.styles);\r\n });\r\n }\r\n rowPointer++;\r\n }\r\n }\r\n \r\n // SubHeaders con soporte para anidación\r\n if (table.subHeaders && table.subHeaders.length > 0) {\r\n rowPointer = this.buildNestedHeaders(ws, rowPointer, table.subHeaders);\r\n }\r\n \r\n // Body (soporta children)\r\n if (table.body && table.body.length > 0) {\r\n for (const row of table.body) {\r\n rowPointer = this.addDataRowRecursive(ws, rowPointer, row);\r\n }\r\n }\r\n \r\n // Footers\r\n if (table.footers && table.footers.length > 0) {\r\n for (const footer of table.footers) {\r\n rowPointer = this.addFooterRow(ws, rowPointer, footer);\r\n }\r\n }\r\n \r\n // Aplicar estilo de tabla si está configurado\r\n if (table.showBorders || table.showStripes) {\r\n this.applyTableStyle(ws, table, startRow, rowPointer - 1);\r\n }\r\n \r\n return rowPointer;\r\n }\r\n\r\n /**\r\n * Construcción tradicional para compatibilidad hacia atrás\r\n */\r\n private async buildLegacyContent(ws: ExcelJS.Worksheet, startRow: number): Promise<number> {\r\n let rowPointer = startRow;\r\n \r\n // Headers principales\r\n if (this.headers.length > 0) {\r\n this.headers.forEach(header => {\r\n ws.addRow([header.value]);\r\n if (header.mergeCell) {\r\n ws.mergeCells(rowPointer, 1, rowPointer, (this.getMaxColumns() || 1));\r\n }\r\n if (header.styles) {\r\n ws.getRow(rowPointer).eachCell((cell: any) => {\r\n cell.style = this.convertStyle(header.styles);\r\n });\r\n }\r\n rowPointer++;\r\n });\r\n }\r\n \r\n // SubHeaders con soporte para anidación\r\n if (this.subHeaders.length > 0) {\r\n rowPointer = this.buildNestedHeaders(ws, rowPointer, this.subHeaders);\r\n }\r\n \r\n // Body (soporta children)\r\n for (const row of this.body) {\r\n rowPointer = this.addDataRowRecursive(ws, rowPointer, row);\r\n }\r\n \r\n // Footers\r\n if (this.footers.length > 0) {\r\n for (const footer of this.footers) {\r\n rowPointer = this.addFooterRow(ws, rowPointer, footer);\r\n }\r\n }\r\n \r\n return rowPointer;\r\n }\r\n\r\n /**\r\n * Calcula el número máximo de columnas para una tabla\r\n */\r\n private calculateTableMaxColumns(table: ITable): number {\r\n let maxCols = 0;\r\n \r\n if (table.subHeaders && table.subHeaders.length > 0) {\r\n for (const header of table.subHeaders) {\r\n maxCols += this.calculateHeaderColSpan(header);\r\n }\r\n }\r\n \r\n return maxCols || 1;\r\n }\r\n\r\n /**\r\n * Aplica el estilo de tabla a un rango específico\r\n */\r\n private applyTableStyle(ws: ExcelJS.Worksheet, table: ITable, startRow: number, endRow: number): void {\r\n const maxCols = this.calculateTableMaxColumns(table);\r\n \r\n // Aplicar bordes si está configurado\r\n if (table.showBorders) {\r\n for (let row = startRow; row <= endRow; row++) {\r\n for (let col = 1; col <= maxCols; col++) {\r\n const cell = ws.getRow(row).getCell(col);\r\n if (!cell.style) cell.style = {};\r\n if (!cell.style.border) {\r\n cell.style.border = {\r\n top: { style: 'thin', color: { argb: 'FF8EAADB' } },\r\n left: { style: 'thin', color: { argb: 'FF8EAADB' } },\r\n bottom: { style: 'thin', color: { argb: 'FF8EAADB' } },\r\n right: { style: 'thin', color: { argb: 'FF8EAADB' } }\r\n };\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Aplicar rayas alternadas si está configurado\r\n if (table.showStripes) {\r\n for (let row = startRow; row <= endRow; row++) {\r\n if ((row - startRow) % 2 === 1) { // Filas impares (empezando desde 0)\r\n for (let col = 1; col <= maxCols; col++) {\r\n const cell = ws.getRow(row).getCell(col);\r\n if (!cell.style) cell.style = {};\r\n if (!cell.style.fill) {\r\n cell.style.fill = {\r\n type: 'pattern',\r\n pattern: 'solid',\r\n fgColor: { argb: 'FFF2F2F2' }\r\n };\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Construye headers anidados recursivamente\r\n * @param ws - Worksheet de ExcelJS\r\n * @param startRow - Fila inicial\r\n * @param headers - Array de headers a procesar\r\n * @returns La siguiente fila disponible\r\n */\r\n private buildNestedHeaders(ws: ExcelJS.Worksheet, startRow: number, headers: IHeaderCell[]): number {\r\n let currentRow = startRow;\r\n const maxDepth = this.getMaxHeaderDepth(headers);\r\n \r\n // Crear filas para cada nivel de profundidad\r\n for (let depth = 0; depth < maxDepth; depth++) {\r\n // Crear la fila primero\r\n const row = ws.getRow(currentRow);\r\n \r\n // Procesar cada header en este nivel\r\n let colIndex = 1;\r\n for (const header of headers) {\r\n if (depth === 0) {\r\n // Nivel principal del header\r\n const headerInfo = this.getHeaderAtDepth(header, depth, colIndex);\r\n const cell = row.getCell(colIndex);\r\n cell.value = headerInfo.value;\r\n if (headerInfo.style) {\r\n cell.style = this.convertStyle(headerInfo.style);\r\n }\r\n colIndex += headerInfo.colSpan;\r\n } else {\r\n // Nivel de children - procesar todos los children directos\r\n if (header.children && header.children.length > 0) {\r\n for (const child of header.children) {\r\n const cell = row.getCell(colIndex);\r\n cell.value = typeof child.value === 'string' ? child.value : String(child.value || '');\r\n if (child.styles || header.styles) {\r\n cell.style = this.convertStyle(child.styles || header.styles);\r\n }\r\n colIndex += this.calculateHeaderColSpan(child);\r\n }\r\n } else {\r\n // Si no tiene children, agregar celda vacía\r\n const cell = row.getCell(colIndex);\r\n cell.value = null;\r\n colIndex += 1;\r\n }\r\n }\r\n }\r\n \r\n currentRow++;\r\n }\r\n \r\n // Aplicar todos los merges después de crear todas las filas\r\n this.applyAllMerges(ws, startRow, currentRow - 1, headers);\r\n \r\n return currentRow;\r\n }\r\n\r\n /**\r\n * Obtiene información del header en una profundidad específica\r\n */\r\n private getHeaderAtDepth(header: IHeaderCell, depth: number, startCol: number): {\r\n value: string | null;\r\n style: any;\r\n colSpan: number;\r\n mergeRange?: { start: number; end: number } | null;\r\n } {\r\n const colSpan = this.calculateHeaderColSpan(header);\r\n if (depth === 0) {\r\n // Nivel principal del header\r\n console.log(' paso dios mio header', header.value);\r\n const mergeRange = colSpan > 1 ? { start: startCol, end: startCol + colSpan - 1 } : null;\r\n return {\r\n value: typeof header.value === 'string' ? header.value : String(header.value || ''),\r\n style: header.styles,\r\n colSpan,\r\n mergeRange: mergeRange\r\n };\r\n } else if (header.children && header.children.length > 0) {\r\n // Nivel de children\r\n const child = header.children[depth];\r\n if (child) {\r\n const childColSpan = this.calculateHeaderColSpan(child);\r\n // Los children también pueden hacer merge si tienen múltiples childrens\r\n const mergeRange = childColSpan > 1 ? { start: startCol, end: startCol + childColSpan - 1 } : null;\r\n \r\n return {\r\n value: typeof child.value === 'string' ? child.value : String(child.value || ''),\r\n style: child.styles || header.styles,\r\n colSpan: childColSpan,\r\n mergeRange: mergeRange\r\n };\r\n }\r\n }\r\n \r\n // Celda vacía para mantener alineación\r\n return {\r\n value: null,\r\n style: null,\r\n colSpan: 1\r\n };\r\n }\r\n\r\n\r\n\r\n\r\n /**\r\n * Aplica todos los merges (horizontales y verticales) después de crear todas las filas\r\n */\r\n private applyAllMerges(ws: ExcelJS.Worksheet, startRow: number, endRow: number, headers: IHeaderCell[]): void {\r\n const maxDepth = this.getMaxHeaderDepth(headers);\r\n \r\n // Solo aplicar merges si hay más de una fila de headers\r\n if (maxDepth <= 1) return;\r\n \r\n // Aplicar merges inteligentes basados en la estructura\r\n this.applySmartMerges(ws, startRow, endRow, headers);\r\n }\r\n\r\n /**\r\n * Aplica merges inteligentes basados en la estructura de headers\r\n */\r\n private applySmartMerges(ws: ExcelJS.Worksheet, startRow: number, endRow: number, headers: IHeaderCell[]): void {\r\n const maxDepth = this.getMaxHeaderDepth(headers);\r\n \r\n // Solo aplicar merges si hay más de una fila de headers\r\n if (maxDepth <= 1) return;\r\n \r\n // Aplicar merges para cada header\r\n let colIndex = 1;\r\n for (const header of headers) {\r\n this.applySmartMergesForHeader(ws, startRow, endRow, header, colIndex);\r\n colIndex += this.calculateHeaderColSpan(header);\r\n }\r\n }\r\n\r\n /**\r\n * Aplica merges inteligentes para un header específico\r\n */\r\n private applySmartMergesForHeader(ws: ExcelJS.Worksheet, startRow: number, endRow: number, header: IHeaderCell, startCol: number): void {\r\n const headerColSpan = this.calculateHeaderColSpan(header);\r\n \r\n if (!header.children || header.children.length === 0) {\r\n // Si no tiene children, hacer merge vertical desde la primera fila hasta la última\r\n ws.mergeCells(startRow, startCol, endRow, startCol + headerColSpan - 1);\r\n } else {\r\n // Si tiene children, aplicar merge horizontal en la primera fila\r\n if (headerColSpan > 1) {\r\n ws.mergeCells(startRow, startCol, startRow, startCol + headerColSpan - 1);\r\n }\r\n \r\n // Procesar children recursivamente\r\n let childColIndex = startCol;\r\n for (const child of header.children) {\r\n this.applySmartMergesForHeader(ws, startRow + 1, endRow, child, childColIndex);\r\n childColIndex += this.calculateHeaderColSpan(child);\r\n }\r\n }\r\n }\r\n\r\n\r\n \r\n /**\r\n * Calcula el span de columnas para un header\r\n */\r\n private calculateHeaderColSpan(header: IHeaderCell): number {\r\n if (!header.children || header.children.length === 0) {\r\n return 1;\r\n }\r\n \r\n return header.children.reduce((total, child) => {\r\n return total + this.calculateHeaderColSpan(child);\r\n }, 0);\r\n }\r\n\r\n /**\r\n * Obtiene la profundidad máxima de headers anidados\r\n */\r\n private getMaxHeaderDepth(headers: IHeaderCell[]): number {\r\n let maxDepth = 1;\r\n \r\n for (const header of headers) {\r\n if (header.children && header.children.length > 0) {\r\n const childDepth = this.getMaxHeaderDepth(header.children);\r\n maxDepth = Math.max(maxDepth, childDepth + 1);\r\n }\r\n }\r\n \r\n return maxDepth;\r\n }\r\n\r\n /**\r\n * Obtiene el número máximo de columnas\r\n */\r\n private getMaxColumns(): number {\r\n let maxCols = 0;\r\n \r\n for (const header of this.subHeaders) {\r\n maxCols += this.calculateHeaderColSpan(header);\r\n }\r\n \r\n return maxCols;\r\n }\r\n\r\n /**\r\n * Valida la hoja\r\n */\r\n validate(): Result<boolean> {\r\n if (!this.headers.length && !this.body.length) {\r\n return {\r\n success: false,\r\n error: {\r\n type: ErrorType.VALIDATION_ERROR,\r\n message: 'La hoja no tiene datos',\r\n }\r\n };\r\n }\r\n return { success: true, data: true };\r\n }\r\n\r\n /**\r\n * Calcula las posiciones de columnas para los datos basándose en la estructura de subheaders\r\n */\r\n private calculateDataColumnPositions(): { [key: string]: number } {\r\n const positions: { [key: string]: number } = {};\r\n let currentCol = 1;\r\n \r\n for (const header of this.subHeaders) {\r\n if (header.children && header.children.length > 0) {\r\n // Si el header tiene children, cada child ocupa una columna\r\n for (const child of header.children) {\r\n if (child.key) {\r\n positions[child.key] = currentCol;\r\n }\r\n if (child.value) {\r\n positions[String(child.value)] = currentCol;\r\n }\r\n currentCol++;\r\n }\r\n } else {\r\n // Si el header no tiene children, ocupa una columna\r\n if (header.key) {\r\n positions[header.key] = currentCol;\r\n }\r\n if (header.value) {\r\n positions[String(header.value)] = currentCol;\r\n }\r\n currentCol++;\r\n }\r\n }\r\n \r\n return positions;\r\n }\r\n\r\n /**\r\n * Agrega una fila de footer\r\n * @returns el siguiente rowPointer disponible\r\n */\r\n private addFooterRow(ws: ExcelJS.Worksheet, rowPointer: number, footer: IFooterCell): number {\r\n // Calcular las columnas basándose en la estructura de subheaders\r\n const columnPositions = this.calculateDataColumnPositions();\r\n \r\n // Buscar la columna correcta para el footer\r\n let footerColPosition: number | undefined;\r\n \r\n // Intentar encontrar por key primero\r\n if (footer.key && columnPositions[footer.key]) {\r\n footerColPosition = columnPositions[footer.key];\r\n }\r\n // Si no se encuentra por key, intentar por header\r\n else if (footer.header && columnPositions[footer.header]) {\r\n footerColPosition = columnPositions[footer.header];\r\n }\r\n \r\n // Si no se encuentra la posición, usar columna 1 por defecto\r\n if (footerColPosition === undefined) {\r\n footerColPosition = 1;\r\n }\r\n \r\n // Escribir el footer en la columna correcta\r\n const excelRow = ws.getRow(rowPointer);\r\n const footerCell = excelRow.getCell(footerColPosition);\r\n footerCell.value = footer.value;\r\n if (footer.styles) {\r\n footerCell.style = this.convertStyle(footer.styles);\r\n }\r\n if (footer.numberFormat) {\r\n footerCell.numFmt = footer.numberFormat;\r\n }\r\n \r\n // Aplicar merge si está configurado\r\n if (footer.mergeCell && footer.mergeTo) {\r\n ws.mergeCells(rowPointer, footerColPosition, rowPointer, footer.mergeTo);\r\n }\r\n \r\n // Si hay children, escribirlos en las columnas correspondientes\r\n if (footer.children && footer.children.length > 0) {\r\n for (const child of footer.children) {\r\n if (child) {\r\n // Buscar la columna correcta basándose en el header del child\r\n let colPosition: number | undefined;\r\n \r\n // Intentar encontrar por key primero\r\n if (child.key && columnPositions[child.key]) {\r\n colPosition = columnPositions[child.key];\r\n }\r\n // Si no se encuentra por key, intentar por header\r\n else if (child.header && columnPositions[child.header]) {\r\n colPosition = columnPositions[child.header];\r\n }\r\n \r\n if (colPosition !== undefined) {\r\n const childCell = excelRow.getCell(colPosition);\r\n childCell.value = child.value;\r\n if (child.styles) {\r\n childCell.style = this.convertStyle(child.styles);\r\n }\r\n if (child.numberFormat) {\r\n childCell.numFmt = child.numberFormat;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Incrementar rowPointer solo si el footer tiene la propiedad jump\r\n if (footer.jump) {\r\n return rowPointer + 1;\r\n }\r\n \r\n return rowPointer;\r\n }\r\n\r\n /**\r\n * Agrega una fila de datos y sus children recursivamente\r\n * @returns el siguiente rowPointer disponible\r\n */\r\n private addDataRowRecursive(ws: ExcelJS.Worksheet, rowPointer: number, row: IDataCell): number {\r\n // Calcular las columnas basándose en la estructura de subheaders\r\n const columnPositions = this.calculateDataColumnPositions();\r\n console.log('columnPositions', columnPositions);\r\n\r\n // Buscar la columna correcta para el dato principal\r\n let mainColPosition: number | undefined;\r\n \r\n // Intentar encontrar por key primero\r\n if (row.key && columnPositions[row.key]) {\r\n mainColPosition = columnPositions[row.key];\r\n }\r\n // Si no se encuentra por key, intentar por header\r\n else if (row.header && columnPositions[row.header]) {\r\n mainColPosition = columnPositions[row.header];\r\n }\r\n \r\n // Si no se encuentra la posición, usar columna 1 por defecto\r\n if (mainColPosition === undefined) {\r\n mainColPosition = 1;\r\n }\r\n \r\n // Escribir el dato principal en la columna correcta\r\n const excelRow = ws.getRow(rowPointer);\r\n const mainCell = excelRow.getCell(mainColPosition);\r\n mainCell.value = row.value;\r\n if (row.styles) {\r\n mainCell.style = this.convertStyle(row.styles);\r\n }\r\n if (row.numberFormat) {\r\n mainCell.numFmt = row.numberFormat;\r\n }\r\n \r\n // Si hay children, escribirlos en las columnas correspondientes\r\n if (row.children && row.children.length > 0) {\r\n for (const child of row.children) {\r\n if (child) {\r\n // Buscar la columna correcta basándose en el header del child\r\n let colPosition: number | undefined;\r\n \r\n // Intentar encontrar por key primero\r\n if (child.key && columnPositions[child.key]) {\r\n colPosition = columnPositions[child.key];\r\n }\r\n // Si no se encuentra por key, intentar por header\r\n else if (child.header && columnPositions[child.header]) {\r\n colPosition = columnPositions[child.header];\r\n }\r\n \r\n if (colPosition !== undefined) {\r\n const childCell = excelRow.getCell(colPosition);\r\n childCell.value = child.value;\r\n if (child.styles) {\r\n childCell.style = this.convertStyle(child.styles);\r\n }\r\n if (child.numberFormat) {\r\n childCell.numFmt = child.numberFormat;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Incrementar rowPointer solo si la celda tiene la propiedad jump\r\n if (row.jump) {\r\n return rowPointer + 1;\r\n }\r\n \r\n return rowPointer;\r\n }\r\n\r\n /**\r\n * Convierte el estilo personalizado a formato compatible con ExcelJS\r\n */\r\n private convertStyle(style: any): Partial<ExcelJS.Style> {\r\n if (!style) return {};\r\n \r\n const converted: Partial<ExcelJS.Style> = {};\r\n \r\n if (style.font) {\r\n converted.font = {\r\n name: style.font.family,\r\n size: style.font.size,\r\n bold: style.font.bold,\r\n italic: style.font.italic,\r\n underline: style.font.underline,\r\n color: style.font.color\r\n };\r\n }\r\n \r\n if (style.fill) {\r\n converted.fill = {\r\n type: style.fill.type,\r\n pattern: style.fill.pattern,\r\n fgColor: style.fill.foregroundColor,\r\n bgColor: style.fill.backgroundColor\r\n };\r\n }\r\n \r\n if (style.border) {\r\n converted.border = {\r\n top: style.border.top,\r\n left: style.border.left,\r\n bottom: style.border.bottom,\r\n right: style.border.right\r\n };\r\n }\r\n \r\n if (style.alignment) {\r\n converted.alignment = {\r\n horizontal: style.alignment.horizontal,\r\n vertical: style.alignment.vertical,\r\n wrapText: style.alignment.wrapText,\r\n indent: style.alignment.indent\r\n };\r\n }\r\n \r\n if (style.numFmt) {\r\n converted.numFmt = style.numFmt;\r\n }\r\n \r\n return converted;\r\n }\r\n}","/**\r\n * Builder-specific type definitions\r\n */\r\n\r\nimport { IWorkbookMetadata, Result } from './core.types';\r\nimport { IWorksheet, IWorksheetConfig } from './worksheet.types';\r\nimport { IStyle } from './style.types';\r\n\r\n// Re-export ErrorType for convenience\r\nexport { ErrorType } from './core.types';\r\n\r\n/**\r\n * Excel builder configuration interface\r\n */\r\nexport interface IExcelBuilderConfig {\r\n /** Workbook metadata */\r\n metadata?: IWorkbookMetadata;\r\n /** Default worksheet configuration */\r\n defaultWorksheetConfig?: Partial<IWorksheetConfig>;\r\n /** Default styles */\r\n defaultStyles?: {\r\n header?: IStyle;\r\n subheader?: IStyle;\r\n data?: IStyle;\r\n footer?: IStyle;\r\n total?: IStyle;\r\n };\r\n /** Whether to enable validation */\r\n enableValidation?: boolean;\r\n /** Whether to enable events */\r\n enableEvents?: boolean;\r\n /** Whether to enable performance monitoring */\r\n enablePerformanceMonitoring?: boolean;\r\n /** Maximum number of worksheets */\r\n maxWorksheets?: number;\r\n /** Maximum number of rows per worksheet */\r\n maxRowsPerWorksheet?: number;\r\n /** Maximum number of columns per worksheet */\r\n maxColumnsPerWorksheet?: number;\r\n /** Memory limit in bytes */\r\n memoryLimit?: number;\r\n}\r\n\r\n/**\r\n * Build options interface\r\n */\r\nexport interface IBuildOptions {\r\n /** Output format */\r\n format?: 'xlsx' | 'xls' | 'csv';\r\n /** Whether to include styles */\r\n includeStyles?: boolean;\r\n /** Whether to include formulas */\r\n includeFormulas?: boolean;\r\n /** Whether to include comments */\r\n includeComments?: boolean;\r\n /** Whether to include data validation */\r\n includeValidation?: boolean;\r\n /** Whether to include conditional formatting */\r\n includeConditionalFormatting?: boolean;\r\n /** Compression level (0-9) */\r\n compressionLevel?: number;\r\n /** Whether to optimize for size */\r\n optimizeForSize?: boolean;\r\n /** Whether to optimize for speed */\r\n optimizeForSpeed?: boolean;\r\n}\r\n\r\n/**\r\n * Download options interface\r\n */\r\nexport interface IDownloadOptions extends IBuildOptions {\r\n /** File name */\r\n fileName?: string;\r\n /** Whether to show download progress */\r\n showProgress?: boolean;\r\n /** Progress callback */\r\n onProgress?: (progress: number) => void;\r\n /** Whether to auto-download */\r\n autoDownload?: boolean;\r\n /** MIME type */\r\n mimeType?: string;\r\n}\r\n\r\n/**\r\n * Excel builder interface\r\n */\r\nexport interface IExcelBuilder {\r\n /** Builder configuration */\r\n config: IExcelBuilderConfig;\r\n /** Worksheets in the workbook */\r\n worksheets: Map<string, IWorksheet>;\r\n /** Current worksheet */\r\n currentWorksheet: IWorksheet | undefined;\r\n /** Whether the builder is building */\r\n isBuilding: boolean;\r\n /** Build statistics */\r\n stats: IBuildStats;\r\n\r\n /** Add a new worksheet */\r\n addWorksheet(name: string, config?: Partial<IWorksheetConfig>): IWorksheet;\r\n /** Get a worksheet by name */\r\n getWorksheet(name: string): IWorksheet | undefined;\r\n /** Remove a worksheet */\r\n removeWorksheet(name: string): boolean;\r\n /** Set the current worksheet */\r\n setCurrentWorksheet(name: string): boolean;\r\n /** Build the workbook */\r\n build(options?: IBuildOptions): Promise<Result<ArrayBuffer>>;\r\n /** Generate and download the file */\r\n generateAndDownload(fileName: string, options?: IDownloadOptions): Promise<Result<void>>;\r\n /** Get workbook as buffer */\r\n toBuffer(options?: IBuildOptions): Promise<Result<ArrayBuffer>>;\r\n /** Get workbook as blob */\r\n toBlob(options?: IBuildOptions): Promise<Result<Blob>>;\r\n /** Validate the workbook */\r\n validate(): Result<boolean>;\r\n /** Clear all worksheets */\r\n clear(): void;\r\n /** Get workbook statistics */\r\n getStats(): IBuildStats;\r\n}\r\n\r\n/**\r\n * Build statistics interface\r\n */\r\nexport interface IBuildStats {\r\n /** Total number of worksheets */\r\n totalWorksheets: number;\r\n /** Total number of cells */\r\n totalCells: number;\r\n /** Total memory usage in bytes */\r\n memoryUsage: number;\r\n /** Build time in milliseconds */\r\n buildTime: number;\r\n /** File size in bytes */\r\n fileSize: number;\r\n /** Number of styles used */\r\n stylesUsed: number;\r\n /** Number of formulas used */\r\n formulasUsed: number;\r\n /** Number of conditional formats used */\r\n conditionalFormatsUsed: number;\r\n /** Performance metrics */\r\n performance: {\r\n /** Time spent building headers */\r\n headersTime: number;\r\n /** Time spent building data */\r\n dataTime: number;\r\n /** Time spent applying styles */\r\n stylesTime: number;\r\n /** Time spent writing to buffer */\r\n writeTime: number;\r\n };\r\n}\r\n\r\n/**\r\n * Builder event types\r\n */\r\nexport enum BuilderEventType {\r\n WORKSHEET_ADDED = 'worksheetAdded',\r\n WORKSHEET_REMOVED = 'worksheetRemoved',\r\n WORKSHEET_UPDATED = 'worksheetUpdated',\r\n BUILD_STARTED = 'buildStarted',\r\n BUILD_PROGRESS = 'buildProgress',\r\n BUILD_COMPLETED = 'buildCompleted',\r\n BUILD_ERROR = 'buildError',\r\n DOWNLOAD_STARTED = 'downloadStarted',\r\n DOWNLOAD_PROGRESS = 'downloadProgress',\r\n DOWNLOAD_COMPLETED = 'downloadCompleted',\r\n DOWNLOAD_ERROR = 'downloadError'\r\n}\r\n\r\n/**\r\n * Builder event interface\r\n */\r\nexport interface IBuilderEvent {\r\n type: BuilderEventType;\r\n data?: Record<string, unknown>;\r\n timestamp: Date;\r\n}\r\n\r\n/**\r\n * Builder event listener interface\r\n */\r\nexport interface IBuilderEventListener {\r\n (event: IBuilderEvent): void;\r\n}\r\n\r\n/**\r\n * Builder validation result interface\r\n */\r\nexport interface IBuilderValidationResult {\r\n /** Whether the builder is valid */\r\n isValid: boolean;\r\n /** Validation errors */\r\n errors: string[];\r\n /** Validation warnings */\r\n warnings: string[];\r\n /** Worksheet validation results */\r\n worksheetResults: Map<string, boolean>;\r\n} ","/**\r\n * ExcelBuilder - Main class for creating Excel workbooks\r\n */\r\n\r\nimport ExcelJS from 'exceljs';\r\nimport saveAs from 'file-saver';\r\nimport { EventEmitter } from '../utils/EventEmitter';\r\nimport { Worksheet } from './Worksheet';\r\nimport {\r\n IExcelBuilder,\r\n IExcelBuilderConfig,\r\n IBuildOptions,\r\n IDownloadOptions,\r\n IBuildStats,\r\n BuilderEventType,\r\n IBuilderEvent,\r\n ErrorType\r\n} from '../types/builder.types';\r\nimport {\r\n IWorksheet,\r\n IWorksheetConfig\r\n} from '../types/worksheet.types';\r\nimport { \r\n Result,\r\n ISuccessResult,\r\n IErrorResult\r\n} from '../types/core.types';\r\n\r\n/**\r\n * ExcelBuilder class for creating Excel workbooks\r\n */\r\nexport class ExcelBuilder implements IExcelBuilder {\r\n public config: IExcelBuilderConfig;\r\n public worksheets: Map<string, IWorksheet> = new Map();\r\n public currentWorksheet: IWorksheet | undefined;\r\n public isBuilding = false;\r\n public stats: IBuildStats;\r\n\r\n private eventEmitter: EventEmitter;\r\n\r\n constructor(config: IExcelBuilderConfig = {}) {\r\n this.config = {\r\n enableValidation: true,\r\n enableEvents: true,\r\n enablePerformanceMonitoring: false,\r\n maxWorksheets: 255,\r\n maxRowsPerWorksheet: 1048576,\r\n maxColumnsPerWorksheet: 16384,\r\n memoryLimit: 100 * 1024 * 1024, // 100MB\r\n ...config\r\n };\r\n\r\n this.stats = this.initializeStats();\r\n this.eventEmitter = new EventEmitter();\r\n }\r\n\r\n /**\r\n * Add a new worksheet to the workbook\r\n */\r\n addWorksheet(name: string, worksheetConfig: Partial<IWorksheetConfig> = {}): IWorksheet {\r\n if (this.worksheets.has(name)) {\r\n throw new Error(`Worksheet \"${name}\" already exists`);\r\n }\r\n\r\n const config: IWorksheetConfig = {\r\n name,\r\n defaultRowHeight: 20,\r\n defaultColWidth: 10,\r\n ...this.config.defaultWorksheetConfig,\r\n ...worksheetConfig\r\n };\r\n\r\n const worksheet = new Worksheet(config);\r\n this.worksheets.set(name, worksheet);\r\n this.currentWorksheet = worksheet;\r\n \r\n this.emitEvent(BuilderEventType.WORKSHEET_ADDED, { worksheetName: name });\r\n \r\n return worksheet;\r\n }\r\n\r\n /**\r\n * Get a worksheet by name\r\n */\r\n getWorksheet(name: string): IWorksheet | undefined {\r\n return this.worksheets.get(name);\r\n }\r\n\r\n /**\r\n * Remove a worksheet by name\r\n */\r\n removeWorksheet(name: string): boolean {\r\n const worksheet = this.worksheets.get(name);\r\n if (!worksheet) {\r\n return false;\r\n }\r\n\r\n this.worksheets.delete(name);\r\n \r\n // If this was the current worksheet, clear it\r\n if (this.currentWorksheet === worksheet) {\r\n this.currentWorksheet = undefined;\r\n }\r\n \r\n this.emitEvent(BuilderEventType.WORKSHEET_REMOVED, { worksheetName: name });\r\n \r\n return true;\r\n }\r\n\r\n /**\r\n * Set the current worksheet\r\n */\r\n setCurrentWorksheet(name: string): boolean {\r\n const worksheet = this.worksheets.get(name);\r\n if (!worksheet) {\r\n return false;\r\n }\r\n \r\n this.currentWorksheet = worksheet;\r\n return true;\r\n }\r\n\r\n /**\r\n * Build the workbook and return as ArrayBuffer\r\n */\r\n async build(options: IBuildOptions = {}): Promise<Result<ArrayBuffer>> {\r\n if (this.isBuilding) {\r\n return {\r\n success: false,\r\n error: {\r\n type: ErrorType.BUILD_ERROR,\r\n message: 'Build already in progress',\r\n stack: new Error().stack || ''\r\n }\r\n };\r\n }\r\n\r\n this.isBuilding = true;\r\n const startTime = Date.now();\r\n \r\n try {\r\n this.emitEvent(BuilderEventType.BUILD_STARTED);\r\n \r\n const workbook = new ExcelJS.Workbook();\r\n \r\n // Add metadata\r\n if (this.config.metadata) {\r\n workbook.creator = this.config.metadata.author || 'Han Excel Builder';\r\n workbook.lastModifiedBy = this.config.metadata.author || 'Han Excel Builder';\r\n workbook.created = this.config.metadata.created || new Date();\r\n workbook.modified = this.config.metadata.modified || new Date();\r\n if (this.config.metadata.title) workbook.title = this.config.metadata.title;\r\n if (this.config.metadata.subject) workbook.subject = this.config.metadata.subject;\r\n if (this.config.metadata.keywords) workbook.keywords = this.config.metadata.keywords;\r\n if (this.config.metadata.category) workbook.category = this.config.metadata.category;\r\n if (this.config.metadata.description) workbook.description = this.config.metadata.description;\r\n }\r\n\r\n // Build each worksheet\r\n for (const worksheet of this.worksheets.values()) {\r\n await (worksheet as Worksheet).build(workbook, options);\r\n }\r\n\r\n // Write to buffer\r\n const buffer = await workbook.xlsx.writeBuffer({\r\n compression: options.compressionLevel || 6\r\n } as any);\r\n\r\n const endTime = Date.now();\r\n this.stats.buildTime = endTime - startTime;\r\n this.stats.fileSize = buffer.byteLength;\r\n \r\n const successResult: ISuccessResult<ArrayBuffer> = {\r\n success: true,\r\n data: buffer\r\n };\r\n\r\n this.emitEvent(BuilderEventType.BUILD_COMPLETED, {\r\n buildTime: this.stats.buildTime,\r\n fileSize: this.stats.fileSize\r\n });\r\n\r\n return successResult;\r\n\r\n } catch (error) {\r\n const errorResult: IErrorResult = {\r\n success: false,\r\n error: {\r\n type: ErrorType.BUILD_ERROR,\r\n message: error instanceof Error ? error.message : 'Unknown build error',\r\n stack: error instanceof Error ? error.stack || '' : ''\r\n }\r\n };\r\n\r\n this.emitEvent(BuilderEventType.BUILD_ERROR, { error: errorResult.error });\r\n return errorResult;\r\n\r\n } finally {\r\n this.isBuilding = false;\r\n }\r\n }\r\n\r\n /**\r\n * Generate and download the file\r\n */\r\n async generateAndDownload(fileName: string, options: IDownloadOptions = {}): Promise<Result<void>> {\r\n const buildResult = await this.build(options);\r\n \r\n if (!buildResult.success) {\r\n return buildResult;\r\n }\r\n\r\n try {\r\n this.emitEvent(BuilderEventType.DOWNLOAD_STARTED, { fileName });\r\n \r\n const blob = new Blob([buildResult.data], { \r\n type: options.mimeType || 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' \r\n });\r\n \r\n saveAs(blob, fileName);\r\n \r\n this.emitEvent(BuilderEventType.DOWNLOAD_COMPLETED, { fileName });\r\n \r\n return { success: true, data: undefined };\r\n\r\n } catch (error) {\r\n const errorResult: IErrorResult = {\r\n success: false,\r\n error: {\r\n type: ErrorType.BUILD_ERROR,\r\n message: error instanceof Error ? error.message : 'Download failed',\r\n stack: error instanceof Error ? error.stack || '' : ''\r\n }\r\n };\r\n\r\n this.emitEvent(BuilderEventType.DOWNLOAD_ERROR, { error: errorResult.error });\r\n return errorResult;\r\n }\r\n }\r\n\r\n /**\r\n * Get workbook as buffer\r\n */\r\n async toBuffer(options: IBuildOptions = {}): Promise<Result<ArrayBuffer>> {\r\n return this.build(options);\r\n }\r\n\r\n /**\r\n * Get workbook as blob\r\n */\r\n async toBlob(options: IBuildOptions = {}): Promise<Result<Blob>> {\r\n const buildResult = await this.build(options);\r\n \r\n if (!buildResult.success) {\r\n return buildResult;\r\n }\r\n\r\n const blob = new Blob([buildResult.data], { \r\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' \r\n });\r\n \r\n return { success: true, data: blob };\r\n }\r\n\r\n /**\r\n * Validate the workbook\r\n */\r\n validate(): Result<boolean> {\r\n const errors: string[] = [];\r\n \r\n if (this.worksheets.size === 0) {\r\n errors.push('No worksheets found');\r\n }\r\n\r\n // Validate each worksheet\r\n for (const [name, worksheet] of this.worksheets.entries()) {\r\n const worksheetValidation = (worksheet as Worksheet).validate();\r\n if (!worksheetValidation.success) {\r\n errors.push(`Worksheet \"${name}\": ${worksheetValidation.error?.message}`);\r\n }\r\n }\r\n\r\n if (errors.length > 0) {\r\n return {\r\n success: false,\r\n error: {\r\n type: ErrorType.VALIDATION_ERROR,\r\n message: errors.join('; '),\r\n stack: new Error().stack || ''\r\n }\r\n };\r\n }\r\n\r\n return { success: true, data: true };\r\n }\r\n\r\n /**\r\n * Clear all worksheets\r\n */\r\n clear(): void {\r\n this.worksheets.clear();\r\n this.currentWorksheet = undefined;\r\n }\r\n\r\n /**\r\n * Get workbook statistics\r\n */\r\n getStats(): IBuildStats {\r\n return { ...this.stats };\r\n }\r\n\r\n /**\r\n * Event handling methods\r\n */\r\n on(eventType: BuilderEventType, listener: (event: IBuilderEvent) => void): string {\r\n return this.eventEmitter.on(eventType, listener);\r\n }\r\n\r\n off(eventType: BuilderEventType, listenerId: string): boolean {\r\n return this.eventEmitter.off(eventType, listenerId);\r\n }\r\n\r\n removeAllListeners(eventType?: BuilderEventType): void {\r\n if (eventType) {\r\n this.eventEmitter.offAll(eventType);\r\n } else {\r\n this.eventEmitter.clear();\r\n }\r\n }\r\n\r\n /**\r\n * Private methods\r\n */\r\n private emitEvent(type: BuilderEventType, data?: Record<string, unknown>): void {\r\n const event: IBuilderEvent = {\r\n type,\r\n data: data || {},\r\n timestamp: new Date()\r\n };\r\n this.eventEmitter.emitSync(event);\r\n }\r\n\r\n private initializeStats(): IBuildStats {\r\n return {\r\n totalWorksheets: 0,\r\n totalCells: 0,\r\n memoryUsage: 0,\r\n buildTime: 0,\r\n fileSize: 0,\r\n stylesUsed: 0,\r\n formulasUsed: 0,\r\n conditionalFormatsUsed: 0,\r\n performance: {\r\n headersTime: 0,\r\n dataTime: 0,\r\n stylesTime: 0,\r\n writeTime: 0\r\n }\r\n };\r\n }\r\n} ","/**\r\n * StyleBuilder - Fluent API for creating Excel styles\r\n */\r\n\r\nimport {\r\n IStyle,\r\n IBorder,\r\n IConditionalFormat,\r\n IStyleBuilder as IStyleBuilderInterface\r\n} from '../types/style.types';\r\nimport { \r\n Color, \r\n HorizontalAlignment,\r\n VerticalAlignment,\r\n BorderStyle, \r\n FontStyle \r\n} from '../types/core.types';\r\n\r\n/**\r\n * StyleBuilder class providing a fluent API for creating Excel styles\r\n */\r\nexport class StyleBuilder implements IStyleBuilderInterface {\r\n private style: Partial<IStyle> = {};\r\n\r\n constructor() {\r\n // Configuración por defecto: wrapText true y alineación al centro\r\n this.style.alignment = {\r\n horizontal: HorizontalAlignment.CENTER,\r\n vertical: VerticalAlignment.MIDDLE,\r\n wrapText: true,\r\n shrinkToFit: true\r\n };\r\n }\r\n\r\n /**\r\n * Create a new StyleBuilder instance\r\n */\r\n static create(): StyleBuilder {\r\n return new StyleBuilder();\r\n }\r\n\r\n /**\r\n * Set font name\r\n */\r\n fontName(name: string): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.name = name;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set font size\r\n */\r\n fontSize(size: number): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.size = size;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set font style\r\n */\r\n fontStyle(style: FontStyle): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.style = style;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set font color\r\n */\r\n fontColor(color: Color): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.color = color;\r\n return this;\r\n }\r\n\r\n /**\r\n * Make font bold\r\n */\r\n fontBold(): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.bold = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Make font italic\r\n */\r\n fontItalic(): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.italic = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Make font underlined\r\n */\r\n fontUnderline(): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.underline = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set border on all sides\r\n */\r\n border(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.top = border;\r\n this.style.border.left = border;\r\n this.style.border.bottom = border;\r\n this.style.border.right = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set top border\r\n */\r\n borderTop(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.top = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set left border\r\n */\r\n borderLeft(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.left = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set bottom border\r\n */\r\n borderBottom(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.bottom = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set right border\r\n */\r\n borderRight(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.right = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set background color\r\n */\r\n backgroundColor(color: Color): StyleBuilder {\r\n if (!this.style.fill) {\r\n this.style.fill = { type: 'pattern' };\r\n }\r\n this.style.fill.backgroundColor = color;\r\n this.style.fill.pattern = 'solid';\r\n return this;\r\n }\r\n\r\n /**\r\n * Set horizontal alignment\r\n */\r\n horizontalAlign(alignment: HorizontalAlignment): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.horizontal = alignment;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set vertical alignment\r\n */\r\n verticalAlign(alignment: VerticalAlignment): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.vertical = alignment;\r\n return this;\r\n }\r\n\r\n /**\r\n * Center align text\r\n */\r\n centerAlign(): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.horizontal = HorizontalAlignment.CENTER;\r\n this.style.alignment.vertical = VerticalAlignment.MIDDLE;\r\n return this;\r\n }\r\n\r\n /**\r\n * Left align text\r\n */\r\n leftAlign(): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.horizontal = HorizontalAlignment.LEFT;\r\n return this;\r\n }\r\n\r\n /**\r\n * Right align text\r\n */\r\n rightAlign(): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.horizontal = HorizontalAlignment.RIGHT;\r\n return this;\r\n }\r\n\r\n /**\r\n * Wrap text\r\n */\r\n wrapText(): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.wrapText = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set number format\r\n */\r\n numberFormat(format: string): StyleBuilder {\r\n this.style.numberFormat = format;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set striped rows\r\n */\r\n striped(): StyleBuilder {\r\n this.style.striped = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Add conditional formatting\r\n */\r\n conditionalFormat(format: IConditionalFormat): StyleBuilder {\r\n if (!this.style.conditionalFormats) {\r\n this.style.conditionalFormats = [];\r\n }\r\n this.style.conditionalFormats.push(format);\r\n return this;\r\n }\r\n\r\n /**\r\n * Build the final style\r\n */\r\n build(): IStyle {\r\n return this.style as IStyle;\r\n }\r\n\r\n /**\r\n * Reset the builder\r\n */\r\n reset(): StyleBuilder {\r\n this.style = {};\r\n // Restaurar configuración por defecto\r\n this.style.alignment = {\r\n horizontal: HorizontalAlignment.CENTER,\r\n vertical: VerticalAlignment.MIDDLE,\r\n wrapText: true\r\n };\r\n return this;\r\n }\r\n\r\n /**\r\n * Clone the current style\r\n */\r\n clone(): StyleBuilder {\r\n const cloned = new StyleBuilder();\r\n cloned.style = JSON.parse(JSON.stringify(this.style));\r\n return cloned;\r\n }\r\n} ","/**\r\n * Cell-specific type definitions\r\n */\r\n\r\nimport { IBaseCell } from './core.types';\r\nimport type { CellValue } from 'exceljs';\r\n\r\n/**\r\n * Header cell interface\r\n */\r\nexport interface IHeaderCell extends IBaseCell {\r\n /** Reference to parent header key */\r\n mainHeaderKey?: string;\r\n /** Child headers */\r\n children?: IHeaderCell[];\r\n /** Whether this is a main header */\r\n isMainHeader?: boolean;\r\n /** Header level (1 = main, 2 = sub, etc.) */\r\n level?: number;\r\n}\r\n\r\n/**\r\n * Data cell interface\r\n */\r\nexport interface IDataCell extends IBaseCell {\r\n /** Reference to header key */\r\n header: string;\r\n /** Reference to main header key */\r\n mainHeaderKey?: string;\r\n /** Child data cells */\r\n children?: IDataCell[];\r\n /** Whether this cell has alternating row color */\r\n striped?: boolean;\r\n /** Row index */\r\n rowIndex?: number;\r\n /** Column index */\r\n colIndex?: number;\r\n}\r\n\r\n/**\r\n * Footer cell interface\r\n */\r\nexport interface IFooterCell extends IBaseCell {\r\n /** Reference to header key */\r\n header: string;\r\n /** Child footer cells */\r\n children?: IDataCell[];\r\n /** Whether this is a total row */\r\n isTotal?: boolean;\r\n /** Footer type */\r\n footerType?: 'total' | 'subtotal' | 'average' | 'count' | 'custom';\r\n}\r\n\r\n/**\r\n * Cell position interface\r\n */\r\nexport interface ICellPosition {\r\n /** Row index (1-based) */\r\n row: number;\r\n /** Column index (1-based) */\r\n col: number;\r\n /** Cell reference (e.g., A1) */\r\n reference: string;\r\n}\r\n\r\n/**\r\n * Cell range interface\r\n */\r\nexport interface ICellRange {\r\n /** Start position */\r\n start: ICellPosition;\r\n /** End position */\r\n end: ICellPosition;\r\n /** Range reference (e.g., A1:B10) */\r\n reference: string;\r\n}\r\n\r\n/**\r\n * Cell data for different types\r\n */\r\nexport interface ICellData {\r\n /** String cell data */\r\n string?: {\r\n value: string;\r\n maxLength?: number;\r\n trim?: boolean;\r\n };\r\n /** Number cell data */\r\n number?: {\r\n value: number;\r\n min?: number;\r\n max?: number;\r\n precision?: number;\r\n allowNegative?: boolean;\r\n };\r\n /** Date cell data */\r\n date?: {\r\n value: Date;\r\n min?: Date;\r\n max?: Date;\r\n format?: string;\r\n };\r\n /** Boolean cell data */\r\n boolean?: {\r\n value: boolean;\r\n trueText?: string;\r\n falseText?: string;\r\n };\r\n /** Percentage cell data */\r\n percentage?: {\r\n value: number;\r\n min?: number;\r\n max?: number;\r\n precision?: number;\r\n showSymbol?: boolean;\r\n };\r\n /** Currency cell data */\r\n currency?: {\r\n value: number;\r\n currency?: string;\r\n precision?: number;\r\n showSymbol?: boolean;\r\n };\r\n /** Link cell data */\r\n link?: {\r\n value: string;\r\n text?: string;\r\n tooltip?: string;\r\n };\r\n /** Formula cell data */\r\n formula?: {\r\n value: string;\r\n result?: CellValue;\r\n };\r\n}\r\n\r\n/**\r\n * Cell validation result\r\n */\r\nexport interface ICellValidationResult {\r\n /** Whether the cell is valid */\r\n isValid: boolean;\r\n /** Validation errors */\r\n errors: string[];\r\n /** Validation warnings */\r\n warnings: string[];\r\n}\r\n\r\n/**\r\n * Cell event types\r\n */\r\nexport enum CellEventType {\r\n CREATED = 'created',\r\n UPDATED = 'updated',\r\n DELETED = 'deleted',\r\n STYLED = 'styled',\r\n VALIDATED = 'validated'\r\n}\r\n\r\n/**\r\n * Cell event interface\r\n */\r\nexport interface ICellEvent {\r\n type: CellEventType;\r\n cell: IDataCell | IHeaderCell | IFooterCell;\r\n position: ICellPosition;\r\n timestamp: Date;\r\n data?: Record<string, unknown>;\r\n} ","/**\r\n * Worksheet-specific type definitions\r\n */\r\n\r\nimport { IHeaderCell, IDataCell, IFooterCell, ICellPosition, ICellRange } from './cell.types';\r\nimport { Color, Result } from './core.types';\r\n\r\n/**\r\n * Worksheet configuration interface\r\n */\r\nexport interface IWorksheetConfig {\r\n /** Worksheet name */\r\n name: string;\r\n /** Tab color */\r\n tabColor?: Color;\r\n /** Default row height */\r\n defaultRowHeight?: number;\r\n /** Default column width */\r\n defaultColWidth?: number;\r\n /** Whether the worksheet is hidden */\r\n hidden?: boolean;\r\n /** Whether the worksheet is protected */\r\n protected?: boolean;\r\n /** Protection password */\r\n protectionPassword?: string;\r\n /** Whether to show grid lines */\r\n showGridLines?: boolean;\r\n /** Whether to show row and column headers */\r\n showRowColHeaders?: boolean;\r\n /** Zoom level (1-400) */\r\n zoom?: number;\r\n /** Freeze panes position */\r\n freezePanes?: ICellPosition;\r\n /** Print area */\r\n printArea?: ICellRange;\r\n /** Fit to page settings */\r\n fitToPage?: {\r\n fitToWidth?: number;\r\n fitToHeight?: number;\r\n };\r\n /** Page setup */\r\n pageSetup?: {\r\n orientation?: 'portrait' | 'landscape';\r\n paperSize?: number;\r\n fitToPage?: boolean;\r\n fitToWidth?: number;\r\n fitToHeight?: number;\r\n scale?: number;\r\n horizontalCentered?: boolean;\r\n verticalCentered?: boolean;\r\n margins?: {\r\n top?: number;\r\n left?: number;\r\n bottom?: number;\r\n right?: number;\r\n header?: number;\r\n footer?: number;\r\n };\r\n };\r\n}\r\n\r\n/**\r\n * Table structure interface\r\n */\r\nexport interface ITable {\r\n /** Table name */\r\n name?: string;\r\n /** Table headers */\r\n headers?: IHeaderCell[];\r\n /** Table sub-headers */\r\n subHeaders?: IHeaderCell[];\r\n /** Table data rows */\r\n body?: IDataCell[];\r\n /** Table footers */\r\n footers?: IFooterCell[];\r\n /** Table range */\r\n range?: ICellRange;\r\n /** Whether to show table borders */\r\n showBorders?: boolean;\r\n /** Whether to show alternating row colors */\r\n showStripes?: boolean;\r\n /** Table style */\r\n style?: 'TableStyleLight1' | 'TableStyleLight2' | 'TableStyleMedium1' | 'TableStyleMedium2' | 'TableStyleDark1' | 'TableStyleDark2';\r\n}\r\n\r\n/**\r\n * Worksheet interface\r\n */\r\nexport interface IWorksheet {\r\n /** Worksheet configuration */\r\n config: IWorksheetConfig;\r\n /** Tables in the worksheet */\r\n tables: ITable[];\r\n /** Current row pointer */\r\n currentRow: number;\r\n /** Current column pointer */\r\n currentCol: number;\r\n /** Header pointers for navigation */\r\n headerPointers: Map<string, ICellPosition>;\r\n /** Whether the worksheet has been built */\r\n isBuilt: boolean;\r\n\r\n /** Add a header */\r\n addHeader(header: IHeaderCell): this;\r\n /** Add subheaders */\r\n addSubHeaders(subHeaders: IHeaderCell[]): this;\r\n /** Add a row or rows */\r\n addRow(row: IDataCell[] | IDataCell): this;\r\n /** Add a footer or footers */\r\n addFooter(footer: IFooterCell[] | IFooterCell): this;\r\n /** Add a new table to the worksheet */\r\n addTable(tableConfig?: Partial<ITable>): this;\r\n /** Finalize the current table with temporary data */\r\n finalizeTable(): this;\r\n /** Get a table by name */\r\n getTable(name: string): ITable | undefined;\r\n /** Build the worksheet */\r\n build(workbook: any, options?: any): Promise<void>;\r\n /** Validate the worksheet */\r\n validate(): Result<boolean>;\r\n}\r\n\r\n/**\r\n * Worksheet event types\r\n */\r\nexport enum WorksheetEventType {\r\n CREATED = 'created',\r\n UPDATED = 'updated',\r\n DELETED = 'deleted',\r\n TABLE_ADDED = 'tableAdded',\r\n TABLE_REMOVED = 'tableRemoved',\r\n CELL_ADDED = 'cellAdded',\r\n CELL_UPDATED = 'cellUpdated',\r\n CELL_DELETED = 'cellDeleted'\r\n}\r\n\r\n/**\r\n * Worksheet event interface\r\n */\r\nexport interface IWorksheetEvent {\r\n type: WorksheetEventType;\r\n worksheet: IWorksheet;\r\n data?: Record<string, unknown>;\r\n timestamp: Date;\r\n}\r\n\r\n/**\r\n * Worksheet validation result\r\n */\r\nexport interface IWorksheetValidationResult {\r\n /** Whether the worksheet is valid */\r\n isValid: boolean;\r\n /** Validation errors */\r\n errors: string[];\r\n /** Validation warnings */\r\n warnings: string[];\r\n /** Cell validation results */\r\n cellResults: Map<string, boolean>;\r\n}\r\n\r\n/**\r\n * Worksheet statistics\r\n */\r\nexport interface IWorksheetStats {\r\n /** Total number of cells */\r\n totalCells: number;\r\n /** Number of header cells */\r\n headerCells: number;\r\n /** Number of data cells */\r\n dataCells: number;\r\n /** Number of footer cells */\r\n footerCells: number;\r\n /** Number of tables */\r\n tables: number;\r\n /** Used range */\r\n usedRange: ICellRange;\r\n /** Memory usage in bytes */\r\n memoryUsage: number;\r\n} ","/**\r\n * Style-specific type definitions\r\n */\r\n\r\nimport { \r\n Color, \r\n HorizontalAlignment, \r\n VerticalAlignment, \r\n BorderStyle, \r\n FontStyle \r\n} from './core.types';\r\n\r\n/**\r\n * Font configuration interface\r\n */\r\nexport interface IFont {\r\n /** Font name */\r\n name?: string;\r\n /** Font size */\r\n size?: number;\r\n /** Font style */\r\n style?: FontStyle;\r\n /** Font color */\r\n color?: Color;\r\n /** Whether the font is bold */\r\n bold?: boolean;\r\n /** Whether the font is italic */\r\n italic?: boolean;\r\n /** Whether the font is underlined */\r\n underline?: boolean;\r\n /** Whether the font is strikethrough */\r\n strikethrough?: boolean;\r\n /** Font family */\r\n family?: string;\r\n /** Font scheme */\r\n scheme?: 'major' | 'minor' | 'none';\r\n}\r\n\r\n/**\r\n * Border configuration interface\r\n */\r\nexport interface IBorder {\r\n /** Border style */\r\n style?: BorderStyle;\r\n /** Border color */\r\n color?: Color;\r\n /** Border width */\r\n width?: number;\r\n}\r\n\r\n/**\r\n * Border sides interface\r\n */\r\nexport interface IBorderSides {\r\n /** Top border */\r\n top?: IBorder;\r\n /** Left border */\r\n left?: IBorder;\r\n /** Bottom border */\r\n bottom?: IBorder;\r\n /** Right border */\r\n right?: IBorder;\r\n /** Diagonal border */\r\n diagonal?: IBorder;\r\n /** Diagonal direction */\r\n diagonalDirection?: 'up' | 'down' | 'both';\r\n}\r\n\r\n/**\r\n * Fill pattern interface\r\n */\r\nexport interface IFill {\r\n /** Fill type */\r\n type: 'pattern' | 'gradient';\r\n /** Pattern type (for pattern fills) */\r\n pattern?: 'none' | 'solid' | 'darkGray' | 'mediumGray' | 'lightGray' | 'gray125' | 'gray0625' | 'darkHorizontal' | 'darkVertical' | 'darkDown' | 'darkUp' | 'darkGrid' | 'darkTrellis' | 'lightHorizontal' | 'lightVertical' | 'lightDown' | 'lightUp' | 'lightGrid' | 'lightTrellis';\r\n /** Background color */\r\n backgroundColor?: Color;\r\n /** Foreground color */\r\n foregroundColor?: Color;\r\n /** Gradient type (for gradient fills) */\r\n gradient?: 'linear' | 'path';\r\n /** Gradient stops */\r\n stops?: Array<{\r\n position: number;\r\n color: Color;\r\n }>;\r\n /** Gradient angle (for linear gradients) */\r\n angle?: number;\r\n}\r\n\r\n/**\r\n * Alignment configuration interface\r\n */\r\nexport interface IAlignment {\r\n /** Horizontal alignment */\r\n horizontal?: HorizontalAlignment;\r\n /** Vertical alignment */\r\n vertical?: VerticalAlignment;\r\n /** Text rotation (0-180 degrees) */\r\n textRotation?: number;\r\n /** Whether to wrap text */\r\n wrapText?: boolean;\r\n /** Whether to shrink text to fit */\r\n shrinkToFit?: boolean;\r\n /** Indent level */\r\n indent?: number;\r\n /** Whether to merge cells */\r\n mergeCell?: boolean;\r\n /** Reading order */\r\n readingOrder?: 'left-to-right' | 'right-to-left';\r\n}\r\n\r\n/**\r\n * Protection configuration interface\r\n */\r\nexport interface IProtection {\r\n /** Whether the cell is locked */\r\n locked?: boolean;\r\n /** Whether the cell is hidden */\r\n hidden?: boolean;\r\n}\r\n\r\n/**\r\n * Conditional formatting interface\r\n */\r\nexport interface IConditionalFormat {\r\n /** Condition type */\r\n type: 'cellIs' | 'containsText' | 'beginsWith' | 'endsWith' | 'containsBlanks' | 'notContainsBlanks' | 'containsErrors' | 'notContainsErrors' | 'timePeriod' | 'top' | 'bottom' | 'aboveAverage' | 'belowAverage' | 'duplicateValues' | 'uniqueValues' | 'expression' | 'colorScale' | 'dataBar' | 'iconSet';\r\n /** Condition operator */\r\n operator?: 'between' | 'notBetween' | 'equal' | 'notEqual' | 'greaterThan' | 'lessThan' | 'greaterThanOrEqual' | 'lessThanOrEqual';\r\n /** Condition values */\r\n values?: Array<string | number | Date>;\r\n /** Condition formula */\r\n formula?: string;\r\n /** Style to apply when condition is met */\r\n style?: IStyle;\r\n /** Priority of the condition */\r\n priority?: number;\r\n /** Whether to stop if true */\r\n stopIfTrue?: boolean;\r\n}\r\n\r\n/**\r\n * Main style interface\r\n */\r\nexport interface IStyle {\r\n /** Font configuration */\r\n font?: IFont;\r\n /** Border configuration */\r\n border?: IBorderSides;\r\n /** Fill configuration */\r\n fill?: IFill;\r\n /** Alignment configuration */\r\n alignment?: IAlignment;\r\n /** Protection configuration */\r\n protection?: IProtection;\r\n /** Conditional formatting */\r\n conditionalFormats?: IConditionalFormat[];\r\n /** Number format */\r\n numberFormat?: string;\r\n /** Whether to apply alternating row colors */\r\n striped?: boolean;\r\n /** Custom CSS-like properties */\r\n custom?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Style preset types\r\n */\r\nexport enum StylePreset {\r\n HEADER = 'header',\r\n SUBHEADER = 'subheader',\r\n DATA = 'data',\r\n FOOTER = 'footer',\r\n TOTAL = 'total',\r\n HIGHLIGHT = 'highlight',\r\n WARNING = 'warning',\r\n ERROR = 'error',\r\n SUCCESS = 'success',\r\n INFO = 'info'\r\n}\r\n\r\n/**\r\n * Style theme interface\r\n */\r\nexport interface IStyleTheme {\r\n /** Theme name */\r\n name: string;\r\n /** Theme description */\r\n description?: string;\r\n /** Color palette */\r\n colors: {\r\n primary: Color;\r\n secondary: Color;\r\n accent: Color;\r\n background: Color;\r\n text: Color;\r\n border: Color;\r\n success: Color;\r\n warning: Color;\r\n error: Color;\r\n info: Color;\r\n };\r\n /** Font family */\r\n fontFamily: string;\r\n /** Base font size */\r\n fontSize: number;\r\n /** Style presets */\r\n presets: Record<StylePreset, IStyle>;\r\n}\r\n\r\n/**\r\n * Style builder interface\r\n */\r\nexport interface IStyleBuilder {\r\n /** Set font name */\r\n fontName(name: string): IStyleBuilder;\r\n /** Set font size */\r\n fontSize(size: number): IStyleBuilder;\r\n /** Set font style */\r\n fontStyle(style: FontStyle): IStyleBuilder;\r\n /** Set font color */\r\n fontColor(color: Color): IStyleBuilder;\r\n /** Make font bold */\r\n fontBold(): IStyleBuilder;\r\n /** Make font italic */\r\n fontItalic(): IStyleBuilder;\r\n /** Make font underlined */\r\n fontUnderline(): IStyleBuilder;\r\n /** Set border */\r\n border(style: BorderStyle, color?: Color): IStyleBuilder;\r\n /** Set specific border */\r\n borderTop(style: BorderStyle, color?: Color): IStyleBuilder;\r\n borderLeft(style: BorderStyle, color?: Color): IStyleBuilder;\r\n borderBottom(style: BorderStyle, color?: Color): IStyleBuilder;\r\n borderRight(style: BorderStyle, color?: Color): IStyleBuilder;\r\n /** Set background color */\r\n backgroundColor(color: Color): IStyleBuilder;\r\n /** Set horizontal alignment */\r\n horizontalAlign(alignment: HorizontalAlignment): IStyleBuilder;\r\n /** Set vertical alignment */\r\n verticalAlign(alignment: VerticalAlignment): IStyleBuilder;\r\n /** Center align text */\r\n centerAlign(): IStyleBuilder;\r\n /** Left align text */\r\n leftAlign(): IStyleBuilder;\r\n /** Right align text */\r\n rightAlign(): IStyleBuilder;\r\n /** Wrap text */\r\n wrapText(): IStyleBuilder;\r\n /** Set number format */\r\n numberFormat(format: string): IStyleBuilder;\r\n /** Set striped rows */\r\n striped(): IStyleBuilder;\r\n /** Add conditional formatting */\r\n conditionalFormat(format: IConditionalFormat): IStyleBuilder;\r\n /** Build the final style */\r\n build(): IStyle;\r\n} "],"names":["CellType","NumberFormat","HorizontalAlignment","VerticalAlignment","BorderStyle","FontStyle","ErrorType","BuilderEventType","CellEventType","WorksheetEventType","StylePreset"],"mappings":"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"}
1
+ {"version":3,"file":"han-excel.es.js","sources":["../src/utils/EventEmitter.ts","../src/types/core.types.ts","../src/core/Worksheet.ts","../src/types/builder.types.ts","../src/core/ExcelBuilder.ts","../src/styles/StyleBuilder.ts","../src/types/cell.types.ts","../src/types/worksheet.types.ts","../src/types/style.types.ts"],"sourcesContent":["/**\r\n * Simple EventEmitter implementation\r\n */\r\n\r\n/**\r\n * Event listener function type\r\n */\r\nexport type EventListener<T = any> = (event: T) => void | Promise<void>;\r\n\r\n/**\r\n * Event listener options\r\n */\r\nexport interface EventListenerOptions {\r\n /** Whether to execute the listener only once */\r\n once?: boolean;\r\n /** Whether to execute the listener asynchronously */\r\n async?: boolean;\r\n /** Priority of the listener (higher = executed first) */\r\n priority?: number;\r\n /** Whether to stop event propagation */\r\n stopPropagation?: boolean;\r\n}\r\n\r\n/**\r\n * Event listener registration\r\n */\r\nexport interface EventListenerRegistration {\r\n /** Event type */\r\n type: string;\r\n /** Listener function */\r\n listener: EventListener;\r\n /** Listener options */\r\n options: EventListenerOptions;\r\n /** Registration ID */\r\n id: string;\r\n /** Whether the listener is active */\r\n active: boolean;\r\n /** Registration timestamp */\r\n timestamp: Date;\r\n}\r\n\r\n/**\r\n * EventEmitter class for handling events\r\n */\r\nexport class EventEmitter {\r\n private listeners: Map<string, EventListenerRegistration[]> = new Map();\r\n\r\n /**\r\n * Add an event listener\r\n */\r\n on<T = any>(type: string, listener: EventListener<T>, options: EventListenerOptions = {}): string {\r\n if (!this.listeners.has(type)) {\r\n this.listeners.set(type, []);\r\n }\r\n\r\n const registration: EventListenerRegistration = {\r\n type,\r\n listener: listener as EventListener,\r\n options: {\r\n once: false,\r\n async: false,\r\n priority: 0,\r\n stopPropagation: false,\r\n ...options\r\n },\r\n id: this.generateId(),\r\n active: true,\r\n timestamp: new Date()\r\n };\r\n\r\n this.listeners.get(type)!.push(registration);\r\n \r\n // Sort by priority (higher priority first)\r\n this.listeners.get(type)!.sort((a, b) => (b.options.priority || 0) - (a.options.priority || 0));\r\n\r\n return registration.id;\r\n }\r\n\r\n /**\r\n * Add a one-time event listener\r\n */\r\n once<T = any>(type: string, listener: EventListener<T>, options: EventListenerOptions = {}): string {\r\n return this.on(type, listener, { ...options, once: true });\r\n }\r\n\r\n /**\r\n * Remove an event listener\r\n */\r\n off(type: string, listenerId: string): boolean {\r\n const listeners = this.listeners.get(type);\r\n if (!listeners) {\r\n return false;\r\n }\r\n\r\n const index = listeners.findIndex(reg => reg.id === listenerId);\r\n if (index === -1) {\r\n return false;\r\n }\r\n\r\n listeners.splice(index, 1);\r\n return true;\r\n }\r\n\r\n /**\r\n * Remove all listeners for an event type\r\n */\r\n offAll(type: string): number {\r\n const listeners = this.listeners.get(type);\r\n if (!listeners) {\r\n return 0;\r\n }\r\n\r\n const count = listeners.length;\r\n this.listeners.delete(type);\r\n return count;\r\n }\r\n\r\n /**\r\n * Emit an event\r\n */\r\n async emit<T = any>(event: T): Promise<void> {\r\n const type = (event as any).type || 'default';\r\n const listeners = this.listeners.get(type);\r\n \r\n if (!listeners || listeners.length === 0) {\r\n return;\r\n }\r\n\r\n const activeListeners = listeners.filter(reg => reg.active);\r\n \r\n for (const registration of activeListeners) {\r\n try {\r\n if (registration.options.once) {\r\n registration.active = false;\r\n }\r\n\r\n if (registration.options.async) {\r\n await registration.listener(event);\r\n } else {\r\n registration.listener(event);\r\n }\r\n\r\n if (registration.options.stopPropagation) {\r\n break;\r\n }\r\n } catch (error) {\r\n console.error(`Error in event listener for ${type}:`, error);\r\n }\r\n }\r\n\r\n // Clean up inactive listeners\r\n this.cleanupInactiveListeners(type);\r\n }\r\n\r\n /**\r\n * Emit an event synchronously\r\n */\r\n emitSync<T = any>(event: T): void {\r\n const type = (event as any).type || 'default';\r\n const listeners = this.listeners.get(type);\r\n \r\n if (!listeners || listeners.length === 0) {\r\n return;\r\n }\r\n\r\n const activeListeners = listeners.filter(reg => reg.active);\r\n \r\n for (const registration of activeListeners) {\r\n try {\r\n if (registration.options.once) {\r\n registration.active = false;\r\n }\r\n\r\n registration.listener(event);\r\n\r\n if (registration.options.stopPropagation) {\r\n break;\r\n }\r\n } catch (error) {\r\n console.error(`Error in event listener for ${type}:`, error);\r\n }\r\n }\r\n\r\n // Clean up inactive listeners\r\n this.cleanupInactiveListeners(type);\r\n }\r\n\r\n /**\r\n * Clear all listeners\r\n */\r\n clear(): void {\r\n this.listeners.clear();\r\n }\r\n\r\n /**\r\n * Get listeners for an event type\r\n */\r\n getListeners(type: string): EventListenerRegistration[] {\r\n return this.listeners.get(type) || [];\r\n }\r\n\r\n /**\r\n * Get listener count for an event type\r\n */\r\n getListenerCount(type: string): number {\r\n return this.listeners.get(type)?.length || 0;\r\n }\r\n\r\n /**\r\n * Get all registered event types\r\n */\r\n getEventTypes(): string[] {\r\n return Array.from(this.listeners.keys());\r\n }\r\n\r\n // Private methods\r\n\r\n private generateId(): string {\r\n return Math.random().toString(36).substr(2, 9);\r\n }\r\n\r\n private cleanupInactiveListeners(type: string): void {\r\n const listeners = this.listeners.get(type);\r\n if (listeners) {\r\n const activeListeners = listeners.filter(reg => reg.active);\r\n if (activeListeners.length !== listeners.length) {\r\n this.listeners.set(type, activeListeners);\r\n }\r\n }\r\n }\r\n} ","/**\r\n * Core type definitions for Han Excel Builder\r\n */\r\n\r\nimport { CellValue } from 'exceljs';\r\n\r\n/**\r\n * Supported cell data types\r\n */\r\nexport enum CellType {\r\n STRING = 'string',\r\n NUMBER = 'number',\r\n BOOLEAN = 'boolean',\r\n DATE = 'date',\r\n PERCENTAGE = 'percentage',\r\n CURRENCY = 'currency',\r\n LINK = 'link',\r\n FORMULA = 'formula'\r\n}\r\n\r\n/**\r\n * Number format options\r\n */\r\nexport enum NumberFormat {\r\n GENERAL = 'General',\r\n NUMBER = '#,##0',\r\n NUMBER_DECIMALS = '#,##0.00',\r\n CURRENCY = '$#,##0.00',\r\n CURRENCY_INTEGER = '$#,##0',\r\n PERCENTAGE = '0%',\r\n PERCENTAGE_DECIMALS = '0.00%',\r\n DATE = 'dd/mm/yyyy',\r\n DATE_TIME = 'dd/mm/yyyy hh:mm',\r\n TIME = 'hh:mm:ss',\r\n CUSTOM = 'custom'\r\n}\r\n\r\n/**\r\n * Horizontal alignment options\r\n */\r\nexport enum HorizontalAlignment {\r\n LEFT = 'left',\r\n CENTER = 'center',\r\n RIGHT = 'right',\r\n FILL = 'fill',\r\n JUSTIFY = 'justify',\r\n CENTER_CONTINUOUS = 'centerContinuous',\r\n DISTRIBUTED = 'distributed'\r\n}\r\n\r\n/**\r\n * Vertical alignment options\r\n */\r\nexport enum VerticalAlignment {\r\n TOP = 'top',\r\n MIDDLE = 'middle',\r\n BOTTOM = 'bottom',\r\n DISTRIBUTED = 'distributed',\r\n JUSTIFY = 'justify'\r\n}\r\n\r\n/**\r\n * Border style options\r\n */\r\nexport enum BorderStyle {\r\n THIN = 'thin',\r\n MEDIUM = 'medium',\r\n THICK = 'thick',\r\n DOTTED = 'dotted',\r\n DASHED = 'dashed',\r\n DOUBLE = 'double',\r\n HAIR = 'hair',\r\n MEDIUM_DASHED = 'mediumDashed',\r\n DASH_DOT = 'dashDot',\r\n MEDIUM_DASH_DOT = 'mediumDashDot',\r\n DASH_DOT_DOT = 'dashDotDot',\r\n MEDIUM_DASH_DOT_DOT = 'mediumDashDotDot',\r\n SLANT_DASH_DOT = 'slantDashDot'\r\n}\r\n\r\n/**\r\n * Font style options\r\n */\r\nexport enum FontStyle {\r\n NORMAL = 'normal',\r\n BOLD = 'bold',\r\n ITALIC = 'italic',\r\n BOLD_ITALIC = 'bold italic'\r\n}\r\n\r\n/**\r\n * Color type - can be hex string, RGB object, or theme color\r\n */\r\nexport type Color = string | { r: number; g: number; b: number } | { theme: number };\r\n\r\n/**\r\n * Base cell properties interface\r\n */\r\nexport interface IBaseCell {\r\n /** Unique identifier for the cell */\r\n key: string;\r\n /** Cell data type */\r\n type: CellType;\r\n /** Cell value */\r\n value: CellValue;\r\n /** Optional cell reference (e.g., A1, B2) */\r\n reference?: string;\r\n /** Whether to merge this cell with others */\r\n mergeCell?: boolean;\r\n /** Number of columns to merge (if mergeCell is true) */\r\n mergeTo?: number;\r\n /** Row height for this cell */\r\n rowHeight?: number;\r\n /** Column width for this cell */\r\n colWidth?: number;\r\n /** Whether to move to next row after this cell */\r\n jump?: boolean;\r\n /** Hyperlink URL */\r\n link?: string;\r\n /** Excel formula */\r\n formula?: string;\r\n /** Number format for numeric cells */\r\n numberFormat?: NumberFormat | string;\r\n /** Custom number format string */\r\n customNumberFormat?: string;\r\n /** Whether the cell is protected */\r\n protected?: boolean;\r\n /** Whether the cell is hidden */\r\n hidden?: boolean;\r\n /** Cell comment */\r\n comment?: string;\r\n /** Data validation rules */\r\n validation?: IDataValidation;\r\n /** Optional styles for the cell */\r\n styles?: import('./style.types').IStyle;\r\n /** Legacy children cells */\r\n childrens?: IBaseCell[];\r\n /** Modern children cells */\r\n children?: IBaseCell[];\r\n}\r\n\r\n/**\r\n * Data validation interface\r\n */\r\nexport interface IDataValidation {\r\n /** Validation type */\r\n type: 'list' | 'whole' | 'decimal' | 'textLength' | 'date' | 'time' | 'custom';\r\n /** Validation operator */\r\n operator?: 'between' | 'notBetween' | 'equal' | 'notEqual' | 'greaterThan' | 'lessThan' | 'greaterThanOrEqual' | 'lessThanOrEqual';\r\n /** Validation formula or values */\r\n formula1?: string | number | Date;\r\n /** Second validation formula or value (for between/notBetween) */\r\n formula2?: string | number | Date;\r\n /** Whether to show error message */\r\n showErrorMessage?: boolean;\r\n /** Error message text */\r\n errorMessage?: string;\r\n /** Whether to show input message */\r\n showInputMessage?: boolean;\r\n /** Input message text */\r\n inputMessage?: string;\r\n /** Whether to allow blank values */\r\n allowBlank?: boolean;\r\n}\r\n\r\n/**\r\n * Workbook metadata interface\r\n */\r\nexport interface IWorkbookMetadata {\r\n /** Workbook author */\r\n author?: string;\r\n /** Workbook title */\r\n title?: string;\r\n /** Workbook subject */\r\n subject?: string;\r\n /** Workbook keywords */\r\n keywords?: string;\r\n /** Workbook category */\r\n category?: string;\r\n /** Workbook description */\r\n description?: string;\r\n /** Workbook company */\r\n company?: string;\r\n /** Workbook manager */\r\n manager?: string;\r\n /** Creation date */\r\n created?: Date;\r\n /** Last modified date */\r\n modified?: Date;\r\n /** Application name */\r\n application?: string;\r\n /** Application version */\r\n appVersion?: string;\r\n /** Hyperlink base */\r\n hyperlinkBase?: string;\r\n}\r\n\r\n/**\r\n * Error types for validation\r\n */\r\nexport enum ErrorType {\r\n VALIDATION_ERROR = 'VALIDATION_ERROR',\r\n BUILD_ERROR = 'BUILD_ERROR',\r\n STYLE_ERROR = 'STYLE_ERROR',\r\n WORKSHEET_ERROR = 'WORKSHEET_ERROR',\r\n CELL_ERROR = 'CELL_ERROR'\r\n}\r\n\r\n/**\r\n * Error interface\r\n */\r\nexport interface IError {\r\n type: ErrorType;\r\n message: string;\r\n code?: string;\r\n details?: Record<string, unknown>;\r\n stack?: string;\r\n}\r\n\r\n/**\r\n * Success result interface\r\n */\r\nexport interface ISuccessResult<T = unknown> {\r\n success: true;\r\n data: T;\r\n message?: string;\r\n}\r\n\r\n/**\r\n * Error result interface\r\n */\r\nexport interface IErrorResult {\r\n success: false;\r\n error: IError;\r\n}\r\n\r\n/**\r\n * Result union type\r\n */\r\nexport type Result<T = unknown> = ISuccessResult<T> | IErrorResult; ","import ExcelJS from 'exceljs';\nimport {\n IWorksheet,\n IWorksheetConfig,\n ITable\n} from '../types/worksheet.types';\nimport {\n IDataCell,\n IHeaderCell,\n IFooterCell\n} from '../types/cell.types';\nimport { IBuildOptions } from '../types/builder.types';\nimport { Result, ErrorType } from '../types/core.types';\n\n/**\n * Worksheet - Representa una hoja de cálculo dentro del builder\n *\n2 * Soporta headers, subheaders anidados, rows, footers, children y estilos por celda.\n */\nexport class Worksheet implements IWorksheet {\n public config: IWorksheetConfig;\n public tables: ITable[] = [];\n public currentRow = 1;\n public currentCol = 1;\n public headerPointers: Map<string, any> = new Map();\n public isBuilt = false;\n\n // Estructuras temporales para la tabla actual\n private headers: IHeaderCell[] = [];\n private subHeaders: IHeaderCell[] = [];\n private body: IDataCell[] = [];\n private footers: IFooterCell[] = [];\n\n constructor(config: IWorksheetConfig) {\n this.config = config;\n }\n\n /**\n * Agrega un header principal\n */\n addHeader(header: IHeaderCell): this {\n this.headers.push(header);\n return this;\n }\n\n /**\n * Agrega subheaders (ahora soporta anidación)\n */\n addSubHeaders(subHeaders: IHeaderCell[]): this {\n this.subHeaders.push(...subHeaders);\n return this;\n }\n\n /**\n * Agrega una fila de datos (puede ser jerárquica con childrens)\n */\n addRow(row: IDataCell[] | IDataCell): this {\n if (Array.isArray(row)) {\n this.body.push(...row);\n } else {\n this.body.push(row);\n }\n return this;\n }\n\n /**\n * Agrega un footer o varios\n */\n addFooter(footer: IFooterCell[] | IFooterCell): this {\n if (Array.isArray(footer)) {\n this.footers.push(...footer);\n } else {\n this.footers.push(footer);\n }\n return this;\n }\n\n /**\n * Crea una nueva tabla y la agrega al worksheet\n */\n addTable(tableConfig: Partial<ITable> = {}): this {\n const table: ITable = {\n name: tableConfig.name || `Table_${this.tables.length + 1}`,\n headers: tableConfig.headers || [],\n subHeaders: tableConfig.subHeaders || [],\n body: tableConfig.body || [],\n footers: tableConfig.footers || [],\n showBorders: tableConfig.showBorders !== false,\n showStripes: tableConfig.showStripes !== false,\n style: tableConfig.style || 'TableStyleLight1',\n ...tableConfig\n };\n \n this.tables.push(table);\n return this;\n }\n\n /**\n * Finaliza la tabla actual agregando todos los elementos temporales a la última tabla\n */\n finalizeTable(): this {\n if (this.tables.length === 0) {\n // Si no hay tablas, crear una nueva con los datos temporales\n this.addTable();\n }\n \n const currentTable = this.tables[this.tables.length - 1];\n if (!currentTable) {\n throw new Error('No se pudo obtener la tabla actual');\n }\n \n // Agregar headers, subheaders, body y footers a la tabla actual\n if (this.headers.length > 0) {\n currentTable.headers = [...(currentTable.headers || []), ...this.headers];\n }\n \n if (this.subHeaders.length > 0) {\n currentTable.subHeaders = [...(currentTable.subHeaders || []), ...this.subHeaders];\n }\n \n if (this.body.length > 0) {\n currentTable.body = [...(currentTable.body || []), ...this.body];\n }\n \n if (this.footers.length > 0) {\n currentTable.footers = [...(currentTable.footers || []), ...this.footers];\n }\n \n // Limpiar las estructuras temporales\n this.headers = [];\n this.subHeaders = [];\n this.body = [];\n this.footers = [];\n \n return this;\n }\n\n /**\n * Obtiene una tabla por nombre\n */\n getTable(name: string): ITable | undefined {\n return this.tables.find(table => table.name === name);\n }\n\n /**\n * Construye la hoja en el workbook de ExcelJS\n */\n async build(workbook: ExcelJS.Workbook, _options: IBuildOptions = {}): Promise<void> {\n const ws = workbook.addWorksheet(this.config.name, {\n properties: {\n defaultRowHeight: this.config.defaultRowHeight || 20,\n tabColor: this.config.tabColor as any\n },\n pageSetup: this.config.pageSetup as any\n });\n\n let rowPointer = 1;\n \n // Si hay tablas definidas, construir cada tabla\n if (this.tables.length > 0) {\n for (let i = 0; i < this.tables.length; i++) {\n const table = this.tables[i];\n if (table) {\n rowPointer = await this.buildTable(ws, table, rowPointer, i > 0);\n }\n }\n } else {\n // Construcción tradicional para compatibilidad hacia atrás\n rowPointer = await this.buildLegacyContent(ws, rowPointer);\n }\n \n this.isBuilt = true;\n }\n\n /**\n * Construye una tabla individual en el worksheet\n */\n private async buildTable(ws: ExcelJS.Worksheet, table: ITable, startRow: number, addSpacing: boolean = false): Promise<number> {\n let rowPointer = startRow;\n \n // Agregar espacio entre tablas si no es la primera\n if (addSpacing) {\n rowPointer += 2; // 2 filas de espacio\n }\n \n // Headers principales de la tabla\n if (table.headers && table.headers.length > 0) {\n for (const header of table.headers) {\n ws.addRow([header.value]);\n if (header.mergeCell) {\n const maxCols = this.calculateTableMaxColumns(table);\n ws.mergeCells(rowPointer, 1, rowPointer, maxCols);\n }\n if (header.styles) {\n ws.getRow(rowPointer).eachCell((cell: any) => {\n cell.style = this.convertStyle(header.styles);\n });\n }\n rowPointer++;\n }\n }\n \n // SubHeaders con soporte para anidación\n if (table.subHeaders && table.subHeaders.length > 0) {\n rowPointer = this.buildNestedHeaders(ws, rowPointer, table.subHeaders);\n }\n \n // Body (soporta children)\n if (table.body && table.body.length > 0) {\n for (const row of table.body) {\n rowPointer = this.addDataRowRecursive(ws, rowPointer, row);\n }\n }\n \n // Footers\n if (table.footers && table.footers.length > 0) {\n for (const footer of table.footers) {\n rowPointer = this.addFooterRow(ws, rowPointer, footer);\n }\n }\n \n // Aplicar estilo de tabla si está configurado\n if (table.showBorders || table.showStripes) {\n this.applyTableStyle(ws, table, startRow, rowPointer - 1);\n }\n \n return rowPointer;\n }\n\n /**\n * Construcción tradicional para compatibilidad hacia atrás\n */\n private async buildLegacyContent(ws: ExcelJS.Worksheet, startRow: number): Promise<number> {\n let rowPointer = startRow;\n \n // Headers principales\n if (this.headers.length > 0) {\n this.headers.forEach(header => {\n ws.addRow([header.value]);\n if (header.mergeCell) {\n ws.mergeCells(rowPointer, 1, rowPointer, (this.getMaxColumns() || 1));\n }\n if (header.styles) {\n ws.getRow(rowPointer).eachCell((cell: any) => {\n cell.style = this.convertStyle(header.styles);\n });\n }\n rowPointer++;\n });\n }\n \n // SubHeaders con soporte para anidación\n if (this.subHeaders.length > 0) {\n rowPointer = this.buildNestedHeaders(ws, rowPointer, this.subHeaders);\n }\n \n // Body (soporta children)\n for (const row of this.body) {\n rowPointer = this.addDataRowRecursive(ws, rowPointer, row);\n }\n \n // Footers\n if (this.footers.length > 0) {\n for (const footer of this.footers) {\n rowPointer = this.addFooterRow(ws, rowPointer, footer);\n }\n }\n \n return rowPointer;\n }\n\n /**\n * Calcula el número máximo de columnas para una tabla\n */\n private calculateTableMaxColumns(table: ITable): number {\n let maxCols = 0;\n \n if (table.subHeaders && table.subHeaders.length > 0) {\n for (const header of table.subHeaders) {\n maxCols += this.calculateHeaderColSpan(header);\n }\n }\n \n return maxCols || 1;\n }\n\n /**\n * Aplica el estilo de tabla a un rango específico\n */\n private applyTableStyle(ws: ExcelJS.Worksheet, table: ITable, startRow: number, endRow: number): void {\n const maxCols = this.calculateTableMaxColumns(table);\n \n // Aplicar bordes si está configurado\n if (table.showBorders) {\n for (let row = startRow; row <= endRow; row++) {\n for (let col = 1; col <= maxCols; col++) {\n const cell = ws.getRow(row).getCell(col);\n if (!cell.style) cell.style = {};\n if (!cell.style.border) {\n cell.style.border = {\n top: { style: 'thin', color: { argb: 'FF8EAADB' } },\n left: { style: 'thin', color: { argb: 'FF8EAADB' } },\n bottom: { style: 'thin', color: { argb: 'FF8EAADB' } },\n right: { style: 'thin', color: { argb: 'FF8EAADB' } }\n };\n }\n }\n }\n }\n \n // Aplicar rayas alternadas si está configurado\n if (table.showStripes) {\n for (let row = startRow; row <= endRow; row++) {\n if ((row - startRow) % 2 === 1) { // Filas impares (empezando desde 0)\n for (let col = 1; col <= maxCols; col++) {\n const cell = ws.getRow(row).getCell(col);\n if (!cell.style) cell.style = {};\n if (!cell.style.fill) {\n cell.style.fill = {\n type: 'pattern',\n pattern: 'solid',\n fgColor: { argb: 'FFF2F2F2' }\n };\n }\n }\n }\n }\n }\n }\n\n /**\n * Construye headers anidados recursivamente\n * @param ws - Worksheet de ExcelJS\n * @param startRow - Fila inicial\n * @param headers - Array de headers a procesar\n * @returns La siguiente fila disponible\n */\n private buildNestedHeaders(ws: ExcelJS.Worksheet, startRow: number, headers: IHeaderCell[]): number {\n let currentRow = startRow;\n const maxDepth = this.getMaxHeaderDepth(headers);\n \n // Crear filas para cada nivel de profundidad\n for (let depth = 0; depth < maxDepth; depth++) {\n // Crear la fila primero\n const row = ws.getRow(currentRow);\n \n // Procesar cada header en este nivel\n let colIndex = 1;\n for (const header of headers) {\n if (depth === 0) {\n // Nivel principal del header\n const headerInfo = this.getHeaderAtDepth(header, depth, colIndex);\n const cell = row.getCell(colIndex);\n cell.value = headerInfo.value;\n if (headerInfo.style) {\n cell.style = this.convertStyle(headerInfo.style);\n }\n colIndex += headerInfo.colSpan;\n } else {\n // Nivel de children - procesar todos los children directos\n if (header.children && header.children.length > 0) {\n for (const child of header.children) {\n const cell = row.getCell(colIndex);\n cell.value = typeof child.value === 'string' ? child.value : String(child.value || '');\n if (child.styles || header.styles) {\n cell.style = this.convertStyle(child.styles || header.styles);\n }\n colIndex += this.calculateHeaderColSpan(child);\n }\n } else {\n // Si no tiene children, agregar celda vacía\n const cell = row.getCell(colIndex);\n cell.value = null;\n colIndex += 1;\n }\n }\n }\n \n currentRow++;\n }\n \n // Aplicar todos los merges después de crear todas las filas\n this.applyAllMerges(ws, startRow, currentRow - 1, headers);\n \n return currentRow;\n }\n\n /**\n * Obtiene información del header en una profundidad específica\n */\n private getHeaderAtDepth(header: IHeaderCell, depth: number, startCol: number): {\n value: string | null;\n style: any;\n colSpan: number;\n mergeRange?: { start: number; end: number } | null;\n } {\n const colSpan = this.calculateHeaderColSpan(header);\n if (depth === 0) {\n // Nivel principal del header\n const mergeRange = colSpan > 1 ? { start: startCol, end: startCol + colSpan - 1 } : null;\n return {\n value: typeof header.value === 'string' ? header.value : String(header.value || ''),\n style: header.styles,\n colSpan,\n mergeRange: mergeRange\n };\n } else if (header.children && header.children.length > 0) {\n // Nivel de children\n const child = header.children[depth];\n if (child) {\n const childColSpan = this.calculateHeaderColSpan(child);\n // Los children también pueden hacer merge si tienen múltiples childrens\n const mergeRange = childColSpan > 1 ? { start: startCol, end: startCol + childColSpan - 1 } : null;\n \n return {\n value: typeof child.value === 'string' ? child.value : String(child.value || ''),\n style: child.styles || header.styles,\n colSpan: childColSpan,\n mergeRange: mergeRange\n };\n }\n }\n \n // Celda vacía para mantener alineación\n return {\n value: null,\n style: null,\n colSpan: 1\n };\n }\n\n\n\n\n /**\n * Aplica todos los merges (horizontales y verticales) después de crear todas las filas\n */\n private applyAllMerges(ws: ExcelJS.Worksheet, startRow: number, endRow: number, headers: IHeaderCell[]): void {\n const maxDepth = this.getMaxHeaderDepth(headers);\n \n // Solo aplicar merges si hay más de una fila de headers\n if (maxDepth <= 1) return;\n \n // Aplicar merges inteligentes basados en la estructura\n this.applySmartMerges(ws, startRow, endRow, headers);\n }\n\n /**\n * Aplica merges inteligentes basados en la estructura de headers\n */\n private applySmartMerges(ws: ExcelJS.Worksheet, startRow: number, endRow: number, headers: IHeaderCell[]): void {\n const maxDepth = this.getMaxHeaderDepth(headers);\n \n // Solo aplicar merges si hay más de una fila de headers\n if (maxDepth <= 1) return;\n \n // Aplicar merges para cada header\n let colIndex = 1;\n for (const header of headers) {\n this.applySmartMergesForHeader(ws, startRow, endRow, header, colIndex);\n colIndex += this.calculateHeaderColSpan(header);\n }\n }\n\n /**\n * Aplica merges inteligentes para un header específico\n */\n private applySmartMergesForHeader(ws: ExcelJS.Worksheet, startRow: number, endRow: number, header: IHeaderCell, startCol: number): void {\n const headerColSpan = this.calculateHeaderColSpan(header);\n \n if (!header.children || header.children.length === 0) {\n // Si no tiene children, hacer merge vertical desde la primera fila hasta la última\n ws.mergeCells(startRow, startCol, endRow, startCol + headerColSpan - 1);\n } else {\n // Si tiene children, aplicar merge horizontal en la primera fila\n if (headerColSpan > 1) {\n ws.mergeCells(startRow, startCol, startRow, startCol + headerColSpan - 1);\n }\n \n // Procesar children recursivamente\n let childColIndex = startCol;\n for (const child of header.children) {\n this.applySmartMergesForHeader(ws, startRow + 1, endRow, child, childColIndex);\n childColIndex += this.calculateHeaderColSpan(child);\n }\n }\n }\n\n\n \n /**\n * Calcula el span de columnas para un header\n */\n private calculateHeaderColSpan(header: IHeaderCell): number {\n if (!header.children || header.children.length === 0) {\n return 1;\n }\n \n return header.children.reduce((total, child) => {\n return total + this.calculateHeaderColSpan(child);\n }, 0);\n }\n\n /**\n * Obtiene la profundidad máxima de headers anidados\n */\n private getMaxHeaderDepth(headers: IHeaderCell[]): number {\n let maxDepth = 1;\n \n for (const header of headers) {\n if (header.children && header.children.length > 0) {\n const childDepth = this.getMaxHeaderDepth(header.children);\n maxDepth = Math.max(maxDepth, childDepth + 1);\n }\n }\n \n return maxDepth;\n }\n\n /**\n * Obtiene el número máximo de columnas\n */\n private getMaxColumns(): number {\n let maxCols = 0;\n \n for (const header of this.subHeaders) {\n maxCols += this.calculateHeaderColSpan(header);\n }\n \n return maxCols;\n }\n\n /**\n * Valida la hoja\n */\n validate(): Result<boolean> {\n if (!this.headers.length && !this.body.length) {\n return {\n success: false,\n error: {\n type: ErrorType.VALIDATION_ERROR,\n message: 'La hoja no tiene datos',\n }\n };\n }\n return { success: true, data: true };\n }\n\n /**\n * Calcula las posiciones de columnas para los datos basándose en la estructura de subheaders\n */\n private calculateDataColumnPositions(): { [key: string]: number } {\n const positions: { [key: string]: number } = {};\n let currentCol = 1;\n \n for (const header of this.subHeaders) {\n if (header.children && header.children.length > 0) {\n // Si el header tiene children, cada child ocupa una columna\n for (const child of header.children) {\n if (child.key) {\n positions[child.key] = currentCol;\n }\n if (child.value) {\n positions[String(child.value)] = currentCol;\n }\n currentCol++;\n }\n } else {\n // Si el header no tiene children, ocupa una columna\n if (header.key) {\n positions[header.key] = currentCol;\n }\n if (header.value) {\n positions[String(header.value)] = currentCol;\n }\n currentCol++;\n }\n }\n \n return positions;\n }\n\n /**\n * Agrega una fila de footer\n * @returns el siguiente rowPointer disponible\n */\n private addFooterRow(ws: ExcelJS.Worksheet, rowPointer: number, footer: IFooterCell): number {\n // Calcular las columnas basándose en la estructura de subheaders\n const columnPositions = this.calculateDataColumnPositions();\n \n // Buscar la columna correcta para el footer\n let footerColPosition: number | undefined;\n \n // Intentar encontrar por key primero\n if (footer.key && columnPositions[footer.key]) {\n footerColPosition = columnPositions[footer.key];\n }\n // Si no se encuentra por key, intentar por header\n else if (footer.header && columnPositions[footer.header]) {\n footerColPosition = columnPositions[footer.header];\n }\n \n // Si no se encuentra la posición, usar columna 1 por defecto\n if (footerColPosition === undefined) {\n footerColPosition = 1;\n }\n \n // Escribir el footer en la columna correcta\n const excelRow = ws.getRow(rowPointer);\n const footerCell = excelRow.getCell(footerColPosition);\n footerCell.value = footer.value;\n if (footer.styles) {\n footerCell.style = this.convertStyle(footer.styles);\n }\n if (footer.numberFormat) {\n footerCell.numFmt = footer.numberFormat;\n }\n \n // Aplicar merge si está configurado\n if (footer.mergeCell && footer.mergeTo) {\n ws.mergeCells(rowPointer, footerColPosition, rowPointer, footer.mergeTo);\n }\n \n // Si hay children, escribirlos en las columnas correspondientes\n if (footer.children && footer.children.length > 0) {\n for (const child of footer.children) {\n if (child) {\n // Buscar la columna correcta basándose en el header del child\n let colPosition: number | undefined;\n \n // Intentar encontrar por key primero\n if (child.key && columnPositions[child.key]) {\n colPosition = columnPositions[child.key];\n }\n // Si no se encuentra por key, intentar por header\n else if (child.header && columnPositions[child.header]) {\n colPosition = columnPositions[child.header];\n }\n \n if (colPosition !== undefined) {\n const childCell = excelRow.getCell(colPosition);\n childCell.value = child.value;\n if (child.styles) {\n childCell.style = this.convertStyle(child.styles);\n }\n if (child.numberFormat) {\n childCell.numFmt = child.numberFormat;\n }\n }\n }\n }\n }\n \n // Incrementar rowPointer solo si el footer tiene la propiedad jump\n if (footer.jump) {\n return rowPointer + 1;\n }\n \n return rowPointer;\n }\n\n /**\n * Agrega una fila de datos y sus children recursivamente\n * @returns el siguiente rowPointer disponible\n */\n private addDataRowRecursive(ws: ExcelJS.Worksheet, rowPointer: number, row: IDataCell): number {\n // Calcular las columnas basándose en la estructura de subheaders\n const columnPositions = this.calculateDataColumnPositions();\n\n // Buscar la columna correcta para el dato principal\n let mainColPosition: number | undefined;\n \n // Intentar encontrar por key primero\n if (row.key && columnPositions[row.key]) {\n mainColPosition = columnPositions[row.key];\n }\n // Si no se encuentra por key, intentar por header\n else if (row.header && columnPositions[row.header]) {\n mainColPosition = columnPositions[row.header];\n }\n \n // Si no se encuentra la posición, usar columna 1 por defecto\n if (mainColPosition === undefined) {\n mainColPosition = 1;\n }\n \n // Escribir el dato principal en la columna correcta\n const excelRow = ws.getRow(rowPointer);\n const mainCell = excelRow.getCell(mainColPosition);\n mainCell.value = row.value;\n if (row.styles) {\n mainCell.style = this.convertStyle(row.styles);\n }\n if (row.numberFormat) {\n mainCell.numFmt = row.numberFormat;\n }\n \n // Si hay children, escribirlos en las columnas correspondientes\n if (row.children && row.children.length > 0) {\n for (const child of row.children) {\n if (child) {\n // Buscar la columna correcta basándose en el header del child\n let colPosition: number | undefined;\n \n // Intentar encontrar por key primero\n if (child.key && columnPositions[child.key]) {\n colPosition = columnPositions[child.key];\n }\n // Si no se encuentra por key, intentar por header\n else if (child.header && columnPositions[child.header]) {\n colPosition = columnPositions[child.header];\n }\n \n if (colPosition !== undefined) {\n const childCell = excelRow.getCell(colPosition);\n childCell.value = child.value;\n if (child.styles) {\n childCell.style = this.convertStyle(child.styles);\n }\n if (child.numberFormat) {\n childCell.numFmt = child.numberFormat;\n }\n }\n }\n }\n }\n \n // Incrementar rowPointer solo si la celda tiene la propiedad jump\n if (row.jump) {\n return rowPointer + 1;\n }\n \n return rowPointer;\n }\n\n /**\n * Convierte el estilo personalizado a formato compatible con ExcelJS\n */\n private convertStyle(style: any): Partial<ExcelJS.Style> {\n if (!style) return {};\n \n const converted: Partial<ExcelJS.Style> = {};\n \n if (style.font) {\n converted.font = {\n name: style.font.family,\n size: style.font.size,\n bold: style.font.bold,\n italic: style.font.italic,\n underline: style.font.underline,\n color: style.font.color\n };\n }\n \n if (style.fill) {\n converted.fill = {\n type: style.fill.type,\n pattern: style.fill.pattern,\n fgColor: style.fill.foregroundColor,\n bgColor: style.fill.backgroundColor\n };\n }\n \n if (style.border) {\n converted.border = {\n top: style.border.top,\n left: style.border.left,\n bottom: style.border.bottom,\n right: style.border.right\n };\n }\n \n if (style.alignment) {\n converted.alignment = {\n horizontal: style.alignment.horizontal,\n vertical: style.alignment.vertical,\n wrapText: style.alignment.wrapText,\n indent: style.alignment.indent\n };\n }\n \n if (style.numFmt) {\n converted.numFmt = style.numFmt;\n }\n \n return converted;\n }\n}","/**\r\n * Builder-specific type definitions\r\n */\r\n\r\nimport { IWorkbookMetadata, Result } from './core.types';\r\nimport { IWorksheet, IWorksheetConfig } from './worksheet.types';\r\nimport { IStyle } from './style.types';\r\n\r\n// Re-export ErrorType for convenience\r\nexport { ErrorType } from './core.types';\r\n\r\n/**\r\n * Excel builder configuration interface\r\n */\r\nexport interface IExcelBuilderConfig {\r\n /** Workbook metadata */\r\n metadata?: IWorkbookMetadata;\r\n /** Default worksheet configuration */\r\n defaultWorksheetConfig?: Partial<IWorksheetConfig>;\r\n /** Default styles */\r\n defaultStyles?: {\r\n header?: IStyle;\r\n subheader?: IStyle;\r\n data?: IStyle;\r\n footer?: IStyle;\r\n total?: IStyle;\r\n };\r\n /** Whether to enable validation */\r\n enableValidation?: boolean;\r\n /** Whether to enable events */\r\n enableEvents?: boolean;\r\n /** Whether to enable performance monitoring */\r\n enablePerformanceMonitoring?: boolean;\r\n /** Maximum number of worksheets */\r\n maxWorksheets?: number;\r\n /** Maximum number of rows per worksheet */\r\n maxRowsPerWorksheet?: number;\r\n /** Maximum number of columns per worksheet */\r\n maxColumnsPerWorksheet?: number;\r\n /** Memory limit in bytes */\r\n memoryLimit?: number;\r\n}\r\n\r\n/**\r\n * Build options interface\r\n */\r\nexport interface IBuildOptions {\r\n /** Output format */\r\n format?: 'xlsx' | 'xls' | 'csv';\r\n /** Whether to include styles */\r\n includeStyles?: boolean;\r\n /** Whether to include formulas */\r\n includeFormulas?: boolean;\r\n /** Whether to include comments */\r\n includeComments?: boolean;\r\n /** Whether to include data validation */\r\n includeValidation?: boolean;\r\n /** Whether to include conditional formatting */\r\n includeConditionalFormatting?: boolean;\r\n /** Compression level (0-9) */\r\n compressionLevel?: number;\r\n /** Whether to optimize for size */\r\n optimizeForSize?: boolean;\r\n /** Whether to optimize for speed */\r\n optimizeForSpeed?: boolean;\r\n}\r\n\r\n/**\r\n * Download options interface\r\n */\r\nexport interface IDownloadOptions extends IBuildOptions {\r\n /** File name */\r\n fileName?: string;\r\n /** Whether to show download progress */\r\n showProgress?: boolean;\r\n /** Progress callback */\r\n onProgress?: (progress: number) => void;\r\n /** Whether to auto-download */\r\n autoDownload?: boolean;\r\n /** MIME type */\r\n mimeType?: string;\r\n}\r\n\r\n/**\r\n * Excel builder interface\r\n */\r\nexport interface IExcelBuilder {\r\n /** Builder configuration */\r\n config: IExcelBuilderConfig;\r\n /** Worksheets in the workbook */\r\n worksheets: Map<string, IWorksheet>;\r\n /** Current worksheet */\r\n currentWorksheet: IWorksheet | undefined;\r\n /** Whether the builder is building */\r\n isBuilding: boolean;\r\n /** Build statistics */\r\n stats: IBuildStats;\r\n\r\n /** Add a new worksheet */\r\n addWorksheet(name: string, config?: Partial<IWorksheetConfig>): IWorksheet;\r\n /** Get a worksheet by name */\r\n getWorksheet(name: string): IWorksheet | undefined;\r\n /** Remove a worksheet */\r\n removeWorksheet(name: string): boolean;\r\n /** Set the current worksheet */\r\n setCurrentWorksheet(name: string): boolean;\r\n /** Build the workbook */\r\n build(options?: IBuildOptions): Promise<Result<ArrayBuffer>>;\r\n /** Generate and download the file */\r\n generateAndDownload(fileName: string, options?: IDownloadOptions): Promise<Result<void>>;\r\n /** Get workbook as buffer */\r\n toBuffer(options?: IBuildOptions): Promise<Result<ArrayBuffer>>;\r\n /** Get workbook as blob */\r\n toBlob(options?: IBuildOptions): Promise<Result<Blob>>;\r\n /** Validate the workbook */\r\n validate(): Result<boolean>;\r\n /** Clear all worksheets */\r\n clear(): void;\r\n /** Get workbook statistics */\r\n getStats(): IBuildStats;\r\n}\r\n\r\n/**\r\n * Build statistics interface\r\n */\r\nexport interface IBuildStats {\r\n /** Total number of worksheets */\r\n totalWorksheets: number;\r\n /** Total number of cells */\r\n totalCells: number;\r\n /** Total memory usage in bytes */\r\n memoryUsage: number;\r\n /** Build time in milliseconds */\r\n buildTime: number;\r\n /** File size in bytes */\r\n fileSize: number;\r\n /** Number of styles used */\r\n stylesUsed: number;\r\n /** Number of formulas used */\r\n formulasUsed: number;\r\n /** Number of conditional formats used */\r\n conditionalFormatsUsed: number;\r\n /** Performance metrics */\r\n performance: {\r\n /** Time spent building headers */\r\n headersTime: number;\r\n /** Time spent building data */\r\n dataTime: number;\r\n /** Time spent applying styles */\r\n stylesTime: number;\r\n /** Time spent writing to buffer */\r\n writeTime: number;\r\n };\r\n}\r\n\r\n/**\r\n * Builder event types\r\n */\r\nexport enum BuilderEventType {\r\n WORKSHEET_ADDED = 'worksheetAdded',\r\n WORKSHEET_REMOVED = 'worksheetRemoved',\r\n WORKSHEET_UPDATED = 'worksheetUpdated',\r\n BUILD_STARTED = 'buildStarted',\r\n BUILD_PROGRESS = 'buildProgress',\r\n BUILD_COMPLETED = 'buildCompleted',\r\n BUILD_ERROR = 'buildError',\r\n DOWNLOAD_STARTED = 'downloadStarted',\r\n DOWNLOAD_PROGRESS = 'downloadProgress',\r\n DOWNLOAD_COMPLETED = 'downloadCompleted',\r\n DOWNLOAD_ERROR = 'downloadError'\r\n}\r\n\r\n/**\r\n * Builder event interface\r\n */\r\nexport interface IBuilderEvent {\r\n type: BuilderEventType;\r\n data?: Record<string, unknown>;\r\n timestamp: Date;\r\n}\r\n\r\n/**\r\n * Builder event listener interface\r\n */\r\nexport interface IBuilderEventListener {\r\n (event: IBuilderEvent): void;\r\n}\r\n\r\n/**\r\n * Builder validation result interface\r\n */\r\nexport interface IBuilderValidationResult {\r\n /** Whether the builder is valid */\r\n isValid: boolean;\r\n /** Validation errors */\r\n errors: string[];\r\n /** Validation warnings */\r\n warnings: string[];\r\n /** Worksheet validation results */\r\n worksheetResults: Map<string, boolean>;\r\n} ","/**\r\n * ExcelBuilder - Main class for creating Excel workbooks\r\n */\r\n\r\nimport ExcelJS from 'exceljs';\r\nimport saveAs from 'file-saver';\r\nimport { EventEmitter } from '../utils/EventEmitter';\r\nimport { Worksheet } from './Worksheet';\r\nimport {\r\n IExcelBuilder,\r\n IExcelBuilderConfig,\r\n IBuildOptions,\r\n IDownloadOptions,\r\n IBuildStats,\r\n BuilderEventType,\r\n IBuilderEvent,\r\n ErrorType\r\n} from '../types/builder.types';\r\nimport {\r\n IWorksheet,\r\n IWorksheetConfig\r\n} from '../types/worksheet.types';\r\nimport { \r\n Result,\r\n ISuccessResult,\r\n IErrorResult\r\n} from '../types/core.types';\r\n\r\n/**\r\n * ExcelBuilder class for creating Excel workbooks\r\n */\r\nexport class ExcelBuilder implements IExcelBuilder {\r\n public config: IExcelBuilderConfig;\r\n public worksheets: Map<string, IWorksheet> = new Map();\r\n public currentWorksheet: IWorksheet | undefined;\r\n public isBuilding = false;\r\n public stats: IBuildStats;\r\n\r\n private eventEmitter: EventEmitter;\r\n\r\n constructor(config: IExcelBuilderConfig = {}) {\r\n this.config = {\r\n enableValidation: true,\r\n enableEvents: true,\r\n enablePerformanceMonitoring: false,\r\n maxWorksheets: 255,\r\n maxRowsPerWorksheet: 1048576,\r\n maxColumnsPerWorksheet: 16384,\r\n memoryLimit: 100 * 1024 * 1024, // 100MB\r\n ...config\r\n };\r\n\r\n this.stats = this.initializeStats();\r\n this.eventEmitter = new EventEmitter();\r\n }\r\n\r\n /**\r\n * Add a new worksheet to the workbook\r\n */\r\n addWorksheet(name: string, worksheetConfig: Partial<IWorksheetConfig> = {}): IWorksheet {\r\n if (this.worksheets.has(name)) {\r\n throw new Error(`Worksheet \"${name}\" already exists`);\r\n }\r\n\r\n const config: IWorksheetConfig = {\r\n name,\r\n defaultRowHeight: 20,\r\n defaultColWidth: 10,\r\n ...this.config.defaultWorksheetConfig,\r\n ...worksheetConfig\r\n };\r\n\r\n const worksheet = new Worksheet(config);\r\n this.worksheets.set(name, worksheet);\r\n this.currentWorksheet = worksheet;\r\n \r\n this.emitEvent(BuilderEventType.WORKSHEET_ADDED, { worksheetName: name });\r\n \r\n return worksheet;\r\n }\r\n\r\n /**\r\n * Get a worksheet by name\r\n */\r\n getWorksheet(name: string): IWorksheet | undefined {\r\n return this.worksheets.get(name);\r\n }\r\n\r\n /**\r\n * Remove a worksheet by name\r\n */\r\n removeWorksheet(name: string): boolean {\r\n const worksheet = this.worksheets.get(name);\r\n if (!worksheet) {\r\n return false;\r\n }\r\n\r\n this.worksheets.delete(name);\r\n \r\n // If this was the current worksheet, clear it\r\n if (this.currentWorksheet === worksheet) {\r\n this.currentWorksheet = undefined;\r\n }\r\n \r\n this.emitEvent(BuilderEventType.WORKSHEET_REMOVED, { worksheetName: name });\r\n \r\n return true;\r\n }\r\n\r\n /**\r\n * Set the current worksheet\r\n */\r\n setCurrentWorksheet(name: string): boolean {\r\n const worksheet = this.worksheets.get(name);\r\n if (!worksheet) {\r\n return false;\r\n }\r\n \r\n this.currentWorksheet = worksheet;\r\n return true;\r\n }\r\n\r\n /**\r\n * Build the workbook and return as ArrayBuffer\r\n */\r\n async build(options: IBuildOptions = {}): Promise<Result<ArrayBuffer>> {\r\n if (this.isBuilding) {\r\n return {\r\n success: false,\r\n error: {\r\n type: ErrorType.BUILD_ERROR,\r\n message: 'Build already in progress',\r\n stack: new Error().stack || ''\r\n }\r\n };\r\n }\r\n\r\n this.isBuilding = true;\r\n const startTime = Date.now();\r\n \r\n try {\r\n this.emitEvent(BuilderEventType.BUILD_STARTED);\r\n \r\n const workbook = new ExcelJS.Workbook();\r\n \r\n // Add metadata\r\n if (this.config.metadata) {\r\n workbook.creator = this.config.metadata.author || 'Han Excel Builder';\r\n workbook.lastModifiedBy = this.config.metadata.author || 'Han Excel Builder';\r\n workbook.created = this.config.metadata.created || new Date();\r\n workbook.modified = this.config.metadata.modified || new Date();\r\n if (this.config.metadata.title) workbook.title = this.config.metadata.title;\r\n if (this.config.metadata.subject) workbook.subject = this.config.metadata.subject;\r\n if (this.config.metadata.keywords) workbook.keywords = this.config.metadata.keywords;\r\n if (this.config.metadata.category) workbook.category = this.config.metadata.category;\r\n if (this.config.metadata.description) workbook.description = this.config.metadata.description;\r\n }\r\n\r\n // Build each worksheet\r\n for (const worksheet of this.worksheets.values()) {\r\n await (worksheet as Worksheet).build(workbook, options);\r\n }\r\n\r\n // Write to buffer\r\n const buffer = await workbook.xlsx.writeBuffer({\r\n compression: options.compressionLevel || 6\r\n } as any);\r\n\r\n const endTime = Date.now();\r\n this.stats.buildTime = endTime - startTime;\r\n this.stats.fileSize = buffer.byteLength;\r\n \r\n const successResult: ISuccessResult<ArrayBuffer> = {\r\n success: true,\r\n data: buffer\r\n };\r\n\r\n this.emitEvent(BuilderEventType.BUILD_COMPLETED, {\r\n buildTime: this.stats.buildTime,\r\n fileSize: this.stats.fileSize\r\n });\r\n\r\n return successResult;\r\n\r\n } catch (error) {\r\n const errorResult: IErrorResult = {\r\n success: false,\r\n error: {\r\n type: ErrorType.BUILD_ERROR,\r\n message: error instanceof Error ? error.message : 'Unknown build error',\r\n stack: error instanceof Error ? error.stack || '' : ''\r\n }\r\n };\r\n\r\n this.emitEvent(BuilderEventType.BUILD_ERROR, { error: errorResult.error });\r\n return errorResult;\r\n\r\n } finally {\r\n this.isBuilding = false;\r\n }\r\n }\r\n\r\n /**\r\n * Generate and download the file\r\n */\r\n async generateAndDownload(fileName: string, options: IDownloadOptions = {}): Promise<Result<void>> {\r\n const buildResult = await this.build(options);\r\n \r\n if (!buildResult.success) {\r\n return buildResult;\r\n }\r\n\r\n try {\r\n this.emitEvent(BuilderEventType.DOWNLOAD_STARTED, { fileName });\r\n \r\n const blob = new Blob([buildResult.data], { \r\n type: options.mimeType || 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' \r\n });\r\n \r\n saveAs(blob, fileName);\r\n \r\n this.emitEvent(BuilderEventType.DOWNLOAD_COMPLETED, { fileName });\r\n \r\n return { success: true, data: undefined };\r\n\r\n } catch (error) {\r\n const errorResult: IErrorResult = {\r\n success: false,\r\n error: {\r\n type: ErrorType.BUILD_ERROR,\r\n message: error instanceof Error ? error.message : 'Download failed',\r\n stack: error instanceof Error ? error.stack || '' : ''\r\n }\r\n };\r\n\r\n this.emitEvent(BuilderEventType.DOWNLOAD_ERROR, { error: errorResult.error });\r\n return errorResult;\r\n }\r\n }\r\n\r\n /**\r\n * Get workbook as buffer\r\n */\r\n async toBuffer(options: IBuildOptions = {}): Promise<Result<ArrayBuffer>> {\r\n return this.build(options);\r\n }\r\n\r\n /**\r\n * Get workbook as blob\r\n */\r\n async toBlob(options: IBuildOptions = {}): Promise<Result<Blob>> {\r\n const buildResult = await this.build(options);\r\n \r\n if (!buildResult.success) {\r\n return buildResult;\r\n }\r\n\r\n const blob = new Blob([buildResult.data], { \r\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' \r\n });\r\n \r\n return { success: true, data: blob };\r\n }\r\n\r\n /**\r\n * Validate the workbook\r\n */\r\n validate(): Result<boolean> {\r\n const errors: string[] = [];\r\n \r\n if (this.worksheets.size === 0) {\r\n errors.push('No worksheets found');\r\n }\r\n\r\n // Validate each worksheet\r\n for (const [name, worksheet] of this.worksheets.entries()) {\r\n const worksheetValidation = (worksheet as Worksheet).validate();\r\n if (!worksheetValidation.success) {\r\n errors.push(`Worksheet \"${name}\": ${worksheetValidation.error?.message}`);\r\n }\r\n }\r\n\r\n if (errors.length > 0) {\r\n return {\r\n success: false,\r\n error: {\r\n type: ErrorType.VALIDATION_ERROR,\r\n message: errors.join('; '),\r\n stack: new Error().stack || ''\r\n }\r\n };\r\n }\r\n\r\n return { success: true, data: true };\r\n }\r\n\r\n /**\r\n * Clear all worksheets\r\n */\r\n clear(): void {\r\n this.worksheets.clear();\r\n this.currentWorksheet = undefined;\r\n }\r\n\r\n /**\r\n * Get workbook statistics\r\n */\r\n getStats(): IBuildStats {\r\n return { ...this.stats };\r\n }\r\n\r\n /**\r\n * Event handling methods\r\n */\r\n on(eventType: BuilderEventType, listener: (event: IBuilderEvent) => void): string {\r\n return this.eventEmitter.on(eventType, listener);\r\n }\r\n\r\n off(eventType: BuilderEventType, listenerId: string): boolean {\r\n return this.eventEmitter.off(eventType, listenerId);\r\n }\r\n\r\n removeAllListeners(eventType?: BuilderEventType): void {\r\n if (eventType) {\r\n this.eventEmitter.offAll(eventType);\r\n } else {\r\n this.eventEmitter.clear();\r\n }\r\n }\r\n\r\n /**\r\n * Private methods\r\n */\r\n private emitEvent(type: BuilderEventType, data?: Record<string, unknown>): void {\r\n const event: IBuilderEvent = {\r\n type,\r\n data: data || {},\r\n timestamp: new Date()\r\n };\r\n this.eventEmitter.emitSync(event);\r\n }\r\n\r\n private initializeStats(): IBuildStats {\r\n return {\r\n totalWorksheets: 0,\r\n totalCells: 0,\r\n memoryUsage: 0,\r\n buildTime: 0,\r\n fileSize: 0,\r\n stylesUsed: 0,\r\n formulasUsed: 0,\r\n conditionalFormatsUsed: 0,\r\n performance: {\r\n headersTime: 0,\r\n dataTime: 0,\r\n stylesTime: 0,\r\n writeTime: 0\r\n }\r\n };\r\n }\r\n} ","/**\r\n * StyleBuilder - Fluent API for creating Excel styles\r\n */\r\n\r\nimport {\r\n IStyle,\r\n IBorder,\r\n IConditionalFormat,\r\n IStyleBuilder as IStyleBuilderInterface\r\n} from '../types/style.types';\r\nimport { \r\n Color, \r\n HorizontalAlignment,\r\n VerticalAlignment,\r\n BorderStyle, \r\n FontStyle \r\n} from '../types/core.types';\r\n\r\n/**\r\n * StyleBuilder class providing a fluent API for creating Excel styles\r\n */\r\nexport class StyleBuilder implements IStyleBuilderInterface {\r\n private style: Partial<IStyle> = {};\r\n\r\n constructor() {\r\n // Configuración por defecto: wrapText true y alineación al centro\r\n this.style.alignment = {\r\n horizontal: HorizontalAlignment.CENTER,\r\n vertical: VerticalAlignment.MIDDLE,\r\n wrapText: true,\r\n shrinkToFit: true\r\n };\r\n }\r\n\r\n /**\r\n * Create a new StyleBuilder instance\r\n */\r\n static create(): StyleBuilder {\r\n return new StyleBuilder();\r\n }\r\n\r\n /**\r\n * Set font name\r\n */\r\n fontName(name: string): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.name = name;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set font size\r\n */\r\n fontSize(size: number): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.size = size;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set font style\r\n */\r\n fontStyle(style: FontStyle): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.style = style;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set font color\r\n */\r\n fontColor(color: Color): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.color = color;\r\n return this;\r\n }\r\n\r\n /**\r\n * Make font bold\r\n */\r\n fontBold(): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.bold = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Make font italic\r\n */\r\n fontItalic(): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.italic = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Make font underlined\r\n */\r\n fontUnderline(): StyleBuilder {\r\n if (!this.style.font) {\r\n this.style.font = {};\r\n }\r\n this.style.font.underline = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set border on all sides\r\n */\r\n border(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.top = border;\r\n this.style.border.left = border;\r\n this.style.border.bottom = border;\r\n this.style.border.right = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set top border\r\n */\r\n borderTop(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.top = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set left border\r\n */\r\n borderLeft(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.left = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set bottom border\r\n */\r\n borderBottom(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.bottom = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set right border\r\n */\r\n borderRight(style: BorderStyle, color?: Color): StyleBuilder {\r\n if (!this.style.border) {\r\n this.style.border = {};\r\n }\r\n const border: IBorder = { style };\r\n if (color !== undefined) {\r\n border.color = color;\r\n }\r\n this.style.border.right = border;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set background color\r\n */\r\n backgroundColor(color: Color): StyleBuilder {\r\n if (!this.style.fill) {\r\n this.style.fill = { type: 'pattern' };\r\n }\r\n this.style.fill.backgroundColor = color;\r\n this.style.fill.pattern = 'solid';\r\n return this;\r\n }\r\n\r\n /**\r\n * Set horizontal alignment\r\n */\r\n horizontalAlign(alignment: HorizontalAlignment): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.horizontal = alignment;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set vertical alignment\r\n */\r\n verticalAlign(alignment: VerticalAlignment): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.vertical = alignment;\r\n return this;\r\n }\r\n\r\n /**\r\n * Center align text\r\n */\r\n centerAlign(): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.horizontal = HorizontalAlignment.CENTER;\r\n this.style.alignment.vertical = VerticalAlignment.MIDDLE;\r\n return this;\r\n }\r\n\r\n /**\r\n * Left align text\r\n */\r\n leftAlign(): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.horizontal = HorizontalAlignment.LEFT;\r\n return this;\r\n }\r\n\r\n /**\r\n * Right align text\r\n */\r\n rightAlign(): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.horizontal = HorizontalAlignment.RIGHT;\r\n return this;\r\n }\r\n\r\n /**\r\n * Wrap text\r\n */\r\n wrapText(): StyleBuilder {\r\n if (!this.style.alignment) {\r\n this.style.alignment = {};\r\n }\r\n this.style.alignment.wrapText = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set number format\r\n */\r\n numberFormat(format: string): StyleBuilder {\r\n this.style.numberFormat = format;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set striped rows\r\n */\r\n striped(): StyleBuilder {\r\n this.style.striped = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Add conditional formatting\r\n */\r\n conditionalFormat(format: IConditionalFormat): StyleBuilder {\r\n if (!this.style.conditionalFormats) {\r\n this.style.conditionalFormats = [];\r\n }\r\n this.style.conditionalFormats.push(format);\r\n return this;\r\n }\r\n\r\n /**\r\n * Build the final style\r\n */\r\n build(): IStyle {\r\n return this.style as IStyle;\r\n }\r\n\r\n /**\r\n * Reset the builder\r\n */\r\n reset(): StyleBuilder {\r\n this.style = {};\r\n // Restaurar configuración por defecto\r\n this.style.alignment = {\r\n horizontal: HorizontalAlignment.CENTER,\r\n vertical: VerticalAlignment.MIDDLE,\r\n wrapText: true\r\n };\r\n return this;\r\n }\r\n\r\n /**\r\n * Clone the current style\r\n */\r\n clone(): StyleBuilder {\r\n const cloned = new StyleBuilder();\r\n cloned.style = JSON.parse(JSON.stringify(this.style));\r\n return cloned;\r\n }\r\n} ","/**\r\n * Cell-specific type definitions\r\n */\r\n\r\nimport { IBaseCell } from './core.types';\r\nimport type { CellValue } from 'exceljs';\r\n\r\n/**\r\n * Header cell interface\r\n */\r\nexport interface IHeaderCell extends IBaseCell {\r\n /** Reference to parent header key */\r\n mainHeaderKey?: string;\r\n /** Child headers */\r\n children?: IHeaderCell[];\r\n /** Whether this is a main header */\r\n isMainHeader?: boolean;\r\n /** Header level (1 = main, 2 = sub, etc.) */\r\n level?: number;\r\n}\r\n\r\n/**\r\n * Data cell interface\r\n */\r\nexport interface IDataCell extends IBaseCell {\r\n /** Reference to header key */\r\n header: string;\r\n /** Reference to main header key */\r\n mainHeaderKey?: string;\r\n /** Child data cells */\r\n children?: IDataCell[];\r\n /** Whether this cell has alternating row color */\r\n striped?: boolean;\r\n /** Row index */\r\n rowIndex?: number;\r\n /** Column index */\r\n colIndex?: number;\r\n}\r\n\r\n/**\r\n * Footer cell interface\r\n */\r\nexport interface IFooterCell extends IBaseCell {\r\n /** Reference to header key */\r\n header: string;\r\n /** Child footer cells */\r\n children?: IDataCell[];\r\n /** Whether this is a total row */\r\n isTotal?: boolean;\r\n /** Footer type */\r\n footerType?: 'total' | 'subtotal' | 'average' | 'count' | 'custom';\r\n}\r\n\r\n/**\r\n * Cell position interface\r\n */\r\nexport interface ICellPosition {\r\n /** Row index (1-based) */\r\n row: number;\r\n /** Column index (1-based) */\r\n col: number;\r\n /** Cell reference (e.g., A1) */\r\n reference: string;\r\n}\r\n\r\n/**\r\n * Cell range interface\r\n */\r\nexport interface ICellRange {\r\n /** Start position */\r\n start: ICellPosition;\r\n /** End position */\r\n end: ICellPosition;\r\n /** Range reference (e.g., A1:B10) */\r\n reference: string;\r\n}\r\n\r\n/**\r\n * Cell data for different types\r\n */\r\nexport interface ICellData {\r\n /** String cell data */\r\n string?: {\r\n value: string;\r\n maxLength?: number;\r\n trim?: boolean;\r\n };\r\n /** Number cell data */\r\n number?: {\r\n value: number;\r\n min?: number;\r\n max?: number;\r\n precision?: number;\r\n allowNegative?: boolean;\r\n };\r\n /** Date cell data */\r\n date?: {\r\n value: Date;\r\n min?: Date;\r\n max?: Date;\r\n format?: string;\r\n };\r\n /** Boolean cell data */\r\n boolean?: {\r\n value: boolean;\r\n trueText?: string;\r\n falseText?: string;\r\n };\r\n /** Percentage cell data */\r\n percentage?: {\r\n value: number;\r\n min?: number;\r\n max?: number;\r\n precision?: number;\r\n showSymbol?: boolean;\r\n };\r\n /** Currency cell data */\r\n currency?: {\r\n value: number;\r\n currency?: string;\r\n precision?: number;\r\n showSymbol?: boolean;\r\n };\r\n /** Link cell data */\r\n link?: {\r\n value: string;\r\n text?: string;\r\n tooltip?: string;\r\n };\r\n /** Formula cell data */\r\n formula?: {\r\n value: string;\r\n result?: CellValue;\r\n };\r\n}\r\n\r\n/**\r\n * Cell validation result\r\n */\r\nexport interface ICellValidationResult {\r\n /** Whether the cell is valid */\r\n isValid: boolean;\r\n /** Validation errors */\r\n errors: string[];\r\n /** Validation warnings */\r\n warnings: string[];\r\n}\r\n\r\n/**\r\n * Cell event types\r\n */\r\nexport enum CellEventType {\r\n CREATED = 'created',\r\n UPDATED = 'updated',\r\n DELETED = 'deleted',\r\n STYLED = 'styled',\r\n VALIDATED = 'validated'\r\n}\r\n\r\n/**\r\n * Cell event interface\r\n */\r\nexport interface ICellEvent {\r\n type: CellEventType;\r\n cell: IDataCell | IHeaderCell | IFooterCell;\r\n position: ICellPosition;\r\n timestamp: Date;\r\n data?: Record<string, unknown>;\r\n} ","/**\n * Worksheet-specific type definitions\n */\n\nimport { IHeaderCell, IDataCell, IFooterCell, ICellPosition, ICellRange } from './cell.types';\nimport { Color, Result } from './core.types';\n\n/**\n * Worksheet configuration interface\n */\nexport interface IWorksheetConfig {\n /** Worksheet name */\n name: string;\n /** Tab color */\n tabColor?: Color;\n /** Default row height */\n defaultRowHeight?: number;\n /** Default column width */\n defaultColWidth?: number;\n /** Whether the worksheet is hidden */\n hidden?: boolean;\n /** Whether the worksheet is protected */\n protected?: boolean;\n /** Protection password */\n protectionPassword?: string;\n /** Whether to show grid lines */\n showGridLines?: boolean;\n /** Whether to show row and column headers */\n showRowColHeaders?: boolean;\n /** Zoom level (1-400) */\n zoom?: number;\n /** Freeze panes position */\n freezePanes?: ICellPosition;\n /** Print area */\n printArea?: ICellRange;\n /** Fit to page settings */\n fitToPage?: {\n fitToWidth?: number;\n fitToHeight?: number;\n };\n /** Page setup */\n pageSetup?: {\n orientation?: 'portrait' | 'landscape';\n paperSize?: number;\n fitToPage?: boolean;\n fitToWidth?: number;\n fitToHeight?: number;\n scale?: number;\n horizontalCentered?: boolean;\n verticalCentered?: boolean;\n margins?: {\n top?: number;\n left?: number;\n bottom?: number;\n right?: number;\n header?: number;\n footer?: number;\n };\n };\n}\n\n/**\n * Table structure interface\n */\nexport interface ITable {\n /** Table name */\n name?: string;\n /** Table headers */\n headers?: IHeaderCell[];\n /** Table sub-headers */\n subHeaders?: IHeaderCell[];\n /** Table data rows */\n body?: IDataCell[];\n /** Table footers */\n footers?: IFooterCell[];\n /** Table range */\n range?: ICellRange;\n /** Whether to show table borders */\n showBorders?: boolean;\n /** Whether to show alternating row colors */\n showStripes?: boolean;\n /** Table style */\n style?: 'TableStyleLight1' | 'TableStyleLight2' | 'TableStyleMedium1' | 'TableStyleMedium2' | 'TableStyleDark1' | 'TableStyleDark2';\n}\n\n/**\n * Worksheet interface\n */\nexport interface IWorksheet {\n /** Worksheet configuration */\n config: IWorksheetConfig;\n /** Tables in the worksheet */\n tables: ITable[];\n /** Current row pointer */\n currentRow: number;\n /** Current column pointer */\n currentCol: number;\n /** Header pointers for navigation */\n headerPointers: Map<string, ICellPosition>;\n /** Whether the worksheet has been built */\n isBuilt: boolean;\n\n /** Add a header */\n addHeader(header: IHeaderCell): this;\n /** Add subheaders */\n addSubHeaders(subHeaders: IHeaderCell[]): this;\n /** Add a row or rows */\n addRow(row: IDataCell[] | IDataCell): this;\n /** Add a footer or footers */\n addFooter(footer: IFooterCell[] | IFooterCell): this;\n /** Add a new table to the worksheet */\n addTable(tableConfig?: Partial<ITable>): this;\n /** Finalize the current table with temporary data */\n finalizeTable(): this;\n /** Get a table by name */\n getTable(name: string): ITable | undefined;\n /** Build the worksheet */\n build(workbook: any, options?: any): Promise<void>;\n /** Validate the worksheet */\n validate(): Result<boolean>;\n}\n\n/**\n * Worksheet event types\n */\nexport enum WorksheetEventType {\n CREATED = 'created',\n UPDATED = 'updated',\n DELETED = 'deleted',\n TABLE_ADDED = 'tableAdded',\n TABLE_REMOVED = 'tableRemoved',\n CELL_ADDED = 'cellAdded',\n CELL_UPDATED = 'cellUpdated',\n CELL_DELETED = 'cellDeleted'\n}\n\n/**\n * Worksheet event interface\n */\nexport interface IWorksheetEvent {\n type: WorksheetEventType;\n worksheet: IWorksheet;\n data?: Record<string, unknown>;\n timestamp: Date;\n}\n\n/**\n * Worksheet validation result\n */\nexport interface IWorksheetValidationResult {\n /** Whether the worksheet is valid */\n isValid: boolean;\n /** Validation errors */\n errors: string[];\n /** Validation warnings */\n warnings: string[];\n /** Cell validation results */\n cellResults: Map<string, boolean>;\n}\n\n/**\n * Worksheet statistics\n */\nexport interface IWorksheetStats {\n /** Total number of cells */\n totalCells: number;\n /** Number of header cells */\n headerCells: number;\n /** Number of data cells */\n dataCells: number;\n /** Number of footer cells */\n footerCells: number;\n /** Number of tables */\n tables: number;\n /** Used range */\n usedRange: ICellRange;\n /** Memory usage in bytes */\n memoryUsage: number;\n} ","/**\r\n * Style-specific type definitions\r\n */\r\n\r\nimport { \r\n Color, \r\n HorizontalAlignment, \r\n VerticalAlignment, \r\n BorderStyle, \r\n FontStyle \r\n} from './core.types';\r\n\r\n/**\r\n * Font configuration interface\r\n */\r\nexport interface IFont {\r\n /** Font name */\r\n name?: string;\r\n /** Font size */\r\n size?: number;\r\n /** Font style */\r\n style?: FontStyle;\r\n /** Font color */\r\n color?: Color;\r\n /** Whether the font is bold */\r\n bold?: boolean;\r\n /** Whether the font is italic */\r\n italic?: boolean;\r\n /** Whether the font is underlined */\r\n underline?: boolean;\r\n /** Whether the font is strikethrough */\r\n strikethrough?: boolean;\r\n /** Font family */\r\n family?: string;\r\n /** Font scheme */\r\n scheme?: 'major' | 'minor' | 'none';\r\n}\r\n\r\n/**\r\n * Border configuration interface\r\n */\r\nexport interface IBorder {\r\n /** Border style */\r\n style?: BorderStyle;\r\n /** Border color */\r\n color?: Color;\r\n /** Border width */\r\n width?: number;\r\n}\r\n\r\n/**\r\n * Border sides interface\r\n */\r\nexport interface IBorderSides {\r\n /** Top border */\r\n top?: IBorder;\r\n /** Left border */\r\n left?: IBorder;\r\n /** Bottom border */\r\n bottom?: IBorder;\r\n /** Right border */\r\n right?: IBorder;\r\n /** Diagonal border */\r\n diagonal?: IBorder;\r\n /** Diagonal direction */\r\n diagonalDirection?: 'up' | 'down' | 'both';\r\n}\r\n\r\n/**\r\n * Fill pattern interface\r\n */\r\nexport interface IFill {\r\n /** Fill type */\r\n type: 'pattern' | 'gradient';\r\n /** Pattern type (for pattern fills) */\r\n pattern?: 'none' | 'solid' | 'darkGray' | 'mediumGray' | 'lightGray' | 'gray125' | 'gray0625' | 'darkHorizontal' | 'darkVertical' | 'darkDown' | 'darkUp' | 'darkGrid' | 'darkTrellis' | 'lightHorizontal' | 'lightVertical' | 'lightDown' | 'lightUp' | 'lightGrid' | 'lightTrellis';\r\n /** Background color */\r\n backgroundColor?: Color;\r\n /** Foreground color */\r\n foregroundColor?: Color;\r\n /** Gradient type (for gradient fills) */\r\n gradient?: 'linear' | 'path';\r\n /** Gradient stops */\r\n stops?: Array<{\r\n position: number;\r\n color: Color;\r\n }>;\r\n /** Gradient angle (for linear gradients) */\r\n angle?: number;\r\n}\r\n\r\n/**\r\n * Alignment configuration interface\r\n */\r\nexport interface IAlignment {\r\n /** Horizontal alignment */\r\n horizontal?: HorizontalAlignment;\r\n /** Vertical alignment */\r\n vertical?: VerticalAlignment;\r\n /** Text rotation (0-180 degrees) */\r\n textRotation?: number;\r\n /** Whether to wrap text */\r\n wrapText?: boolean;\r\n /** Whether to shrink text to fit */\r\n shrinkToFit?: boolean;\r\n /** Indent level */\r\n indent?: number;\r\n /** Whether to merge cells */\r\n mergeCell?: boolean;\r\n /** Reading order */\r\n readingOrder?: 'left-to-right' | 'right-to-left';\r\n}\r\n\r\n/**\r\n * Protection configuration interface\r\n */\r\nexport interface IProtection {\r\n /** Whether the cell is locked */\r\n locked?: boolean;\r\n /** Whether the cell is hidden */\r\n hidden?: boolean;\r\n}\r\n\r\n/**\r\n * Conditional formatting interface\r\n */\r\nexport interface IConditionalFormat {\r\n /** Condition type */\r\n type: 'cellIs' | 'containsText' | 'beginsWith' | 'endsWith' | 'containsBlanks' | 'notContainsBlanks' | 'containsErrors' | 'notContainsErrors' | 'timePeriod' | 'top' | 'bottom' | 'aboveAverage' | 'belowAverage' | 'duplicateValues' | 'uniqueValues' | 'expression' | 'colorScale' | 'dataBar' | 'iconSet';\r\n /** Condition operator */\r\n operator?: 'between' | 'notBetween' | 'equal' | 'notEqual' | 'greaterThan' | 'lessThan' | 'greaterThanOrEqual' | 'lessThanOrEqual';\r\n /** Condition values */\r\n values?: Array<string | number | Date>;\r\n /** Condition formula */\r\n formula?: string;\r\n /** Style to apply when condition is met */\r\n style?: IStyle;\r\n /** Priority of the condition */\r\n priority?: number;\r\n /** Whether to stop if true */\r\n stopIfTrue?: boolean;\r\n}\r\n\r\n/**\r\n * Main style interface\r\n */\r\nexport interface IStyle {\r\n /** Font configuration */\r\n font?: IFont;\r\n /** Border configuration */\r\n border?: IBorderSides;\r\n /** Fill configuration */\r\n fill?: IFill;\r\n /** Alignment configuration */\r\n alignment?: IAlignment;\r\n /** Protection configuration */\r\n protection?: IProtection;\r\n /** Conditional formatting */\r\n conditionalFormats?: IConditionalFormat[];\r\n /** Number format */\r\n numberFormat?: string;\r\n /** Whether to apply alternating row colors */\r\n striped?: boolean;\r\n /** Custom CSS-like properties */\r\n custom?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Style preset types\r\n */\r\nexport enum StylePreset {\r\n HEADER = 'header',\r\n SUBHEADER = 'subheader',\r\n DATA = 'data',\r\n FOOTER = 'footer',\r\n TOTAL = 'total',\r\n HIGHLIGHT = 'highlight',\r\n WARNING = 'warning',\r\n ERROR = 'error',\r\n SUCCESS = 'success',\r\n INFO = 'info'\r\n}\r\n\r\n/**\r\n * Style theme interface\r\n */\r\nexport interface IStyleTheme {\r\n /** Theme name */\r\n name: string;\r\n /** Theme description */\r\n description?: string;\r\n /** Color palette */\r\n colors: {\r\n primary: Color;\r\n secondary: Color;\r\n accent: Color;\r\n background: Color;\r\n text: Color;\r\n border: Color;\r\n success: Color;\r\n warning: Color;\r\n error: Color;\r\n info: Color;\r\n };\r\n /** Font family */\r\n fontFamily: string;\r\n /** Base font size */\r\n fontSize: number;\r\n /** Style presets */\r\n presets: Record<StylePreset, IStyle>;\r\n}\r\n\r\n/**\r\n * Style builder interface\r\n */\r\nexport interface IStyleBuilder {\r\n /** Set font name */\r\n fontName(name: string): IStyleBuilder;\r\n /** Set font size */\r\n fontSize(size: number): IStyleBuilder;\r\n /** Set font style */\r\n fontStyle(style: FontStyle): IStyleBuilder;\r\n /** Set font color */\r\n fontColor(color: Color): IStyleBuilder;\r\n /** Make font bold */\r\n fontBold(): IStyleBuilder;\r\n /** Make font italic */\r\n fontItalic(): IStyleBuilder;\r\n /** Make font underlined */\r\n fontUnderline(): IStyleBuilder;\r\n /** Set border */\r\n border(style: BorderStyle, color?: Color): IStyleBuilder;\r\n /** Set specific border */\r\n borderTop(style: BorderStyle, color?: Color): IStyleBuilder;\r\n borderLeft(style: BorderStyle, color?: Color): IStyleBuilder;\r\n borderBottom(style: BorderStyle, color?: Color): IStyleBuilder;\r\n borderRight(style: BorderStyle, color?: Color): IStyleBuilder;\r\n /** Set background color */\r\n backgroundColor(color: Color): IStyleBuilder;\r\n /** Set horizontal alignment */\r\n horizontalAlign(alignment: HorizontalAlignment): IStyleBuilder;\r\n /** Set vertical alignment */\r\n verticalAlign(alignment: VerticalAlignment): IStyleBuilder;\r\n /** Center align text */\r\n centerAlign(): IStyleBuilder;\r\n /** Left align text */\r\n leftAlign(): IStyleBuilder;\r\n /** Right align text */\r\n rightAlign(): IStyleBuilder;\r\n /** Wrap text */\r\n wrapText(): IStyleBuilder;\r\n /** Set number format */\r\n numberFormat(format: string): IStyleBuilder;\r\n /** Set striped rows */\r\n striped(): IStyleBuilder;\r\n /** Add conditional formatting */\r\n conditionalFormat(format: IConditionalFormat): IStyleBuilder;\r\n /** Build the final style */\r\n build(): IStyle;\r\n} "],"names":["CellType","NumberFormat","HorizontalAlignment","VerticalAlignment","BorderStyle","FontStyle","ErrorType","BuilderEventType","CellEventType","WorksheetEventType","StylePreset"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "han-excel-builder",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "description": "Advanced Excel file generator with TypeScript support, comprehensive styling, and optimized performance",
5
5
  "type": "module",
6
6
  "main": "dist/han-excel.cjs.js",