jtcsv 2.1.3 → 2.2.2
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.
- package/LICENSE +1 -1
- package/README.md +60 -341
- package/bin/jtcsv.js +2462 -1372
- package/csv-to-json.js +35 -26
- package/dist/jtcsv.cjs.js +807 -133
- package/dist/jtcsv.cjs.js.map +1 -1
- package/dist/jtcsv.esm.js +800 -134
- package/dist/jtcsv.esm.js.map +1 -1
- package/dist/jtcsv.umd.js +807 -133
- package/dist/jtcsv.umd.js.map +1 -1
- package/errors.js +20 -0
- package/examples/browser-vanilla.html +37 -0
- package/examples/cli-batch-processing.js +38 -0
- package/examples/error-handling.js +324 -0
- package/examples/ndjson-processing.js +434 -0
- package/examples/react-integration.jsx +637 -0
- package/examples/schema-validation.js +640 -0
- package/examples/simple-usage.js +10 -7
- package/examples/typescript-example.ts +486 -0
- package/examples/web-workers-advanced.js +28 -0
- package/index.d.ts +2 -0
- package/json-save.js +2 -1
- package/json-to-csv.js +171 -131
- package/package.json +20 -4
- package/plugins/README.md +41 -467
- package/plugins/express-middleware/README.md +32 -274
- package/plugins/hono/README.md +16 -13
- package/plugins/nestjs/README.md +13 -11
- package/plugins/nextjs-api/README.md +28 -423
- package/plugins/nextjs-api/index.js +1 -2
- package/plugins/nextjs-api/route.js +1 -2
- package/plugins/nuxt/README.md +6 -7
- package/plugins/remix/README.md +9 -9
- package/plugins/sveltekit/README.md +8 -8
- package/plugins/trpc/README.md +8 -5
- package/src/browser/browser-functions.js +33 -3
- package/src/browser/csv-to-json-browser.js +269 -11
- package/src/browser/errors-browser.js +19 -1
- package/src/browser/index.js +39 -5
- package/src/browser/streams.js +393 -0
- package/src/browser/workers/csv-parser.worker.js +20 -2
- package/src/browser/workers/worker-pool.js +507 -447
- package/src/core/plugin-system.js +4 -0
- package/src/engines/fast-path-engine.js +31 -23
- package/src/errors.js +26 -0
- package/src/formats/ndjson-parser.js +54 -5
- package/src/formats/tsv-parser.js +4 -1
- package/src/utils/schema-validator.js +594 -0
- package/src/utils/transform-loader.js +205 -0
- package/src/web-server/index.js +683 -0
- package/stream-csv-to-json.js +16 -87
- package/stream-json-to-csv.js +18 -86
package/plugins/README.md
CHANGED
|
@@ -1,17 +1,35 @@
|
|
|
1
|
-
# JTCSV
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
##
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
# JTCSV framework integrations
|
|
2
|
+
|
|
3
|
+
This folder contains optional adapters published as separate packages. Each adapter depends on `jtcsv`.
|
|
4
|
+
|
|
5
|
+
## Available packages
|
|
6
|
+
- @jtcsv/express-middleware
|
|
7
|
+
- @jtcsv/fastify
|
|
8
|
+
- @jtcsv/nextjs
|
|
9
|
+
- @jtcsv/nestjs
|
|
10
|
+
- @jtcsv/remix
|
|
11
|
+
- @jtcsv/nuxt
|
|
12
|
+
- @jtcsv/sveltekit
|
|
13
|
+
- @jtcsv/hono
|
|
14
|
+
- @jtcsv/trpc
|
|
15
|
+
|
|
16
|
+
## Main package shortcuts
|
|
17
|
+
If you already depend on `jtcsv`, the adapters are also exported from the main package:
|
|
18
|
+
- jtcsv/express
|
|
19
|
+
- jtcsv/fastify
|
|
20
|
+
- jtcsv/nextjs
|
|
21
|
+
- jtcsv/nextjs/route
|
|
22
|
+
- jtcsv/nestjs
|
|
23
|
+
- jtcsv/remix
|
|
24
|
+
- jtcsv/nuxt
|
|
25
|
+
- jtcsv/sveltekit
|
|
26
|
+
- jtcsv/hono
|
|
27
|
+
- jtcsv/trpc
|
|
28
|
+
|
|
29
|
+
## Express
|
|
11
30
|
```bash
|
|
12
31
|
npm install @jtcsv/express-middleware express jtcsv
|
|
13
32
|
```
|
|
14
|
-
|
|
15
33
|
```javascript
|
|
16
34
|
const express = require('express');
|
|
17
35
|
const { middleware } = require('@jtcsv/express-middleware');
|
|
@@ -20,498 +38,54 @@ const app = express();
|
|
|
20
38
|
app.use(express.json());
|
|
21
39
|
app.use(express.text({ type: 'text/csv' }));
|
|
22
40
|
app.use(middleware());
|
|
23
|
-
|
|
24
|
-
app.post('/api/convert', (req, res) => {
|
|
25
|
-
res.json({
|
|
26
|
-
data: req.converted.data,
|
|
27
|
-
format: req.converted.format,
|
|
28
|
-
stats: req.converted.stats
|
|
29
|
-
});
|
|
30
|
-
});
|
|
31
41
|
```
|
|
32
42
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
### 2. Fastify Plugin (@jtcsv/fastify)
|
|
36
|
-
|
|
37
|
-
**Fastify plugin для автоматической конвертации CSV/JSON.**
|
|
38
|
-
|
|
43
|
+
## Fastify
|
|
39
44
|
```bash
|
|
40
45
|
npm install @jtcsv/fastify fastify fastify-plugin jtcsv
|
|
41
46
|
```
|
|
42
|
-
|
|
43
47
|
```javascript
|
|
44
48
|
const fastify = require('fastify')();
|
|
45
|
-
|
|
46
|
-
await fastify.register(require('@jtcsv/fastify'), {
|
|
47
|
-
prefix: '/api/convert'
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
// Доступ через fastify.jtcsv
|
|
51
|
-
const csv = await fastify.jtcsv.jsonToCsv([{ name: 'John' }]);
|
|
49
|
+
await fastify.register(require('@jtcsv/fastify'), { prefix: '/api' });
|
|
52
50
|
```
|
|
53
51
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
### 3. Next.js Integration (@jtcsv/nextjs)
|
|
57
|
-
|
|
58
|
-
**Next.js интеграция - API routes, React hooks и компоненты.**
|
|
59
|
-
|
|
52
|
+
## Next.js
|
|
60
53
|
```bash
|
|
61
54
|
npm install @jtcsv/nextjs jtcsv
|
|
62
55
|
```
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
// pages/api/convert.js
|
|
66
|
-
import { handler } from '@jtcsv/nextjs/route';
|
|
56
|
+
```javascript
|
|
57
|
+
import handler from '@jtcsv/nextjs/route';
|
|
67
58
|
export default handler;
|
|
68
|
-
|
|
69
|
-
// components/Converter.jsx
|
|
70
|
-
'use client';
|
|
71
|
-
import { useJtcsv } from '@jtcsv/nextjs';
|
|
72
|
-
|
|
73
|
-
export default function Converter() {
|
|
74
|
-
const { convertCsvToJson } = useJtcsv();
|
|
75
|
-
// ...
|
|
76
|
-
}
|
|
77
59
|
```
|
|
78
60
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
### 4. NestJS Integration (@jtcsv/nestjs)
|
|
82
|
-
|
|
83
|
-
**NestJS interceptors and decorators for CSV upload/download.**
|
|
84
|
-
|
|
61
|
+
## NestJS
|
|
85
62
|
```bash
|
|
86
63
|
npm install @jtcsv/nestjs jtcsv
|
|
87
64
|
```
|
|
88
65
|
|
|
89
|
-
|
|
90
|
-
import { CsvParserInterceptor, CsvDownloadDecorator } from 'jtcsv/nestjs';
|
|
91
|
-
|
|
92
|
-
@Controller('data')
|
|
93
|
-
export class DataController {
|
|
94
|
-
@Post('upload')
|
|
95
|
-
@CsvParserInterceptor({ delimiter: ',' })
|
|
96
|
-
uploadCsv(@Body() jsonData: any[]) {
|
|
97
|
-
return { parsed: jsonData };
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
@Get('export')
|
|
101
|
-
@CsvDownloadDecorator({ filename: 'export.csv' })
|
|
102
|
-
exportData() {
|
|
103
|
-
return [{ id: 1, name: 'John' }];
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
[📚 Документация](./nestjs/README.md)
|
|
109
|
-
|
|
110
|
-
### 5. Remix Integration (@jtcsv/remix)
|
|
111
|
-
|
|
112
|
-
**Helpers for form-data parsing and CSV downloads in Remix.**
|
|
113
|
-
|
|
66
|
+
## Remix
|
|
114
67
|
```bash
|
|
115
68
|
npm install @jtcsv/remix jtcsv
|
|
116
69
|
```
|
|
117
70
|
|
|
118
|
-
|
|
119
|
-
import { parseFormData, generateCsvResponse } from 'jtcsv/remix';
|
|
120
|
-
|
|
121
|
-
export async function action({ request }) {
|
|
122
|
-
const rows = await parseFormData(request, { delimiter: ',' });
|
|
123
|
-
return { parsed: rows };
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
export async function loader() {
|
|
127
|
-
return generateCsvResponse([{ id: 1, name: 'John' }], 'export.csv');
|
|
128
|
-
}
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
[📚 Документация](./remix/README.md)
|
|
132
|
-
|
|
133
|
-
### 6. Nuxt Integration (@jtcsv/nuxt)
|
|
134
|
-
|
|
135
|
-
**Nuxt module with auto-imported composable.**
|
|
136
|
-
|
|
71
|
+
## Nuxt
|
|
137
72
|
```bash
|
|
138
73
|
npm install @jtcsv/nuxt jtcsv
|
|
139
74
|
```
|
|
140
75
|
|
|
141
|
-
|
|
142
|
-
export default defineNuxtConfig({
|
|
143
|
-
modules: ['@jtcsv/nuxt'],
|
|
144
|
-
jtcsv: { autoimport: true }
|
|
145
|
-
});
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
```vue
|
|
149
|
-
<script setup>
|
|
150
|
-
const { csvToJson, jsonToCsv } = useJtcsv();
|
|
151
|
-
</script>
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
[📚 Документация](./nuxt/README.md)
|
|
155
|
-
|
|
156
|
-
### 7. SvelteKit Integration (@jtcsv/sveltekit)
|
|
157
|
-
|
|
158
|
-
**Request helpers for SvelteKit actions/endpoints.**
|
|
159
|
-
|
|
76
|
+
## SvelteKit
|
|
160
77
|
```bash
|
|
161
78
|
npm install @jtcsv/sveltekit jtcsv
|
|
162
79
|
```
|
|
163
80
|
|
|
164
|
-
|
|
165
|
-
import { parseCsv, generateCsv } from 'jtcsv/sveltekit';
|
|
166
|
-
|
|
167
|
-
export const actions = {
|
|
168
|
-
upload: async ({ request }) => {
|
|
169
|
-
const rows = await parseCsv(request, { delimiter: ',' });
|
|
170
|
-
return { rows };
|
|
171
|
-
}
|
|
172
|
-
};
|
|
173
|
-
|
|
174
|
-
export async function GET() {
|
|
175
|
-
return generateCsv([{ id: 1 }], 'export.csv');
|
|
176
|
-
}
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
[📚 Документация](./sveltekit/README.md)
|
|
180
|
-
|
|
181
|
-
### 8. Hono Integration (@jtcsv/hono)
|
|
182
|
-
|
|
183
|
-
**Minimal middleware for CSV parsing with Hono.**
|
|
184
|
-
|
|
81
|
+
## Hono
|
|
185
82
|
```bash
|
|
186
83
|
npm install @jtcsv/hono jtcsv
|
|
187
84
|
```
|
|
188
85
|
|
|
189
|
-
|
|
190
|
-
import { Hono } from 'hono';
|
|
191
|
-
import { csvMiddleware, createCsvResponse } from 'jtcsv/hono';
|
|
192
|
-
|
|
193
|
-
const app = new Hono()
|
|
194
|
-
.use('/upload', csvMiddleware())
|
|
195
|
-
.post('/upload', (c) => c.json({ rows: c.get('csv') }))
|
|
196
|
-
.get('/export', (c) => {
|
|
197
|
-
const { csv, headers } = createCsvResponse([{ id: 1 }], 'export.csv');
|
|
198
|
-
return c.text(csv, 200, headers);
|
|
199
|
-
});
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
[📚 Документация](./hono/README.md)
|
|
203
|
-
|
|
204
|
-
### 9. tRPC Integration (@jtcsv/trpc)
|
|
205
|
-
|
|
206
|
-
**Middleware helper for CSV input parsing in tRPC procedures.**
|
|
207
|
-
|
|
86
|
+
## tRPC
|
|
208
87
|
```bash
|
|
209
88
|
npm install @jtcsv/trpc jtcsv
|
|
210
89
|
```
|
|
211
90
|
|
|
212
|
-
|
|
213
|
-
import { initTRPC } from '@trpc/server';
|
|
214
|
-
import { z } from 'zod';
|
|
215
|
-
import { createCsvProcedure } from 'jtcsv/trpc';
|
|
216
|
-
|
|
217
|
-
const t = initTRPC.create();
|
|
218
|
-
|
|
219
|
-
export const router = t.router({
|
|
220
|
-
parseCsv: createCsvProcedure(t, z.string())
|
|
221
|
-
.mutation(async ({ input }) => ({ parsed: input }))
|
|
222
|
-
});
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
[📚 Документация](./trpc/README.md)
|
|
226
|
-
|
|
227
|
-
## 🎯 Особенности
|
|
228
|
-
|
|
229
|
-
### Единый API
|
|
230
|
-
|
|
231
|
-
Все плагины предоставляют согласованный API:
|
|
232
|
-
|
|
233
|
-
```javascript
|
|
234
|
-
// Express
|
|
235
|
-
app.use(jtcsvMiddleware({ delimiter: ',' }));
|
|
236
|
-
|
|
237
|
-
// Fastify
|
|
238
|
-
await fastify.register(jtcsvPlugin, { delimiter: ',' });
|
|
239
|
-
|
|
240
|
-
// Next.js
|
|
241
|
-
const { convertCsvToJson } = useJtcsv({ delimiter: ',' });
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
### Автоматическое определение формата
|
|
245
|
-
|
|
246
|
-
- Определение по Content-Type заголовку
|
|
247
|
-
- Автоматическое определение по содержимому
|
|
248
|
-
- Поддержка query параметров для ручного указания
|
|
249
|
-
|
|
250
|
-
### Безопасность
|
|
251
|
-
|
|
252
|
-
- Защита от CSV инъекций (по умолчанию включена)
|
|
253
|
-
- Валидация размера запросов
|
|
254
|
-
- RFC 4180 compliance
|
|
255
|
-
|
|
256
|
-
### Производительность
|
|
257
|
-
|
|
258
|
-
- Fast-Path Engine для оптимизации
|
|
259
|
-
- Streaming поддержка для больших файлов
|
|
260
|
-
- Кеширование парсеров
|
|
261
|
-
|
|
262
|
-
## 🔧 Конфигурация
|
|
263
|
-
|
|
264
|
-
### Общие опции
|
|
265
|
-
|
|
266
|
-
| Опция | Тип | По умолчанию | Описание |
|
|
267
|
-
|-------|-----|--------------|----------|
|
|
268
|
-
| `delimiter` | `string` | `','` | Разделитель CSV |
|
|
269
|
-
| `preventCsvInjection` | `boolean` | `true` | Защита от CSV инъекций |
|
|
270
|
-
| `rfc4180Compliant` | `boolean` | `true` | Соответствие RFC 4180 |
|
|
271
|
-
| `useFastPath` | `boolean` | `true` | Использовать Fast-Path Engine |
|
|
272
|
-
|
|
273
|
-
### Специфичные опции
|
|
274
|
-
|
|
275
|
-
#### Express Middleware
|
|
276
|
-
|
|
277
|
-
```javascript
|
|
278
|
-
{
|
|
279
|
-
maxSize: '10mb', // Максимальный размер тела запроса
|
|
280
|
-
autoDetect: true // Автоматическое определение формата
|
|
281
|
-
}
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
#### Fastify Plugin
|
|
285
|
-
|
|
286
|
-
```javascript
|
|
287
|
-
{
|
|
288
|
-
prefix: '/convert' // Префикс для routes
|
|
289
|
-
}
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
#### Next.js Integration
|
|
293
|
-
|
|
294
|
-
```javascript
|
|
295
|
-
{
|
|
296
|
-
parseNumbers: true, // Парсить числа
|
|
297
|
-
parseBooleans: true // Парсить булевы значения
|
|
298
|
-
}
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
## 🌐 Примеры использования
|
|
302
|
-
|
|
303
|
-
### REST API
|
|
304
|
-
|
|
305
|
-
```bash
|
|
306
|
-
# JSON → CSV
|
|
307
|
-
curl -X POST https://api.example.com/convert \
|
|
308
|
-
-H "Content-Type: application/json" \
|
|
309
|
-
-d '[{"name":"John","age":30}]'
|
|
310
|
-
|
|
311
|
-
# CSV → JSON
|
|
312
|
-
curl -X POST https://api.example.com/convert \
|
|
313
|
-
-H "Content-Type: text/csv" \
|
|
314
|
-
-d 'name,age\nJohn,30\nJane,25'
|
|
315
|
-
```
|
|
316
|
-
|
|
317
|
-
### Web Application
|
|
318
|
-
|
|
319
|
-
```jsx
|
|
320
|
-
// React/Next.js компонент
|
|
321
|
-
function DataExporter({ data }) {
|
|
322
|
-
const { convertJsonToCsv } = useJtcsv();
|
|
323
|
-
|
|
324
|
-
const handleExport = async () => {
|
|
325
|
-
const csv = await convertJsonToCsv(data);
|
|
326
|
-
downloadCsv(csv, 'export.csv');
|
|
327
|
-
};
|
|
328
|
-
|
|
329
|
-
return (
|
|
330
|
-
<button onClick={handleExport}>
|
|
331
|
-
Export as CSV
|
|
332
|
-
</button>
|
|
333
|
-
);
|
|
334
|
-
}
|
|
335
|
-
```
|
|
336
|
-
|
|
337
|
-
### Backend Service
|
|
338
|
-
|
|
339
|
-
```javascript
|
|
340
|
-
// Express приложение для обработки загрузок
|
|
341
|
-
app.post('/api/upload', upload.single('file'), async (req, res) => {
|
|
342
|
-
const csv = req.file.buffer.toString();
|
|
343
|
-
const json = await csvToJson(csv);
|
|
344
|
-
|
|
345
|
-
// Сохранение в базу данных
|
|
346
|
-
await db.insert('data', json);
|
|
347
|
-
|
|
348
|
-
res.json({ success: true, rows: json.length });
|
|
349
|
-
});
|
|
350
|
-
```
|
|
351
|
-
|
|
352
|
-
## 📊 Мониторинг и Health Check
|
|
353
|
-
|
|
354
|
-
Все плагины предоставляют health check endpoints:
|
|
355
|
-
|
|
356
|
-
```bash
|
|
357
|
-
# Express
|
|
358
|
-
GET /api/health
|
|
359
|
-
|
|
360
|
-
# Fastify
|
|
361
|
-
GET /convert/health
|
|
362
|
-
|
|
363
|
-
# Next.js
|
|
364
|
-
GET /api/convert/health
|
|
365
|
-
```
|
|
366
|
-
|
|
367
|
-
**Пример ответа:**
|
|
368
|
-
```json
|
|
369
|
-
{
|
|
370
|
-
"service": "jtcsv-integration",
|
|
371
|
-
"status": "healthy",
|
|
372
|
-
"version": "1.0.0",
|
|
373
|
-
"features": {
|
|
374
|
-
"csvToJson": true,
|
|
375
|
-
"jsonToCsv": true,
|
|
376
|
-
"fastPathEngine": true,
|
|
377
|
-
"csvInjectionProtection": true
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
```
|
|
381
|
-
|
|
382
|
-
## 🔌 Расширяемость
|
|
383
|
-
|
|
384
|
-
### Кастомные middleware
|
|
385
|
-
|
|
386
|
-
```javascript
|
|
387
|
-
// Express
|
|
388
|
-
app.use((req, res, next) => {
|
|
389
|
-
// Логирование
|
|
390
|
-
console.log(`[${new Date()}] ${req.method} ${req.url}`);
|
|
391
|
-
|
|
392
|
-
// Rate limiting
|
|
393
|
-
// ...
|
|
394
|
-
|
|
395
|
-
next();
|
|
396
|
-
});
|
|
397
|
-
|
|
398
|
-
app.use(jtcsvMiddleware());
|
|
399
|
-
```
|
|
400
|
-
|
|
401
|
-
### Плагины JTCSV
|
|
402
|
-
|
|
403
|
-
Все интеграции совместимы с plugin system JTCSV:
|
|
404
|
-
|
|
405
|
-
```javascript
|
|
406
|
-
const jtcsv = require('jtcsv;
|
|
407
|
-
|
|
408
|
-
jtcsv.use('my-plugin', {
|
|
409
|
-
hooks: {
|
|
410
|
-
'before:csvToJson': (csv) => {
|
|
411
|
-
// Кастомная обработка
|
|
412
|
-
return csv;
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
});
|
|
416
|
-
```
|
|
417
|
-
|
|
418
|
-
## 🚀 Производительность
|
|
419
|
-
|
|
420
|
-
### Бенчмарки
|
|
421
|
-
|
|
422
|
-
| Операция | Без плагина | С плагином | Ускорение |
|
|
423
|
-
|----------|-------------|------------|-----------|
|
|
424
|
-
| CSV → JSON (10k rows) | 120ms | 45ms | 2.7x |
|
|
425
|
-
| JSON → CSV (10k rows) | 85ms | 32ms | 2.7x |
|
|
426
|
-
| File Upload (1MB) | 210ms | 95ms | 2.2x |
|
|
427
|
-
|
|
428
|
-
### Оптимизации
|
|
429
|
-
|
|
430
|
-
1. **Fast-Path Engine** - автоматический выбор оптимального парсера
|
|
431
|
-
2. **Streaming** - обработка больших файлов без загрузки в память
|
|
432
|
-
3. **Кеширование** - кеширование скомпилированных парсеров
|
|
433
|
-
4. **Пакетная обработка** - оптимизация для bulk операций
|
|
434
|
-
|
|
435
|
-
## 🔐 Безопасность
|
|
436
|
-
|
|
437
|
-
### Защитные механизмы
|
|
438
|
-
|
|
439
|
-
1. **CSV Injection Protection** - экранирование опасных символов
|
|
440
|
-
2. **Size Limits** - ограничение размера запросов
|
|
441
|
-
3. **Input Validation** - валидация входных данных
|
|
442
|
-
4. **Error Handling** - безопасная обработка ошибок
|
|
443
|
-
|
|
444
|
-
### Рекомендации
|
|
445
|
-
|
|
446
|
-
```javascript
|
|
447
|
-
// Production конфигурация
|
|
448
|
-
app.use(jtcsvMiddleware({
|
|
449
|
-
maxSize: '10mb',
|
|
450
|
-
preventCsvInjection: true,
|
|
451
|
-
rfc4180Compliant: true
|
|
452
|
-
}));
|
|
453
|
-
|
|
454
|
-
// Rate limiting
|
|
455
|
-
app.use(rateLimit({
|
|
456
|
-
windowMs: 15 * 60 * 1000,
|
|
457
|
-
max: 100
|
|
458
|
-
}));
|
|
459
|
-
```
|
|
460
|
-
|
|
461
|
-
## 📚 Документация
|
|
462
|
-
|
|
463
|
-
- [Express Middleware](./express-middleware/README.md)
|
|
464
|
-
- [Fastify Plugin](./fastify-plugin/README.md)
|
|
465
|
-
- [Next.js Integration](./nextjs-api/README.md)
|
|
466
|
-
- [Основная документация JTCSV](../README.md)
|
|
467
|
-
|
|
468
|
-
## 🧪 Тестирование
|
|
469
|
-
|
|
470
|
-
```bash
|
|
471
|
-
# Тестирование всех плагинов
|
|
472
|
-
cd plugins
|
|
473
|
-
npm test
|
|
474
|
-
|
|
475
|
-
# Тестирование конкретного плагина
|
|
476
|
-
cd express-middleware
|
|
477
|
-
npm test
|
|
478
|
-
|
|
479
|
-
# Запуск примеров
|
|
480
|
-
cd nextjs-api/examples
|
|
481
|
-
node api-convert.js
|
|
482
|
-
```
|
|
483
|
-
|
|
484
|
-
## 🤝 Вклад в развитие
|
|
485
|
-
|
|
486
|
-
Мы приветствуем вклады в развитие плагинов!
|
|
487
|
-
|
|
488
|
-
### Как помочь
|
|
489
|
-
|
|
490
|
-
1. **Сообщить о баге** - создайте issue с подробным описанием
|
|
491
|
-
2. **Предложить улучшение** - обсудите в Discussions
|
|
492
|
-
3. **Создать pull request** - реализуйте новую функцию
|
|
493
|
-
4. **Улучшить документацию** - помогите другим разработчикам
|
|
494
|
-
|
|
495
|
-
### Руководство по разработке
|
|
496
|
-
|
|
497
|
-
1. Клонируйте репозиторий
|
|
498
|
-
2. Установите зависимости: `npm install`
|
|
499
|
-
3. Создайте ветку: `git checkout -b feature/amazing`
|
|
500
|
-
4. Внесите изменения и протестируйте
|
|
501
|
-
5. Запушьте изменения: `git push origin feature/amazing`
|
|
502
|
-
6. Откройте Pull Request
|
|
503
|
-
|
|
504
|
-
## 📞 Поддержка
|
|
505
|
-
|
|
506
|
-
- **Issues**: [GitHub Issues](https://github.com/Linol-Hamelton/jtcsv/issues)
|
|
507
|
-
- **Discussions**: [GitHub Discussions](https://github.com/Linol-Hamelton/jtcsv/discussions)
|
|
508
|
-
- **Documentation**: [Основная документация](../README.md)
|
|
509
|
-
- **Email**: [Указать email если есть]
|
|
510
|
-
|
|
511
|
-
## 📄 Лицензия
|
|
512
|
-
|
|
513
|
-
Все плагины распространяются под лицензией MIT. См. файл [LICENSE](../LICENSE) для подробностей.
|
|
514
|
-
|
|
515
|
-
---
|
|
516
|
-
|
|
517
|
-
**JTCSV Плагины** - делаем работу с CSV/JSON проще в любом фреймворке! 🚀
|
|
91
|
+
See each package README in this folder for API details.
|