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.
Files changed (106) hide show
  1. package/README.md +25 -32
  2. package/dist/cli/index.js +4 -4
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/core/types.d.ts +2 -0
  5. package/dist/core/types.d.ts.map +1 -1
  6. package/dist/index.d.ts +2 -2
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +2 -2
  9. package/dist/index.js.map +1 -1
  10. package/dist/readers/csv.d.ts.map +1 -1
  11. package/dist/readers/csv.js +28 -16
  12. package/dist/readers/csv.js.map +1 -1
  13. package/dist/readers/index.d.ts +1 -0
  14. package/dist/readers/index.d.ts.map +1 -1
  15. package/dist/readers/index.js +29 -3
  16. package/dist/readers/index.js.map +1 -1
  17. package/dist/readers/json.d.ts.map +1 -1
  18. package/dist/readers/json.js +6 -8
  19. package/dist/readers/json.js.map +1 -1
  20. package/dist/readers/jsonl.d.ts.map +1 -1
  21. package/dist/readers/jsonl.js +5 -7
  22. package/dist/readers/jsonl.js.map +1 -1
  23. package/dist/readers/parquet.d.ts +17 -0
  24. package/dist/readers/parquet.d.ts.map +1 -0
  25. package/dist/readers/parquet.js +146 -0
  26. package/dist/readers/parquet.js.map +1 -0
  27. package/dist/utils/compression.d.ts +30 -6
  28. package/dist/utils/compression.d.ts.map +1 -1
  29. package/dist/utils/compression.js +95 -18
  30. package/dist/utils/compression.js.map +1 -1
  31. package/dist/writers/csv.d.ts.map +1 -1
  32. package/dist/writers/csv.js +9 -11
  33. package/dist/writers/csv.js.map +1 -1
  34. package/dist/writers/index.d.ts +2 -0
  35. package/dist/writers/index.d.ts.map +1 -1
  36. package/dist/writers/index.js +49 -4
  37. package/dist/writers/index.js.map +1 -1
  38. package/dist/writers/json.d.ts +1 -1
  39. package/dist/writers/json.d.ts.map +1 -1
  40. package/dist/writers/json.js +9 -11
  41. package/dist/writers/json.js.map +1 -1
  42. package/dist/writers/jsonl.d.ts +1 -1
  43. package/dist/writers/jsonl.d.ts.map +1 -1
  44. package/dist/writers/jsonl.js +9 -11
  45. package/dist/writers/jsonl.js.map +1 -1
  46. package/dist/writers/markdown.d.ts +21 -0
  47. package/dist/writers/markdown.d.ts.map +1 -0
  48. package/dist/writers/markdown.js +82 -0
  49. package/dist/writers/markdown.js.map +1 -0
  50. package/dist/writers/parquet.d.ts +19 -0
  51. package/dist/writers/parquet.d.ts.map +1 -0
  52. package/dist/writers/parquet.js +129 -0
  53. package/dist/writers/parquet.js.map +1 -0
  54. package/package.json +13 -2
  55. package/skills/rowpipe/SKILL.md +181 -0
  56. package/benchmarks/memory-bench.ts +0 -109
  57. package/src/analytics/reduce.ts +0 -388
  58. package/src/analytics/schema-inference.ts +0 -217
  59. package/src/analytics/semantic-types.ts +0 -36
  60. package/src/analytics/stats.ts +0 -383
  61. package/src/analytics/validator.ts +0 -134
  62. package/src/cli/commands/cast.ts +0 -60
  63. package/src/cli/commands/convert.ts +0 -128
  64. package/src/cli/commands/filter.ts +0 -58
  65. package/src/cli/commands/inspect.ts +0 -193
  66. package/src/cli/commands/map.ts +0 -66
  67. package/src/cli/commands/reduce.ts +0 -74
  68. package/src/cli/commands/rename.ts +0 -59
  69. package/src/cli/commands/sample.ts +0 -61
  70. package/src/cli/commands/schema.ts +0 -86
  71. package/src/cli/commands/select.ts +0 -59
  72. package/src/cli/commands/stats.ts +0 -100
  73. package/src/cli/commands/validate.ts +0 -123
  74. package/src/cli/index.ts +0 -285
  75. package/src/core/batch.ts +0 -81
  76. package/src/core/errors.ts +0 -81
  77. package/src/core/pipeline.ts +0 -150
  78. package/src/core/types.ts +0 -110
  79. package/src/index.ts +0 -52
  80. package/src/readers/csv.ts +0 -302
  81. package/src/readers/index.ts +0 -88
  82. package/src/readers/json.ts +0 -256
  83. package/src/readers/jsonl.ts +0 -126
  84. package/src/readers/xlsx.ts +0 -182
  85. package/src/transforms/cast.ts +0 -212
  86. package/src/transforms/expression.ts +0 -1114
  87. package/src/transforms/filter.ts +0 -38
  88. package/src/transforms/map.ts +0 -99
  89. package/src/transforms/rename.ts +0 -47
  90. package/src/transforms/sample.ts +0 -57
  91. package/src/transforms/select.ts +0 -64
  92. package/src/utils/compression.ts +0 -43
  93. package/src/utils/formatting.ts +0 -75
  94. package/src/utils/progress.ts +0 -37
  95. package/src/writers/csv.ts +0 -106
  96. package/src/writers/index.ts +0 -87
  97. package/src/writers/json.ts +0 -52
  98. package/src/writers/jsonl.ts +0 -49
  99. package/src/writers/xlsx.ts +0 -87
  100. package/tests/analytics.test.ts +0 -119
  101. package/tests/cli-integration.test.ts +0 -187
  102. package/tests/map-reduce.test.ts +0 -223
  103. package/tests/readers-writers.test.ts +0 -189
  104. package/tests/transforms.test.ts +0 -199
  105. package/tsconfig.json +0 -21
  106. 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 { Readable, Writable } from "node:stream";
