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
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var JtcsvModule_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.JtcsvModule = exports.JsonToCsvPipe = exports.ParseCsvPipe = exports.JtcsvService = void 0;
14
+ exports.createCsvParserInterceptor = createCsvParserInterceptor;
15
+ exports.createCsvDownloadInterceptor = createCsvDownloadInterceptor;
16
+ exports.CsvParserInterceptor = CsvParserInterceptor;
17
+ exports.CsvDownloadDecorator = CsvDownloadDecorator;
18
+ exports.createAsyncCsvParserInterceptor = createAsyncCsvParserInterceptor;
19
+ exports.createAsyncCsvDownloadInterceptor = createAsyncCsvDownloadInterceptor;
20
+ exports.AsyncCsvParserInterceptor = AsyncCsvParserInterceptor;
21
+ exports.AsyncCsvDownloadDecorator = AsyncCsvDownloadDecorator;
22
+ const common_1 = require("@nestjs/common");
23
+ const operators_1 = require("rxjs/operators");
24
+ const jtcsv_1 = require("jtcsv");
25
+ let JtcsvService = class JtcsvService {
26
+ csvToJson(csv, options) {
27
+ return (0, jtcsv_1.csvToJson)(csv, options);
28
+ }
29
+ jsonToCsv(json, options) {
30
+ return (0, jtcsv_1.jsonToCsv)(json, options);
31
+ }
32
+ async csvToJsonAsync(csv, options) {
33
+ return (0, jtcsv_1.csvToJsonAsync)(csv, options);
34
+ }
35
+ async jsonToCsvAsync(json, options) {
36
+ return (0, jtcsv_1.jsonToCsvAsync)(json, options);
37
+ }
38
+ };
39
+ exports.JtcsvService = JtcsvService;
40
+ exports.JtcsvService = JtcsvService = __decorate([
41
+ (0, common_1.Injectable)()
42
+ ], JtcsvService);
43
+ let ParseCsvPipe = class ParseCsvPipe {
44
+ constructor(options) {
45
+ this.options = options;
46
+ }
47
+ transform(value) {
48
+ if (typeof value === 'string') {
49
+ return (0, jtcsv_1.csvToJson)(value, this.options);
50
+ }
51
+ if (Buffer.isBuffer(value)) {
52
+ return (0, jtcsv_1.csvToJson)(value.toString('utf8'), this.options);
53
+ }
54
+ return value;
55
+ }
56
+ };
57
+ exports.ParseCsvPipe = ParseCsvPipe;
58
+ exports.ParseCsvPipe = ParseCsvPipe = __decorate([
59
+ (0, common_1.Injectable)(),
60
+ __metadata("design:paramtypes", [Object])
61
+ ], ParseCsvPipe);
62
+ let JsonToCsvPipe = class JsonToCsvPipe {
63
+ constructor(options) {
64
+ this.options = options;
65
+ }
66
+ transform(value) {
67
+ if (Array.isArray(value)) {
68
+ return (0, jtcsv_1.jsonToCsv)(value, this.options);
69
+ }
70
+ return value;
71
+ }
72
+ };
73
+ exports.JsonToCsvPipe = JsonToCsvPipe;
74
+ exports.JsonToCsvPipe = JsonToCsvPipe = __decorate([
75
+ (0, common_1.Injectable)(),
76
+ __metadata("design:paramtypes", [Object])
77
+ ], JsonToCsvPipe);
78
+ function normalizeFilename(filename) {
79
+ if (!filename || typeof filename !== 'string') {
80
+ return 'export.csv';
81
+ }
82
+ return filename.includes('.') ? filename : `${filename}.csv`;
83
+ }
84
+ function createCsvParserInterceptor(options = {}) {
85
+ class CsvParserInterceptorImpl {
86
+ async intercept(context, next) {
87
+ const req = context.switchToHttp().getRequest();
88
+ const body = req && req.body;
89
+ if (typeof body === 'string' || Buffer.isBuffer(body)) {
90
+ const csv = Buffer.isBuffer(body) ? body.toString('utf8') : body;
91
+ req.body = await (0, jtcsv_1.csvToJsonAsync)(csv, options);
92
+ }
93
+ return next.handle();
94
+ }
95
+ }
96
+ return CsvParserInterceptorImpl;
97
+ }
98
+ function createCsvDownloadInterceptor(options = {}) {
99
+ class CsvDownloadInterceptorImpl {
100
+ intercept(context, next) {
101
+ const res = context.switchToHttp().getResponse();
102
+ const filename = normalizeFilename(options.filename);
103
+ const csvOptions = { ...options };
104
+ delete csvOptions.filename;
105
+ return next.handle().pipe((0, operators_1.switchMap)(async (data) => {
106
+ const rows = Array.isArray(data) ? data : [data];
107
+ const csv = await (0, jtcsv_1.jsonToCsvAsync)(rows, csvOptions);
108
+ if (res && typeof res.setHeader === 'function') {
109
+ res.setHeader('Content-Type', 'text/csv; charset=utf-8');
110
+ res.setHeader('Content-Disposition', `attachment; filename="${filename}"`);
111
+ }
112
+ return csv;
113
+ }));
114
+ }
115
+ }
116
+ return CsvDownloadInterceptorImpl;
117
+ }
118
+ function CsvParserInterceptor(options = {}) {
119
+ const Interceptor = createCsvParserInterceptor(options);
120
+ return Interceptor;
121
+ }
122
+ function CsvDownloadDecorator(options = {}) {
123
+ const Interceptor = createCsvDownloadInterceptor(options);
124
+ return Interceptor;
125
+ }
126
+ function createAsyncCsvParserInterceptor(options = {}) {
127
+ class AsyncCsvParserInterceptorImpl {
128
+ async intercept(context, next) {
129
+ const req = context.switchToHttp().getRequest();
130
+ const body = req && req.body;
131
+ if (typeof body === 'string' || Buffer.isBuffer(body)) {
132
+ const csv = Buffer.isBuffer(body) ? body.toString('utf8') : body;
133
+ req.body = await (0, jtcsv_1.csvToJsonAsync)(csv, options);
134
+ }
135
+ return next.handle();
136
+ }
137
+ }
138
+ return AsyncCsvParserInterceptorImpl;
139
+ }
140
+ function createAsyncCsvDownloadInterceptor(options = {}) {
141
+ class AsyncCsvDownloadInterceptorImpl {
142
+ async intercept(context, next) {
143
+ const res = context.switchToHttp().getResponse();
144
+ const filename = normalizeFilename(options.filename);
145
+ const csvOptions = { ...options };
146
+ delete csvOptions.filename;
147
+ return next.handle().pipe((0, operators_1.switchMap)(async (data) => {
148
+ const rows = Array.isArray(data) ? data : [data];
149
+ const csv = await (0, jtcsv_1.jsonToCsvAsync)(rows, csvOptions);
150
+ if (res && typeof res.setHeader === 'function') {
151
+ res.setHeader('Content-Type', 'text/csv; charset=utf-8');
152
+ res.setHeader('Content-Disposition', `attachment; filename="${filename}"`);
153
+ }
154
+ return csv;
155
+ }));
156
+ }
157
+ }
158
+ return AsyncCsvDownloadInterceptorImpl;
159
+ }
160
+ function AsyncCsvParserInterceptor(options = {}) {
161
+ const Interceptor = createAsyncCsvParserInterceptor(options);
162
+ return Interceptor;
163
+ }
164
+ function AsyncCsvDownloadDecorator(options = {}) {
165
+ const Interceptor = createAsyncCsvDownloadInterceptor(options);
166
+ return Interceptor;
167
+ }
168
+ let JtcsvModule = JtcsvModule_1 = class JtcsvModule {
169
+ static forRoot() {
170
+ return {
171
+ module: JtcsvModule_1,
172
+ providers: [JtcsvService, ParseCsvPipe, JsonToCsvPipe],
173
+ exports: [JtcsvService, ParseCsvPipe, JsonToCsvPipe]
174
+ };
175
+ }
176
+ static forChild() {
177
+ return {
178
+ module: JtcsvModule_1,
179
+ providers: [JtcsvService],
180
+ exports: [JtcsvService]
181
+ };
182
+ }
183
+ };
184
+ exports.JtcsvModule = JtcsvModule;
185
+ exports.JtcsvModule = JtcsvModule = JtcsvModule_1 = __decorate([
186
+ (0, common_1.Module)({
187
+ providers: [JtcsvService, ParseCsvPipe, JsonToCsvPipe],
188
+ exports: [JtcsvService, ParseCsvPipe, JsonToCsvPipe]
189
+ })
190
+ ], JtcsvModule);
191
+ exports.default = JtcsvModule;
192
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../plugins/nestjs/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * NestJS plugin for jtcsv\n * Provides service, pipes, module, and interceptors for CSV parsing and downloading in NestJS applications\n * @module plugins/nestjs\n */\n\nimport {\n Injectable,\n PipeTransform,\n Pipe,\n Module,\n NestInterceptor,\n Inject,\n DynamicModule\n} from '@nestjs/common';\nimport { switchMap } from 'rxjs/operators';\nimport { \n csvToJson, \n jsonToCsv, \n csvToJsonAsync, \n jsonToCsvAsync,\n type CsvToJsonOptions, \n type JsonToCsvOptions \n} from 'jtcsv';\n\n/**\n * Options for CSV parser interceptor\n */\nexport interface CsvParserOptions extends CsvToJsonOptions {\n // Additional options specific to CSV parsing\n}\n\n/**\n * Options for CSV download interceptor\n */\nexport interface CsvDownloadOptions extends JsonToCsvOptions {\n /** Filename for the downloaded CSV file */\n filename?: string;\n}\n\n/**\n * NestJS Service for CSV/JSON conversion\n */\n@Injectable()\nexport class JtcsvService {\n /**\n * Convert CSV string to JSON array\n * @param csv - CSV string\n * @param options - Conversion options\n * @returns JSON array\n */\n csvToJson(csv: string, options?: CsvToJsonOptions): any[] {\n return csvToJson(csv, options);\n }\n\n /**\n * Convert JSON array to CSV string\n * @param json - JSON array\n * @param options - Conversion options\n * @returns CSV string\n */\n jsonToCsv(json: any[], options?: JsonToCsvOptions): string {\n return jsonToCsv(json, options);\n }\n\n /**\n * Async CSV to JSON conversion\n * @param csv - CSV string\n * @param options - Conversion options\n * @returns Promise resolving to JSON array\n */\n async csvToJsonAsync(csv: string, options?: CsvToJsonOptions): Promise<any[]> {\n return csvToJsonAsync(csv, options);\n }\n\n /**\n * Async JSON to CSV conversion\n * @param json - JSON array\n * @param options - Conversion options\n * @returns Promise resolving to CSV string\n */\n async jsonToCsvAsync(json: any[], options?: JsonToCsvOptions): Promise<string> {\n return jsonToCsvAsync(json, options);\n }\n}\n\n/**\n * NestJS Pipe for CSV parsing\n * Usage: @UsePipes(new ParseCsvPipe(options))\n */\n@Injectable()\nexport class ParseCsvPipe implements PipeTransform {\n constructor(private options?: CsvToJsonOptions) {}\n\n transform(value: any): any[] {\n if (typeof value === 'string') {\n return csvToJson(value, this.options);\n }\n if (Buffer.isBuffer(value)) {\n return csvToJson(value.toString('utf8'), this.options);\n }\n return value;\n }\n}\n\n/**\n * NestJS Pipe for JSON to CSV\n * Usage: @UsePipes(new JsonToCsvPipe(options))\n */\n@Injectable()\nexport class JsonToCsvPipe implements PipeTransform {\n constructor(private options?: JsonToCsvOptions) {}\n\n transform(value: any): string {\n if (Array.isArray(value)) {\n return jsonToCsv(value, this.options);\n }\n return value;\n }\n}\n\n/**\n * Normalize filename for CSV download\n */\nfunction normalizeFilename(filename?: string): string {\n if (!filename || typeof filename !== 'string') {\n return 'export.csv';\n }\n return filename.includes('.') ? filename : `${filename}.csv`;\n}\n\n/**\n * Creates a CSV parser interceptor for NestJS\n * Parses incoming CSV request bodies into JSON\n */\nexport function createCsvParserInterceptor(options: CsvParserOptions = {}): any {\n class CsvParserInterceptorImpl {\n async intercept(context: any, next: any): Promise<any> {\n const req = context.switchToHttp().getRequest();\n const body = req && req.body;\n\n if (typeof body === 'string' || Buffer.isBuffer(body)) {\n const csv = Buffer.isBuffer(body) ? body.toString('utf8') : body;\n req.body = await csvToJsonAsync(csv, options);\n }\n\n return next.handle();\n }\n }\n\n return CsvParserInterceptorImpl;\n}\n\n/**\n * Creates a CSV download interceptor for NestJS\n * Converts JSON responses to CSV and sets appropriate headers\n */\nexport function createCsvDownloadInterceptor(options: CsvDownloadOptions = {}): any {\n class CsvDownloadInterceptorImpl {\n intercept(context: any, next: any): any {\n const res = context.switchToHttp().getResponse();\n const filename = normalizeFilename(options.filename);\n const csvOptions = { ...options } as JsonToCsvOptions;\n delete (csvOptions as any).filename;\n\n return next.handle().pipe(\n switchMap(async (data: any) => {\n const rows = Array.isArray(data) ? data : [data];\n const csv = await jsonToCsvAsync(rows, csvOptions);\n\n if (res && typeof res.setHeader === 'function') {\n res.setHeader('Content-Type', 'text/csv; charset=utf-8');\n res.setHeader(\n 'Content-Disposition',\n `attachment; filename=\"${filename}\"`\n );\n }\n\n return csv;\n })\n );\n }\n }\n\n return CsvDownloadInterceptorImpl;\n}\n\n/**\n * Decorator for CSV parsing interceptor\n * Usage: @CsvParserInterceptor({ delimiter: ',' })\n */\nexport function CsvParserInterceptor(options: CsvParserOptions = {}): any {\n const Interceptor = createCsvParserInterceptor(options);\n return Interceptor;\n}\n\n/**\n * Decorator for CSV download interceptor\n * Usage: @CsvDownloadDecorator({ filename: 'data.csv' })\n */\nexport function CsvDownloadDecorator(options: CsvDownloadOptions = {}): any {\n const Interceptor = createCsvDownloadInterceptor(options);\n return Interceptor;\n}\n\n/**\n * Async version of CSV parser interceptor\n * Uses async/await for better performance with large files\n */\nexport function createAsyncCsvParserInterceptor(options: CsvParserOptions = {}): any {\n class AsyncCsvParserInterceptorImpl {\n async intercept(context: any, next: any): Promise<any> {\n const req = context.switchToHttp().getRequest();\n const body = req && req.body;\n\n if (typeof body === 'string' || Buffer.isBuffer(body)) {\n const csv = Buffer.isBuffer(body) ? body.toString('utf8') : body;\n req.body = await csvToJsonAsync(csv, options);\n }\n\n return next.handle();\n }\n }\n\n return AsyncCsvParserInterceptorImpl;\n}\n\n/**\n * Async version of CSV download interceptor\n * Uses async/await for better performance with large files\n */\nexport function createAsyncCsvDownloadInterceptor(options: CsvDownloadOptions = {}): any {\n class AsyncCsvDownloadInterceptorImpl {\n async intercept(context: any, next: any): Promise<any> {\n const res = context.switchToHttp().getResponse();\n const filename = normalizeFilename(options.filename);\n const csvOptions = { ...options } as JsonToCsvOptions;\n delete (csvOptions as any).filename;\n\n return next.handle().pipe(\n switchMap(async (data: any) => {\n const rows = Array.isArray(data) ? data : [data];\n const csv = await jsonToCsvAsync(rows, csvOptions);\n\n if (res && typeof res.setHeader === 'function') {\n res.setHeader('Content-Type', 'text/csv; charset=utf-8');\n res.setHeader(\n 'Content-Disposition',\n `attachment; filename=\"${filename}\"`\n );\n }\n\n return csv;\n })\n );\n }\n }\n\n return AsyncCsvDownloadInterceptorImpl;\n}\n\n/**\n * Async decorator for CSV parsing interceptor\n * Usage: @AsyncCsvParserInterceptor({ delimiter: ',' })\n */\nexport function AsyncCsvParserInterceptor(options: CsvParserOptions = {}): any {\n const Interceptor = createAsyncCsvParserInterceptor(options);\n return Interceptor;\n}\n\n/**\n * Async decorator for CSV download interceptor\n * Usage: @AsyncCsvDownloadDecorator({ filename: 'data.csv' })\n */\nexport function AsyncCsvDownloadDecorator(options: CsvDownloadOptions = {}): any {\n const Interceptor = createAsyncCsvDownloadInterceptor(options);\n return Interceptor;\n}\n\n/**\n * NestJS Module\n */\n@Module({\n providers: [JtcsvService, ParseCsvPipe, JsonToCsvPipe],\n exports: [JtcsvService, ParseCsvPipe, JsonToCsvPipe]\n})\nexport class JtcsvModule {\n static forRoot(): DynamicModule {\n return {\n module: JtcsvModule,\n providers: [JtcsvService, ParseCsvPipe, JsonToCsvPipe],\n exports: [JtcsvService, ParseCsvPipe, JsonToCsvPipe]\n };\n }\n\n static forChild(): DynamicModule {\n return {\n module: JtcsvModule,\n providers: [JtcsvService],\n exports: [JtcsvService]\n };\n }\n}\n\n// Export types\nexport type { CsvToJsonOptions, JsonToCsvOptions };\n\nexport default JtcsvModule;\n"]}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useJtcsv = useJtcsv;
4
+ exports.useJtcsvAsync = useJtcsvAsync;
5
+ exports.default = defineNuxtPlugin((nuxtApp, options = {}) => {
6
+ const { async = true, workers = false } = options;
7
+ const jtcsv = {
8
+ csvToJson: (csv, opts) => {
9
+ return require('jtcsv').csvToJson(csv, opts);
10
+ },
11
+ jsonToCsv: (data, opts) => {
12
+ return require('jtcsv').jsonToCsv(data, opts);
13
+ },
14
+ ...(async ? {
15
+ csvToJsonAsync: async (csv, opts) => {
16
+ const { csvToJson } = require('jtcsv');
17
+ return csvToJson(csv, opts);
18
+ },
19
+ jsonToCsvAsync: async (data, opts) => {
20
+ const { jsonToCsv } = require('jtcsv');
21
+ return jsonToCsv(data, opts);
22
+ }
23
+ } : {}),
24
+ ...(workers ? {
25
+ createWorkerPool: (size) => {
26
+ const { WorkerPool } = require('../../src/workers/worker-pool');
27
+ return new WorkerPool(size);
28
+ }
29
+ } : {})
30
+ };
31
+ nuxtApp.provide('jtcsv', jtcsv);
32
+ nuxtApp.provide('useJtcsv', () => jtcsv);
33
+ });
34
+ function useJtcsv() {
35
+ const nuxtApp = useNuxtApp();
36
+ return nuxtApp.$jtcsv;
37
+ }
38
+ function useJtcsvAsync() {
39
+ const nuxtApp = useNuxtApp();
40
+ const jtcsv = nuxtApp.$jtcsv;
41
+ return {
42
+ ...jtcsv,
43
+ csvToJson: (jtcsv.csvToJsonAsync || jtcsv.csvToJson),
44
+ jsonToCsv: (jtcsv.jsonToCsvAsync || jtcsv.jsonToCsv),
45
+ };
46
+ }
47
+ function defineNuxtPlugin(fn) {
48
+ return fn;
49
+ }
50
+ function useNuxtApp() {
51
+ return { $jtcsv: {} };
52
+ }
53
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../plugins/nuxt/index.ts"],"names":[],"mappings":";;AAiEA,4BAGC;AAKD,sCAUC;AA7DD,kBAAe,gBAAgB,CAAC,CAAC,OAAY,EAAE,UAA6B,EAAE,EAAE,EAAE;IAChF,MAAM,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAGlD,MAAM,KAAK,GAAG;QAEZ,SAAS,EAAE,CAAC,GAAW,EAAE,IAAuB,EAAE,EAAE;YAElD,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC/C,CAAC;QACD,SAAS,EAAE,CAAC,IAAS,EAAE,IAAuB,EAAE,EAAE;YAChD,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChD,CAAC;QAGD,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YACV,cAAc,EAAE,KAAK,EAAE,GAAW,EAAE,IAAuB,EAAE,EAAE;gBAC7D,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;gBACvC,OAAO,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC9B,CAAC;YACD,cAAc,EAAE,KAAK,EAAE,IAAS,EAAE,IAAuB,EAAE,EAAE;gBAC3D,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;gBACvC,OAAO,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC/B,CAAC;SACF,CAAC,CAAC,CAAC,EAAE,CAAC;QAGP,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACZ,gBAAgB,EAAE,CAAC,IAAa,EAAE,EAAE;gBAClC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAAC;gBAChE,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;SACF,CAAC,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IAGF,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAChC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC;AAKH,SAAgB,QAAQ;IACtB,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC;AAKD,SAAgB,aAAa;IAC3B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,MAAa,CAAC;IAEpC,OAAO;QACL,GAAG,KAAK;QAER,SAAS,EAAE,CAAC,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,SAAS,CAAkD;QACrG,SAAS,EAAE,CAAC,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,SAAS,CAAmD;KACvG,CAAC;AACJ,CAAC;AAGD,SAAS,gBAAgB,CAAC,EAAO;IAC/B,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,UAAU;IAEjB,OAAO,EAAE,MAAM,EAAE,EAAS,EAAE,CAAC;AAC/B,CAAC","sourcesContent":["/**\r\n * Nuxt plugin for jtcsv\r\n * Provides jtcsv integration for Nuxt applications\r\n * @module plugins/nuxt\r\n */\r\n\r\nimport type { CsvToJsonOptions, JsonToCsvOptions } from '../../src/types';\r\n\r\n/**\r\n * Nuxt plugin options\r\n */\r\nexport interface NuxtPluginOptions {\r\n /** Whether to enable async functions (default: true) */\r\n async?: boolean;\r\n /** Whether to enable worker support (default: false) */\r\n workers?: boolean;\r\n}\r\n\r\n/**\r\n * Nuxt plugin implementation\r\n * This is a simplified version that works with Nuxt 3\r\n */\r\nexport default defineNuxtPlugin((nuxtApp: any, options: NuxtPluginOptions = {}) => {\r\n const { async = true, workers = false } = options;\r\n \r\n // Import jtcsv functions\r\n const jtcsv = {\r\n // Core functions\r\n csvToJson: (csv: string, opts?: CsvToJsonOptions) => {\r\n // This would be replaced with actual import in runtime\r\n return require('jtcsv').csvToJson(csv, opts);\r\n },\r\n jsonToCsv: (data: any, opts?: JsonToCsvOptions) => {\r\n return require('jtcsv').jsonToCsv(data, opts);\r\n },\r\n \r\n // Async versions if enabled\r\n ...(async ? {\r\n csvToJsonAsync: async (csv: string, opts?: CsvToJsonOptions) => {\r\n const { csvToJson } = require('jtcsv');\r\n return csvToJson(csv, opts);\r\n },\r\n jsonToCsvAsync: async (data: any, opts?: JsonToCsvOptions) => {\r\n const { jsonToCsv } = require('jtcsv');\r\n return jsonToCsv(data, opts);\r\n }\r\n } : {}),\r\n \r\n // Worker support if enabled\r\n ...(workers ? {\r\n createWorkerPool: (size?: number) => {\r\n const { WorkerPool } = require('../../src/workers/worker-pool');\r\n return new WorkerPool(size);\r\n }\r\n } : {})\r\n };\r\n\r\n // Provide jtcsv to Nuxt app\r\n nuxtApp.provide('jtcsv', jtcsv);\r\n nuxtApp.provide('useJtcsv', () => jtcsv);\r\n});\r\n\r\n/**\r\n * Nuxt composable for using jtcsv\r\n */\r\nexport function useJtcsv() {\r\n const nuxtApp = useNuxtApp();\r\n return nuxtApp.$jtcsv;\r\n}\r\n\r\n/**\r\n * Nuxt composable for async jtcsv operations\r\n */\r\nexport function useJtcsvAsync() {\r\n const nuxtApp = useNuxtApp();\r\n const jtcsv = nuxtApp.$jtcsv as any;\r\n \r\n return {\r\n ...jtcsv,\r\n // Ensure async methods are available\r\n csvToJson: (jtcsv.csvToJsonAsync || jtcsv.csvToJson) as (csv: string, opts?: CsvToJsonOptions) => any,\r\n jsonToCsv: (jtcsv.jsonToCsvAsync || jtcsv.jsonToCsv) as (data: any, opts?: JsonToCsvOptions) => string,\r\n };\r\n}\r\n\r\n// Helper functions for Nuxt module compatibility\r\nfunction defineNuxtPlugin(fn: any) {\r\n return fn;\r\n}\r\n\r\nfunction useNuxtApp() {\r\n // This would be provided by Nuxt runtime\r\n return { $jtcsv: {} as any };\r\n}"]}
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseFormData = parseFormData;
4
+ exports.parseFormDataAsync = parseFormDataAsync;
5
+ exports.generateCsvResponse = generateCsvResponse;
6
+ exports.generateAsyncCsvResponse = generateAsyncCsvResponse;
7
+ exports.createCsvLoader = createCsvLoader;
8
+ exports.createCsvAction = createCsvAction;
9
+ exports.parseMultiPartFormData = parseMultiPartFormData;
10
+ exports.csvExport = csvExport;
11
+ const index_core_1 = require("../../index-core");
12
+ function normalizeFilename(filename) {
13
+ if (!filename || typeof filename !== 'string') {
14
+ return 'export.csv';
15
+ }
16
+ return filename.includes('.') ? filename : `${filename}.csv`;
17
+ }
18
+ async function extractCsvText(formData, fieldName) {
19
+ if (formData.has(fieldName)) {
20
+ const value = formData.get(fieldName);
21
+ if (value && typeof value.text === 'function') {
22
+ return await value.text();
23
+ }
24
+ if (value !== null) {
25
+ return String(value);
26
+ }
27
+ }
28
+ for (const value of formData.values()) {
29
+ if (value && typeof value.text === 'function') {
30
+ return await value.text();
31
+ }
32
+ }
33
+ return null;
34
+ }
35
+ async function parseFormData(request, options = {}) {
36
+ if (!request || typeof request.formData !== 'function') {
37
+ throw new Error('parseFormData expects a Remix Request with formData()');
38
+ }
39
+ const { fieldName = 'file', ...csvOptions } = options;
40
+ const formData = await request.formData();
41
+ const csvText = await extractCsvText(formData, fieldName);
42
+ if (!csvText) {
43
+ throw new Error('No CSV file or field found in form data');
44
+ }
45
+ return await (0, index_core_1.csvToJson)(csvText, csvOptions);
46
+ }
47
+ async function parseFormDataAsync(request, options = {}) {
48
+ try {
49
+ return await parseFormData(request, options);
50
+ }
51
+ catch (error) {
52
+ throw new Error(`Failed to parse CSV from form data: ${error instanceof Error ? error.message : 'Unknown error'}`);
53
+ }
54
+ }
55
+ function generateCsvResponse(data, filename = 'export.csv', options = {}) {
56
+ const safeName = normalizeFilename(filename);
57
+ const rows = Array.isArray(data) ? data : [data];
58
+ const csv = (0, index_core_1.jsonToCsv)(rows, options);
59
+ return new Response(csv, {
60
+ headers: {
61
+ 'Content-Type': 'text/csv; charset=utf-8',
62
+ 'Content-Disposition': `attachment; filename="${safeName}"`
63
+ }
64
+ });
65
+ }
66
+ async function generateAsyncCsvResponse(data, filename = 'export.csv', options = {}) {
67
+ const safeName = normalizeFilename(filename);
68
+ const rows = Array.isArray(data) ? data : [data];
69
+ const csv = await (0, index_core_1.jsonToCsv)(rows, options);
70
+ return new Response(csv, {
71
+ headers: {
72
+ 'Content-Type': 'text/csv; charset=utf-8',
73
+ 'Content-Disposition': `attachment; filename="${safeName}"`
74
+ }
75
+ });
76
+ }
77
+ function createCsvLoader(dataLoader, filename = 'export.csv', options = {}) {
78
+ return async () => {
79
+ try {
80
+ const data = await (typeof dataLoader === 'function' ? dataLoader() : dataLoader);
81
+ return generateCsvResponse(data, filename, options);
82
+ }
83
+ catch (error) {
84
+ return new Response(JSON.stringify({ error: error instanceof Error ? error.message : 'Unknown error' }), { status: 500, headers: { 'Content-Type': 'application/json' } });
85
+ }
86
+ };
87
+ }
88
+ function createCsvAction(options = {}) {
89
+ return async ({ request }) => {
90
+ try {
91
+ const data = await parseFormData(request, options);
92
+ return new Response(JSON.stringify({ success: true, data }), { headers: { 'Content-Type': 'application/json' } });
93
+ }
94
+ catch (error) {
95
+ return new Response(JSON.stringify({
96
+ success: false,
97
+ error: error instanceof Error ? error.message : 'Unknown error'
98
+ }), { status: 400, headers: { 'Content-Type': 'application/json' } });
99
+ }
100
+ };
101
+ }
102
+ async function parseMultiPartFormData(request, options = {}) {
103
+ const { multiple = false, ...csvOptions } = options;
104
+ const formData = await request.formData();
105
+ const results = [];
106
+ for (const [fieldName, value] of formData.entries()) {
107
+ if (value && typeof value.text === 'function') {
108
+ const csvText = await value.text();
109
+ if (csvText) {
110
+ const parsed = await (0, index_core_1.csvToJson)(csvText, csvOptions);
111
+ results.push(parsed);
112
+ }
113
+ }
114
+ }
115
+ if (!multiple && results.length > 0) {
116
+ return results[0];
117
+ }
118
+ return results;
119
+ }
120
+ function csvExport(data, filename, options) {
121
+ return () => generateAsyncCsvResponse(data, filename, options);
122
+ }
123
+ exports.default = {
124
+ parseFormData,
125
+ parseFormDataAsync,
126
+ generateCsvResponse,
127
+ generateAsyncCsvResponse,
128
+ createCsvLoader,
129
+ createCsvAction,
130
+ parseMultiPartFormData,
131
+ csvExport,
132
+ };
133
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../plugins/remix/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Remix plugin for jtcsv\r\n * Provides utilities for CSV parsing and generation in Remix applications\r\n * @module plugins/remix\r\n */\r\n\r\nimport { csvToJson, jsonToCsv } from '../../index-core';\r\nimport type { CsvToJsonOptions, JsonToCsvOptions } from '../../src/types';\r\n\r\n/**\r\n * Remix Request type (simplified)\r\n */\r\ninterface RemixRequest {\r\n formData(): Promise<FormData>;\r\n}\r\n\r\n/**\r\n * Options for CSV parsing from form data\r\n */\r\nexport interface ParseFormDataOptions extends CsvToJsonOptions {\r\n /** Field name containing the CSV file (default: 'file') */\r\n fieldName?: string;\r\n}\r\n\r\n/**\r\n * Options for CSV response generation\r\n */\r\nexport interface GenerateCsvResponseOptions extends JsonToCsvOptions {\r\n // Additional options specific to CSV response\r\n}\r\n\r\n/**\r\n * Normalize filename for CSV download\r\n */\r\nfunction normalizeFilename(filename?: string): string {\r\n if (!filename || typeof filename !== 'string') {\r\n return 'export.csv';\r\n }\r\n return filename.includes('.') ? filename : `${filename}.csv`;\r\n}\r\n\r\n/**\r\n * Extract CSV text from FormData\r\n */\r\nasync function extractCsvText(formData: FormData, fieldName: string): Promise<string | null> {\r\n if (formData.has(fieldName)) {\r\n const value = formData.get(fieldName);\r\n if (value && typeof (value as any).text === 'function') {\r\n return await (value as any).text();\r\n }\r\n if (value !== null) {\r\n return String(value);\r\n }\r\n }\r\n\r\n for (const value of formData.values()) {\r\n if (value && typeof (value as any).text === 'function') {\r\n return await (value as any).text();\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Parse CSV from Remix form data\r\n * \r\n * @example\r\n * // In a Remix action:\r\n * export async function action({ request }: ActionArgs) {\r\n * const data = await parseFormData(request, { delimiter: ',' });\r\n * return json({ success: true, data });\r\n * }\r\n */\r\nexport async function parseFormData(\r\n request: RemixRequest,\r\n options: ParseFormDataOptions = {}\r\n): Promise<any[]> {\r\n if (!request || typeof request.formData !== 'function') {\r\n throw new Error('parseFormData expects a Remix Request with formData()');\r\n }\r\n\r\n const { fieldName = 'file', ...csvOptions } = options;\r\n const formData = await request.formData();\r\n const csvText = await extractCsvText(formData, fieldName);\r\n\r\n if (!csvText) {\r\n throw new Error('No CSV file or field found in form data');\r\n }\r\n\r\n return await csvToJson(csvText, csvOptions);\r\n}\r\n\r\n/**\r\n * Async version of parseFormData with better error handling\r\n */\r\nexport async function parseFormDataAsync(\r\n request: RemixRequest,\r\n options: ParseFormDataOptions = {}\r\n): Promise<any[]> {\r\n try {\r\n return await parseFormData(request, options);\r\n } catch (error) {\r\n throw new Error(`Failed to parse CSV from form data: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n}\r\n\r\n/**\r\n * Generate a CSV response for Remix\r\n * \r\n * @example\r\n * // In a Remix loader:\r\n * export async function loader() {\r\n * const data = await getData();\r\n * return generateCsvResponse(data, 'export.csv');\r\n * }\r\n */\r\nexport function generateCsvResponse(\r\n data: any,\r\n filename: string = 'export.csv',\r\n options: GenerateCsvResponseOptions = {}\r\n): Response {\r\n const safeName = normalizeFilename(filename);\r\n const rows = Array.isArray(data) ? data : [data];\r\n const csv = jsonToCsv(rows, options);\r\n\r\n return new Response(csv, {\r\n headers: {\r\n 'Content-Type': 'text/csv; charset=utf-8',\r\n 'Content-Disposition': `attachment; filename=\"${safeName}\"`\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Async version of generateCsvResponse\r\n */\r\nexport async function generateAsyncCsvResponse(\r\n data: any,\r\n filename: string = 'export.csv',\r\n options: GenerateCsvResponseOptions = {}\r\n): Promise<Response> {\r\n const safeName = normalizeFilename(filename);\r\n const rows = Array.isArray(data) ? data : [data];\r\n const csv = await jsonToCsv(rows, options);\r\n\r\n return new Response(csv, {\r\n headers: {\r\n 'Content-Type': 'text/csv; charset=utf-8',\r\n 'Content-Disposition': `attachment; filename=\"${safeName}\"`\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * CSV loader helper for Remix\r\n * Creates a loader that returns CSV data\r\n * \r\n * @example\r\n * export const loader = createCsvLoader(async () => {\r\n * return await getData();\r\n * }, 'data.csv');\r\n */\r\nexport function createCsvLoader(\r\n dataLoader: () => Promise<any> | any,\r\n filename: string = 'export.csv',\r\n options: GenerateCsvResponseOptions = {}\r\n): () => Promise<Response> {\r\n return async () => {\r\n try {\r\n const data = await (typeof dataLoader === 'function' ? dataLoader() : dataLoader);\r\n return generateCsvResponse(data, filename, options);\r\n } catch (error) {\r\n return new Response(\r\n JSON.stringify({ error: error instanceof Error ? error.message : 'Unknown error' }),\r\n { status: 500, headers: { 'Content-Type': 'application/json' } }\r\n );\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * CSV action helper for Remix\r\n * Creates an action that parses CSV from form data\r\n * \r\n * @example\r\n * export const action = createCsvAction({ delimiter: ',' });\r\n */\r\nexport function createCsvAction(\r\n options: ParseFormDataOptions = {}\r\n): (args: { request: RemixRequest }) => Promise<Response> {\r\n return async ({ request }) => {\r\n try {\r\n const data = await parseFormData(request, options);\r\n return new Response(\r\n JSON.stringify({ success: true, data }),\r\n { headers: { 'Content-Type': 'application/json' } }\r\n );\r\n } catch (error) {\r\n return new Response(\r\n JSON.stringify({ \r\n success: false, \r\n error: error instanceof Error ? error.message : 'Unknown error' \r\n }),\r\n { status: 400, headers: { 'Content-Type': 'application/json' } }\r\n );\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Multi-part form data CSV parser\r\n * Handles multiple CSV files in a single form\r\n */\r\nexport async function parseMultiPartFormData(\r\n request: RemixRequest,\r\n options: ParseFormDataOptions & { multiple?: boolean } = {}\r\n): Promise<any[] | any[][]> {\r\n const { multiple = false, ...csvOptions } = options;\r\n const formData = await request.formData();\r\n const results: any[][] = [];\r\n\r\n for (const [fieldName, value] of formData.entries()) {\r\n if (value && typeof (value as any).text === 'function') {\r\n const csvText = await (value as any).text();\r\n if (csvText) {\r\n const parsed = await csvToJson(csvText, csvOptions);\r\n results.push(parsed);\r\n }\r\n }\r\n }\r\n\r\n if (!multiple && results.length > 0) {\r\n return results[0];\r\n }\r\n\r\n return results;\r\n}\r\n\r\n/**\r\n * CSV export utility for Remix routes\r\n */\r\nexport function csvExport(\r\n data: any,\r\n filename?: string,\r\n options?: GenerateCsvResponseOptions\r\n): () => Promise<Response> {\r\n return () => generateAsyncCsvResponse(data, filename, options);\r\n}\r\n\r\nexport default {\r\n parseFormData,\r\n parseFormDataAsync,\r\n generateCsvResponse,\r\n generateAsyncCsvResponse,\r\n createCsvLoader,\r\n createCsvAction,\r\n parseMultiPartFormData,\r\n csvExport,\r\n};"]}
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseCsv = parseCsv;
4
+ exports.parseCsvAsync = parseCsvAsync;
5
+ exports.generateCsv = generateCsv;
6
+ exports.generateAsyncCsv = generateAsyncCsv;
7
+ exports.createCsvLoader = createCsvLoader;
8
+ exports.createCsvAction = createCsvAction;
9
+ exports.parseMultiPartCsv = parseMultiPartCsv;
10
+ exports.csvExport = csvExport;
11
+ exports.createCsvHook = createCsvHook;
12
+ const index_core_1 = require("../../index-core");
13
+ function normalizeFilename(filename) {
14
+ if (!filename || typeof filename !== 'string') {
15
+ return 'export.csv';
16
+ }
17
+ return filename.includes('.') ? filename : `${filename}.csv`;
18
+ }
19
+ async function extractCsvText(formData, fieldName) {
20
+ if (formData.has(fieldName)) {
21
+ const value = formData.get(fieldName);
22
+ if (value && typeof value.text === 'function') {
23
+ return await value.text();
24
+ }
25
+ if (value !== null) {
26
+ return String(value);
27
+ }
28
+ }
29
+ for (const value of formData.values()) {
30
+ if (value && typeof value.text === 'function') {
31
+ return await value.text();
32
+ }
33
+ }
34
+ return null;
35
+ }
36
+ async function parseCsv(request, options = {}) {
37
+ if (!request || typeof request.text !== 'function') {
38
+ throw new Error('parseCsv expects a Request instance');
39
+ }
40
+ const { fieldName = 'file', formData: forceFormData, ...csvOptions } = options;
41
+ const contentType = request.headers?.get?.('content-type') || '';
42
+ let csvText = null;
43
+ if (forceFormData || contentType.includes('multipart/form-data')) {
44
+ const formData = await request.formData();
45
+ csvText = await extractCsvText(formData, fieldName);
46
+ }
47
+ else {
48
+ csvText = await request.text();
49
+ }
50
+ if (!csvText) {
51
+ throw new Error('No CSV payload found in request');
52
+ }
53
+ return await (0, index_core_1.csvToJson)(csvText, csvOptions);
54
+ }
55
+ async function parseCsvAsync(request, options = {}) {
56
+ try {
57
+ return await parseCsv(request, options);
58
+ }
59
+ catch (error) {
60
+ throw new Error(`Failed to parse CSV from request: ${error instanceof Error ? error.message : 'Unknown error'}`);
61
+ }
62
+ }
63
+ function generateCsv(data, filename = 'export.csv', options = {}) {
64
+ const safeName = normalizeFilename(filename);
65
+ const rows = Array.isArray(data) ? data : [data];
66
+ const csv = (0, index_core_1.jsonToCsv)(rows, options);
67
+ return new Response(csv, {
68
+ headers: {
69
+ 'Content-Type': 'text/csv; charset=utf-8',
70
+ 'Content-Disposition': `attachment; filename="${safeName}"`
71
+ }
72
+ });
73
+ }
74
+ async function generateAsyncCsv(data, filename = 'export.csv', options = {}) {
75
+ const safeName = normalizeFilename(filename);
76
+ const rows = Array.isArray(data) ? data : [data];
77
+ const csv = await (0, index_core_1.jsonToCsv)(rows, options);
78
+ return new Response(csv, {
79
+ headers: {
80
+ 'Content-Type': 'text/csv; charset=utf-8',
81
+ 'Content-Disposition': `attachment; filename="${safeName}"`
82
+ }
83
+ });
84
+ }
85
+ function createCsvLoader(dataLoader, filename = 'export.csv', options = {}) {
86
+ return async () => {
87
+ try {
88
+ const data = await (typeof dataLoader === 'function' ? dataLoader() : dataLoader);
89
+ return generateCsv(data, filename, options);
90
+ }
91
+ catch (error) {
92
+ return new Response(JSON.stringify({ error: error instanceof Error ? error.message : 'Unknown error' }), { status: 500, headers: { 'Content-Type': 'application/json' } });
93
+ }
94
+ };
95
+ }
96
+ function createCsvAction(options = {}) {
97
+ return async ({ request }) => {
98
+ try {
99
+ const data = await parseCsv(request, options);
100
+ return new Response(JSON.stringify({ success: true, data }), { headers: { 'Content-Type': 'application/json' } });
101
+ }
102
+ catch (error) {
103
+ return new Response(JSON.stringify({
104
+ success: false,
105
+ error: error instanceof Error ? error.message : 'Unknown error'
106
+ }), { status: 400, headers: { 'Content-Type': 'application/json' } });
107
+ }
108
+ };
109
+ }
110
+ async function parseMultiPartCsv(request, options = {}) {
111
+ const { multiple = false, ...csvOptions } = options;
112
+ const formData = await request.formData();
113
+ const results = [];
114
+ for (const [fieldName, value] of formData.entries()) {
115
+ if (value && typeof value.text === 'function') {
116
+ const csvText = await value.text();
117
+ if (csvText) {
118
+ const parsed = await (0, index_core_1.csvToJson)(csvText, csvOptions);
119
+ results.push(parsed);
120
+ }
121
+ }
122
+ }
123
+ if (!multiple && results.length > 0) {
124
+ return results[0];
125
+ }
126
+ return results;
127
+ }
128
+ function csvExport(data, filename, options) {
129
+ return () => generateAsyncCsv(data, filename, options);
130
+ }
131
+ function createCsvHook(options = {}) {
132
+ return {
133
+ async handle({ event, resolve }) {
134
+ event.locals.csv = {
135
+ parse: (request, opts) => parseCsv(request, { ...options.parseOptions, ...opts }),
136
+ parseAsync: (request, opts) => parseCsvAsync(request, { ...options.parseOptions, ...opts }),
137
+ generate: (data, filename, opts) => generateCsv(data, filename, { ...options.generateOptions, ...opts }),
138
+ generateAsync: (data, filename, opts) => generateAsyncCsv(data, filename, { ...options.generateOptions, ...opts }),
139
+ };
140
+ return resolve(event);
141
+ }
142
+ };
143
+ }
144
+ exports.default = {
145
+ parseCsv,
146
+ parseCsvAsync,
147
+ generateCsv,
148
+ generateAsyncCsv,
149
+ createCsvLoader,
150
+ createCsvAction,
151
+ parseMultiPartCsv,
152
+ csvExport,
153
+ createCsvHook,
154
+ };
155
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../plugins/sveltekit/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * SvelteKit plugin for jtcsv\r\n * Provides utilities for CSV parsing and generation in SvelteKit applications\r\n * @module plugins/sveltekit\r\n */\r\n\r\nimport { csvToJson, jsonToCsv } from '../../index-core';\r\nimport type { CsvToJsonOptions, JsonToCsvOptions } from '../../src/types';\r\n\r\n/**\r\n * SvelteKit Request type (simplified)\r\n */\r\ninterface SvelteKitRequest {\r\n text(): Promise<string>;\r\n formData(): Promise<FormData>;\r\n headers?: {\r\n get(name: string): string | null;\r\n };\r\n}\r\n\r\n/**\r\n * Options for CSV parsing from request\r\n */\r\nexport interface ParseCsvOptions extends CsvToJsonOptions {\r\n /** Field name containing the CSV file (default: 'file') */\r\n fieldName?: string;\r\n /** Force form data parsing (default: auto-detect) */\r\n formData?: boolean;\r\n}\r\n\r\n/**\r\n * Options for CSV response generation\r\n */\r\nexport interface GenerateCsvOptions extends JsonToCsvOptions {\r\n // Additional options specific to CSV response\r\n}\r\n\r\n/**\r\n * Normalize filename for CSV download\r\n */\r\nfunction normalizeFilename(filename?: string): string {\r\n if (!filename || typeof filename !== 'string') {\r\n return 'export.csv';\r\n }\r\n return filename.includes('.') ? filename : `${filename}.csv`;\r\n}\r\n\r\n/**\r\n * Extract CSV text from FormData\r\n */\r\nasync function extractCsvText(formData: FormData, fieldName: string): Promise<string | null> {\r\n if (formData.has(fieldName)) {\r\n const value = formData.get(fieldName);\r\n if (value && typeof (value as any).text === 'function') {\r\n return await (value as any).text();\r\n }\r\n if (value !== null) {\r\n return String(value);\r\n }\r\n }\r\n\r\n for (const value of formData.values()) {\r\n if (value && typeof (value as any).text === 'function') {\r\n return await (value as any).text();\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Parse CSV from SvelteKit request\r\n * \r\n * @example\r\n * // In a SvelteKit endpoint:\r\n * export async function POST({ request }) {\r\n * const data = await parseCsv(request, { delimiter: ',' });\r\n * return json({ success: true, data });\r\n * }\r\n */\r\nexport async function parseCsv(\r\n request: SvelteKitRequest,\r\n options: ParseCsvOptions = {}\r\n): Promise<any[]> {\r\n if (!request || typeof request.text !== 'function') {\r\n throw new Error('parseCsv expects a Request instance');\r\n }\r\n\r\n const { fieldName = 'file', formData: forceFormData, ...csvOptions } = options;\r\n const contentType = request.headers?.get?.('content-type') || '';\r\n let csvText: string | null = null;\r\n\r\n if (forceFormData || contentType.includes('multipart/form-data')) {\r\n const formData = await request.formData();\r\n csvText = await extractCsvText(formData, fieldName);\r\n } else {\r\n csvText = await request.text();\r\n }\r\n\r\n if (!csvText) {\r\n throw new Error('No CSV payload found in request');\r\n }\r\n\r\n return await csvToJson(csvText, csvOptions);\r\n}\r\n\r\n/**\r\n * Async version of parseCsv with better error handling\r\n */\r\nexport async function parseCsvAsync(\r\n request: SvelteKitRequest,\r\n options: ParseCsvOptions = {}\r\n): Promise<any[]> {\r\n try {\r\n return await parseCsv(request, options);\r\n } catch (error) {\r\n throw new Error(`Failed to parse CSV from request: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n}\r\n\r\n/**\r\n * Generate a CSV response for SvelteKit\r\n * \r\n * @example\r\n * // In a SvelteKit endpoint:\r\n * export async function GET() {\r\n * const data = await getData();\r\n * return generateCsv(data, 'export.csv');\r\n * }\r\n */\r\nexport function generateCsv(\r\n data: any,\r\n filename: string = 'export.csv',\r\n options: GenerateCsvOptions = {}\r\n): Response {\r\n const safeName = normalizeFilename(filename);\r\n const rows = Array.isArray(data) ? data : [data];\r\n const csv = jsonToCsv(rows, options);\r\n\r\n return new Response(csv, {\r\n headers: {\r\n 'Content-Type': 'text/csv; charset=utf-8',\r\n 'Content-Disposition': `attachment; filename=\"${safeName}\"`\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Async version of generateCsv\r\n */\r\nexport async function generateAsyncCsv(\r\n data: any,\r\n filename: string = 'export.csv',\r\n options: GenerateCsvOptions = {}\r\n): Promise<Response> {\r\n const safeName = normalizeFilename(filename);\r\n const rows = Array.isArray(data) ? data : [data];\r\n const csv = await jsonToCsv(rows, options);\r\n\r\n return new Response(csv, {\r\n headers: {\r\n 'Content-Type': 'text/csv; charset=utf-8',\r\n 'Content-Disposition': `attachment; filename=\"${safeName}\"`\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * CSV loader helper for SvelteKit\r\n * Creates a loader that returns CSV data\r\n * \r\n * @example\r\n * export const loader = createCsvLoader(async () => {\r\n * return await getData();\r\n * }, 'data.csv');\r\n */\r\nexport function createCsvLoader(\r\n dataLoader: () => Promise<any> | any,\r\n filename: string = 'export.csv',\r\n options: GenerateCsvOptions = {}\r\n): () => Promise<Response> {\r\n return async () => {\r\n try {\r\n const data = await (typeof dataLoader === 'function' ? dataLoader() : dataLoader);\r\n return generateCsv(data, filename, options);\r\n } catch (error) {\r\n return new Response(\r\n JSON.stringify({ error: error instanceof Error ? error.message : 'Unknown error' }),\r\n { status: 500, headers: { 'Content-Type': 'application/json' } }\r\n );\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * CSV action helper for SvelteKit\r\n * Creates an action that parses CSV from form data\r\n * \r\n * @example\r\n * export const action = createCsvAction({ delimiter: ',' });\r\n */\r\nexport function createCsvAction(\r\n options: ParseCsvOptions = {}\r\n): (args: { request: SvelteKitRequest }) => Promise<Response> {\r\n return async ({ request }) => {\r\n try {\r\n const data = await parseCsv(request, options);\r\n return new Response(\r\n JSON.stringify({ success: true, data }),\r\n { headers: { 'Content-Type': 'application/json' } }\r\n );\r\n } catch (error) {\r\n return new Response(\r\n JSON.stringify({ \r\n success: false, \r\n error: error instanceof Error ? error.message : 'Unknown error' \r\n }),\r\n { status: 400, headers: { 'Content-Type': 'application/json' } }\r\n );\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Multi-part form data CSV parser\r\n * Handles multiple CSV files in a single request\r\n */\r\nexport async function parseMultiPartCsv(\r\n request: SvelteKitRequest,\r\n options: ParseCsvOptions & { multiple?: boolean } = {}\r\n): Promise<any[] | any[][]> {\r\n const { multiple = false, ...csvOptions } = options;\r\n const formData = await request.formData();\r\n const results: any[][] = [];\r\n\r\n for (const [fieldName, value] of formData.entries()) {\r\n if (value && typeof (value as any).text === 'function') {\r\n const csvText = await (value as any).text();\r\n if (csvText) {\r\n const parsed = await csvToJson(csvText, csvOptions);\r\n results.push(parsed);\r\n }\r\n }\r\n }\r\n\r\n if (!multiple && results.length > 0) {\r\n return results[0];\r\n }\r\n\r\n return results;\r\n}\r\n\r\n/**\r\n * CSV export utility for SvelteKit routes\r\n */\r\nexport function csvExport(\r\n data: any,\r\n filename?: string,\r\n options?: GenerateCsvOptions\r\n): () => Promise<Response> {\r\n return () => generateAsyncCsv(data, filename, options);\r\n}\r\n\r\n/**\r\n * SvelteKit server hook for CSV processing\r\n * Can be used in hooks.server.js/ts\r\n */\r\nexport function createCsvHook(options: {\r\n parseOptions?: ParseCsvOptions;\r\n generateOptions?: GenerateCsvOptions;\r\n} = {}) {\r\n return {\r\n async handle({ event, resolve }: { event: any; resolve: any }) {\r\n // Add CSV utilities to event.locals\r\n event.locals.csv = {\r\n parse: (request: SvelteKitRequest, opts?: ParseCsvOptions) => \r\n parseCsv(request, { ...options.parseOptions, ...opts }),\r\n parseAsync: (request: SvelteKitRequest, opts?: ParseCsvOptions) => \r\n parseCsvAsync(request, { ...options.parseOptions, ...opts }),\r\n generate: (data: any, filename?: string, opts?: GenerateCsvOptions) => \r\n generateCsv(data, filename, { ...options.generateOptions, ...opts }),\r\n generateAsync: (data: any, filename?: string, opts?: GenerateCsvOptions) => \r\n generateAsyncCsv(data, filename, { ...options.generateOptions, ...opts }),\r\n };\r\n\r\n return resolve(event);\r\n }\r\n };\r\n}\r\n\r\nexport default {\r\n parseCsv,\r\n parseCsvAsync,\r\n generateCsv,\r\n generateAsyncCsv,\r\n createCsvLoader,\r\n createCsvAction,\r\n parseMultiPartCsv,\r\n csvExport,\r\n createCsvHook,\r\n};"]}