jtcsv 3.0.0 → 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 (258) hide show
  1. package/README.md +205 -146
  2. package/bin/jtcsv.ts +280 -202
  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 +336 -7
  23. package/dist/jtcsv-core.cjs.js.map +1 -1
  24. package/dist/jtcsv-core.esm.js +336 -7
  25. package/dist/jtcsv-core.esm.js.map +1 -1
  26. package/dist/jtcsv-core.umd.js +336 -7
  27. package/dist/jtcsv-core.umd.js.map +1 -1
  28. package/dist/jtcsv-full.cjs.js +336 -7
  29. package/dist/jtcsv-full.cjs.js.map +1 -1
  30. package/dist/jtcsv-full.esm.js +336 -7
  31. package/dist/jtcsv-full.esm.js.map +1 -1
  32. package/dist/jtcsv-full.umd.js +336 -7
  33. package/dist/jtcsv-full.umd.js.map +1 -1
  34. package/dist/jtcsv-workers.esm.js +9 -0
  35. package/dist/jtcsv-workers.esm.js.map +1 -1
  36. package/dist/jtcsv-workers.umd.js +9 -0
  37. package/dist/jtcsv-workers.umd.js.map +1 -1
  38. package/dist/jtcsv.cjs.js +1998 -2092
  39. package/dist/jtcsv.cjs.js.map +1 -1
  40. package/dist/jtcsv.esm.js +1994 -2092
  41. package/dist/jtcsv.esm.js.map +1 -1
  42. package/dist/jtcsv.umd.js +2157 -2251
  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/{src → dist/src}/web-server/index.js +251 -286
  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 +2 -2
  131. package/examples/advanced/performance-optimization.ts +2 -2
  132. package/examples/cli-advanced-usage.md +2 -0
  133. package/examples/cli-tool.ts +1 -1
  134. package/examples/large-dataset-example.ts +2 -2
  135. package/examples/simple-usage.ts +2 -2
  136. package/examples/streaming-example.ts +1 -1
  137. package/index.d.ts +186 -15
  138. package/package.json +43 -108
  139. package/plugins.d.ts +37 -0
  140. package/schema.d.ts +103 -0
  141. package/src/browser/csv-to-json-browser.ts +233 -3
  142. package/src/browser/errors-browser.ts +45 -28
  143. package/src/browser/json-to-csv-browser.ts +81 -5
  144. package/src/browser/streams.ts +73 -6
  145. package/src/core/delimiter-cache.ts +21 -11
  146. package/src/core/plugin-system.ts +343 -155
  147. package/src/core/transform-hooks.ts +20 -12
  148. package/src/engines/fast-path-engine.ts +48 -32
  149. package/src/errors.ts +1 -72
  150. package/src/formats/ndjson-parser.ts +6 -0
  151. package/src/formats/tsv-parser.ts +6 -0
  152. package/src/types/index.ts +21 -1
  153. package/src/utils/validators.ts +35 -0
  154. package/src/web-server/index.ts +1 -1
  155. package/bin/jtcsv.js +0 -2532
  156. package/csv-to-json.js +0 -711
  157. package/errors.js +0 -394
  158. package/examples/advanced/conditional-transformations.js +0 -446
  159. package/examples/advanced/csv-parser.worker.js +0 -89
  160. package/examples/advanced/nested-objects-example.js +0 -306
  161. package/examples/advanced/performance-optimization.js +0 -504
  162. package/examples/advanced/run-demo-server.js +0 -116
  163. package/examples/cli-batch-processing.js +0 -38
  164. package/examples/cli-tool.js +0 -183
  165. package/examples/error-handling.js +0 -338
  166. package/examples/express-api.js +0 -164
  167. package/examples/large-dataset-example.js +0 -182
  168. package/examples/ndjson-processing.js +0 -434
  169. package/examples/plugin-excel-exporter.js +0 -406
  170. package/examples/schema-validation.js +0 -640
  171. package/examples/simple-usage.js +0 -282
  172. package/examples/streaming-example.js +0 -418
  173. package/examples/web-workers-advanced.js +0 -28
  174. package/index.js +0 -82
  175. package/json-save.js +0 -255
  176. package/json-to-csv.js +0 -668
  177. package/plugins/README.md +0 -91
  178. package/plugins/express-middleware/README.md +0 -83
  179. package/plugins/express-middleware/example.js +0 -135
  180. package/plugins/express-middleware/example.ts +0 -135
  181. package/plugins/express-middleware/index.d.ts +0 -114
  182. package/plugins/express-middleware/index.js +0 -512
  183. package/plugins/express-middleware/index.ts +0 -557
  184. package/plugins/express-middleware/package.json +0 -52
  185. package/plugins/fastify-plugin/index.js +0 -404
  186. package/plugins/fastify-plugin/index.ts +0 -443
  187. package/plugins/fastify-plugin/package.json +0 -55
  188. package/plugins/hono/README.md +0 -28
  189. package/plugins/hono/index.d.ts +0 -12
  190. package/plugins/hono/index.js +0 -36
  191. package/plugins/hono/index.ts +0 -226
  192. package/plugins/hono/package.json +0 -35
  193. package/plugins/nestjs/README.md +0 -35
  194. package/plugins/nestjs/index.d.ts +0 -25
  195. package/plugins/nestjs/index.js +0 -77
  196. package/plugins/nestjs/index.ts +0 -201
  197. package/plugins/nestjs/package.json +0 -37
  198. package/plugins/nextjs-api/README.md +0 -57
  199. package/plugins/nextjs-api/examples/ConverterComponent.jsx +0 -386
  200. package/plugins/nextjs-api/examples/ConverterComponent.tsx +0 -386
  201. package/plugins/nextjs-api/examples/api-convert.js +0 -67
  202. package/plugins/nextjs-api/examples/api-convert.ts +0 -67
  203. package/plugins/nextjs-api/index.js +0 -387
  204. package/plugins/nextjs-api/index.tsx +0 -339
  205. package/plugins/nextjs-api/package.json +0 -63
  206. package/plugins/nextjs-api/route.js +0 -370
  207. package/plugins/nextjs-api/route.ts +0 -370
  208. package/plugins/nuxt/README.md +0 -24
  209. package/plugins/nuxt/index.js +0 -21
  210. package/plugins/nuxt/index.ts +0 -94
  211. package/plugins/nuxt/package.json +0 -35
  212. package/plugins/nuxt/runtime/composables/useJtcsv.js +0 -6
  213. package/plugins/nuxt/runtime/composables/useJtcsv.ts +0 -100
  214. package/plugins/nuxt/runtime/plugin.js +0 -6
  215. package/plugins/nuxt/runtime/plugin.ts +0 -71
  216. package/plugins/remix/README.md +0 -26
  217. package/plugins/remix/index.d.ts +0 -16
  218. package/plugins/remix/index.js +0 -62
  219. package/plugins/remix/index.ts +0 -260
  220. package/plugins/remix/package.json +0 -35
  221. package/plugins/sveltekit/README.md +0 -28
  222. package/plugins/sveltekit/index.d.ts +0 -17
  223. package/plugins/sveltekit/index.js +0 -54
  224. package/plugins/sveltekit/index.ts +0 -301
  225. package/plugins/sveltekit/package.json +0 -33
  226. package/plugins/trpc/README.md +0 -25
  227. package/plugins/trpc/index.d.ts +0 -7
  228. package/plugins/trpc/index.js +0 -32
  229. package/plugins/trpc/index.ts +0 -267
  230. package/plugins/trpc/package.json +0 -34
  231. package/src/browser/browser-functions.js +0 -219
  232. package/src/browser/core.js +0 -92
  233. package/src/browser/csv-to-json-browser.js +0 -722
  234. package/src/browser/errors-browser.js +0 -212
  235. package/src/browser/extensions/plugins.js +0 -92
  236. package/src/browser/extensions/workers.js +0 -39
  237. package/src/browser/index.js +0 -113
  238. package/src/browser/json-to-csv-browser.js +0 -319
  239. package/src/browser/streams.js +0 -403
  240. package/src/browser/workers/csv-parser.worker.js +0 -377
  241. package/src/browser/workers/worker-pool.js +0 -527
  242. package/src/core/delimiter-cache.js +0 -200
  243. package/src/core/node-optimizations.js +0 -408
  244. package/src/core/plugin-system.js +0 -494
  245. package/src/core/transform-hooks.js +0 -350
  246. package/src/engines/fast-path-engine-new.js +0 -338
  247. package/src/engines/fast-path-engine.js +0 -844
  248. package/src/errors.js +0 -26
  249. package/src/formats/ndjson-parser.js +0 -467
  250. package/src/formats/tsv-parser.js +0 -339
  251. package/src/index-with-plugins.js +0 -378
  252. package/src/utils/bom-utils.js +0 -259
  253. package/src/utils/encoding-support.js +0 -124
  254. package/src/utils/schema-validator.js +0 -594
  255. package/src/utils/transform-loader.js +0 -205
  256. package/src/utils/zod-adapter.js +0 -170
  257. package/stream-csv-to-json.js +0 -560
  258. package/stream-json-to-csv.js +0 -465