1
+ import { type Readable, type Writable } from "node:stream";
2
2
  /**
3
- * Checks if a path or filename indicates gzip compression.
3
+ * Checks if a given file path indicates gzip compression.
4
4
  */
5
5
  export declare function isGzipPath(filePath: string): boolean;
6
6
  /**
7
- * Creates a readable stream, automatically piping through gunzip if the path ends with .gz.
7
+ * Strips compression extensions to inspect the underlying format extension.
8
8
  */
9
- export declare function openReadableStream(filePath: string): Readable;
9
+ export declare function stripCompressionExtension(filePath: string): string;
10
10
  /**
11
- * Creates a writable stream, automatically piping through gzip if the path ends with .gz.
11
+ * Opens a readable stream for a file or wraps an existing stream with Gunzip if compressed.
12
12
  */
13
- export declare function openWritableStream(filePath: string): Writable;
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,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGtD;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAW7D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAY7D"}
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 path or filename indicates gzip compression.
4
+ * Checks if a given file path indicates gzip compression.
5
5
  */
6
6
  export function isGzipPath(filePath) {
7
- return filePath.toLowerCase().endsWith(".gz");
7
+ const lower = filePath.toLowerCase();
8
+ return lower.endsWith(".gz") || lower.endsWith(".gzip");
8
9
  }
9
10
  /**
10
- * Creates a readable stream, automatically piping through gunzip if the path ends with .gz.
11
+ * Strips compression extensions to inspect the underlying format extension.
11
12
  */
12
- export function openReadableStream(filePath) {
13
- if (filePath === "-") {
14
- return process.stdin;
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
- const rawStream = createReadStream(filePath);
17
- if (isGzipPath(filePath)) {
35
+ if (options.gzip === true) {
18
36
  const gunzip = createGunzip();
19
- return rawStream.pipe(gunzip);
37
+ return input.pipe(gunzip);
20
38
  }
21
- return rawStream;
39
+ return input;
22
40
  }
23
41
  /**
24
- * Creates a writable stream, automatically piping through gzip if the path ends with .gz.
42
+ * Opens a writable stream for a file or wraps an existing stream with Gzip if compressed.
25
43
  */
26
- export function openWritableStream(filePath) {
27
- if (filePath === "-") {
28
- return process.stdout;
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
- const fileStream = createWriteStream(filePath);
31
- if (isGzipPath(filePath)) {
64
+ if (options.gzip === true) {
32
65
  const gzip = createGzip();
33
- gzip.pipe(fileStream);
66
+ gzip.__destStream = output;
67
+ gzip.pipe(output);
34
68
  return gzip;
35
69
  }
36
- return fileStream;
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,OAAO,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;QACrB,OAAO,OAAO,CAAC,KAAK,CAAC;IACvB,CAAC;IAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;QACrB,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
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;IAQvB,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;CAQ7B"}
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"}
@@ -1,4 +1,4 @@
1
- import { createWriteStream } from "node:fs";
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 = createWriteStream(this.output);
13
- return this.createdStream;
14
+ this.createdStream = stream;
14
15
  }
15
- return this.output;
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 new Promise((resolve, reject) => {
78
- this.createdStream.end(() => resolve());
79
- this.createdStream.on("error", reject);
80
- });
78
+ await closeWritableStream(this.createdStream);
81
79
  }
82
80
  }
83
81
  }
@@ -1 +1 @@
1
- {"version":3,"file":"csv.js","sourceRoot":"","sources":["../../src/writers/csv.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"csv.js","sourceRoot":"","sources":["../../src/writers/csv.ts"],"names":[],"mappings":"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"}
@@ -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;AAMpF,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAqC1B;;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"}
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"}
@@ -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", ".tsv", ".txt"],
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().replace(/\.gz$/, "");
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":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/writers/index.ts"],"names":[],"mappings":"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"}
@@ -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, _options?: WriterOptions): Promise<void>;
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;YAQT,UAAU;IAMlB,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBtE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ7B"}
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"}
@@ -1,24 +1,25 @@
1
- import { createWriteStream } from "node:fs";
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 = createWriteStream(this.output);
11
- return this.createdStream;
12
+ this.createdStream = stream;
12
13
  }
13
- return this.output;
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, _options) {
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 new Promise((resolve, reject) => {
36
- this.createdStream.end(() => resolve());
37
- this.createdStream.on("error", reject);
38
- });
36
+ await closeWritableStream(this.createdStream);
39
37
  }
40
38
  }
41
39
  }