web-csv-toolbox 0.14.0-next-386eebeaafe5857e28c876345c14c9fe5f1a3774 → 0.14.0-next-978b88933762ecc27270ce746b80a3fa7ed8c4f7
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 +28 -48
- package/dist/CSVLexer.js +8 -5
- package/dist/CSVLexer.js.map +1 -1
- package/dist/CSVLexerTransformer.d.ts +10 -12
- package/dist/CSVLexerTransformer.js +12 -16
- package/dist/CSVLexerTransformer.js.map +1 -1
- package/dist/CSVRecordAssembler.js +14 -4
- package/dist/CSVRecordAssembler.js.map +1 -1
- package/dist/CSVRecordAssemblerTransformer.d.ts +8 -14
- package/dist/CSVRecordAssemblerTransformer.js +10 -16
- package/dist/CSVRecordAssemblerTransformer.js.map +1 -1
- package/dist/assertCommonOptions.d.ts +1 -1
- package/dist/assertCommonOptions.js.map +1 -1
- package/dist/common/errors.d.ts +32 -0
- package/dist/common/errors.js +18 -0
- package/dist/common/errors.js.map +1 -1
- package/dist/common/types.d.ts +292 -66
- package/dist/constants.d.ts +12 -0
- package/dist/constants.js +2 -1
- package/dist/constants.js.map +1 -1
- package/dist/execution/EnginePresets.d.ts +52 -12
- package/dist/execution/EnginePresets.js +1 -1
- package/dist/execution/EnginePresets.js.map +1 -1
- package/dist/execution/InternalEngineConfig.js +40 -18
- package/dist/execution/InternalEngineConfig.js.map +1 -1
- package/dist/execution/worker/parseBinaryInWorker.node.js +3 -4
- package/dist/execution/worker/parseBinaryInWorker.node.js.map +1 -1
- package/dist/execution/worker/parseBinaryInWorker.web.js +3 -4
- package/dist/execution/worker/parseBinaryInWorker.web.js.map +1 -1
- package/dist/execution/worker/parseBinaryInWorkerWASM.node.js +3 -4
- package/dist/execution/worker/parseBinaryInWorkerWASM.node.js.map +1 -1
- package/dist/execution/worker/parseBinaryInWorkerWASM.web.js +3 -4
- package/dist/execution/worker/parseBinaryInWorkerWASM.web.js.map +1 -1
- package/dist/execution/worker/parseStreamInWorker.node.js +3 -4
- package/dist/execution/worker/parseStreamInWorker.node.js.map +1 -1
- package/dist/execution/worker/parseStreamInWorker.web.js +3 -4
- package/dist/execution/worker/parseStreamInWorker.web.js.map +1 -1
- package/dist/execution/worker/parseStringInWorker.node.js +3 -4
- package/dist/execution/worker/parseStringInWorker.node.js.map +1 -1
- package/dist/execution/worker/parseStringInWorker.web.js +3 -4
- package/dist/execution/worker/parseStringInWorker.web.js.map +1 -1
- package/dist/execution/worker/parseStringInWorkerWASM.node.js +3 -4
- package/dist/execution/worker/parseStringInWorkerWASM.node.js.map +1 -1
- package/dist/execution/worker/parseStringInWorkerWASM.web.js +3 -4
- package/dist/execution/worker/parseStringInWorkerWASM.web.js.map +1 -1
- package/dist/execution/worker/parseUint8ArrayStreamInWorker.node.js +3 -4
- package/dist/execution/worker/parseUint8ArrayStreamInWorker.node.js.map +1 -1
- package/dist/execution/worker/parseUint8ArrayStreamInWorker.web.js +3 -4
- package/dist/execution/worker/parseUint8ArrayStreamInWorker.web.js.map +1 -1
- package/dist/getCharsetValidation.constants.node.d.ts +11 -0
- package/dist/getCharsetValidation.constants.node.js +53 -0
- package/dist/getCharsetValidation.constants.node.js.map +1 -0
- package/dist/getCharsetValidation.constants.web.d.ts +36 -0
- package/dist/getCharsetValidation.constants.web.js +53 -0
- package/dist/getCharsetValidation.constants.web.js.map +1 -0
- package/dist/getOptionsFromFile.d.ts +14 -0
- package/dist/getOptionsFromFile.js +12 -0
- package/dist/getOptionsFromFile.js.map +1 -0
- package/dist/getOptionsFromResponse.js +17 -1
- package/dist/getOptionsFromResponse.js.map +1 -1
- package/dist/parseBlob.js +9 -1
- package/dist/parseBlob.js.map +1 -1
- package/dist/parseFile.d.ts +3 -2
- package/dist/parseFile.js +7 -3
- package/dist/parseFile.js.map +1 -1
- package/dist/parseFileToArray.d.ts +27 -0
- package/dist/parseFileToArray.js +12 -0
- package/dist/parseFileToArray.js.map +1 -0
- package/dist/parseFileToStream.d.ts +33 -0
- package/dist/parseFileToStream.js +10 -0
- package/dist/parseFileToStream.js.map +1 -0
- package/dist/utils/convertBinaryToString.js +17 -4
- package/dist/utils/convertBinaryToString.js.map +1 -1
- package/dist/utils/parseMime.js +3 -1
- package/dist/utils/parseMime.js.map +1 -1
- package/dist/utils/types.d.ts +21 -10
- package/dist/web-csv-toolbox.d.ts +3 -0
- package/dist/web-csv-toolbox.js +3 -0
- package/dist/web-csv-toolbox.js.map +1 -1
- package/package.json +7 -1
|
@@ -5,10 +5,9 @@ import { collectUint8ArrayStream } from './utils/streamCollector.node.js';
|
|
|
5
5
|
|
|
6
6
|
async function* parseUint8ArrayStreamInWorker(stream, options) {
|
|
7
7
|
const combined = await collectUint8ArrayStream(stream, options?.signal);
|
|
8
|
-
using session = await WorkerSession.create(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
});
|
|
8
|
+
using session = await WorkerSession.create(
|
|
9
|
+
options?.engine?.worker === true ? options.engine : void 0
|
|
10
|
+
);
|
|
12
11
|
yield* sendWorkerMessage(
|
|
13
12
|
session.getWorker(),
|
|
14
13
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseUint8ArrayStreamInWorker.node.js","sources":["../../../src/execution/worker/parseUint8ArrayStreamInWorker.node.ts"],"sourcesContent":["import type {\n CSVRecord,\n ParseBinaryOptions,\n ParseOptions,\n} from \"../../common/types.ts\";\nimport type { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from \"../../constants.ts\";\nimport { WorkerSession } from \"./helpers/WorkerSession.ts\";\nimport { sendWorkerMessage } from \"./utils/messageHandler.ts\";\nimport { serializeOptions } from \"./utils/serializeOptions.ts\";\nimport { collectUint8ArrayStream } from \"./utils/streamCollector.node.ts\";\n\n/**\n * Parse CSV Uint8Array stream in Worker thread (Node.js).\n * Collects stream into Uint8Array first, then sends to worker.\n *\n * Note: Node.js Worker Threads do not support ReadableStream transfer,\n * so we collect the stream into an array first.\n *\n * @internal\n */\nexport async function* parseUint8ArrayStreamInWorker<\n Header extends ReadonlyArray<string>,\n Delimiter extends string = DEFAULT_DELIMITER,\n Quotation extends string = DEFAULT_QUOTATION,\n>(\n stream: ReadableStream<Uint8Array>,\n options?: ParseBinaryOptions<Header, Delimiter, Quotation>,\n): AsyncIterableIterator<CSVRecord<Header>> {\n // Node.js: Collect stream into Uint8Array first\n const combined = await collectUint8ArrayStream(stream, options?.signal);\n\n using session = await WorkerSession.create(
|
|
1
|
+
{"version":3,"file":"parseUint8ArrayStreamInWorker.node.js","sources":["../../../src/execution/worker/parseUint8ArrayStreamInWorker.node.ts"],"sourcesContent":["import type {\n CSVRecord,\n ParseBinaryOptions,\n ParseOptions,\n} from \"../../common/types.ts\";\nimport type { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from \"../../constants.ts\";\nimport { WorkerSession } from \"./helpers/WorkerSession.ts\";\nimport { sendWorkerMessage } from \"./utils/messageHandler.ts\";\nimport { serializeOptions } from \"./utils/serializeOptions.ts\";\nimport { collectUint8ArrayStream } from \"./utils/streamCollector.node.ts\";\n\n/**\n * Parse CSV Uint8Array stream in Worker thread (Node.js).\n * Collects stream into Uint8Array first, then sends to worker.\n *\n * Note: Node.js Worker Threads do not support ReadableStream transfer,\n * so we collect the stream into an array first.\n *\n * @internal\n */\nexport async function* parseUint8ArrayStreamInWorker<\n Header extends ReadonlyArray<string>,\n Delimiter extends string = DEFAULT_DELIMITER,\n Quotation extends string = DEFAULT_QUOTATION,\n>(\n stream: ReadableStream<Uint8Array>,\n options?: ParseBinaryOptions<Header, Delimiter, Quotation>,\n): AsyncIterableIterator<CSVRecord<Header>> {\n // Node.js: Collect stream into Uint8Array first\n const combined = await collectUint8ArrayStream(stream, options?.signal);\n\n using session = await WorkerSession.create(\n options?.engine?.worker === true ? options.engine : undefined,\n );\n\n yield* sendWorkerMessage<CSVRecord<Header>>(\n session.getWorker(),\n {\n id: session.getNextRequestId(),\n type: \"parseBinary\",\n data: combined,\n options: serializeOptions(options),\n useWASM: false,\n },\n options as ParseOptions<Header> | ParseBinaryOptions<Header> | undefined,\n );\n}\n"],"names":[],"mappings":";;;;;AAoBA,gBAAuB,6BAAA,CAKrB,QACA,OAAA,EAC0C;AAE1C,EAAA,MAAM,QAAA,GAAW,MAAM,uBAAA,CAAwB,MAAA,EAAQ,SAAS,MAAM,CAAA;AAEtE,EAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,MAAA;AAAA,IAClC,OAAA,EAAS,MAAA,EAAQ,MAAA,KAAW,IAAA,GAAO,QAAQ,MAAA,GAAS;AAAA,GACtD;AAEA,EAAA,OAAO,iBAAA;AAAA,IACL,QAAQ,SAAA,EAAU;AAAA,IAClB;AAAA,MACE,EAAA,EAAI,QAAQ,gBAAA,EAAiB;AAAA,MAC7B,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,iBAAiB,OAAO,CAAA;AAAA,MACjC,OAAA,EAAS;AAAA,KACX;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
@@ -3,10 +3,9 @@ import { sendWorkerMessage } from './utils/messageHandler.js';
|
|
|
3
3
|
import { serializeOptions } from './utils/serializeOptions.js';
|
|
4
4
|
|
|
5
5
|
async function* parseUint8ArrayStreamInWorker(stream, options) {
|
|
6
|
-
using session = await WorkerSession.create(
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
});
|
|
6
|
+
using session = await WorkerSession.create(
|
|
7
|
+
options?.engine?.worker === true ? options.engine : void 0
|
|
8
|
+
);
|
|
10
9
|
yield* sendWorkerMessage(
|
|
11
10
|
session.getWorker(),
|
|
12
11
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseUint8ArrayStreamInWorker.web.js","sources":["../../../src/execution/worker/parseUint8ArrayStreamInWorker.web.ts"],"sourcesContent":["import type {\n CSVRecord,\n ParseBinaryOptions,\n ParseOptions,\n} from \"../../common/types.ts\";\nimport type { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from \"../../constants.ts\";\nimport { convertStreamToAsyncIterableIterator } from \"../../utils/convertStreamToAsyncIterableIterator.ts\";\nimport { WorkerSession } from \"./helpers/WorkerSession.ts\";\nimport { sendWorkerMessage } from \"./utils/messageHandler.ts\";\nimport { serializeOptions } from \"./utils/serializeOptions.ts\";\n\n/**\n * Parse CSV Uint8Array stream in Worker thread (Browser/Deno).\n * Uses Transferable Streams for zero-copy transfer.\n *\n * @internal\n */\nexport async function* parseUint8ArrayStreamInWorker<\n Header extends ReadonlyArray<string>,\n Delimiter extends string = DEFAULT_DELIMITER,\n Quotation extends string = DEFAULT_QUOTATION,\n>(\n stream: ReadableStream<Uint8Array>,\n options?: ParseBinaryOptions<Header, Delimiter, Quotation>,\n): AsyncIterableIterator<CSVRecord<Header>> {\n using session = await WorkerSession.create(
|
|
1
|
+
{"version":3,"file":"parseUint8ArrayStreamInWorker.web.js","sources":["../../../src/execution/worker/parseUint8ArrayStreamInWorker.web.ts"],"sourcesContent":["import type {\n CSVRecord,\n ParseBinaryOptions,\n ParseOptions,\n} from \"../../common/types.ts\";\nimport type { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from \"../../constants.ts\";\nimport { convertStreamToAsyncIterableIterator } from \"../../utils/convertStreamToAsyncIterableIterator.ts\";\nimport { WorkerSession } from \"./helpers/WorkerSession.ts\";\nimport { sendWorkerMessage } from \"./utils/messageHandler.ts\";\nimport { serializeOptions } from \"./utils/serializeOptions.ts\";\n\n/**\n * Parse CSV Uint8Array stream in Worker thread (Browser/Deno).\n * Uses Transferable Streams for zero-copy transfer.\n *\n * @internal\n */\nexport async function* parseUint8ArrayStreamInWorker<\n Header extends ReadonlyArray<string>,\n Delimiter extends string = DEFAULT_DELIMITER,\n Quotation extends string = DEFAULT_QUOTATION,\n>(\n stream: ReadableStream<Uint8Array>,\n options?: ParseBinaryOptions<Header, Delimiter, Quotation>,\n): AsyncIterableIterator<CSVRecord<Header>> {\n using session = await WorkerSession.create(\n options?.engine?.worker === true ? options.engine : undefined,\n );\n\n yield* sendWorkerMessage<CSVRecord<Header>>(\n session.getWorker(),\n {\n id: session.getNextRequestId(),\n type: \"parseUint8ArrayStream\",\n data: stream,\n options: serializeOptions(options),\n },\n options as ParseOptions<Header> | ParseBinaryOptions<Header> | undefined,\n [stream], // Transfer stream\n );\n}\n"],"names":[],"mappings":";;;;AAiBA,gBAAuB,6BAAA,CAKrB,QACA,OAAA,EAC0C;AAC1C,EAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,MAAA;AAAA,IAClC,OAAA,EAAS,MAAA,EAAQ,MAAA,KAAW,IAAA,GAAO,QAAQ,MAAA,GAAS;AAAA,GACtD;AAEA,EAAA,OAAO,iBAAA;AAAA,IACL,QAAQ,SAAA,EAAU;AAAA,IAClB;AAAA,MACE,EAAA,EAAI,QAAQ,gBAAA,EAAiB;AAAA,MAC7B,IAAA,EAAM,uBAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,iBAAiB,OAAO;AAAA,KACnC;AAAA,IACA,OAAA;AAAA,IACA,CAAC,MAAM;AAAA;AAAA,GACT;AACF;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commonly supported character encodings for CSV parsing in Node.js environments.
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* Node.js 20+ supports the WHATWG Encoding Standard through TextDecoder.
|
|
6
|
+
* This list includes the most commonly used encodings for CSV files.
|
|
7
|
+
*
|
|
8
|
+
* @see {@link https://nodejs.org/api/util.html#class-utiltextdecoder | Node.js TextDecoder}
|
|
9
|
+
* @see {@link https://encoding.spec.whatwg.org/#names-and-labels | WHATWG Encoding Standard}
|
|
10
|
+
*/
|
|
11
|
+
export declare const SUPPORTED_CHARSETS: ReadonlySet<string>;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const SUPPORTED_CHARSETS = /* @__PURE__ */ new Set([
|
|
2
|
+
// UTF encodings
|
|
3
|
+
"utf-8",
|
|
4
|
+
"utf8",
|
|
5
|
+
"unicode-1-1-utf-8",
|
|
6
|
+
"utf-16le",
|
|
7
|
+
"utf-16be",
|
|
8
|
+
"utf-16",
|
|
9
|
+
// ISO-8859 series (Western European)
|
|
10
|
+
"iso-8859-1",
|
|
11
|
+
"iso-8859-2",
|
|
12
|
+
"iso-8859-3",
|
|
13
|
+
"iso-8859-4",
|
|
14
|
+
"iso-8859-5",
|
|
15
|
+
"iso-8859-6",
|
|
16
|
+
"iso-8859-7",
|
|
17
|
+
"iso-8859-8",
|
|
18
|
+
"iso-8859-9",
|
|
19
|
+
"iso-8859-10",
|
|
20
|
+
"iso-8859-13",
|
|
21
|
+
"iso-8859-14",
|
|
22
|
+
"iso-8859-15",
|
|
23
|
+
"iso-8859-16",
|
|
24
|
+
"latin1",
|
|
25
|
+
// Windows code pages
|
|
26
|
+
"windows-1250",
|
|
27
|
+
"windows-1251",
|
|
28
|
+
"windows-1252",
|
|
29
|
+
"windows-1253",
|
|
30
|
+
"windows-1254",
|
|
31
|
+
"windows-1255",
|
|
32
|
+
"windows-1256",
|
|
33
|
+
"windows-1257",
|
|
34
|
+
"windows-1258",
|
|
35
|
+
// Japanese
|
|
36
|
+
"shift_jis",
|
|
37
|
+
"shift-jis",
|
|
38
|
+
"sjis",
|
|
39
|
+
"euc-jp",
|
|
40
|
+
"iso-2022-jp",
|
|
41
|
+
// Chinese
|
|
42
|
+
"gb18030",
|
|
43
|
+
"gbk",
|
|
44
|
+
"gb2312",
|
|
45
|
+
// Korean
|
|
46
|
+
"euc-kr",
|
|
47
|
+
// Other
|
|
48
|
+
"ascii",
|
|
49
|
+
"us-ascii"
|
|
50
|
+
]);
|
|
51
|
+
|
|
52
|
+
export { SUPPORTED_CHARSETS };
|
|
53
|
+
//# sourceMappingURL=getCharsetValidation.constants.node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getCharsetValidation.constants.node.js","sources":["../src/getCharsetValidation.constants.node.ts"],"sourcesContent":["/**\n * Commonly supported character encodings for CSV parsing in Node.js environments.\n *\n * @remarks\n * Node.js 20+ supports the WHATWG Encoding Standard through TextDecoder.\n * This list includes the most commonly used encodings for CSV files.\n *\n * @see {@link https://nodejs.org/api/util.html#class-utiltextdecoder | Node.js TextDecoder}\n * @see {@link https://encoding.spec.whatwg.org/#names-and-labels | WHATWG Encoding Standard}\n */\nexport const SUPPORTED_CHARSETS: ReadonlySet<string> = new Set([\n // UTF encodings\n \"utf-8\",\n \"utf8\",\n \"unicode-1-1-utf-8\",\n \"utf-16le\",\n \"utf-16be\",\n \"utf-16\",\n\n // ISO-8859 series (Western European)\n \"iso-8859-1\",\n \"iso-8859-2\",\n \"iso-8859-3\",\n \"iso-8859-4\",\n \"iso-8859-5\",\n \"iso-8859-6\",\n \"iso-8859-7\",\n \"iso-8859-8\",\n \"iso-8859-9\",\n \"iso-8859-10\",\n \"iso-8859-13\",\n \"iso-8859-14\",\n \"iso-8859-15\",\n \"iso-8859-16\",\n \"latin1\",\n\n // Windows code pages\n \"windows-1250\",\n \"windows-1251\",\n \"windows-1252\",\n \"windows-1253\",\n \"windows-1254\",\n \"windows-1255\",\n \"windows-1256\",\n \"windows-1257\",\n \"windows-1258\",\n\n // Japanese\n \"shift_jis\",\n \"shift-jis\",\n \"sjis\",\n \"euc-jp\",\n \"iso-2022-jp\",\n\n // Chinese\n \"gb18030\",\n \"gbk\",\n \"gb2312\",\n\n // Korean\n \"euc-kr\",\n\n // Other\n \"ascii\",\n \"us-ascii\",\n]);\n"],"names":[],"mappings":"AAUO,MAAM,kBAAA,uBAA8C,GAAA,CAAI;AAAA;AAAA,EAE7D,OAAA;AAAA,EACA,MAAA;AAAA,EACA,mBAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA;AAAA,EAGA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA;AAAA,EAGA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA;AAAA,EAGA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA;AAAA,EAGA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA;AAAA,EAGA,QAAA;AAAA;AAAA,EAGA,OAAA;AAAA,EACA;AACF,CAAC;;;;"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commonly supported character encodings for CSV parsing in browser environments.
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* This list includes the most commonly used encodings that are supported across
|
|
6
|
+
* all modern browsers. TextDecoder supports additional encodings, but this list
|
|
7
|
+
* focuses on the most widely-used ones for CSV files.
|
|
8
|
+
*
|
|
9
|
+
* ### Common Character Encodings:
|
|
10
|
+
* - **UTF-8**: Universal encoding, recommended for all new content
|
|
11
|
+
* - **UTF-16LE/UTF-16BE**: Unicode encodings with byte order
|
|
12
|
+
* - **ISO-8859-X**: Legacy single-byte encodings for Western European languages
|
|
13
|
+
* - **Windows-125X**: Windows-specific legacy encodings
|
|
14
|
+
* - **Shift_JIS, EUC-JP, ISO-2022-JP**: Japanese encodings
|
|
15
|
+
* - **GB18030, GBK**: Chinese encodings
|
|
16
|
+
* - **EUC-KR**: Korean encoding
|
|
17
|
+
*
|
|
18
|
+
* ### Using Non-Standard Charsets
|
|
19
|
+
*
|
|
20
|
+
* If you need to use a charset not in this list, you can:
|
|
21
|
+
* 1. Set the `allowNonStandardCharsets` option to `true`
|
|
22
|
+
* 2. Be aware that this may cause errors if the browser doesn't support the encoding
|
|
23
|
+
* 3. Consider implementing fallback handling for unsupported charsets
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* // Use non-standard charset (may fail in some browsers)
|
|
28
|
+
* const records = parseResponse(response, {
|
|
29
|
+
* allowNonStandardCharsets: true
|
|
30
|
+
* });
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* @see {@link https://encoding.spec.whatwg.org/#names-and-labels | WHATWG Encoding Standard}
|
|
34
|
+
* @see {@link https://developer.mozilla.org/en-US/docs/Web/API/TextDecoder/TextDecoder | TextDecoder}
|
|
35
|
+
*/
|
|
36
|
+
export declare const SUPPORTED_CHARSETS: ReadonlySet<string>;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const SUPPORTED_CHARSETS = /* @__PURE__ */ new Set([
|
|
2
|
+
// UTF encodings
|
|
3
|
+
"utf-8",
|
|
4
|
+
"utf8",
|
|
5
|
+
"unicode-1-1-utf-8",
|
|
6
|
+
"utf-16le",
|
|
7
|
+
"utf-16be",
|
|
8
|
+
"utf-16",
|
|
9
|
+
// ISO-8859 series (Western European)
|
|
10
|
+
"iso-8859-1",
|
|
11
|
+
"iso-8859-2",
|
|
12
|
+
"iso-8859-3",
|
|
13
|
+
"iso-8859-4",
|
|
14
|
+
"iso-8859-5",
|
|
15
|
+
"iso-8859-6",
|
|
16
|
+
"iso-8859-7",
|
|
17
|
+
"iso-8859-8",
|
|
18
|
+
"iso-8859-9",
|
|
19
|
+
"iso-8859-10",
|
|
20
|
+
"iso-8859-13",
|
|
21
|
+
"iso-8859-14",
|
|
22
|
+
"iso-8859-15",
|
|
23
|
+
"iso-8859-16",
|
|
24
|
+
"latin1",
|
|
25
|
+
// Windows code pages
|
|
26
|
+
"windows-1250",
|
|
27
|
+
"windows-1251",
|
|
28
|
+
"windows-1252",
|
|
29
|
+
"windows-1253",
|
|
30
|
+
"windows-1254",
|
|
31
|
+
"windows-1255",
|
|
32
|
+
"windows-1256",
|
|
33
|
+
"windows-1257",
|
|
34
|
+
"windows-1258",
|
|
35
|
+
// Japanese
|
|
36
|
+
"shift_jis",
|
|
37
|
+
"shift-jis",
|
|
38
|
+
"sjis",
|
|
39
|
+
"euc-jp",
|
|
40
|
+
"iso-2022-jp",
|
|
41
|
+
// Chinese
|
|
42
|
+
"gb18030",
|
|
43
|
+
"gbk",
|
|
44
|
+
"gb2312",
|
|
45
|
+
// Korean
|
|
46
|
+
"euc-kr",
|
|
47
|
+
// Other
|
|
48
|
+
"ascii",
|
|
49
|
+
"us-ascii"
|
|
50
|
+
]);
|
|
51
|
+
|
|
52
|
+
export { SUPPORTED_CHARSETS };
|
|
53
|
+
//# sourceMappingURL=getCharsetValidation.constants.web.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getCharsetValidation.constants.web.js","sources":["../src/getCharsetValidation.constants.web.ts"],"sourcesContent":["/**\n * Commonly supported character encodings for CSV parsing in browser environments.\n *\n * @remarks\n * This list includes the most commonly used encodings that are supported across\n * all modern browsers. TextDecoder supports additional encodings, but this list\n * focuses on the most widely-used ones for CSV files.\n *\n * ### Common Character Encodings:\n * - **UTF-8**: Universal encoding, recommended for all new content\n * - **UTF-16LE/UTF-16BE**: Unicode encodings with byte order\n * - **ISO-8859-X**: Legacy single-byte encodings for Western European languages\n * - **Windows-125X**: Windows-specific legacy encodings\n * - **Shift_JIS, EUC-JP, ISO-2022-JP**: Japanese encodings\n * - **GB18030, GBK**: Chinese encodings\n * - **EUC-KR**: Korean encoding\n *\n * ### Using Non-Standard Charsets\n *\n * If you need to use a charset not in this list, you can:\n * 1. Set the `allowNonStandardCharsets` option to `true`\n * 2. Be aware that this may cause errors if the browser doesn't support the encoding\n * 3. Consider implementing fallback handling for unsupported charsets\n *\n * @example\n * ```typescript\n * // Use non-standard charset (may fail in some browsers)\n * const records = parseResponse(response, {\n * allowNonStandardCharsets: true\n * });\n * ```\n *\n * @see {@link https://encoding.spec.whatwg.org/#names-and-labels | WHATWG Encoding Standard}\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/TextDecoder/TextDecoder | TextDecoder}\n */\nexport const SUPPORTED_CHARSETS: ReadonlySet<string> = new Set([\n // UTF encodings\n \"utf-8\",\n \"utf8\",\n \"unicode-1-1-utf-8\",\n \"utf-16le\",\n \"utf-16be\",\n \"utf-16\",\n\n // ISO-8859 series (Western European)\n \"iso-8859-1\",\n \"iso-8859-2\",\n \"iso-8859-3\",\n \"iso-8859-4\",\n \"iso-8859-5\",\n \"iso-8859-6\",\n \"iso-8859-7\",\n \"iso-8859-8\",\n \"iso-8859-9\",\n \"iso-8859-10\",\n \"iso-8859-13\",\n \"iso-8859-14\",\n \"iso-8859-15\",\n \"iso-8859-16\",\n \"latin1\",\n\n // Windows code pages\n \"windows-1250\",\n \"windows-1251\",\n \"windows-1252\",\n \"windows-1253\",\n \"windows-1254\",\n \"windows-1255\",\n \"windows-1256\",\n \"windows-1257\",\n \"windows-1258\",\n\n // Japanese\n \"shift_jis\",\n \"shift-jis\",\n \"sjis\",\n \"euc-jp\",\n \"iso-2022-jp\",\n\n // Chinese\n \"gb18030\",\n \"gbk\",\n \"gb2312\",\n\n // Korean\n \"euc-kr\",\n\n // Other\n \"ascii\",\n \"us-ascii\",\n]);\n"],"names":[],"mappings":"AAmCO,MAAM,kBAAA,uBAA8C,GAAA,CAAI;AAAA;AAAA,EAE7D,OAAA;AAAA,EACA,MAAA;AAAA,EACA,mBAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA;AAAA,EAGA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA;AAAA,EAGA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA;AAAA,EAGA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA;AAAA,EAGA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA;AAAA,EAGA,QAAA;AAAA;AAAA,EAGA,OAAA;AAAA,EACA;AACF,CAAC;;;;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ParseBinaryOptions } from './common/types.ts';
|
|
2
|
+
import { DEFAULT_DELIMITER } from './constants.ts';
|
|
3
|
+
/**
|
|
4
|
+
* Extracts the options from the file object.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* This function automatically sets the file name as the error source
|
|
8
|
+
* for better error reporting (unless explicitly overridden via options).
|
|
9
|
+
*
|
|
10
|
+
* @param file - The file object from which to extract the options.
|
|
11
|
+
* @param options - The options to merge with the extracted options.
|
|
12
|
+
* @returns The options extracted from the file.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getOptionsFromFile<Header extends ReadonlyArray<string>, Delimiter extends string = DEFAULT_DELIMITER>(file: File, options?: ParseBinaryOptions<Header, Delimiter>): ParseBinaryOptions<Header, Delimiter>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { getOptionsFromBlob } from './getOptionsFromBlob.js';
|
|
2
|
+
|
|
3
|
+
function getOptionsFromFile(file, options = {}) {
|
|
4
|
+
const blobOptions = getOptionsFromBlob(file, options);
|
|
5
|
+
return {
|
|
6
|
+
...blobOptions,
|
|
7
|
+
source: options.source ?? file.name
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export { getOptionsFromFile };
|
|
12
|
+
//# sourceMappingURL=getOptionsFromFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getOptionsFromFile.js","sources":["../src/getOptionsFromFile.ts"],"sourcesContent":["import type { ParseBinaryOptions } from \"./common/types.ts\";\nimport type { DEFAULT_DELIMITER } from \"./constants.ts\";\nimport { getOptionsFromBlob } from \"./getOptionsFromBlob.ts\";\n\n/**\n * Extracts the options from the file object.\n *\n * @remarks\n * This function automatically sets the file name as the error source\n * for better error reporting (unless explicitly overridden via options).\n *\n * @param file - The file object from which to extract the options.\n * @param options - The options to merge with the extracted options.\n * @returns The options extracted from the file.\n */\nexport function getOptionsFromFile<\n Header extends ReadonlyArray<string>,\n Delimiter extends string = DEFAULT_DELIMITER,\n>(\n file: File,\n options: ParseBinaryOptions<Header, Delimiter> = {} as ParseBinaryOptions<\n Header,\n Delimiter\n >,\n): ParseBinaryOptions<Header, Delimiter> {\n // Get options from blob (charset extraction)\n const blobOptions = getOptionsFromBlob(file, options);\n\n // Add file name as source for error reporting if not already set\n return {\n ...blobOptions,\n source: options.source ?? file.name,\n };\n}\n"],"names":[],"mappings":";;AAeO,SAAS,kBAAA,CAId,IAAA,EACA,OAAA,GAAiD,EAAC,EAIX;AAEvC,EAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,IAAA,EAAM,OAAO,CAAA;AAGpD,EAAA,OAAO;AAAA,IACL,GAAG,WAAA;AAAA,IACH,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,IAAA,CAAK;AAAA,GACjC;AACF;;;;"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { SUPPORTED_CHARSETS } from './getCharsetValidation.constants.web.js';
|
|
1
2
|
import { SUPPORTED_COMPRESSIONS } from './getOptionsFromResponse.constants.web.js';
|
|
2
3
|
import { parseMime } from './utils/parseMime.js';
|
|
3
4
|
|
|
@@ -29,7 +30,22 @@ function getOptionsFromResponse(response, options = {}) {
|
|
|
29
30
|
}
|
|
30
31
|
}
|
|
31
32
|
}
|
|
32
|
-
const
|
|
33
|
+
const rawCharset = mime.parameters.charset ?? "utf-8";
|
|
34
|
+
const normalizedCharset = rawCharset.trim().toLowerCase();
|
|
35
|
+
let charset;
|
|
36
|
+
if (SUPPORTED_CHARSETS.has(normalizedCharset)) {
|
|
37
|
+
charset = normalizedCharset;
|
|
38
|
+
} else if (normalizedCharset) {
|
|
39
|
+
if (options.allowNonStandardCharsets) {
|
|
40
|
+
charset = normalizedCharset;
|
|
41
|
+
} else {
|
|
42
|
+
throw new TypeError(
|
|
43
|
+
`Unsupported charset: "${rawCharset}". Commonly supported charsets include: utf-8, utf-16le, iso-8859-1, windows-1252, shift_jis, gb18030, euc-kr, etc. To use non-standard charsets, set allowNonStandardCharsets: true`
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
} else {
|
|
47
|
+
charset = "utf-8";
|
|
48
|
+
}
|
|
33
49
|
return {
|
|
34
50
|
decompression,
|
|
35
51
|
charset,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getOptionsFromResponse.js","sources":["../src/getOptionsFromResponse.ts"],"sourcesContent":["import { SUPPORTED_COMPRESSIONS } from \"#getOptionsFromResponse.constants.js\";\nimport type { ParseBinaryOptions } from \"./common/types.ts\";\nimport type { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from \"./constants.ts\";\nimport { parseMime } from \"./utils/parseMime.ts\";\n\n/**\n * Extracts the options from the response object.\n *\n * @param response - The response object from which to extract the options.\n * @param options - The options to merge with the extracted options.\n * @returns The options extracted from the response.\n * @throws {TypeError} - The content type is not supported or the content-encoding is invalid.\n */\nexport function getOptionsFromResponse<\n Header extends ReadonlyArray<string>,\n Delimiter extends string = DEFAULT_DELIMITER,\n Quotation extends string = '\"',\n>(\n response: Response,\n options: ParseBinaryOptions<\n Header,\n Delimiter,\n Quotation\n > = {} as ParseBinaryOptions<Header, Delimiter, Quotation>,\n): ParseBinaryOptions<Header, Delimiter, Quotation> {\n const { headers } = response;\n const contentType = headers.get(\"content-type\") ?? \"text/csv\";\n const mime = parseMime(contentType);\n if (mime.type !== \"text/csv\") {\n throw new TypeError(`Invalid mime type: \"${contentType}\"`);\n }\n\n const contentEncoding = headers.get(\"content-encoding\");\n let decompression: CompressionFormat | undefined;\n\n if (contentEncoding) {\n const normalizedEncoding = contentEncoding.trim().toLowerCase();\n\n if (normalizedEncoding.includes(\",\")) {\n throw new TypeError(\n `Multiple content-encodings are not supported: \"${contentEncoding}\"`,\n );\n }\n\n if (SUPPORTED_COMPRESSIONS.has(normalizedEncoding as CompressionFormat)) {\n decompression = normalizedEncoding as CompressionFormat;\n } else if (normalizedEncoding) {\n // Unknown compression format\n if (options.allowExperimentalCompressions) {\n // Allow runtime to handle experimental/future formats\n decompression = normalizedEncoding as CompressionFormat;\n } else {\n throw new TypeError(\n `Unsupported content-encoding: \"${contentEncoding}\". Supported formats: ${Array.from(SUPPORTED_COMPRESSIONS).join(\", \")}. To use experimental formats, set allowExperimentalCompressions: true`,\n );\n }\n }\n }\n\n
|
|
1
|
+
{"version":3,"file":"getOptionsFromResponse.js","sources":["../src/getOptionsFromResponse.ts"],"sourcesContent":["import { SUPPORTED_CHARSETS } from \"#getCharsetValidation.constants.js\";\nimport { SUPPORTED_COMPRESSIONS } from \"#getOptionsFromResponse.constants.js\";\nimport type { ParseBinaryOptions } from \"./common/types.ts\";\nimport type { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from \"./constants.ts\";\nimport { parseMime } from \"./utils/parseMime.ts\";\n\n/**\n * Extracts the options from the response object.\n *\n * @param response - The response object from which to extract the options.\n * @param options - The options to merge with the extracted options.\n * @returns The options extracted from the response.\n * @throws {TypeError} - The content type is not supported or the content-encoding is invalid.\n */\nexport function getOptionsFromResponse<\n Header extends ReadonlyArray<string>,\n Delimiter extends string = DEFAULT_DELIMITER,\n Quotation extends string = '\"',\n>(\n response: Response,\n options: ParseBinaryOptions<\n Header,\n Delimiter,\n Quotation\n > = {} as ParseBinaryOptions<Header, Delimiter, Quotation>,\n): ParseBinaryOptions<Header, Delimiter, Quotation> {\n const { headers } = response;\n const contentType = headers.get(\"content-type\") ?? \"text/csv\";\n const mime = parseMime(contentType);\n if (mime.type !== \"text/csv\") {\n throw new TypeError(`Invalid mime type: \"${contentType}\"`);\n }\n\n const contentEncoding = headers.get(\"content-encoding\");\n let decompression: CompressionFormat | undefined;\n\n if (contentEncoding) {\n const normalizedEncoding = contentEncoding.trim().toLowerCase();\n\n if (normalizedEncoding.includes(\",\")) {\n throw new TypeError(\n `Multiple content-encodings are not supported: \"${contentEncoding}\"`,\n );\n }\n\n if (SUPPORTED_COMPRESSIONS.has(normalizedEncoding as CompressionFormat)) {\n decompression = normalizedEncoding as CompressionFormat;\n } else if (normalizedEncoding) {\n // Unknown compression format\n if (options.allowExperimentalCompressions) {\n // Allow runtime to handle experimental/future formats\n decompression = normalizedEncoding as CompressionFormat;\n } else {\n throw new TypeError(\n `Unsupported content-encoding: \"${contentEncoding}\". Supported formats: ${Array.from(SUPPORTED_COMPRESSIONS).join(\", \")}. To use experimental formats, set allowExperimentalCompressions: true`,\n );\n }\n }\n }\n\n // Validate and normalize charset\n const rawCharset = mime.parameters.charset ?? \"utf-8\";\n const normalizedCharset = rawCharset.trim().toLowerCase();\n\n let charset: string;\n if (SUPPORTED_CHARSETS.has(normalizedCharset)) {\n charset = normalizedCharset;\n } else if (normalizedCharset) {\n // Unknown charset\n if (options.allowNonStandardCharsets) {\n // Allow runtime to handle non-standard charsets\n charset = normalizedCharset;\n } else {\n throw new TypeError(\n `Unsupported charset: \"${rawCharset}\". Commonly supported charsets include: utf-8, utf-16le, iso-8859-1, windows-1252, shift_jis, gb18030, euc-kr, etc. To use non-standard charsets, set allowNonStandardCharsets: true`,\n );\n }\n } else {\n charset = \"utf-8\";\n }\n\n // TODO: Support header=present and header=absent\n // const header = mime.parameters.header ?? \"present\";\n return {\n decompression,\n charset,\n ...options,\n };\n}\n"],"names":[],"mappings":";;;;AAcO,SAAS,sBAAA,CAKd,QAAA,EACA,OAAA,GAII,EAAC,EAC6C;AAClD,EAAA,MAAM,EAAE,SAAQ,GAAI,QAAA;AACpB,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,UAAA;AACnD,EAAA,MAAM,IAAA,GAAO,UAAU,WAAW,CAAA;AAClC,EAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAC5B,IAAA,MAAM,IAAI,SAAA,CAAU,CAAA,oBAAA,EAAuB,WAAW,CAAA,CAAA,CAAG,CAAA;AAAA,EAC3D;AAEA,EAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA;AACtD,EAAA,IAAI,aAAA;AAEJ,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,MAAM,kBAAA,GAAqB,eAAA,CAAgB,IAAA,EAAK,CAAE,WAAA,EAAY;AAE9D,IAAA,IAAI,kBAAA,CAAmB,QAAA,CAAS,GAAG,CAAA,EAAG;AACpC,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,kDAAkD,eAAe,CAAA,CAAA;AAAA,OACnE;AAAA,IACF;AAEA,IAAA,IAAI,sBAAA,CAAuB,GAAA,CAAI,kBAAuC,CAAA,EAAG;AACvE,MAAA,aAAA,GAAgB,kBAAA;AAAA,IAClB,WAAW,kBAAA,EAAoB;AAE7B,MAAA,IAAI,QAAQ,6BAAA,EAA+B;AAEzC,QAAA,aAAA,GAAgB,kBAAA;AAAA,MAClB,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,SAAA;AAAA,UACR,CAAA,+BAAA,EAAkC,eAAe,CAAA,sBAAA,EAAyB,KAAA,CAAM,KAAK,sBAAsB,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,sEAAA;AAAA,SACzH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,OAAA,IAAW,OAAA;AAC9C,EAAA,MAAM,iBAAA,GAAoB,UAAA,CAAW,IAAA,EAAK,CAAE,WAAA,EAAY;AAExD,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,kBAAA,CAAmB,GAAA,CAAI,iBAAiB,CAAA,EAAG;AAC7C,IAAA,OAAA,GAAU,iBAAA;AAAA,EACZ,WAAW,iBAAA,EAAmB;AAE5B,IAAA,IAAI,QAAQ,wBAAA,EAA0B;AAEpC,MAAA,OAAA,GAAU,iBAAA;AAAA,IACZ,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,yBAAyB,UAAU,CAAA,oLAAA;AAAA,OACrC;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,OAAA,GAAU,OAAA;AAAA,EACZ;AAIA,EAAA,OAAO;AAAA,IACL,aAAA;AAAA,IACA,OAAA;AAAA,IACA,GAAG;AAAA,GACL;AACF;;;;"}
|
package/dist/parseBlob.js
CHANGED
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
import { commonParseErrorHandling } from './commonParseErrorHandling.js';
|
|
2
|
+
import { DEFAULT_ARRAY_BUFFER_THRESHOLD } from './constants.js';
|
|
2
3
|
import { getOptionsFromBlob } from './getOptionsFromBlob.js';
|
|
4
|
+
import { parseBinary } from './parseBinary.js';
|
|
3
5
|
import { parseBlobToStream } from './parseBlobToStream.js';
|
|
4
6
|
import { parseUint8ArrayStream } from './parseUint8ArrayStream.js';
|
|
5
7
|
import { convertThisAsyncIterableIteratorToArray } from './utils/convertThisAsyncIterableIteratorToArray.js';
|
|
6
8
|
|
|
7
9
|
function parseBlob(blob, options) {
|
|
8
10
|
const options_ = getOptionsFromBlob(blob, options);
|
|
11
|
+
const threshold = options_?.engine?.arrayBufferThreshold ?? DEFAULT_ARRAY_BUFFER_THRESHOLD;
|
|
9
12
|
return (async function* () {
|
|
10
13
|
try {
|
|
11
|
-
|
|
14
|
+
if (blob.size < threshold) {
|
|
15
|
+
const buffer = await blob.arrayBuffer();
|
|
16
|
+
yield* parseBinary(new Uint8Array(buffer), options_);
|
|
17
|
+
} else {
|
|
18
|
+
yield* parseUint8ArrayStream(blob.stream(), options_);
|
|
19
|
+
}
|
|
12
20
|
} catch (error) {
|
|
13
21
|
commonParseErrorHandling(error);
|
|
14
22
|
}
|
package/dist/parseBlob.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseBlob.js","sources":["../src/parseBlob.ts"],"sourcesContent":["import type { CSVRecord, ParseBinaryOptions } from \"./common/types.ts\";\nimport { commonParseErrorHandling } from \"./commonParseErrorHandling.ts\";\nimport { getOptionsFromBlob } from \"./getOptionsFromBlob.ts\";\nimport { parseBlobToStream } from \"./parseBlobToStream.ts\";\nimport { parseUint8ArrayStream } from \"./parseUint8ArrayStream.ts\";\nimport * as internal from \"./utils/convertThisAsyncIterableIteratorToArray.ts\";\n\n/**\n * Parse CSV from a {@link !Blob} or {@link !File} to records.\n *\n * @remarks\n * This function can parse CSV data from Blob or File objects.\n * If the Blob has a type with charset parameter, it will be used for decoding.\n *\n * File objects (from file inputs or drag-and-drop) extend Blob and are automatically supported.\n *\n * @category Middle-level API\n * @param blob - The blob or file to parse\n * @param options - Parsing options\n * @returns Async iterable iterator of records.\n *\n * If you want array of records, use {@link parseBlob.toArray} function.\n *\n * @example Parsing CSV from Blob\n *\n * ```ts\n * import { parseBlob } from 'web-csv-toolbox';\n *\n * const blob = new Blob(['name,age\\nAlice,42\\nBob,69'], { type: 'text/csv' });\n *\n * for await (const record of parseBlob(blob)) {\n * console.log(record);\n * }\n * ```\n *\n * @example Parsing CSV from File (input element)\n *\n * ```ts\n * import { parseBlob } from 'web-csv-toolbox';\n *\n * const input = document.querySelector('input[type=\"file\"]');\n * input.addEventListener('change', async (event) => {\n * const file = event.target.files[0];\n * for await (const record of parseBlob(file)) {\n * console.log(record);\n * }\n * });\n * ```\n *\n * @example Parsing CSV from Blob with charset\n *\n * ```ts\n * import { parseBlob } from 'web-csv-toolbox';\n *\n * const blob = new Blob([csvData], { type: 'text/csv;charset=shift-jis' });\n *\n * for await (const record of parseBlob(blob)) {\n * console.log(record);\n * }\n * ```\n */\nexport function parseBlob<Header extends ReadonlyArray<string>>(\n blob: Blob,\n options?: ParseBinaryOptions<Header>,\n): AsyncIterableIterator<CSVRecord<Header>> {\n // Extract options from blob\n const options_ = getOptionsFromBlob(blob, options);\n\n // Return wrapper async generator for error handling\n return (async function* () {\n try {\n yield* parseUint8ArrayStream(blob.stream(), options_);\n } catch (error) {\n commonParseErrorHandling(error);\n }\n })();\n}\n\nexport declare namespace parseBlob {\n /**\n * Parse CSV from a {@link !Blob} or {@link !File} to array of records.\n *\n * @returns Array of records\n *\n * @example Parsing CSV from Blob\n *\n * ```ts\n * import { parseBlob } from 'web-csv-toolbox';\n *\n * const blob = new Blob(['name,age\\nAlice,42\\nBob,69'], { type: 'text/csv' });\n *\n * const records = await parseBlob.toArray(blob);\n * console.log(records);\n * ```\n */\n export function toArray<Header extends ReadonlyArray<string>>(\n blob: Blob,\n options?: ParseBinaryOptions<Header>,\n ): Promise<CSVRecord<Header>[]>;\n /**\n * Parse CSV from a {@link !Blob} or {@link !File} to stream of records.\n *\n * @param blob - Blob or File to parse\n * @returns Stream of records\n *\n * @example Parsing CSV from Blob\n *\n * ```ts\n * import { parseBlob } from 'web-csv-toolbox';\n *\n * const blob = new Blob(['name,age\\nAlice,42\\nBob,69'], { type: 'text/csv' });\n *\n * await parseBlob.toStream(blob)\n * .pipeTo(\n * new WritableStream({\n * write(record) {\n * console.log(record);\n * },\n * }),\n * );\n * // Prints:\n * // { name: 'Alice', age: '42' }\n * // { name: 'Bob', age: '69' }\n * ```\n */\n export function toStream<Header extends ReadonlyArray<string>>(\n blob: Blob,\n options?: ParseBinaryOptions<Header>,\n ): ReadableStream<CSVRecord<Header>>;\n}\n\nObject.defineProperties(parseBlob, {\n toArray: {\n enumerable: true,\n writable: false,\n value: internal.convertThisAsyncIterableIteratorToArray,\n },\n toStream: {\n enumerable: true,\n writable: false,\n value: parseBlobToStream,\n },\n});\n"],"names":["internal.convertThisAsyncIterableIteratorToArray"],"mappings":"
|
|
1
|
+
{"version":3,"file":"parseBlob.js","sources":["../src/parseBlob.ts"],"sourcesContent":["import type { CSVRecord, ParseBinaryOptions } from \"./common/types.ts\";\nimport { commonParseErrorHandling } from \"./commonParseErrorHandling.ts\";\nimport { DEFAULT_ARRAY_BUFFER_THRESHOLD } from \"./constants.ts\";\nimport { getOptionsFromBlob } from \"./getOptionsFromBlob.ts\";\nimport { parseBinary } from \"./parseBinary.ts\";\nimport { parseBlobToStream } from \"./parseBlobToStream.ts\";\nimport { parseUint8ArrayStream } from \"./parseUint8ArrayStream.ts\";\nimport * as internal from \"./utils/convertThisAsyncIterableIteratorToArray.ts\";\n\n/**\n * Parse CSV from a {@link !Blob} or {@link !File} to records.\n *\n * @remarks\n * This function can parse CSV data from Blob or File objects.\n * If the Blob has a type with charset parameter, it will be used for decoding.\n *\n * File objects (from file inputs or drag-and-drop) extend Blob and are automatically supported.\n *\n * @category Middle-level API\n * @param blob - The blob or file to parse\n * @param options - Parsing options\n * @returns Async iterable iterator of records.\n *\n * If you want array of records, use {@link parseBlob.toArray} function.\n *\n * @example Parsing CSV from Blob\n *\n * ```ts\n * import { parseBlob } from 'web-csv-toolbox';\n *\n * const blob = new Blob(['name,age\\nAlice,42\\nBob,69'], { type: 'text/csv' });\n *\n * for await (const record of parseBlob(blob)) {\n * console.log(record);\n * }\n * ```\n *\n * @example Parsing CSV from File (input element)\n *\n * ```ts\n * import { parseBlob } from 'web-csv-toolbox';\n *\n * const input = document.querySelector('input[type=\"file\"]');\n * input.addEventListener('change', async (event) => {\n * const file = event.target.files[0];\n * for await (const record of parseBlob(file)) {\n * console.log(record);\n * }\n * });\n * ```\n *\n * @example Parsing CSV from Blob with charset\n *\n * ```ts\n * import { parseBlob } from 'web-csv-toolbox';\n *\n * const blob = new Blob([csvData], { type: 'text/csv;charset=shift-jis' });\n *\n * for await (const record of parseBlob(blob)) {\n * console.log(record);\n * }\n * ```\n */\nexport function parseBlob<Header extends ReadonlyArray<string>>(\n blob: Blob,\n options?: ParseBinaryOptions<Header>,\n): AsyncIterableIterator<CSVRecord<Header>> {\n // Extract options from blob\n const options_ = getOptionsFromBlob(blob, options);\n\n // Get threshold from engine config or use default\n const threshold =\n options_?.engine?.arrayBufferThreshold ?? DEFAULT_ARRAY_BUFFER_THRESHOLD;\n\n // Return wrapper async generator for error handling\n return (async function* () {\n try {\n // Choose strategy based on blob size and threshold\n if (blob.size < threshold) {\n // Small file: use arrayBuffer for better performance\n const buffer = await blob.arrayBuffer();\n yield* parseBinary(new Uint8Array(buffer), options_);\n } else {\n // Large file: use streaming for memory efficiency\n yield* parseUint8ArrayStream(blob.stream(), options_);\n }\n } catch (error) {\n commonParseErrorHandling(error);\n }\n })();\n}\n\nexport declare namespace parseBlob {\n /**\n * Parse CSV from a {@link !Blob} or {@link !File} to array of records.\n *\n * @returns Array of records\n *\n * @example Parsing CSV from Blob\n *\n * ```ts\n * import { parseBlob } from 'web-csv-toolbox';\n *\n * const blob = new Blob(['name,age\\nAlice,42\\nBob,69'], { type: 'text/csv' });\n *\n * const records = await parseBlob.toArray(blob);\n * console.log(records);\n * ```\n */\n export function toArray<Header extends ReadonlyArray<string>>(\n blob: Blob,\n options?: ParseBinaryOptions<Header>,\n ): Promise<CSVRecord<Header>[]>;\n /**\n * Parse CSV from a {@link !Blob} or {@link !File} to stream of records.\n *\n * @param blob - Blob or File to parse\n * @returns Stream of records\n *\n * @example Parsing CSV from Blob\n *\n * ```ts\n * import { parseBlob } from 'web-csv-toolbox';\n *\n * const blob = new Blob(['name,age\\nAlice,42\\nBob,69'], { type: 'text/csv' });\n *\n * await parseBlob.toStream(blob)\n * .pipeTo(\n * new WritableStream({\n * write(record) {\n * console.log(record);\n * },\n * }),\n * );\n * // Prints:\n * // { name: 'Alice', age: '42' }\n * // { name: 'Bob', age: '69' }\n * ```\n */\n export function toStream<Header extends ReadonlyArray<string>>(\n blob: Blob,\n options?: ParseBinaryOptions<Header>,\n ): ReadableStream<CSVRecord<Header>>;\n}\n\nObject.defineProperties(parseBlob, {\n toArray: {\n enumerable: true,\n writable: false,\n value: internal.convertThisAsyncIterableIteratorToArray,\n },\n toStream: {\n enumerable: true,\n writable: false,\n value: parseBlobToStream,\n },\n});\n"],"names":["internal.convertThisAsyncIterableIteratorToArray"],"mappings":";;;;;;;;AA+DO,SAAS,SAAA,CACd,MACA,OAAA,EAC0C;AAE1C,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,IAAA,EAAM,OAAO,CAAA;AAGjD,EAAA,MAAM,SAAA,GACJ,QAAA,EAAU,MAAA,EAAQ,oBAAA,IAAwB,8BAAA;AAG5C,EAAA,OAAA,CAAQ,mBAAmB;AACzB,IAAA,IAAI;AAEF,MAAA,IAAI,IAAA,CAAK,OAAO,SAAA,EAAW;AAEzB,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,EAAY;AACtC,QAAA,OAAO,WAAA,CAAY,IAAI,UAAA,CAAW,MAAM,GAAG,QAAQ,CAAA;AAAA,MACrD,CAAA,MAAO;AAEL,QAAA,OAAO,qBAAA,CAAsB,IAAA,CAAK,MAAA,EAAO,EAAG,QAAQ,CAAA;AAAA,MACtD;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,wBAAA,CAAyB,KAAK,CAAA;AAAA,IAChC;AAAA,EACF,CAAA,GAAG;AACL;AAuDA,MAAA,CAAO,iBAAiB,SAAA,EAAW;AAAA,EACjC,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,IAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,OAAOA;AAAS,GAClB;AAAA,EACA,QAAA,EAAU;AAAA,IACR,UAAA,EAAY,IAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,KAAA,EAAO;AAAA;AAEX,CAAC,CAAA;;;;"}
|
package/dist/parseFile.d.ts
CHANGED
|
@@ -3,11 +3,12 @@ import { CSVRecord, ParseBinaryOptions } from './common/types.ts';
|
|
|
3
3
|
* Parse CSV from a {@link !File} to records.
|
|
4
4
|
*
|
|
5
5
|
* @remarks
|
|
6
|
-
* This is an alias for {@link parseBlob} since File extends Blob.
|
|
7
|
-
*
|
|
8
6
|
* This function can parse CSV data from File objects (from file inputs or drag-and-drop).
|
|
9
7
|
* If the File has a type with charset parameter, it will be used for decoding.
|
|
10
8
|
*
|
|
9
|
+
* Unlike {@link parseBlob}, this function automatically sets the file name as the
|
|
10
|
+
* error source for better error reporting (unless explicitly overridden via options).
|
|
11
|
+
*
|
|
11
12
|
* @category Middle-level API
|
|
12
13
|
* @param file - The file to parse
|
|
13
14
|
* @param options - Parsing options
|
package/dist/parseFile.js
CHANGED
|
@@ -1,18 +1,22 @@
|
|
|
1
|
+
import { getOptionsFromFile } from './getOptionsFromFile.js';
|
|
1
2
|
import { parseBlob } from './parseBlob.js';
|
|
3
|
+
import { parseFileToArray } from './parseFileToArray.js';
|
|
4
|
+
import { parseFileToStream } from './parseFileToStream.js';
|
|
2
5
|
|
|
3
6
|
function parseFile(file, options) {
|
|
4
|
-
|
|
7
|
+
const options_ = getOptionsFromFile(file, options);
|
|
8
|
+
return parseBlob(file, options_);
|
|
5
9
|
}
|
|
6
10
|
Object.defineProperties(parseFile, {
|
|
7
11
|
toArray: {
|
|
8
12
|
enumerable: true,
|
|
9
13
|
writable: false,
|
|
10
|
-
value:
|
|
14
|
+
value: parseFileToArray
|
|
11
15
|
},
|
|
12
16
|
toStream: {
|
|
13
17
|
enumerable: true,
|
|
14
18
|
writable: false,
|
|
15
|
-
value:
|
|
19
|
+
value: parseFileToStream
|
|
16
20
|
}
|
|
17
21
|
});
|
|
18
22
|
|
package/dist/parseFile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseFile.js","sources":["../src/parseFile.ts"],"sourcesContent":["import type { CSVRecord, ParseBinaryOptions } from \"./common/types.ts\";\nimport { parseBlob } from \"./parseBlob.ts\";\n\n/**\n * Parse CSV from a {@link !File} to records.\n *\n * @remarks\n * This
|
|
1
|
+
{"version":3,"file":"parseFile.js","sources":["../src/parseFile.ts"],"sourcesContent":["import type { CSVRecord, ParseBinaryOptions } from \"./common/types.ts\";\nimport { getOptionsFromFile } from \"./getOptionsFromFile.ts\";\nimport { parseBlob } from \"./parseBlob.ts\";\nimport { parseFileToArray } from \"./parseFileToArray.ts\";\nimport { parseFileToStream } from \"./parseFileToStream.ts\";\n\n/**\n * Parse CSV from a {@link !File} to records.\n *\n * @remarks\n * This function can parse CSV data from File objects (from file inputs or drag-and-drop).\n * If the File has a type with charset parameter, it will be used for decoding.\n *\n * Unlike {@link parseBlob}, this function automatically sets the file name as the\n * error source for better error reporting (unless explicitly overridden via options).\n *\n * @category Middle-level API\n * @param file - The file to parse\n * @param options - Parsing options\n * @returns Async iterable iterator of records.\n *\n * If you want array of records, use {@link parseFile.toArray} function.\n *\n * @example Parsing CSV from File (input element)\n *\n * ```ts\n * import { parseFile } from 'web-csv-toolbox';\n *\n * const input = document.querySelector('input[type=\"file\"]');\n * input.addEventListener('change', async (event) => {\n * const file = event.target.files[0];\n * for await (const record of parseFile(file)) {\n * console.log(record);\n * }\n * });\n * ```\n *\n * @example Parsing CSV from File (drag-and-drop)\n *\n * ```ts\n * import { parseFile } from 'web-csv-toolbox';\n *\n * dropZone.addEventListener('drop', async (event) => {\n * event.preventDefault();\n * const file = event.dataTransfer.files[0];\n * for await (const record of parseFile(file)) {\n * console.log(record);\n * }\n * });\n * ```\n */\nexport function parseFile<Header extends ReadonlyArray<string>>(\n file: File,\n options?: ParseBinaryOptions<Header>,\n): AsyncIterableIterator<CSVRecord<Header>> {\n const options_ = getOptionsFromFile(file, options);\n return parseBlob(file, options_);\n}\n\nexport declare namespace parseFile {\n /**\n * Parse CSV from a {@link !File} to array of records.\n *\n * @returns Array of records\n *\n * @example Parsing CSV from File\n *\n * ```ts\n * import { parseFile } from 'web-csv-toolbox';\n *\n * const input = document.querySelector('input[type=\"file\"]');\n * input.addEventListener('change', async (event) => {\n * const file = event.target.files[0];\n * const records = await parseFile.toArray(file);\n * console.log(records);\n * });\n * ```\n */\n export function toArray<Header extends ReadonlyArray<string>>(\n file: File,\n options?: ParseBinaryOptions<Header>,\n ): Promise<CSVRecord<Header>[]>;\n /**\n * Parse CSV from a {@link !File} to stream of records.\n *\n * @param file - File to parse\n * @returns Stream of records\n *\n * @example Parsing CSV from File\n *\n * ```ts\n * import { parseFile } from 'web-csv-toolbox';\n *\n * const input = document.querySelector('input[type=\"file\"]');\n * input.addEventListener('change', async (event) => {\n * const file = event.target.files[0];\n * await parseFile.toStream(file)\n * .pipeTo(\n * new WritableStream({\n * write(record) {\n * console.log(record);\n * },\n * }),\n * );\n * });\n * ```\n */\n export function toStream<Header extends ReadonlyArray<string>>(\n file: File,\n options?: ParseBinaryOptions<Header>,\n ): ReadableStream<CSVRecord<Header>>;\n}\n\nObject.defineProperties(parseFile, {\n toArray: {\n enumerable: true,\n writable: false,\n value: parseFileToArray,\n },\n toStream: {\n enumerable: true,\n writable: false,\n value: parseFileToStream,\n },\n});\n"],"names":[],"mappings":";;;;;AAmDO,SAAS,SAAA,CACd,MACA,OAAA,EAC0C;AAC1C,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,IAAA,EAAM,OAAO,CAAA;AACjD,EAAA,OAAO,SAAA,CAAU,MAAM,QAAQ,CAAA;AACjC;AAwDA,MAAA,CAAO,iBAAiB,SAAA,EAAW;AAAA,EACjC,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,IAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,KAAA,EAAO;AAAA,GACT;AAAA,EACA,QAAA,EAAU;AAAA,IACR,UAAA,EAAY,IAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,KAAA,EAAO;AAAA;AAEX,CAAC,CAAA;;;;"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { CSVRecord, ParseBinaryOptions } from './common/types.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Parse CSV from a {@link !File} to array of records.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* This function automatically sets the file name as the error source for better
|
|
7
|
+
* error reporting (unless explicitly overridden via options).
|
|
8
|
+
*
|
|
9
|
+
* @category Middle-level API
|
|
10
|
+
* @param file - The file to parse
|
|
11
|
+
* @param options - Parsing options
|
|
12
|
+
* @returns Promise of array of records
|
|
13
|
+
*
|
|
14
|
+
* @example Parsing CSV from File
|
|
15
|
+
*
|
|
16
|
+
* ```ts
|
|
17
|
+
* import { parseFileToArray } from 'web-csv-toolbox';
|
|
18
|
+
*
|
|
19
|
+
* const input = document.querySelector('input[type="file"]');
|
|
20
|
+
* input.addEventListener('change', async (event) => {
|
|
21
|
+
* const file = event.target.files[0];
|
|
22
|
+
* const records = await parseFileToArray(file);
|
|
23
|
+
* console.log(records);
|
|
24
|
+
* });
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare function parseFileToArray<Header extends ReadonlyArray<string>>(file: File, options?: ParseBinaryOptions<Header>): Promise<CSVRecord<Header>[]>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { parseFile } from './parseFile.js';
|
|
2
|
+
|
|
3
|
+
async function parseFileToArray(file, options) {
|
|
4
|
+
const rows = [];
|
|
5
|
+
for await (const row of parseFile(file, options)) {
|
|
6
|
+
rows.push(row);
|
|
7
|
+
}
|
|
8
|
+
return rows;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export { parseFileToArray };
|
|
12
|
+
//# sourceMappingURL=parseFileToArray.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseFileToArray.js","sources":["../src/parseFileToArray.ts"],"sourcesContent":["import type { CSVRecord, ParseBinaryOptions } from \"./common/types.ts\";\nimport { parseFile } from \"./parseFile.ts\";\n\n/**\n * Parse CSV from a {@link !File} to array of records.\n *\n * @remarks\n * This function automatically sets the file name as the error source for better\n * error reporting (unless explicitly overridden via options).\n *\n * @category Middle-level API\n * @param file - The file to parse\n * @param options - Parsing options\n * @returns Promise of array of records\n *\n * @example Parsing CSV from File\n *\n * ```ts\n * import { parseFileToArray } from 'web-csv-toolbox';\n *\n * const input = document.querySelector('input[type=\"file\"]');\n * input.addEventListener('change', async (event) => {\n * const file = event.target.files[0];\n * const records = await parseFileToArray(file);\n * console.log(records);\n * });\n * ```\n */\nexport async function parseFileToArray<Header extends ReadonlyArray<string>>(\n file: File,\n options?: ParseBinaryOptions<Header>,\n): Promise<CSVRecord<Header>[]> {\n const rows: CSVRecord<Header>[] = [];\n for await (const row of parseFile(file, options)) {\n rows.push(row);\n }\n return rows;\n}\n"],"names":[],"mappings":";;AA4BA,eAAsB,gBAAA,CACpB,MACA,OAAA,EAC8B;AAC9B,EAAA,MAAM,OAA4B,EAAC;AACnC,EAAA,WAAA,MAAiB,GAAA,IAAO,SAAA,CAAU,IAAA,EAAM,OAAO,CAAA,EAAG;AAChD,IAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,EACf;AACA,EAAA,OAAO,IAAA;AACT;;;;"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { CSVRecord, ParseBinaryOptions } from './common/types.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Parse CSV from a {@link !File} to stream of records.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* This function automatically sets the file name as the error source for better
|
|
7
|
+
* error reporting (unless explicitly overridden via options).
|
|
8
|
+
*
|
|
9
|
+
* @category Middle-level API
|
|
10
|
+
* @param file - File to parse
|
|
11
|
+
* @param options - Parsing options
|
|
12
|
+
* @returns Stream of records
|
|
13
|
+
*
|
|
14
|
+
* @example Parsing CSV from File
|
|
15
|
+
*
|
|
16
|
+
* ```ts
|
|
17
|
+
* import { parseFileToStream } from 'web-csv-toolbox';
|
|
18
|
+
*
|
|
19
|
+
* const input = document.querySelector('input[type="file"]');
|
|
20
|
+
* input.addEventListener('change', async (event) => {
|
|
21
|
+
* const file = event.target.files[0];
|
|
22
|
+
* await parseFileToStream(file)
|
|
23
|
+
* .pipeTo(
|
|
24
|
+
* new WritableStream({
|
|
25
|
+
* write(record) {
|
|
26
|
+
* console.log(record);
|
|
27
|
+
* },
|
|
28
|
+
* }),
|
|
29
|
+
* );
|
|
30
|
+
* });
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare function parseFileToStream<Header extends ReadonlyArray<string>>(file: File, options?: ParseBinaryOptions<Header>): ReadableStream<CSVRecord<Header>>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { getOptionsFromFile } from './getOptionsFromFile.js';
|
|
2
|
+
import { parseUint8ArrayStreamToStream } from './parseUint8ArrayStreamToStream.js';
|
|
3
|
+
|
|
4
|
+
function parseFileToStream(file, options) {
|
|
5
|
+
const options_ = getOptionsFromFile(file, options);
|
|
6
|
+
return parseUint8ArrayStreamToStream(file.stream(), options_);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export { parseFileToStream };
|
|
10
|
+
//# sourceMappingURL=parseFileToStream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseFileToStream.js","sources":["../src/parseFileToStream.ts"],"sourcesContent":["import type { CSVRecord, ParseBinaryOptions } from \"./common/types.ts\";\nimport { getOptionsFromFile } from \"./getOptionsFromFile.ts\";\nimport { parseUint8ArrayStreamToStream } from \"./parseUint8ArrayStreamToStream.ts\";\n\n/**\n * Parse CSV from a {@link !File} to stream of records.\n *\n * @remarks\n * This function automatically sets the file name as the error source for better\n * error reporting (unless explicitly overridden via options).\n *\n * @category Middle-level API\n * @param file - File to parse\n * @param options - Parsing options\n * @returns Stream of records\n *\n * @example Parsing CSV from File\n *\n * ```ts\n * import { parseFileToStream } from 'web-csv-toolbox';\n *\n * const input = document.querySelector('input[type=\"file\"]');\n * input.addEventListener('change', async (event) => {\n * const file = event.target.files[0];\n * await parseFileToStream(file)\n * .pipeTo(\n * new WritableStream({\n * write(record) {\n * console.log(record);\n * },\n * }),\n * );\n * });\n * ```\n */\nexport function parseFileToStream<Header extends ReadonlyArray<string>>(\n file: File,\n options?: ParseBinaryOptions<Header>,\n): ReadableStream<CSVRecord<Header>> {\n const options_ = getOptionsFromFile(file, options);\n return parseUint8ArrayStreamToStream(file.stream(), options_);\n}\n"],"names":[],"mappings":";;;AAmCO,SAAS,iBAAA,CACd,MACA,OAAA,EACmC;AACnC,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,IAAA,EAAM,OAAO,CAAA;AACjD,EAAA,OAAO,6BAAA,CAA8B,IAAA,CAAK,MAAA,EAAO,EAAG,QAAQ,CAAA;AAC9D;;;;"}
|
|
@@ -11,10 +11,23 @@ function convertBinaryToString(binary, options) {
|
|
|
11
11
|
`Binary size (${binary.byteLength} bytes) exceeded maximum allowed size of ${maxBinarySize} bytes`
|
|
12
12
|
);
|
|
13
13
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
let decoder;
|
|
15
|
+
try {
|
|
16
|
+
decoder = new TextDecoder(options?.charset, {
|
|
17
|
+
ignoreBOM: options?.ignoreBOM,
|
|
18
|
+
fatal: options?.fatal
|
|
19
|
+
});
|
|
20
|
+
} catch (error) {
|
|
21
|
+
if (error instanceof RangeError || error instanceof TypeError) {
|
|
22
|
+
throw new RangeError(
|
|
23
|
+
`Invalid or unsupported charset: "${options?.charset}". Please specify a valid charset or enable allowNonStandardCharsets option.`
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
return decoder.decode(
|
|
29
|
+
binary instanceof ArrayBuffer ? new Uint8Array(binary) : binary
|
|
30
|
+
);
|
|
18
31
|
}
|
|
19
32
|
|
|
20
33
|
export { convertBinaryToString };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convertBinaryToString.js","sources":["../../src/utils/convertBinaryToString.ts"],"sourcesContent":["import type { BinaryOptions } from \"../common/types.ts\";\n\n/**\n * Default maximum binary size in bytes (100MB).\n */\nconst DEFAULT_MAX_BINARY_SIZE = 100 * 1024 * 1024;\n\n/**\n * Converts a binary string to a string.\n *\n * @param binary - The binary string to convert.\n * @param options - The options for parsing the binary string.\n * @returns The converted string.\n * @throws {RangeError} The given charset is not supported or binary size exceeds the limit.\n * @throws {TypeError} The encoded data was not valid.\n */\nexport function convertBinaryToString(\n binary: Uint8Array | ArrayBuffer,\n options: BinaryOptions,\n): string {\n const maxBinarySize = options?.maxBinarySize ?? DEFAULT_MAX_BINARY_SIZE;\n\n // Validate maxBinarySize\n if (\n !(\n Number.isFinite(maxBinarySize) ||\n maxBinarySize === Number.POSITIVE_INFINITY\n ) ||\n (Number.isFinite(maxBinarySize) && maxBinarySize < 0)\n ) {\n throw new RangeError(\n \"maxBinarySize must be a non-negative number or Number.POSITIVE_INFINITY\",\n );\n }\n\n // Check binary size\n if (Number.isFinite(maxBinarySize) && binary.byteLength > maxBinarySize) {\n throw new RangeError(\n `Binary size (${binary.byteLength} bytes) exceeded maximum allowed size of ${maxBinarySize} bytes`,\n );\n }\n\n
|
|
1
|
+
{"version":3,"file":"convertBinaryToString.js","sources":["../../src/utils/convertBinaryToString.ts"],"sourcesContent":["import type { BinaryOptions } from \"../common/types.ts\";\n\n/**\n * Default maximum binary size in bytes (100MB).\n */\nconst DEFAULT_MAX_BINARY_SIZE = 100 * 1024 * 1024;\n\n/**\n * Converts a binary string to a string.\n *\n * @param binary - The binary string to convert.\n * @param options - The options for parsing the binary string.\n * @returns The converted string.\n * @throws {RangeError} The given charset is not supported or binary size exceeds the limit.\n * @throws {TypeError} The encoded data was not valid.\n */\nexport function convertBinaryToString(\n binary: Uint8Array | ArrayBuffer,\n options: BinaryOptions,\n): string {\n const maxBinarySize = options?.maxBinarySize ?? DEFAULT_MAX_BINARY_SIZE;\n\n // Validate maxBinarySize\n if (\n !(\n Number.isFinite(maxBinarySize) ||\n maxBinarySize === Number.POSITIVE_INFINITY\n ) ||\n (Number.isFinite(maxBinarySize) && maxBinarySize < 0)\n ) {\n throw new RangeError(\n \"maxBinarySize must be a non-negative number or Number.POSITIVE_INFINITY\",\n );\n }\n\n // Check binary size\n if (Number.isFinite(maxBinarySize) && binary.byteLength > maxBinarySize) {\n throw new RangeError(\n `Binary size (${binary.byteLength} bytes) exceeded maximum allowed size of ${maxBinarySize} bytes`,\n );\n }\n\n // Try to create TextDecoder with error handling for invalid charsets\n let decoder: TextDecoder;\n try {\n decoder = new TextDecoder(options?.charset, {\n ignoreBOM: options?.ignoreBOM,\n fatal: options?.fatal,\n });\n } catch (error) {\n // If charset is invalid, provide clear error message\n if (error instanceof RangeError || error instanceof TypeError) {\n throw new RangeError(\n `Invalid or unsupported charset: \"${options?.charset}\". Please specify a valid charset or enable allowNonStandardCharsets option.`,\n );\n }\n throw error;\n }\n\n return decoder.decode(\n binary instanceof ArrayBuffer ? new Uint8Array(binary) : binary,\n );\n}\n"],"names":[],"mappings":"AAKA,MAAM,uBAAA,GAA0B,MAAM,IAAA,GAAO,IAAA;AAWtC,SAAS,qBAAA,CACd,QACA,OAAA,EACQ;AACR,EAAA,MAAM,aAAA,GAAgB,SAAS,aAAA,IAAiB,uBAAA;AAGhD,EAAA,IACE,EACE,MAAA,CAAO,QAAA,CAAS,aAAa,CAAA,IAC7B,aAAA,KAAkB,MAAA,CAAO,iBAAA,CAAA,IAE1B,MAAA,CAAO,QAAA,CAAS,aAAa,CAAA,IAAK,gBAAgB,CAAA,EACnD;AACA,IAAA,MAAM,IAAI,UAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,QAAA,CAAS,aAAa,CAAA,IAAK,MAAA,CAAO,aAAa,aAAA,EAAe;AACvE,IAAA,MAAM,IAAI,UAAA;AAAA,MACR,CAAA,aAAA,EAAgB,MAAA,CAAO,UAAU,CAAA,yCAAA,EAA4C,aAAa,CAAA,MAAA;AAAA,KAC5F;AAAA,EACF;AAGA,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,IAAI,WAAA,CAAY,OAAA,EAAS,OAAA,EAAS;AAAA,MAC1C,WAAW,OAAA,EAAS,SAAA;AAAA,MACpB,OAAO,OAAA,EAAS;AAAA,KACjB,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AAEd,IAAA,IAAI,KAAA,YAAiB,UAAA,IAAc,KAAA,YAAiB,SAAA,EAAW;AAC7D,MAAA,MAAM,IAAI,UAAA;AAAA,QACR,CAAA,iCAAA,EAAoC,SAAS,OAAO,CAAA,4EAAA;AAAA,OACtD;AAAA,IACF;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AAEA,EAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,IACb,MAAA,YAAkB,WAAA,GAAc,IAAI,UAAA,CAAW,MAAM,CAAA,GAAI;AAAA,GAC3D;AACF;;;;"}
|
package/dist/utils/parseMime.js
CHANGED
|
@@ -6,7 +6,9 @@ function parseMime(contentType) {
|
|
|
6
6
|
};
|
|
7
7
|
for (const paramator of parameters) {
|
|
8
8
|
const [key, value] = paramator.split("=");
|
|
9
|
-
|
|
9
|
+
if (value !== void 0) {
|
|
10
|
+
result.parameters[key.trim()] = value.trim();
|
|
11
|
+
}
|
|
10
12
|
}
|
|
11
13
|
return result;
|
|
12
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseMime.js","sources":["../../src/utils/parseMime.ts"],"sourcesContent":["export interface ParseMimeResult {\n type: string;\n parameters: {\n [key: string]: string;\n };\n}\n\nexport function parseMime(contentType: string) {\n const [type, ...parameters] = contentType.split(\";\");\n const result: ParseMimeResult = {\n type: type.trim(),\n parameters: {},\n };\n for (const paramator of parameters) {\n const [key, value] = paramator.split(\"=\");\n result.parameters[key.trim()] = value.trim();\n }\n return result;\n}\n"],"names":[],"mappings":"AAOO,SAAS,UAAU,WAAA,EAAqB;AAC7C,EAAA,MAAM,CAAC,IAAA,EAAM,GAAG,UAAU,CAAA,GAAI,WAAA,CAAY,MAAM,GAAG,CAAA;AACnD,EAAA,MAAM,MAAA,GAA0B;AAAA,IAC9B,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,IAChB,YAAY;AAAC,GACf;AACA,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,MAAM,CAAC,GAAA,EAAK,KAAK,CAAA,GAAI,SAAA,CAAU,MAAM,GAAG,CAAA;
|
|
1
|
+
{"version":3,"file":"parseMime.js","sources":["../../src/utils/parseMime.ts"],"sourcesContent":["export interface ParseMimeResult {\n type: string;\n parameters: {\n [key: string]: string;\n };\n}\n\nexport function parseMime(contentType: string) {\n const [type, ...parameters] = contentType.split(\";\");\n const result: ParseMimeResult = {\n type: type.trim(),\n parameters: {},\n };\n for (const paramator of parameters) {\n const [key, value] = paramator.split(\"=\");\n // Skip parameters without values to prevent undefined.trim() errors\n if (value !== undefined) {\n result.parameters[key.trim()] = value.trim();\n }\n }\n return result;\n}\n"],"names":[],"mappings":"AAOO,SAAS,UAAU,WAAA,EAAqB;AAC7C,EAAA,MAAM,CAAC,IAAA,EAAM,GAAG,UAAU,CAAA,GAAI,WAAA,CAAY,MAAM,GAAG,CAAA;AACnD,EAAA,MAAM,MAAA,GAA0B;AAAA,IAC9B,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,IAChB,YAAY;AAAC,GACf;AACA,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,MAAM,CAAC,GAAA,EAAK,KAAK,CAAA,GAAI,SAAA,CAAU,MAAM,GAAG,CAAA;AAExC,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,MAAA,CAAO,WAAW,GAAA,CAAI,IAAA,EAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AAAA,IAC7C;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;;;;"}
|