@@ -1,370 +0,0 @@
1
- /**
2
- * Next.js API Route для JTCSV
3
- * Готовый API endpoint для конвертации CSV/JSON в Next.js приложениях
4
- *
5
- * @version 1.0.0
6
- * @date 2026-01-23
7
- *
8
- * @usage
9
- * 1. Скопируйте этот файл в pages/api/convert.js
10
- * 2. Или импортируйте функции в существующие API routes
11
- */
12
-
13
- import { csvToJson, jsonToCsv } from 'jtcsv';
14
-
15
- /**
16
- * Конфигурация Next.js API route
17
- */
18
- export const config = {
19
- api: {
20
- bodyParser: {
21
- sizeLimit: '50mb', // Максимальный размер тела запроса
22
-
23
- // Кастомный парсер для определения формата
24
- parse: (req) => {
25
- const contentType = req.headers['content-type'] || '';
26
-
27
- if (contentType.includes('application/json')) {
28
- return JSON.parse(req.body);
29
- } else if (contentType.includes('text/csv') || contentType.includes('text/plain')) {
30
- return req.body;
31
- }
32
-
33
- // Пытаемся определить автоматически
34
- try {
35
- return JSON.parse(req.body);
36
- } catch {
37
- return req.body;
38
- }
39
- }
40
- }
41
- }
42
- };
43
-
44
- /**
45
- * Основной обработчик API route
46
- *
47
- * @param {import('next').NextApiRequest} req - Next.js request object
48
- * @param {import('next').NextApiResponse} res - Next.js response object
49
- *
50
- * @example
51
- * // Пример запроса:
52
- * // POST /api/convert
53
- * // Content-Type: application/json
54
- * // Body: [{ "name": "John", "age": 30 }]
55
- *
56
- * @example
57
- * // Пример запроса:
58
- * // POST /api/convert?format=csv
59
- * // Content-Type: text/csv
60
- * // Body: name,age\nJohn,30\nJane,25
61
- */
62
- export default async function handler(req, res) {
63
- // Поддерживаем только POST запросы
64
- if (req.method !== 'POST') {
65
- return res.status(405).json({
66
- success: false,
67
- error: 'Method not allowed',
68
- allowed: ['POST']
69
- });
70
- }
71
-
72
- const startTime = Date.now();
73
- const contentType = req.headers['content-type'] || '';
74
- const acceptHeader = req.headers['accept'] || 'application/json';
75
-
76
- try {
77
- const {
78
- format,
79
- delimiter = ',',
80
- includeHeaders = 'true',
81
- parseNumbers = 'true',
82
- parseBooleans = 'true',
83
- useFastPath = 'true',
84
- preventCsvInjection = 'true'
85
- } = req.query;
86
-
87
- // Определяем желаемый формат вывода
88
- const outputFormat = format || (acceptHeader.includes('text/csv') ? 'csv' : 'json');
89
-
90
- // Определяем формат входных данных
91
- let inputFormat = 'unknown';
92
-
93
- if (contentType.includes('application/json') || Array.isArray(req.body)) {
94
- inputFormat = 'json';
95
- } else if (contentType.includes('text/csv') ||
96
- contentType.includes('text/plain') ||
97
- (typeof req.body === 'string' && req.body.includes(','))) {
98
- inputFormat = 'csv';
99
- }
100
-
101
- if (inputFormat === 'unknown') {
102
- return res.status(400).json({
103
- success: false,
104
- error: 'Unable to determine input format',
105
- code: 'UNKNOWN_FORMAT',
106
- suggestions: [
107
- 'Set Content-Type header to application/json or text/csv',
108
- 'Or send JSON array/object or CSV string'
109
- ]
110
- });
111
- }
112
-
113
- // Опции конвертации
114
- const options = {
115
- delimiter,
116
- includeHeaders: includeHeaders === 'true',
117
- parseNumbers: parseNumbers === 'true',
118
- parseBooleans: parseBooleans === 'true',
119
- useFastPath: useFastPath === 'true',
120
- preventCsvInjection: preventCsvInjection === 'true',
121
- rfc4180Compliant: true
122
- };
123
-
124
- let result;
125
- const stats = {
126
- inputSize: 0,
127
- outputSize: 0,
128
- processingTime: 0,
129
- conversion: `${inputFormat}→${outputFormat}`
130
- };
131
-
132
- // Выполняем конвертацию
133
- if (inputFormat === 'json' && outputFormat === 'csv') {
134
- const jsonData = Array.isArray(req.body) ? req.body : [req.body];
135
- stats.inputSize = Buffer.byteLength(JSON.stringify(jsonData));
136
-
137
- result = await jsonToCsv(jsonData, options);
138
- stats.outputSize = Buffer.byteLength(result);
139
-
140
- res.setHeader('Content-Type', 'text/csv; charset=utf-8');
141
- res.setHeader('Content-Disposition', 'attachment; filename="data.csv"');
142
-
143
- } else if (inputFormat === 'csv' && outputFormat === 'json') {
144
- const csvData = typeof req.body === 'string' ? req.body : String(req.body);
145
- stats.inputSize = Buffer.byteLength(csvData);
146
-
147
- result = await csvToJson(csvData, options);
148
- stats.outputSize = Buffer.byteLength(JSON.stringify(result));
149
-
150
- res.setHeader('Content-Type', 'application/json; charset=utf-8');
151
-
152
- } else {
153
- // Нет необходимости в конвертации
154
- result = req.body;
155
- stats.conversion = 'none';
156
- stats.inputSize = Buffer.byteLength(JSON.stringify(result));
157
- stats.outputSize = stats.inputSize;
158
- }
159
-
160
- stats.processingTime = Date.now() - startTime;
161
-
162
- // Формируем ответ
163
- const response = {
164
- success: true,
165
- data: result,
166
- format: outputFormat,
167
- inputFormat,
168
- stats,
169
- options: {
170
- ...options,
171
- delimiter
172
- }
173
- };
174
-
175
- // Если запрашивали CSV, отправляем как plain text
176
- if (outputFormat === 'csv') {
177
- return res.status(200).send(result);
178
- }
179
-
180
- return res.status(200).json(response);
181
-
182
- } catch (error) {
183
- console.error('Conversion error:', error);
184
-
185
- const errorResponse = {
186
- success: false,
187
- error: error.message,
188
- code: error.code || 'CONVERSION_ERROR',
189
- timestamp: new Date().toISOString()
190
- };
191
-
192
- // Добавляем дополнительную информацию для отладки в development
193
- if (process.env.NODE_ENV === 'development') {
194
- errorResponse.stack = error.stack;
195
- errorResponse.details = {
196
- contentType: req.headers['content-type'],
197
- contentLength: req.headers['content-length'],
198
- method: req.method,
199
- url: req.url,
200
- query: req.query
201
- };
202
- }
203
-
204
- return res.status(400).json(errorResponse);
205
- }
206
- }
207
-
208
- /**
209
- * Специализированный обработчик для CSV → JSON
210
- */
211
- export async function csvToJsonHandler(req, res) {
212
- if (req.method !== 'POST') {
213
- return res.status(405).json({
214
- success: false,
215
- error: 'Method not allowed',
216
- allowed: ['POST']
217
- });
218
- }
219
-
220
- const startTime = Date.now();
221
-
222
- try {
223
- const csvData = req.body;
224
-
225
- if (!csvData || (typeof csvData !== 'string' && !Buffer.isBuffer(csvData))) {
226
- return res.status(400).json({
227
- success: false,
228
- error: 'CSV data is required'
229
- });
230
- }
231
-
232
- const {
233
- delimiter = ',',
234
- parseNumbers = 'true',
235
- parseBooleans = 'true',
236
- useFastPath = 'true'
237
- } = req.query;
238
-
239
- const result = await csvToJson(csvData, {
240
- delimiter,
241
- parseNumbers: parseNumbers === 'true',
242
- parseBooleans: parseBooleans === 'true',
243
- useFastPath: useFastPath === 'true',
244
- preventCsvInjection: true,
245
- rfc4180Compliant: true
246
- });
247
-
248
- return res.status(200).json({
249
- success: true,
250
- data: result,
251
- stats: {
252
- rows: result.length,
253
- processingTime: Date.now() - startTime
254
- }
255
- });
256
-
257
- } catch (error) {
258
- return res.status(400).json({
259
- success: false,
260
- error: error.message
261
- });
262
- }
263
- }
264
-
265
- /**
266
- * Специализированный обработчик для JSON → CSV
267
- */
268
- export async function jsonToCsvHandler(req, res) {
269
- if (req.method !== 'POST') {
270
- return res.status(405).json({
271
- success: false,
272
- error: 'Method not allowed',
273
- allowed: ['POST']
274
- });
275
- }
276
-
277
- const startTime = Date.now();
278
-
279
- try {
280
- const jsonData = req.body;
281
-
282
- if (!jsonData || (typeof jsonData !== 'object' && typeof jsonData !== 'string')) {
283
- return res.status(400).json({
284
- success: false,
285
- error: 'JSON data is required'
286
- });
287
- }
288
-
289
- const {
290
- delimiter = ',',
291
- includeHeaders = 'true',
292
- useFastPath = 'true'
293
- } = req.query;
294
-
295
- const data = typeof jsonData === 'string' ? JSON.parse(jsonData) : jsonData;
296
- const result = await jsonToCsv(data, {
297
- delimiter,
298
- includeHeaders: includeHeaders === 'true',
299
- useFastPath: useFastPath === 'true',
300
- preventCsvInjection: true,
301
- rfc4180Compliant: true
302
- });
303
-
304
- res.setHeader('Content-Type', 'text/csv; charset=utf-8');
305
- res.setHeader('Content-Disposition', 'attachment; filename="data.csv"');
306
-
307
- return res.status(200).send(result);
308
-
309
- } catch (error) {
310
- return res.status(400).json({
311
- success: false,
312
- error: error.message
313
- });
314
- }
315
- }
316
-
317
- /**
318
- * Health check endpoint
319
- */
320
- export async function healthCheckHandler(req, res) {
321
- if (req.method !== 'GET') {
322
- return res.status(405).json({
323
- success: false,
324
- error: 'Method not allowed',
325
- allowed: ['GET']
326
- });
327
- }
328
-
329
- return res.status(200).json({
330
- service: 'jtcsv-nextjs-api',
331
- status: 'healthy',
332
- version: '1.0.0',
333
- timestamp: new Date().toISOString(),
334
- features: {
335
- csvToJson: true,
336
- jsonToCsv: true,
337
- fastPathEngine: true,
338
- csvInjectionProtection: true,
339
- streaming: true,
340
- ndjson: true
341
- }
342
- });
343
- }
344
-
345
- /**
346
- * Утилита для создания кастомных API endpoints
347
- */
348
- export function createJtcsvApiEndpoint(options = {}) {
349
- const {
350
- route = '/api/convert',
351
- allowedMethods = ['POST'],
352
- defaultFormat = 'json',
353
- ...defaultOptions
354
- } = options;
355
-
356
- return async function customHandler(req, res) {
357
- // Проверяем разрешенные методы
358
- if (!allowedMethods.includes(req.method)) {
359
- return res.status(405).json({
360
- success: false,
361
- error: `Method ${req.method} not allowed`,
362
- allowed: allowedMethods
363
- });
364
- }
365
-
366
- // Здесь можно добавить кастомную логику
367
- // Пока просто используем основной handler
368
- return handler(req, res);
369
- };
370
- }