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
@@ -1,54 +0,0 @@
1
- const jtcsv = require('jtcsv');
2
-
3
- function normalizeFilename(filename) {
4
- if (!filename || typeof filename !== 'string') {
5
- return 'export.csv';
6
- }
7
- return filename.includes('.') ? filename : `${filename}.csv`;
8
- }
9
-
10
- async function parseCsv(request, options = {}) {
11
- if (!request || typeof request.text !== 'function') {
12
- throw new Error('parseCsv expects a Request instance');
13
- }
14
-
15
- const { fieldName = 'file', ...csvOptions } = options;
16
- const contentType = request.headers?.get?.('content-type') || '';
17
- let csvText = null;
18
-
19
- if (options.formData || contentType.includes('multipart/form-data')) {
20
- const formData = await request.formData();
21
- const value = formData.get(fieldName) ?? formData.values().next().value;
22
- if (value && typeof value.text === 'function') {
23
- csvText = await value.text();
24
- } else if (value != null) {
25
- csvText = String(value);
26
- }
27
- } else {
28
- csvText = await request.text();
29
- }
30
-
31
- if (!csvText) {
32
- throw new Error('No CSV payload found in request');
33
- }
34
-
35
- return jtcsv.csvToJson(csvText, csvOptions);
36
- }
37
-
38
- function generateCsv(data, filename = 'export.csv', options = {}) {
39
- const safeName = normalizeFilename(filename);
40
- const rows = Array.isArray(data) ? data : [data];
41
- const csv = jtcsv.jsonToCsv(rows, options);
42
-
43
- return new Response(csv, {
44
- headers: {
45
- 'Content-Type': 'text/csv; charset=utf-8',
46
- 'Content-Disposition': `attachment; filename="${safeName}"`
47
- }
48
- });
49
- }
50
-
51
- module.exports = {
52
- parseCsv,
53
- generateCsv
54
- };
@@ -1,33 +0,0 @@
1
- {
2
- "name": "@jtcsv/sveltekit",
3
- "version": "1.0.0",
4
- "description": "SvelteKit helpers for JTCSV",
5
- "main": "index.js",
6
- "types": "index.d.ts",
7
- "keywords": [
8
- "sveltekit",
9
- "csv",
10
- "json",
11
- "converter",
12
- "jtcsv"
13
- ],
14
- "author": "Ruslan Fomenko",
15
- "license": "MIT",
16
- "repository": {
17
- "type": "git",
18
- "url": "git+https://github.com/Linol-Hamelton/jtcsv.git",
19
- "directory": "plugins/sveltekit"
20
- },
21
- "bugs": {
22
- "url": "https://github.com/Linol-Hamelton/jtcsv/issues"
23
- },
24
- "homepage": "https://github.com/Linol-Hamelton/jtcsv/tree/main/plugins/sveltekit#readme",
25
- "peerDependencies": {
26
- "jtcsv": "^2.1.3"
27
- },
28
- "files": [
29
- "index.js",
30
- "index.d.ts",
31
- "README.md"
32
- ]
33
- }
@@ -1,25 +0,0 @@
1
- # @jtcsv/trpc
2
-
3
- Middleware helper that parses CSV input for tRPC procedures.
4
-
5
- ## Install
6
- ```bash
7
- npm install @jtcsv/trpc jtcsv
8
- ```
9
-
10
- ## Usage
11
- ```javascript
12
- import { initTRPC } from '@trpc/server';
13
- import { z } from 'zod';
14
- import { createCsvProcedure } from '@jtcsv/trpc';
15
-
16
- const t = initTRPC.create();
17
-
18
- export const router = t.router({
19
- parseCsv: createCsvProcedure(t, z.string())
20
- .mutation(async ({ input }) => ({ rows: input }))
21
- });
22
- ```
23
-
24
- ## Exports
25
- - createCsvProcedure
@@ -1,7 +0,0 @@
1
- import type { CsvToJsonOptions } from 'jtcsv';
2
-
3
- export function createCsvProcedure<TProcedureBuilder>(
4
- t: { procedure: TProcedureBuilder },
5
- schema: unknown,
6
- options?: CsvToJsonOptions
7
- ): TProcedureBuilder;
@@ -1,32 +0,0 @@
1
- const jtcsv = require('jtcsv');
2
-
3
- function extractCsvText(input) {
4
- if (typeof input === 'string') {
5
- return input;
6
- }
7
- if (input && typeof input === 'object' && typeof input.csv === 'string') {
8
- return input.csv;
9
- }
10
- return null;
11
- }
12
-
13
- function createCsvProcedure(t, schema, options = {}) {
14
- if (!t || !t.procedure) {
15
- throw new Error('createCsvProcedure expects initTRPC instance');
16
- }
17
-
18
- return t.procedure
19
- .input(schema)
20
- .use(async ({ input, next }) => {
21
- const csvText = extractCsvText(input);
22
- if (!csvText) {
23
- throw new Error('CSV input must be a string or { csv: string }');
24
- }
25
- const parsed = jtcsv.csvToJson(csvText, options);
26
- return next({ input: parsed });
27
- });
28
- }
29
-
30
- module.exports = {
31
- createCsvProcedure
32
- };
@@ -1,34 +0,0 @@
1
- {
2
- "name": "@jtcsv/trpc",
3
- "version": "1.0.0",
4
- "description": "tRPC helper for JTCSV CSV parsing",
5
- "main": "index.js",
6
- "types": "index.d.ts",
7
- "keywords": [
8
- "trpc",
9
- "csv",
10
- "json",
11
- "converter",
12
- "jtcsv"
13
- ],
14
- "author": "Ruslan Fomenko",
15
- "license": "MIT",
16
- "repository": {
17
- "type": "git",
18
- "url": "git+https://github.com/Linol-Hamelton/jtcsv.git",
19
- "directory": "plugins/trpc"
20
- },
21
- "bugs": {
22
- "url": "https://github.com/Linol-Hamelton/jtcsv/issues"
23
- },
24
- "homepage": "https://github.com/Linol-Hamelton/jtcsv/tree/main/plugins/trpc#readme",
25
- "peerDependencies": {
26
- "@trpc/server": "^10.0.0",
27
- "jtcsv": "^2.1.3"
28
- },
29
- "files": [
30
- "index.js",
31
- "index.d.ts",
32
- "README.md"
33
- ]
34
- }
@@ -1,219 +0,0 @@
1
- // Браузерные специфичные функции для jtcsv
2
- // Функции, которые работают только в браузере
3
-
4
- import { jsonToCsv } from './json-to-csv-browser.js';
5
- import { csvToJson, csvToJsonIterator } from './csv-to-json-browser.js';
6
- import { csvToJsonStream, jsonToCsvStream, jsonToNdjsonStream } from './streams.js';
7
- import { ValidationError } from './errors-browser.js';
8
-
9
- /**
10
- * Скачивает JSON данные как CSV файл
11
- *
12
- * @param {Array<Object>} data - Массив объектов для конвертации
13
- * @param {string} [filename='data.csv'] - Имя файла для скачивания
14
- * @param {Object} [options] - Опции для jsonToCsv
15
- * @returns {void}
16
- *
17
- * @example
18
- * const data = [
19
- * { id: 1, name: 'John' },
20
- * { id: 2, name: 'Jane' }
21
- * ];
22
- * downloadAsCsv(data, 'users.csv', { delimiter: ',' });
23
- */
24
- export function downloadAsCsv(data, filename = 'data.csv', options = {}) {
25
- // Проверка что мы в браузере
26
- if (typeof window === 'undefined') {
27
- throw new ValidationError('downloadAsCsv() работает только в браузере. Используйте saveAsCsv() в Node.js');
28
- }
29
-
30
- // Валидация имени файла
31
- if (typeof filename !== 'string' || filename.trim() === '') {
32
- throw new ValidationError('Filename must be a non-empty string');
33
- }
34
-
35
- // Добавление расширения .csv если его нет
36
- if (!filename.toLowerCase().endsWith('.csv')) {
37
- filename += '.csv';
38
- }
39
-
40
- // Конвертация в CSV
41
- const csv = jsonToCsv(data, options);
42
-
43
- // Создание Blob
44
- const blob = new Blob([csv], {
45
- type: 'text/csv;charset=utf-8;'
46
- });
47
-
48
- // Создание ссылки для скачивания
49
- const link = document.createElement('a');
50
-
51
- // Создание URL для Blob
52
- const url = URL.createObjectURL(blob);
53
-
54
- // Настройка ссылки
55
- link.setAttribute('href', url);
56
- link.setAttribute('download', filename);
57
- link.style.visibility = 'hidden';
58
-
59
- // Добавление в DOM и клик
60
- document.body.appendChild(link);
61
- link.click();
62
-
63
- // Очистка
64
- setTimeout(() => {
65
- document.body.removeChild(link);
66
- URL.revokeObjectURL(url);
67
- }, 100);
68
- }
69
-
70
- /**
71
- * Парсит CSV файл из input[type="file"] в JSON
72
- *
73
- * @param {File} file - File объект из input
74
- * @param {Object} [options] - Опции для csvToJson
75
- * @returns {Promise<Array<Object>>} Promise с JSON данными
76
- *
77
- * @example
78
- * // HTML: <input type="file" id="csvFile" accept=".csv">
79
- * const fileInput = document.getElementById('csvFile');
80
- * const json = await parseCsvFile(fileInput.files[0], { delimiter: ',' });
81
- */
82
- export async function parseCsvFile(file, options = {}) {
83
- // Проверка что мы в браузере
84
- if (typeof window === 'undefined') {
85
- throw new ValidationError('parseCsvFile() работает только в браузере. Используйте readCsvAsJson() в Node.js');
86
- }
87
-
88
- // Валидация файла
89
- if (!(file instanceof File)) {
90
- throw new ValidationError('Input must be a File object');
91
- }
92
-
93
- // Проверка расширения файла
94
- if (!file.name.toLowerCase().endsWith('.csv')) {
95
- throw new ValidationError('File must have .csv extension');
96
- }
97
-
98
- // Проверка размера файла (предупреждение для больших файлов)
99
- const MAX_SIZE_WARNING = 50 * 1024 * 1024; // 50MB
100
- if (file.size > MAX_SIZE_WARNING && process.env.NODE_ENV !== 'production') {
101
- console.warn(
102
- `⚠️ Warning: Processing large file (${(file.size / 1024 / 1024).toFixed(2)}MB).\n` +
103
- '💡 Consider using Web Workers for better performance.\n' +
104
- '🔧 Tip: Use parseCSVWithWorker() for files > 10MB.'
105
- );
106
- }
107
-
108
- return new Promise((resolve, reject) => {
109
- const reader = new FileReader();
110
-
111
- reader.onload = function (event) {
112
- try {
113
- const csvText = event.target.result;
114
- const json = csvToJson(csvText, options);
115
- resolve(json);
116
- } catch (error) {
117
- reject(error);
118
- }
119
- };
120
-
121
- reader.onerror = function () {
122
- reject(new ValidationError('Ошибка чтения файла'));
123
- };
124
-
125
- reader.onabort = function () {
126
- reject(new ValidationError('Чтение файла прервано'));
127
- };
128
-
129
- // Чтение как текст
130
- reader.readAsText(file, 'UTF-8');
131
- });
132
- }
133
-
134
- /**
135
- * Stream CSV file as async iterator without full buffering.
136
- *
137
- * @param {File} file - File selected from input
138
- * @param {Object} [options] - csvToJson options
139
- * @returns {AsyncGenerator<Object>} Async iterator of rows
140
- */
141
- export function parseCsvFileStream(file, options = {}) {
142
- if (typeof window === 'undefined') {
143
- throw new ValidationError('parseCsvFileStream() is browser-only. Use readCsvAsJson() in Node.js');
144
- }
145
-
146
- if (!(file instanceof File)) {
147
- throw new ValidationError('Input must be a File object');
148
- }
149
-
150
- if (!file.name.toLowerCase().endsWith('.csv')) {
151
- throw new ValidationError('File must have .csv extension');
152
- }
153
-
154
- return csvToJsonIterator(file, options);
155
- }
156
-
157
- /**
158
- * Создает CSV файл из JSON данных (альтернатива downloadAsCsv)
159
- * Возвращает Blob вместо автоматического скачивания
160
- *
161
- * @param {Array<Object>} data - Массив объектов
162
- * @param {Object} [options] - Опции для jsonToCsv
163
- * @returns {Blob} CSV Blob
164
- */
165
- export function createCsvBlob(data, options = {}) {
166
- const csv = jsonToCsv(data, options);
167
- return new Blob([csv], {
168
- type: 'text/csv;charset=utf-8;'
169
- });
170
- }
171
-
172
- /**
173
- * Парсит CSV строку из Blob
174
- *
175
- * @param {Blob} blob - CSV Blob
176
- * @param {Object} [options] - Опции для csvToJson
177
- * @returns {Promise<Array<Object>>} Promise с JSON данными
178
- */
179
- export async function parseCsvBlob(blob, options = {}) {
180
- if (!(blob instanceof Blob)) {
181
- throw new ValidationError('Input must be a Blob object');
182
- }
183
-
184
- return new Promise((resolve, reject) => {
185
- const reader = new FileReader();
186
-
187
- reader.onload = function (event) {
188
- try {
189
- const csvText = event.target.result;
190
- const json = csvToJson(csvText, options);
191
- resolve(json);
192
- } catch (error) {
193
- reject(error);
194
- }
195
- };
196
-
197
- reader.onerror = function () {
198
- reject(new ValidationError('Ошибка чтения Blob'));
199
- };
200
-
201
- reader.readAsText(blob, 'UTF-8');
202
- });
203
- }
204
-
205
- // Экспорт для Node.js совместимости
206
- if (typeof module !== 'undefined' && module.exports) {
207
- module.exports = {
208
- downloadAsCsv,
209
- parseCsvFile,
210
- parseCsvFileStream,
211
- createCsvBlob,
212
- parseCsvBlob,
213
- jsonToCsvStream,
214
- jsonToNdjsonStream,
215
- csvToJsonStream
216
- };
217
- }
218
-
219
- export { jsonToCsvStream, jsonToNdjsonStream, csvToJsonStream };