jtcsv 2.2.8 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +204 -115
- package/bin/jtcsv.ts +2612 -0
- package/browser.d.ts +142 -0
- package/dist/benchmark.js +446 -0
- package/dist/benchmark.js.map +1 -0
- package/dist/bin/jtcsv.js +1940 -0
- package/dist/bin/jtcsv.js.map +1 -0
- package/dist/csv-to-json.js +1262 -0
- package/dist/csv-to-json.js.map +1 -0
- package/dist/errors.js +291 -0
- package/dist/errors.js.map +1 -0
- package/dist/eslint.config.js +147 -0
- package/dist/eslint.config.js.map +1 -0
- package/dist/index-core.js +95 -0
- package/dist/index-core.js.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/json-save.js +229 -0
- package/dist/json-save.js.map +1 -0
- package/dist/json-to-csv.js +576 -0
- package/dist/json-to-csv.js.map +1 -0
- package/dist/jtcsv-core.cjs.js +1736 -0
- package/dist/jtcsv-core.cjs.js.map +1 -0
- package/dist/jtcsv-core.esm.js +1708 -0
- package/dist/jtcsv-core.esm.js.map +1 -0
- package/dist/jtcsv-core.umd.js +1742 -0
- package/dist/jtcsv-core.umd.js.map +1 -0
- package/dist/jtcsv-full.cjs.js +2241 -0
- package/dist/jtcsv-full.cjs.js.map +1 -0
- package/dist/jtcsv-full.esm.js +2209 -0
- package/dist/jtcsv-full.esm.js.map +1 -0
- package/dist/jtcsv-full.umd.js +2247 -0
- package/dist/jtcsv-full.umd.js.map +1 -0
- package/dist/jtcsv-workers.esm.js +768 -0
- package/dist/jtcsv-workers.esm.js.map +1 -0
- package/dist/jtcsv-workers.umd.js +782 -0
- package/dist/jtcsv-workers.umd.js.map +1 -0
- package/dist/jtcsv.cjs.js +1996 -2048
- package/dist/jtcsv.cjs.js.map +1 -1
- package/dist/jtcsv.esm.js +1992 -2048
- package/dist/jtcsv.esm.js.map +1 -1
- package/dist/jtcsv.umd.js +2157 -2209
- package/dist/jtcsv.umd.js.map +1 -1
- package/dist/plugins/express-middleware/index.js +350 -0
- package/dist/plugins/express-middleware/index.js.map +1 -0
- package/dist/plugins/fastify-plugin/index.js +315 -0
- package/dist/plugins/fastify-plugin/index.js.map +1 -0
- package/dist/plugins/hono/index.js +111 -0
- package/dist/plugins/hono/index.js.map +1 -0
- package/dist/plugins/nestjs/index.js +112 -0
- package/dist/plugins/nestjs/index.js.map +1 -0
- package/dist/plugins/nuxt/index.js +53 -0
- package/dist/plugins/nuxt/index.js.map +1 -0
- package/dist/plugins/remix/index.js +133 -0
- package/dist/plugins/remix/index.js.map +1 -0
- package/dist/plugins/sveltekit/index.js +155 -0
- package/dist/plugins/sveltekit/index.js.map +1 -0
- package/dist/plugins/trpc/index.js +136 -0
- package/dist/plugins/trpc/index.js.map +1 -0
- package/dist/run-demo.js +49 -0
- package/dist/run-demo.js.map +1 -0
- package/dist/src/browser/browser-functions.js +193 -0
- package/dist/src/browser/browser-functions.js.map +1 -0
- package/dist/src/browser/core.js +123 -0
- package/dist/src/browser/core.js.map +1 -0
- package/dist/src/browser/csv-to-json-browser.js +353 -0
- package/dist/src/browser/csv-to-json-browser.js.map +1 -0
- package/dist/src/browser/errors-browser.js +219 -0
- package/dist/src/browser/errors-browser.js.map +1 -0
- package/dist/src/browser/extensions/plugins.js +106 -0
- package/dist/src/browser/extensions/plugins.js.map +1 -0
- package/dist/src/browser/extensions/workers.js +66 -0
- package/dist/src/browser/extensions/workers.js.map +1 -0
- package/dist/src/browser/index.js +140 -0
- package/dist/src/browser/index.js.map +1 -0
- package/dist/src/browser/json-to-csv-browser.js +225 -0
- package/dist/src/browser/json-to-csv-browser.js.map +1 -0
- package/dist/src/browser/streams.js +340 -0
- package/dist/src/browser/streams.js.map +1 -0
- package/dist/src/browser/workers/csv-parser.worker.js +264 -0
- package/dist/src/browser/workers/csv-parser.worker.js.map +1 -0
- package/dist/src/browser/workers/worker-pool.js +338 -0
- package/dist/src/browser/workers/worker-pool.js.map +1 -0
- package/dist/src/core/delimiter-cache.js +196 -0
- package/dist/src/core/delimiter-cache.js.map +1 -0
- package/dist/src/core/node-optimizations.js +279 -0
- package/dist/src/core/node-optimizations.js.map +1 -0
- package/dist/src/core/plugin-system.js +399 -0
- package/dist/src/core/plugin-system.js.map +1 -0
- package/dist/src/core/transform-hooks.js +348 -0
- package/dist/src/core/transform-hooks.js.map +1 -0
- package/dist/src/engines/fast-path-engine-new.js +262 -0
- package/dist/src/engines/fast-path-engine-new.js.map +1 -0
- package/dist/src/engines/fast-path-engine.js +671 -0
- package/dist/src/engines/fast-path-engine.js.map +1 -0
- package/dist/src/errors.js +18 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/formats/ndjson-parser.js +332 -0
- package/dist/src/formats/ndjson-parser.js.map +1 -0
- package/dist/src/formats/tsv-parser.js +230 -0
- package/dist/src/formats/tsv-parser.js.map +1 -0
- package/dist/src/index-with-plugins.js +259 -0
- package/dist/src/index-with-plugins.js.map +1 -0
- package/dist/src/types/index.js +3 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/utils/bom-utils.js +267 -0
- package/dist/src/utils/bom-utils.js.map +1 -0
- package/dist/src/utils/encoding-support.js +77 -0
- package/dist/src/utils/encoding-support.js.map +1 -0
- package/dist/src/utils/schema-validator.js +609 -0
- package/dist/src/utils/schema-validator.js.map +1 -0
- package/dist/src/utils/transform-loader.js +281 -0
- package/dist/src/utils/transform-loader.js.map +1 -0
- package/dist/src/utils/validators.js +40 -0
- package/dist/src/utils/validators.js.map +1 -0
- package/dist/src/utils/zod-adapter.js +144 -0
- package/dist/src/utils/zod-adapter.js.map +1 -0
- package/dist/src/web-server/index.js +648 -0
- package/dist/src/web-server/index.js.map +1 -0
- package/dist/src/workers/csv-multithreaded.js +211 -0
- package/dist/src/workers/csv-multithreaded.js.map +1 -0
- package/dist/src/workers/csv-parser.worker.js +179 -0
- package/dist/src/workers/csv-parser.worker.js.map +1 -0
- package/dist/src/workers/worker-pool.js +228 -0
- package/dist/src/workers/worker-pool.js.map +1 -0
- package/dist/stream-csv-to-json.js +665 -0
- package/dist/stream-csv-to-json.js.map +1 -0
- package/dist/stream-json-to-csv.js +389 -0
- package/dist/stream-json-to-csv.js.map +1 -0
- package/examples/advanced/conditional-transformations.ts +446 -0
- package/examples/advanced/csv-parser.worker.ts +89 -0
- package/examples/advanced/nested-objects-example.ts +306 -0
- package/examples/advanced/performance-optimization.ts +504 -0
- package/examples/advanced/run-demo-server.ts +116 -0
- package/examples/advanced/web-worker-usage.html +874 -0
- package/examples/async-multithreaded-example.ts +335 -0
- package/examples/cli-advanced-usage.md +290 -0
- package/examples/{cli-batch-processing.js → cli-batch-processing.ts} +38 -38
- package/examples/{cli-tool.js → cli-tool.ts} +5 -8
- package/examples/{error-handling.js → error-handling.ts} +356 -324
- package/examples/{express-api.js → express-api.ts} +161 -164
- package/examples/{large-dataset-example.js → large-dataset-example.ts} +201 -182
- package/examples/{ndjson-processing.js → ndjson-processing.ts} +456 -434
- package/examples/{plugin-excel-exporter.js → plugin-excel-exporter.ts} +6 -7
- package/examples/react-integration.tsx +637 -0
- package/examples/{schema-validation.js → schema-validation.ts} +2 -2
- package/examples/simple-usage.ts +194 -0
- package/examples/{streaming-example.js → streaming-example.ts} +12 -12
- package/index.d.ts +187 -18
- package/package.json +75 -81
- package/plugins.d.ts +37 -0
- package/schema.d.ts +103 -0
- package/src/browser/browser-functions.ts +402 -0
- package/src/browser/core.ts +152 -0
- package/src/browser/csv-to-json-browser.d.ts +3 -0
- package/src/browser/csv-to-json-browser.ts +494 -0
- package/src/browser/{errors-browser.js → errors-browser.ts} +305 -197
- package/src/browser/extensions/plugins.ts +93 -0
- package/src/browser/extensions/workers.ts +39 -0
- package/src/browser/globals.d.ts +5 -0
- package/src/browser/index.ts +192 -0
- package/src/browser/json-to-csv-browser.d.ts +3 -0
- package/src/browser/json-to-csv-browser.ts +338 -0
- package/src/browser/streams.ts +403 -0
- package/src/browser/workers/{csv-parser.worker.js → csv-parser.worker.ts} +3 -3
- package/src/browser/workers/{worker-pool.js → worker-pool.ts} +51 -30
- package/src/core/delimiter-cache.ts +320 -0
- package/src/core/{node-optimizations.js → node-optimizations.ts} +448 -407
- package/src/core/plugin-system.ts +588 -0
- package/src/core/transform-hooks.ts +566 -0
- package/src/engines/{fast-path-engine-new.js → fast-path-engine-new.ts} +11 -2
- package/src/engines/{fast-path-engine.js → fast-path-engine.ts} +79 -53
- package/src/errors.ts +1 -0
- package/src/formats/{ndjson-parser.js → ndjson-parser.ts} +24 -16
- package/src/formats/{tsv-parser.js → tsv-parser.ts} +18 -17
- package/src/{index-with-plugins.js → index-with-plugins.ts} +381 -357
- package/src/types/index.ts +275 -0
- package/src/utils/bom-utils.ts +373 -0
- package/src/utils/encoding-support.ts +155 -0
- package/src/utils/{schema-validator.js → schema-validator.ts} +814 -589
- package/src/utils/transform-loader.ts +389 -0
- package/src/utils/validators.ts +35 -0
- package/src/utils/zod-adapter.ts +280 -0
- package/src/web-server/{index.js → index.ts} +19 -19
- package/src/workers/csv-multithreaded.ts +310 -0
- package/src/workers/csv-parser.worker.ts +227 -0
- package/src/workers/worker-pool.ts +409 -0
- package/bin/jtcsv.js +0 -2462
- package/csv-to-json.js +0 -688
- package/errors.js +0 -208
- package/examples/simple-usage.js +0 -282
- package/index.js +0 -68
- package/json-save.js +0 -254
- package/json-to-csv.js +0 -526
- package/plugins/README.md +0 -91
- package/plugins/express-middleware/README.md +0 -64
- package/plugins/express-middleware/example.js +0 -136
- package/plugins/express-middleware/index.d.ts +0 -114
- package/plugins/express-middleware/index.js +0 -360
- package/plugins/express-middleware/package.json +0 -52
- package/plugins/fastify-plugin/index.js +0 -406
- package/plugins/fastify-plugin/package.json +0 -55
- package/plugins/hono/README.md +0 -28
- package/plugins/hono/index.d.ts +0 -12
- package/plugins/hono/index.js +0 -36
- package/plugins/hono/package.json +0 -35
- package/plugins/nestjs/README.md +0 -35
- package/plugins/nestjs/index.d.ts +0 -25
- package/plugins/nestjs/index.js +0 -77
- package/plugins/nestjs/package.json +0 -37
- package/plugins/nextjs-api/README.md +0 -57
- package/plugins/nextjs-api/examples/ConverterComponent.jsx +0 -386
- package/plugins/nextjs-api/examples/api-convert.js +0 -69
- package/plugins/nextjs-api/index.js +0 -387
- package/plugins/nextjs-api/package.json +0 -63
- package/plugins/nextjs-api/route.js +0 -371
- package/plugins/nuxt/README.md +0 -24
- package/plugins/nuxt/index.js +0 -21
- package/plugins/nuxt/package.json +0 -35
- package/plugins/nuxt/runtime/composables/useJtcsv.js +0 -6
- package/plugins/nuxt/runtime/plugin.js +0 -6
- package/plugins/remix/README.md +0 -26
- package/plugins/remix/index.d.ts +0 -16
- package/plugins/remix/index.js +0 -62
- package/plugins/remix/package.json +0 -35
- package/plugins/sveltekit/README.md +0 -28
- package/plugins/sveltekit/index.d.ts +0 -17
- package/plugins/sveltekit/index.js +0 -54
- package/plugins/sveltekit/package.json +0 -33
- package/plugins/trpc/README.md +0 -25
- package/plugins/trpc/index.d.ts +0 -7
- package/plugins/trpc/index.js +0 -32
- package/plugins/trpc/package.json +0 -34
- package/src/browser/browser-functions.js +0 -219
- package/src/browser/csv-to-json-browser.js +0 -700
- package/src/browser/index.js +0 -113
- package/src/browser/json-to-csv-browser.js +0 -309
- package/src/browser/streams.js +0 -393
- package/src/core/delimiter-cache.js +0 -186
- package/src/core/plugin-system.js +0 -476
- package/src/core/transform-hooks.js +0 -350
- package/src/errors.js +0 -26
- package/src/utils/transform-loader.js +0 -205
- package/stream-csv-to-json.js +0 -542
- package/stream-json-to-csv.js +0 -464
- /package/examples/{web-workers-advanced.js → web-workers-advanced.ts} +0 -0
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
const jtcsv = require('jtcsv');
|
|
2
|
-
|
|
3
|
-
function normalizeFilename(filename) {
|
|
4
|
-
if (!filename || typeof filename !== 'string') {
|
|
5
|
-
return 'export.csv';
|
|
6
|
-
}
|
|
7
|
-
return filename.includes('.') ? filename : `${filename}.csv`;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
async function parseCsv(request, options = {}) {
|
|
11
|
-
if (!request || typeof request.text !== 'function') {
|
|
12
|
-
throw new Error('parseCsv expects a Request instance');
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
const { fieldName = 'file', ...csvOptions } = options;
|
|
16
|
-
const contentType = request.headers?.get?.('content-type') || '';
|
|
17
|
-
let csvText = null;
|
|
18
|
-
|
|
19
|
-
if (options.formData || contentType.includes('multipart/form-data')) {
|
|
20
|
-
const formData = await request.formData();
|
|
21
|
-
const value = formData.get(fieldName) ?? formData.values().next().value;
|
|
22
|
-
if (value && typeof value.text === 'function') {
|
|
23
|
-
csvText = await value.text();
|
|
24
|
-
} else if (value != null) {
|
|
25
|
-
csvText = String(value);
|
|
26
|
-
}
|
|
27
|
-
} else {
|
|
28
|
-
csvText = await request.text();
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
if (!csvText) {
|
|
32
|
-
throw new Error('No CSV payload found in request');
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return jtcsv.csvToJson(csvText, csvOptions);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function generateCsv(data, filename = 'export.csv', options = {}) {
|
|
39
|
-
const safeName = normalizeFilename(filename);
|
|
40
|
-
const rows = Array.isArray(data) ? data : [data];
|
|
41
|
-
const csv = jtcsv.jsonToCsv(rows, options);
|
|
42
|
-
|
|
43
|
-
return new Response(csv, {
|
|
44
|
-
headers: {
|
|
45
|
-
'Content-Type': 'text/csv; charset=utf-8',
|
|
46
|
-
'Content-Disposition': `attachment; filename="${safeName}"`
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
module.exports = {
|
|
52
|
-
parseCsv,
|
|
53
|
-
generateCsv
|
|
54
|
-
};
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@jtcsv/sveltekit",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"description": "SvelteKit helpers for JTCSV",
|
|
5
|
-
"main": "index.js",
|
|
6
|
-
"types": "index.d.ts",
|
|
7
|
-
"keywords": [
|
|
8
|
-
"sveltekit",
|
|
9
|
-
"csv",
|
|
10
|
-
"json",
|
|
11
|
-
"converter",
|
|
12
|
-
"jtcsv"
|
|
13
|
-
],
|
|
14
|
-
"author": "Ruslan Fomenko",
|
|
15
|
-
"license": "MIT",
|
|
16
|
-
"repository": {
|
|
17
|
-
"type": "git",
|
|
18
|
-
"url": "git+https://github.com/Linol-Hamelton/jtcsv.git",
|
|
19
|
-
"directory": "plugins/sveltekit"
|
|
20
|
-
},
|
|
21
|
-
"bugs": {
|
|
22
|
-
"url": "https://github.com/Linol-Hamelton/jtcsv/issues"
|
|
23
|
-
},
|
|
24
|
-
"homepage": "https://github.com/Linol-Hamelton/jtcsv/tree/main/plugins/sveltekit#readme",
|
|
25
|
-
"peerDependencies": {
|
|
26
|
-
"jtcsv": "^2.1.3"
|
|
27
|
-
},
|
|
28
|
-
"files": [
|
|
29
|
-
"index.js",
|
|
30
|
-
"index.d.ts",
|
|
31
|
-
"README.md"
|
|
32
|
-
]
|
|
33
|
-
}
|
package/plugins/trpc/README.md
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
# @jtcsv/trpc
|
|
2
|
-
|
|
3
|
-
Middleware helper that parses CSV input for tRPC procedures.
|
|
4
|
-
|
|
5
|
-
## Install
|
|
6
|
-
```bash
|
|
7
|
-
npm install @jtcsv/trpc jtcsv
|
|
8
|
-
```
|
|
9
|
-
|
|
10
|
-
## Usage
|
|
11
|
-
```javascript
|
|
12
|
-
import { initTRPC } from '@trpc/server';
|
|
13
|
-
import { z } from 'zod';
|
|
14
|
-
import { createCsvProcedure } from '@jtcsv/trpc';
|
|
15
|
-
|
|
16
|
-
const t = initTRPC.create();
|
|
17
|
-
|
|
18
|
-
export const router = t.router({
|
|
19
|
-
parseCsv: createCsvProcedure(t, z.string())
|
|
20
|
-
.mutation(async ({ input }) => ({ rows: input }))
|
|
21
|
-
});
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
## Exports
|
|
25
|
-
- createCsvProcedure
|
package/plugins/trpc/index.d.ts
DELETED
package/plugins/trpc/index.js
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
const jtcsv = require('jtcsv');
|
|
2
|
-
|
|
3
|
-
function extractCsvText(input) {
|
|
4
|
-
if (typeof input === 'string') {
|
|
5
|
-
return input;
|
|
6
|
-
}
|
|
7
|
-
if (input && typeof input === 'object' && typeof input.csv === 'string') {
|
|
8
|
-
return input.csv;
|
|
9
|
-
}
|
|
10
|
-
return null;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
function createCsvProcedure(t, schema, options = {}) {
|
|
14
|
-
if (!t || !t.procedure) {
|
|
15
|
-
throw new Error('createCsvProcedure expects initTRPC instance');
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
return t.procedure
|
|
19
|
-
.input(schema)
|
|
20
|
-
.use(async ({ input, next }) => {
|
|
21
|
-
const csvText = extractCsvText(input);
|
|
22
|
-
if (!csvText) {
|
|
23
|
-
throw new Error('CSV input must be a string or { csv: string }');
|
|
24
|
-
}
|
|
25
|
-
const parsed = jtcsv.csvToJson(csvText, options);
|
|
26
|
-
return next({ input: parsed });
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
module.exports = {
|
|
31
|
-
createCsvProcedure
|
|
32
|
-
};
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@jtcsv/trpc",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"description": "tRPC helper for JTCSV CSV parsing",
|
|
5
|
-
"main": "index.js",
|
|
6
|
-
"types": "index.d.ts",
|
|
7
|
-
"keywords": [
|
|
8
|
-
"trpc",
|
|
9
|
-
"csv",
|
|
10
|
-
"json",
|
|
11
|
-
"converter",
|
|
12
|
-
"jtcsv"
|
|
13
|
-
],
|
|
14
|
-
"author": "Ruslan Fomenko",
|
|
15
|
-
"license": "MIT",
|
|
16
|
-
"repository": {
|
|
17
|
-
"type": "git",
|
|
18
|
-
"url": "git+https://github.com/Linol-Hamelton/jtcsv.git",
|
|
19
|
-
"directory": "plugins/trpc"
|
|
20
|
-
},
|
|
21
|
-
"bugs": {
|
|
22
|
-
"url": "https://github.com/Linol-Hamelton/jtcsv/issues"
|
|
23
|
-
},
|
|
24
|
-
"homepage": "https://github.com/Linol-Hamelton/jtcsv/tree/main/plugins/trpc#readme",
|
|
25
|
-
"peerDependencies": {
|
|
26
|
-
"@trpc/server": "^10.0.0",
|
|
27
|
-
"jtcsv": "^2.1.3"
|
|
28
|
-
},
|
|
29
|
-
"files": [
|
|
30
|
-
"index.js",
|
|
31
|
-
"index.d.ts",
|
|
32
|
-
"README.md"
|
|
33
|
-
]
|
|
34
|
-
}
|
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
// Браузерные специфичные функции для jtcsv
|
|
2
|
-
// Функции, которые работают только в браузере
|
|
3
|
-
|
|
4
|
-
import { jsonToCsv } from './json-to-csv-browser.js';
|
|
5
|
-
import { csvToJson, csvToJsonIterator } from './csv-to-json-browser.js';
|
|
6
|
-
import { csvToJsonStream, jsonToCsvStream, jsonToNdjsonStream } from './streams.js';
|
|
7
|
-
import { ValidationError } from './errors-browser.js';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Скачивает JSON данные как CSV файл
|
|
11
|
-
*
|
|
12
|
-
* @param {Array<Object>} data - Массив объектов для конвертации
|
|
13
|
-
* @param {string} [filename='data.csv'] - Имя файла для скачивания
|
|
14
|
-
* @param {Object} [options] - Опции для jsonToCsv
|
|
15
|
-
* @returns {void}
|
|
16
|
-
*
|
|
17
|
-
* @example
|
|
18
|
-
* const data = [
|
|
19
|
-
* { id: 1, name: 'John' },
|
|
20
|
-
* { id: 2, name: 'Jane' }
|
|
21
|
-
* ];
|
|
22
|
-
* downloadAsCsv(data, 'users.csv', { delimiter: ',' });
|
|
23
|
-
*/
|
|
24
|
-
export function downloadAsCsv(data, filename = 'data.csv', options = {}) {
|
|
25
|
-
// Проверка что мы в браузере
|
|
26
|
-
if (typeof window === 'undefined') {
|
|
27
|
-
throw new ValidationError('downloadAsCsv() работает только в браузере. Используйте saveAsCsv() в Node.js');
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Валидация имени файла
|
|
31
|
-
if (typeof filename !== 'string' || filename.trim() === '') {
|
|
32
|
-
throw new ValidationError('Filename must be a non-empty string');
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// Добавление расширения .csv если его нет
|
|
36
|
-
if (!filename.toLowerCase().endsWith('.csv')) {
|
|
37
|
-
filename += '.csv';
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// Конвертация в CSV
|
|
41
|
-
const csv = jsonToCsv(data, options);
|
|
42
|
-
|
|
43
|
-
// Создание Blob
|
|
44
|
-
const blob = new Blob([csv], {
|
|
45
|
-
type: 'text/csv;charset=utf-8;'
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
// Создание ссылки для скачивания
|
|
49
|
-
const link = document.createElement('a');
|
|
50
|
-
|
|
51
|
-
// Создание URL для Blob
|
|
52
|
-
const url = URL.createObjectURL(blob);
|
|
53
|
-
|
|
54
|
-
// Настройка ссылки
|
|
55
|
-
link.setAttribute('href', url);
|
|
56
|
-
link.setAttribute('download', filename);
|
|
57
|
-
link.style.visibility = 'hidden';
|
|
58
|
-
|
|
59
|
-
// Добавление в DOM и клик
|
|
60
|
-
document.body.appendChild(link);
|
|
61
|
-
link.click();
|
|
62
|
-
|
|
63
|
-
// Очистка
|
|
64
|
-
setTimeout(() => {
|
|
65
|
-
document.body.removeChild(link);
|
|
66
|
-
URL.revokeObjectURL(url);
|
|
67
|
-
}, 100);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Парсит CSV файл из input[type="file"] в JSON
|
|
72
|
-
*
|
|
73
|
-
* @param {File} file - File объект из input
|
|
74
|
-
* @param {Object} [options] - Опции для csvToJson
|
|
75
|
-
* @returns {Promise<Array<Object>>} Promise с JSON данными
|
|
76
|
-
*
|
|
77
|
-
* @example
|
|
78
|
-
* // HTML: <input type="file" id="csvFile" accept=".csv">
|
|
79
|
-
* const fileInput = document.getElementById('csvFile');
|
|
80
|
-
* const json = await parseCsvFile(fileInput.files[0], { delimiter: ',' });
|
|
81
|
-
*/
|
|
82
|
-
export async function parseCsvFile(file, options = {}) {
|
|
83
|
-
// Проверка что мы в браузере
|
|
84
|
-
if (typeof window === 'undefined') {
|
|
85
|
-
throw new ValidationError('parseCsvFile() работает только в браузере. Используйте readCsvAsJson() в Node.js');
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// Валидация файла
|
|
89
|
-
if (!(file instanceof File)) {
|
|
90
|
-
throw new ValidationError('Input must be a File object');
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Проверка расширения файла
|
|
94
|
-
if (!file.name.toLowerCase().endsWith('.csv')) {
|
|
95
|
-
throw new ValidationError('File must have .csv extension');
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// Проверка размера файла (предупреждение для больших файлов)
|
|
99
|
-
const MAX_SIZE_WARNING = 50 * 1024 * 1024; // 50MB
|
|
100
|
-
if (file.size > MAX_SIZE_WARNING && process.env.NODE_ENV !== 'production') {
|
|
101
|
-
console.warn(
|
|
102
|
-
`⚠️ Warning: Processing large file (${(file.size / 1024 / 1024).toFixed(2)}MB).\n` +
|
|
103
|
-
'💡 Consider using Web Workers for better performance.\n' +
|
|
104
|
-
'🔧 Tip: Use parseCSVWithWorker() for files > 10MB.'
|
|
105
|
-
);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
return new Promise((resolve, reject) => {
|
|
109
|
-
const reader = new FileReader();
|
|
110
|
-
|
|
111
|
-
reader.onload = function (event) {
|
|
112
|
-
try {
|
|
113
|
-
const csvText = event.target.result;
|
|
114
|
-
const json = csvToJson(csvText, options);
|
|
115
|
-
resolve(json);
|
|
116
|
-
} catch (error) {
|
|
117
|
-
reject(error);
|
|
118
|
-
}
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
reader.onerror = function () {
|
|
122
|
-
reject(new ValidationError('Ошибка чтения файла'));
|
|
123
|
-
};
|
|
124
|
-
|
|
125
|
-
reader.onabort = function () {
|
|
126
|
-
reject(new ValidationError('Чтение файла прервано'));
|
|
127
|
-
};
|
|
128
|
-
|
|
129
|
-
// Чтение как текст
|
|
130
|
-
reader.readAsText(file, 'UTF-8');
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Stream CSV file as async iterator without full buffering.
|
|
136
|
-
*
|
|
137
|
-
* @param {File} file - File selected from input
|
|
138
|
-
* @param {Object} [options] - csvToJson options
|
|
139
|
-
* @returns {AsyncGenerator<Object>} Async iterator of rows
|
|
140
|
-
*/
|
|
141
|
-
export function parseCsvFileStream(file, options = {}) {
|
|
142
|
-
if (typeof window === 'undefined') {
|
|
143
|
-
throw new ValidationError('parseCsvFileStream() is browser-only. Use readCsvAsJson() in Node.js');
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
if (!(file instanceof File)) {
|
|
147
|
-
throw new ValidationError('Input must be a File object');
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
if (!file.name.toLowerCase().endsWith('.csv')) {
|
|
151
|
-
throw new ValidationError('File must have .csv extension');
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
return csvToJsonIterator(file, options);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Создает CSV файл из JSON данных (альтернатива downloadAsCsv)
|
|
159
|
-
* Возвращает Blob вместо автоматического скачивания
|
|
160
|
-
*
|
|
161
|
-
* @param {Array<Object>} data - Массив объектов
|
|
162
|
-
* @param {Object} [options] - Опции для jsonToCsv
|
|
163
|
-
* @returns {Blob} CSV Blob
|
|
164
|
-
*/
|
|
165
|
-
export function createCsvBlob(data, options = {}) {
|
|
166
|
-
const csv = jsonToCsv(data, options);
|
|
167
|
-
return new Blob([csv], {
|
|
168
|
-
type: 'text/csv;charset=utf-8;'
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* Парсит CSV строку из Blob
|
|
174
|
-
*
|
|
175
|
-
* @param {Blob} blob - CSV Blob
|
|
176
|
-
* @param {Object} [options] - Опции для csvToJson
|
|
177
|
-
* @returns {Promise<Array<Object>>} Promise с JSON данными
|
|
178
|
-
*/
|
|
179
|
-
export async function parseCsvBlob(blob, options = {}) {
|
|
180
|
-
if (!(blob instanceof Blob)) {
|
|
181
|
-
throw new ValidationError('Input must be a Blob object');
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
return new Promise((resolve, reject) => {
|
|
185
|
-
const reader = new FileReader();
|
|
186
|
-
|
|
187
|
-
reader.onload = function (event) {
|
|
188
|
-
try {
|
|
189
|
-
const csvText = event.target.result;
|
|
190
|
-
const json = csvToJson(csvText, options);
|
|
191
|
-
resolve(json);
|
|
192
|
-
} catch (error) {
|
|
193
|
-
reject(error);
|
|
194
|
-
}
|
|
195
|
-
};
|
|
196
|
-
|
|
197
|
-
reader.onerror = function () {
|
|
198
|
-
reject(new ValidationError('Ошибка чтения Blob'));
|
|
199
|
-
};
|
|
200
|
-
|
|
201
|
-
reader.readAsText(blob, 'UTF-8');
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
// Экспорт для Node.js совместимости
|
|
206
|
-
if (typeof module !== 'undefined' && module.exports) {
|
|
207
|
-
module.exports = {
|
|
208
|
-
downloadAsCsv,
|
|
209
|
-
parseCsvFile,
|
|
210
|
-
parseCsvFileStream,
|
|
211
|
-
createCsvBlob,
|
|
212
|
-
parseCsvBlob,
|
|
213
|
-
jsonToCsvStream,
|
|
214
|
-
jsonToNdjsonStream,
|
|
215
|
-
csvToJsonStream
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
export { jsonToCsvStream, jsonToNdjsonStream, csvToJsonStream };
|