juxscript 1.1.202 → 1.1.204

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 +1 @@
1
- {"version":3,"file":"dataframe.d.ts","sourceRoot":"","sources":["dataframe.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dataframe.d.ts","sourceRoot":"","sources":["dataframe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AASnC,MAAM,WAAW,gBAAgB;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,KAAK,cAAc,GAAG,SAAS,GAAG;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,qBAAa,kBAAmB,SAAQ,aAAa,CAAC,cAAc,CAAC;IACjE,OAAO,CAAC,GAAG,CAA0B;IACrC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,aAAa,CAOnB;IACF,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,cAAc,CAAsC;IAC5D,OAAO,CAAC,aAAa,CAAgE;IACrF,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,mBAAmB,CAAiB;IAC5C,OAAO,CAAC,YAAY,CAAiE;IACrF,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,qBAAqB,CAAkB;gBAEnC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAmCtD,SAAS,CAAC,gBAAgB,IAAI,SAAS,MAAM,EAAE;IAC/C,SAAS,CAAC,iBAAiB,IAAI,SAAS,MAAM,EAAE;IAMhD,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAwB9B,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAWpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI;IAiBnE,UAAU,CAAC,KAAK,GAAE,MAAsB,EAAE,MAAM,GAAE,MAAoC,EAAE,IAAI,GAAE,MAAiB,GAAG,IAAI;IAStH,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI;IAC5B,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAM3B,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,SAAS,GAAG,IAAI;IAQ7C,MAAM,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI;IAI7E,MAAM,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAI/B,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI;IAI7C,IAAI,CAAC,CAAC,GAAE,MAAU,GAAG,IAAI;IAIzB,IAAI,CAAC,CAAC,GAAE,MAAU,GAAG,IAAI;IAIzB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,GAAG,GAAG,IAAI;IAIpF,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,UAAU,GAAG,YAAY,GAAG,UAAU,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAQxH,IAAI,EAAE,IAAI,SAAS,GAAG,IAAI,CAAqB;IAC/C,IAAI,MAAM,IAAI,aAAa,CAAyB;IACpD,IAAI,KAAK,IAAI,KAAK,GAAG,IAAI,CAAwB;IACjD,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IACtC,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM;IACjC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;IAC/B,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAsC;IACnE,IAAI,OAAO,IAAI,MAAM,EAAE,CAAoC;IAErD,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUhD,OAAO,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI;IACzB,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI;IAC3B,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI;IAC1B,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI;IAC5B,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI;IAC3B,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAC5B,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAC7B,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAC/B,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;YAMf,WAAW;IAyDzB,OAAO,CAAC,iBAAiB;IA+HzB,OAAO,CAAC,aAAa;IAuBrB,OAAO,CAAC,aAAa;IAgFrB,OAAO,CAAC,oBAAoB;IA6B5B,OAAO,CAAC,sBAAsB;IA8B9B,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,oBAAoB;YASd,sBAAsB;IAiOpC,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,oBAAoB;IAwM5B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI;IAExC,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI;CAoErE;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,kBAAkB,CAExF"}
@@ -372,9 +372,23 @@ export class DataFrameComponent extends BaseComponent {
372
372
  this.state.sourceName = sourceName;
373
373
  this.state.rowCount = df.height;
374
374
  this.state.colCount = df.width;
375
- const cleanCols = df.columns.filter(c => !c.startsWith('__EMPTY'));
376
- if (cleanCols.length < df.columns.length) {
377
- this._df = df.select(...cleanCols);
375
+ // Only strip __EMPTY columns that are ENTIRELY null/empty
376
+ const cols = df.columns;
377
+ const rows = df.toRows();
378
+ const emptyColumns = cols.filter(c => {
379
+ if (!c.startsWith('__EMPTY'))
380
+ return false;
381
+ // Check if ALL values in this column are null/empty
382
+ return rows.every(row => {
383
+ const val = row[c];
384
+ return val === null || val === undefined || String(val).trim() === '';
385
+ });
386
+ });
387
+ if (emptyColumns.length > 0) {
388
+ const keepCols = cols.filter(c => !emptyColumns.includes(c));
389
+ if (keepCols.length > 0) {
390
+ this._df = df.select(...keepCols);
391
+ }
378
392
  }
379
393
  if (this._table && this._df) {
380
394
  const columnDefs = this._df.columns.map(col => ({ key: col, label: col }));
@@ -554,6 +568,11 @@ export class DataFrameComponent extends BaseComponent {
554
568
  sheetChunkSize: this._sheetChunkSize
555
569
  });
556
570
  const sheetNames = Object.keys(sheets);
571
+ if (sheetNames.length === 0) {
572
+ this._updateStatus(`No data found with header at row ${headerRow}. Try a different row.`, 'error');
573
+ this.state.loading = false;
574
+ return;
575
+ }
557
576
  await this._driver.store(this._rawFileData.file.name, sheets[sheetNames[0]], { source: this._rawFileData.file.name });
558
577
  if (sheetNames.length > 1) {
559
578
  this._renderMultiSheet(sheets, this._rawFileData.file.name);
@@ -565,6 +584,7 @@ export class DataFrameComponent extends BaseComponent {
565
584
  }
566
585
  catch (err) {
567
586
  this._updateStatus(`Error: ${err.message}`, 'error');
587
+ this.state.loading = false;
568
588
  }
569
589
  }
570
590
  }
@@ -746,6 +766,7 @@ export class DataFrameComponent extends BaseComponent {
746
766
  }
747
767
  catch (err) {
748
768
  this._updateStatus(`Error: ${err.message}`, 'error');
769
+ this.state.loading = false;
749
770
  }
750
771
  }
751
772
  }
@@ -463,9 +463,23 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
463
463
  this.state.rowCount = df.height;
464
464
  this.state.colCount = df.width;
465
465
 
466
- const cleanCols = df.columns.filter(c => !c.startsWith('__EMPTY'));
467
- if (cleanCols.length < df.columns.length) {
468
- this._df = df.select(...cleanCols);
466
+ // Only strip __EMPTY columns that are ENTIRELY null/empty
467
+ const cols = df.columns;
468
+ const rows = df.toRows();
469
+ const emptyColumns = cols.filter(c => {
470
+ if (!c.startsWith('__EMPTY')) return false;
471
+ // Check if ALL values in this column are null/empty
472
+ return rows.every(row => {
473
+ const val = row[c];
474
+ return val === null || val === undefined || String(val).trim() === '';
475
+ });
476
+ });
477
+
478
+ if (emptyColumns.length > 0) {
479
+ const keepCols = cols.filter(c => !emptyColumns.includes(c));
480
+ if (keepCols.length > 0) {
481
+ this._df = df.select(...keepCols);
482
+ }
469
483
  }
470
484
 
471
485
  if (this._table && this._df) {
@@ -677,6 +691,13 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
677
691
  });
678
692
 
679
693
  const sheetNames = Object.keys(sheets);
694
+
695
+ if (sheetNames.length === 0) {
696
+ this._updateStatus(`No data found with header at row ${headerRow}. Try a different row.`, 'error');
697
+ this.state.loading = false;
698
+ return;
699
+ }
700
+
680
701
  await this._driver.store(this._rawFileData!.file.name, sheets[sheetNames[0]], { source: this._rawFileData!.file.name });
681
702
 
682
703
  if (sheetNames.length > 1) {
@@ -688,6 +709,7 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
688
709
  this._reshapeModal!.closeModal();
689
710
  } catch (err: any) {
690
711
  this._updateStatus(`Error: ${err.message}`, 'error');
712
+ this.state.loading = false;
691
713
  }
692
714
  }
