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
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
// Браузерные специфичные функции для jtcsv
|
|
2
|
+
// Функции, которые работают только в браузере
|
|
3
|
+
|
|
4
|
+
import { jsonToCsv } from './json-to-csv-browser';
|
|
5
|
+
import { csvToJson, csvToJsonIterator } from './csv-to-json-browser';
|
|
6
|
+
import {
|
|
7
|
+
csvToJsonStream as createCsvToJsonStream,
|
|
8
|
+
jsonToCsvStream as createJsonToCsvStream,
|
|
9
|
+
jsonToNdjsonStream as createJsonToNdjsonStream
|
|
10
|
+
} from './streams';
|
|
11
|
+
import { ValidationError } from './errors-browser';
|
|
12
|
+
|
|
13
|
+
import type { JsonToCsvOptions, CsvToJsonOptions } from '../types';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Скачивает JSON данные как CSV файл
|
|
17
|
+
*
|
|
18
|
+
* @param data - Массив объектов для конвертации
|
|
19
|
+
* @param filename - Имя файла для скачивания (по умолчанию 'data.csv')
|
|
20
|
+
* @param options - Опции для jsonToCsv
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* const data = [
|
|
24
|
+
* { id: 1, name: 'John' },
|
|
25
|
+
* { id: 2, name: 'Jane' }
|
|
26
|
+
* ];
|
|
27
|
+
* downloadAsCsv(data, 'users.csv', { delimiter: ',' });
|
|
28
|
+
*/
|
|
29
|
+
export function downloadAsCsv(
|
|
30
|
+
data: any[],
|
|
31
|
+
filename: string = 'data.csv',
|
|
32
|
+
options: JsonToCsvOptions = {}
|
|
33
|
+
): void {
|
|
34
|
+
// Проверка что мы в браузере
|
|
35
|
+
if (typeof window === 'undefined') {
|
|
36
|
+
throw new ValidationError('downloadAsCsv() работает только в браузере. Используйте saveAsCsv() в Node.js');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Валидация имени файла
|
|
40
|
+
if (typeof filename !== 'string' || filename.trim() === '') {
|
|
41
|
+
throw new ValidationError('Filename must be a non-empty string');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Добавление расширения .csv если его нет
|
|
45
|
+
if (!filename.toLowerCase().endsWith('.csv')) {
|
|
46
|
+
filename += '.csv';
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Конвертация в CSV
|
|
50
|
+
const csv = jsonToCsv(data, options);
|
|
51
|
+
|
|
52
|
+
// Создание Blob
|
|
53
|
+
const blob = new Blob([csv], {
|
|
54
|
+
type: 'text/csv;charset=utf-8;'
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// Создание ссылки для скачивания
|
|
58
|
+
const link = document.createElement('a');
|
|
59
|
+
const url = URL.createObjectURL(blob);
|
|
60
|
+
|
|
61
|
+
link.setAttribute('href', url);
|
|
62
|
+
link.setAttribute('download', filename);
|
|
63
|
+
link.style.visibility = 'hidden';
|
|
64
|
+
|
|
65
|
+
document.body.appendChild(link);
|
|
66
|
+
link.click();
|
|
67
|
+
document.body.removeChild(link);
|
|
68
|
+
|
|
69
|
+
// Освобождение URL
|
|
70
|
+
setTimeout(() => URL.revokeObjectURL(url), 100);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Асинхронная версия downloadAsCsv
|
|
75
|
+
*/
|
|
76
|
+
export async function downloadAsCsvAsync(
|
|
77
|
+
data: any[],
|
|
78
|
+
filename: string = 'data.csv',
|
|
79
|
+
options: JsonToCsvOptions = {}
|
|
80
|
+
): Promise<void> {
|
|
81
|
+
return downloadAsCsv(data, filename, options);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Парсит CSV файл из input[type="file"]
|
|
86
|
+
*
|
|
87
|
+
* @param file - File объект из input
|
|
88
|
+
* @param options - Опции для csvToJson
|
|
89
|
+
* @returns Promise с распарсенными данными
|
|
90
|
+
*/
|
|
91
|
+
export async function parseCsvFile(
|
|
92
|
+
file: File,
|
|
93
|
+
options: CsvToJsonOptions = {}
|
|
94
|
+
): Promise<any[]> {
|
|
95
|
+
if (!(file instanceof File)) {
|
|
96
|
+
throw new ValidationError('parseCsvFile() ожидает объект File');
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Чтение файла как текст
|
|
100
|
+
const text = await file.text();
|
|
101
|
+
|
|
102
|
+
// Парсинг CSV
|
|
103
|
+
return csvToJson(text, options);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Парсит CSV файл потоково
|
|
108
|
+
*
|
|
109
|
+
* @param file - File объект
|
|
110
|
+
* @param options - Опции для потокового парсинга
|
|
111
|
+
* @returns AsyncIterator с данными
|
|
112
|
+
*/
|
|
113
|
+
export function parseCsvFileStream(
|
|
114
|
+
file: File,
|
|
115
|
+
options: CsvToJsonOptions = {}
|
|
116
|
+
): AsyncIterator<any> {
|
|
117
|
+
if (!(file instanceof File)) {
|
|
118
|
+
throw new ValidationError('parseCsvFileStream() ожидает объект File');
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Используем csvToJsonIterator из импортированного модуля
|
|
122
|
+
return csvToJsonIterator(file, options);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Создает поток для конвертации JSON в CSV
|
|
127
|
+
*
|
|
128
|
+
* @param options - Опции для jsonToCsv
|
|
129
|
+
* @returns ReadableStream
|
|
130
|
+
*/
|
|
131
|
+
export function jsonToCsvStream(options: JsonToCsvOptions = {}): ReadableStream {
|
|
132
|
+
return createJsonToCsvStream(options);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Создает поток для конвертации JSON в NDJSON
|
|
137
|
+
*
|
|
138
|
+
* @param options - Опции для конвертации
|
|
139
|
+
* @returns ReadableStream
|
|
140
|
+
*/
|
|
141
|
+
export function jsonToNdjsonStream(options: any = {}): ReadableStream {
|
|
142
|
+
return createJsonToNdjsonStream(options);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Создает поток для парсинга CSV в JSON
|
|
147
|
+
*
|
|
148
|
+
* @param options - Опции для csvToJson
|
|
149
|
+
* @returns ReadableStream
|
|
150
|
+
*/
|
|
151
|
+
export function csvToJsonStream(options: CsvToJsonOptions = {}): ReadableStream {
|
|
152
|
+
return createCsvToJsonStream(options);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Загружает CSV файл по URL
|
|
157
|
+
*
|
|
158
|
+
* @param url - URL CSV файла
|
|
159
|
+
* @param options - Опции для csvToJson
|
|
160
|
+
* @returns Promise с распарсенными данными
|
|
161
|
+
*/
|
|
162
|
+
export async function loadCsvFromUrl(
|
|
163
|
+
url: string,
|
|
164
|
+
options: CsvToJsonOptions = {}
|
|
165
|
+
): Promise<any[]> {
|
|
166
|
+
if (typeof window === 'undefined') {
|
|
167
|
+
throw new ValidationError('loadCsvFromUrl() работает только в браузере');
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const response = await fetch(url);
|
|
171
|
+
|
|
172
|
+
if (!response.ok) {
|
|
173
|
+
throw new ValidationError(`Failed to load CSV from URL: ${response.status} ${response.statusText}`);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const text = await response.text();
|
|
177
|
+
return csvToJson(text, options);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Асинхронная версия loadCsvFromUrl
|
|
182
|
+
*/
|
|
183
|
+
export async function loadCsvFromUrlAsync(
|
|
184
|
+
url: string,
|
|
185
|
+
options: CsvToJsonOptions = {}
|
|
186
|
+
): Promise<any[]> {
|
|
187
|
+
return loadCsvFromUrl(url, options);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Экспортирует данные в CSV и открывает в новой вкладке
|
|
192
|
+
*
|
|
193
|
+
* @param data - Данные для экспорта
|
|
194
|
+
* @param options - Опции для jsonToCsv
|
|
195
|
+
*/
|
|
196
|
+
export function openCsvInNewTab(
|
|
197
|
+
data: any[],
|
|
198
|
+
options: JsonToCsvOptions = {}
|
|
199
|
+
): void {
|
|
200
|
+
if (typeof window === 'undefined') {
|
|
201
|
+
throw new ValidationError('openCsvInNewTab() работает только в браузере');
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const csv = jsonToCsv(data, options);
|
|
205
|
+
const blob = new Blob([csv], { type: 'text/csv;charset=utf-8' });
|
|
206
|
+
const url = URL.createObjectURL(blob);
|
|
207
|
+
|
|
208
|
+
window.open(url, '_blank');
|
|
209
|
+
|
|
210
|
+
// Освобождение URL через некоторое время
|
|
211
|
+
setTimeout(() => URL.revokeObjectURL(url), 1000);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Асинхронная версия openCsvInNewTab
|
|
216
|
+
*/
|
|
217
|
+
export async function openCsvInNewTabAsync(
|
|
218
|
+
data: any[],
|
|
219
|
+
options: JsonToCsvOptions = {}
|
|
220
|
+
): Promise<void> {
|
|
221
|
+
return openCsvInNewTab(data, options);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Копирует CSV в буфер обмена
|
|
226
|
+
*
|
|
227
|
+
* @param data - Данные для копирования
|
|
228
|
+
* @param options - Опции для jsonToCsv
|
|
229
|
+
* @returns Promise с результатом копирования
|
|
230
|
+
*/
|
|
231
|
+
export async function copyCsvToClipboard(
|
|
232
|
+
data: any[],
|
|
233
|
+
options: JsonToCsvOptions = {}
|
|
234
|
+
): Promise<boolean> {
|
|
235
|
+
if (typeof window === 'undefined' || !navigator.clipboard) {
|
|
236
|
+
throw new ValidationError('copyCsvToClipboard() требует поддержки Clipboard API');
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
const csv = jsonToCsv(data, options);
|
|
240
|
+
|
|
241
|
+
try {
|
|
242
|
+
await navigator.clipboard.writeText(csv);
|
|
243
|
+
return true;
|
|
244
|
+
} catch (error) {
|
|
245
|
+
console.error('Failed to copy to clipboard:', error);
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Сохраняет CSV в localStorage
|
|
252
|
+
*
|
|
253
|
+
* @param key - Ключ для сохранения
|
|
254
|
+
* @param data - Данные для сохранения
|
|
255
|
+
* @param options - Опции для jsonToCsv
|
|
256
|
+
*/
|
|
257
|
+
export function saveCsvToLocalStorage(
|
|
258
|
+
key: string,
|
|
259
|
+
data: any[],
|
|
260
|
+
options: JsonToCsvOptions = {}
|
|
261
|
+
): void {
|
|
262
|
+
if (typeof window === 'undefined' || !localStorage) {
|
|
263
|
+
throw new ValidationError('saveCsvToLocalStorage() требует localStorage');
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
const csv = jsonToCsv(data, options);
|
|
267
|
+
localStorage.setItem(key, csv);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Загружает CSV из localStorage
|
|
272
|
+
*
|
|
273
|
+
* @param key - Ключ для загрузки
|
|
274
|
+
* @param options - Опции для csvToJson
|
|
275
|
+
* @returns Распарсенные данные или null
|
|
276
|
+
*/
|
|
277
|
+
export function loadCsvFromLocalStorage(
|
|
278
|
+
key: string,
|
|
279
|
+
options: CsvToJsonOptions = {}
|
|
280
|
+
): any[] | null {
|
|
281
|
+
if (typeof window === 'undefined' || !localStorage) {
|
|
282
|
+
throw new ValidationError('loadCsvFromLocalStorage() требует localStorage');
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
const csv = localStorage.getItem(key);
|
|
286
|
+
|
|
287
|
+
if (!csv) {
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
return csvToJson(csv, options);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Асинхронная версия loadCsvFromLocalStorage
|
|
296
|
+
*/
|
|
297
|
+
export async function loadCsvFromLocalStorageAsync(
|
|
298
|
+
key: string,
|
|
299
|
+
options: CsvToJsonOptions = {}
|
|
300
|
+
): Promise<any[] | null> {
|
|
301
|
+
return loadCsvFromLocalStorage(key, options);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Создает CSV файл из JSON данных (альтернатива downloadAsCsv)
|
|
306
|
+
* Возвращает Blob вместо автоматического скачивания
|
|
307
|
+
*
|
|
308
|
+
* @param data - Массив объектов
|
|
309
|
+
* @param options - Опции для jsonToCsv
|
|
310
|
+
* @returns CSV Blob
|
|
311
|
+
*/
|
|
312
|
+
export function createCsvBlob(
|
|
313
|
+
data: any[],
|
|
314
|
+
options: JsonToCsvOptions = {}
|
|
315
|
+
): Blob {
|
|
316
|
+
const csv = jsonToCsv(data, options);
|
|
317
|
+
return new Blob([csv], {
|
|
318
|
+
type: 'text/csv;charset=utf-8;'
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Асинхронная версия createCsvBlob
|
|
324
|
+
*/
|
|
325
|
+
export async function createCsvBlobAsync(
|
|
326
|
+
data: any[],
|
|
327
|
+
options: JsonToCsvOptions = {}
|
|
328
|
+
): Promise<Blob> {
|
|
329
|
+
return createCsvBlob(data, options);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Парсит CSV строку из Blob
|
|
334
|
+
*
|
|
335
|
+
* @param blob - CSV Blob
|
|
336
|
+
* @param options - Опции для csvToJson
|
|
337
|
+
* @returns Promise с JSON данными
|
|
338
|
+
*/
|
|
339
|
+
export async function parseCsvBlob(
|
|
340
|
+
blob: Blob,
|
|
341
|
+
options: CsvToJsonOptions = {}
|
|
342
|
+
): Promise<any[]> {
|
|
343
|
+
if (!(blob instanceof Blob)) {
|
|
344
|
+
throw new ValidationError('Input must be a Blob object');
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
return new Promise((resolve, reject) => {
|
|
348
|
+
const reader = new FileReader();
|
|
349
|
+
|
|
350
|
+
reader.onload = function (event: ProgressEvent<FileReader>) {
|
|
351
|
+
try {
|
|
352
|
+
const csvText = event.target?.result as string;
|
|
353
|
+
const json = csvToJson(csvText, options);
|
|
354
|
+
resolve(json);
|
|
355
|
+
} catch (error) {
|
|
356
|
+
reject(error);
|
|
357
|
+
}
|
|
358
|
+
};
|
|
359
|
+
|
|
360
|
+
reader.onerror = function () {
|
|
361
|
+
reject(new ValidationError('Ошибка чтения Blob'));
|
|
362
|
+
};
|
|
363
|
+
|
|
364
|
+
reader.readAsText(blob, 'UTF-8');
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* Асинхронная версия parseCsvBlob
|
|
370
|
+
*/
|
|
371
|
+
export async function parseCsvBlobAsync(
|
|
372
|
+
blob: Blob,
|
|
373
|
+
options: CsvToJsonOptions = {}
|
|
374
|
+
): Promise<any[]> {
|
|
375
|
+
return parseCsvBlob(blob, options);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// Экспорт для Node.js совместимости
|
|
379
|
+
if (typeof module !== 'undefined' && module.exports) {
|
|
380
|
+
module.exports = {
|
|
381
|
+
downloadAsCsv,
|
|
382
|
+
downloadAsCsvAsync,
|
|
383
|
+
parseCsvFile,
|
|
384
|
+
parseCsvFileStream,
|
|
385
|
+
createCsvBlob,
|
|
386
|
+
createCsvBlobAsync,
|
|
387
|
+
parseCsvBlob,
|
|
388
|
+
parseCsvBlobAsync,
|
|
389
|
+
jsonToCsvStream,
|
|
390
|
+
jsonToNdjsonStream,
|
|
391
|
+
csvToJsonStream,
|
|
392
|
+
loadCsvFromUrl,
|
|
393
|
+
loadCsvFromUrlAsync,
|
|
394
|
+
openCsvInNewTab,
|
|
395
|
+
openCsvInNewTabAsync,
|
|
396
|
+
copyCsvToClipboard,
|
|
397
|
+
saveCsvToLocalStorage,
|
|
398
|
+
loadCsvFromLocalStorage,
|
|
399
|
+
loadCsvFromLocalStorageAsync
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// Ядро jtcsv - только базовые функции JSON<->CSV
|
|
2
|
+
// Минимальный размер, максимальная производительность
|
|
3
|
+
|
|
4
|
+
import * as jsonToCsvBrowser from './json-to-csv-browser';
|
|
5
|
+
import * as csvToJsonBrowser from './csv-to-json-browser';
|
|
6
|
+
import {
|
|
7
|
+
downloadAsCsv,
|
|
8
|
+
parseCsvFile,
|
|
9
|
+
parseCsvFileStream,
|
|
10
|
+
jsonToCsvStream,
|
|
11
|
+
jsonToNdjsonStream,
|
|
12
|
+
csvToJsonStream
|
|
13
|
+
} from './browser-functions';
|
|
14
|
+
import {
|
|
15
|
+
ValidationError,
|
|
16
|
+
SecurityError,
|
|
17
|
+
FileSystemError,
|
|
18
|
+
ParsingError,
|
|
19
|
+
LimitError,
|
|
20
|
+
ConfigurationError,
|
|
21
|
+
ERROR_CODES
|
|
22
|
+
} from './errors-browser';
|
|
23
|
+
|
|
24
|
+
import type { JsonToCsvOptions, CsvToJsonOptions } from '../types';
|
|
25
|
+
|
|
26
|
+
const { jsonToCsv, preprocessData, deepUnwrap } = jsonToCsvBrowser as any;
|
|
27
|
+
const { csvToJson, csvToJsonIterator, autoDetectDelimiter } = csvToJsonBrowser as any;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Асинхронная версия jsonToCsv
|
|
31
|
+
*/
|
|
32
|
+
async function jsonToCsvAsync(data: any, options: JsonToCsvOptions = {}): Promise<string> {
|
|
33
|
+
return jsonToCsv(data, options);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Асинхронная версия csvToJson
|
|
38
|
+
*/
|
|
39
|
+
async function csvToJsonAsync(csv: string, options: CsvToJsonOptions = {}): Promise<any[]> {
|
|
40
|
+
return csvToJson(csv, options);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Асинхронная версия parseCsvFile
|
|
45
|
+
*/
|
|
46
|
+
async function parseCsvFileAsync(file: File, options: CsvToJsonOptions = {}): Promise<any[]> {
|
|
47
|
+
return parseCsvFile(file, options);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Асинхронная версия autoDetectDelimiter
|
|
52
|
+
*/
|
|
53
|
+
async function autoDetectDelimiterAsync(csv: string): Promise<string> {
|
|
54
|
+
return autoDetectDelimiter(csv);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Асинхронная версия downloadAsCsv
|
|
59
|
+
*/
|
|
60
|
+
async function downloadAsCsvAsync(
|
|
61
|
+
data: any,
|
|
62
|
+
filename: string = 'export.csv',
|
|
63
|
+
options: JsonToCsvOptions = {}
|
|
64
|
+
): Promise<void> {
|
|
65
|
+
return downloadAsCsv(data, filename, options);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Основной экспорт ядра
|
|
69
|
+
const jtcsvCore = {
|
|
70
|
+
// JSON to CSV функции
|
|
71
|
+
jsonToCsv,
|
|
72
|
+
preprocessData,
|
|
73
|
+
downloadAsCsv,
|
|
74
|
+
deepUnwrap,
|
|
75
|
+
|
|
76
|
+
// CSV to JSON функции
|
|
77
|
+
csvToJson,
|
|
78
|
+
csvToJsonIterator,
|
|
79
|
+
parseCsvFile,
|
|
80
|
+
parseCsvFileStream,
|
|
81
|
+
jsonToCsvStream,
|
|
82
|
+
jsonToNdjsonStream,
|
|
83
|
+
csvToJsonStream,
|
|
84
|
+
autoDetectDelimiter,
|
|
85
|
+
|
|
86
|
+
// Асинхронные функции
|
|
87
|
+
jsonToCsvAsync,
|
|
88
|
+
csvToJsonAsync,
|
|
89
|
+
parseCsvFileAsync,
|
|
90
|
+
autoDetectDelimiterAsync,
|
|
91
|
+
downloadAsCsvAsync,
|
|
92
|
+
|
|
93
|
+
// Error classes
|
|
94
|
+
ValidationError,
|
|
95
|
+
SecurityError,
|
|
96
|
+
FileSystemError,
|
|
97
|
+
ParsingError,
|
|
98
|
+
LimitError,
|
|
99
|
+
ConfigurationError,
|
|
100
|
+
ERROR_CODES,
|
|
101
|
+
|
|
102
|
+
// Удобные алиасы
|
|
103
|
+
parse: csvToJson,
|
|
104
|
+
unparse: jsonToCsv,
|
|
105
|
+
parseAsync: csvToJsonAsync,
|
|
106
|
+
unparseAsync: jsonToCsvAsync,
|
|
107
|
+
|
|
108
|
+
// Версия
|
|
109
|
+
version: '3.0.0-core'
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// Экспорт для разных сред
|
|
113
|
+
if (typeof module !== 'undefined' && module.exports) {
|
|
114
|
+
// Node.js CommonJS
|
|
115
|
+
module.exports = jtcsvCore;
|
|
116
|
+
} else if (typeof define === 'function' && (define as any).amd) {
|
|
117
|
+
// AMD
|
|
118
|
+
(define as any)([], () => jtcsvCore);
|
|
119
|
+
} else if (typeof window !== 'undefined') {
|
|
120
|
+
// Браузер (глобальная переменная)
|
|
121
|
+
(window as any).jtcsv = jtcsvCore;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export default jtcsvCore;
|
|
125
|
+
export {
|
|
126
|
+
jsonToCsv,
|
|
127
|
+
preprocessData,
|
|
128
|
+
downloadAsCsv,
|
|
129
|
+
deepUnwrap,
|
|
130
|
+
csvToJson,
|
|
131
|
+
csvToJsonIterator,
|
|
132
|
+
parseCsvFile,
|
|
133
|
+
parseCsvFileStream,
|
|
134
|
+
jsonToCsvStream,
|
|
135
|
+
jsonToNdjsonStream,
|
|
136
|
+
csvToJsonStream,
|
|
137
|
+
autoDetectDelimiter,
|
|
138
|
+
// Асинхронные функции
|
|
139
|
+
jsonToCsvAsync,
|
|
140
|
+
csvToJsonAsync,
|
|
141
|
+
parseCsvFileAsync,
|
|
142
|
+
autoDetectDelimiterAsync,
|
|
143
|
+
downloadAsCsvAsync,
|
|
144
|
+
// Error classes
|
|
145
|
+
ValidationError,
|
|
146
|
+
SecurityError,
|
|
147
|
+
FileSystemError,
|
|
148
|
+
ParsingError,
|
|
149
|
+
LimitError,
|
|
150
|
+
ConfigurationError,
|
|
151
|
+
ERROR_CODES
|
|
152
|
+
};
|