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.
Files changed (246) hide show
  1. package/README.md +204 -115
  2. package/bin/jtcsv.ts +2612 -0
  3. package/browser.d.ts +142 -0
  4. package/dist/benchmark.js +446 -0
  5. package/dist/benchmark.js.map +1 -0
  6. package/dist/bin/jtcsv.js +1940 -0
  7. package/dist/bin/jtcsv.js.map +1 -0
  8. package/dist/csv-to-json.js +1262 -0
  9. package/dist/csv-to-json.js.map +1 -0
  10. package/dist/errors.js +291 -0
  11. package/dist/errors.js.map +1 -0
  12. package/dist/eslint.config.js +147 -0
  13. package/dist/eslint.config.js.map +1 -0
  14. package/dist/index-core.js +95 -0
  15. package/dist/index-core.js.map +1 -0
  16. package/dist/index.js +93 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/json-save.js +229 -0
  19. package/dist/json-save.js.map +1 -0
  20. package/dist/json-to-csv.js +576 -0
  21. package/dist/json-to-csv.js.map +1 -0
  22. package/dist/jtcsv-core.cjs.js +1736 -0
  23. package/dist/jtcsv-core.cjs.js.map +1 -0
  24. package/dist/jtcsv-core.esm.js +1708 -0
  25. package/dist/jtcsv-core.esm.js.map +1 -0
  26. package/dist/jtcsv-core.umd.js +1742 -0
  27. package/dist/jtcsv-core.umd.js.map +1 -0
  28. package/dist/jtcsv-full.cjs.js +2241 -0
  29. package/dist/jtcsv-full.cjs.js.map +1 -0
  30. package/dist/jtcsv-full.esm.js +2209 -0
  31. package/dist/jtcsv-full.esm.js.map +1 -0
  32. package/dist/jtcsv-full.umd.js +2247 -0
  33. package/dist/jtcsv-full.umd.js.map +1 -0
  34. package/dist/jtcsv-workers.esm.js +768 -0
  35. package/dist/jtcsv-workers.esm.js.map +1 -0
  36. package/dist/jtcsv-workers.umd.js +782 -0
  37. package/dist/jtcsv-workers.umd.js.map +1 -0
  38. package/dist/jtcsv.cjs.js +1996 -2048
  39. package/dist/jtcsv.cjs.js.map +1 -1
  40. package/dist/jtcsv.esm.js +1992 -2048
  41. package/dist/jtcsv.esm.js.map +1 -1
  42. package/dist/jtcsv.umd.js +2157 -2209
  43. package/dist/jtcsv.umd.js.map +1 -1
  44. package/dist/plugins/express-middleware/index.js +350 -0
  45. package/dist/plugins/express-middleware/index.js.map +1 -0
  46. package/dist/plugins/fastify-plugin/index.js +315 -0
  47. package/dist/plugins/fastify-plugin/index.js.map +1 -0
  48. package/dist/plugins/hono/index.js +111 -0
  49. package/dist/plugins/hono/index.js.map +1 -0
  50. package/dist/plugins/nestjs/index.js +112 -0
  51. package/dist/plugins/nestjs/index.js.map +1 -0
  52. package/dist/plugins/nuxt/index.js +53 -0
  53. package/dist/plugins/nuxt/index.js.map +1 -0
  54. package/dist/plugins/remix/index.js +133 -0
  55. package/dist/plugins/remix/index.js.map +1 -0
  56. package/dist/plugins/sveltekit/index.js +155 -0
  57. package/dist/plugins/sveltekit/index.js.map +1 -0
  58. package/dist/plugins/trpc/index.js +136 -0
  59. package/dist/plugins/trpc/index.js.map +1 -0
  60. package/dist/run-demo.js +49 -0
  61. package/dist/run-demo.js.map +1 -0
  62. package/dist/src/browser/browser-functions.js +193 -0
  63. package/dist/src/browser/browser-functions.js.map +1 -0
  64. package/dist/src/browser/core.js +123 -0
  65. package/dist/src/browser/core.js.map +1 -0
  66. package/dist/src/browser/csv-to-json-browser.js +353 -0
  67. package/dist/src/browser/csv-to-json-browser.js.map +1 -0
  68. package/dist/src/browser/errors-browser.js +219 -0
  69. package/dist/src/browser/errors-browser.js.map +1 -0
  70. package/dist/src/browser/extensions/plugins.js +106 -0
  71. package/dist/src/browser/extensions/plugins.js.map +1 -0
  72. package/dist/src/browser/extensions/workers.js +66 -0
  73. package/dist/src/browser/extensions/workers.js.map +1 -0
  74. package/dist/src/browser/index.js +140 -0
  75. package/dist/src/browser/index.js.map +1 -0
  76. package/dist/src/browser/json-to-csv-browser.js +225 -0
  77. package/dist/src/browser/json-to-csv-browser.js.map +1 -0
  78. package/dist/src/browser/streams.js +340 -0
  79. package/dist/src/browser/streams.js.map +1 -0
  80. package/dist/src/browser/workers/csv-parser.worker.js +264 -0
  81. package/dist/src/browser/workers/csv-parser.worker.js.map +1 -0
  82. package/dist/src/browser/workers/worker-pool.js +338 -0
  83. package/dist/src/browser/workers/worker-pool.js.map +1 -0
  84. package/dist/src/core/delimiter-cache.js +196 -0
  85. package/dist/src/core/delimiter-cache.js.map +1 -0
  86. package/dist/src/core/node-optimizations.js +279 -0
  87. package/dist/src/core/node-optimizations.js.map +1 -0
  88. package/dist/src/core/plugin-system.js +399 -0
  89. package/dist/src/core/plugin-system.js.map +1 -0
  90. package/dist/src/core/transform-hooks.js +348 -0
  91. package/dist/src/core/transform-hooks.js.map +1 -0
  92. package/dist/src/engines/fast-path-engine-new.js +262 -0
  93. package/dist/src/engines/fast-path-engine-new.js.map +1 -0
  94. package/dist/src/engines/fast-path-engine.js +671 -0
  95. package/dist/src/engines/fast-path-engine.js.map +1 -0
  96. package/dist/src/errors.js +18 -0
  97. package/dist/src/errors.js.map +1 -0
  98. package/dist/src/formats/ndjson-parser.js +332 -0
  99. package/dist/src/formats/ndjson-parser.js.map +1 -0
  100. package/dist/src/formats/tsv-parser.js +230 -0
  101. package/dist/src/formats/tsv-parser.js.map +1 -0
  102. package/dist/src/index-with-plugins.js +259 -0
  103. package/dist/src/index-with-plugins.js.map +1 -0
  104. package/dist/src/types/index.js +3 -0
  105. package/dist/src/types/index.js.map +1 -0
  106. package/dist/src/utils/bom-utils.js +267 -0
  107. package/dist/src/utils/bom-utils.js.map +1 -0
  108. package/dist/src/utils/encoding-support.js +77 -0
  109. package/dist/src/utils/encoding-support.js.map +1 -0
  110. package/dist/src/utils/schema-validator.js +609 -0
  111. package/dist/src/utils/schema-validator.js.map +1 -0
  112. package/dist/src/utils/transform-loader.js +281 -0
  113. package/dist/src/utils/transform-loader.js.map +1 -0
  114. package/dist/src/utils/validators.js +40 -0
  115. package/dist/src/utils/validators.js.map +1 -0
  116. package/dist/src/utils/zod-adapter.js +144 -0
  117. package/dist/src/utils/zod-adapter.js.map +1 -0
  118. package/dist/src/web-server/index.js +648 -0
  119. package/dist/src/web-server/index.js.map +1 -0
  120. package/dist/src/workers/csv-multithreaded.js +211 -0
  121. package/dist/src/workers/csv-multithreaded.js.map +1 -0
  122. package/dist/src/workers/csv-parser.worker.js +179 -0
  123. package/dist/src/workers/csv-parser.worker.js.map +1 -0
  124. package/dist/src/workers/worker-pool.js +228 -0
  125. package/dist/src/workers/worker-pool.js.map +1 -0
  126. package/dist/stream-csv-to-json.js +665 -0
  127. package/dist/stream-csv-to-json.js.map +1 -0
  128. package/dist/stream-json-to-csv.js +389 -0
  129. package/dist/stream-json-to-csv.js.map +1 -0
  130. package/examples/advanced/conditional-transformations.ts +446 -0
  131. package/examples/advanced/csv-parser.worker.ts +89 -0
  132. package/examples/advanced/nested-objects-example.ts +306 -0
  133. package/examples/advanced/performance-optimization.ts +504 -0
  134. package/examples/advanced/run-demo-server.ts +116 -0
  135. package/examples/advanced/web-worker-usage.html +874 -0
  136. package/examples/async-multithreaded-example.ts +335 -0
  137. package/examples/cli-advanced-usage.md +290 -0
  138. package/examples/{cli-batch-processing.js → cli-batch-processing.ts} +38 -38
  139. package/examples/{cli-tool.js → cli-tool.ts} +5 -8
  140. package/examples/{error-handling.js → error-handling.ts} +356 -324
  141. package/examples/{express-api.js → express-api.ts} +161 -164
  142. package/examples/{large-dataset-example.js → large-dataset-example.ts} +201 -182
  143. package/examples/{ndjson-processing.js → ndjson-processing.ts} +456 -434
  144. package/examples/{plugin-excel-exporter.js → plugin-excel-exporter.ts} +6 -7
  145. package/examples/react-integration.tsx +637 -0
  146. package/examples/{schema-validation.js → schema-validation.ts} +2 -2
  147. package/examples/simple-usage.ts +194 -0
  148. package/examples/{streaming-example.js → streaming-example.ts} +12 -12
  149. package/index.d.ts +187 -18
  150. package/package.json +75 -81
  151. package/plugins.d.ts +37 -0
  152. package/schema.d.ts +103 -0
  153. package/src/browser/browser-functions.ts +402 -0
  154. package/src/browser/core.ts +152 -0
  155. package/src/browser/csv-to-json-browser.d.ts +3 -0
  156. package/src/browser/csv-to-json-browser.ts +494 -0
  157. package/src/browser/{errors-browser.js → errors-browser.ts} +305 -197
  158. package/src/browser/extensions/plugins.ts +93 -0
  159. package/src/browser/extensions/workers.ts +39 -0
  160. package/src/browser/globals.d.ts +5 -0
  161. package/src/browser/index.ts +192 -0
  162. package/src/browser/json-to-csv-browser.d.ts +3 -0
  163. package/src/browser/json-to-csv-browser.ts +338 -0
  164. package/src/browser/streams.ts +403 -0
  165. package/src/browser/workers/{csv-parser.worker.js → csv-parser.worker.ts} +3 -3
  166. package/src/browser/workers/{worker-pool.js → worker-pool.ts} +51 -30
  167. package/src/core/delimiter-cache.ts +320 -0
  168. package/src/core/{node-optimizations.js → node-optimizations.ts} +448 -407
  169. package/src/core/plugin-system.ts +588 -0
  170. package/src/core/transform-hooks.ts +566 -0
  171. package/src/engines/{fast-path-engine-new.js → fast-path-engine-new.ts} +11 -2
  172. package/src/engines/{fast-path-engine.js → fast-path-engine.ts} +79 -53
  173. package/src/errors.ts +1 -0
  174. package/src/formats/{ndjson-parser.js → ndjson-parser.ts} +24 -16
  175. package/src/formats/{tsv-parser.js → tsv-parser.ts} +18 -17
  176. package/src/{index-with-plugins.js → index-with-plugins.ts} +381 -357
  177. package/src/types/index.ts +275 -0
  178. package/src/utils/bom-utils.ts +373 -0
  179. package/src/utils/encoding-support.ts +155 -0
  180. package/src/utils/{schema-validator.js → schema-validator.ts} +814 -589
  181. package/src/utils/transform-loader.ts +389 -0
  182. package/src/utils/validators.ts +35 -0
  183. package/src/utils/zod-adapter.ts +280 -0
  184. package/src/web-server/{index.js → index.ts} +19 -19
  185. package/src/workers/csv-multithreaded.ts +310 -0
  186. package/src/workers/csv-parser.worker.ts +227 -0
  187. package/src/workers/worker-pool.ts +409 -0
  188. package/bin/jtcsv.js +0 -2462
  189. package/csv-to-json.js +0 -688
  190. package/errors.js +0 -208
  191. package/examples/simple-usage.js +0 -282
  192. package/index.js +0 -68
  193. package/json-save.js +0 -254
  194. package/json-to-csv.js +0 -526
  195. package/plugins/README.md +0 -91
  196. package/plugins/express-middleware/README.md +0 -64
  197. package/plugins/express-middleware/example.js +0 -136
  198. package/plugins/express-middleware/index.d.ts +0 -114
  199. package/plugins/express-middleware/index.js +0 -360
  200. package/plugins/express-middleware/package.json +0 -52
  201. package/plugins/fastify-plugin/index.js +0 -406
  202. package/plugins/fastify-plugin/package.json +0 -55
  203. package/plugins/hono/README.md +0 -28
  204. package/plugins/hono/index.d.ts +0 -12
  205. package/plugins/hono/index.js +0 -36
  206. package/plugins/hono/package.json +0 -35
  207. package/plugins/nestjs/README.md +0 -35
  208. package/plugins/nestjs/index.d.ts +0 -25
  209. package/plugins/nestjs/index.js +0 -77
  210. package/plugins/nestjs/package.json +0 -37
  211. package/plugins/nextjs-api/README.md +0 -57
  212. package/plugins/nextjs-api/examples/ConverterComponent.jsx +0 -386
  213. package/plugins/nextjs-api/examples/api-convert.js +0 -69
  214. package/plugins/nextjs-api/index.js +0 -387
  215. package/plugins/nextjs-api/package.json +0 -63
  216. package/plugins/nextjs-api/route.js +0 -371
  217. package/plugins/nuxt/README.md +0 -24
  218. package/plugins/nuxt/index.js +0 -21
  219. package/plugins/nuxt/package.json +0 -35
  220. package/plugins/nuxt/runtime/composables/useJtcsv.js +0 -6
  221. package/plugins/nuxt/runtime/plugin.js +0 -6
  222. package/plugins/remix/README.md +0 -26
  223. package/plugins/remix/index.d.ts +0 -16
  224. package/plugins/remix/index.js +0 -62
  225. package/plugins/remix/package.json +0 -35
  226. package/plugins/sveltekit/README.md +0 -28
  227. package/plugins/sveltekit/index.d.ts +0 -17
  228. package/plugins/sveltekit/index.js +0 -54
  229. package/plugins/sveltekit/package.json +0 -33
  230. package/plugins/trpc/README.md +0 -25
  231. package/plugins/trpc/index.d.ts +0 -7
  232. package/plugins/trpc/index.js +0 -32
  233. package/plugins/trpc/package.json +0 -34
  234. package/src/browser/browser-functions.js +0 -219
  235. package/src/browser/csv-to-json-browser.js +0 -700
  236. package/src/browser/index.js +0 -113
  237. package/src/browser/json-to-csv-browser.js +0 -309
  238. package/src/browser/streams.js +0 -393
  239. package/src/core/delimiter-cache.js +0 -186
  240. package/src/core/plugin-system.js +0 -476
  241. package/src/core/transform-hooks.js +0 -350
  242. package/src/errors.js +0 -26
  243. package/src/utils/transform-loader.js +0 -205
  244. package/stream-csv-to-json.js +0 -542
  245. package/stream-json-to-csv.js +0 -464
  246. /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
+ };
@@ -0,0 +1,3 @@
1
+ export function csvToJson(csv: string, options?: any): any[];
2
+ export function csvToJsonIterator(input: any, options?: any): AsyncGenerator<any, void, unknown>;
3
+ export function autoDetectDelimiter(csv: string, candidates?: string[]): string;