rowpipe 1.0.0 → 1.1.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.
- package/README.md +25 -32
- package/dist/cli/index.js +4 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/core/types.d.ts +2 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/readers/csv.d.ts.map +1 -1
- package/dist/readers/csv.js +28 -16
- package/dist/readers/csv.js.map +1 -1
- package/dist/readers/index.d.ts +1 -0
- package/dist/readers/index.d.ts.map +1 -1
- package/dist/readers/index.js +29 -3
- package/dist/readers/index.js.map +1 -1
- package/dist/readers/json.d.ts.map +1 -1
- package/dist/readers/json.js +6 -8
- package/dist/readers/json.js.map +1 -1
- package/dist/readers/jsonl.d.ts.map +1 -1
- package/dist/readers/jsonl.js +5 -7
- package/dist/readers/jsonl.js.map +1 -1
- package/dist/readers/parquet.d.ts +17 -0
- package/dist/readers/parquet.d.ts.map +1 -0
- package/dist/readers/parquet.js +146 -0
- package/dist/readers/parquet.js.map +1 -0
- package/dist/utils/compression.d.ts +30 -6
- package/dist/utils/compression.d.ts.map +1 -1
- package/dist/utils/compression.js +95 -18
- package/dist/utils/compression.js.map +1 -1
- package/dist/writers/csv.d.ts.map +1 -1
- package/dist/writers/csv.js +9 -11
- package/dist/writers/csv.js.map +1 -1
- package/dist/writers/index.d.ts +2 -0
- package/dist/writers/index.d.ts.map +1 -1
- package/dist/writers/index.js +49 -4
- package/dist/writers/index.js.map +1 -1
- package/dist/writers/json.d.ts +1 -1
- package/dist/writers/json.d.ts.map +1 -1
- package/dist/writers/json.js +9 -11
- package/dist/writers/json.js.map +1 -1
- package/dist/writers/jsonl.d.ts +1 -1
- package/dist/writers/jsonl.d.ts.map +1 -1
- package/dist/writers/jsonl.js +9 -11
- package/dist/writers/jsonl.js.map +1 -1
- package/dist/writers/markdown.d.ts +21 -0
- package/dist/writers/markdown.d.ts.map +1 -0
- package/dist/writers/markdown.js +82 -0
- package/dist/writers/markdown.js.map +1 -0
- package/dist/writers/parquet.d.ts +19 -0
- package/dist/writers/parquet.d.ts.map +1 -0
- package/dist/writers/parquet.js +129 -0
- package/dist/writers/parquet.js.map +1 -0
- package/package.json +13 -2
- package/skills/rowpipe/SKILL.md +181 -0
- package/benchmarks/memory-bench.ts +0 -109
- package/src/analytics/reduce.ts +0 -388
- package/src/analytics/schema-inference.ts +0 -217
- package/src/analytics/semantic-types.ts +0 -36
- package/src/analytics/stats.ts +0 -383
- package/src/analytics/validator.ts +0 -134
- package/src/cli/commands/cast.ts +0 -60
- package/src/cli/commands/convert.ts +0 -128
- package/src/cli/commands/filter.ts +0 -58
- package/src/cli/commands/inspect.ts +0 -193
- package/src/cli/commands/map.ts +0 -66
- package/src/cli/commands/reduce.ts +0 -74
- package/src/cli/commands/rename.ts +0 -59
- package/src/cli/commands/sample.ts +0 -61
- package/src/cli/commands/schema.ts +0 -86
- package/src/cli/commands/select.ts +0 -59
- package/src/cli/commands/stats.ts +0 -100
- package/src/cli/commands/validate.ts +0 -123
- package/src/cli/index.ts +0 -285
- package/src/core/batch.ts +0 -81
- package/src/core/errors.ts +0 -81
- package/src/core/pipeline.ts +0 -150
- package/src/core/types.ts +0 -110
- package/src/index.ts +0 -52
- package/src/readers/csv.ts +0 -302
- package/src/readers/index.ts +0 -88
- package/src/readers/json.ts +0 -256
- package/src/readers/jsonl.ts +0 -126
- package/src/readers/xlsx.ts +0 -182
- package/src/transforms/cast.ts +0 -212
- package/src/transforms/expression.ts +0 -1114
- package/src/transforms/filter.ts +0 -38
- package/src/transforms/map.ts +0 -99
- package/src/transforms/rename.ts +0 -47
- package/src/transforms/sample.ts +0 -57
- package/src/transforms/select.ts +0 -64
- package/src/utils/compression.ts +0 -43
- package/src/utils/formatting.ts +0 -75
- package/src/utils/progress.ts +0 -37
- package/src/writers/csv.ts +0 -106
- package/src/writers/index.ts +0 -87
- package/src/writers/json.ts +0 -52
- package/src/writers/jsonl.ts +0 -49
- package/src/writers/xlsx.ts +0 -87
- package/tests/analytics.test.ts +0 -119
- package/tests/cli-integration.test.ts +0 -187
- package/tests/map-reduce.test.ts +0 -223
- package/tests/readers-writers.test.ts +0 -189
- package/tests/transforms.test.ts +0 -199
- package/tsconfig.json +0 -21
- package/vitest.config.ts +0 -9
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Readable } from "node:stream";
|
|
2
|
+
import type { DataStream, InspectionMetadata, ReaderOptions, TabularReader } from "../core/types.js";
|
|
3
|
+
export interface ParquetReaderOptions extends ReaderOptions {
|
|
4
|
+
filePath?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* High-performance pure-JS Parquet Reader supporting Snappy, Zstd, Gzip, and Brotli decompression.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ParquetReader implements TabularReader {
|
|
10
|
+
private input;
|
|
11
|
+
private options;
|
|
12
|
+
constructor(input: Readable | string, options?: ParquetReaderOptions);
|
|
13
|
+
private getArrayBuffer;
|
|
14
|
+
read(options?: ReaderOptions): DataStream;
|
|
15
|
+
inspect(options?: ReaderOptions): Promise<InspectionMetadata>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=parquet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parquet.d.ts","sourceRoot":"","sources":["../../src/readers/parquet.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAI5C,OAAO,KAAK,EAGV,UAAU,EACV,kBAAkB,EAClB,aAAa,EAEb,aAAa,EACd,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,oBAAqB,SAAQ,aAAa;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAgDD;;GAEG;AACH,qBAAa,aAAc,YAAW,aAAa;IACjD,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,OAAO,CAAuB;gBAE1B,KAAK,EAAE,QAAQ,GAAG,MAAM,EAAE,OAAO,GAAE,oBAAyB;YAQ1D,cAAc;IAerB,IAAI,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,UAAU;IAyD1C,OAAO,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAoBpE"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { parquetMetadataAsync, parquetReadObjects } from "hyparquet";
|
|
3
|
+
import { compressors } from "hyparquet-compressors";
|
|
4
|
+
import { ParseError } from "../core/errors.js";
|
|
5
|
+
/**
|
|
6
|
+
* Maps Parquet primitive and logical types to Rowpipe ColumnType.
|
|
7
|
+
*/
|
|
8
|
+
function mapParquetType(parquetType) {
|
|
9
|
+
if (!parquetType)
|
|
10
|
+
return "mixed";
|
|
11
|
+
switch (parquetType) {
|
|
12
|
+
case "BOOLEAN":
|
|
13
|
+
return "boolean";
|
|
14
|
+
case "INT32":
|
|
15
|
+
case "INT64":
|
|
16
|
+
return "integer";
|
|
17
|
+
case "FLOAT":
|
|
18
|
+
case "DOUBLE":
|
|
19
|
+
return "number";
|
|
20
|
+
case "BYTE_ARRAY":
|
|
21
|
+
case "FIXED_LEN_BYTE_ARRAY":
|
|
22
|
+
case "UTF8":
|
|
23
|
+
return "string";
|
|
24
|
+
case "INT96":
|
|
25
|
+
case "DATE":
|
|
26
|
+
case "TIME_MILLIS":
|
|
27
|
+
case "TIME_MICROS":
|
|
28
|
+
case "TIMESTAMP_MILLIS":
|
|
29
|
+
case "TIMESTAMP_MICROS":
|
|
30
|
+
return "datetime";
|
|
31
|
+
default:
|
|
32
|
+
return "mixed";
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Normalizes values returned by Parquet reader (e.g. converting BigInt to Number).
|
|
37
|
+
*/
|
|
38
|
+
function normalizeParquetValue(val) {
|
|
39
|
+
if (typeof val === "bigint") {
|
|
40
|
+
if (val <= BigInt(Number.MAX_SAFE_INTEGER) && val >= BigInt(Number.MIN_SAFE_INTEGER)) {
|
|
41
|
+
return Number(val);
|
|
42
|
+
}
|
|
43
|
+
return Number(val);
|
|
44
|
+
}
|
|
45
|
+
if (val instanceof Uint8Array) {
|
|
46
|
+
return new TextDecoder().decode(val);
|
|
47
|
+
}
|
|
48
|
+
return val;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* High-performance pure-JS Parquet Reader supporting Snappy, Zstd, Gzip, and Brotli decompression.
|
|
52
|
+
*/
|
|
53
|
+
export class ParquetReader {
|
|
54
|
+
input;
|
|
55
|
+
options;
|
|
56
|
+
constructor(input, options = {}) {
|
|
57
|
+
this.input = input;
|
|
58
|
+
this.options = { ...options };
|
|
59
|
+
if (typeof input === "string") {
|
|
60
|
+
this.options.filePath = input;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async getArrayBuffer() {
|
|
64
|
+
if (typeof this.input === "string") {
|
|
65
|
+
const buf = await readFile(this.input);
|
|
66
|
+
return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
|
|
67
|
+
}
|
|
68
|
+
// Readable stream: collect chunks into single Buffer
|
|
69
|
+
const chunks = [];
|
|
70
|
+
for await (const chunk of this.input) {
|
|
71
|
+
chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
|
|
72
|
+
}
|
|
73
|
+
const combined = Buffer.concat(chunks);
|
|
74
|
+
return combined.buffer.slice(combined.byteOffset, combined.byteOffset + combined.byteLength);
|
|
75
|
+
}
|
|
76
|
+
async *read(options) {
|
|
77
|
+
const mergedOptions = {
|
|
78
|
+
...this.options,
|
|
79
|
+
...options,
|
|
80
|
+
};
|
|
81
|
+
const batchSize = Math.max(1, mergedOptions.batchSize ?? 1000);
|
|
82
|
+
let arrayBuffer;
|
|
83
|
+
try {
|
|
84
|
+
arrayBuffer = await this.getArrayBuffer();
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
throw new ParseError(`Failed to load Parquet data: ${err.message}`, {
|
|
88
|
+
file: mergedOptions.filePath,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
let rows;
|
|
92
|
+
try {
|
|
93
|
+
rows = (await parquetReadObjects({
|
|
94
|
+
file: arrayBuffer,
|
|
95
|
+
compressors,
|
|
96
|
+
}));
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
throw new ParseError(`Failed to parse Parquet file: ${err.message}`, {
|
|
100
|
+
file: mergedOptions.filePath,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
let currentBatch = [];
|
|
104
|
+
let globalOffset = 0;
|
|
105
|
+
for (let i = 0; i < rows.length; i++) {
|
|
106
|
+
const rawRow = rows[i];
|
|
107
|
+
const normalizedRow = {};
|
|
108
|
+
for (const [key, val] of Object.entries(rawRow)) {
|
|
109
|
+
normalizedRow[key] = normalizeParquetValue(val);
|
|
110
|
+
}
|
|
111
|
+
currentBatch.push(normalizedRow);
|
|
112
|
+
if (currentBatch.length >= batchSize) {
|
|
113
|
+
yield {
|
|
114
|
+
rows: currentBatch,
|
|
115
|
+
offset: globalOffset,
|
|
116
|
+
};
|
|
117
|
+
globalOffset += currentBatch.length;
|
|
118
|
+
currentBatch = [];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (currentBatch.length > 0) {
|
|
122
|
+
yield {
|
|
123
|
+
rows: currentBatch,
|
|
124
|
+
offset: globalOffset,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async inspect(options) {
|
|
129
|
+
const arrayBuffer = await this.getArrayBuffer();
|
|
130
|
+
const meta = await parquetMetadataAsync(arrayBuffer);
|
|
131
|
+
const rowCount = typeof meta.num_rows === "bigint" ? Number(meta.num_rows) : Number(meta.num_rows || 0);
|
|
132
|
+
const schemaColumns = (meta.schema || []).filter((s) => s.name && s.name !== "root");
|
|
133
|
+
const columns = schemaColumns.map((col) => ({
|
|
134
|
+
name: col.name,
|
|
135
|
+
type: mapParquetType(col.type),
|
|
136
|
+
nullPercentage: 0,
|
|
137
|
+
}));
|
|
138
|
+
return {
|
|
139
|
+
format: "Parquet",
|
|
140
|
+
rowCount,
|
|
141
|
+
columnCount: columns.length,
|
|
142
|
+
columns,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=parquet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parquet.js","sourceRoot":"","sources":["../../src/readers/parquet.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,38 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type Readable, type Writable } from "node:stream";
|
|
2
2
|
/**
|
|
3
|
-
* Checks if a
|
|
3
|
+
* Checks if a given file path indicates gzip compression.
|
|
4
4
|
*/
|
|
5
5
|
export declare function isGzipPath(filePath: string): boolean;
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* Strips compression extensions to inspect the underlying format extension.
|
|
8
8
|
*/
|
|
9
|
-
export declare function
|
|
9
|
+
export declare function stripCompressionExtension(filePath: string): string;
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
11
|
+
* Opens a readable stream for a file or wraps an existing stream with Gunzip if compressed.
|
|
12
12
|
*/
|
|
13
|
-
export declare function
|
|
13
|
+
export declare function openDecompressedReadStream(input: Readable | string, options?: {
|
|
14
|
+
gzip?: boolean;
|
|
15
|
+
}): Readable;
|
|
16
|
+
/**
|
|
17
|
+
* Opens a writable stream for a file or wraps an existing stream with Gzip if compressed.
|
|
18
|
+
*/
|
|
19
|
+
export declare function openCompressedWriteStream(output: Writable | string, options?: {
|
|
20
|
+
gzip?: boolean;
|
|
21
|
+
}): Writable;
|
|
22
|
+
/**
|
|
23
|
+
* Safely flushes and closes a writable stream, waiting for underlying file descriptors to finish.
|
|
24
|
+
*/
|
|
25
|
+
export declare function closeWritableStream(stream?: Writable): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Opens a readable stream from a file path or stdin ("-"), with transparent GZIP decompression.
|
|
28
|
+
*/
|
|
29
|
+
export declare function openReadableStream(inputPath?: string, options?: {
|
|
30
|
+
gzip?: boolean;
|
|
31
|
+
}): Readable;
|
|
32
|
+
/**
|
|
33
|
+
* Opens a writable stream to a file path or stdout ("-"), with transparent GZIP compression.
|
|
34
|
+
*/
|
|
35
|
+
export declare function openWritableStream(outputPath?: string, options?: {
|
|
36
|
+
gzip?: boolean;
|
|
37
|
+
}): Writable;
|
|
14
38
|
//# sourceMappingURL=compression.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compression.d.ts","sourceRoot":"","sources":["../../src/utils/compression.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"compression.d.ts","sourceRoot":"","sources":["../../src/utils/compression.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG3D;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGpD;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAElE;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,QAAQ,GAAG,MAAM,EACxB,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/B,QAAQ,CAuBV;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,QAAQ,GAAG,MAAM,EACzB,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/B,QAAQ,CA8BV;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB1E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,SAAM,EACf,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/B,QAAQ,CAEV;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,SAAM,EAChB,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/B,QAAQ,CAEV"}
|
|
@@ -1,38 +1,115 @@
|
|
|
1
1
|
import { createReadStream, createWriteStream } from "node:fs";
|
|
2
2
|
import { createGzip, createGunzip } from "node:zlib";
|
|
3
3
|
/**
|
|
4
|
-
* Checks if a
|
|
4
|
+
* Checks if a given file path indicates gzip compression.
|
|
5
5
|
*/
|
|
6
6
|
export function isGzipPath(filePath) {
|
|
7
|
-
|
|
7
|
+
const lower = filePath.toLowerCase();
|
|
8
|
+
return lower.endsWith(".gz") || lower.endsWith(".gzip");
|
|
8
9
|
}
|
|
9
10
|
/**
|
|
10
|
-
*
|
|
11
|
+
* Strips compression extensions to inspect the underlying format extension.
|
|
11
12
|
*/
|
|
12
|
-
export function
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
export function stripCompressionExtension(filePath) {
|
|
14
|
+
return filePath.replace(/\.(gz|gzip)$/i, "");
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Opens a readable stream for a file or wraps an existing stream with Gunzip if compressed.
|
|
18
|
+
*/
|
|
19
|
+
export function openDecompressedReadStream(input, options = {}) {
|
|
20
|
+
if (typeof input === "string") {
|
|
21
|
+
if (input === "-") {
|
|
22
|
+
if (options.gzip === true) {
|
|
23
|
+
const gunzip = createGunzip();
|
|
24
|
+
return process.stdin.pipe(gunzip);
|
|
25
|
+
}
|
|
26
|
+
return process.stdin;
|
|
27
|
+
}
|
|
28
|
+
const rawStream = createReadStream(input);
|
|
29
|
+
if (options.gzip === true || isGzipPath(input)) {
|
|
30
|
+
const gunzip = createGunzip();
|
|
31
|
+
return rawStream.pipe(gunzip);
|
|
32
|
+
}
|
|
33
|
+
return rawStream;
|
|
15
34
|
}
|
|
16
|
-
|
|
17
|
-
if (isGzipPath(filePath)) {
|
|
35
|
+
if (options.gzip === true) {
|
|
18
36
|
const gunzip = createGunzip();
|
|
19
|
-
return
|
|
37
|
+
return input.pipe(gunzip);
|
|
20
38
|
}
|
|
21
|
-
return
|
|
39
|
+
return input;
|
|
22
40
|
}
|
|
23
41
|
/**
|
|
24
|
-
*
|
|
42
|
+
* Opens a writable stream for a file or wraps an existing stream with Gzip if compressed.
|
|
25
43
|
*/
|
|
26
|
-
export function
|
|
27
|
-
if (
|
|
28
|
-
|
|
44
|
+
export function openCompressedWriteStream(output, options = {}) {
|
|
45
|
+
if (typeof output === "string") {
|
|
46
|
+
if (output === "-" || !output) {
|
|
47
|
+
if (options.gzip === true) {
|
|
48
|
+
const gzip = createGzip();
|
|
49
|
+
gzip.pipe(process.stdout);
|
|
50
|
+
return gzip;
|
|
51
|
+
}
|
|
52
|
+
return process.stdout;
|
|
53
|
+
}
|
|
54
|
+
const isGz = options.gzip === true || isGzipPath(output);
|
|
55
|
+
if (isGz) {
|
|
56
|
+
const destStream = createWriteStream(output);
|
|
57
|
+
const gzip = createGzip();
|
|
58
|
+
gzip.__destStream = destStream;
|
|
59
|
+
gzip.pipe(destStream);
|
|
60
|
+
return gzip;
|
|
61
|
+
}
|
|
62
|
+
return createWriteStream(output);
|
|
29
63
|
}
|
|
30
|
-
|
|
31
|
-
if (isGzipPath(filePath)) {
|
|
64
|
+
if (options.gzip === true) {
|
|
32
65
|
const gzip = createGzip();
|
|
33
|
-
gzip.
|
|
66
|
+
gzip.__destStream = output;
|
|
67
|
+
gzip.pipe(output);
|
|
34
68
|
return gzip;
|
|
35
69
|
}
|
|
36
|
-
return
|
|
70
|
+
return output;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Safely flushes and closes a writable stream, waiting for underlying file descriptors to finish.
|
|
74
|
+
*/
|
|
75
|
+
export async function closeWritableStream(stream) {
|
|
76
|
+
if (!stream)
|
|
77
|
+
return;
|
|
78
|
+
const destStream = stream.__destStream;
|
|
79
|
+
await new Promise((resolve, reject) => {
|
|
80
|
+
if (destStream) {
|
|
81
|
+
let isDone = false;
|
|
82
|
+
const done = (err) => {
|
|
83
|
+
if (isDone)
|
|
84
|
+
return;
|
|
85
|
+
isDone = true;
|
|
86
|
+
if (err)
|
|
87
|
+
reject(err);
|
|
88
|
+
else
|
|
89
|
+
resolve();
|
|
90
|
+
};
|
|
91
|
+
destStream.once("finish", done);
|
|
92
|
+
destStream.once("close", done);
|
|
93
|
+
destStream.once("error", done);
|
|
94
|
+
stream.once("error", done);
|
|
95
|
+
stream.end();
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
stream.end(() => resolve());
|
|
99
|
+
stream.once("error", reject);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Opens a readable stream from a file path or stdin ("-"), with transparent GZIP decompression.
|
|
105
|
+
*/
|
|
106
|
+
export function openReadableStream(inputPath = "-", options = {}) {
|
|
107
|
+
return openDecompressedReadStream(inputPath, options);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Opens a writable stream to a file path or stdout ("-"), with transparent GZIP compression.
|
|
111
|
+
*/
|
|
112
|
+
export function openWritableStream(outputPath = "-", options = {}) {
|
|
113
|
+
return openCompressedWriteStream(outputPath, options);
|
|
37
114
|
}
|
|
38
115
|
//# sourceMappingURL=compression.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compression.js","sourceRoot":"","sources":["../../src/utils/compression.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE9D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAErD;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,
|
|
1
|
+
{"version":3,"file":"compression.js","sourceRoot":"","sources":["../../src/utils/compression.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csv.d.ts","sourceRoot":"","sources":["../../src/writers/csv.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjF,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,SAAU,YAAW,aAAa;IAC7C,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,aAAa,CAAC,CAAW;gBAErB,MAAM,EAAE,QAAQ,GAAG,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAKrE,OAAO,CAAC,eAAe;
|
|
1
|
+
{"version":3,"file":"csv.d.ts","sourceRoot":"","sources":["../../src/writers/csv.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjF,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,SAAU,YAAW,aAAa;IAC7C,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,aAAa,CAAC,CAAW;gBAErB,MAAM,EAAE,QAAQ,GAAG,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAKrE,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,WAAW;YAiBL,UAAU;IAMlB,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA+CrE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B"}
|
package/dist/writers/csv.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { closeWritableStream, openCompressedWriteStream } from "../utils/compression.js";
|
|
2
2
|
export class CSVWriter {
|
|
3
3
|
output;
|
|
4
4
|
options;
|
|
@@ -7,18 +7,19 @@ export class CSVWriter {
|
|
|
7
7
|
this.output = output;
|
|
8
8
|
this.options = { ...options };
|
|
9
9
|
}
|
|
10
|
-
getOutputStream() {
|
|
10
|
+
getOutputStream(opts) {
|
|
11
|
+
const gzip = opts?.gzip ?? this.options.gzip;
|
|
12
|
+
const stream = openCompressedWriteStream(this.output, { gzip });
|
|
11
13
|
if (typeof this.output === "string") {
|
|
12
|
-
this.createdStream =
|
|
13
|
-
return this.createdStream;
|
|
14
|
+
this.createdStream = stream;
|
|
14
15
|
}
|
|
15
|
-
return
|
|
16
|
+
return stream;
|
|
16
17
|
}
|
|
17
18
|
escapeField(value, delimiter) {
|
|
18
19
|
if (value === null || value === undefined) {
|
|
19
20
|
return "";
|
|
20
21
|
}
|
|
21
|
-
const str = String(value);
|
|
22
|
+
const str = typeof value === "object" ? JSON.stringify(value) : String(value);
|
|
22
23
|
const mustQuote = str.includes(delimiter) ||
|
|
23
24
|
str.includes('"') ||
|
|
24
25
|
str.includes("\n") ||
|
|
@@ -40,7 +41,7 @@ export class CSVWriter {
|
|
|
40
41
|
};
|
|
41
42
|
const delimiter = mergedOptions.delimiter ?? ",";
|
|
42
43
|
const writeHeader = mergedOptions.header !== false;
|
|
43
|
-
const outStream = this.getOutputStream();
|
|
44
|
+
const outStream = this.getOutputStream(mergedOptions);
|
|
44
45
|
let headers = null;
|
|
45
46
|
for await (const batch of dataStream) {
|
|
46
47
|
if (batch.rows.length === 0)
|
|
@@ -74,10 +75,7 @@ export class CSVWriter {
|
|
|
74
75
|
}
|
|
75
76
|
async close() {
|
|
76
77
|
if (this.createdStream) {
|
|
77
|
-
await
|
|
78
|
-
this.createdStream.end(() => resolve());
|
|
79
|
-
this.createdStream.on("error", reject);
|
|
80
|
-
});
|
|
78
|
+
await closeWritableStream(this.createdStream);
|
|
81
79
|
}
|
|
82
80
|
}
|
|
83
81
|
}
|
package/dist/writers/csv.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csv.js","sourceRoot":"","sources":["../../src/writers/csv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"csv.js","sourceRoot":"","sources":["../../src/writers/csv.ts"],"names":[],"mappings":"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"}
|
package/dist/writers/index.d.ts
CHANGED
|
@@ -3,6 +3,8 @@ import type { TabularWriter, WriterOptions } from "../core/types.js";
|
|
|
3
3
|
export * from "./csv.js";
|
|
4
4
|
export * from "./json.js";
|
|
5
5
|
export * from "./jsonl.js";
|
|
6
|
+
export * from "./markdown.js";
|
|
7
|
+
export * from "./parquet.js";
|
|
6
8
|
export * from "./xlsx.js";
|
|
7
9
|
/**
|
|
8
10
|
* Infers format name from file path or extension.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/writers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,KAAK,EAAiB,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/writers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,KAAK,EAAiB,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AASpF,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AA+E1B;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQnE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,QAAQ,GAAG,MAAM,EACzB,OAAO,GAAE,aAAa,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAChD,aAAa,CAmBf"}
|
package/dist/writers/index.js
CHANGED
|
@@ -1,28 +1,73 @@
|
|
|
1
1
|
import { InvalidArgumentError } from "../core/errors.js";
|
|
2
|
+
import { stripCompressionExtension } from "../utils/compression.js";
|
|
2
3
|
import { CSVWriter } from "./csv.js";
|
|
3
4
|
import { JSONWriter } from "./json.js";
|
|
4
5
|
import { JSONLWriter } from "./jsonl.js";
|
|
6
|
+
import { MarkdownWriter } from "./markdown.js";
|
|
7
|
+
import { ParquetWriter } from "./parquet.js";
|
|
5
8
|
import { XLSXWriter } from "./xlsx.js";
|
|
6
9
|
export * from "./csv.js";
|
|
7
10
|
export * from "./json.js";
|
|
8
11
|
export * from "./jsonl.js";
|
|
12
|
+
export * from "./markdown.js";
|
|
13
|
+
export * from "./parquet.js";
|
|
9
14
|
export * from "./xlsx.js";
|
|
10
15
|
const adapters = {
|
|
11
16
|
csv: {
|
|
12
17
|
name: "CSV",
|
|
13
|
-
extensions: [".csv", ".
|
|
18
|
+
extensions: [".csv", ".txt"],
|
|
14
19
|
createReader: () => {
|
|
15
20
|
throw new Error("Reader adapter called from writer");
|
|
16
21
|
},
|
|
17
22
|
createWriter: (output, options) => new CSVWriter(output, options),
|
|
18
23
|
},
|
|
24
|
+
tsv: {
|
|
25
|
+
name: "TSV",
|
|
26
|
+
extensions: [".tsv", ".tab"],
|
|
27
|
+
createReader: () => {
|
|
28
|
+
throw new Error("Reader adapter called from writer");
|
|
29
|
+
},
|
|
30
|
+
createWriter: (output, options) => new CSVWriter(output, { ...options, delimiter: options?.delimiter ?? "\t" }),
|
|
31
|
+
},
|
|
32
|
+
psv: {
|
|
33
|
+
name: "PSV",
|
|
34
|
+
extensions: [".psv"],
|
|
35
|
+
createReader: () => {
|
|
36
|
+
throw new Error("Reader adapter called from writer");
|
|
37
|
+
},
|
|
38
|
+
createWriter: (output, options) => new CSVWriter(output, { ...options, delimiter: options?.delimiter ?? "|" }),
|
|
39
|
+
},
|
|
40
|
+
markdown: {
|
|
41
|
+
name: "Markdown",
|
|
42
|
+
extensions: [".md", ".markdown"],
|
|
43
|
+
createReader: () => {
|
|
44
|
+
throw new Error("Reader adapter called from writer");
|
|
45
|
+
},
|
|
46
|
+
createWriter: (output, options) => new MarkdownWriter(output, options),
|
|
47
|
+
},
|
|
48
|
+
md: {
|
|
49
|
+
name: "Markdown",
|
|
50
|
+
extensions: [".md"],
|
|
51
|
+
createReader: () => {
|
|
52
|
+
throw new Error("Reader adapter called from writer");
|
|
53
|
+
},
|
|
54
|
+
createWriter: (output, options) => new MarkdownWriter(output, options),
|
|
55
|
+
},
|
|
56
|
+
parquet: {
|
|
57
|
+
name: "Parquet",
|
|
58
|
+
extensions: [".parquet", ".pq"],
|
|
59
|
+
createReader: () => {
|
|
60
|
+
throw new Error("Reader adapter called from writer");
|
|
61
|
+
},
|
|
62
|
+
createWriter: (output, options) => new ParquetWriter(output, options),
|
|
63
|
+
},
|
|
19
64
|
json: {
|
|
20
65
|
name: "JSON",
|
|
21
66
|
extensions: [".json"],
|
|
22
67
|
createReader: () => {
|
|
23
68
|
throw new Error("Reader adapter called from writer");
|
|
24
69
|
},
|
|
25
|
-
createWriter: (output) => new JSONWriter(output),
|
|
70
|
+
createWriter: (output, options) => new JSONWriter(output),
|
|
26
71
|
},
|
|
27
72
|
jsonl: {
|
|
28
73
|
name: "JSONL",
|
|
@@ -30,7 +75,7 @@ const adapters = {
|
|
|
30
75
|
createReader: () => {
|
|
31
76
|
throw new Error("Reader adapter called from writer");
|
|
32
77
|
},
|
|
33
|
-
createWriter: (output) => new JSONLWriter(output),
|
|
78
|
+
createWriter: (output, options) => new JSONLWriter(output),
|
|
34
79
|
},
|
|
35
80
|
xlsx: {
|
|
36
81
|
name: "XLSX",
|
|
@@ -45,7 +90,7 @@ const adapters = {
|
|
|
45
90
|
* Infers format name from file path or extension.
|
|
46
91
|
*/
|
|
47
92
|
export function inferFormatFromPath(filePath) {
|
|
48
|
-
const cleanPath = filePath.toLowerCase()
|
|
93
|
+
const cleanPath = stripCompressionExtension(filePath.toLowerCase());
|
|
49
94
|
for (const [format, adapter] of Object.entries(adapters)) {
|
|
50
95
|
if (adapter.extensions.some((ext) => cleanPath.endsWith(ext))) {
|
|
51
96
|
return format;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/writers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAE1B,MAAM,QAAQ,GAAkC;IAC9C,GAAG,EAAE;QACH,IAAI,EAAE,KAAK;QACX,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/writers/index.ts"],"names":[],"mappings":"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"}
|
package/dist/writers/json.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export declare class JSONWriter implements TabularWriter {
|
|
|
6
6
|
constructor(output: Writable | string);
|
|
7
7
|
private getOutputStream;
|
|
8
8
|
private writeChunk;
|
|
9
|
-
write(dataStream: DataStream,
|
|
9
|
+
write(dataStream: DataStream, options?: WriterOptions): Promise<void>;
|
|
10
10
|
close(): Promise<void>;
|
|
11
11
|
}
|
|
12
12
|
//# sourceMappingURL=json.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/writers/json.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjF,qBAAa,UAAW,YAAW,aAAa;IAC9C,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,aAAa,CAAC,CAAW;gBAErB,MAAM,EAAE,QAAQ,GAAG,MAAM;IAIrC,OAAO,CAAC,eAAe;
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/writers/json.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjF,qBAAa,UAAW,YAAW,aAAa;IAC9C,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,aAAa,CAAC,CAAW;gBAErB,MAAM,EAAE,QAAQ,GAAG,MAAM;IAIrC,OAAO,CAAC,eAAe;YAST,UAAU;IAMlB,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBrE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B"}
|
package/dist/writers/json.js
CHANGED
|
@@ -1,24 +1,25 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { closeWritableStream, openCompressedWriteStream } from "../utils/compression.js";
|
|
2
2
|
export class JSONWriter {
|
|
3
3
|
output;
|
|
4
4
|
createdStream;
|
|
5
5
|
constructor(output) {
|
|
6
6
|
this.output = output;
|
|
7
7
|
}
|
|
8
|
-
getOutputStream() {
|
|
8
|
+
getOutputStream(opts) {
|
|
9
|
+
const gzip = opts?.gzip;
|
|
10
|
+
const stream = openCompressedWriteStream(this.output, { gzip });
|
|
9
11
|
if (typeof this.output === "string") {
|
|
10
|
-
this.createdStream =
|
|
11
|
-
return this.createdStream;
|
|
12
|
+
this.createdStream = stream;
|
|
12
13
|
}
|
|
13
|
-
return
|
|
14
|
+
return stream;
|
|
14
15
|
}
|
|
15
16
|
async writeChunk(stream, data) {
|
|
16
17
|
if (!stream.write(data)) {
|
|
17
18
|
await new Promise((resolve) => stream.once("drain", resolve));
|
|
18
19
|
}
|
|
19
20
|
}
|
|
20
|
-
async write(dataStream,
|
|
21
|
-
const outStream = this.getOutputStream();
|
|
21
|
+
async write(dataStream, options) {
|
|
22
|
+
const outStream = this.getOutputStream(options);
|
|
22
23
|
let isFirstRow = true;
|
|
23
24
|
await this.writeChunk(outStream, "[\n");
|
|
24
25
|
for await (const batch of dataStream) {
|
|
@@ -32,10 +33,7 @@ export class JSONWriter {
|
|
|
32
33
|
}
|
|
33
34
|
async close() {
|
|
34
35
|
if (this.createdStream) {
|
|
35
|
-
await
|
|
36
|
-
this.createdStream.end(() => resolve());
|
|
37
|
-
this.createdStream.on("error", reject);
|
|
38
|
-
});
|
|
36
|
+
await closeWritableStream(this.createdStream);
|
|
39
37
|
}
|
|
40
38
|
}
|
|
41
39
|
}
|