jtcsv 1.2.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +252 -337
- package/bin/jtcsv.js +167 -85
- package/cli-tui.js +0 -0
- package/dist/jtcsv.cjs.js +1619 -0
- package/dist/jtcsv.cjs.js.map +1 -0
- package/dist/jtcsv.esm.js +1599 -0
- package/dist/jtcsv.esm.js.map +1 -0
- package/dist/jtcsv.umd.js +1625 -0
- package/dist/jtcsv.umd.js.map +1 -0
- package/examples/cli-tool.js +186 -0
- package/examples/express-api.js +167 -0
- package/examples/large-dataset-example.js +185 -0
- package/examples/plugin-excel-exporter.js +407 -0
- package/examples/simple-usage.js +280 -0
- package/examples/streaming-example.js +419 -0
- package/index.d.ts +4 -0
- package/json-save.js +1 -1
- package/package.json +128 -14
- package/plugins/README.md +373 -0
- package/plugins/express-middleware/README.md +306 -0
- package/plugins/express-middleware/example.js +136 -0
- package/plugins/express-middleware/index.d.ts +114 -0
- package/plugins/express-middleware/index.js +360 -0
- package/plugins/express-middleware/package.json +52 -0
- package/plugins/fastify-plugin/index.js +406 -0
- package/plugins/fastify-plugin/package.json +55 -0
- package/plugins/nextjs-api/README.md +452 -0
- package/plugins/nextjs-api/examples/ConverterComponent.jsx +386 -0
- package/plugins/nextjs-api/examples/api-convert.js +69 -0
- package/plugins/nextjs-api/index.js +388 -0
- package/plugins/nextjs-api/package.json +63 -0
- package/plugins/nextjs-api/route.js +372 -0
- package/src/browser/browser-functions.js +189 -0
- package/src/browser/csv-to-json-browser.js +442 -0
- package/src/browser/errors-browser.js +194 -0
- package/src/browser/index.js +79 -0
- package/src/browser/json-to-csv-browser.js +309 -0
- package/src/browser/workers/csv-parser.worker.js +359 -0
- package/src/browser/workers/worker-pool.js +467 -0
- package/src/core/plugin-system.js +472 -0
- package/src/engines/fast-path-engine-new.js +338 -0
- package/src/engines/fast-path-engine.js +347 -0
- package/src/formats/ndjson-parser.js +419 -0
- package/src/index-with-plugins.js +349 -0
- package/stream-csv-to-json.js +1 -1
- package/stream-json-to-csv.js +1 -1
package/json-save.js
CHANGED
package/package.json
CHANGED
|
@@ -1,22 +1,88 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jtcsv",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Complete JSON↔CSV converter for Node.js with streaming, security,
|
|
3
|
+
"version": "2.1.0",
|
|
4
|
+
"description": "Complete JSON↔CSV and CSV↔JSON converter for Node.js and Browser with streaming, security, Web Workers, TypeScript support, and Plugin System - Zero dependencies",
|
|
5
5
|
"main": "index.js",
|
|
6
|
+
"browser": "dist/jtcsv.umd.js",
|
|
7
|
+
"module": "dist/jtcsv.esm.js",
|
|
6
8
|
"types": "index.d.ts",
|
|
7
9
|
"bin": {
|
|
8
10
|
"jtcsv": "bin/jtcsv.js"
|
|
11
|
+
},
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"require": "./index.js",
|
|
15
|
+
"import": "./dist/jtcsv.esm.js",
|
|
16
|
+
"browser": "./dist/jtcsv.umd.js",
|
|
17
|
+
"default": "./index.js"
|
|
18
|
+
},
|
|
19
|
+
"./browser": {
|
|
20
|
+
"require": "./dist/jtcsv.cjs.js",
|
|
21
|
+
"import": "./dist/jtcsv.esm.js",
|
|
22
|
+
"browser": "./dist/jtcsv.umd.js",
|
|
23
|
+
"default": "./dist/jtcsv.esm.js"
|
|
24
|
+
},
|
|
25
|
+
"./plugins": {
|
|
26
|
+
"require": "./src/index-with-plugins.js",
|
|
27
|
+
"import": "./src/index-with-plugins.js",
|
|
28
|
+
"default": "./src/index-with-plugins.js"
|
|
29
|
+
},
|
|
30
|
+
"./express": {
|
|
31
|
+
"require": "./plugins/express-middleware/index.js",
|
|
32
|
+
"import": "./plugins/express-middleware/index.js",
|
|
33
|
+
"default": "./plugins/express-middleware/index.js"
|
|
34
|
+
},
|
|
35
|
+
"./fastify": {
|
|
36
|
+
"require": "./plugins/fastify-plugin/index.js",
|
|
37
|
+
"import": "./plugins/fastify-plugin/index.js",
|
|
38
|
+
"default": "./plugins/fastify-plugin/index.js"
|
|
39
|
+
},
|
|
40
|
+
"./nextjs": {
|
|
41
|
+
"require": "./plugins/nextjs-api/index.js",
|
|
42
|
+
"import": "./plugins/nextjs-api/index.js",
|
|
43
|
+
"default": "./plugins/nextjs-api/index.js"
|
|
44
|
+
},
|
|
45
|
+
"./nextjs/route": {
|
|
46
|
+
"require": "./plugins/nextjs-api/route.js",
|
|
47
|
+
"import": "./plugins/nextjs-api/route.js",
|
|
48
|
+
"default": "./plugins/nextjs-api/route.js"
|
|
49
|
+
}
|
|
9
50
|
},
|
|
10
51
|
"scripts": {
|
|
11
52
|
"test": "jest",
|
|
12
53
|
"test:coverage": "jest --coverage",
|
|
13
54
|
"test:watch": "jest --watch",
|
|
14
|
-
"
|
|
55
|
+
"test:browser": "jest --testEnvironment=jsdom",
|
|
56
|
+
"test:plugins": "jest __tests__/plugin-system.test.js",
|
|
57
|
+
"test:fastpath": "jest __tests__/fast-path-engine.test.js",
|
|
58
|
+
"test:ndjson": "jest __tests__/ndjson-parser.test.js",
|
|
59
|
+
"test:performance": "jest __tests__/*.test.js --testNamePattern=\"Производительность|производительность\"",
|
|
60
|
+
"test:express": "cd plugins/express-middleware && npm test",
|
|
61
|
+
"test:fastify": "cd plugins/fastify-plugin && npm test",
|
|
62
|
+
"test:nextjs": "cd plugins/nextjs-api && npm test",
|
|
63
|
+
"lint": "eslint index.js json-to-csv.js csv-to-json.js errors.js stream-json-to-csv.js stream-csv-to-json.js json-save.js src/browser src/engines src/formats src/core",
|
|
15
64
|
"lint:all": "eslint .",
|
|
65
|
+
"lint:plugins": "eslint plugins/",
|
|
16
66
|
"security-check": "npm audit",
|
|
17
|
-
"prepublishOnly": "npm test && eslint index.js json-to-csv.js csv-to-json.js errors.js stream-json-to-csv.js stream-csv-to-json.js json-save.js",
|
|
67
|
+
"prepublishOnly": "npm test && npm run build && eslint index.js json-to-csv.js csv-to-json.js errors.js stream-json-to-csv.js stream-csv-to-json.js json-save.js src/browser src/engines src/formats src/core",
|
|
18
68
|
"tui": "node cli-tui.js",
|
|
19
|
-
"cli": "node bin/jtcsv.js"
|
|
69
|
+
"cli": "node bin/jtcsv.js",
|
|
70
|
+
"build": "rollup -c rollup.config.mjs",
|
|
71
|
+
"build:watch": "rollup -c rollup.config.mjs -w",
|
|
72
|
+
"build:prod": "NODE_ENV=production rollup -c rollup.config.mjs",
|
|
73
|
+
"dev": "NODE_ENV=development rollup -c rollup.config.mjs -w",
|
|
74
|
+
"demo": "node run-demo.js",
|
|
75
|
+
"demo:web": "cd demo && npm run dev",
|
|
76
|
+
"demo:serve": "cd demo && npm run serve",
|
|
77
|
+
"demo:plugins": "node examples/plugin-excel-exporter.js",
|
|
78
|
+
"demo:express": "cd plugins/express-middleware && node example.js",
|
|
79
|
+
"size": "size-limit",
|
|
80
|
+
"size:why": "size-limit --why",
|
|
81
|
+
"benchmark": "node benchmark.js",
|
|
82
|
+
"benchmark:fastpath": "node benchmark.js --fastpath",
|
|
83
|
+
"example:plugins": "node examples/plugin-excel-exporter.js",
|
|
84
|
+
"example:express": "cd plugins/express-middleware && node example.js",
|
|
85
|
+
"plugins:build": "npm run build && cd plugins/express-middleware && npm run build && cd ../fastify-plugin && npm run build && cd ../nextjs-api && npm run build"
|
|
20
86
|
},
|
|
21
87
|
"keywords": [
|
|
22
88
|
"json",
|
|
@@ -32,15 +98,18 @@
|
|
|
32
98
|
"data",
|
|
33
99
|
"transform",
|
|
34
100
|
"nodejs",
|
|
101
|
+
"browser",
|
|
102
|
+
"web-workers",
|
|
103
|
+
"streaming",
|
|
104
|
+
"security",
|
|
105
|
+
"csv-injection",
|
|
35
106
|
"javascript",
|
|
107
|
+
"typescript",
|
|
36
108
|
"simple",
|
|
37
109
|
"lightweight",
|
|
38
110
|
"zero-dependencies",
|
|
39
|
-
"security",
|
|
40
|
-
"streaming",
|
|
41
111
|
"utf8",
|
|
42
112
|
"cyrillic",
|
|
43
|
-
"typescript",
|
|
44
113
|
"bidirectional",
|
|
45
114
|
"cli",
|
|
46
115
|
"tui",
|
|
@@ -48,7 +117,21 @@
|
|
|
48
117
|
"interface",
|
|
49
118
|
"gui",
|
|
50
119
|
"tool",
|
|
51
|
-
"utility"
|
|
120
|
+
"utility",
|
|
121
|
+
"plugin-system",
|
|
122
|
+
"ndjson",
|
|
123
|
+
"fast-path",
|
|
124
|
+
"optimization",
|
|
125
|
+
"performance",
|
|
126
|
+
"enterprise",
|
|
127
|
+
"express",
|
|
128
|
+
"fastify",
|
|
129
|
+
"nextjs",
|
|
130
|
+
"react",
|
|
131
|
+
"middleware",
|
|
132
|
+
"api",
|
|
133
|
+
"rest",
|
|
134
|
+
"http"
|
|
52
135
|
],
|
|
53
136
|
"author": "Ruslan Fomenko",
|
|
54
137
|
"license": "MIT",
|
|
@@ -72,16 +155,47 @@
|
|
|
72
155
|
"stream-csv-to-json.js",
|
|
73
156
|
"json-save.js",
|
|
74
157
|
"index.d.ts",
|
|
75
|
-
|
|
76
|
-
"cli-tui.js"
|
|
158
|
+
"bin/",
|
|
159
|
+
"cli-tui.js",
|
|
160
|
+
"dist/",
|
|
161
|
+
"src/",
|
|
162
|
+
"examples/",
|
|
163
|
+
"plugins/"
|
|
77
164
|
],
|
|
78
165
|
"devDependencies": {
|
|
166
|
+
"@babel/core": "^7.23.0",
|
|
167
|
+
"@babel/preset-env": "^7.22.0",
|
|
168
|
+
"@rollup/plugin-babel": "^6.0.0",
|
|
169
|
+
"@rollup/plugin-commonjs": "^25.0.0",
|
|
170
|
+
"@rollup/plugin-node-resolve": "^15.0.0",
|
|
171
|
+
"@rollup/plugin-terser": "^0.4.0",
|
|
79
172
|
"eslint": "8.57.1",
|
|
80
|
-
"jest": "^29.0.0"
|
|
173
|
+
"jest": "^29.0.0",
|
|
174
|
+
"rollup": "^4.0.0",
|
|
175
|
+
"size-limit": "^8.0.0"
|
|
81
176
|
},
|
|
82
177
|
"optionalDependencies": {
|
|
83
178
|
"blessed": "^0.1.81",
|
|
84
|
-
"blessed-contrib": "^4.11.0"
|
|
179
|
+
"blessed-contrib": "^4.11.0",
|
|
180
|
+
"exceljs": "^4.4.0"
|
|
85
181
|
},
|
|
86
|
-
"type": "commonjs"
|
|
182
|
+
"type": "commonjs",
|
|
183
|
+
"size-limit": [
|
|
184
|
+
{
|
|
185
|
+
"path": "dist/jtcsv.umd.js",
|
|
186
|
+
"limit": "35 KB"
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
"path": "dist/jtcsv.esm.js",
|
|
190
|
+
"limit": "30 KB"
|
|
191
|
+
}
|
|
192
|
+
],
|
|
193
|
+
"browserslist": [
|
|
194
|
+
"defaults",
|
|
195
|
+
"not IE 11",
|
|
196
|
+
"maintained node versions"
|
|
197
|
+
]
|
|
87
198
|
}
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
# JTCSV Плагины и Интеграции
|
|
2
|
+
|
|
3
|
+
Пакеты интеграций JTCSV с популярными фреймворками и платформами.
|
|
4
|
+
|
|
5
|
+
## 📦 Доступные плагины
|
|
6
|
+
|
|
7
|
+
### 1. Express Middleware (@jtcsv/express-middleware)
|
|
8
|
+
|
|
9
|
+
**Express middleware для автоматической конвертации CSV/JSON в HTTP запросах.**
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install @jtcsv/express-middleware express jtcsv
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
```javascript
|
|
16
|
+
const express = require('express');
|
|
17
|
+
const { middleware } = require('@jtcsv/express-middleware');
|
|
18
|
+
|
|
19
|
+
const app = express();
|
|
20
|
+
app.use(express.json());
|
|
21
|
+
app.use(express.text({ type: 'text/csv' }));
|
|
22
|
+
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
|
+
```
|
|
32
|
+
|
|
33
|
+
[📚 Документация](./express-middleware/README.md)
|
|
34
|
+
|
|
35
|
+
### 2. Fastify Plugin (@jtcsv/fastify)
|
|
36
|
+
|
|
37
|
+
**Fastify plugin для автоматической конвертации CSV/JSON.**
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npm install @jtcsv/fastify fastify fastify-plugin jtcsv
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
```javascript
|
|
44
|
+
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' }]);
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
[📚 Документация](./fastify-plugin/README.md)
|
|
55
|
+
|
|
56
|
+
### 3. Next.js Integration (@jtcsv/nextjs)
|
|
57
|
+
|
|
58
|
+
**Next.js интеграция - API routes, React hooks и компоненты.**
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
npm install @jtcsv/nextjs jtcsv
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
```jsx
|
|
65
|
+
// pages/api/convert.js
|
|
66
|
+
import { handler } from '@jtcsv/nextjs/route';
|
|
67
|
+
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
|
+
```
|
|
78
|
+
|
|
79
|
+
[📚 Документация](./nextjs-api/README.md)
|
|
80
|
+
|
|
81
|
+
## 🎯 Особенности
|
|
82
|
+
|
|
83
|
+
### Единый API
|
|
84
|
+
|
|
85
|
+
Все плагины предоставляют согласованный API:
|
|
86
|
+
|
|
87
|
+
```javascript
|
|
88
|
+
// Express
|
|
89
|
+
app.use(jtcsvMiddleware({ delimiter: ',' }));
|
|
90
|
+
|
|
91
|
+
// Fastify
|
|
92
|
+
await fastify.register(jtcsvPlugin, { delimiter: ',' });
|
|
93
|
+
|
|
94
|
+
// Next.js
|
|
95
|
+
const { convertCsvToJson } = useJtcsv({ delimiter: ',' });
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Автоматическое определение формата
|
|
99
|
+
|
|
100
|
+
- Определение по Content-Type заголовку
|
|
101
|
+
- Автоматическое определение по содержимому
|
|
102
|
+
- Поддержка query параметров для ручного указания
|
|
103
|
+
|
|
104
|
+
### Безопасность
|
|
105
|
+
|
|
106
|
+
- Защита от CSV инъекций (по умолчанию включена)
|
|
107
|
+
- Валидация размера запросов
|
|
108
|
+
- RFC 4180 compliance
|
|
109
|
+
|
|
110
|
+
### Производительность
|
|
111
|
+
|
|
112
|
+
- Fast-Path Engine для оптимизации
|
|
113
|
+
- Streaming поддержка для больших файлов
|
|
114
|
+
- Кеширование парсеров
|
|
115
|
+
|
|
116
|
+
## 🔧 Конфигурация
|
|
117
|
+
|
|
118
|
+
### Общие опции
|
|
119
|
+
|
|
120
|
+
| Опция | Тип | По умолчанию | Описание |
|
|
121
|
+
|-------|-----|--------------|----------|
|
|
122
|
+
| `delimiter` | `string` | `','` | Разделитель CSV |
|
|
123
|
+
| `preventCsvInjection` | `boolean` | `true` | Защита от CSV инъекций |
|
|
124
|
+
| `rfc4180Compliant` | `boolean` | `true` | Соответствие RFC 4180 |
|
|
125
|
+
| `useFastPath` | `boolean` | `true` | Использовать Fast-Path Engine |
|
|
126
|
+
|
|
127
|
+
### Специфичные опции
|
|
128
|
+
|
|
129
|
+
#### Express Middleware
|
|
130
|
+
|
|
131
|
+
```javascript
|
|
132
|
+
{
|
|
133
|
+
maxSize: '10mb', // Максимальный размер тела запроса
|
|
134
|
+
autoDetect: true // Автоматическое определение формата
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
#### Fastify Plugin
|
|
139
|
+
|
|
140
|
+
```javascript
|
|
141
|
+
{
|
|
142
|
+
prefix: '/convert' // Префикс для routes
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
#### Next.js Integration
|
|
147
|
+
|
|
148
|
+
```javascript
|
|
149
|
+
{
|
|
150
|
+
parseNumbers: true, // Парсить числа
|
|
151
|
+
parseBooleans: true // Парсить булевы значения
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## 🌐 Примеры использования
|
|
156
|
+
|
|
157
|
+
### REST API
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
# JSON → CSV
|
|
161
|
+
curl -X POST https://api.example.com/convert \
|
|
162
|
+
-H "Content-Type: application/json" \
|
|
163
|
+
-d '[{"name":"John","age":30}]'
|
|
164
|
+
|
|
165
|
+
# CSV → JSON
|
|
166
|
+
curl -X POST https://api.example.com/convert \
|
|
167
|
+
-H "Content-Type: text/csv" \
|
|
168
|
+
-d 'name,age\nJohn,30\nJane,25'
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Web Application
|
|
172
|
+
|
|
173
|
+
```jsx
|
|
174
|
+
// React/Next.js компонент
|
|
175
|
+
function DataExporter({ data }) {
|
|
176
|
+
const { convertJsonToCsv } = useJtcsv();
|
|
177
|
+
|
|
178
|
+
const handleExport = async () => {
|
|
179
|
+
const csv = await convertJsonToCsv(data);
|
|
180
|
+
downloadCsv(csv, 'export.csv');
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
return (
|
|
184
|
+
<button onClick={handleExport}>
|
|
185
|
+
Export as CSV
|
|
186
|
+
</button>
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Backend Service
|
|
192
|
+
|
|
193
|
+
```javascript
|
|
194
|
+
// Express приложение для обработки загрузок
|
|
195
|
+
app.post('/api/upload', upload.single('file'), async (req, res) => {
|
|
196
|
+
const csv = req.file.buffer.toString();
|
|
197
|
+
const json = await csvToJson(csv);
|
|
198
|
+
|
|
199
|
+
// Сохранение в базу данных
|
|
200
|
+
await db.insert('data', json);
|
|
201
|
+
|
|
202
|
+
res.json({ success: true, rows: json.length });
|
|
203
|
+
});
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## 📊 Мониторинг и Health Check
|
|
207
|
+
|
|
208
|
+
Все плагины предоставляют health check endpoints:
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
# Express
|
|
212
|
+
GET /api/health
|
|
213
|
+
|
|
214
|
+
# Fastify
|
|
215
|
+
GET /convert/health
|
|
216
|
+
|
|
217
|
+
# Next.js
|
|
218
|
+
GET /api/convert/health
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**Пример ответа:**
|
|
222
|
+
```json
|
|
223
|
+
{
|
|
224
|
+
"service": "jtcsv-integration",
|
|
225
|
+
"status": "healthy",
|
|
226
|
+
"version": "1.0.0",
|
|
227
|
+
"features": {
|
|
228
|
+
"csvToJson": true,
|
|
229
|
+
"jsonToCsv": true,
|
|
230
|
+
"fastPathEngine": true,
|
|
231
|
+
"csvInjectionProtection": true
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## 🔌 Расширяемость
|
|
237
|
+
|
|
238
|
+
### Кастомные middleware
|
|
239
|
+
|
|
240
|
+
```javascript
|
|
241
|
+
// Express
|
|
242
|
+
app.use((req, res, next) => {
|
|
243
|
+
// Логирование
|
|
244
|
+
console.log(`[${new Date()}] ${req.method} ${req.url}`);
|
|
245
|
+
|
|
246
|
+
// Rate limiting
|
|
247
|
+
// ...
|
|
248
|
+
|
|
249
|
+
next();
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
app.use(jtcsvMiddleware());
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### Плагины JTCSV
|
|
256
|
+
|
|
257
|
+
Все интеграции совместимы с plugin system JTCSV:
|
|
258
|
+
|
|
259
|
+
```javascript
|
|
260
|
+
const jtcsv = require('jtcsv;
|
|
261
|
+
|
|
262
|
+
jtcsv.use('my-plugin', {
|
|
263
|
+
hooks: {
|
|
264
|
+
'before:csvToJson': (csv) => {
|
|
265
|
+
// Кастомная обработка
|
|
266
|
+
return csv;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
## 🚀 Производительность
|
|
273
|
+
|
|
274
|
+
### Бенчмарки
|
|
275
|
+
|
|
276
|
+
| Операция | Без плагина | С плагином | Ускорение |
|
|
277
|
+
|----------|-------------|------------|-----------|
|
|
278
|
+
| CSV → JSON (10k rows) | 120ms | 45ms | 2.7x |
|
|
279
|
+
| JSON → CSV (10k rows) | 85ms | 32ms | 2.7x |
|
|
280
|
+
| File Upload (1MB) | 210ms | 95ms | 2.2x |
|
|
281
|
+
|
|
282
|
+
### Оптимизации
|
|
283
|
+
|
|
284
|
+
1. **Fast-Path Engine** - автоматический выбор оптимального парсера
|
|
285
|
+
2. **Streaming** - обработка больших файлов без загрузки в память
|
|
286
|
+
3. **Кеширование** - кеширование скомпилированных парсеров
|
|
287
|
+
4. **Пакетная обработка** - оптимизация для bulk операций
|
|
288
|
+
|
|
289
|
+
## 🔐 Безопасность
|
|
290
|
+
|
|
291
|
+
### Защитные механизмы
|
|
292
|
+
|
|
293
|
+
1. **CSV Injection Protection** - экранирование опасных символов
|
|
294
|
+
2. **Size Limits** - ограничение размера запросов
|
|
295
|
+
3. **Input Validation** - валидация входных данных
|
|
296
|
+
4. **Error Handling** - безопасная обработка ошибок
|
|
297
|
+
|
|
298
|
+
### Рекомендации
|
|
299
|
+
|
|
300
|
+
```javascript
|
|
301
|
+
// Production конфигурация
|
|
302
|
+
app.use(jtcsvMiddleware({
|
|
303
|
+
maxSize: '10mb',
|
|
304
|
+
preventCsvInjection: true,
|
|
305
|
+
rfc4180Compliant: true
|
|
306
|
+
}));
|
|
307
|
+
|
|
308
|
+
// Rate limiting
|
|
309
|
+
app.use(rateLimit({
|
|
310
|
+
windowMs: 15 * 60 * 1000,
|
|
311
|
+
max: 100
|
|
312
|
+
}));
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
## 📚 Документация
|
|
316
|
+
|
|
317
|
+
- [Express Middleware](./express-middleware/README.md)
|
|
318
|
+
- [Fastify Plugin](./fastify-plugin/README.md)
|
|
319
|
+
- [Next.js Integration](./nextjs-api/README.md)
|
|
320
|
+
- [Основная документация JTCSV](../README.md)
|
|
321
|
+
|
|
322
|
+
## 🧪 Тестирование
|
|
323
|
+
|
|
324
|
+
```bash
|
|
325
|
+
# Тестирование всех плагинов
|
|
326
|
+
cd plugins
|
|
327
|
+
npm test
|
|
328
|
+
|
|
329
|
+
# Тестирование конкретного плагина
|
|
330
|
+
cd express-middleware
|
|
331
|
+
npm test
|
|
332
|
+
|
|
333
|
+
# Запуск примеров
|
|
334
|
+
cd nextjs-api/examples
|
|
335
|
+
node api-convert.js
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
## 🤝 Вклад в развитие
|
|
339
|
+
|
|
340
|
+
Мы приветствуем вклады в развитие плагинов!
|
|
341
|
+
|
|
342
|
+
### Как помочь
|
|
343
|
+
|
|
344
|
+
1. **Сообщить о баге** - создайте issue с подробным описанием
|
|
345
|
+
2. **Предложить улучшение** - обсудите в Discussions
|
|
346
|
+
3. **Создать pull request** - реализуйте новую функцию
|
|
347
|
+
4. **Улучшить документацию** - помогите другим разработчикам
|
|
348
|
+
|
|
349
|
+
### Руководство по разработке
|
|
350
|
+
|
|
351
|
+
1. Клонируйте репозиторий
|
|
352
|
+
2. Установите зависимости: `npm install`
|
|
353
|
+
3. Создайте ветку: `git checkout -b feature/amazing`
|
|
354
|
+
4. Внесите изменения и протестируйте
|
|
355
|
+
5. Запушьте изменения: `git push origin feature/amazing`
|
|
356
|
+
6. Откройте Pull Request
|
|
357
|
+
|
|
358
|
+
## 📞 Поддержка
|
|
359
|
+
|
|
360
|
+
- **Issues**: [GitHub Issues](https://github.com/Linol-Hamelton/jtcsv/issues)
|
|
361
|
+
- **Discussions**: [GitHub Discussions](https://github.com/Linol-Hamelton/jtcsv/discussions)
|
|
362
|
+
- **Documentation**: [Основная документация](../README.md)
|
|
363
|
+
- **Email**: [Указать email если есть]
|
|
364
|
+
|
|
365
|
+
## 📄 Лицензия
|
|
366
|
+
|
|
367
|
+
Все плагины распространяются под лицензией MIT. См. файл [LICENSE](../LICENSE) для подробностей.
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
**JTCSV Плагины** - делаем работу с CSV/JSON проще в любом фреймворке! 🚀
|
|
372
|
+
|
|
373
|
+
|