lula2 0.6.2-nightly.1 → 0.6.3-nightly.0

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.
@@ -2948,7 +2948,7 @@ function processImportParameters(reqBody) {
2948
2948
  frontendFieldSchema
2949
2949
  };
2950
2950
  }
2951
- async function parseUploadedFile(file) {
2951
+ async function parseUploadedFile(file, sheetName) {
2952
2952
  const fileName = file.originalname || "";
2953
2953
  const isCSV = fileName.toLowerCase().endsWith(".csv");
2954
2954
  let rawData = [];
@@ -2957,10 +2957,13 @@ async function parseUploadedFile(file) {
2957
2957
  rawData = parseCSV(csvContent);
2958
2958
  } else {
2959
2959
  const workbook = XLSX.read(file.buffer, { type: "buffer" });
2960
- const worksheetName = workbook.SheetNames[0];
2960
+ const worksheetName = sheetName || workbook.SheetNames[0];
2961
2961
  if (!worksheetName) {
2962
2962
  throw new Error("No worksheet found in file");
2963
2963
  }
2964
+ if (sheetName && !workbook.SheetNames.includes(sheetName)) {
2965
+ throw new Error(`Sheet "${sheetName}" not found in workbook`);
2966
+ }
2964
2967
  const worksheet = workbook.Sheets[worksheetName];
2965
2968
  rawData = XLSX.utils.sheet_to_json(worksheet, { header: 1, defval: null });
2966
2969
  }
@@ -3567,12 +3570,14 @@ function exportAsJSON(controls, metadata, res) {
3567
3570
  res.setHeader("Content-Disposition", `attachment; filename="${fileName}"`);
3568
3571
  res.json(exportData);
3569
3572
  }
3570
- var router, upload, spreadsheetRoutes_default;
3573
+ var MAX_HEADER_CANDIDATES, PREVIEW_COLUMNS, router, upload, spreadsheetRoutes_default;
3571
3574
  var init_spreadsheetRoutes = __esm({
3572
3575
  "cli/server/spreadsheetRoutes.ts"() {
3573
3576
  "use strict";
3574
3577
  init_debug();
3575
3578
  init_serverState();
3579
+ MAX_HEADER_CANDIDATES = 5;
3580
+ PREVIEW_COLUMNS = 4;
3576
3581
  router = express.Router();
3577
3582
  upload = multer({
3578
3583
  storage: multer.memoryStorage(),
@@ -3585,7 +3590,8 @@ var init_spreadsheetRoutes = __esm({
3585
3590
  return res.status(400).json({ error: "No file uploaded" });
3586
3591
  }
3587
3592
  const params = processImportParameters(req.body);
3588
- const rawData = await parseUploadedFile(req.file);
3593
+ const sheetName = req.body.sheetName;
3594
+ const rawData = await parseUploadedFile(req.file, sheetName);
3589
3595
  const startRowIndex = parseInt(params.startRow) - 1;
3590
3596
  if (rawData.length <= startRowIndex) {
3591
3597
  return res.status(400).json({ error: "Start row exceeds sheet data" });
@@ -3797,9 +3803,9 @@ var init_spreadsheetRoutes = __esm({
3797
3803
  const worksheet = workbook.Sheets[worksheetName];
3798
3804
  rows = XLSX.utils.sheet_to_json(worksheet, { header: 1, defval: null });
3799
3805
  }
3800
- const headerCandidates = rows.slice(0, 5).map((row, index) => ({
3806
+ const headerCandidates = rows.slice(0, MAX_HEADER_CANDIDATES).map((row, index) => ({
3801
3807
  row: index + 1,
3802
- preview: row.slice(0, 4).filter((v) => v !== null).filter((v) => v !== void 0).join(", ") + (row.length > 4 ? ", ..." : "")
3808
+ preview: row.slice(0, PREVIEW_COLUMNS).filter((v) => v !== null).filter((v) => v !== void 0).join(", ") + (row.length > 4 ? ", ..." : "")
3803
3809
  }));
3804
3810
  res.json({
3805
3811
  sheets,
@@ -3856,6 +3862,39 @@ var init_spreadsheetRoutes = __esm({
3856
3862
  res.status(500).json({ error: "Failed to parse Excel sheet" });
3857
3863
  }
3858
3864
  });
3865
+ router.post("/parse-excel-sheet-previews", upload.single("file"), async (req, res) => {
3866
+ try {
3867
+ const { sheetName } = req.body;
3868
+ if (!req.file) {
3869
+ return res.status(400).json({ error: "No file uploaded" });
3870
+ }
3871
+ const fileName = req.file.originalname || "";
3872
+ const isCSV = fileName.toLowerCase().endsWith(".csv");
3873
+ let rows = [];
3874
+ if (isCSV) {
3875
+ const csvContent = req.file.buffer.toString("utf-8");
3876
+ rows = parseCSV(csvContent);
3877
+ } else {
3878
+ const workbook = XLSX.read(req.file.buffer, { type: "buffer" });
3879
+ if (!workbook.SheetNames.includes(sheetName)) {
3880
+ return res.status(400).json({ error: `Sheet "${sheetName}" not found` });
3881
+ }
3882
+ const worksheet = workbook.Sheets[sheetName];
3883
+ rows = XLSX.utils.sheet_to_json(worksheet, { header: 1, defval: null });
3884
+ }
3885
+ const headerCandidates = rows.slice(0, MAX_HEADER_CANDIDATES).map((row, index) => ({
3886
+ row: index + 1,
3887
+ preview: row.slice(0, PREVIEW_COLUMNS).filter((v) => v !== null).filter((v) => v !== void 0).join(", ") + (row.length > 4 ? ", ..." : "")
3888
+ }));
3889
+ res.json({
3890
+ rowPreviews: headerCandidates,
3891
+ totalRows: rows.length
3892
+ });
3893
+ } catch (error) {
3894
+ console.error("Error getting sheet previews:", error);
3895
+ res.status(500).json({ error: "Failed to get sheet previews" });
3896
+ }
3897
+ });
3859
3898
  spreadsheetRoutes_default = router;
3860
3899
  }
3861
3900
  });
@@ -2930,7 +2930,7 @@ function processImportParameters(reqBody) {
2930
2930
  frontendFieldSchema
2931
2931
  };
2932
2932
  }
2933
- async function parseUploadedFile(file) {
2933
+ async function parseUploadedFile(file, sheetName) {
2934
2934
  const fileName = file.originalname || "";
2935
2935
  const isCSV = fileName.toLowerCase().endsWith(".csv");
2936
2936
  let rawData = [];
@@ -2939,10 +2939,13 @@ async function parseUploadedFile(file) {
2939
2939
  rawData = parseCSV(csvContent);
2940
2940
  } else {
2941
2941
  const workbook = XLSX.read(file.buffer, { type: "buffer" });
2942
- const worksheetName = workbook.SheetNames[0];
2942
+ const worksheetName = sheetName || workbook.SheetNames[0];
2943
2943
  if (!worksheetName) {
2944
2944
  throw new Error("No worksheet found in file");
2945
2945
  }
2946
+ if (sheetName && !workbook.SheetNames.includes(sheetName)) {
2947
+ throw new Error(`Sheet "${sheetName}" not found in workbook`);
2948
+ }
2946
2949
  const worksheet = workbook.Sheets[worksheetName];
2947
2950
  rawData = XLSX.utils.sheet_to_json(worksheet, { header: 1, defval: null });
2948
2951
  }
@@ -3549,12 +3552,14 @@ function exportAsJSON(controls, metadata, res) {
3549
3552
  res.setHeader("Content-Disposition", `attachment; filename="${fileName}"`);
3550
3553
  res.json(exportData);
3551
3554
  }
3552
- var router, upload, spreadsheetRoutes_default;
3555
+ var MAX_HEADER_CANDIDATES, PREVIEW_COLUMNS, router, upload, spreadsheetRoutes_default;
3553
3556
  var init_spreadsheetRoutes = __esm({
3554
3557
  "cli/server/spreadsheetRoutes.ts"() {
3555
3558
  "use strict";
3556
3559
  init_debug();
3557
3560
  init_serverState();
3561
+ MAX_HEADER_CANDIDATES = 5;
3562
+ PREVIEW_COLUMNS = 4;
3558
3563
  router = express.Router();
3559
3564
  upload = multer({
3560
3565
  storage: multer.memoryStorage(),
@@ -3567,7 +3572,8 @@ var init_spreadsheetRoutes = __esm({
3567
3572
  return res.status(400).json({ error: "No file uploaded" });
3568
3573
  }
3569
3574
  const params = processImportParameters(req.body);
3570
- const rawData = await parseUploadedFile(req.file);
3575
+ const sheetName = req.body.sheetName;
3576
+ const rawData = await parseUploadedFile(req.file, sheetName);
3571
3577
  const startRowIndex = parseInt(params.startRow) - 1;
3572
3578
  if (rawData.length <= startRowIndex) {
3573
3579
  return res.status(400).json({ error: "Start row exceeds sheet data" });
@@ -3779,9 +3785,9 @@ var init_spreadsheetRoutes = __esm({
3779
3785
  const worksheet = workbook.Sheets[worksheetName];
3780
3786
  rows = XLSX.utils.sheet_to_json(worksheet, { header: 1, defval: null });
3781
3787
  }
3782
- const headerCandidates = rows.slice(0, 5).map((row, index) => ({
3788
+ const headerCandidates = rows.slice(0, MAX_HEADER_CANDIDATES).map((row, index) => ({
3783
3789
  row: index + 1,
3784
- preview: row.slice(0, 4).filter((v) => v !== null).filter((v) => v !== void 0).join(", ") + (row.length > 4 ? ", ..." : "")
3790
+ preview: row.slice(0, PREVIEW_COLUMNS).filter((v) => v !== null).filter((v) => v !== void 0).join(", ") + (row.length > 4 ? ", ..." : "")
3785
3791
  }));
3786
3792
  res.json({
3787
3793
  sheets,
@@ -3838,6 +3844,39 @@ var init_spreadsheetRoutes = __esm({
3838
3844
  res.status(500).json({ error: "Failed to parse Excel sheet" });
3839
3845
  }
3840
3846
  });
3847
+ router.post("/parse-excel-sheet-previews", upload.single("file"), async (req, res) => {
3848
+ try {
3849
+ const { sheetName } = req.body;
3850
+ if (!req.file) {
3851
+ return res.status(400).json({ error: "No file uploaded" });
3852
+ }
3853
+ const fileName = req.file.originalname || "";
3854
+ const isCSV = fileName.toLowerCase().endsWith(".csv");
3855
+ let rows = [];
3856
+ if (isCSV) {
3857
+ const csvContent = req.file.buffer.toString("utf-8");
3858
+ rows = parseCSV(csvContent);
3859
+ } else {
3860
+ const workbook = XLSX.read(req.file.buffer, { type: "buffer" });
3861
+ if (!workbook.SheetNames.includes(sheetName)) {
3862
+ return res.status(400).json({ error: `Sheet "${sheetName}" not found` });
3863
+ }
3864
+ const worksheet = workbook.Sheets[sheetName];
3865
+ rows = XLSX.utils.sheet_to_json(worksheet, { header: 1, defval: null });
3866
+ }
3867
+ const headerCandidates = rows.slice(0, MAX_HEADER_CANDIDATES).map((row, index) => ({
3868
+ row: index + 1,
3869
+ preview: row.slice(0, PREVIEW_COLUMNS).filter((v) => v !== null).filter((v) => v !== void 0).join(", ") + (row.length > 4 ? ", ..." : "")
3870
+ }));
3871
+ res.json({
3872
+ rowPreviews: headerCandidates,
3873
+ totalRows: rows.length
3874
+ });
3875
+ } catch (error) {
3876
+ console.error("Error getting sheet previews:", error);
3877
+ res.status(500).json({ error: "Failed to get sheet previews" });
3878
+ }
3879
+ });
3841
3880
  spreadsheetRoutes_default = router;
3842
3881
  }
3843
3882
  });
@@ -2930,7 +2930,7 @@ function processImportParameters(reqBody) {
2930
2930
  frontendFieldSchema
2931
2931
  };
2932
2932
  }
2933
- async function parseUploadedFile(file) {
2933
+ async function parseUploadedFile(file, sheetName) {
2934
2934
  const fileName = file.originalname || "";
2935
2935
  const isCSV = fileName.toLowerCase().endsWith(".csv");
2936
2936
  let rawData = [];
@@ -2939,10 +2939,13 @@ async function parseUploadedFile(file) {
2939
2939
  rawData = parseCSV(csvContent);
2940
2940
  } else {
2941
2941
  const workbook = XLSX.read(file.buffer, { type: "buffer" });
2942
- const worksheetName = workbook.SheetNames[0];
2942
+ const worksheetName = sheetName || workbook.SheetNames[0];
2943
2943
  if (!worksheetName) {
2944
2944
  throw new Error("No worksheet found in file");
2945
2945
  }
2946
+ if (sheetName && !workbook.SheetNames.includes(sheetName)) {
2947
+ throw new Error(`Sheet "${sheetName}" not found in workbook`);
2948
+ }
2946
2949
  const worksheet = workbook.Sheets[worksheetName];
2947
2950
  rawData = XLSX.utils.sheet_to_json(worksheet, { header: 1, defval: null });
2948
2951
  }
@@ -3549,12 +3552,14 @@ function exportAsJSON(controls, metadata, res) {
3549
3552
  res.setHeader("Content-Disposition", `attachment; filename="${fileName}"`);
3550
3553
  res.json(exportData);
3551
3554
  }
3552
- var router, upload, spreadsheetRoutes_default;
3555
+ var MAX_HEADER_CANDIDATES, PREVIEW_COLUMNS, router, upload, spreadsheetRoutes_default;
3553
3556
  var init_spreadsheetRoutes = __esm({
3554
3557
  "cli/server/spreadsheetRoutes.ts"() {
3555
3558
  "use strict";
3556
3559
  init_debug();
3557
3560
  init_serverState();
3561
+ MAX_HEADER_CANDIDATES = 5;
3562
+ PREVIEW_COLUMNS = 4;
3558
3563
  router = express.Router();
3559
3564
  upload = multer({
3560
3565
  storage: multer.memoryStorage(),
@@ -3567,7 +3572,8 @@ var init_spreadsheetRoutes = __esm({
3567
3572
  return res.status(400).json({ error: "No file uploaded" });
3568
3573
  }
3569
3574
  const params = processImportParameters(req.body);
3570
- const rawData = await parseUploadedFile(req.file);
3575
+ const sheetName = req.body.sheetName;
3576
+ const rawData = await parseUploadedFile(req.file, sheetName);
3571
3577
  const startRowIndex = parseInt(params.startRow) - 1;
3572
3578
  if (rawData.length <= startRowIndex) {
3573
3579
  return res.status(400).json({ error: "Start row exceeds sheet data" });
@@ -3779,9 +3785,9 @@ var init_spreadsheetRoutes = __esm({
3779
3785
  const worksheet = workbook.Sheets[worksheetName];
3780
3786
  rows = XLSX.utils.sheet_to_json(worksheet, { header: 1, defval: null });
3781
3787
  }
3782
- const headerCandidates = rows.slice(0, 5).map((row, index) => ({
3788
+ const headerCandidates = rows.slice(0, MAX_HEADER_CANDIDATES).map((row, index) => ({
3783
3789
  row: index + 1,
3784
- preview: row.slice(0, 4).filter((v) => v !== null).filter((v) => v !== void 0).join(", ") + (row.length > 4 ? ", ..." : "")
3790
+ preview: row.slice(0, PREVIEW_COLUMNS).filter((v) => v !== null).filter((v) => v !== void 0).join(", ") + (row.length > 4 ? ", ..." : "")
3785
3791
  }));
3786
3792
  res.json({
3787
3793
  sheets,
@@ -3838,6 +3844,39 @@ var init_spreadsheetRoutes = __esm({
3838
3844
  res.status(500).json({ error: "Failed to parse Excel sheet" });
3839
3845
  }
3840
3846
  });
3847
+ router.post("/parse-excel-sheet-previews", upload.single("file"), async (req, res) => {
3848
+ try {
3849
+ const { sheetName } = req.body;
3850
+ if (!req.file) {
3851
+ return res.status(400).json({ error: "No file uploaded" });
3852
+ }
3853
+ const fileName = req.file.originalname || "";
3854
+ const isCSV = fileName.toLowerCase().endsWith(".csv");
3855
+ let rows = [];
3856
+ if (isCSV) {
3857
+ const csvContent = req.file.buffer.toString("utf-8");
3858
+ rows = parseCSV(csvContent);
3859
+ } else {
3860
+ const workbook = XLSX.read(req.file.buffer, { type: "buffer" });
3861
+ if (!workbook.SheetNames.includes(sheetName)) {
3862
+ return res.status(400).json({ error: `Sheet "${sheetName}" not found` });
3863
+ }
3864
+ const worksheet = workbook.Sheets[sheetName];
3865
+ rows = XLSX.utils.sheet_to_json(worksheet, { header: 1, defval: null });
3866
+ }
3867
+ const headerCandidates = rows.slice(0, MAX_HEADER_CANDIDATES).map((row, index) => ({
3868
+ row: index + 1,
3869
+ preview: row.slice(0, PREVIEW_COLUMNS).filter((v) => v !== null).filter((v) => v !== void 0).join(", ") + (row.length > 4 ? ", ..." : "")
3870
+ }));
3871
+ res.json({
3872
+ rowPreviews: headerCandidates,
3873
+ totalRows: rows.length
3874
+ });
3875
+ } catch (error) {
3876
+ console.error("Error getting sheet previews:", error);
3877
+ res.status(500).json({ error: "Failed to get sheet previews" });
3878
+ }
3879
+ });
3841
3880
  spreadsheetRoutes_default = router;
3842
3881
  }
3843
3882
  });
@@ -46,6 +46,8 @@ function getCurrentControlSetPath() {
46
46
  }
47
47
 
48
48
  // cli/server/spreadsheetRoutes.ts
49
+ var MAX_HEADER_CANDIDATES = 5;
50
+ var PREVIEW_COLUMNS = 4;
49
51
  var router = express.Router();
50
52
  var upload = multer({
51
53
  storage: multer.memoryStorage(),
@@ -132,7 +134,7 @@ function processImportParameters(reqBody) {
132
134
  frontendFieldSchema
133
135
  };
134
136
  }
135
- async function parseUploadedFile(file) {
137
+ async function parseUploadedFile(file, sheetName) {
136
138
  const fileName = file.originalname || "";
137
139
  const isCSV = fileName.toLowerCase().endsWith(".csv");
138
140
  let rawData = [];
@@ -141,10 +143,13 @@ async function parseUploadedFile(file) {
141
143
  rawData = parseCSV(csvContent);
142
144
  } else {
143
145
  const workbook = XLSX.read(file.buffer, { type: "buffer" });
144
- const worksheetName = workbook.SheetNames[0];
146
+ const worksheetName = sheetName || workbook.SheetNames[0];
145
147
  if (!worksheetName) {
146
148
  throw new Error("No worksheet found in file");
147
149
  }
150
+ if (sheetName && !workbook.SheetNames.includes(sheetName)) {
151
+ throw new Error(`Sheet "${sheetName}" not found in workbook`);
152
+ }
148
153
  const worksheet = workbook.Sheets[worksheetName];
149
154
  rawData = XLSX.utils.sheet_to_json(worksheet, { header: 1, defval: null });
150
155
  }
@@ -156,7 +161,8 @@ router.post("/import-spreadsheet", upload.single("file"), async (req, res) => {
156
161
  return res.status(400).json({ error: "No file uploaded" });
157
162
  }
158
163
  const params = processImportParameters(req.body);
159
- const rawData = await parseUploadedFile(req.file);
164
+ const sheetName = req.body.sheetName;
165
+ const rawData = await parseUploadedFile(req.file, sheetName);
160
166
  const startRowIndex = parseInt(params.startRow) - 1;
161
167
  if (rawData.length <= startRowIndex) {
162
168
  return res.status(400).json({ error: "Start row exceeds sheet data" });
@@ -969,9 +975,9 @@ router.post("/parse-excel", upload.single("file"), async (req, res) => {
969
975
  const worksheet = workbook.Sheets[worksheetName];
970
976
  rows = XLSX.utils.sheet_to_json(worksheet, { header: 1, defval: null });
971
977
  }
972
- const headerCandidates = rows.slice(0, 5).map((row, index) => ({
978
+ const headerCandidates = rows.slice(0, MAX_HEADER_CANDIDATES).map((row, index) => ({
973
979
  row: index + 1,
974
- preview: row.slice(0, 4).filter((v) => v !== null).filter((v) => v !== void 0).join(", ") + (row.length > 4 ? ", ..." : "")
980
+ preview: row.slice(0, PREVIEW_COLUMNS).filter((v) => v !== null).filter((v) => v !== void 0).join(", ") + (row.length > 4 ? ", ..." : "")
975
981
  }));
976
982
  res.json({
977
983
  sheets,
@@ -1028,6 +1034,39 @@ router.post("/parse-excel-sheet", upload.single("file"), async (req, res) => {
1028
1034
  res.status(500).json({ error: "Failed to parse Excel sheet" });
1029
1035
  }
1030
1036
  });
1037
+ router.post("/parse-excel-sheet-previews", upload.single("file"), async (req, res) => {
1038
+ try {
1039
+ const { sheetName } = req.body;
1040
+ if (!req.file) {
1041
+ return res.status(400).json({ error: "No file uploaded" });
1042
+ }
1043
+ const fileName = req.file.originalname || "";
1044
+ const isCSV = fileName.toLowerCase().endsWith(".csv");
1045
+ let rows = [];
1046
+ if (isCSV) {
1047
+ const csvContent = req.file.buffer.toString("utf-8");
1048
+ rows = parseCSV(csvContent);
1049
+ } else {
1050
+ const workbook = XLSX.read(req.file.buffer, { type: "buffer" });
1051
+ if (!workbook.SheetNames.includes(sheetName)) {
1052
+ return res.status(400).json({ error: `Sheet "${sheetName}" not found` });
1053
+ }
1054
+ const worksheet = workbook.Sheets[sheetName];
1055
+ rows = XLSX.utils.sheet_to_json(worksheet, { header: 1, defval: null });
1056
+ }
1057
+ const headerCandidates = rows.slice(0, MAX_HEADER_CANDIDATES).map((row, index) => ({
1058
+ row: index + 1,
1059
+ preview: row.slice(0, PREVIEW_COLUMNS).filter((v) => v !== null).filter((v) => v !== void 0).join(", ") + (row.length > 4 ? ", ..." : "")
1060
+ }));
1061
+ res.json({
1062
+ rowPreviews: headerCandidates,
1063
+ totalRows: rows.length
1064
+ });
1065
+ } catch (error) {
1066
+ console.error("Error getting sheet previews:", error);
1067
+ res.status(500).json({ error: "Failed to get sheet previews" });
1068
+ }
1069
+ });
1031
1070
  var spreadsheetRoutes_default = router;
1032
1071
  export {
1033
1072
  applyNamingConvention,
@@ -1377,7 +1377,7 @@ function processImportParameters(reqBody) {
1377
1377
  frontendFieldSchema
1378
1378
  };
1379
1379
  }
1380
- async function parseUploadedFile(file) {
1380
+ async function parseUploadedFile(file, sheetName) {
1381
1381
  const fileName = file.originalname || "";
1382
1382
  const isCSV = fileName.toLowerCase().endsWith(".csv");
1383
1383
  let rawData = [];
@@ -1386,10 +1386,13 @@ async function parseUploadedFile(file) {
1386
1386
  rawData = parseCSV(csvContent);
1387
1387
  } else {
1388
1388
  const workbook = XLSX.read(file.buffer, { type: "buffer" });
1389
- const worksheetName = workbook.SheetNames[0];
1389
+ const worksheetName = sheetName || workbook.SheetNames[0];
1390
1390
  if (!worksheetName) {
1391
1391
  throw new Error("No worksheet found in file");
1392
1392
  }
1393
+ if (sheetName && !workbook.SheetNames.includes(sheetName)) {
1394
+ throw new Error(`Sheet "${sheetName}" not found in workbook`);
1395
+ }
1393
1396
  const worksheet = workbook.Sheets[worksheetName];
1394
1397
  rawData = XLSX.utils.sheet_to_json(worksheet, { header: 1, defval: null });
1395
1398
  }
@@ -1996,12 +1999,14 @@ function exportAsJSON(controls, metadata, res) {
1996
1999
  res.setHeader("Content-Disposition", `attachment; filename="${fileName}"`);
1997
2000
  res.json(exportData);
1998
2001
  }
1999
- var router, upload, spreadsheetRoutes_default;
2002
+ var MAX_HEADER_CANDIDATES, PREVIEW_COLUMNS, router, upload, spreadsheetRoutes_default;
2000
2003
  var init_spreadsheetRoutes = __esm({
2001
2004
  "cli/server/spreadsheetRoutes.ts"() {
2002
2005
  "use strict";
2003
2006
  init_debug();
2004
2007
  init_serverState();
2008
+ MAX_HEADER_CANDIDATES = 5;
2009
+ PREVIEW_COLUMNS = 4;
2005
2010
  router = express.Router();
2006
2011
  upload = multer({
2007
2012
  storage: multer.memoryStorage(),
@@ -2014,7 +2019,8 @@ var init_spreadsheetRoutes = __esm({
2014
2019
  return res.status(400).json({ error: "No file uploaded" });
2015
2020
  }
2016
2021
  const params = processImportParameters(req.body);
2017
- const rawData = await parseUploadedFile(req.file);
2022
+ const sheetName = req.body.sheetName;
2023
+ const rawData = await parseUploadedFile(req.file, sheetName);
2018
2024
  const startRowIndex = parseInt(params.startRow) - 1;
2019
2025
  if (rawData.length <= startRowIndex) {
2020
2026
  return res.status(400).json({ error: "Start row exceeds sheet data" });
@@ -2226,9 +2232,9 @@ var init_spreadsheetRoutes = __esm({
2226
2232
  const worksheet = workbook.Sheets[worksheetName];
2227
2233
  rows = XLSX.utils.sheet_to_json(worksheet, { header: 1, defval: null });
2228
2234
  }
2229
- const headerCandidates = rows.slice(0, 5).map((row, index) => ({
2235
+ const headerCandidates = rows.slice(0, MAX_HEADER_CANDIDATES).map((row, index) => ({
2230
2236
  row: index + 1,
2231
- preview: row.slice(0, 4).filter((v) => v !== null).filter((v) => v !== void 0).join(", ") + (row.length > 4 ? ", ..." : "")
2237
+ preview: row.slice(0, PREVIEW_COLUMNS).filter((v) => v !== null).filter((v) => v !== void 0).join(", ") + (row.length > 4 ? ", ..." : "")
2232
2238
  }));
2233
2239
  res.json({
2234
2240
  sheets,
@@ -2285,6 +2291,39 @@ var init_spreadsheetRoutes = __esm({
2285
2291
  res.status(500).json({ error: "Failed to parse Excel sheet" });
2286
2292
  }
2287
2293
  });
2294
+ router.post("/parse-excel-sheet-previews", upload.single("file"), async (req, res) => {
2295
+ try {
2296
+ const { sheetName } = req.body;
2297
+ if (!req.file) {
2298
+ return res.status(400).json({ error: "No file uploaded" });
2299
+ }
2300
+ const fileName = req.file.originalname || "";
2301
+ const isCSV = fileName.toLowerCase().endsWith(".csv");
2302
+ let rows = [];
2303
+ if (isCSV) {
2304
+ const csvContent = req.file.buffer.toString("utf-8");
2305
+ rows = parseCSV(csvContent);
2306
+ } else {
2307
+ const workbook = XLSX.read(req.file.buffer, { type: "buffer" });
2308
+ if (!workbook.SheetNames.includes(sheetName)) {
2309
+ return res.status(400).json({ error: `Sheet "${sheetName}" not found` });
2310
+ }
2311
+ const worksheet = workbook.Sheets[sheetName];
2312
+ rows = XLSX.utils.sheet_to_json(worksheet, { header: 1, defval: null });
2313
+ }
2314
+ const headerCandidates = rows.slice(0, MAX_HEADER_CANDIDATES).map((row, index) => ({
2315
+ row: index + 1,
2316
+ preview: row.slice(0, PREVIEW_COLUMNS).filter((v) => v !== null).filter((v) => v !== void 0).join(", ") + (row.length > 4 ? ", ..." : "")
2317
+ }));
2318
+ res.json({
2319
+ rowPreviews: headerCandidates,
2320
+ totalRows: rows.length
2321
+ });
2322
+ } catch (error) {
2323
+ console.error("Error getting sheet previews:", error);
2324
+ res.status(500).json({ error: "Failed to get sheet previews" });
2325
+ }
2326
+ });
2288
2327
  spreadsheetRoutes_default = router;
2289
2328
  }
2290
2329
  });
package/dist/index.html CHANGED
@@ -6,10 +6,10 @@
6
6
  <link rel="icon" href="/lula.png" />
7
7
  <meta name="viewport" content="width=device-width, initial-scale=1" />
8
8
 
9
- <link rel="modulepreload" href="/_app/immutable/entry/start.CPOuKwpy.js">
10
- <link rel="modulepreload" href="/_app/immutable/chunks/D9NS9sy6.js">
9
+ <link rel="modulepreload" href="/_app/immutable/entry/start.D2hMBZNv.js">
10
+ <link rel="modulepreload" href="/_app/immutable/chunks/rc9CiIba.js">
11
11
  <link rel="modulepreload" href="/_app/immutable/chunks/DTWPdvjs.js">
12
- <link rel="modulepreload" href="/_app/immutable/entry/app.C2_q7ef5.js">
12
+ <link rel="modulepreload" href="/_app/immutable/entry/app.C9fkwjMz.js">
13
13
  <link rel="modulepreload" href="/_app/immutable/chunks/DsnmJJEf.js">
14
14
  <link rel="modulepreload" href="/_app/immutable/chunks/BXUi170M.js">
15
15
  <link rel="modulepreload" href="/_app/immutable/chunks/WlyXjfrM.js">
@@ -19,15 +19,15 @@
19
19
  <div style="display: contents">
20
20
  <script>
21
21
  {
22
- __sveltekit_1pguk9r = {
22
+ __sveltekit_1jux1ml = {
23
23
  base: ""
24
24
  };
25
25
 
26
26
  const element = document.currentScript.parentElement;
27
27
 
28
28
  Promise.all([
29
- import("/_app/immutable/entry/start.CPOuKwpy.js"),
30
- import("/_app/immutable/entry/app.C2_q7ef5.js")
29
+ import("/_app/immutable/entry/start.D2hMBZNv.js"),
30
+ import("/_app/immutable/entry/app.C9fkwjMz.js")
31
31
  ]).then(([kit, app]) => {
32
32
  kit.start(app, element);
33
33
  });