lula2 0.6.2-nightly.1 → 0.6.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.
- package/README.md +1 -1
- package/dist/_app/immutable/chunks/{DYH881pG.js → JMs-cfQQ.js} +1 -1
- package/dist/_app/immutable/chunks/W6j_Lifs.js +3 -0
- package/dist/_app/immutable/chunks/{DsS_Ymqb.js → zlVqcHYm.js} +1 -1
- package/dist/_app/immutable/entry/{app.C2_q7ef5.js → app.DrhleL0r.js} +2 -2
- package/dist/_app/immutable/entry/start.BMEfvcBH.js +1 -0
- package/dist/_app/immutable/nodes/{0.7TiLCc65.js → 0.DvnxCGrF.js} +1 -1
- package/dist/_app/immutable/nodes/{1.qK8_Tc6M.js → 1.CTl6z-0x.js} +1 -1
- package/dist/_app/immutable/nodes/{2.C0l3mgWP.js → 2.Cmc1ecj4.js} +1 -1
- package/dist/_app/immutable/nodes/{3.bzLm8zUT.js → 3.DIDukog0.js} +1 -1
- package/dist/_app/immutable/nodes/4.D74oitYV.js +11 -0
- package/dist/_app/version.json +1 -1
- package/dist/cli/commands/crawl.js +90 -151
- package/dist/cli/commands/ui.js +45 -6
- package/dist/cli/server/index.js +45 -6
- package/dist/cli/server/server.js +45 -6
- package/dist/cli/server/spreadsheetRoutes.js +44 -5
- package/dist/cli/server/websocketServer.js +45 -6
- package/dist/index.html +6 -6
- package/dist/index.js +136 -151
- package/package.json +22 -21
- package/src/lib/components/setup/SpreadsheetImport.svelte +40 -15
- package/dist/_app/immutable/chunks/D9NS9sy6.js +0 -3
- package/dist/_app/immutable/entry/start.CPOuKwpy.js +0 -1
- package/dist/_app/immutable/nodes/4.5BLVnpgw.js +0 -11
package/dist/cli/server/index.js
CHANGED
|
@@ -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
|
|
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,
|
|
3788
|
+
const headerCandidates = rows.slice(0, MAX_HEADER_CANDIDATES).map((row, index) => ({
|
|
3783
3789
|
row: index + 1,
|
|
3784
|
-
preview: row.slice(0,
|
|
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
|
|
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,
|
|
3788
|
+
const headerCandidates = rows.slice(0, MAX_HEADER_CANDIDATES).map((row, index) => ({
|
|
3783
3789
|
row: index + 1,
|
|
3784
|
-
preview: row.slice(0,
|
|
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
|
|
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,
|
|
978
|
+
const headerCandidates = rows.slice(0, MAX_HEADER_CANDIDATES).map((row, index) => ({
|
|
973
979
|
row: index + 1,
|
|
974
|
-
preview: row.slice(0,
|
|
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
|
|
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,
|
|
2235
|
+
const headerCandidates = rows.slice(0, MAX_HEADER_CANDIDATES).map((row, index) => ({
|
|
2230
2236
|
row: index + 1,
|
|
2231
|
-
preview: row.slice(0,
|
|
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.
|
|
10
|
-
<link rel="modulepreload" href="/_app/immutable/chunks/
|
|
9
|
+
<link rel="modulepreload" href="/_app/immutable/entry/start.BMEfvcBH.js">
|
|
10
|
+
<link rel="modulepreload" href="/_app/immutable/chunks/W6j_Lifs.js">
|
|
11
11
|
<link rel="modulepreload" href="/_app/immutable/chunks/DTWPdvjs.js">
|
|
12
|
-
<link rel="modulepreload" href="/_app/immutable/entry/app.
|
|
12
|
+
<link rel="modulepreload" href="/_app/immutable/entry/app.DrhleL0r.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
|
-
|
|
22
|
+
__sveltekit_fem072 = {
|
|
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.
|
|
30
|
-
import("/_app/immutable/entry/app.
|
|
29
|
+
import("/_app/immutable/entry/start.BMEfvcBH.js"),
|
|
30
|
+
import("/_app/immutable/entry/app.DrhleL0r.js")
|
|
31
31
|
]).then(([kit, app]) => {
|
|
32
32
|
kit.start(app, element);
|
|
33
33
|
});
|