jtcsv 3.0.0 → 3.1.1

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 +1261 -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 +192 -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 +664 -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 +243 -305
  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,339 +0,0 @@
1
- /**
2
- * Next.js API Route plugin for jtcsv
3
- * Provides API routes for CSV/JSON conversion in Next.js applications
4
- * @module plugins/nextjs-api
5
- */
6
-
7
- // Note: Next.js types are optional - users need to install @types/next
8
- // We use conditional imports to avoid breaking the build
9
- type NextApiRequest = any;
10
- type NextApiResponse = any;
11
-
12
- import type { CsvToJsonOptions, JsonToCsvOptions } from '../../src/types';
13
- import { csvToJson, jsonToCsv } from '../../index-core';
14
- import { JtcsvError } from '../../errors';
15
-
16
- /**
17
- * Configuration options for the Next.js API plugin
18
- */
19
- export interface NextJsApiOptions {
20
- /** Maximum request body size in bytes (default: 10MB) */
21
- maxBodySize?: number;
22
- /** Allowed HTTP methods (default: ['POST']) */
23
- allowedMethods?: string[];
24
- /** Enable CORS headers (default: true) */
25
- enableCors?: boolean;
26
- /** Custom error handler */
27
- onError?: (error: Error, req: NextApiRequest, res: NextApiResponse) => void;
28
- }
29
-
30
- /**
31
- * Default configuration for the Next.js API plugin
32
- */
33
- const DEFAULT_OPTIONS: NextJsApiOptions = {
34
- maxBodySize: 10 * 1024 * 1024, // 10MB
35
- allowedMethods: ['POST'],
36
- enableCors: true,
37
- };
38
-
39
- /**
40
- * Creates a Next.js API route handler for CSV to JSON conversion
41
- * @param options - Plugin configuration options
42
- * @returns Next.js API route handler
43
- */
44
- export function createCsvToJsonApiHandler(options?: NextJsApiOptions) {
45
- const config = { ...DEFAULT_OPTIONS, ...options };
46
-
47
- return async function handler(req: NextApiRequest, res: NextApiResponse) {
48
- try {
49
- // Set CORS headers if enabled
50
- if (config.enableCors) {
51
- res.setHeader('Access-Control-Allow-Origin', '*');
52
- res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS');
53
- res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
54
- }
55
-
56
- // Handle OPTIONS request for CORS preflight
57
- if (req.method === 'OPTIONS') {
58
- return res.status(200).end();
59
- }
60
-
61
- // Validate HTTP method
62
- if (!config.allowedMethods?.includes(req.method || '')) {
63
- return res.status(405).json({
64
- error: 'Method Not Allowed',
65
- message: `Only ${config.allowedMethods?.join(', ')} methods are allowed`,
66
- });
67
- }
68
-
69
- // Validate content type
70
- const contentType = req.headers['content-type'] || '';
71
- if (!contentType.includes('text/csv') && !contentType.includes('application/csv')) {
72
- return res.status(400).json({
73
- error: 'Invalid Content-Type',
74
- message: 'Content-Type must be text/csv or application/csv',
75
- });
76
- }
77
-
78
- // Get request body
79
- let csvData: string;
80
- if (typeof req.body === 'string') {
81
- csvData = req.body;
82
- } else if (Buffer.isBuffer(req.body)) {
83
- csvData = req.body.toString('utf-8');
84
- } else {
85
- return res.status(400).json({
86
- error: 'Invalid Request Body',
87
- message: 'Request body must be a CSV string or buffer',
88
- });
89
- }
90
-
91
- // Validate body size
92
- if (csvData.length > (config.maxBodySize || DEFAULT_OPTIONS.maxBodySize!)) {
93
- return res.status(413).json({
94
- error: 'Payload Too Large',
95
- message: `Request body exceeds maximum size of ${config.maxBodySize} bytes`,
96
- });
97
- }
98
-
99
- // Parse query parameters for CSV options
100
- const csvOptions: CsvToJsonOptions = {
101
- delimiter: req.query.delimiter as string || ',',
102
- hasHeaders: req.query.hasHeaders !== 'false',
103
- trim: req.query.trim === 'true',
104
- maxRows: req.query.maxRows ? parseInt(req.query.maxRows as string, 10) : undefined,
105
- parseNumbers: req.query.parseNumbers === 'true',
106
- parseBooleans: req.query.parseBooleans === 'true',
107
- useFastPath: req.query.useFastPath !== 'false',
108
- preventCsvInjection: req.query.preventCsvInjection !== 'false',
109
- rfc4180Compliant: req.query.rfc4180Compliant !== 'false',
110
- };
111
-
112
- // Convert CSV to JSON
113
- const result = await csvToJson(csvData, csvOptions);
114
-
115
- // Return successful response
116
- return res.status(200).json({
117
- success: true,
118
- data: result,
119
- metadata: {
120
- rowCount: Array.isArray(result) ? result.length : 0,
121
- convertedAt: new Date().toISOString(),
122
- },
123
- });
124
-
125
- } catch (error) {
126
- // Handle errors
127
- if (config.onError) {
128
- config.onError(error as Error, req, res);
129
- }
130
-
131
- if (error instanceof JtcsvError) {
132
- return res.status(400).json({
133
- error: error.name,
134
- message: error.message,
135
- code: error.code,
136
- });
137
- }
138
-
139
- const err = error as Error;
140
- return res.status(500).json({
141
- error: 'Internal Server Error',
142
- message: err.message || 'Unknown error occurred',
143
- });
144
- }
145
- };
146
- }
147
-
148
- /**
149
- * Creates a Next.js API route handler for JSON to CSV conversion
150
- * @param options - Plugin configuration options
151
- * @returns Next.js API route handler
152
- */
153
- export function createJsonToCsvApiHandler(options?: NextJsApiOptions) {
154
- const config = { ...DEFAULT_OPTIONS, ...options };
155
-
156
- return async function handler(req: NextApiRequest, res: NextApiResponse) {
157
- try {
158
- // Set CORS headers if enabled
159
- if (config.enableCors) {
160
- res.setHeader('Access-Control-Allow-Origin', '*');
161
- res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS');
162
- res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
163
- }
164
-
165
- // Handle OPTIONS request for CORS preflight
166
- if (req.method === 'OPTIONS') {
167
- return res.status(200).end();
168
- }
169
-
170
- // Validate HTTP method
171
- if (!config.allowedMethods?.includes(req.method || '')) {
172
- return res.status(405).json({
173
- error: 'Method Not Allowed',
174
- message: `Only ${config.allowedMethods?.join(', ')} methods are allowed`,
175
- });
176
- }
177
-
178
- // Validate content type
179
- const contentType = req.headers['content-type'] || '';
180
- if (!contentType.includes('application/json')) {
181
- return res.status(400).json({
182
- error: 'Invalid Content-Type',
183
- message: 'Content-Type must be application/json',
184
- });
185
- }
186
-
187
- // Get request body
188
- let jsonData: any;
189
- if (typeof req.body === 'string') {
190
- try {
191
- jsonData = JSON.parse(req.body);
192
- } catch {
193
- return res.status(400).json({
194
- error: 'Invalid JSON',
195
- message: 'Request body must be valid JSON',
196
- });
197
- }
198
- } else if (typeof req.body === 'object' && req.body !== null) {
199
- jsonData = req.body;
200
- } else {
201
- return res.status(400).json({
202
- error: 'Invalid Request Body',
203
- message: 'Request body must be JSON',
204
- });
205
- }
206
-
207
- // Validate body size
208
- const bodySize = JSON.stringify(jsonData).length;
209
- if (bodySize > (config.maxBodySize || DEFAULT_OPTIONS.maxBodySize!)) {
210
- return res.status(413).json({
211
- error: 'Payload Too Large',
212
- message: `Request body exceeds maximum size of ${config.maxBodySize} bytes`,
213
- });
214
- }
215
-
216
- // Parse query parameters for CSV options
217
- const csvOptions: JsonToCsvOptions = {
218
- delimiter: req.query.delimiter as string || ',',
219
- includeHeaders: req.query.includeHeaders !== 'false',
220
- preventCsvInjection: req.query.preventCsvInjection !== 'false',
221
- rfc4180Compliant: req.query.rfc4180Compliant !== 'false',
222
- flatten: req.query.flatten === 'true',
223
- flattenSeparator: req.query.flattenSeparator as string || '.',
224
- flattenMaxDepth: req.query.flattenMaxDepth ? parseInt(req.query.flattenMaxDepth as string, 10) : undefined,
225
- arrayHandling: req.query.arrayHandling as 'stringify' | 'join' | 'expand' || 'stringify',
226
- };
227
-
228
- // Convert JSON to CSV
229
- const result = await jsonToCsv(jsonData, csvOptions);
230
-
231
- // Return successful response
232
- res.setHeader('Content-Type', 'text/csv');
233
- res.setHeader('Content-Disposition', 'attachment; filename="converted.csv"');
234
-
235
- return res.status(200).send(result);
236
-
237
- } catch (error) {
238
- // Handle errors
239
- if (config.onError) {
240
- config.onError(error as Error, req, res);
241
- }
242
-
243
- if (error instanceof JtcsvError) {
244
- return res.status(400).json({
245
- error: error.name,
246
- message: error.message,
247
- code: error.code,
248
- });
249
- }
250
-
251
- const err = error as Error;
252
- return res.status(500).json({
253
- error: 'Internal Server Error',
254
- message: err.message || 'Unknown error occurred',
255
- });
256
- }
257
- };
258
- }
259
-
260
- /**
261
- * Creates a Next.js API route handler for bidirectional conversion
262
- * @param options - Plugin configuration options
263
- * @returns Next.js API route handler that can handle both CSV→JSON and JSON→CSV
264
- */
265
- export function createBidirectionalApiHandler(options?: NextJsApiOptions) {
266
- const config = { ...DEFAULT_OPTIONS, ...options };
267
-
268
- return async function handler(req: NextApiRequest, res: NextApiResponse) {
269
- try {
270
- // Set CORS headers if enabled
271
- if (config.enableCors) {
272
- res.setHeader('Access-Control-Allow-Origin', '*');
273
- res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS');
274
- res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
275
- }
276
-
277
- // Handle OPTIONS request for CORS preflight
278
- if (req.method === 'OPTIONS') {
279
- return res.status(200).end();
280
- }
281
-
282
- // Validate HTTP method
283
- if (!config.allowedMethods?.includes(req.method || '')) {
284
- return res.status(405).json({
285
- error: 'Method Not Allowed',
286
- message: `Only ${config.allowedMethods?.join(', ')} methods are allowed`,
287
- });
288
- }
289
-
290
- // Determine conversion direction from query parameter or content type
291
- const direction = req.query.direction as string ||
292
- (req.headers['content-type']?.includes('text/csv') ? 'csvToJson' : 'jsonToCsv');
293
-
294
- if (direction === 'csvToJson') {
295
- // Use CSV to JSON handler
296
- const csvHandler = createCsvToJsonApiHandler(config);
297
- return csvHandler(req, res);
298
- } else if (direction === 'jsonToCsv') {
299
- // Use JSON to CSV handler
300
- const jsonHandler = createJsonToCsvApiHandler(config);
301
- return jsonHandler(req, res);
302
- } else {
303
- return res.status(400).json({
304
- error: 'Invalid Direction',
305
- message: 'Direction must be either "csvToJson" or "jsonToCsv"',
306
- });
307
- }
308
-
309
- } catch (error) {
310
- // Handle errors
311
- if (config.onError) {
312
- config.onError(error as Error, req, res);
313
- }
314
-
315
- return res.status(500).json({
316
- error: 'Internal Server Error',
317
- message: error instanceof Error ? error.message : 'Unknown error occurred',
318
- });
319
- }
320
- };
321
- }
322
-
323
- /**
324
- * Example Next.js API route implementation
325
- * Usage in pages/api/convert.ts:
326
- *
327
- * import { createBidirectionalApiHandler } from '@jtcsv/nextjs-api';
328
- *
329
- * export default createBidirectionalApiHandler({
330
- * maxBodySize: 5 * 1024 * 1024, // 5MB
331
- * allowedMethods: ['POST', 'GET'],
332
- * });
333
- */
334
-
335
- export default {
336
- createCsvToJsonApiHandler,
337
- createJsonToCsvApiHandler,
338
- createBidirectionalApiHandler,
339
- };
@@ -1,63 +0,0 @@
1
- {
2
- "name": "@jtcsv/nextjs",
3
- "version": "1.0.0",
4
- "description": "Next.js интеграция для JTCSV - API routes, React hooks и компоненты",
5
- "main": "index.js",
6
- "module": "index.esm.js",
7
- "types": "index.d.ts",
8
- "scripts": {
9
- "test": "jest",
10
- "lint": "eslint index.js route.js",
11
- "build": "rollup -c",
12
- "dev": "rollup -c -w"
13
- },
14
- "keywords": [
15
- "nextjs",
16
- "react",
17
- "csv",
18
- "json",
19
- "converter",
20
- "jtcsv",
21
- "api",
22
- "route",
23
- "hook",
24
- "component",
25
- "typescript"
26
- ],
27
- "author": "Ruslan Fomenko",
28
- "license": "MIT",
29
- "repository": {
30
- "type": "git",
31
- "url": "git+https://github.com/Linol-Hamelton/jtcsv.git",
32
- "directory": "plugins/nextjs-api"
33
- },
34
- "bugs": {
35
- "url": "https://github.com/Linol-Hamelton/jtcsv/issues"
36
- },
37
- "homepage": "https://github.com/Linol-Hamelton/jtcsv/tree/main/plugins/nextjs-api#readme",
38
- "peerDependencies": {
39
- "next": "^13.0.0 || ^14.0.0",
40
- "react": "^18.0.0",
41
- "react-dom": "^18.0.0",
42
- "jtcsv": "^2.1.0"
43
- },
44
- "devDependencies": {
45
- "@types/react": "^18.0.0",
46
- "@types/node": "^20.0.0",
47
- "jest": "^29.0.0",
48
- "eslint": "^8.57.0",
49
- "rollup": "^4.0.0",
50
- "@rollup/plugin-node-resolve": "^15.0.0",
51
- "@rollup/plugin-commonjs": "^25.0.0"
52
- },
53
- "files": [
54
- "index.js",
55
- "index.esm.js",
56
- "index.d.ts",
57
- "route.js",
58
- "README.md",
59
- "examples/"
60
- ]
61
- }
62
-
63
-