jtcsv 2.2.8 ā 3.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 +204 -115
- package/bin/jtcsv.ts +2612 -0
- package/browser.d.ts +142 -0
- package/dist/benchmark.js +446 -0
- package/dist/benchmark.js.map +1 -0
- package/dist/bin/jtcsv.js +1940 -0
- package/dist/bin/jtcsv.js.map +1 -0
- package/dist/csv-to-json.js +1262 -0
- package/dist/csv-to-json.js.map +1 -0
- package/dist/errors.js +291 -0
- package/dist/errors.js.map +1 -0
- package/dist/eslint.config.js +147 -0
- package/dist/eslint.config.js.map +1 -0
- package/dist/index-core.js +95 -0
- package/dist/index-core.js.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/json-save.js +229 -0
- package/dist/json-save.js.map +1 -0
- package/dist/json-to-csv.js +576 -0
- package/dist/json-to-csv.js.map +1 -0
- package/dist/jtcsv-core.cjs.js +1736 -0
- package/dist/jtcsv-core.cjs.js.map +1 -0
- package/dist/jtcsv-core.esm.js +1708 -0
- package/dist/jtcsv-core.esm.js.map +1 -0
- package/dist/jtcsv-core.umd.js +1742 -0
- package/dist/jtcsv-core.umd.js.map +1 -0
- package/dist/jtcsv-full.cjs.js +2241 -0
- package/dist/jtcsv-full.cjs.js.map +1 -0
- package/dist/jtcsv-full.esm.js +2209 -0
- package/dist/jtcsv-full.esm.js.map +1 -0
- package/dist/jtcsv-full.umd.js +2247 -0
- package/dist/jtcsv-full.umd.js.map +1 -0
- package/dist/jtcsv-workers.esm.js +768 -0
- package/dist/jtcsv-workers.esm.js.map +1 -0
- package/dist/jtcsv-workers.umd.js +782 -0
- package/dist/jtcsv-workers.umd.js.map +1 -0
- package/dist/jtcsv.cjs.js +1996 -2048
- package/dist/jtcsv.cjs.js.map +1 -1
- package/dist/jtcsv.esm.js +1992 -2048
- package/dist/jtcsv.esm.js.map +1 -1
- package/dist/jtcsv.umd.js +2157 -2209
- package/dist/jtcsv.umd.js.map +1 -1
- package/dist/plugins/express-middleware/index.js +350 -0
- package/dist/plugins/express-middleware/index.js.map +1 -0
- package/dist/plugins/fastify-plugin/index.js +315 -0
- package/dist/plugins/fastify-plugin/index.js.map +1 -0
- package/dist/plugins/hono/index.js +111 -0
- package/dist/plugins/hono/index.js.map +1 -0
- package/dist/plugins/nestjs/index.js +112 -0
- package/dist/plugins/nestjs/index.js.map +1 -0
- package/dist/plugins/nuxt/index.js +53 -0
- package/dist/plugins/nuxt/index.js.map +1 -0
- package/dist/plugins/remix/index.js +133 -0
- package/dist/plugins/remix/index.js.map +1 -0
- package/dist/plugins/sveltekit/index.js +155 -0
- package/dist/plugins/sveltekit/index.js.map +1 -0
- package/dist/plugins/trpc/index.js +136 -0
- package/dist/plugins/trpc/index.js.map +1 -0
- package/dist/run-demo.js +49 -0
- package/dist/run-demo.js.map +1 -0
- package/dist/src/browser/browser-functions.js +193 -0
- package/dist/src/browser/browser-functions.js.map +1 -0
- package/dist/src/browser/core.js +123 -0
- package/dist/src/browser/core.js.map +1 -0
- package/dist/src/browser/csv-to-json-browser.js +353 -0
- package/dist/src/browser/csv-to-json-browser.js.map +1 -0
- package/dist/src/browser/errors-browser.js +219 -0
- package/dist/src/browser/errors-browser.js.map +1 -0
- package/dist/src/browser/extensions/plugins.js +106 -0
- package/dist/src/browser/extensions/plugins.js.map +1 -0
- package/dist/src/browser/extensions/workers.js +66 -0
- package/dist/src/browser/extensions/workers.js.map +1 -0
- package/dist/src/browser/index.js +140 -0
- package/dist/src/browser/index.js.map +1 -0
- package/dist/src/browser/json-to-csv-browser.js +225 -0
- package/dist/src/browser/json-to-csv-browser.js.map +1 -0
- package/dist/src/browser/streams.js +340 -0
- package/dist/src/browser/streams.js.map +1 -0
- package/dist/src/browser/workers/csv-parser.worker.js +264 -0
- package/dist/src/browser/workers/csv-parser.worker.js.map +1 -0
- package/dist/src/browser/workers/worker-pool.js +338 -0
- package/dist/src/browser/workers/worker-pool.js.map +1 -0
- package/dist/src/core/delimiter-cache.js +196 -0
- package/dist/src/core/delimiter-cache.js.map +1 -0
- package/dist/src/core/node-optimizations.js +279 -0
- package/dist/src/core/node-optimizations.js.map +1 -0
- package/dist/src/core/plugin-system.js +399 -0
- package/dist/src/core/plugin-system.js.map +1 -0
- package/dist/src/core/transform-hooks.js +348 -0
- package/dist/src/core/transform-hooks.js.map +1 -0
- package/dist/src/engines/fast-path-engine-new.js +262 -0
- package/dist/src/engines/fast-path-engine-new.js.map +1 -0
- package/dist/src/engines/fast-path-engine.js +671 -0
- package/dist/src/engines/fast-path-engine.js.map +1 -0
- package/dist/src/errors.js +18 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/formats/ndjson-parser.js +332 -0
- package/dist/src/formats/ndjson-parser.js.map +1 -0
- package/dist/src/formats/tsv-parser.js +230 -0
- package/dist/src/formats/tsv-parser.js.map +1 -0
- package/dist/src/index-with-plugins.js +259 -0
- package/dist/src/index-with-plugins.js.map +1 -0
- package/dist/src/types/index.js +3 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/utils/bom-utils.js +267 -0
- package/dist/src/utils/bom-utils.js.map +1 -0
- package/dist/src/utils/encoding-support.js +77 -0
- package/dist/src/utils/encoding-support.js.map +1 -0
- package/dist/src/utils/schema-validator.js +609 -0
- package/dist/src/utils/schema-validator.js.map +1 -0
- package/dist/src/utils/transform-loader.js +281 -0
- package/dist/src/utils/transform-loader.js.map +1 -0
- package/dist/src/utils/validators.js +40 -0
- package/dist/src/utils/validators.js.map +1 -0
- package/dist/src/utils/zod-adapter.js +144 -0
- package/dist/src/utils/zod-adapter.js.map +1 -0
- package/dist/src/web-server/index.js +648 -0
- package/dist/src/web-server/index.js.map +1 -0
- package/dist/src/workers/csv-multithreaded.js +211 -0
- package/dist/src/workers/csv-multithreaded.js.map +1 -0
- package/dist/src/workers/csv-parser.worker.js +179 -0
- package/dist/src/workers/csv-parser.worker.js.map +1 -0
- package/dist/src/workers/worker-pool.js +228 -0
- package/dist/src/workers/worker-pool.js.map +1 -0
- package/dist/stream-csv-to-json.js +665 -0
- package/dist/stream-csv-to-json.js.map +1 -0
- package/dist/stream-json-to-csv.js +389 -0
- package/dist/stream-json-to-csv.js.map +1 -0
- package/examples/advanced/conditional-transformations.ts +446 -0
- package/examples/advanced/csv-parser.worker.ts +89 -0
- package/examples/advanced/nested-objects-example.ts +306 -0
- package/examples/advanced/performance-optimization.ts +504 -0
- package/examples/advanced/run-demo-server.ts +116 -0
- package/examples/advanced/web-worker-usage.html +874 -0
- package/examples/async-multithreaded-example.ts +335 -0
- package/examples/cli-advanced-usage.md +290 -0
- package/examples/{cli-batch-processing.js ā cli-batch-processing.ts} +38 -38
- package/examples/{cli-tool.js ā cli-tool.ts} +5 -8
- package/examples/{error-handling.js ā error-handling.ts} +356 -324
- package/examples/{express-api.js ā express-api.ts} +161 -164
- package/examples/{large-dataset-example.js ā large-dataset-example.ts} +201 -182
- package/examples/{ndjson-processing.js ā ndjson-processing.ts} +456 -434
- package/examples/{plugin-excel-exporter.js ā plugin-excel-exporter.ts} +6 -7
- package/examples/react-integration.tsx +637 -0
- package/examples/{schema-validation.js ā schema-validation.ts} +2 -2
- package/examples/simple-usage.ts +194 -0
- package/examples/{streaming-example.js ā streaming-example.ts} +12 -12
- package/index.d.ts +187 -18
- package/package.json +75 -81
- package/plugins.d.ts +37 -0
- package/schema.d.ts +103 -0
- package/src/browser/browser-functions.ts +402 -0
- package/src/browser/core.ts +152 -0
- package/src/browser/csv-to-json-browser.d.ts +3 -0
- package/src/browser/csv-to-json-browser.ts +494 -0
- package/src/browser/{errors-browser.js ā errors-browser.ts} +305 -197
- package/src/browser/extensions/plugins.ts +93 -0
- package/src/browser/extensions/workers.ts +39 -0
- package/src/browser/globals.d.ts +5 -0
- package/src/browser/index.ts +192 -0
- package/src/browser/json-to-csv-browser.d.ts +3 -0
- package/src/browser/json-to-csv-browser.ts +338 -0
- package/src/browser/streams.ts +403 -0
- package/src/browser/workers/{csv-parser.worker.js ā csv-parser.worker.ts} +3 -3
- package/src/browser/workers/{worker-pool.js ā worker-pool.ts} +51 -30
- package/src/core/delimiter-cache.ts +320 -0
- package/src/core/{node-optimizations.js ā node-optimizations.ts} +448 -407
- package/src/core/plugin-system.ts +588 -0
- package/src/core/transform-hooks.ts +566 -0
- package/src/engines/{fast-path-engine-new.js ā fast-path-engine-new.ts} +11 -2
- package/src/engines/{fast-path-engine.js ā fast-path-engine.ts} +79 -53
- package/src/errors.ts +1 -0
- package/src/formats/{ndjson-parser.js ā ndjson-parser.ts} +24 -16
- package/src/formats/{tsv-parser.js ā tsv-parser.ts} +18 -17
- package/src/{index-with-plugins.js ā index-with-plugins.ts} +381 -357
- package/src/types/index.ts +275 -0
- package/src/utils/bom-utils.ts +373 -0
- package/src/utils/encoding-support.ts +155 -0
- package/src/utils/{schema-validator.js ā schema-validator.ts} +814 -589
- package/src/utils/transform-loader.ts +389 -0
- package/src/utils/validators.ts +35 -0
- package/src/utils/zod-adapter.ts +280 -0
- package/src/web-server/{index.js ā index.ts} +19 -19
- package/src/workers/csv-multithreaded.ts +310 -0
- package/src/workers/csv-parser.worker.ts +227 -0
- package/src/workers/worker-pool.ts +409 -0
- package/bin/jtcsv.js +0 -2462
- package/csv-to-json.js +0 -688
- package/errors.js +0 -208
- package/examples/simple-usage.js +0 -282
- package/index.js +0 -68
- package/json-save.js +0 -254
- package/json-to-csv.js +0 -526
- package/plugins/README.md +0 -91
- package/plugins/express-middleware/README.md +0 -64
- package/plugins/express-middleware/example.js +0 -136
- package/plugins/express-middleware/index.d.ts +0 -114
- package/plugins/express-middleware/index.js +0 -360
- package/plugins/express-middleware/package.json +0 -52
- package/plugins/fastify-plugin/index.js +0 -406
- package/plugins/fastify-plugin/package.json +0 -55
- package/plugins/hono/README.md +0 -28
- package/plugins/hono/index.d.ts +0 -12
- package/plugins/hono/index.js +0 -36
- package/plugins/hono/package.json +0 -35
- package/plugins/nestjs/README.md +0 -35
- package/plugins/nestjs/index.d.ts +0 -25
- package/plugins/nestjs/index.js +0 -77
- package/plugins/nestjs/package.json +0 -37
- package/plugins/nextjs-api/README.md +0 -57
- package/plugins/nextjs-api/examples/ConverterComponent.jsx +0 -386
- package/plugins/nextjs-api/examples/api-convert.js +0 -69
- package/plugins/nextjs-api/index.js +0 -387
- package/plugins/nextjs-api/package.json +0 -63
- package/plugins/nextjs-api/route.js +0 -371
- package/plugins/nuxt/README.md +0 -24
- package/plugins/nuxt/index.js +0 -21
- package/plugins/nuxt/package.json +0 -35
- package/plugins/nuxt/runtime/composables/useJtcsv.js +0 -6
- package/plugins/nuxt/runtime/plugin.js +0 -6
- package/plugins/remix/README.md +0 -26
- package/plugins/remix/index.d.ts +0 -16
- package/plugins/remix/index.js +0 -62
- package/plugins/remix/package.json +0 -35
- package/plugins/sveltekit/README.md +0 -28
- package/plugins/sveltekit/index.d.ts +0 -17
- package/plugins/sveltekit/index.js +0 -54
- package/plugins/sveltekit/package.json +0 -33
- package/plugins/trpc/README.md +0 -25
- package/plugins/trpc/index.d.ts +0 -7
- package/plugins/trpc/index.js +0 -32
- package/plugins/trpc/package.json +0 -34
- package/src/browser/browser-functions.js +0 -219
- package/src/browser/csv-to-json-browser.js +0 -700
- package/src/browser/index.js +0 -113
- package/src/browser/json-to-csv-browser.js +0 -309
- package/src/browser/streams.js +0 -393
- package/src/core/delimiter-cache.js +0 -186
- package/src/core/plugin-system.js +0 -476
- package/src/core/transform-hooks.js +0 -350
- package/src/errors.js +0 -26
- package/src/utils/transform-loader.js +0 -205
- package/stream-csv-to-json.js +0 -542
- package/stream-json-to-csv.js +0 -464
- /package/examples/{web-workers-advanced.js ā web-workers-advanced.ts} +0 -0
package/browser.d.ts
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import type { JsonToCsvOptions, CsvToJsonOptions } from './index';
|
|
2
|
+
|
|
3
|
+
export interface ErrorDetails {
|
|
4
|
+
[key: string]: any;
|
|
5
|
+
hint?: string;
|
|
6
|
+
docs?: string;
|
|
7
|
+
context?: any;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export class JTCSVError extends Error {
|
|
11
|
+
code: string;
|
|
12
|
+
details: ErrorDetails;
|
|
13
|
+
hint?: string;
|
|
14
|
+
docs?: string;
|
|
15
|
+
context?: any;
|
|
16
|
+
constructor(message: string, code?: string, details?: ErrorDetails);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export class ValidationError extends JTCSVError {
|
|
20
|
+
constructor(message: string, details?: ErrorDetails);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export class SecurityError extends JTCSVError {
|
|
24
|
+
constructor(message: string, details?: ErrorDetails);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export class FileSystemError extends JTCSVError {
|
|
28
|
+
constructor(message: string, originalError?: Error, details?: ErrorDetails);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export class ParsingError extends JTCSVError {
|
|
32
|
+
lineNumber?: number;
|
|
33
|
+
constructor(message: string, lineNumber?: number, details?: ErrorDetails);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export class LimitError extends JTCSVError {
|
|
37
|
+
limit: any;
|
|
38
|
+
actual: any;
|
|
39
|
+
constructor(message: string, limit: any, actual: any, details?: ErrorDetails);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export class ConfigurationError extends JTCSVError {
|
|
43
|
+
constructor(message: string, details?: ErrorDetails);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export const ERROR_CODES: {
|
|
47
|
+
JTCSV_ERROR: string;
|
|
48
|
+
VALIDATION_ERROR: string;
|
|
49
|
+
SECURITY_ERROR: string;
|
|
50
|
+
FILE_SYSTEM_ERROR: string;
|
|
51
|
+
PARSING_ERROR: string;
|
|
52
|
+
LIMIT_ERROR: string;
|
|
53
|
+
CONFIGURATION_ERROR: string;
|
|
54
|
+
INVALID_INPUT: string;
|
|
55
|
+
SECURITY_VIOLATION: string;
|
|
56
|
+
FILE_NOT_FOUND: string;
|
|
57
|
+
PARSE_FAILED: string;
|
|
58
|
+
SIZE_LIMIT: string;
|
|
59
|
+
INVALID_CONFIG: string;
|
|
60
|
+
UNKNOWN_ERROR: string;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export function jsonToCsv(data: any[], options?: JsonToCsvOptions): string;
|
|
64
|
+
export function jsonToCsvAsync(data: any[], options?: JsonToCsvOptions): Promise<string>;
|
|
65
|
+
export function preprocessData<T extends Record<string, any>>(data: T[]): Record<string, any>[];
|
|
66
|
+
export function deepUnwrap(value: any, depth?: number, maxDepth?: number): any;
|
|
67
|
+
|
|
68
|
+
export function csvToJson(csv: string, options?: CsvToJsonOptions): any[];
|
|
69
|
+
export function csvToJsonAsync(csv: string, options?: CsvToJsonOptions): Promise<any[]>;
|
|
70
|
+
export function csvToJsonIterator(
|
|
71
|
+
csv: string | File | Blob,
|
|
72
|
+
options?: CsvToJsonOptions
|
|
73
|
+
): AsyncGenerator<any>;
|
|
74
|
+
|
|
75
|
+
export function parseCsvFile(file: File, options?: CsvToJsonOptions): Promise<any[]>;
|
|
76
|
+
export function parseCsvFileAsync(file: File, options?: CsvToJsonOptions): Promise<any[]>;
|
|
77
|
+
export function parseCsvFileStream(file: File, options?: CsvToJsonOptions): AsyncIterator<any>;
|
|
78
|
+
|
|
79
|
+
export function jsonToCsvStream(options?: JsonToCsvOptions): ReadableStream;
|
|
80
|
+
export function jsonToNdjsonStream(options?: any): ReadableStream;
|
|
81
|
+
export function csvToJsonStream(options?: CsvToJsonOptions): ReadableStream;
|
|
82
|
+
|
|
83
|
+
export function autoDetectDelimiter(csv: string, options?: { candidates?: string[] }): string;
|
|
84
|
+
export function autoDetectDelimiterAsync(csv: string): Promise<string>;
|
|
85
|
+
|
|
86
|
+
export function downloadAsCsv(
|
|
87
|
+
data: any[],
|
|
88
|
+
filename?: string,
|
|
89
|
+
options?: JsonToCsvOptions
|
|
90
|
+
): void;
|
|
91
|
+
export function downloadAsCsvAsync(
|
|
92
|
+
data: any[],
|
|
93
|
+
filename?: string,
|
|
94
|
+
options?: JsonToCsvOptions
|
|
95
|
+
): Promise<void>;
|
|
96
|
+
|
|
97
|
+
export function createWorkerPool(options?: any): any;
|
|
98
|
+
export function parseCSVWithWorker(
|
|
99
|
+
csvInput: string | File | ArrayBuffer | ArrayBufferView,
|
|
100
|
+
options?: CsvToJsonOptions,
|
|
101
|
+
onProgress?: (progress: number) => void
|
|
102
|
+
): Promise<any[]>;
|
|
103
|
+
export function createWorkerPoolLazy(options?: any): Promise<any>;
|
|
104
|
+
export function parseCSVWithWorkerLazy(
|
|
105
|
+
csvInput: string | File | ArrayBuffer | ArrayBufferView,
|
|
106
|
+
options?: CsvToJsonOptions,
|
|
107
|
+
onProgress?: (progress: number) => void
|
|
108
|
+
): Promise<any[]>;
|
|
109
|
+
|
|
110
|
+
declare const jtcsv: {
|
|
111
|
+
jsonToCsv: typeof jsonToCsv;
|
|
112
|
+
preprocessData: typeof preprocessData;
|
|
113
|
+
downloadAsCsv: typeof downloadAsCsv;
|
|
114
|
+
deepUnwrap: typeof deepUnwrap;
|
|
115
|
+
csvToJson: typeof csvToJson;
|
|
116
|
+
csvToJsonIterator: typeof csvToJsonIterator;
|
|
117
|
+
parseCsvFile: typeof parseCsvFile;
|
|
118
|
+
parseCsvFileStream: typeof parseCsvFileStream;
|
|
119
|
+
jsonToCsvStream: typeof jsonToCsvStream;
|
|
120
|
+
jsonToNdjsonStream: typeof jsonToNdjsonStream;
|
|
121
|
+
csvToJsonStream: typeof csvToJsonStream;
|
|
122
|
+
autoDetectDelimiter: typeof autoDetectDelimiter;
|
|
123
|
+
createWorkerPool: typeof createWorkerPool;
|
|
124
|
+
parseCSVWithWorker: typeof parseCSVWithWorker;
|
|
125
|
+
createWorkerPoolLazy: typeof createWorkerPoolLazy;
|
|
126
|
+
parseCSVWithWorkerLazy: typeof parseCSVWithWorkerLazy;
|
|
127
|
+
jsonToCsvAsync: typeof jsonToCsvAsync;
|
|
128
|
+
csvToJsonAsync: typeof csvToJsonAsync;
|
|
129
|
+
parseCsvFileAsync: typeof parseCsvFileAsync;
|
|
130
|
+
autoDetectDelimiterAsync: typeof autoDetectDelimiterAsync;
|
|
131
|
+
downloadAsCsvAsync: typeof downloadAsCsvAsync;
|
|
132
|
+
ValidationError: typeof ValidationError;
|
|
133
|
+
SecurityError: typeof SecurityError;
|
|
134
|
+
FileSystemError: typeof FileSystemError;
|
|
135
|
+
ParsingError: typeof ParsingError;
|
|
136
|
+
LimitError: typeof LimitError;
|
|
137
|
+
ConfigurationError: typeof ConfigurationError;
|
|
138
|
+
ERROR_CODES: typeof ERROR_CODES;
|
|
139
|
+
version: string;
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
export default jtcsv;
|
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
const perf_hooks_1 = require("perf_hooks");
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const args = process.argv.slice(2);
|
|
40
|
+
const isCI = args.includes('--ci');
|
|
41
|
+
const outputIndex = args.indexOf('--output');
|
|
42
|
+
const outputFile = outputIndex !== -1 && args[outputIndex + 1] ? args[outputIndex + 1] : null;
|
|
43
|
+
const jtcsv = __importStar(require("./index"));
|
|
44
|
+
let csvParser, Papa, json2csv;
|
|
45
|
+
async function loadCompetitors() {
|
|
46
|
+
try {
|
|
47
|
+
csvParser = await Promise.resolve().then(() => __importStar(require("csv-parser")));
|
|
48
|
+
}
|
|
49
|
+
catch (_e) {
|
|
50
|
+
console.warn('csv-parser not installed, skipping...');
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
Papa = await Promise.resolve().then(() => __importStar(require("papaparse")));
|
|
54
|
+
}
|
|
55
|
+
catch (_e) {
|
|
56
|
+
console.warn('papaparse not installed, skipping...');
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
json2csv = await Promise.resolve().then(() => __importStar(require("json2csv")));
|
|
60
|
+
}
|
|
61
|
+
catch (_e) {
|
|
62
|
+
console.warn('json2csv not installed, skipping...');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const colors = {
|
|
66
|
+
reset: '\x1b[0m',
|
|
67
|
+
bright: '\x1b[1m',
|
|
68
|
+
red: '\x1b[31m',
|
|
69
|
+
green: '\x1b[32m',
|
|
70
|
+
yellow: '\x1b[33m',
|
|
71
|
+
blue: '\x1b[34m',
|
|
72
|
+
magenta: '\x1b[35m',
|
|
73
|
+
cyan: '\x1b[36m',
|
|
74
|
+
white: '\x1b[37m'
|
|
75
|
+
};
|
|
76
|
+
function color(text, colorName) {
|
|
77
|
+
return colors[colorName] + text + colors.reset;
|
|
78
|
+
}
|
|
79
|
+
function formatNumber(num) {
|
|
80
|
+
return num.toLocaleString('en-US');
|
|
81
|
+
}
|
|
82
|
+
function formatBytes(bytes) {
|
|
83
|
+
if (bytes === 0) {
|
|
84
|
+
return '0 Bytes';
|
|
85
|
+
}
|
|
86
|
+
const k = 1024;
|
|
87
|
+
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
|
|
88
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
89
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
|
|
90
|
+
}
|
|
91
|
+
function formatTime(ms) {
|
|
92
|
+
if (ms < 1000) {
|
|
93
|
+
return ms.toFixed(2) + ' ms';
|
|
94
|
+
}
|
|
95
|
+
return (ms / 1000).toFixed(2) + ' s';
|
|
96
|
+
}
|
|
97
|
+
class Benchmark {
|
|
98
|
+
constructor(name) {
|
|
99
|
+
this.name = name;
|
|
100
|
+
this.tests = [];
|
|
101
|
+
this.results = [];
|
|
102
|
+
}
|
|
103
|
+
addTest(name, fn) {
|
|
104
|
+
this.tests.push({ name, fn });
|
|
105
|
+
}
|
|
106
|
+
async run(iterations = 3) {
|
|
107
|
+
console.log(color(`\nš Running ${this.name}`, 'cyan'));
|
|
108
|
+
console.log(color('='.repeat(60), 'dim'));
|
|
109
|
+
for (const test of this.tests) {
|
|
110
|
+
console.log(`\n${color('Test:', 'bright')} ${test.name}`);
|
|
111
|
+
const times = [];
|
|
112
|
+
let memoryUsage = null;
|
|
113
|
+
for (let i = 0; i < iterations; i++) {
|
|
114
|
+
if (global.gc) {
|
|
115
|
+
global.gc();
|
|
116
|
+
}
|
|
117
|
+
const startMem = process.memoryUsage();
|
|
118
|
+
const startTime = perf_hooks_1.performance.now();
|
|
119
|
+
await test.fn();
|
|
120
|
+
const endTime = perf_hooks_1.performance.now();
|
|
121
|
+
const endMem = process.memoryUsage();
|
|
122
|
+
times.push(endTime - startTime);
|
|
123
|
+
const memUsed = endMem.heapUsed - startMem.heapUsed;
|
|
124
|
+
if (!memoryUsage || memUsed > memoryUsage) {
|
|
125
|
+
memoryUsage = memUsed;
|
|
126
|
+
}
|
|
127
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
128
|
+
}
|
|
129
|
+
const avgTime = times.reduce((a, b) => a + b, 0) / times.length;
|
|
130
|
+
const minTime = Math.min(...times);
|
|
131
|
+
const maxTime = Math.max(...times);
|
|
132
|
+
this.results.push({
|
|
133
|
+
name: test.name,
|
|
134
|
+
avgTime,
|
|
135
|
+
minTime,
|
|
136
|
+
maxTime,
|
|
137
|
+
memoryUsage,
|
|
138
|
+
times
|
|
139
|
+
});
|
|
140
|
+
console.log(` ${color('Time:', 'dim')} ${formatTime(avgTime)} (min: ${formatTime(minTime)}, max: ${formatTime(maxTime)})`);
|
|
141
|
+
console.log(` ${color('Memory:', 'dim')} ${formatBytes(memoryUsage)}`);
|
|
142
|
+
console.log(` ${color('Iterations:', 'dim')} ${iterations}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
printResults() {
|
|
146
|
+
console.log(color(`\nš ${this.name} Results`, 'green'));
|
|
147
|
+
console.log(color('='.repeat(60), 'dim'));
|
|
148
|
+
const sorted = [...this.results].sort((a, b) => a.avgTime - b.avgTime);
|
|
149
|
+
sorted.forEach((result, index) => {
|
|
150
|
+
const rank = index === 0 ? 'š„' : index === 1 ? 'š„' : index === 2 ? 'š„' : ' ';
|
|
151
|
+
console.log(`\n${rank} ${color(result.name, 'bright')}`);
|
|
152
|
+
console.log(` ${color('Avg time:', 'dim')} ${formatTime(result.avgTime)}`);
|
|
153
|
+
console.log(` ${color('Memory:', 'dim')} ${formatBytes(result.memoryUsage)}`);
|
|
154
|
+
if (index > 0) {
|
|
155
|
+
const fastest = sorted[0].avgTime;
|
|
156
|
+
const slowerBy = ((result.avgTime / fastest) - 1) * 100;
|
|
157
|
+
console.log(` ${color('Slower by:', 'dim')} ${slowerBy.toFixed(1)}%`);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
async function runSimpleBenchmark(fn, iterations = 3) {
|
|
163
|
+
const times = [];
|
|
164
|
+
let memoryUsage = null;
|
|
165
|
+
for (let i = 0; i < iterations; i++) {
|
|
166
|
+
if (global.gc) {
|
|
167
|
+
global.gc();
|
|
168
|
+
}
|
|
169
|
+
const startMem = process.memoryUsage().heapUsed;
|
|
170
|
+
const startTime = perf_hooks_1.performance.now();
|
|
171
|
+
await fn();
|
|
172
|
+
const endTime = perf_hooks_1.performance.now();
|
|
173
|
+
const endMem = process.memoryUsage().heapUsed;
|
|
174
|
+
times.push(endTime - startTime);
|
|
175
|
+
let memUsed = endMem - startMem;
|
|
176
|
+
if (Number.isFinite(memUsed)) {
|
|
177
|
+
memUsed = Math.abs(memUsed);
|
|
178
|
+
if (memoryUsage === null || memUsed > memoryUsage) {
|
|
179
|
+
memoryUsage = memUsed;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
else if (memoryUsage === null) {
|
|
183
|
+
memoryUsage = 0;
|
|
184
|
+
}
|
|
185
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
186
|
+
}
|
|
187
|
+
const avgTime = times.reduce((a, b) => a + b, 0) / times.length;
|
|
188
|
+
return {
|
|
189
|
+
avgTime,
|
|
190
|
+
memoryUsage
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
async function generateTestData(rows) {
|
|
194
|
+
console.log(color(`\nš Generating test data (${formatNumber(rows)} rows)`, 'yellow'));
|
|
195
|
+
let csv = 'id;name;age;salary;active;department;email;phone;address;city\n';
|
|
196
|
+
for (let i = 1; i <= rows; i++) {
|
|
197
|
+
csv += `${i};`;
|
|
198
|
+
csv += `User ${i};`;
|
|
199
|
+
csv += `${20 + (i % 40)};`;
|
|
200
|
+
csv += `${30000 + (i * 100)}.50;`;
|
|
201
|
+
csv += `${i % 3 === 0 ? 'true' : 'false'};`;
|
|
202
|
+
csv += `Department ${(i % 5) + 1};`;
|
|
203
|
+
csv += `user${i}@example.com;`;
|
|
204
|
+
csv += `+1-555-${String(i).padStart(4, '0')};`;
|
|
205
|
+
csv += `${i} Main St;`;
|
|
206
|
+
csv += `City ${(i % 10) + 1}`;
|
|
207
|
+
csv += '\n';
|
|
208
|
+
}
|
|
209
|
+
const json = [];
|
|
210
|
+
for (let i = 1; i <= rows; i++) {
|
|
211
|
+
json.push({
|
|
212
|
+
id: i,
|
|
213
|
+
name: `User ${i}`,
|
|
214
|
+
age: 20 + (i % 40),
|
|
215
|
+
salary: 30000 + (i * 100) + 0.50,
|
|
216
|
+
active: i % 3 === 0,
|
|
217
|
+
department: `Department ${(i % 5) + 1}`,
|
|
218
|
+
email: `user${i}@example.com`,
|
|
219
|
+
phone: `+1-555-${String(i).padStart(4, '0')}`,
|
|
220
|
+
address: `${i} Main St`,
|
|
221
|
+
city: `City ${(i % 10) + 1}`
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
return { csv, json };
|
|
225
|
+
}
|
|
226
|
+
async function runBenchmarks() {
|
|
227
|
+
console.log(color('\nšÆ JTCSV Performance Benchmark', 'magenta'));
|
|
228
|
+
console.log(color('='.repeat(60), 'dim'));
|
|
229
|
+
console.log(color('Node.js:', 'dim'), process.version);
|
|
230
|
+
console.log(color('Platform:', 'dim'), process.platform, process.arch);
|
|
231
|
+
console.log(color('Memory:', 'dim'), formatBytes(process.memoryUsage().heapTotal));
|
|
232
|
+
await loadCompetitors();
|
|
233
|
+
const smallData = await generateTestData(1000);
|
|
234
|
+
const mediumData = await generateTestData(10000);
|
|
235
|
+
const largeData = await generateTestData(100000);
|
|
236
|
+
const csvToJsonBenchmark = new Benchmark('CSV to JSON Conversion (10K rows)');
|
|
237
|
+
csvToJsonBenchmark.addTest('JTCSV', async () => {
|
|
238
|
+
jtcsv.csvToJson(mediumData.csv, {
|
|
239
|
+
delimiter: ';',
|
|
240
|
+
parseNumbers: true,
|
|
241
|
+
parseBooleans: true
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
csvToJsonBenchmark.addTest('JTCSV (FastPath Stream)', async () => {
|
|
245
|
+
let rowCount = 0;
|
|
246
|
+
for await (const _row of jtcsv.csvToJsonIterator(mediumData.csv, {
|
|
247
|
+
delimiter: ';',
|
|
248
|
+
parseNumbers: true,
|
|
249
|
+
parseBooleans: true,
|
|
250
|
+
useFastPath: true
|
|
251
|
+
})) {
|
|
252
|
+
rowCount++;
|
|
253
|
+
}
|
|
254
|
+
if (rowCount === 0) {
|
|
255
|
+
throw new Error('No rows processed in fast-path stream benchmark');
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
csvToJsonBenchmark.addTest('JTCSV (FastPath Compact)', async () => {
|
|
259
|
+
const result = jtcsv.csvToJson(mediumData.csv, {
|
|
260
|
+
delimiter: ';',
|
|
261
|
+
parseNumbers: true,
|
|
262
|
+
parseBooleans: true,
|
|
263
|
+
useFastPath: true,
|
|
264
|
+
fastPathMode: 'compact'
|
|
265
|
+
});
|
|
266
|
+
if (result.length === 0) {
|
|
267
|
+
throw new Error('No rows processed in compact fast-path benchmark');
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
if (Papa) {
|
|
271
|
+
csvToJsonBenchmark.addTest('PapaParse', async () => {
|
|
272
|
+
return new Promise((resolve) => {
|
|
273
|
+
Papa.parse(mediumData.csv, {
|
|
274
|
+
delimiter: ';',
|
|
275
|
+
header: true,
|
|
276
|
+
dynamicTyping: true,
|
|
277
|
+
complete: () => resolve()
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
if (csvParser) {
|
|
283
|
+
csvToJsonBenchmark.addTest('csv-parser', async () => {
|
|
284
|
+
return new Promise((resolve, reject) => {
|
|
285
|
+
const results = [];
|
|
286
|
+
const parser = csvParser({ separator: ';' });
|
|
287
|
+
const lines = mediumData.csv.split('\n');
|
|
288
|
+
lines.forEach(line => {
|
|
289
|
+
parser.write(line + '\n');
|
|
290
|
+
});
|
|
291
|
+
parser.end();
|
|
292
|
+
parser.on('data', (data) => {
|
|
293
|
+
results.push(data);
|
|
294
|
+
});
|
|
295
|
+
parser.on('end', () => {
|
|
296
|
+
resolve();
|
|
297
|
+
});
|
|
298
|
+
parser.on('error', reject);
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
const jsonToCsvBenchmark = new Benchmark('JSON to CSV Conversion (10K records)');
|
|
303
|
+
jsonToCsvBenchmark.addTest('JTCSV', async () => {
|
|
304
|
+
jtcsv.jsonToCsv(mediumData.json, {
|
|
305
|
+
delimiter: ';',
|
|
306
|
+
includeHeaders: true
|
|
307
|
+
});
|
|
308
|
+
});
|
|
309
|
+
if (json2csv && json2csv.parse) {
|
|
310
|
+
jsonToCsvBenchmark.addTest('json2csv', async () => {
|
|
311
|
+
json2csv.parse(mediumData.json, {
|
|
312
|
+
delimiter: ';'
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
await csvToJsonBenchmark.run(5);
|
|
317
|
+
await jsonToCsvBenchmark.run(5);
|
|
318
|
+
csvToJsonBenchmark.printResults();
|
|
319
|
+
jsonToCsvBenchmark.printResults();
|
|
320
|
+
const scaleSizes = [
|
|
321
|
+
{ label: '1K', rows: 1000, data: smallData },
|
|
322
|
+
{ label: '10K', rows: 10000, data: mediumData },
|
|
323
|
+
{ label: '100K', rows: 100000, data: largeData }
|
|
324
|
+
];
|
|
325
|
+
const scaleResults = [];
|
|
326
|
+
console.log(color('\n?? Scaling Benchmarks (JTCSV)', 'cyan'));
|
|
327
|
+
console.log(color('='.repeat(60), 'dim'));
|
|
328
|
+
for (const size of scaleSizes) {
|
|
329
|
+
const csvMetrics = await runSimpleBenchmark(() => {
|
|
330
|
+
const result = jtcsv.csvToJson(size.data.csv, {
|
|
331
|
+
delimiter: ';',
|
|
332
|
+
parseNumbers: true,
|
|
333
|
+
parseBooleans: true,
|
|
334
|
+
useFastPath: true,
|
|
335
|
+
fastPathMode: 'compact'
|
|
336
|
+
});
|
|
337
|
+
if (!result || result.length === 0) {
|
|
338
|
+
throw new Error('No rows processed in scale CSV benchmark');
|
|
339
|
+
}
|
|
340
|
+
}, 3);
|
|
341
|
+
const jsonMetrics = await runSimpleBenchmark(() => {
|
|
342
|
+
const csv = jtcsv.jsonToCsv(size.data.json, {
|
|
343
|
+
delimiter: ';',
|
|
344
|
+
includeHeaders: true
|
|
345
|
+
});
|
|
346
|
+
if (!csv) {
|
|
347
|
+
throw new Error('No output produced in scale JSON benchmark');
|
|
348
|
+
}
|
|
349
|
+
}, 3);
|
|
350
|
+
scaleResults.push({
|
|
351
|
+
rows: size.rows,
|
|
352
|
+
csvToJson: csvMetrics,
|
|
353
|
+
jsonToCsv: jsonMetrics
|
|
354
|
+
});
|
|
355
|
+
console.log(`\n${color('Size:', 'bright')} ${size.label} (${formatNumber(size.rows)} rows)`);
|
|
356
|
+
console.log(` ${color('CSV ā JSON (FastPath Compact):', 'dim')} ${formatTime(csvMetrics.avgTime)} | ${formatBytes(csvMetrics.memoryUsage)}`);
|
|
357
|
+
console.log(` ${color('JSON ā CSV:', 'dim')} ${formatTime(jsonMetrics.avgTime)} | ${formatBytes(jsonMetrics.memoryUsage)}`);
|
|
358
|
+
}
|
|
359
|
+
console.log(color('\nš Performance Comparison Summary', 'cyan'));
|
|
360
|
+
console.log(color('='.repeat(60), 'dim'));
|
|
361
|
+
console.log('\n' + color('CSV ā JSON (10K rows):', 'bright'));
|
|
362
|
+
console.log('ā' + 'ā'.repeat(58) + 'ā');
|
|
363
|
+
console.log(`ā ${color('Library', 'bright').padEnd(15)} ā ${color('Time', 'bright').padEnd(15)} ā ${color('Memory', 'bright').padEnd(15)} ā ${color('Rank', 'bright').padEnd(8)} ā`);
|
|
364
|
+
console.log('ā' + 'ā'.repeat(58) + 'ā¤');
|
|
365
|
+
const csvSorted = [...csvToJsonBenchmark.results].sort((a, b) => a.avgTime - b.avgTime);
|
|
366
|
+
csvSorted.forEach((result, index) => {
|
|
367
|
+
const rank = index === 0 ? 'š„ 1st' : index === 1 ? 'š„ 2nd' : index === 2 ? 'š„ 3rd' : `${index + 1}th`;
|
|
368
|
+
console.log(`ā ${result.name.padEnd(15)} ā ${formatTime(result.avgTime).padEnd(15)} ā ${formatBytes(result.memoryUsage).padEnd(15)} ā ${rank.padEnd(8)} ā`);
|
|
369
|
+
});
|
|
370
|
+
console.log('ā' + 'ā'.repeat(58) + 'ā');
|
|
371
|
+
console.log('\n' + color('JSON ā CSV (10K records):', 'bright'));
|
|
372
|
+
console.log('ā' + 'ā'.repeat(58) + 'ā');
|
|
373
|
+
console.log(`ā ${color('Library', 'bright').padEnd(15)} ā ${color('Time', 'bright').padEnd(15)} ā ${color('Memory', 'bright').padEnd(15)} ā ${color('Rank', 'bright').padEnd(8)} ā`);
|
|
374
|
+
console.log('ā' + 'ā'.repeat(58) + 'ā¤');
|
|
375
|
+
const jsonSorted = [...jsonToCsvBenchmark.results].sort((a, b) => a.avgTime - b.avgTime);
|
|
376
|
+
jsonSorted.forEach((result, index) => {
|
|
377
|
+
const rank = index === 0 ? 'š„ 1st' : index === 1 ? 'š„ 2nd' : index === 2 ? 'š„ 3rd' : `${index + 1}th`;
|
|
378
|
+
console.log(`ā ${result.name.padEnd(15)} ā ${formatTime(result.avgTime).padEnd(15)} ā ${formatBytes(result.memoryUsage).padEnd(15)} ā ${rank.padEnd(8)} ā`);
|
|
379
|
+
});
|
|
380
|
+
console.log('ā' + 'ā'.repeat(58) + 'ā');
|
|
381
|
+
if (!isCI) {
|
|
382
|
+
console.log(color('\nšÆ JTCSV Unique Advantages:', 'green'));
|
|
383
|
+
console.log(color('='.repeat(60), 'dim'));
|
|
384
|
+
console.log('\nā
' + color('Bidirectional:', 'bright') + ' CSV ā JSON in one library');
|
|
385
|
+
console.log('ā
' + color('Zero Dependencies:', 'bright') + ' No external packages needed');
|
|
386
|
+
console.log('ā
' + color('Security Built-in:', 'bright') + ' CSV injection protection');
|
|
387
|
+
console.log('ā
' + color('Auto-detect:', 'bright') + ' Automatic delimiter detection');
|
|
388
|
+
console.log('ā
' + color('Streaming API:', 'bright') + ' Built-in streaming support');
|
|
389
|
+
console.log('ā
' + color('TypeScript:', 'bright') + ' Full TypeScript definitions');
|
|
390
|
+
}
|
|
391
|
+
console.log(color('\nā
Benchmark completed!', 'green'));
|
|
392
|
+
if (outputFile) {
|
|
393
|
+
const results = {
|
|
394
|
+
timestamp: new Date().toISOString(),
|
|
395
|
+
nodeVersion: process.version,
|
|
396
|
+
platform: process.platform,
|
|
397
|
+
arch: process.arch,
|
|
398
|
+
results: {
|
|
399
|
+
csvToJson: csvToJsonBenchmark.results.map(r => ({
|
|
400
|
+
name: r.name,
|
|
401
|
+
avgTime: r.avgTime,
|
|
402
|
+
minTime: r.minTime,
|
|
403
|
+
maxTime: r.maxTime,
|
|
404
|
+
memoryUsage: r.memoryUsage,
|
|
405
|
+
opsPerSec: Math.round(10000 / r.avgTime),
|
|
406
|
+
relativeMargin: r.times.length > 1
|
|
407
|
+
? ((Math.max(...r.times) - Math.min(...r.times)) / r.avgTime * 100).toFixed(2)
|
|
408
|
+
: '0.00'
|
|
409
|
+
})),
|
|
410
|
+
jsonToCsv: jsonToCsvBenchmark.results.map(r => ({
|
|
411
|
+
name: r.name,
|
|
412
|
+
avgTime: r.avgTime,
|
|
413
|
+
minTime: r.minTime,
|
|
414
|
+
maxTime: r.maxTime,
|
|
415
|
+
memoryUsage: r.memoryUsage,
|
|
416
|
+
opsPerSec: Math.round(10000 / r.avgTime),
|
|
417
|
+
relativeMargin: r.times.length > 1
|
|
418
|
+
? ((Math.max(...r.times) - Math.min(...r.times)) / r.avgTime * 100).toFixed(2)
|
|
419
|
+
: '0.00'
|
|
420
|
+
})),
|
|
421
|
+
scaling: scaleResults.map(s => ({
|
|
422
|
+
rows: s.rows,
|
|
423
|
+
csvToJson: {
|
|
424
|
+
avgTime: s.csvToJson.avgTime,
|
|
425
|
+
memoryUsage: s.csvToJson.memoryUsage
|
|
426
|
+
},
|
|
427
|
+
jsonToCsv: {
|
|
428
|
+
avgTime: s.jsonToCsv.avgTime,
|
|
429
|
+
memoryUsage: s.jsonToCsv.memoryUsage
|
|
430
|
+
}
|
|
431
|
+
}))
|
|
432
|
+
}
|
|
433
|
+
};
|
|
434
|
+
fs.writeFileSync(outputFile, JSON.stringify(results, null, 2));
|
|
435
|
+
console.log(color(`\nš Results written to: ${outputFile}`, 'green'));
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
process.on('uncaughtException', (error) => {
|
|
439
|
+
console.error(color(`\nā Benchmark error: ${error.message}`, 'red'));
|
|
440
|
+
process.exit(1);
|
|
441
|
+
});
|
|
442
|
+
runBenchmarks().catch(error => {
|
|
443
|
+
console.error(color(`\nā Failed to run benchmarks: ${error.message}`, 'red'));
|
|
444
|
+
process.exit(1);
|
|
445
|
+
});
|
|
446
|
+
//# sourceMappingURL=benchmark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../benchmark.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n// @ts-nocheck\n\n/**\n * JTCSV Performance Benchmark\n * \n * Compares JTCSV performance against popular CSV/JSON libraries\n * Run with: node benchmark.js\n * \n * Options:\n * --ci Run in CI mode (reduced output, exit on error)\n * --output FILE Write results to JSON file\n */\n\nimport { performance } from \"perf_hooks\";\nimport * as fs from \"fs\";\n\n// Parse command line arguments\nconst args = process.argv.slice(2);\nconst isCI = args.includes('--ci');\nconst outputIndex = args.indexOf('--output');\nconst outputFile = outputIndex !== -1 && args[outputIndex + 1] ? args[outputIndex + 1] : null;\n\n// Import JTCSV\nimport * as jtcsv from \"./index\";\n\n// Try to import competitors\nlet csvParser, Papa, json2csv;\n\nasync function loadCompetitors() {\n try {\n csvParser = await import(\"csv-parser\");\n } catch (_e) {\n console.warn('csv-parser not installed, skipping...');\n }\n\n try {\n Papa = await import(\"papaparse\");\n } catch (_e) {\n console.warn('papaparse not installed, skipping...');\n }\n\n try {\n json2csv = await import(\"json2csv\");\n } catch (_e) {\n console.warn('json2csv not installed, skipping...');\n }\n}\n\n// Colors for console output\nconst colors = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m'\n};\n\nfunction color(text, colorName) {\n return colors[colorName] + text + colors.reset;\n}\n\nfunction formatNumber(num) {\n return num.toLocaleString('en-US');\n}\n\nfunction formatBytes(bytes) {\n if (bytes === 0) {\n return '0 Bytes';\n }\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\nfunction formatTime(ms) {\n if (ms < 1000) {\n return ms.toFixed(2) + ' ms';\n }\n return (ms / 1000).toFixed(2) + ' s';\n}\n\nclass Benchmark {\n constructor(name) {\n this.name = name;\n this.tests = [];\n this.results = [];\n }\n \n addTest(name, fn) {\n this.tests.push({ name, fn });\n }\n \n async run(iterations = 3) {\n console.log(color(`\\nš Running ${this.name}`, 'cyan'));\n console.log(color('='.repeat(60), 'dim'));\n \n for (const test of this.tests) {\n console.log(`\\n${color('Test:', 'bright')} ${test.name}`);\n \n const times = [];\n let memoryUsage = null;\n \n for (let i = 0; i < iterations; i++) {\n // Force garbage collection if available\n if (global.gc) {\n global.gc();\n }\n \n const startMem = process.memoryUsage();\n const startTime = performance.now();\n \n // Run the test\n await test.fn();\n \n const endTime = performance.now();\n const endMem = process.memoryUsage();\n \n times.push(endTime - startTime);\n \n // Calculate memory usage\n const memUsed = endMem.heapUsed - startMem.heapUsed;\n if (!memoryUsage || memUsed > memoryUsage) {\n memoryUsage = memUsed;\n }\n \n // Small delay between iterations\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n \n // Calculate statistics\n const avgTime = times.reduce((a, b) => a + b, 0) / times.length;\n const minTime = Math.min(...times);\n const maxTime = Math.max(...times);\n \n this.results.push({\n name: test.name,\n avgTime,\n minTime,\n maxTime,\n memoryUsage,\n times\n });\n \n console.log(` ${color('Time:', 'dim')} ${formatTime(avgTime)} (min: ${formatTime(minTime)}, max: ${formatTime(maxTime)})`);\n console.log(` ${color('Memory:', 'dim')} ${formatBytes(memoryUsage)}`);\n console.log(` ${color('Iterations:', 'dim')} ${iterations}`);\n }\n }\n \n printResults() {\n console.log(color(`\\nš ${this.name} Results`, 'green'));\n console.log(color('='.repeat(60), 'dim'));\n \n // Sort by average time (fastest first)\n const sorted = [...this.results].sort((a, b) => a.avgTime - b.avgTime);\n \n sorted.forEach((result, index) => {\n const rank = index === 0 ? 'š„' : index === 1 ? 'š„' : index === 2 ? 'š„' : ' ';\n console.log(`\\n${rank} ${color(result.name, 'bright')}`);\n console.log(` ${color('Avg time:', 'dim')} ${formatTime(result.avgTime)}`);\n console.log(` ${color('Memory:', 'dim')} ${formatBytes(result.memoryUsage)}`);\n \n // Show relative performance compared to fastest\n if (index > 0) {\n const fastest = sorted[0].avgTime;\n const slowerBy = ((result.avgTime / fastest) - 1) * 100;\n console.log(` ${color('Slower by:', 'dim')} ${slowerBy.toFixed(1)}%`);\n }\n });\n }\n}\n\nasync function runSimpleBenchmark(fn, iterations = 3) {\n const times = [];\n let memoryUsage = null;\n\n for (let i = 0; i < iterations; i++) {\n if (global.gc) {\n global.gc();\n }\n\n const startMem = process.memoryUsage().heapUsed;\n const startTime = performance.now();\n\n await fn();\n\n const endTime = performance.now();\n const endMem = process.memoryUsage().heapUsed;\n\n times.push(endTime - startTime);\n\n let memUsed = endMem - startMem;\n if (Number.isFinite(memUsed)) {\n memUsed = Math.abs(memUsed);\n if (memoryUsage === null || memUsed > memoryUsage) {\n memoryUsage = memUsed;\n }\n } else if (memoryUsage === null) {\n memoryUsage = 0;\n }\n\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n\n const avgTime = times.reduce((a, b) => a + b, 0) / times.length;\n\n return {\n avgTime,\n memoryUsage\n };\n}\n\nasync function generateTestData(rows) {\n console.log(color(`\\nš Generating test data (${formatNumber(rows)} rows)`, 'yellow'));\n \n // Generate CSV data\n let csv = 'id;name;age;salary;active;department;email;phone;address;city\\n';\n \n for (let i = 1; i <= rows; i++) {\n csv += `${i};`;\n csv += `User ${i};`;\n csv += `${20 + (i % 40)};`;\n csv += `${30000 + (i * 100)}.50;`;\n csv += `${i % 3 === 0 ? 'true' : 'false'};`;\n csv += `Department ${(i % 5) + 1};`;\n csv += `user${i}@example.com;`;\n csv += `+1-555-${String(i).padStart(4, '0')};`;\n csv += `${i} Main St;`;\n csv += `City ${(i % 10) + 1}`;\n csv += '\\n';\n }\n \n // Generate JSON data\n const json = [];\n for (let i = 1; i <= rows; i++) {\n json.push({\n id: i,\n name: `User ${i}`,\n age: 20 + (i % 40),\n salary: 30000 + (i * 100) + 0.50,\n active: i % 3 === 0,\n department: `Department ${(i % 5) + 1}`,\n email: `user${i}@example.com`,\n phone: `+1-555-${String(i).padStart(4, '0')}`,\n address: `${i} Main St`,\n city: `City ${(i % 10) + 1}`\n });\n }\n \n return { csv, json };\n}\n\nasync function runBenchmarks() {\n console.log(color('\\nšÆ JTCSV Performance Benchmark', 'magenta'));\n console.log(color('='.repeat(60), 'dim'));\n console.log(color('Node.js:', 'dim'), process.version);\n console.log(color('Platform:', 'dim'), process.platform, process.arch);\n console.log(color('Memory:', 'dim'), formatBytes(process.memoryUsage().heapTotal));\n \n // Load competitor libraries\n await loadCompetitors();\n \n // Generate test data\n const smallData = await generateTestData(1000);\n const mediumData = await generateTestData(10000);\n const largeData = await generateTestData(100000);\n \n // Benchmark 1: CSV to JSON\n const csvToJsonBenchmark = new Benchmark('CSV to JSON Conversion (10K rows)');\n \n // JTCSV\n csvToJsonBenchmark.addTest('JTCSV', async () => {\n jtcsv.csvToJson(mediumData.csv, {\n delimiter: ';',\n parseNumbers: true,\n parseBooleans: true\n });\n });\n \n // JTCSV Fast Path (stream-only)\n csvToJsonBenchmark.addTest('JTCSV (FastPath Stream)', async () => {\n let rowCount = 0;\n for await (const _row of jtcsv.csvToJsonIterator(mediumData.csv, {\n delimiter: ';',\n parseNumbers: true,\n parseBooleans: true,\n useFastPath: true\n })) {\n rowCount++;\n }\n if (rowCount === 0) {\n throw new Error('No rows processed in fast-path stream benchmark');\n }\n });\n\n // JTCSV Fast Path (compact mode, real result)\n csvToJsonBenchmark.addTest('JTCSV (FastPath Compact)', async () => {\n const result = jtcsv.csvToJson(mediumData.csv, {\n delimiter: ';',\n parseNumbers: true,\n parseBooleans: true,\n useFastPath: true,\n fastPathMode: 'compact'\n });\n if (result.length === 0) {\n throw new Error('No rows processed in compact fast-path benchmark');\n }\n });\n \n // PapaParse if available\n if (Papa) {\n csvToJsonBenchmark.addTest('PapaParse', async () => {\n return new Promise((resolve) => {\n Papa.parse(mediumData.csv, {\n delimiter: ';',\n header: true,\n dynamicTyping: true,\n complete: () => resolve()\n });\n });\n });\n }\n \n // csv-parser if available (needs stream simulation)\n if (csvParser) {\n csvToJsonBenchmark.addTest('csv-parser', async () => {\n return new Promise((resolve, reject) => {\n const results = [];\n const parser = csvParser({ separator: ';' });\n \n // Simulate stream\n const lines = mediumData.csv.split('\\n');\n lines.forEach(line => {\n parser.write(line + '\\n');\n });\n \n parser.end();\n \n parser.on('data', (data) => {\n results.push(data);\n });\n \n parser.on('end', () => {\n resolve();\n });\n \n parser.on('error', reject);\n });\n });\n }\n \n // Benchmark 2: JSON to CSV\n const jsonToCsvBenchmark = new Benchmark('JSON to CSV Conversion (10K records)');\n \n // JTCSV\n jsonToCsvBenchmark.addTest('JTCSV', async () => {\n jtcsv.jsonToCsv(mediumData.json, {\n delimiter: ';',\n includeHeaders: true\n });\n });\n \n // json2csv if available\n if (json2csv && json2csv.parse) {\n jsonToCsvBenchmark.addTest('json2csv', async () => {\n json2csv.parse(mediumData.json, {\n delimiter: ';'\n });\n });\n }\n \n // Run benchmarks\n await csvToJsonBenchmark.run(5);\n await jsonToCsvBenchmark.run(5);\n \n // Print results\n csvToJsonBenchmark.printResults();\n jsonToCsvBenchmark.printResults();\n\n // Scaling benchmarks (JTCSV only)\n const scaleSizes = [\n { label: '1K', rows: 1000, data: smallData },\n { label: '10K', rows: 10000, data: mediumData },\n { label: '100K', rows: 100000, data: largeData }\n ];\n const scaleResults = [];\n\n console.log(color('\\n?? Scaling Benchmarks (JTCSV)', 'cyan'));\n console.log(color('='.repeat(60), 'dim'));\n\n for (const size of scaleSizes) {\n const csvMetrics = await runSimpleBenchmark(() => {\n const result = jtcsv.csvToJson(size.data.csv, {\n delimiter: ';',\n parseNumbers: true,\n parseBooleans: true,\n useFastPath: true,\n fastPathMode: 'compact'\n });\n if (!result || result.length === 0) {\n throw new Error('No rows processed in scale CSV benchmark');\n }\n }, 3);\n\n const jsonMetrics = await runSimpleBenchmark(() => {\n const csv = jtcsv.jsonToCsv(size.data.json, {\n delimiter: ';',\n includeHeaders: true\n });\n if (!csv) {\n throw new Error('No output produced in scale JSON benchmark');\n }\n }, 3);\n\n scaleResults.push({\n rows: size.rows,\n csvToJson: csvMetrics,\n jsonToCsv: jsonMetrics\n });\n\n console.log(`\\n${color('Size:', 'bright')} ${size.label} (${formatNumber(size.rows)} rows)`);\n console.log(` ${color('CSV ā JSON (FastPath Compact):', 'dim')} ${formatTime(csvMetrics.avgTime)} | ${formatBytes(csvMetrics.memoryUsage)}`);\n console.log(` ${color('JSON ā CSV:', 'dim')} ${formatTime(jsonMetrics.avgTime)} | ${formatBytes(jsonMetrics.memoryUsage)}`);\n }\n \n // Generate summary table\n console.log(color('\\nš Performance Comparison Summary', 'cyan'));\n console.log(color('='.repeat(60), 'dim'));\n \n console.log('\\n' + color('CSV ā JSON (10K rows):', 'bright'));\n console.log('ā' + 'ā'.repeat(58) + 'ā');\n console.log(`ā ${color('Library', 'bright').padEnd(15)} ā ${color('Time', 'bright').padEnd(15)} ā ${color('Memory', 'bright').padEnd(15)} ā ${color('Rank', 'bright').padEnd(8)} ā`);\n console.log('ā' + 'ā'.repeat(58) + 'ā¤');\n \n const csvSorted = [...csvToJsonBenchmark.results].sort((a, b) => a.avgTime - b.avgTime);\n csvSorted.forEach((result, index) => {\n const rank = index === 0 ? 'š„ 1st' : index === 1 ? 'š„ 2nd' : index === 2 ? 'š„ 3rd' : `${index + 1}th`;\n console.log(`ā ${result.name.padEnd(15)} ā ${formatTime(result.avgTime).padEnd(15)} ā ${formatBytes(result.memoryUsage).padEnd(15)} ā ${rank.padEnd(8)} ā`);\n });\n \n console.log('ā' + 'ā'.repeat(58) + 'ā');\n \n console.log('\\n' + color('JSON ā CSV (10K records):', 'bright'));\n console.log('ā' + 'ā'.repeat(58) + 'ā');\n console.log(`ā ${color('Library', 'bright').padEnd(15)} ā ${color('Time', 'bright').padEnd(15)} ā ${color('Memory', 'bright').padEnd(15)} ā ${color('Rank', 'bright').padEnd(8)} ā`);\n console.log('ā' + 'ā'.repeat(58) + 'ā¤');\n \n const jsonSorted = [...jsonToCsvBenchmark.results].sort((a, b) => a.avgTime - b.avgTime);\n jsonSorted.forEach((result, index) => {\n const rank = index === 0 ? 'š„ 1st' : index === 1 ? 'š„ 2nd' : index === 2 ? 'š„ 3rd' : `${index + 1}th`;\n console.log(`ā ${result.name.padEnd(15)} ā ${formatTime(result.avgTime).padEnd(15)} ā ${formatBytes(result.memoryUsage).padEnd(15)} ā ${rank.padEnd(8)} ā`);\n });\n \n console.log('ā' + 'ā'.repeat(58) + 'ā');\n \n // JTCVS advantages\n if (!isCI) {\n console.log(color('\\nšÆ JTCSV Unique Advantages:', 'green'));\n console.log(color('='.repeat(60), 'dim'));\n console.log('\\nā
' + color('Bidirectional:', 'bright') + ' CSV ā JSON in one library');\n console.log('ā
' + color('Zero Dependencies:', 'bright') + ' No external packages needed');\n console.log('ā
' + color('Security Built-in:', 'bright') + ' CSV injection protection');\n console.log('ā
' + color('Auto-detect:', 'bright') + ' Automatic delimiter detection');\n console.log('ā
' + color('Streaming API:', 'bright') + ' Built-in streaming support');\n console.log('ā
' + color('TypeScript:', 'bright') + ' Full TypeScript definitions');\n }\n \n console.log(color('\\nā
Benchmark completed!', 'green'));\n\n // Write results to file if --output is specified\n if (outputFile) {\n const results = {\n timestamp: new Date().toISOString(),\n nodeVersion: process.version,\n platform: process.platform,\n arch: process.arch,\n results: {\n csvToJson: csvToJsonBenchmark.results.map(r => ({\n name: r.name,\n avgTime: r.avgTime,\n minTime: r.minTime,\n maxTime: r.maxTime,\n memoryUsage: r.memoryUsage,\n opsPerSec: Math.round(10000 / r.avgTime),\n relativeMargin: r.times.length > 1 \n ? ((Math.max(...r.times) - Math.min(...r.times)) / r.avgTime * 100).toFixed(2)\n : '0.00'\n })),\n jsonToCsv: jsonToCsvBenchmark.results.map(r => ({\n name: r.name,\n avgTime: r.avgTime,\n minTime: r.minTime,\n maxTime: r.maxTime,\n memoryUsage: r.memoryUsage,\n opsPerSec: Math.round(10000 / r.avgTime),\n relativeMargin: r.times.length > 1 \n ? ((Math.max(...r.times) - Math.min(...r.times)) / r.avgTime * 100).toFixed(2)\n : '0.00'\n })),\n scaling: scaleResults.map(s => ({\n rows: s.rows,\n csvToJson: {\n avgTime: s.csvToJson.avgTime,\n memoryUsage: s.csvToJson.memoryUsage\n },\n jsonToCsv: {\n avgTime: s.jsonToCsv.avgTime,\n memoryUsage: s.jsonToCsv.memoryUsage\n }\n }))\n }\n };\n \n fs.writeFileSync(outputFile, JSON.stringify(results, null, 2));\n console.log(color(`\\nš Results written to: ${outputFile}`, 'green'));\n }\n}\n\n// Handle errors\nprocess.on('uncaughtException', (error) => {\n console.error(color(`\\nā Benchmark error: ${error.message}`, 'red'));\n process.exit(1);\n});\n\n// Run benchmarks\nrunBenchmarks().catch(error => {\n console.error(color(`\\nā Failed to run benchmarks: ${error.message}`, 'red'));\n process.exit(1);\n});\n"]}
|