geotechcli 0.4.0 → 0.4.2

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.
@@ -0,0 +1,600 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { basename, extname } from 'node:path';
3
+ import ExcelJS from 'exceljs';
4
+ function isRecord(value) {
5
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
6
+ }
7
+ function slugify(value) {
8
+ return value
9
+ .toLowerCase()
10
+ .replace(/[^a-z0-9]+/g, '-')
11
+ .replace(/^-+|-+$/g, '')
12
+ .slice(0, 80);
13
+ }
14
+ function humanizeKey(value) {
15
+ return value
16
+ .replace(/([a-z])([A-Z])/g, '$1 $2')
17
+ .replace(/[_-]+/g, ' ')
18
+ .replace(/\s+/g, ' ')
19
+ .trim()
20
+ .replace(/^./, (match) => match.toUpperCase());
21
+ }
22
+ function toFiniteNumber(value) {
23
+ if (typeof value === 'number' && Number.isFinite(value)) {
24
+ return value;
25
+ }
26
+ if (typeof value === 'string') {
27
+ const normalized = value.trim().replace(/,/g, '');
28
+ if (normalized.length === 0) {
29
+ return null;
30
+ }
31
+ const parsed = Number(normalized);
32
+ return Number.isFinite(parsed) ? parsed : null;
33
+ }
34
+ return null;
35
+ }
36
+ function parseCsvLine(line) {
37
+ const cells = [];
38
+ let current = '';
39
+ let inQuotes = false;
40
+ for (let index = 0; index < line.length; index += 1) {
41
+ const char = line[index];
42
+ if (char === '"') {
43
+ if (inQuotes && line[index + 1] === '"') {
44
+ current += '"';
45
+ index += 1;
46
+ }
47
+ else {
48
+ inQuotes = !inQuotes;
49
+ }
50
+ continue;
51
+ }
52
+ if (char === ',' && !inQuotes) {
53
+ cells.push(current);
54
+ current = '';
55
+ continue;
56
+ }
57
+ current += char;
58
+ }
59
+ cells.push(current);
60
+ return cells.map((cell) => cell.trim());
61
+ }
62
+ function rowsFromCsv(content) {
63
+ const lines = content
64
+ .split(/\r?\n/)
65
+ .map((line) => line.trim())
66
+ .filter((line) => line.length > 0);
67
+ if (lines.length < 2) {
68
+ return [];
69
+ }
70
+ const headers = parseCsvLine(lines[0]);
71
+ return lines.slice(1).map((line) => {
72
+ const cells = parseCsvLine(line);
73
+ const row = {};
74
+ for (let index = 0; index < headers.length; index += 1) {
75
+ row[headers[index]] = cells[index] ?? '';
76
+ }
77
+ return row;
78
+ });
79
+ }
80
+ function rowsFromWorksheet(worksheet) {
81
+ const rows = [];
82
+ let headers = [];
83
+ worksheet.eachRow((row, rowNumber) => {
84
+ const values = Array.isArray(row.values) ? row.values.slice(1) : [];
85
+ if (rowNumber === 1) {
86
+ headers = values.map((value, index) => String(value ?? `Column ${index + 1}`).trim());
87
+ return;
88
+ }
89
+ const record = {};
90
+ headers.forEach((header, index) => {
91
+ const value = values[index];
92
+ if (value instanceof Date) {
93
+ record[header] = value.toISOString();
94
+ }
95
+ else if (typeof value === 'object' && value && 'text' in value) {
96
+ record[header] = String(value.text ?? '');
97
+ }
98
+ else {
99
+ record[header] = (value ?? '');
100
+ }
101
+ });
102
+ if (Object.values(record).some((value) => String(value ?? '').trim().length > 0)) {
103
+ rows.push(record);
104
+ }
105
+ });
106
+ return rows;
107
+ }
108
+ function inferNumericColumns(rows) {
109
+ if (rows.length === 0) {
110
+ return [];
111
+ }
112
+ const headers = Object.keys(rows[0]);
113
+ return headers.filter((header) => {
114
+ let numericCount = 0;
115
+ let nonEmptyCount = 0;
116
+ for (const row of rows) {
117
+ const raw = row[header];
118
+ if (raw == null || String(raw).trim() === '') {
119
+ continue;
120
+ }
121
+ nonEmptyCount += 1;
122
+ if (toFiniteNumber(raw) !== null) {
123
+ numericCount += 1;
124
+ }
125
+ }
126
+ return nonEmptyCount > 0 && numericCount === nonEmptyCount;
127
+ });
128
+ }
129
+ function normalizeHeader(value) {
130
+ return value.toLowerCase().replace(/[^a-z0-9]+/g, '');
131
+ }
132
+ function findColumn(headers, aliases) {
133
+ const aliasSet = new Set(aliases.map((alias) => normalizeHeader(alias)));
134
+ return headers.find((header) => aliasSet.has(normalizeHeader(header)));
135
+ }
136
+ function expandDomain(min, max) {
137
+ if (min === max) {
138
+ const delta = Math.abs(min) > 1 ? Math.abs(min) * 0.1 : 1;
139
+ return [min - delta, max + delta];
140
+ }
141
+ return [min, max];
142
+ }
143
+ function buildXYChart(options) {
144
+ return {
145
+ id: options.id,
146
+ title: options.title,
147
+ xLabel: options.xLabel,
148
+ yLabel: options.yLabel,
149
+ kind: 'xy',
150
+ xySeries: options.series,
151
+ xScale: options.xScale ?? 'linear',
152
+ invertY: options.invertY,
153
+ xDomain: options.xDomain,
154
+ yDomain: options.yDomain,
155
+ note: options.note,
156
+ };
157
+ }
158
+ export function buildChartsFromTable(rows, options) {
159
+ if (rows.length === 0) {
160
+ return [];
161
+ }
162
+ const numericColumns = inferNumericColumns(rows);
163
+ if (numericColumns.length === 0) {
164
+ return [];
165
+ }
166
+ const xColumn = options.xColumn && numericColumns.includes(options.xColumn)
167
+ ? options.xColumn
168
+ : numericColumns[0];
169
+ const yColumns = options.yColumns?.length
170
+ ? options.yColumns.filter((column) => numericColumns.includes(column) && column !== xColumn)
171
+ : numericColumns.filter((column) => column !== xColumn);
172
+ if (yColumns.length === 0) {
173
+ return [];
174
+ }
175
+ const normalizedRows = rows
176
+ .map((row, index) => {
177
+ const xValue = toFiniteNumber(row[xColumn]) ?? index + 1;
178
+ const mapped = { __rowIndex: index + 1, __x: xValue };
179
+ for (const key of Object.keys(row)) {
180
+ mapped[key] = row[key];
181
+ }
182
+ return mapped;
183
+ })
184
+ .sort((left, right) => Number(left.__x) - Number(right.__x));
185
+ const xValues = normalizedRows.map((row) => Number(row.__x));
186
+ const charts = [];
187
+ const titlePrefix = options.titlePrefix ?? options.sourceName;
188
+ const combinedSeries = yColumns
189
+ .slice(0, 4)
190
+ .map((column) => normalizedRows.map((row) => toFiniteNumber(row[column]) ?? 0));
191
+ if (combinedSeries.length > 1) {
192
+ charts.push({
193
+ id: slugify(`${options.sourceName}-${xColumn}-overview`),
194
+ title: `${titlePrefix}: ${yColumns.slice(0, 4).map(humanizeKey).join(', ')} vs ${humanizeKey(xColumn)}`,
195
+ xLabel: humanizeKey(xColumn),
196
+ yLabel: 'Value',
197
+ kind: 'series',
198
+ xValues,
199
+ series: combinedSeries,
200
+ labels: yColumns.slice(0, 4).map(humanizeKey),
201
+ note: `Combined chart from ${normalizedRows.length} samples`,
202
+ });
203
+ }
204
+ for (const column of yColumns) {
205
+ charts.push({
206
+ id: slugify(`${options.sourceName}-${xColumn}-${column}`),
207
+ title: `${titlePrefix}: ${humanizeKey(column)} vs ${humanizeKey(xColumn)}`,
208
+ xLabel: humanizeKey(xColumn),
209
+ yLabel: humanizeKey(column),
210
+ kind: 'series',
211
+ xValues,
212
+ series: [normalizedRows.map((row) => toFiniteNumber(row[column]) ?? 0)],
213
+ labels: [humanizeKey(column)],
214
+ note: `Samples: ${normalizedRows.length}`,
215
+ });
216
+ }
217
+ return charts;
218
+ }
219
+ function buildCompactionChart(rows, sourceName) {
220
+ if (rows.length === 0) {
221
+ return [];
222
+ }
223
+ const headers = Object.keys(rows[0]);
224
+ const moistureColumn = findColumn(headers, [
225
+ 'moisture_content',
226
+ 'moisture_percent',
227
+ 'water_content',
228
+ 'water_content_percent',
229
+ 'w',
230
+ 'wc',
231
+ ]);
232
+ const densityColumn = findColumn(headers, [
233
+ 'dry_density',
234
+ 'dry_density_g_cm3',
235
+ 'dry_density_kn_m3',
236
+ 'dry_unit_weight',
237
+ 'gamma_d',
238
+ 'gd',
239
+ ]);
240
+ if (!moistureColumn || !densityColumn) {
241
+ return [];
242
+ }
243
+ const points = rows
244
+ .map((row) => ({
245
+ x: toFiniteNumber(row[moistureColumn]) ?? Number.NaN,
246
+ y: toFiniteNumber(row[densityColumn]) ?? Number.NaN,
247
+ }))
248
+ .filter((point) => Number.isFinite(point.x) && Number.isFinite(point.y))
249
+ .sort((left, right) => left.x - right.x);
250
+ if (points.length === 0) {
251
+ return [];
252
+ }
253
+ const optimumPoint = points.reduce((best, point) => (point.y > best.y ? point : best), points[0]);
254
+ return [
255
+ buildXYChart({
256
+ id: slugify(`${sourceName}-compaction-curve`),
257
+ title: `${sourceName}: Moisture-density compaction curve`,
258
+ xLabel: 'Moisture content (%)',
259
+ yLabel: humanizeKey(densityColumn),
260
+ series: [
261
+ { label: 'Compaction curve', points, style: 'line', symbol: '*' },
262
+ { label: 'Optimum point', points: [optimumPoint], style: 'scatter', symbol: 'o' },
263
+ ],
264
+ note: `Peak dry density ${optimumPoint.y.toFixed(2)} at moisture content ${optimumPoint.x.toFixed(2)}%`,
265
+ }),
266
+ ];
267
+ }
268
+ function buildGradationChart(rows, sourceName) {
269
+ if (rows.length === 0) {
270
+ return [];
271
+ }
272
+ const headers = Object.keys(rows[0]);
273
+ const sizeColumn = findColumn(headers, [
274
+ 'particle_size_mm',
275
+ 'grain_size_mm',
276
+ 'diameter_mm',
277
+ 'sieve_mm',
278
+ 'opening_mm',
279
+ 'size_mm',
280
+ ]);
281
+ const passingColumn = findColumn(headers, [
282
+ 'percent_passing',
283
+ 'passing_percent',
284
+ 'percent_finer',
285
+ 'finer_percent',
286
+ 'passing',
287
+ 'finer',
288
+ ]);
289
+ if (!sizeColumn || !passingColumn) {
290
+ return [];
291
+ }
292
+ const points = rows
293
+ .map((row) => ({
294
+ x: toFiniteNumber(row[sizeColumn]) ?? Number.NaN,
295
+ y: toFiniteNumber(row[passingColumn]) ?? Number.NaN,
296
+ }))
297
+ .filter((point) => Number.isFinite(point.x) && Number.isFinite(point.y) && point.x > 0)
298
+ .sort((left, right) => left.x - right.x);
299
+ if (points.length === 0) {
300
+ return [];
301
+ }
302
+ const [xMin, xMax] = expandDomain(Math.min(...points.map((point) => point.x)), Math.max(...points.map((point) => point.x)));
303
+ return [
304
+ buildXYChart({
305
+ id: slugify(`${sourceName}-gradation-curve`),
306
+ title: `${sourceName}: Grain-size distribution curve`,
307
+ xLabel: 'Particle size (mm)',
308
+ yLabel: 'Percent passing (%)',
309
+ xScale: 'log10',
310
+ xDomain: [xMin, xMax],
311
+ yDomain: [0, 100],
312
+ series: [{ label: 'Percent passing', points, style: 'line', symbol: '*' }],
313
+ note: 'Semilog gradation plot with logarithmic particle-size axis',
314
+ }),
315
+ ];
316
+ }
317
+ function buildCptCharts(rows, sourceName) {
318
+ if (rows.length === 0) {
319
+ return [];
320
+ }
321
+ const headers = Object.keys(rows[0]);
322
+ const depthColumn = findColumn(headers, ['depth', 'depth_m', 'z', 'elevation_depth']);
323
+ if (!depthColumn) {
324
+ return [];
325
+ }
326
+ const yColumns = [
327
+ findColumn(headers, ['qc', 'qc_mpa', 'tip_resistance', 'cone_resistance']),
328
+ findColumn(headers, ['fs', 'fs_kpa', 'friction_sleeve', 'sleeve_friction']),
329
+ findColumn(headers, ['rf', 'friction_ratio', 'rf_percent']),
330
+ findColumn(headers, ['u2', 'pore_pressure', 'pore_pressure_kpa']),
331
+ findColumn(headers, ['ic', 'soil_behavior_index']),
332
+ ].filter((value) => Boolean(value));
333
+ if (yColumns.length === 0) {
334
+ return [];
335
+ }
336
+ return buildChartsFromTable(rows, {
337
+ sourceName: `${sourceName}-cpt`,
338
+ titlePrefix: 'CPT depth plots',
339
+ xColumn: depthColumn,
340
+ yColumns,
341
+ });
342
+ }
343
+ function buildChartsFromTemplate(rows, template, sourceName) {
344
+ switch (template) {
345
+ case 'compaction':
346
+ return buildCompactionChart(rows, sourceName);
347
+ case 'gradation':
348
+ return buildGradationChart(rows, sourceName);
349
+ case 'cpt':
350
+ return buildCptCharts(rows, sourceName);
351
+ default:
352
+ return [];
353
+ }
354
+ }
355
+ function classifyPlasticityPoint(liquidLimit, plasticityIndex) {
356
+ const aLine = 0.73 * (liquidLimit - 20);
357
+ if (liquidLimit < 50) {
358
+ if (plasticityIndex > aLine && plasticityIndex > 7)
359
+ return 'CL region';
360
+ if (plasticityIndex < 4 || plasticityIndex < aLine)
361
+ return 'ML region';
362
+ return 'CL-ML border';
363
+ }
364
+ return plasticityIndex > aLine ? 'CH region' : 'MH region';
365
+ }
366
+ export function buildAtterbergChart(options) {
367
+ const liquidLimit = options.liquidLimit;
368
+ const plasticityIndex = options.plasticityIndex ?? (options.plasticLimit !== undefined ? liquidLimit - options.plasticLimit : undefined);
369
+ if (!Number.isFinite(liquidLimit)) {
370
+ throw new Error('Atterberg chart requires --ll / liquid limit.');
371
+ }
372
+ if (!Number.isFinite(plasticityIndex)) {
373
+ throw new Error('Atterberg chart requires either --pi or both --ll and --pl.');
374
+ }
375
+ const pi = Number(plasticityIndex);
376
+ const maxX = Math.max(100, liquidLimit + 10);
377
+ const maxY = Math.max(60, pi + 10);
378
+ const aLine = Array.from({ length: Math.max(2, Math.ceil(maxX - 20)) }, (_, index) => {
379
+ const ll = 20 + index;
380
+ return { x: ll, y: 0.73 * (ll - 20) };
381
+ });
382
+ const uLine = Array.from({ length: Math.max(2, Math.ceil(maxX - 8)) }, (_, index) => {
383
+ const ll = 8 + index;
384
+ return { x: ll, y: 0.9 * (ll - 8) };
385
+ });
386
+ return buildXYChart({
387
+ id: slugify(`atterberg-${liquidLimit}-${pi}`),
388
+ title: 'Atterberg plasticity chart',
389
+ xLabel: 'Liquid limit (%)',
390
+ yLabel: 'Plasticity index (%)',
391
+ xDomain: [0, maxX],
392
+ yDomain: [0, maxY],
393
+ series: [
394
+ { label: 'A-line', points: aLine, style: 'line', symbol: '*' },
395
+ { label: 'U-line', points: uLine, style: 'line', symbol: '+' },
396
+ { label: 'LL = 50', points: [{ x: 50, y: 0 }, { x: 50, y: maxY }], style: 'line', symbol: '|' },
397
+ { label: 'Sample point', points: [{ x: liquidLimit, y: pi }], style: 'scatter', symbol: 'o' },
398
+ ],
399
+ note: `${classifyPlasticityPoint(liquidLimit, pi)} | A-line PI = 0.73(LL - 20), U-line PI = 0.9(LL - 8)`,
400
+ });
401
+ }
402
+ export function buildMohrCircleChart(options) {
403
+ if (!Number.isFinite(options.sigma1) || !Number.isFinite(options.sigma3)) {
404
+ throw new Error('Mohr circle requires both --sigma1 and --sigma3.');
405
+ }
406
+ const sigma1 = Math.max(options.sigma1, options.sigma3);
407
+ const sigma3 = Math.min(options.sigma1, options.sigma3);
408
+ const center = (sigma1 + sigma3) / 2;
409
+ const radius = (sigma1 - sigma3) / 2;
410
+ const thetaSteps = 72;
411
+ const circle = Array.from({ length: thetaSteps + 1 }, (_, index) => {
412
+ const theta = (index / thetaSteps) * Math.PI * 2;
413
+ return {
414
+ x: center + radius * Math.cos(theta),
415
+ y: radius * Math.sin(theta),
416
+ };
417
+ });
418
+ const series = [
419
+ { label: 'Mohr circle', points: circle, style: 'line', symbol: '*' },
420
+ { label: 'Principal stresses', points: [{ x: sigma3, y: 0 }, { x: sigma1, y: 0 }], style: 'scatter', symbol: 'o' },
421
+ { label: 'Max shear', points: [{ x: center, y: radius }, { x: center, y: -radius }], style: 'scatter', symbol: 'x' },
422
+ ];
423
+ let maxEnvelope = radius;
424
+ if (Number.isFinite(options.cohesion) || Number.isFinite(options.frictionAngle)) {
425
+ const cohesion = options.cohesion ?? 0;
426
+ const frictionAngle = (options.frictionAngle ?? 0) * Math.PI / 180;
427
+ const maxX = Math.max(sigma1 * 1.1, sigma3 + radius * 2);
428
+ const envelope = Array.from({ length: 30 }, (_, index) => {
429
+ const x = (index / 29) * maxX;
430
+ return { x, y: cohesion + x * Math.tan(frictionAngle) };
431
+ });
432
+ maxEnvelope = Math.max(maxEnvelope, ...envelope.map((point) => point.y));
433
+ series.push({ label: 'Failure envelope', points: envelope, style: 'line', symbol: '+' });
434
+ }
435
+ const [xMin, xMax] = expandDomain(Math.min(0, sigma3 - radius * 0.2), Math.max(sigma1 + radius * 0.2, sigma1 * 1.1));
436
+ const yLimit = Math.max(radius, maxEnvelope) * 1.15 || 1;
437
+ return buildXYChart({
438
+ id: slugify(`mohr-circle-${sigma1}-${sigma3}`),
439
+ title: 'Mohr circle',
440
+ xLabel: 'Normal stress',
441
+ yLabel: 'Shear stress',
442
+ xDomain: [xMin, xMax],
443
+ yDomain: [-yLimit, yLimit],
444
+ series,
445
+ note: `Center = ${center.toFixed(2)}, radius = ${radius.toFixed(2)}, tau_max = ${radius.toFixed(2)}`,
446
+ });
447
+ }
448
+ export function buildChartsFromJson(data, sourceName) {
449
+ const charts = [];
450
+ if (!isRecord(data)) {
451
+ if (Array.isArray(data) && data.every((item) => isRecord(item))) {
452
+ return buildChartsFromTable(data, { sourceName });
453
+ }
454
+ return charts;
455
+ }
456
+ if (Array.isArray(data.timeSettlement) && data.timeSettlement.every((item) => isRecord(item))) {
457
+ const transformedRows = data.timeSettlement.map((item) => ({
458
+ timeYears: toFiniteNumber(item.timeYears) ?? 0,
459
+ settlement: toFiniteNumber(item.settlement) ?? 0,
460
+ consolidationPercent: Math.round((toFiniteNumber(item.consolidation) ?? 0) * 1000) / 10,
461
+ }));
462
+ charts.push(...buildChartsFromTable(transformedRows, {
463
+ sourceName: `${sourceName}-time-settlement`,
464
+ titlePrefix: 'Consolidation time curve',
465
+ xColumn: 'timeYears',
466
+ yColumns: ['settlement', 'consolidationPercent'],
467
+ }));
468
+ }
469
+ if (Array.isArray(data.profile) && data.profile.every((item) => isRecord(item))) {
470
+ charts.push(...buildChartsFromTable(data.profile, {
471
+ sourceName: `${sourceName}-profile`,
472
+ titlePrefix: 'Settlement profile',
473
+ xColumn: 'x',
474
+ yColumns: ['settlement'],
475
+ }));
476
+ }
477
+ if (Array.isArray(data.layers) && data.layers.every((item) => isRecord(item))) {
478
+ const layerRows = data.layers;
479
+ const firstLayer = layerRows[0];
480
+ if ('CSR' in firstLayer && 'CRR' in firstLayer && 'factorOfSafety' in firstLayer && 'depth' in firstLayer) {
481
+ charts.push(...buildChartsFromTable(layerRows, {
482
+ sourceName: `${sourceName}-liquefaction`,
483
+ titlePrefix: 'Liquefaction depth plots',
484
+ xColumn: 'depth',
485
+ yColumns: ['factorOfSafety', 'CSR', 'CRR', 'N160cs'],
486
+ }));
487
+ }
488
+ }
489
+ if (Array.isArray(data.shaftFrictionPerLayer) && data.shaftFrictionPerLayer.every((item) => isRecord(item))) {
490
+ const rows = data.shaftFrictionPerLayer.map((item, index, items) => {
491
+ const cumulative = items
492
+ .slice(0, index + 1)
493
+ .reduce((total, entry) => total + (toFiniteNumber(entry.shaftResistance) ?? 0), 0);
494
+ return {
495
+ depth: toFiniteNumber(item.depth) ?? 0,
496
+ unitShaftFriction: toFiniteNumber(item.unitShaftFriction) ?? 0,
497
+ shaftResistance: toFiniteNumber(item.shaftResistance) ?? 0,
498
+ cumulativeShaftResistance: Math.round(cumulative * 100) / 100,
499
+ };
500
+ });
501
+ charts.push(...buildChartsFromTable(rows, {
502
+ sourceName: `${sourceName}-pile`,
503
+ titlePrefix: 'Pile capacity profile',
504
+ xColumn: 'depth',
505
+ yColumns: ['unitShaftFriction', 'shaftResistance', 'cumulativeShaftResistance'],
506
+ }));
507
+ }
508
+ if (Array.isArray(data.sliceResults) && data.sliceResults.every((item) => isRecord(item))) {
509
+ charts.push(...buildChartsFromTable(data.sliceResults, {
510
+ sourceName: `${sourceName}-slope`,
511
+ titlePrefix: 'Slope slice plots',
512
+ xColumn: 'sliceNumber',
513
+ yColumns: ['shearStrength', 'normalForce', 'weight', 'baseAngle'],
514
+ }));
515
+ }
516
+ if (charts.length > 0) {
517
+ return charts;
518
+ }
519
+ for (const [key, value] of Object.entries(data)) {
520
+ if (Array.isArray(value) && value.every((item) => isRecord(item))) {
521
+ charts.push(...buildChartsFromTable(value, {
522
+ sourceName: `${sourceName}-${key}`,
523
+ titlePrefix: humanizeKey(key),
524
+ }));
525
+ }
526
+ }
527
+ return charts;
528
+ }
529
+ export async function loadVisualizationSource(filePath, options) {
530
+ const extension = extname(filePath).toLowerCase();
531
+ const sourceName = basename(filePath, extension);
532
+ if (extension === '.json') {
533
+ const parsed = JSON.parse(readFileSync(filePath, 'utf-8'));
534
+ if (options?.template && Array.isArray(parsed) && parsed.every((item) => isRecord(item))) {
535
+ const charts = buildChartsFromTemplate(parsed, options.template, sourceName);
536
+ if (charts.length === 0) {
537
+ throw new Error(`Template "${options.template}" could not find the expected columns in ${filePath}.`);
538
+ }
539
+ return {
540
+ sourceType: 'json',
541
+ sourceName,
542
+ charts,
543
+ };
544
+ }
545
+ return {
546
+ sourceType: 'json',
547
+ sourceName,
548
+ charts: buildChartsFromJson(parsed, sourceName),
549
+ };
550
+ }
551
+ if (extension === '.csv') {
552
+ const rows = rowsFromCsv(readFileSync(filePath, 'utf-8'));
553
+ const charts = options?.template
554
+ ? buildChartsFromTemplate(rows, options.template, sourceName)
555
+ : buildChartsFromTable(rows, {
556
+ sourceName,
557
+ xColumn: options?.xColumn,
558
+ yColumns: options?.yColumns,
559
+ });
560
+ if (options?.template && charts.length === 0) {
561
+ throw new Error(`Template "${options.template}" could not find the expected columns in ${filePath}.`);
562
+ }
563
+ return {
564
+ sourceType: 'csv',
565
+ sourceName,
566
+ charts,
567
+ };
568
+ }
569
+ if (extension === '.xlsx') {
570
+ const workbook = new ExcelJS.Workbook();
571
+ await workbook.xlsx.readFile(filePath);
572
+ const worksheets = options?.sheetName
573
+ ? workbook.worksheets.filter((sheet) => sheet.name === options.sheetName)
574
+ : workbook.worksheets;
575
+ if (worksheets.length === 0) {
576
+ throw new Error(`Sheet "${options?.sheetName}" not found in ${filePath}.`);
577
+ }
578
+ const charts = worksheets.flatMap((worksheet) => {
579
+ const rows = rowsFromWorksheet(worksheet);
580
+ return options?.template
581
+ ? buildChartsFromTemplate(rows, options.template, `${sourceName}-${worksheet.name}`)
582
+ : buildChartsFromTable(rows, {
583
+ sourceName: `${sourceName}-${worksheet.name}`,
584
+ titlePrefix: `${worksheet.name} sheet`,
585
+ xColumn: options?.xColumn,
586
+ yColumns: options?.yColumns,
587
+ });
588
+ });
589
+ if (options?.template && charts.length === 0) {
590
+ throw new Error(`Template "${options.template}" could not find the expected columns in ${filePath}.`);
591
+ }
592
+ return {
593
+ sourceType: 'xlsx',
594
+ sourceName,
595
+ charts,
596
+ };
597
+ }
598
+ throw new Error(`Unsupported visualization source: ${filePath}. Use .json, .csv, or .xlsx.`);
599
+ }
600
+ //# sourceMappingURL=viz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viz.js","sourceRoot":"","sources":["../../src/util/viz.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "geotechcli",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "AI-native CLI for geotechnical engineering",
5
5
  "type": "module",
6
6
  "bin": {
@@ -17,16 +17,18 @@
17
17
  },
18
18
  "dependencies": {
19
19
  "@geotechcli/core": "*",
20
+ "asciichart": "^1.5.25",
21
+ "boxen": "^8.0.1",
20
22
  "chalk": "^5.4.0",
21
23
  "commander": "^13.1.0",
24
+ "exceljs": "^4.4.0",
22
25
  "ora": "^8.2.0",
23
- "boxen": "^8.0.1",
24
- "asciichart": "^1.5.25"
26
+ "pdf-lib": "^1.17.1"
25
27
  },
26
28
  "devDependencies": {
29
+ "@types/asciichart": "^1.5.8",
27
30
  "typescript": "^5.7.0",
28
- "vitest": "^3.1.0",
29
- "@types/asciichart": "^1.5.8"
31
+ "vitest": "^4.1.4"
30
32
  },
31
33
  "files": [
32
34
  "dist"