693
715
  }
@@ -891,6 +913,7 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
891
913
  this._reshapeModal!.closeModal();
892
914
  } catch (err: any) {
893
915
  this._updateStatus(`Error: ${err.message}`, 'error');
916
+ this.state.loading = false;
894
917
  }
895
918
  }
896
919
  }
@@ -90,6 +90,9 @@ export declare class TabularDriver {
90
90
  /**
91
91
  * ✅ FIXED: Stream Excel file with optional headerRow override
92
92
  * headerRow is 0-based: 0 = first row, 1 = second row, etc.
93
+ *
94
+ * Uses direct cell access instead of sheet_to_json to avoid
95
+ * issues with blank row handling and sparse arrays.
93
96
  */
94
97
  streamFileMultiSheet(file: File, options?: ParseOptions): Promise<Record<string, DataFrame>>;
95
98
  private _splitLines;
@@ -1 +1 @@
1
- {"version":3,"file":"TabularDriver.d.ts","sourceRoot":"","sources":["TabularDriver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,qBAAa,aAAa;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,GAAG,CAA4B;gBAE3B,MAAM,GAAE,MAAsB,EAAE,SAAS,GAAE,MAAiB;IAKlE,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC;IA4BlC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAgCxB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAwBxB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,SAAS;IA6D7D;;;OAGG;IACG,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,SAAS,CAAC;IAoG5E;;OAEG;YACW,UAAU;IAuExB;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAiBlD;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAuBzF;;OAEG;IACG,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAwBjD;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IA4BzD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAqBlH;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB5B;;OAEG;IACG,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,SAAS,CAAC;IA0ExE;;;OAGG;IACG,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAmItG,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,UAAU;IAmClB,OAAO,CAAC,SAAS;IAYjB,KAAK,IAAI,IAAI;CAMhB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,aAAa,CAEhF"}
1
+ {"version":3,"file":"TabularDriver.d.ts","sourceRoot":"","sources":["TabularDriver.ts"],"names":[],"mappings":"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"}
@@ -489,6 +489,9 @@ export class TabularDriver {
489
489
  /**
490
490
  * ✅ FIXED: Stream Excel file with optional headerRow override
491
491
  * headerRow is 0-based: 0 = first row, 1 = second row, etc.
492
+ *
493
+ * Uses direct cell access instead of sheet_to_json to avoid
494
+ * issues with blank row handling and sparse arrays.
492
495
  */
493
496
  async streamFileMultiSheet(file, options = {}) {
494
497
  const { maxSheetSize = 100000, sheetChunkSize = 10000, onProgress, headerRow = 0 } = options;
@@ -520,41 +523,46 @@ export class TabularDriver {
520
523
  continue;
521
524
  }
522
525
  const range = XLSX.utils.decode_range(ref);
523
- const startRow = range.s.r; // first row index
524
- const endRow = range.e.r; // last row index
525
- const startCol = range.s.c; // first col index
526
- const endCol = range.e.c; // last col index
527
- const numCols = endCol - startCol + 1;
526
+ const startRow = range.s.r;
527
+ const endRow = range.e.r;
528
+ const startCol = range.s.c;
529
+ const endCol = range.e.c;
528
530
  if (endRow < startRow) {
529
531
  processedSheets++;
530
532
  continue;
531
533
  }
532
- // Helper: read a single cell value from the worksheet
533
- const getCellValue = (r, c) => {
534
- const cellAddress = XLSX.utils.encode_cell({ r, c });
535
- const cell = worksheet[cellAddress];
534
+ // Direct cell reader - bypasses sheet_to_json completely
535
+ const readCellValue = (r, c) => {
536
+ const addr = XLSX.utils.encode_cell({ r, c });
537
+ const cell = worksheet[addr];
536
538
  if (!cell)
537
539
  return null;
538
- // Use formatted value (v = raw, w = formatted text)
539
- return cell.v !== undefined ? cell.v : null;
540
+ // Prefer formatted string (w) for display, fall back to raw value (v)
541
+ if (cell.w !== undefined)
542
+ return cell.w;
543
+ if (cell.v !== undefined)
544
+ return cell.v;
545
+ return null;
540
546
  };
541
- // Helper: read an entire row as an array
542
547
  const readRow = (r) => {
543
548
  const vals = [];
544
549
  for (let c = startCol; c <= endCol; c++) {
545
- vals.push(getCellValue(r, c));
550
+ vals.push(readCellValue(r, c));
546
551
  }
547
552
  return vals;
548
553
  };
549
- // The actual row in the sheet for the header
554
+ // Map headerRow (0-based user index) to actual sheet row
550
555
  const headerSheetRow = startRow + headerRow;
556
+ console.log(`[TabularDriver] Sheet "${sheetName}": range=${ref}, startRow=${startRow}, endRow=${endRow}, startCol=${startCol}, endCol=${endCol}`);
557
+ console.log(`[TabularDriver] headerRow=${headerRow}, headerSheetRow=${headerSheetRow}`);
551
558
  if (headerSheetRow > endRow) {
552
- console.warn(`[TabularDriver] headerRow ${headerRow} exceeds sheet range (max row: ${endRow - startRow})`);
559
+ console.warn(`[TabularDriver] headerRow ${headerRow} (sheet row ${headerSheetRow}) exceeds endRow ${endRow}`);
553
560
  processedSheets++;
554
561
  continue;
555
562
  }
556
- // Read header row values directly from cells
563
+ // Read header values directly from cells
557
564
  const headerValues = readRow(headerSheetRow);
565
+ console.log(`[TabularDriver] Raw header values at sheet row ${headerSheetRow}:`, headerValues);
558
566
  // Build headers array
559
567
  const headers = headerValues.map((h, i) => {
560
568
  if (h === null || h === undefined || String(h).trim() === '') {
@@ -562,10 +570,15 @@ export class TabularDriver {
562
570
  }
563
571
  return String(h).trim();
564
572
  });
565
- // Ensure we have at least one valid header
573
+ // Count valid headers
566
574
  const validHeaders = headers.filter(h => !h.startsWith('__EMPTY'));
575
+ console.log(`[TabularDriver] Headers (${validHeaders.length} valid / ${headers.length} total):`, headers);
567
576
  if (validHeaders.length === 0) {
568
- console.warn(`[TabularDriver] No valid headers found at row ${headerRow} in sheet "${sheetName}"`);
577
+ console.warn(`[TabularDriver] No valid headers found at row ${headerRow} (sheet row ${headerSheetRow}) in sheet "${sheetName}"`);
578
+ // Log surrounding rows for debugging
579
+ for (let debugR = Math.max(startRow, headerSheetRow - 2); debugR <= Math.min(endRow, headerSheetRow + 2); debugR++) {
580
+ console.log(`[TabularDriver] row ${debugR}:`, readRow(debugR));
581
+ }
569
582
  processedSheets++;
570
583
  continue;
571
584
  }
@@ -579,10 +592,14 @@ export class TabularDriver {
579
592
  continue;
580
593
  const row = {};
581
594
  for (let j = 0; j < headers.length; j++) {
582
- row[headers[j]] = rowData[j] !== undefined ? rowData[j] : null;
595
+ row[headers[j]] = rowData[j];
583
596
  }
584
597
  rows.push(row);
585
598
  }
599
+ console.log(`[TabularDriver] Built ${rows.length} data rows for sheet "${sheetName}"`);
600
+ if (rows.length > 0) {
601
+ console.log(`[TabularDriver] First row:`, rows[0]);
602
+ }
586
603
  if (rows.length > 0) {
587
604
  sheets[sheetName] = new DataFrame(rows);
588
605
  }
@@ -609,6 +609,9 @@ export class TabularDriver {
609
609
  /**
610
610
  * ✅ FIXED: Stream Excel file with optional headerRow override
611
611
  * headerRow is 0-based: 0 = first row, 1 = second row, etc.
612
+ *
613
+ * Uses direct cell access instead of sheet_to_json to avoid
614
+ * issues with blank row handling and sparse arrays.
612
615
  */
613
616
  async streamFileMultiSheet(file: File, options: ParseOptions = {}): Promise<Record<string, DataFrame>> {
614
617
  const { maxSheetSize = 100000, sheetChunkSize = 10000, onProgress, headerRow = 0 } = options;
@@ -646,46 +649,50 @@ export class TabularDriver {
646
649
  }
647
650
 
648
651
  const range = XLSX.utils.decode_range(ref);
649
- const startRow = range.s.r; // first row index
650
- const endRow = range.e.r; // last row index
651
- const startCol = range.s.c; // first col index
652
- const endCol = range.e.c; // last col index
653
- const numCols = endCol - startCol + 1;
652
+ const startRow = range.s.r;
653
+ const endRow = range.e.r;
654
+ const startCol = range.s.c;
655
+ const endCol = range.e.c;
654
656
 
655
657
  if (endRow < startRow) {
656
658
  processedSheets++;
657
659
  continue;
658
660
  }
659
661
 
660
- // Helper: read a single cell value from the worksheet
661
- const getCellValue = (r: number, c: number): any => {
662
- const cellAddress = XLSX.utils.encode_cell({ r, c });
663
- const cell = worksheet[cellAddress];
662
+ // Direct cell reader - bypasses sheet_to_json completely
663
+ const readCellValue = (r: number, c: number): any => {
664
+ const addr = XLSX.utils.encode_cell({ r, c });
665
+ const cell = worksheet[addr];
664
666
  if (!cell) return null;
665
- // Use formatted value (v = raw, w = formatted text)
666
- return cell.v !== undefined ? cell.v : null;
667
+ // Prefer formatted string (w) for display, fall back to raw value (v)
668
+ if (cell.w !== undefined) return cell.w;
669
+ if (cell.v !== undefined) return cell.v;
670
+ return null;
667
671
  };
668
672
 
669
- // Helper: read an entire row as an array
670
673
  const readRow = (r: number): any[] => {
671
674
  const vals: any[] = [];
672
675
  for (let c = startCol; c <= endCol; c++) {
673
- vals.push(getCellValue(r, c));
676
+ vals.push(readCellValue(r, c));
674
677
  }
675
678
  return vals;
676
679
  };
677
680
 
678
- // The actual row in the sheet for the header
681
+ // Map headerRow (0-based user index) to actual sheet row
679
682
  const headerSheetRow = startRow + headerRow;
680
683
 
684
+ console.log(`[TabularDriver] Sheet "${sheetName}": range=${ref}, startRow=${startRow}, endRow=${endRow}, startCol=${startCol}, endCol=${endCol}`);
685
+ console.log(`[TabularDriver] headerRow=${headerRow}, headerSheetRow=${headerSheetRow}`);
686
+
681
687
  if (headerSheetRow > endRow) {
682
- console.warn(`[TabularDriver] headerRow ${headerRow} exceeds sheet range (max row: ${endRow - startRow})`);
688
+ console.warn(`[TabularDriver] headerRow ${headerRow} (sheet row ${headerSheetRow}) exceeds endRow ${endRow}`);
683
689
  processedSheets++;
684
690
  continue;
685
691
  }
686
692
 
687
- // Read header row values directly from cells
693
+ // Read header values directly from cells
688
694
  const headerValues = readRow(headerSheetRow);
695
+ console.log(`[TabularDriver] Raw header values at sheet row ${headerSheetRow}:`, headerValues);
689
696
 
690
697
  // Build headers array
691
698
  const headers: string[] = headerValues.map((h: any, i: number) => {
@@ -695,10 +702,16 @@ export class TabularDriver {
695
702
  return String(h).trim();
696
703
  });
697
704
 
698
- // Ensure we have at least one valid header
705
+ // Count valid headers
699
706
  const validHeaders = headers.filter(h => !h.startsWith('__EMPTY'));
707
+ console.log(`[TabularDriver] Headers (${validHeaders.length} valid / ${headers.length} total):`, headers);
708
+
700
709
  if (validHeaders.length === 0) {
701
- console.warn(`[TabularDriver] No valid headers found at row ${headerRow} in sheet "${sheetName}"`);
710
+ console.warn(`[TabularDriver] No valid headers found at row ${headerRow} (sheet row ${headerSheetRow}) in sheet "${sheetName}"`);
711
+ // Log surrounding rows for debugging
712
+ for (let debugR = Math.max(startRow, headerSheetRow - 2); debugR <= Math.min(endRow, headerSheetRow + 2); debugR++) {
713
+ console.log(`[TabularDriver] row ${debugR}:`, readRow(debugR));
714
+ }
702
715
  processedSheets++;
703
716
  continue;
704
717
  }
@@ -716,11 +729,16 @@ export class TabularDriver {
716
729
 
717
730
  const row: Record<string, any> = {};
718
731
  for (let j = 0; j < headers.length; j++) {
719
- row[headers[j]] = rowData[j] !== undefined ? rowData[j] : null;
732
+ row[headers[j]] = rowData[j];
720
733
  }
721
734
  rows.push(row);
722
735
  }
723
736
 
737
+ console.log(`[TabularDriver] Built ${rows.length} data rows for sheet "${sheetName}"`);
738
+ if (rows.length > 0) {
739
+ console.log(`[TabularDriver] First row:`, rows[0]);
740
+ }
741
+
724
742
  if (rows.length > 0) {
725
743
  sheets[sheetName] = new DataFrame(rows);
726
744
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "juxscript",
3
- "version": "1.1.202",
3
+ "version": "1.1.204",
4
4
  "type": "module",
5
5
  "description": "A JavaScript UX authorship platform",
6
6
  "main": "index.js",