@zaowu-labs/data 1.0.1
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 +19 -0
- package/dist/index.d.ts +94 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +559 -0
- package/dist/index.js.map +1 -0
- package/package.json +42 -0
package/README.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# @zaowu-labs/data
|
|
2
|
+
|
|
3
|
+
Data workflow package for ZaoWu.
|
|
4
|
+
|
|
5
|
+
This package reads CSV, TSV, JSON, and XLSX inputs for inspection, lightweight
|
|
6
|
+
analysis, schema inference, sampling, and preview-first cleaning.
|
|
7
|
+
XLSX support uses the official SheetJS `0.20.3` distribution because the npm
|
|
8
|
+
registry package is no longer the current upstream release channel.
|
|
9
|
+
|
|
10
|
+
Schema inference recognizes numbers, booleans, ISO or `MM/DD/YYYY` calendar
|
|
11
|
+
dates, percentages, common currency values, strings, empty columns, and mixed
|
|
12
|
+
columns without changing the source values.
|
|
13
|
+
|
|
14
|
+
Safety:
|
|
15
|
+
|
|
16
|
+
- Cleaning previews by default when an output path is supplied.
|
|
17
|
+
- Confirmed writes refuse to overwrite the input file or an existing output.
|
|
18
|
+
- XLSX support requires explicit sheet selection when the first sheet is not the
|
|
19
|
+
intended input.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { type DomainDefinition } from '@zaowu-labs/core';
|
|
2
|
+
export interface DataTable {
|
|
3
|
+
filePath: string;
|
|
4
|
+
format: 'csv' | 'tsv' | 'xlsx' | 'json';
|
|
5
|
+
sheetName?: string;
|
|
6
|
+
delimiter: ',' | '\t';
|
|
7
|
+
headers: string[];
|
|
8
|
+
rows: string[][];
|
|
9
|
+
emptyLineCount: number;
|
|
10
|
+
trimmedCellCount: number;
|
|
11
|
+
}
|
|
12
|
+
export interface DataInspectResult {
|
|
13
|
+
schemaVersion: 1;
|
|
14
|
+
status: 'ok';
|
|
15
|
+
filePath: string;
|
|
16
|
+
sheetName?: string;
|
|
17
|
+
rowCount: number;
|
|
18
|
+
columnCount: number;
|
|
19
|
+
columns: string[];
|
|
20
|
+
missingByColumn: Record<string, number>;
|
|
21
|
+
}
|
|
22
|
+
export interface NumericColumnAnalysis {
|
|
23
|
+
column: string;
|
|
24
|
+
count: number;
|
|
25
|
+
min: number;
|
|
26
|
+
max: number;
|
|
27
|
+
average: number;
|
|
28
|
+
}
|
|
29
|
+
export interface DataAnalyzeResult {
|
|
30
|
+
schemaVersion: 1;
|
|
31
|
+
status: 'ok';
|
|
32
|
+
filePath: string;
|
|
33
|
+
sheetName?: string;
|
|
34
|
+
numericColumns: NumericColumnAnalysis[];
|
|
35
|
+
}
|
|
36
|
+
export interface DataCleanResult {
|
|
37
|
+
schemaVersion: 1;
|
|
38
|
+
status: 'ok' | 'preview';
|
|
39
|
+
inputPath: string;
|
|
40
|
+
sheetName?: string;
|
|
41
|
+
outputPath?: string;
|
|
42
|
+
content: string;
|
|
43
|
+
wroteFile: boolean;
|
|
44
|
+
removedEmptyRows: number;
|
|
45
|
+
trimmedCells: number;
|
|
46
|
+
missingByColumn: Record<string, number>;
|
|
47
|
+
}
|
|
48
|
+
export interface DataColumnSchema {
|
|
49
|
+
column: string;
|
|
50
|
+
index: number;
|
|
51
|
+
type: 'number' | 'boolean' | 'date' | 'percent' | 'currency' | 'string' | 'empty' | 'mixed';
|
|
52
|
+
nullable: boolean;
|
|
53
|
+
examples: string[];
|
|
54
|
+
}
|
|
55
|
+
export interface DataSchemaResult {
|
|
56
|
+
schemaVersion: 1;
|
|
57
|
+
status: 'ok';
|
|
58
|
+
filePath: string;
|
|
59
|
+
sheetName?: string;
|
|
60
|
+
columns: DataColumnSchema[];
|
|
61
|
+
}
|
|
62
|
+
export interface DataSampleResult {
|
|
63
|
+
schemaVersion: 1;
|
|
64
|
+
status: 'ok';
|
|
65
|
+
filePath: string;
|
|
66
|
+
sheetName?: string;
|
|
67
|
+
rowCount: number;
|
|
68
|
+
rows: Record<string, string>[];
|
|
69
|
+
}
|
|
70
|
+
export interface DataReadOptions {
|
|
71
|
+
sheet?: string;
|
|
72
|
+
}
|
|
73
|
+
export declare const DATA_DOMAIN: DomainDefinition;
|
|
74
|
+
export declare const loadDataTable: (filePath: string, options?: DataReadOptions) => Promise<DataTable>;
|
|
75
|
+
export declare const inspectData: (filePath: string, options?: DataReadOptions) => Promise<DataInspectResult>;
|
|
76
|
+
export declare const analyzeData: (filePath: string, options?: DataReadOptions) => Promise<DataAnalyzeResult>;
|
|
77
|
+
export declare const cleanData: (inputPath: string, options?: {
|
|
78
|
+
outputPath?: string;
|
|
79
|
+
yes?: boolean;
|
|
80
|
+
sheet?: string;
|
|
81
|
+
}) => Promise<DataCleanResult>;
|
|
82
|
+
export declare const inferDataSchema: (filePath: string, options?: DataReadOptions) => Promise<DataSchemaResult>;
|
|
83
|
+
export declare const sampleData: (filePath: string, options?: {
|
|
84
|
+
rows?: number;
|
|
85
|
+
sheet?: string;
|
|
86
|
+
}) => Promise<DataSampleResult>;
|
|
87
|
+
export interface DataSheetsResult {
|
|
88
|
+
schemaVersion: 1;
|
|
89
|
+
status: 'ok';
|
|
90
|
+
filePath: string;
|
|
91
|
+
sheets: string[];
|
|
92
|
+
}
|
|
93
|
+
export declare const listSheets: (filePath: string) => Promise<DataSheetsResult>;
|
|
94
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,559 @@
|
|
|
1
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { createCapabilityLedger, pathExists, stripUtf8Bom, ZaoWuError, } from '@zaowu-labs/core';
|
|
4
|
+
export const DATA_DOMAIN = {
|
|
5
|
+
name: 'data',
|
|
6
|
+
summary: 'Data workflows for inspection, analysis, and cleanup',
|
|
7
|
+
capabilities: createCapabilityLedger({
|
|
8
|
+
readsFiles: true,
|
|
9
|
+
writesFiles: true,
|
|
10
|
+
}),
|
|
11
|
+
commands: [
|
|
12
|
+
{
|
|
13
|
+
name: 'inspect',
|
|
14
|
+
summary: 'Inspect a dataset or spreadsheet',
|
|
15
|
+
status: 'available',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'analyze',
|
|
19
|
+
summary: 'Analyze a dataset or spreadsheet',
|
|
20
|
+
status: 'available',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: 'clean',
|
|
24
|
+
summary: 'Clean data with preview and explicit output control',
|
|
25
|
+
status: 'available',
|
|
26
|
+
sensitive: true,
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'schema',
|
|
30
|
+
summary: 'Infer a lightweight schema for CSV or TSV data',
|
|
31
|
+
status: 'available',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'sample',
|
|
35
|
+
summary: 'Show sample rows from CSV or TSV data',
|
|
36
|
+
status: 'available',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'sheets',
|
|
40
|
+
summary: 'List available sheets in a spreadsheet workbook',
|
|
41
|
+
status: 'available',
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
};
|
|
45
|
+
const assertSupportedDataFile = (filePath) => {
|
|
46
|
+
const extension = path.extname(filePath).toLowerCase();
|
|
47
|
+
if (extension === '.csv') {
|
|
48
|
+
return {
|
|
49
|
+
format: 'csv',
|
|
50
|
+
delimiter: ',',
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
if (extension === '.tsv') {
|
|
54
|
+
return {
|
|
55
|
+
format: 'tsv',
|
|
56
|
+
delimiter: '\t',
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
if (extension === '.xlsx') {
|
|
60
|
+
return {
|
|
61
|
+
format: 'xlsx',
|
|
62
|
+
delimiter: ',',
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
if (extension === '.json') {
|
|
66
|
+
return {
|
|
67
|
+
format: 'json',
|
|
68
|
+
delimiter: ',',
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
throw new ZaoWuError({
|
|
72
|
+
code: 'DATA_FORMAT_UNSUPPORTED',
|
|
73
|
+
message: 'Data format is not supported yet.',
|
|
74
|
+
why: `ZaoWu can read CSV, TSV, XLSX, and JSON files. It cannot parse \`${extension || 'unknown'}\` files yet.`,
|
|
75
|
+
fix: 'Export the data as `.csv`, `.tsv`, `.xlsx`, or `.json`, or add a parser inside `packages/data` before using this format.',
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
const parseDelimitedLineDetailed = (line, delimiter) => {
|
|
79
|
+
const values = [];
|
|
80
|
+
let trimmedCells = 0;
|
|
81
|
+
const pushValue = (value) => {
|
|
82
|
+
const trimmed = value.trim();
|
|
83
|
+
if (value !== trimmed) {
|
|
84
|
+
trimmedCells += 1;
|
|
85
|
+
}
|
|
86
|
+
values.push(trimmed);
|
|
87
|
+
};
|
|
88
|
+
if (delimiter === '\t') {
|
|
89
|
+
for (const value of line.split('\t')) {
|
|
90
|
+
pushValue(value);
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
values,
|
|
94
|
+
trimmedCells,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
let current = '';
|
|
98
|
+
let quoted = false;
|
|
99
|
+
for (let index = 0; index < line.length; index += 1) {
|
|
100
|
+
const char = line[index];
|
|
101
|
+
const next = line[index + 1];
|
|
102
|
+
if (char === '"' && quoted && next === '"') {
|
|
103
|
+
current += '"';
|
|
104
|
+
index += 1;
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (char === '"') {
|
|
108
|
+
quoted = !quoted;
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (char === ',' && !quoted) {
|
|
112
|
+
pushValue(current);
|
|
113
|
+
current = '';
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
current += char;
|
|
117
|
+
}
|
|
118
|
+
pushValue(current);
|
|
119
|
+
return {
|
|
120
|
+
values,
|
|
121
|
+
trimmedCells,
|
|
122
|
+
};
|
|
123
|
+
};
|
|
124
|
+
const serializeDelimitedLine = (values, delimiter) => values
|
|
125
|
+
.map((value) => {
|
|
126
|
+
const trimmed = value.trim();
|
|
127
|
+
if (delimiter === ',' && /[",\n\r]/.test(trimmed)) {
|
|
128
|
+
return `"${trimmed.replaceAll('"', '""')}"`;
|
|
129
|
+
}
|
|
130
|
+
return trimmed;
|
|
131
|
+
})
|
|
132
|
+
.join(delimiter);
|
|
133
|
+
const normalizeHeaders = (headers) => {
|
|
134
|
+
const used = new Set();
|
|
135
|
+
return headers.map((header, index) => {
|
|
136
|
+
const base = header.trim() || `column_${index + 1}`;
|
|
137
|
+
let candidate = base;
|
|
138
|
+
let suffix = 2;
|
|
139
|
+
while (used.has(candidate)) {
|
|
140
|
+
candidate = `${base}_${suffix}`;
|
|
141
|
+
suffix += 1;
|
|
142
|
+
}
|
|
143
|
+
used.add(candidate);
|
|
144
|
+
return candidate;
|
|
145
|
+
});
|
|
146
|
+
};
|
|
147
|
+
export const loadDataTable = async (filePath, options = {}) => {
|
|
148
|
+
const source = assertSupportedDataFile(filePath);
|
|
149
|
+
let content;
|
|
150
|
+
if (source.format === 'json') {
|
|
151
|
+
try {
|
|
152
|
+
const jsonContent = await readFile(filePath, 'utf8');
|
|
153
|
+
const parsed = JSON.parse(stripUtf8Bom(jsonContent));
|
|
154
|
+
let rows = [];
|
|
155
|
+
let headers = [];
|
|
156
|
+
if (Array.isArray(parsed)) {
|
|
157
|
+
const uniqueKeys = new Set();
|
|
158
|
+
for (const item of parsed) {
|
|
159
|
+
if (item && typeof item === 'object') {
|
|
160
|
+
for (const key of Object.keys(item)) {
|
|
161
|
+
uniqueKeys.add(key);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
headers = normalizeHeaders(Array.from(uniqueKeys));
|
|
166
|
+
for (const item of parsed) {
|
|
167
|
+
const row = [];
|
|
168
|
+
if (item && typeof item === 'object') {
|
|
169
|
+
const obj = item;
|
|
170
|
+
for (const header of headers) {
|
|
171
|
+
const val = obj[header];
|
|
172
|
+
row.push(val === undefined || val === null ? '' : String(val).trim());
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
for (let i = 0; i < headers.length; i++) {
|
|
177
|
+
row.push(item === undefined || item === null ? '' : String(item).trim());
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
rows.push(row);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
else if (parsed && typeof parsed === 'object') {
|
|
184
|
+
headers = normalizeHeaders(Object.keys(parsed));
|
|
185
|
+
const row = [];
|
|
186
|
+
const obj = parsed;
|
|
187
|
+
for (const header of headers) {
|
|
188
|
+
const val = obj[header];
|
|
189
|
+
row.push(val === undefined || val === null ? '' : String(val).trim());
|
|
190
|
+
}
|
|
191
|
+
rows.push(row);
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
filePath,
|
|
195
|
+
format: 'json',
|
|
196
|
+
delimiter: ',',
|
|
197
|
+
headers,
|
|
198
|
+
rows,
|
|
199
|
+
emptyLineCount: 0,
|
|
200
|
+
trimmedCellCount: 0,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
if (error instanceof ZaoWuError) {
|
|
205
|
+
throw error;
|
|
206
|
+
}
|
|
207
|
+
throw new ZaoWuError({
|
|
208
|
+
code: 'DATA_READ_FAILED',
|
|
209
|
+
message: 'Could not read data file.',
|
|
210
|
+
why: `ZaoWu tried to read \`${filePath}\` as JSON, but the file is not valid JSON.`,
|
|
211
|
+
fix: 'Check the path, file permissions, and JSON structure, then try again.',
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (source.format === 'xlsx') {
|
|
216
|
+
try {
|
|
217
|
+
const workbookBuffer = await readFile(filePath);
|
|
218
|
+
if (workbookBuffer[0] !== 0x50 || workbookBuffer[1] !== 0x4b) {
|
|
219
|
+
throw new ZaoWuError({
|
|
220
|
+
code: 'DATA_READ_FAILED',
|
|
221
|
+
message: 'Could not read data file.',
|
|
222
|
+
why: `ZaoWu tried to read \`${filePath}\` as an XLSX workbook, but the file is not an XLSX ZIP container.`,
|
|
223
|
+
fix: 'Check the workbook format or export the data as `.csv`, `.tsv`, or `.xlsx`.',
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
const XLSX = await import('xlsx');
|
|
227
|
+
const workbook = XLSX.read(workbookBuffer, {
|
|
228
|
+
type: 'buffer',
|
|
229
|
+
});
|
|
230
|
+
if (!workbook.SheetNames || workbook.SheetNames.length === 0) {
|
|
231
|
+
throw new ZaoWuError({
|
|
232
|
+
code: 'DATA_SHEET_NOT_FOUND',
|
|
233
|
+
message: 'XLSX sheet was not found.',
|
|
234
|
+
why: `The workbook \`${filePath}\` contains no sheets.`,
|
|
235
|
+
fix: 'Ensure the spreadsheet has at least one visible worksheet.',
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
const firstSheetName = workbook.SheetNames[0];
|
|
239
|
+
const sheetName = options.sheet?.trim() || firstSheetName;
|
|
240
|
+
if (options.sheet && !workbook.Sheets[sheetName]) {
|
|
241
|
+
throw new ZaoWuError({
|
|
242
|
+
code: 'DATA_SHEET_NOT_FOUND',
|
|
243
|
+
message: 'XLSX sheet was not found.',
|
|
244
|
+
why: `ZaoWu could not find a sheet named \`${options.sheet}\` in \`${filePath}\`.`,
|
|
245
|
+
fix: `Use one of: ${workbook.SheetNames.join(', ') || 'no sheets available'}.`,
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
const sheet = sheetName ? workbook.Sheets[sheetName] : undefined;
|
|
249
|
+
const rows = sheet
|
|
250
|
+
? XLSX.utils.sheet_to_json(sheet, {
|
|
251
|
+
header: 1,
|
|
252
|
+
defval: '',
|
|
253
|
+
})
|
|
254
|
+
: [];
|
|
255
|
+
const normalizedRows = rows.map((row) => row.map((value) => String(value).trim()));
|
|
256
|
+
const headers = normalizeHeaders(normalizedRows[0] ?? []);
|
|
257
|
+
const dataRows = normalizedRows.slice(1).filter((row) => row.some((value) => value.trim()));
|
|
258
|
+
return {
|
|
259
|
+
filePath,
|
|
260
|
+
format: source.format,
|
|
261
|
+
sheetName,
|
|
262
|
+
delimiter: source.delimiter,
|
|
263
|
+
headers,
|
|
264
|
+
rows: dataRows,
|
|
265
|
+
emptyLineCount: normalizedRows.length - 1 - dataRows.length,
|
|
266
|
+
trimmedCellCount: 0,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
catch (error) {
|
|
270
|
+
if (error instanceof ZaoWuError) {
|
|
271
|
+
throw error;
|
|
272
|
+
}
|
|
273
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
274
|
+
throw new ZaoWuError({
|
|
275
|
+
code: 'DATA_READ_FAILED',
|
|
276
|
+
message: 'Could not read data file.',
|
|
277
|
+
why: `ZaoWu tried to read \`${filePath}\` as an XLSX file, but the file was not readable. Details: ${errorMsg}`,
|
|
278
|
+
fix: 'Check the path, file permissions, and workbook format, then run the command again.',
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
try {
|
|
283
|
+
content = stripUtf8Bom(await readFile(filePath, 'utf8'));
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
throw new ZaoWuError({
|
|
287
|
+
code: 'DATA_READ_FAILED',
|
|
288
|
+
message: 'Could not read data file.',
|
|
289
|
+
why: `ZaoWu tried to read \`${filePath}\`, but the file was not readable.`,
|
|
290
|
+
fix: 'Check the path and file permissions, then run the command again.',
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
const rawLines = content.split(/\r?\n/);
|
|
294
|
+
const contentLines = rawLines.at(-1) === '' ? rawLines.slice(0, -1) : rawLines;
|
|
295
|
+
const lines = contentLines.filter((line) => line.trim());
|
|
296
|
+
const emptyLineCount = contentLines.length - lines.length;
|
|
297
|
+
const parsedHeaders = lines[0]
|
|
298
|
+
? parseDelimitedLineDetailed(lines[0], source.delimiter)
|
|
299
|
+
: { values: [], trimmedCells: 0 };
|
|
300
|
+
const parsedRows = lines
|
|
301
|
+
.slice(1)
|
|
302
|
+
.map((line) => parseDelimitedLineDetailed(line, source.delimiter));
|
|
303
|
+
const trimmedCellCount = parsedHeaders.trimmedCells +
|
|
304
|
+
parsedRows.reduce((count, parsedLine) => count + parsedLine.trimmedCells, 0);
|
|
305
|
+
return {
|
|
306
|
+
filePath,
|
|
307
|
+
format: source.format,
|
|
308
|
+
delimiter: source.delimiter,
|
|
309
|
+
headers: normalizeHeaders(parsedHeaders.values),
|
|
310
|
+
rows: parsedRows.map((row) => row.values),
|
|
311
|
+
emptyLineCount,
|
|
312
|
+
trimmedCellCount,
|
|
313
|
+
};
|
|
314
|
+
};
|
|
315
|
+
const assertSafeOutputPath = async (inputPath, outputPath) => {
|
|
316
|
+
if (path.resolve(inputPath) === path.resolve(outputPath)) {
|
|
317
|
+
throw new ZaoWuError({
|
|
318
|
+
code: 'DATA_OUTPUT_CONFLICT',
|
|
319
|
+
message: 'Data output path conflicts with input path.',
|
|
320
|
+
why: '`zw data clean` refuses to overwrite the input dataset.',
|
|
321
|
+
fix: 'Choose a different `--output` path.',
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
if (await pathExists(outputPath)) {
|
|
325
|
+
throw new ZaoWuError({
|
|
326
|
+
code: 'DATA_OUTPUT_CONFLICT',
|
|
327
|
+
message: 'Data output file already exists.',
|
|
328
|
+
why: `ZaoWu will not silently overwrite \`${outputPath}\`.`,
|
|
329
|
+
fix: 'Choose a new `--output` path, or remove the existing file yourself first.',
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
const getMissingByColumn = (table) => {
|
|
334
|
+
const missingByColumn = {};
|
|
335
|
+
for (const [index, header] of table.headers.entries()) {
|
|
336
|
+
missingByColumn[header] = table.rows.filter((row) => !row[index]?.trim()).length;
|
|
337
|
+
}
|
|
338
|
+
return missingByColumn;
|
|
339
|
+
};
|
|
340
|
+
export const inspectData = async (filePath, options = {}) => {
|
|
341
|
+
const table = await loadDataTable(filePath, options);
|
|
342
|
+
return {
|
|
343
|
+
schemaVersion: 1,
|
|
344
|
+
status: 'ok',
|
|
345
|
+
filePath,
|
|
346
|
+
sheetName: table.sheetName,
|
|
347
|
+
rowCount: table.rows.length,
|
|
348
|
+
columnCount: table.headers.length,
|
|
349
|
+
columns: table.headers,
|
|
350
|
+
missingByColumn: getMissingByColumn(table),
|
|
351
|
+
};
|
|
352
|
+
};
|
|
353
|
+
export const analyzeData = async (filePath, options = {}) => {
|
|
354
|
+
const table = await loadDataTable(filePath, options);
|
|
355
|
+
const numericColumns = [];
|
|
356
|
+
for (const [index, header] of table.headers.entries()) {
|
|
357
|
+
const numbers = table.rows
|
|
358
|
+
.map((row) => (row[index] ?? '').trim())
|
|
359
|
+
.filter(Boolean)
|
|
360
|
+
.map((value) => Number(value))
|
|
361
|
+
.filter((value) => Number.isFinite(value));
|
|
362
|
+
if (numbers.length === 0) {
|
|
363
|
+
continue;
|
|
364
|
+
}
|
|
365
|
+
const total = numbers.reduce((sum, value) => sum + value, 0);
|
|
366
|
+
numericColumns.push({
|
|
367
|
+
column: header,
|
|
368
|
+
count: numbers.length,
|
|
369
|
+
min: Math.min(...numbers),
|
|
370
|
+
max: Math.max(...numbers),
|
|
371
|
+
average: total / numbers.length,
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
return {
|
|
375
|
+
schemaVersion: 1,
|
|
376
|
+
status: 'ok',
|
|
377
|
+
filePath,
|
|
378
|
+
sheetName: table.sheetName,
|
|
379
|
+
numericColumns,
|
|
380
|
+
};
|
|
381
|
+
};
|
|
382
|
+
export const cleanData = async (inputPath, options = {}) => {
|
|
383
|
+
const table = await loadDataTable(inputPath, options);
|
|
384
|
+
const lines = [
|
|
385
|
+
serializeDelimitedLine(table.headers, table.delimiter),
|
|
386
|
+
...table.rows.map((row) => serializeDelimitedLine(row, table.delimiter)),
|
|
387
|
+
];
|
|
388
|
+
const content = `${lines.join('\n')}\n`;
|
|
389
|
+
if (options.outputPath && options.yes) {
|
|
390
|
+
await assertSafeOutputPath(inputPath, options.outputPath);
|
|
391
|
+
try {
|
|
392
|
+
await writeFile(options.outputPath, content, { encoding: 'utf8', flag: 'wx' });
|
|
393
|
+
}
|
|
394
|
+
catch (error) {
|
|
395
|
+
if (error instanceof ZaoWuError) {
|
|
396
|
+
throw error;
|
|
397
|
+
}
|
|
398
|
+
if (error.code === 'EEXIST') {
|
|
399
|
+
throw new ZaoWuError({
|
|
400
|
+
code: 'DATA_OUTPUT_CONFLICT',
|
|
401
|
+
message: 'Data output file already exists.',
|
|
402
|
+
why: `ZaoWu will not silently overwrite \`${options.outputPath}\`.`,
|
|
403
|
+
fix: 'Choose a new `--output` path, or remove the existing file yourself first.',
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
throw new ZaoWuError({
|
|
407
|
+
code: 'DATA_WRITE_FAILED',
|
|
408
|
+
message: 'Could not write cleaned data.',
|
|
409
|
+
why: `ZaoWu tried to write \`${options.outputPath}\`, but the file system rejected the write.`,
|
|
410
|
+
fix: 'Check the output directory and permissions, then run the command again.',
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
return {
|
|
415
|
+
schemaVersion: 1,
|
|
416
|
+
status: options.outputPath && !options.yes ? 'preview' : 'ok',
|
|
417
|
+
inputPath,
|
|
418
|
+
sheetName: table.sheetName,
|
|
419
|
+
outputPath: options.outputPath,
|
|
420
|
+
content,
|
|
421
|
+
wroteFile: Boolean(options.outputPath && options.yes),
|
|
422
|
+
removedEmptyRows: table.emptyLineCount,
|
|
423
|
+
trimmedCells: table.trimmedCellCount,
|
|
424
|
+
missingByColumn: getMissingByColumn(table),
|
|
425
|
+
};
|
|
426
|
+
};
|
|
427
|
+
const isBoolean = (value) => ['true', 'false'].includes(value.toLowerCase());
|
|
428
|
+
const isValidCalendarDate = (year, month, day) => {
|
|
429
|
+
if (month < 1 || month > 12 || day < 1) {
|
|
430
|
+
return false;
|
|
431
|
+
}
|
|
432
|
+
return day <= new Date(Date.UTC(year, month, 0)).getUTCDate();
|
|
433
|
+
};
|
|
434
|
+
const isDateLike = (value) => {
|
|
435
|
+
const trimmed = value.trim();
|
|
436
|
+
const isoMatch = /^(\d{4})-(\d{1,2})-(\d{1,2})$/.exec(trimmed);
|
|
437
|
+
if (isoMatch) {
|
|
438
|
+
return isValidCalendarDate(Number(isoMatch[1]), Number(isoMatch[2]), Number(isoMatch[3]));
|
|
439
|
+
}
|
|
440
|
+
const slashMatch = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/.exec(trimmed);
|
|
441
|
+
if (slashMatch) {
|
|
442
|
+
return isValidCalendarDate(Number(slashMatch[3]), Number(slashMatch[1]), Number(slashMatch[2]));
|
|
443
|
+
}
|
|
444
|
+
return false;
|
|
445
|
+
};
|
|
446
|
+
const isPercentLike = (value) => {
|
|
447
|
+
const trimmed = value.trim();
|
|
448
|
+
return /^[-+]?(?:\d+(?:\.\d+)?|\.\d+)%$/.test(trimmed);
|
|
449
|
+
};
|
|
450
|
+
const isCurrencyLike = (value) => {
|
|
451
|
+
const trimmed = value.trim();
|
|
452
|
+
return (/^(?:[$€£¥]\s*)?[-+]?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?(?:\s*(?:USD|EUR|GBP|CNY|JPY))?$/.test(trimmed) && /[$€£¥,]|\b(?:USD|EUR|GBP|CNY|JPY)\b/.test(trimmed));
|
|
453
|
+
};
|
|
454
|
+
const getValueType = (value) => {
|
|
455
|
+
if (Number.isFinite(Number(value))) {
|
|
456
|
+
return 'number';
|
|
457
|
+
}
|
|
458
|
+
if (isBoolean(value)) {
|
|
459
|
+
return 'boolean';
|
|
460
|
+
}
|
|
461
|
+
if (isDateLike(value)) {
|
|
462
|
+
return 'date';
|
|
463
|
+
}
|
|
464
|
+
if (isPercentLike(value)) {
|
|
465
|
+
return 'percent';
|
|
466
|
+
}
|
|
467
|
+
if (isCurrencyLike(value)) {
|
|
468
|
+
return 'currency';
|
|
469
|
+
}
|
|
470
|
+
return 'string';
|
|
471
|
+
};
|
|
472
|
+
const getColumnType = (values) => {
|
|
473
|
+
const nonEmpty = values.filter((value) => value.trim());
|
|
474
|
+
if (nonEmpty.length === 0) {
|
|
475
|
+
return 'empty';
|
|
476
|
+
}
|
|
477
|
+
const inferredTypes = new Set(nonEmpty.map(getValueType));
|
|
478
|
+
return inferredTypes.size === 1 ? [...inferredTypes][0] : 'mixed';
|
|
479
|
+
};
|
|
480
|
+
export const inferDataSchema = async (filePath, options = {}) => {
|
|
481
|
+
const table = await loadDataTable(filePath, options);
|
|
482
|
+
return {
|
|
483
|
+
schemaVersion: 1,
|
|
484
|
+
status: 'ok',
|
|
485
|
+
filePath,
|
|
486
|
+
sheetName: table.sheetName,
|
|
487
|
+
columns: table.headers.map((header, index) => {
|
|
488
|
+
const values = table.rows.map((row) => row[index] ?? '');
|
|
489
|
+
return {
|
|
490
|
+
column: header,
|
|
491
|
+
index,
|
|
492
|
+
type: getColumnType(values),
|
|
493
|
+
nullable: values.some((value) => !value.trim()),
|
|
494
|
+
examples: [...new Set(values.filter(Boolean))].slice(0, 3),
|
|
495
|
+
};
|
|
496
|
+
}),
|
|
497
|
+
};
|
|
498
|
+
};
|
|
499
|
+
export const sampleData = async (filePath, options = {}) => {
|
|
500
|
+
const table = await loadDataTable(filePath, options);
|
|
501
|
+
const requestedRows = options.rows ?? 5;
|
|
502
|
+
const rowCount = Number.isFinite(requestedRows) && requestedRows > 0 ? Math.floor(requestedRows) : 5;
|
|
503
|
+
const rows = table.rows
|
|
504
|
+
.slice(0, rowCount)
|
|
505
|
+
.map((row) => Object.fromEntries(table.headers.map((header, index) => [header, row[index] ?? ''])));
|
|
506
|
+
return {
|
|
507
|
+
schemaVersion: 1,
|
|
508
|
+
status: 'ok',
|
|
509
|
+
filePath,
|
|
510
|
+
sheetName: table.sheetName,
|
|
511
|
+
rowCount: rows.length,
|
|
512
|
+
rows,
|
|
513
|
+
};
|
|
514
|
+
};
|
|
515
|
+
export const listSheets = async (filePath) => {
|
|
516
|
+
const source = assertSupportedDataFile(filePath);
|
|
517
|
+
if (source.format === 'xlsx') {
|
|
518
|
+
try {
|
|
519
|
+
const workbookBuffer = await readFile(filePath);
|
|
520
|
+
if (workbookBuffer[0] !== 0x50 || workbookBuffer[1] !== 0x4b) {
|
|
521
|
+
throw new ZaoWuError({
|
|
522
|
+
code: 'DATA_READ_FAILED',
|
|
523
|
+
message: 'Could not read data file.',
|
|
524
|
+
why: `ZaoWu tried to read \`${filePath}\` as an XLSX workbook, but the file is not an XLSX ZIP container.`,
|
|
525
|
+
fix: 'Check the workbook format or export the data as `.csv`, `.tsv`, or `.xlsx`.',
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
const XLSX = await import('xlsx');
|
|
529
|
+
const workbook = XLSX.read(workbookBuffer, {
|
|
530
|
+
type: 'buffer',
|
|
531
|
+
});
|
|
532
|
+
return {
|
|
533
|
+
schemaVersion: 1,
|
|
534
|
+
status: 'ok',
|
|
535
|
+
filePath,
|
|
536
|
+
sheets: workbook.SheetNames,
|
|
537
|
+
};
|
|
538
|
+
}
|
|
539
|
+
catch (error) {
|
|
540
|
+
if (error instanceof ZaoWuError) {
|
|
541
|
+
throw error;
|
|
542
|
+
}
|
|
543
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
544
|
+
throw new ZaoWuError({
|
|
545
|
+
code: 'DATA_READ_FAILED',
|
|
546
|
+
message: 'Could not read data file.',
|
|
547
|
+
why: `ZaoWu tried to read \`${filePath}\` as an XLSX file, but the file was not readable. Details: ${errorMsg}`,
|
|
548
|
+
fix: 'Check the path, file permissions, and workbook format, then run the command again.',
|
|
549
|
+
});
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
return {
|
|
553
|
+
schemaVersion: 1,
|
|
554
|
+
status: 'ok',
|
|
555
|
+
filePath,
|
|
556
|
+
sheets: ['default'],
|
|
557
|
+
};
|
|
558
|
+
};
|
|
559
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zaowu-labs/data",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "ZaoWu data workflows",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"publishConfig": {
|
|
8
|
+
"access": "public"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"main": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"import": "./dist/index.js"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc -b --pretty false",
|
|
24
|
+
"typecheck": "tsc -b --pretty false",
|
|
25
|
+
"dev": "tsc -b --watch"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@zaowu-labs/core": "workspace:*",
|
|
29
|
+
"xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"zaowu",
|
|
33
|
+
"data"
|
|
34
|
+
],
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "https://github.com/zaowu-labs/zaowu.git",
|
|
38
|
+
"directory": "packages/data"
|
|
39
|
+
},
|
|
40
|
+
"homepage": "https://github.com/zaowu-labs/zaowu",
|
|
41
|
+
"bugs": "https://github.com/zaowu-labs/zaowu/issues"
|
|
42
|
+
}
|