web-csv-toolbox 0.12.0-next-6e838bd89dfc6fa10aadf1cf5596847051f0fa22 → 0.12.0-next-b221fc714faa4b33d33a3349982a1608d8a19b2f
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 +3 -22
- package/dist/{types/Lexer.d.ts → Lexer.d.ts} +1 -1
- package/dist/Lexer.js.map +1 -0
- package/dist/LexerTransformer.js.map +1 -0
- package/dist/RecordAssembler.js.map +1 -0
- package/dist/RecordAssemblerTransformer.js.map +1 -0
- package/dist/_virtual/web_csv_toolbox_wasm_bg.wasm.js +4 -0
- package/dist/assertCommonOptions.js.map +1 -0
- package/dist/common/constants.js.map +1 -0
- package/dist/common/errors.js.map +1 -0
- package/dist/commonParseErrorHandling.js.map +1 -0
- package/dist/constants.js.map +1 -0
- package/dist/{types/escapeField.d.ts → escapeField.d.ts} +1 -1
- package/dist/getOptionsFromResponse.js.map +1 -0
- package/dist/loadWASM.js.map +1 -0
- package/dist/loadWASM.web.js.map +1 -0
- package/dist/parse.js.map +1 -0
- package/dist/parseBinary.js.map +1 -0
- package/dist/parseBinaryToArraySync.js.map +1 -0
- package/dist/parseBinaryToIterableIterator.js.map +1 -0
- package/dist/parseBinaryToStream.js.map +1 -0
- package/dist/parseResponse.js.map +1 -0
- package/dist/parseResponseToStream.js.map +1 -0
- package/dist/parseString.js.map +1 -0
- package/dist/parseStringStream.js.map +1 -0
- package/dist/parseStringStreamToStream.js.map +1 -0
- package/dist/parseStringToArraySync.js.map +1 -0
- package/dist/parseStringToArraySyncWASM.js.map +1 -0
- package/dist/parseStringToIterableIterator.js.map +1 -0
- package/dist/parseStringToStream.js.map +1 -0
- package/dist/parseUint8ArrayStream.js.map +1 -0
- package/dist/parseUint8ArrayStreamToStream.js.map +1 -0
- package/dist/utils/convertBinaryToString.js.map +1 -0
- package/dist/utils/convertIterableIteratorToAsync.js.map +1 -0
- package/dist/utils/convertStreamToAsyncIterableIterator.js.map +1 -0
- package/dist/utils/convertThisAsyncIterableIteratorToArray.js.map +1 -0
- package/dist/utils/escapeRegExp.js.map +1 -0
- package/dist/utils/parseMime.js.map +1 -0
- package/dist/utils/pipeline.js.map +1 -0
- package/dist/web_csv_toolbox_wasm_bg.wasm +0 -0
- package/package.json +15 -32
- package/dist/cjs/Lexer.cjs +0 -2
- package/dist/cjs/Lexer.cjs.map +0 -1
- package/dist/cjs/LexerTransformer.cjs +0 -2
- package/dist/cjs/LexerTransformer.cjs.map +0 -1
- package/dist/cjs/RecordAssembler.cjs +0 -2
- package/dist/cjs/RecordAssembler.cjs.map +0 -1
- package/dist/cjs/RecordAssemblerTransformer.cjs +0 -2
- package/dist/cjs/RecordAssemblerTransformer.cjs.map +0 -1
- package/dist/cjs/_virtual/_web-csv-toolbox-wasm.cjs +0 -2
- package/dist/cjs/_virtual/_web-csv-toolbox-wasm.cjs.map +0 -1
- package/dist/cjs/_virtual/web_csv_toolbox_wasm_bg.wasm.cjs +0 -2
- package/dist/cjs/_virtual/web_csv_toolbox_wasm_bg.wasm.cjs.map +0 -1
- package/dist/cjs/assertCommonOptions.cjs +0 -2
- package/dist/cjs/assertCommonOptions.cjs.map +0 -1
- package/dist/cjs/common/constants.cjs +0 -2
- package/dist/cjs/common/constants.cjs.map +0 -1
- package/dist/cjs/common/errors.cjs +0 -2
- package/dist/cjs/common/errors.cjs.map +0 -1
- package/dist/cjs/commonParseErrorHandling.cjs +0 -2
- package/dist/cjs/commonParseErrorHandling.cjs.map +0 -1
- package/dist/cjs/constants.cjs +0 -2
- package/dist/cjs/constants.cjs.map +0 -1
- package/dist/cjs/getOptionsFromResponse.cjs +0 -2
- package/dist/cjs/getOptionsFromResponse.cjs.map +0 -1
- package/dist/cjs/loadWASM.cjs +0 -2
- package/dist/cjs/loadWASM.cjs.map +0 -1
- package/dist/cjs/loadWASM.web.cjs +0 -2
- package/dist/cjs/loadWASM.web.cjs.map +0 -1
- package/dist/cjs/parse.cjs +0 -2
- package/dist/cjs/parse.cjs.map +0 -1
- package/dist/cjs/parseBinary.cjs +0 -2
- package/dist/cjs/parseBinary.cjs.map +0 -1
- package/dist/cjs/parseBinaryToArraySync.cjs +0 -2
- package/dist/cjs/parseBinaryToArraySync.cjs.map +0 -1
- package/dist/cjs/parseBinaryToIterableIterator.cjs +0 -2
- package/dist/cjs/parseBinaryToIterableIterator.cjs.map +0 -1
- package/dist/cjs/parseBinaryToStream.cjs +0 -2
- package/dist/cjs/parseBinaryToStream.cjs.map +0 -1
- package/dist/cjs/parseResponse.cjs +0 -2
- package/dist/cjs/parseResponse.cjs.map +0 -1
- package/dist/cjs/parseResponseToStream.cjs +0 -2
- package/dist/cjs/parseResponseToStream.cjs.map +0 -1
- package/dist/cjs/parseString.cjs +0 -2
- package/dist/cjs/parseString.cjs.map +0 -1
- package/dist/cjs/parseStringStream.cjs +0 -2
- package/dist/cjs/parseStringStream.cjs.map +0 -1
- package/dist/cjs/parseStringStreamToStream.cjs +0 -2
- package/dist/cjs/parseStringStreamToStream.cjs.map +0 -1
- package/dist/cjs/parseStringToArraySync.cjs +0 -2
- package/dist/cjs/parseStringToArraySync.cjs.map +0 -1
- package/dist/cjs/parseStringToArraySyncWASM.cjs +0 -2
- package/dist/cjs/parseStringToArraySyncWASM.cjs.map +0 -1
- package/dist/cjs/parseStringToIterableIterator.cjs +0 -2
- package/dist/cjs/parseStringToIterableIterator.cjs.map +0 -1
- package/dist/cjs/parseStringToStream.cjs +0 -2
- package/dist/cjs/parseStringToStream.cjs.map +0 -1
- package/dist/cjs/parseUint8ArrayStream.cjs +0 -2
- package/dist/cjs/parseUint8ArrayStream.cjs.map +0 -1
- package/dist/cjs/parseUint8ArrayStreamToStream.cjs +0 -2
- package/dist/cjs/parseUint8ArrayStreamToStream.cjs.map +0 -1
- package/dist/cjs/utils/convertBinaryToString.cjs +0 -2
- package/dist/cjs/utils/convertBinaryToString.cjs.map +0 -1
- package/dist/cjs/utils/convertIterableIteratorToAsync.cjs +0 -2
- package/dist/cjs/utils/convertIterableIteratorToAsync.cjs.map +0 -1
- package/dist/cjs/utils/convertStreamToAsyncIterableIterator.cjs +0 -2
- package/dist/cjs/utils/convertStreamToAsyncIterableIterator.cjs.map +0 -1
- package/dist/cjs/utils/convertThisAsyncIterableIteratorToArray.cjs +0 -2
- package/dist/cjs/utils/convertThisAsyncIterableIteratorToArray.cjs.map +0 -1
- package/dist/cjs/utils/escapeRegExp.cjs +0 -2
- package/dist/cjs/utils/escapeRegExp.cjs.map +0 -1
- package/dist/cjs/utils/parseMime.cjs +0 -2
- package/dist/cjs/utils/parseMime.cjs.map +0 -1
- package/dist/cjs/utils/pipeline.cjs +0 -2
- package/dist/cjs/utils/pipeline.cjs.map +0 -1
- package/dist/cjs/web-csv-toolbox.cjs +0 -2
- package/dist/cjs/web-csv-toolbox.cjs.map +0 -1
- package/dist/es/Lexer.js.map +0 -1
- package/dist/es/LexerTransformer.js.map +0 -1
- package/dist/es/RecordAssembler.js.map +0 -1
- package/dist/es/RecordAssemblerTransformer.js.map +0 -1
- package/dist/es/_virtual/web_csv_toolbox_wasm_bg.wasm.js +0 -4
- package/dist/es/assertCommonOptions.js.map +0 -1
- package/dist/es/common/constants.js.map +0 -1
- package/dist/es/common/errors.js.map +0 -1
- package/dist/es/commonParseErrorHandling.js.map +0 -1
- package/dist/es/constants.js.map +0 -1
- package/dist/es/getOptionsFromResponse.js.map +0 -1
- package/dist/es/loadWASM.js.map +0 -1
- package/dist/es/loadWASM.web.js.map +0 -1
- package/dist/es/parse.js.map +0 -1
- package/dist/es/parseBinary.js.map +0 -1
- package/dist/es/parseBinaryToArraySync.js.map +0 -1
- package/dist/es/parseBinaryToIterableIterator.js.map +0 -1
- package/dist/es/parseBinaryToStream.js.map +0 -1
- package/dist/es/parseResponse.js.map +0 -1
- package/dist/es/parseResponseToStream.js.map +0 -1
- package/dist/es/parseString.js.map +0 -1
- package/dist/es/parseStringStream.js.map +0 -1
- package/dist/es/parseStringStreamToStream.js.map +0 -1
- package/dist/es/parseStringToArraySync.js.map +0 -1
- package/dist/es/parseStringToArraySyncWASM.js.map +0 -1
- package/dist/es/parseStringToIterableIterator.js.map +0 -1
- package/dist/es/parseStringToStream.js.map +0 -1
- package/dist/es/parseUint8ArrayStream.js.map +0 -1
- package/dist/es/parseUint8ArrayStreamToStream.js.map +0 -1
- package/dist/es/utils/convertBinaryToString.js.map +0 -1
- package/dist/es/utils/convertIterableIteratorToAsync.js.map +0 -1
- package/dist/es/utils/convertStreamToAsyncIterableIterator.js.map +0 -1
- package/dist/es/utils/convertThisAsyncIterableIteratorToArray.js.map +0 -1
- package/dist/es/utils/escapeRegExp.js.map +0 -1
- package/dist/es/utils/parseMime.js.map +0 -1
- package/dist/es/utils/pipeline.js.map +0 -1
- package/dist/web-csv-toolbox.umd.cjs +0 -2
- package/dist/web-csv-toolbox.umd.cjs.map +0 -1
- /package/dist/{es/Lexer.js → Lexer.js} +0 -0
- /package/dist/{types/LexerTransformer.d.ts → LexerTransformer.d.ts} +0 -0
- /package/dist/{es/LexerTransformer.js → LexerTransformer.js} +0 -0
- /package/dist/{types/RecordAssembler.d.ts → RecordAssembler.d.ts} +0 -0
- /package/dist/{es/RecordAssembler.js → RecordAssembler.js} +0 -0
- /package/dist/{types/RecordAssemblerTransformer.d.ts → RecordAssemblerTransformer.d.ts} +0 -0
- /package/dist/{es/RecordAssemblerTransformer.js → RecordAssemblerTransformer.js} +0 -0
- /package/dist/{es/_virtual → _virtual}/_web-csv-toolbox-wasm.js +0 -0
- /package/dist/{es/_virtual → _virtual}/_web-csv-toolbox-wasm.js.map +0 -0
- /package/dist/{es/_virtual → _virtual}/web_csv_toolbox_wasm_bg.wasm.js.map +0 -0
- /package/dist/{types/assertCommonOptions.d.ts → assertCommonOptions.d.ts} +0 -0
- /package/dist/{es/assertCommonOptions.js → assertCommonOptions.js} +0 -0
- /package/dist/{types/common → common}/constants.d.ts +0 -0
- /package/dist/{es/common → common}/constants.js +0 -0
- /package/dist/{types/common → common}/errors.d.ts +0 -0
- /package/dist/{es/common → common}/errors.js +0 -0
- /package/dist/{types/common → common}/types.d.ts +0 -0
- /package/dist/{types/commonParseErrorHandling.d.ts → commonParseErrorHandling.d.ts} +0 -0
- /package/dist/{es/commonParseErrorHandling.js → commonParseErrorHandling.js} +0 -0
- /package/dist/{types/constants.d.ts → constants.d.ts} +0 -0
- /package/dist/{es/constants.js → constants.js} +0 -0
- /package/dist/{types/getOptionsFromResponse.d.ts → getOptionsFromResponse.d.ts} +0 -0
- /package/dist/{es/getOptionsFromResponse.js → getOptionsFromResponse.js} +0 -0
- /package/dist/{types/loadWASM.d.ts → loadWASM.d.ts} +0 -0
- /package/dist/{es/loadWASM.js → loadWASM.js} +0 -0
- /package/dist/{types/loadWASM.web.d.ts → loadWASM.web.d.ts} +0 -0
- /package/dist/{es/loadWASM.web.js → loadWASM.web.js} +0 -0
- /package/dist/{types/parse.d.ts → parse.d.ts} +0 -0
- /package/dist/{es/parse.js → parse.js} +0 -0
- /package/dist/{types/parseBinary.d.ts → parseBinary.d.ts} +0 -0
- /package/dist/{es/parseBinary.js → parseBinary.js} +0 -0
- /package/dist/{types/parseBinaryToArraySync.d.ts → parseBinaryToArraySync.d.ts} +0 -0
- /package/dist/{es/parseBinaryToArraySync.js → parseBinaryToArraySync.js} +0 -0
- /package/dist/{types/parseBinaryToIterableIterator.d.ts → parseBinaryToIterableIterator.d.ts} +0 -0
- /package/dist/{es/parseBinaryToIterableIterator.js → parseBinaryToIterableIterator.js} +0 -0
- /package/dist/{types/parseBinaryToStream.d.ts → parseBinaryToStream.d.ts} +0 -0
- /package/dist/{es/parseBinaryToStream.js → parseBinaryToStream.js} +0 -0
- /package/dist/{types/parseResponse.d.ts → parseResponse.d.ts} +0 -0
- /package/dist/{es/parseResponse.js → parseResponse.js} +0 -0
- /package/dist/{types/parseResponseToStream.d.ts → parseResponseToStream.d.ts} +0 -0
- /package/dist/{es/parseResponseToStream.js → parseResponseToStream.js} +0 -0
- /package/dist/{types/parseString.d.ts → parseString.d.ts} +0 -0
- /package/dist/{es/parseString.js → parseString.js} +0 -0
- /package/dist/{types/parseStringStream.d.ts → parseStringStream.d.ts} +0 -0
- /package/dist/{es/parseStringStream.js → parseStringStream.js} +0 -0
- /package/dist/{types/parseStringStreamToStream.d.ts → parseStringStreamToStream.d.ts} +0 -0
- /package/dist/{es/parseStringStreamToStream.js → parseStringStreamToStream.js} +0 -0
- /package/dist/{types/parseStringToArraySync.d.ts → parseStringToArraySync.d.ts} +0 -0
- /package/dist/{es/parseStringToArraySync.js → parseStringToArraySync.js} +0 -0
- /package/dist/{types/parseStringToArraySyncWASM.d.ts → parseStringToArraySyncWASM.d.ts} +0 -0
- /package/dist/{es/parseStringToArraySyncWASM.js → parseStringToArraySyncWASM.js} +0 -0
- /package/dist/{types/parseStringToIterableIterator.d.ts → parseStringToIterableIterator.d.ts} +0 -0
- /package/dist/{es/parseStringToIterableIterator.js → parseStringToIterableIterator.js} +0 -0
- /package/dist/{types/parseStringToStream.d.ts → parseStringToStream.d.ts} +0 -0
- /package/dist/{es/parseStringToStream.js → parseStringToStream.js} +0 -0
- /package/dist/{types/parseUint8ArrayStream.d.ts → parseUint8ArrayStream.d.ts} +0 -0
- /package/dist/{es/parseUint8ArrayStream.js → parseUint8ArrayStream.js} +0 -0
- /package/dist/{types/parseUint8ArrayStreamToStream.d.ts → parseUint8ArrayStreamToStream.d.ts} +0 -0
- /package/dist/{es/parseUint8ArrayStreamToStream.js → parseUint8ArrayStreamToStream.js} +0 -0
- /package/dist/{types/utils → utils}/SingleValueReadableStream.d.ts +0 -0
- /package/dist/{types/utils → utils}/convertBinaryToString.d.ts +0 -0
- /package/dist/{es/utils → utils}/convertBinaryToString.js +0 -0
- /package/dist/{types/utils → utils}/convertIterableIteratorToAsync.d.ts +0 -0
- /package/dist/{es/utils → utils}/convertIterableIteratorToAsync.js +0 -0
- /package/dist/{types/utils → utils}/convertStreamToAsyncIterableIterator.d.ts +0 -0
- /package/dist/{es/utils → utils}/convertStreamToAsyncIterableIterator.js +0 -0
- /package/dist/{types/utils → utils}/convertThisAsyncIterableIteratorToArray.d.ts +0 -0
- /package/dist/{es/utils → utils}/convertThisAsyncIterableIteratorToArray.js +0 -0
- /package/dist/{types/utils → utils}/escapeRegExp.d.ts +0 -0
- /package/dist/{es/utils → utils}/escapeRegExp.js +0 -0
- /package/dist/{types/utils → utils}/occurrences.d.ts +0 -0
- /package/dist/{types/utils → utils}/parseMime.d.ts +0 -0
- /package/dist/{es/utils → utils}/parseMime.js +0 -0
- /package/dist/{types/utils → utils}/pipeline.d.ts +0 -0
- /package/dist/{es/utils → utils}/pipeline.js +0 -0
- /package/dist/{types/utils → utils}/types.d.ts +0 -0
- /package/dist/{types/web-csv-toolbox-wasm.d.ts → web-csv-toolbox-wasm.d.ts} +0 -0
- /package/dist/{types/web-csv-toolbox.d.ts → web-csv-toolbox.d.ts} +0 -0
- /package/dist/{es/web-csv-toolbox.js → web-csv-toolbox.js} +0 -0
- /package/dist/{es/web-csv-toolbox.js.map → web-csv-toolbox.js.map} +0 -0
package/README.md
CHANGED
|
@@ -82,29 +82,9 @@ $ pnpm add web-csv-toolbox
|
|
|
82
82
|
|
|
83
83
|
### From CDN (unpkg.com) 🌐
|
|
84
84
|
|
|
85
|
-
#### UMD Style 🔄
|
|
86
|
-
|
|
87
|
-
```html
|
|
88
|
-
<script src="https://unpkg.com/web-csv-toolbox"></script>
|
|
89
|
-
<script>
|
|
90
|
-
const csv = `name,age
|
|
91
|
-
Alice,42
|
|
92
|
-
Bob,69`;
|
|
93
|
-
|
|
94
|
-
(async function () {
|
|
95
|
-
for await (const record of CSV.parse(csv)) {
|
|
96
|
-
console.log(record);
|
|
97
|
-
}
|
|
98
|
-
})();
|
|
99
|
-
</script>
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
#### ESModule Style 📦
|
|
104
|
-
|
|
105
85
|
```html
|
|
106
86
|
<script type="module">
|
|
107
|
-
import { parse } from 'https://unpkg.com/web-csv-toolbox
|
|
87
|
+
import { parse } from 'https://unpkg.com/web-csv-toolbox';
|
|
108
88
|
|
|
109
89
|
const csv = `name,age
|
|
110
90
|
Alice,42
|
|
@@ -283,7 +263,8 @@ try {
|
|
|
283
263
|
| Versions | Status |
|
|
284
264
|
| -------- | ------ |
|
|
285
265
|
| 20.x | ✅ |
|
|
286
|
-
|
|
|
266
|
+
| 22.x | ✅ |
|
|
267
|
+
| 24.x | ✅ |
|
|
287
268
|
|
|
288
269
|
|
|
289
270
|
### Works on Browser
|
|
@@ -3,7 +3,7 @@ import { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from './constants.ts';
|
|
|
3
3
|
/**
|
|
4
4
|
* CSV Lexer.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
6
|
+
* Lexer tokenizes CSV data into fields and records.
|
|
7
7
|
*/
|
|
8
8
|
export declare class Lexer<Delimiter extends string = DEFAULT_DELIMITER, Quotation extends string = DEFAULT_QUOTATION> {
|
|
9
9
|
#private;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Lexer.js","sources":["../src/Lexer.ts"],"sourcesContent":["import { assertCommonOptions } from \"./assertCommonOptions.ts\";\nimport { Field, FieldDelimiter, RecordDelimiter } from \"./common/constants.ts\";\nimport { ParseError } from \"./common/errors.ts\";\nimport type {\n AbortSignalOptions,\n CommonOptions,\n Position,\n RecordDelimiterToken,\n Token,\n} from \"./common/types.ts\";\nimport { CRLF, DEFAULT_DELIMITER, DEFAULT_QUOTATION, LF } from \"./constants.ts\";\nimport { escapeRegExp } from \"./utils/escapeRegExp.ts\";\n\n/**\n * CSV Lexer.\n *\n * Lexer tokenizes CSV data into fields and records.\n */\nexport class Lexer<\n Delimiter extends string = DEFAULT_DELIMITER,\n Quotation extends string = DEFAULT_QUOTATION,\n> {\n #delimiter: string;\n #quotation: string;\n #buffer = \"\";\n #flush = false;\n #matcher: RegExp;\n #fieldDelimiterLength: number;\n\n #cursor: Position = {\n line: 1,\n column: 1,\n offset: 0,\n };\n #rowNumber = 1;\n\n #signal?: AbortSignal;\n\n /**\n * Constructs a new Lexer instance.\n * @param options - The common options for the lexer.\n */\n constructor(\n options: CommonOptions<Delimiter, Quotation> & AbortSignalOptions = {},\n ) {\n const {\n delimiter = DEFAULT_DELIMITER,\n quotation = DEFAULT_QUOTATION,\n signal,\n } = options;\n assertCommonOptions({ delimiter, quotation });\n this.#delimiter = delimiter;\n this.#quotation = quotation;\n this.#fieldDelimiterLength = delimiter.length;\n const d = escapeRegExp(delimiter);\n const q = escapeRegExp(quotation);\n this.#matcher = new RegExp(\n `^(?:(?!${q})(?!${d})(?![\\\\r\\\\n]))([\\\\S\\\\s\\\\uFEFF\\\\xA0]+?)(?=${q}|${d}|\\\\r|\\\\n|$)`,\n );\n if (signal) {\n this.#signal = signal;\n }\n }\n\n /**\n * Lexes the given chunk of CSV data.\n * @param chunk - The chunk of CSV data to be lexed.\n * @param buffering - Indicates whether the lexer is buffering or not.\n * @returns An iterable iterator of tokens.\n */\n public lex(chunk: string | null, buffering = false): IterableIterator<Token> {\n if (!buffering) {\n this.#flush = true;\n }\n if (typeof chunk === \"string\" && chunk.length !== 0) {\n this.#buffer += chunk;\n }\n\n return this.#tokens();\n }\n\n /**\n * Flushes the lexer and returns any remaining tokens.\n * @returns An array of tokens.\n */\n public flush(): Token[] {\n this.#flush = true;\n return [...this.#tokens()];\n }\n\n /**\n * Generates tokens from the buffered CSV data.\n * @yields Tokens from the buffered CSV data.\n */\n *#tokens(): Generator<Token> {\n if (this.#flush) {\n // Trim the last CRLF or LF\n if (this.#buffer.endsWith(CRLF)) {\n this.#buffer = this.#buffer.slice(0, -2 /* -CRLF.length */);\n } else if (this.#buffer.endsWith(LF)) {\n this.#buffer = this.#buffer.slice(0, -1 /* -LF.length */);\n }\n }\n let token: Token | null;\n while ((token = this.#nextToken())) {\n yield token;\n }\n }\n\n /**\n * Retrieves the next token from the buffered CSV data.\n * @returns The next token or null if there are no more tokens.\n */\n #nextToken(): Token | null {\n this.#signal?.throwIfAborted();\n if (this.#buffer.length === 0) {\n return null;\n }\n // Buffer is Record Delimiter, defer to the next iteration.\n if (\n this.#flush === false &&\n (this.#buffer === CRLF || this.#buffer === LF)\n ) {\n return null;\n }\n\n // Check for CRLF\n if (this.#buffer.startsWith(CRLF)) {\n this.#buffer = this.#buffer.slice(2);\n const start: Position = { ...this.#cursor };\n this.#cursor.line++;\n this.#cursor.column = 1;\n this.#cursor.offset += 2; // CRLF.length\n const token: RecordDelimiterToken = {\n type: RecordDelimiter,\n value: CRLF,\n location: {\n start,\n end: { ...this.#cursor },\n rowNumber: this.#rowNumber++,\n },\n };\n return token;\n }\n\n // Check for LF\n if (this.#buffer.startsWith(LF)) {\n this.#buffer = this.#buffer.slice(1);\n const start: Position = { ...this.#cursor };\n this.#cursor.line++;\n this.#cursor.column = 1;\n this.#cursor.offset += 1; // LF.length\n const token: RecordDelimiterToken = {\n type: RecordDelimiter,\n value: LF,\n location: {\n start,\n end: { ...this.#cursor },\n rowNumber: this.#rowNumber++,\n },\n };\n return token;\n }\n\n // Check for Delimiter\n if (this.#buffer.startsWith(this.#delimiter)) {\n this.#buffer = this.#buffer.slice(1);\n const start: Position = { ...this.#cursor };\n this.#cursor.column += this.#fieldDelimiterLength;\n this.#cursor.offset += this.#fieldDelimiterLength;\n return {\n type: FieldDelimiter,\n value: this.#delimiter,\n location: {\n start,\n end: { ...this.#cursor },\n rowNumber: this.#rowNumber,\n },\n };\n }\n\n // Check for Quoted String\n if (this.#buffer.startsWith(this.#quotation)) {\n /**\n * Extract Quoted field.\n *\n * The following code is equivalent to the following:\n *\n * If the next character is a quote:\n * - If the character after that is a quote, then append a quote to the value and skip two characters.\n * - Otherwise, return the quoted string.\n * Otherwise, append the character to the value and skip one character.\n *\n * ```plaintext\n * | `i` | `i + 1` | `i + 2` |\n * |------------|------------|----------|\n * | cur | next | | => Variable names\n * | #quotation | #quotation | | => Escaped quote\n * | #quotation | (EOF) | | => Closing quote\n * | #quotation | undefined | | => End of buffer\n * | undefined | | | => End of buffer\n * ```\n */\n let value = \"\";\n let offset = 1; // Skip the opening quote\n let column = 2; // Skip the opening quote\n let line = 0;\n\n // Define variables\n let cur: string = this.#buffer[offset];\n let next: string | undefined = this.#buffer[offset + 1];\n do {\n // If the current character is a quote, check the next characters for closing quotes.\n if (cur === this.#quotation) {\n // If the cur character is a quote and the next character is a quote,\n // then append a quote to the value and skip two characters.\n if (next === this.#quotation) {\n // Append a quote to the value and skip two characters.\n value += this.#quotation;\n offset += 2;\n cur = this.#buffer[offset];\n next = this.#buffer[offset + 1];\n\n // Update the diff\n column += 2;\n continue;\n }\n\n // If the cur character is a quote and the next character is undefined,\n // then return null.\n if (next === undefined && this.#flush === false) {\n return null;\n }\n\n // Otherwise, return the quoted string.\n // Update the buffer and return the token\n offset++;\n this.#buffer = this.#buffer.slice(offset);\n const start: Position = { ...this.#cursor };\n this.#cursor.column += column;\n this.#cursor.offset += offset;\n this.#cursor.line += line;\n return {\n type: Field,\n value,\n location: {\n start,\n end: { ...this.#cursor },\n rowNumber: this.#rowNumber,\n },\n };\n }\n\n // Append the character to the value.\n value += cur;\n\n // Prepare for the next iteration\n if (cur === LF) {\n // If the current character is a LF,\n // then increment the line number and reset the column number.\n line++;\n column = 1;\n } else {\n // Otherwise, increment the column number and offset.\n column++;\n }\n\n offset++;\n cur = next;\n next = this.#buffer[offset + 1];\n } while (cur !== undefined);\n\n if (this.#flush) {\n throw new ParseError(\"Unexpected EOF while parsing quoted field.\", {\n position: { ...this.#cursor },\n });\n }\n return null;\n }\n\n // Check for Unquoted String\n const match = this.#matcher.exec(this.#buffer);\n if (match) {\n // If we're flushing and the match doesn't consume the entire buffer,\n // then return null\n if (this.#flush === false && match[0].length === this.#buffer.length) {\n return null;\n }\n const value = match[1];\n this.#buffer = this.#buffer.slice(value.length);\n const start: Position = { ...this.#cursor };\n this.#cursor.column += value.length;\n this.#cursor.offset += value.length;\n return {\n type: Field,\n value,\n location: {\n start,\n end: { ...this.#cursor },\n rowNumber: this.#rowNumber,\n },\n };\n }\n\n // Otherwise, return null\n return null;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LexerTransformer.js","sources":["../src/LexerTransformer.ts"],"sourcesContent":["import { Lexer } from \"./Lexer.ts\";\nimport type { CommonOptions, Token } from \"./common/types.ts\";\nimport type { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from \"./constants.ts\";\n\n/**\n * A transform stream that converts a stream of tokens into a stream of rows.\n *\n * @category Low-level API\n *\n * @example Parse a CSV with headers by data\n * ```ts\n * new ReadableStream({\n * start(controller) {\n * controller.enqueue(\"name,age\\r\\n\");\n * controller.enqueue(\"Alice,20\\r\\n\");\n * controller.close();\n * }\n * })\n * .pipeThrough(new LexerTransformer())\n * .pipeTo(new WritableStream({ write(tokens) {\n * for (const token of tokens) {\n * console.log(token);\n * }\n * }}));\n * // { type: Field, value: \"name\", location: {...} }\n * // { type: FieldDelimiter, value: \",\", location: {...} }\n * // { type: Field, value: \"age\", location: {...} }\n * // { type: RecordDelimiter, value: \"\\r\\n\", location: {...} }\n * // { type: Field, value: \"Alice\", location: {...} }\n * // { type: FieldDelimiter, value: \",\", location: {...} }\n * // { type: Field, value: \"20\" }\n * // { type: RecordDelimiter, value: \"\\r\\n\", location: {...} }\n * ```\n */\nexport class LexerTransformer<\n Delimiter extends string = DEFAULT_DELIMITER,\n Quotation extends string = DEFAULT_QUOTATION,\n> extends TransformStream<string, Token[]> {\n public readonly lexer: Lexer<Delimiter, Quotation>;\n constructor(options: CommonOptions<Delimiter, Quotation> = {}) {\n super({\n transform: (chunk, controller) => {\n if (chunk.length !== 0) {\n try {\n controller.enqueue([...this.lexer.lex(chunk, true)]);\n } catch (error) {\n controller.error(error);\n }\n }\n },\n flush: (controller) => {\n try {\n controller.enqueue(this.lexer.flush());\n } catch (error) {\n controller.error(error);\n }\n },\n });\n this.lexer = new Lexer(options);\n }\n}\n"],"names":[],"mappings":";;AAkCO,MAAM,yBAGH,eAAiC,CAAA;AAAA,EACzB,KAAA;AAAA,EAChB,WAAA,CAAY,OAA+C,GAAA,EAAI,EAAA;AAC7D,IAAM,KAAA,CAAA;AAAA,MACJ,SAAA,EAAW,CAAC,KAAA,EAAO,UAAe,KAAA;AAChC,QAAI,IAAA,KAAA,CAAM,WAAW,CAAG,EAAA;AACtB,UAAI,IAAA;AACF,YAAW,UAAA,CAAA,OAAA,CAAQ,CAAC,GAAG,IAAA,CAAK,MAAM,GAAI,CAAA,KAAA,EAAO,IAAI,CAAC,CAAC,CAAA;AAAA,mBAC5C,KAAO,EAAA;AACd,YAAA,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA;AACxB;AACF,OACF;AAAA,MACA,KAAA,EAAO,CAAC,UAAe,KAAA;AACrB,QAAI,IAAA;AACF,UAAA,UAAA,CAAW,OAAQ,CAAA,IAAA,CAAK,KAAM,CAAA,KAAA,EAAO,CAAA;AAAA,iBAC9B,KAAO,EAAA;AACd,UAAA,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA;AACxB;AACF,KACD,CAAA;AACD,IAAK,IAAA,CAAA,KAAA,GAAQ,IAAI,KAAA,CAAM,OAAO,CAAA;AAAA;AAElC;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecordAssembler.js","sources":["../src/RecordAssembler.ts"],"sourcesContent":["import { FieldDelimiter, RecordDelimiter } from \"./common/constants.ts\";\nimport { ParseError } from \"./common/errors.ts\";\nimport type {\n CSVRecord,\n RecordAssemblerOptions,\n Token,\n} from \"./common/types.ts\";\n\nexport class RecordAssembler<Header extends ReadonlyArray<string>> {\n #fieldIndex = 0;\n #row: string[] = [];\n #header: Header | undefined;\n #dirty = false;\n #signal?: AbortSignal;\n\n constructor(options: RecordAssemblerOptions<Header> = {}) {\n if (options.header !== undefined && Array.isArray(options.header)) {\n this.#setHeader(options.header);\n }\n if (options.signal) {\n this.#signal = options.signal;\n }\n }\n\n public *assemble(\n tokens: Iterable<Token>,\n flush = true,\n ): IterableIterator<CSVRecord<Header>> {\n for (const token of tokens) {\n this.#signal?.throwIfAborted();\n switch (token.type) {\n case FieldDelimiter:\n this.#fieldIndex++;\n this.#dirty = true;\n break;\n case RecordDelimiter:\n if (this.#header === undefined) {\n this.#setHeader(this.#row as unknown as Header);\n } else {\n if (this.#dirty) {\n yield Object.fromEntries(\n this.#header.map((header, index) => [\n header,\n this.#row.at(index),\n ]),\n ) as unknown as CSVRecord<Header>;\n } else {\n yield Object.fromEntries(\n this.#header.map((header) => [header, \"\"]),\n ) as CSVRecord<Header>;\n }\n }\n // Reset the row fields buffer.\n this.#fieldIndex = 0;\n this.#row = new Array(this.#header?.length).fill(\"\");\n this.#dirty = false;\n break;\n default:\n this.#dirty = true;\n this.#row[this.#fieldIndex] = token.value;\n break;\n }\n }\n\n if (flush) {\n yield* this.flush();\n }\n }\n\n public *flush(): Generator<CSVRecord<Header>> {\n if (this.#header !== undefined) {\n if (this.#dirty) {\n yield Object.fromEntries(\n this.#header\n .filter((v) => v)\n .map((header, index) => [header, this.#row.at(index)]),\n ) as unknown as CSVRecord<Header>;\n }\n }\n }\n\n #setHeader(header: Header) {\n this.#header = header;\n if (this.#header.length === 0) {\n throw new ParseError(\"The header must not be empty.\");\n }\n if (new Set(this.#header).size !== this.#header.length) {\n throw new ParseError(\"The header must not contain duplicate fields.\");\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecordAssemblerTransformer.js","sources":["../src/RecordAssemblerTransformer.ts"],"sourcesContent":["import { RecordAssembler } from \"./RecordAssembler.ts\";\nimport type {\n CSVRecord,\n RecordAssemblerOptions,\n Token,\n} from \"./common/types.ts\";\n\n/**\n * A transform stream that converts a stream of tokens into a stream of rows.\n * @template Header The type of the header row.\n * @param options The options for the parser.\n *\n * @category Low-level API\n *\n * @example Parse a CSV with headers by data\n * ```ts\n * new ReadableStream({\n * start(controller) {\n * controller.enqueue(\"name,age\\r\\n\");\n * controller.enqueue(\"Alice,20\\r\\n\");\n * controller.enqueue(\"Bob,25\\r\\n\");\n * controller.enqueue(\"Charlie,30\\r\\n\");\n * controller.close();\n * })\n * .pipeThrough(new LexerTransformer())\n * .pipeThrough(new RecordAssemblerTransformer())\n * .pipeTo(new WritableStream({ write(row) { console.log(row); }}));\n * // { name: \"Alice\", age: \"20\" }\n * // { name: \"Bob\", age: \"25\" }\n * // { name: \"Charlie\", age: \"30\" }\n * ```\n *\n * @example Parse a CSV with headers by options\n * ```ts\n * new ReadableStream({\n * start(controller) {\n * controller.enqueue(\"Alice,20\\r\\n\");\n * controller.enqueue(\"Bob,25\\r\\n\");\n * controller.enqueue(\"Charlie,30\\r\\n\");\n * controller.close();\n * }\n * })\n * .pipeThrough(new LexerTransformer())\n * .pipeThrough(new RecordAssemblerTransformer({ header: [\"name\", \"age\"] }))\n * .pipeTo(new WritableStream({ write(row) { console.log(row); }}));\n * // { name: \"Alice\", age: \"20\" }\n * // { name: \"Bob\", age: \"25\" }\n * // { name: \"Charlie\", age: \"30\" }\n * ```\n */\nexport class RecordAssemblerTransformer<\n Header extends ReadonlyArray<string>,\n> extends TransformStream<Token[], CSVRecord<Header>> {\n public readonly assembler: RecordAssembler<Header>;\n\n constructor(options: RecordAssemblerOptions<Header> = {}) {\n super({\n transform: (tokens, controller) => {\n try {\n for (const token of this.assembler.assemble(tokens, false)) {\n controller.enqueue(token);\n }\n } catch (error) {\n controller.error(error);\n }\n },\n flush: (controller) => {\n try {\n for (const token of this.assembler.flush()) {\n controller.enqueue(token);\n }\n } catch (error) {\n controller.error(error);\n }\n },\n });\n this.assembler = new RecordAssembler(options);\n }\n}\n"],"names":[],"mappings":";;AAkDO,MAAM,mCAEH,eAA4C,CAAA;AAAA,EACpC,SAAA;AAAA,EAEhB,WAAA,CAAY,OAA0C,GAAA,EAAI,EAAA;AACxD,IAAM,KAAA,CAAA;AAAA,MACJ,SAAA,EAAW,CAAC,MAAA,EAAQ,UAAe,KAAA;AACjC,QAAI,IAAA;AACF,UAAA,KAAA,MAAW,SAAS,IAAK,CAAA,SAAA,CAAU,QAAS,CAAA,MAAA,EAAQ,KAAK,CAAG,EAAA;AAC1D,YAAA,UAAA,CAAW,QAAQ,KAAK,CAAA;AAAA;AAC1B,iBACO,KAAO,EAAA;AACd,UAAA,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA;AACxB,OACF;AAAA,MACA,KAAA,EAAO,CAAC,UAAe,KAAA;AACrB,QAAI,IAAA;AACF,UAAA,KAAA,MAAW,KAAS,IAAA,IAAA,CAAK,SAAU,CAAA,KAAA,EAAS,EAAA;AAC1C,YAAA,UAAA,CAAW,QAAQ,KAAK,CAAA;AAAA;AAC1B,iBACO,KAAO,EAAA;AACd,UAAA,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA;AACxB;AACF,KACD,CAAA;AACD,IAAK,IAAA,CAAA,SAAA,GAAY,IAAI,eAAA,CAAgB,OAAO,CAAA;AAAA;AAEhD;;;;"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
const dataURL = "data:application/wasm;base64,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wAAQewALqCYDCX8HfgF8AkACQAJAAkACQAJAAkACQCAALQAAQQFrDgUBAgMEBQALIAEoAgAiACgCACAAKAIIIgJrQQNNBEAgACACQQRBAUEBEDUgACgCCCECCyAAIAJBBGo2AgggACgCBCACakHu6rHjBjYAAAwFCyABKAIAIQEgAC0AAUUEQCABKAIAIAEoAggiAGtBBE0EQCABIABBBUEBQQEQNSABKAIIIQALIAEgAEEFajYCCCABKAIEIABqIgBBuI/AACgAADYAACAAQQRqQbyPwAAtAAA6AABBAA8LIAEoAgAgASgCCCIAa0EDTQRAIAEgAEEEQQFBARA1IAEoAgghAAsgASAAQQRqNgIIIAEoAgQgAGpB9OTVqwY2AAAMBAsjAEEwayIFJAAgASgCACEDAkACQAJAAkACQAJAIABBCGoiACgCAEEBaw4CAQIAC0EUIQIgACkDCCILQpDOAFQEQCALIQwMBAsDQCAFQQhqIAJqIgBBBGsgCyALQpDOAIAiDEKQzgB+faciAUH//wNxQeQAbiIEQQF0LwCokUA7AAAgAEECayABIARB5ABsa0H//wNxQQF0LwCokUA7AAAgAkEEayECIAtC/8HXL1YgDCELDQALDAMLQRQhAiAAKQMIIg4gDkI/hyILhSALfSILQpDOAFQEQCALIQwMAgsDQCAFQQhqIAJqIgBBBGsgCyALQpDOAIAiDEKQzgB+faciAUH//wNxQeQAbiIEQQF0LwCokUA7AAAgAEECayABIARB5ABsa0H//wNxQQF0LwCokUA7AAAgAkEEayECIAtC/8HXL1YgDCELDQALDAELIAArAwgiEr1C////////////AINCgICAgICAgPj/AFoEQCADKAIAIAMoAggiAGtBA00EfyADIABBBEEBQQEQNSADKAIIBSAACyADKAIEakHu6rHjBjYAACADIAMoAghBBGo2AggMAwsgBUEIaiEEIwBBoAJrIgAkACASvSIMQv////////8HgyELIAxCAFMEQCAEQS06AABBASEHCwJAAn8CQAJAAkACQAJAAkACQAJAIAxCNIinQf8PcSIBRSALUHFFBEAgAUECSSALQgBSciECIAtCgICAgICAgAiEIAsgARsiC0IChiEMIAtCAYMhEQJAAkACQCABQbUIa0HMdyABGyIBQQBIBEAgAEGQAmpB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mAMoApgDKAKYAyEBIARBCGsiBA0ACwtBACECCwJAIAEvAZIDIAJLBEAgAiEGIAEhBAwBCwNAIAEoAogCIgQEQCABLwGQAyEGIAFByANBmAMgABtBCBB6IABBAWohACAEIgEvAZIDIAZNDQEMAgsLIAFByANBmAMgABtBCBB6QcyMwAAQewALIAZBAWohAgJAIABFBEAgBCEDDAELIAQgAkECdGpBmANqIQECQCAAQQdxIgJFBEAgACEFDAELIAAhBQNAIAVBAWshBSABKAIAIgNBmANqIQEgAkEBayICDQALC0EAIQIgAEEISQ0AA0AgASgCACgCmAMoApgDKAKYAygCmAMoApgDKAKYAygCmAMiA0GYA2ohASAFQQhrIgUNAAsLIAQgBkEMbGoiASgCjAIiAARAIAFBjAJqKAIEIABBARB6CwJAAkACQAJAIAQgBkEYbGoiAS0AAA4FAwMDAQIACyABQQRqEA4MAgsgASgCBCIARQ0BIAEoAgggAEEBEHoMAQsgAUEEahAuIAEoAgQiAEUNACABKAIIIABBGGxBCBB6C0EAIQEgB0EBayIHDQALDAELIAJFBEAgASEDDAELAkAgAkEHcSIARQRAIAEhAyACIQEMAQsgASEDIAIhAQNAIAFBAWshASADKAKYAyEDIABBAWsiAA0ACwsgAkEISQ0AA0AgAygCmAMoApgDKAKYAygCmAMoApgDKAKYAygCmAMoApgDIQMgAUEIayIBDQALCyADKAKIAiIABH9BACEBA0AgA0HIA0GYAyABG0EIEHogAUEBayEBIAAhAyAAKAKIAiIADQALQcgDQZgDIAEbBUGYAwshASADIAFBCBB6CwuMBgEHfwJAAn8CQCABKAIgIgJFBEAgASgCACABQQA2AgBBAXFFDQMgASgCCCIDIAEoAgQiAg0CGiABKAIMIgFFDQECQCABQQdxIgRFBEAgASECDAELIAEhAgNAIAJBAWshAiADKAKYAyEDIARBAWsiBA0ACwsgAUEISQ0BA0AgAygCmAMoApgDKAKYAygCmAMoApgDKAKYAygCmAMoApgDIQMgAkEIayICDQALDAELIAEgAkEBazYCIAJAIAEoAgBBAUYEQCABKAIEIgMEQCABKAIMIQYgASgCCCECDAILIAEoAgghAwJAIAEoAgwiBUUNAAJAIAVBB3EiBEUEQCAF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IwBBEGsiBCQAQQMhACACLQAAIgIhAyACQQpPBEAgBCACIAJB5ABuIgNB5ABsa0H/AXFBAXQvAKiVQTsADkEBIQALQQAgAiADG0UEQCAAQQFrIgAgBEENamogA0EBdC0AqZVBOgAACyABQQFBAUEAIARBDWogAGpBAyAAaxAQIARBEGokAA8LIwBBEGsiAyQAIAItAAAhAEEAIQIDQCACIANqQQ9qIABBD3FBgJfBAGotAAA6AAAgAkEBayECIAAiBEEEdiEAIARBD0sNAAsgAUEBQYOVwQBBAiACIANqQRBqQQAgAmsQECADQRBqJAAPCyMAQRBrIgMkACACLQAAIQBBACECA0AgAiADakEPaiAAQQ9xQfCWwQBqLQAAOgAAIAJBAWshAiAAIgRBBHYhACAEQQ9LDQALIAFBAUGDlcEAQQIgAiADakEQakEAIAJrEBAgA0EQaiQACzMBAX8jAEEQayICJAAgAiAAKAIANgIMIAFBnJXAAEEPIAJBDGpBjJXAABA2IAJBEGokAAszAQF/IwBBEGsiAiQAIAIgACgCADYCDCABQeSUwABBDSACQQxqQdSUwAAQNiACQRBqJAALOAACQCACQYCAxABGDQAgACACIAEoAhARAABFDQBBAQ8LIANFBEBBAA8LIAAgAyAEIAEoAgwRAQALNQEBfyABKAIIIgJBgICAEHFFBEAgAkGAgIAgcUUEQCAAIAEQIA8LIAAgARBBDwsgACABEEALNQEBfyABKAIIIgJBgICAEHFFBEAgAkGAgIAgcUUEQCAAIAEQIg8LIAAgARA/DwsgACABED4LNQEBfyABKAIIIgJBgICAEHFFBEAgAkGAgIAgcUUEQCAAIAEQHg8LIAAgARA/DwsgACABED4LMAEBfyMAQRBrIgIkACACIAA2AgwgAUH4isAAQQUgAkEMakHoisAAECkgAkEQaiQACyIAAkAgACABEGxFDQAgAARAIAAgARB+IgFFDQELIAEPCwAL+gECAn8BfiMAQRBrIgIkACACQQE7AQwgAiABNgIIIAIgADYCBCMAQRBrIgEkACACQQRqIgApAgAhBCABIAA2AgwgASAENwIEIwBBEGsiACQAIAFBBGoiASgCACICKAIMIQMCQAJAAkACQCACKAIEDgIAAQILIAMNAUEBIQJBACEDDAILIAMNACACKAIAIgIoAgQh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ARB+Ig4NAkEBIAIQawALQQAgDyABQdiKwAAQUgALQQAgASANQciKwAAQUgALIAIEQCAOIAEgAvwKAAALAkAgEUUNACATIAwoAgAiDUkEQEEAIQEMCQsCQAJAAkACQCAIIA0gA0GQAWoQGCIELQAADgUDAwMBAAILIARBBGoQLiAEKAIEIgFFDQIgBCgCCCABQRhsQQgQegwCCyAEKAIEIgFFDQEgBCgCCCABQQEQegwBCyADAn8gBCgCBCIBRQRAQQAhDUEADAELIAMgATYCwAEgA0EANgK8ASADIAE2ArABIANBADYCrAEgAyAEKAIIIgE2AsQBIAMgATYCtAFBASENIAQoAgwLNgLIASADIA02ArgBIAMgDTYCqAEgA0GoAWoQDQsgBCACNgIMIAQgDjYCCCAEIAI2AgQgBEEDOgAAIA9BAUYNAUEBIRBBACEUA0AgAiEBAkACQCAAKAIsIgogACgCKCIETQRAIAogEE0NASAAKAIkIBRqQQRqKAIAIgIgAUkgACgCOCINIAJJcg0NQQAhDSACIAFrIgRBAEgNCyAAKAI0IQogBEUEQEEBIQ4MAwtBASENIARBARB+Ig4NAiAEIQ4MCwtBACAKIARB2IrAABBSAAsgECAKQcCOwAAQQwALIAQEQCAOIAEgCmogBPwKAAALIBAgEkYNASAMIBRqIgooAgAhASAKQQRqKAIAIg0gE0sgASANS3INCQJAAkACQAJAIAEgCGogDSABayADQZABahAYIgktAAAOBQMDAwECAAsCfyAJKAIEIgFFBEBBACEKQQAMAQsgAyABNgLAASADQQA2ArwBIAMgATYCsAEgA0EANgKsASADIAkoAggiATYCxAEgAyABNgK0ASAJKAIMIQpBAQshASADIAo2AsgBIAMgATYCuAEgAyABNgKoASADQagBahANDAILIAkoAgQiAUUNASAJKAIIIAFBARB6DAELIAlBBGoQLiAJKAIEIgFFDQAgCSgCCCABQRhsQQgQegsgCSAENgIMIAkgDjYCCCAJIAQ2AgQgCUEDOgAAIBRBBGohFCAPIBBBAWoiEEcNAAsMAQtB+InAABB7AAsgA0G4AWoiCiADQaABaikDADcDACADQbABaiIEIANBmAFqKQMANwMAIAMgAykDkAE3A6gBIAMoAoQBIhAgAygCfEYEQCMAQRBrIgkkACAJQQRqIANB/ABqIg8oAgAiASAPKAIEQQQgAUEBdCIBIAFBBE0bIgJBCEEYEDIgCSgCBEEBRgRAIAkoAgggCSgCDBBrAAsgCSgCCCEBIA8gAjYCACAPIAE2AgQgCUEQaiQACyADKAKAASAQQRhsaiIBIAMpA6gBNwMAIAFBCGogBCkDADcDACABQRBqIAopAwA3AwAgAyAQQQFqNgKEASAAKAIwIgEEQCAAKAI0IAFBARB6CyAAKAIgIgEEQCAAKAIkIAFBAnRBBBB6CyAAQcAAQQgQeiADIANBiAFqEAMgAygCBCEAIAMoAgAiAkECRw0ACwwHC0EIQcAAEIQBAAsgDiACEGsACyACIBMQawALIAMgADYCqAFBkIDAAEErIANBqAFqQYiKwABBqIrAABA9AAsgDSAOEGsACyABIA0gE0G4isAAEFIACyABIAIgDUHQjsAAEFIACyADKAKMASIBKAIwIgAEQCABKAI0IABBARB6CyABKAIgIgAEQCABKAIkIABBAnRBBBB6CyABQcAAQQgQegJAQYABQQEQfiIABEAgA0EANgKwASADIAA2AqwBIANBgAE2AqgBIAMgA0GoAWo2ApABIANBkAFqIANB/ABqECQiAARAIAMoAqgBIgFFDQIgAygCrAEgAUEBEHoMAgsgAygCrAEhACADKAKoASIRQYCAgIB4Rg0BIAAgAygCsAEQACE0An9BACEGIwBBEGsiCSQAECxBsKrBACgCACEBQayqwQAoAgAhD0GsqsEAQgA3AgBBpKrBACgCACELQaiqwQAoAgAhDkGkqsEAQgQ3AgBBoKrBACgCACECQaCqwQBBADYCAAJAAkAgDiAPRgRAAkAgAiAORgRA0G9BgAEgAiACQYABTRsiCvwPASIEQX9GDQQCQCABRQRAIAQhAQwBCyABIAJqIARHDQULIAlBBGohEEEBIRJBBCEUAkAgCiACIgRqIgKtQgKGIjFCIIhQRQ0AIDGnIgZB/P///wdLBEBBACEGDAELAkACQAJ/IAQEQCALIARBAnRBBCAGEHIMAQsgBkUNASAGQQQQfgsiFA0AIBBBBDYCBAwBCyAQIBQ2AgRBACESC0EIIRQLIBAgFGogBjYCACAQIBI2AgAgCSgCBEEBRg0EIAkoAgghCwwBCyACIA5NDQMLIAsgDkECdGogDkEBaiIONgIAQaSqwQAoAgAhCkGgqsEAKAIAIQYMAQtBBCEKIA4gD00NAQsgCyAPQQJ0aigCACEEQbCqwQAgATYCAEGsqsEAIAQ2AgBBqKrBACAONgIAQaSqwQAgCzYCAEGgqsEAIAI2AgAgBgRAIAogBkECdEEEEHoLIAlBEGokACABIA9qDAELAAsiAiA0JgEgEQRAIAAgEUEBEHoLIANB/ABqEC4gAygCfCIABEAgAygCgAEgAEEYbEEIEHoLIBMEQCAIIBNBARB6CyAVBEAgDCAVQQJ0QQQQegsgAygCWEGwA0EIEHogAygCYCIABEAgAygCXCAAQQEQegsCQCADKAIoIgFBAkYNACADKAI0IgQoAjAiAARAIAQoAjQgAEEBEHoLIAQoAiAiAARAIAQoAiQgAEECdEEEEHoLIARBwABBCBB6IAENACADKAIsIgEoAjAiAARAIAEoAjQgAEEBEHoLIAEoAiAiAARAIAEoAiQgAEECdEEEEHoLIAFBwABBCBB6CyAdBEAgIyAdQQEQegsgA0HQAWokACACDAILQQFBgAEQawALIAMgADYCqAFBkIDAAEErIANBqAFqQYCAwABB6InAABA9AAsiASUBAkACQCABQYQBTwRAIAHQbyYBECwgAUGwqsEAKAIAIgBJDQEgASAAayIAQaiqwQAoAgBPDQFBpKrBACgCACAAQQJ0akGsqsEAKAIANgIAQayqwQAgADYCAAsMAQsACwuaBwEDfyMAQfAAayIFJAAgBSADNgIMIAUgAjYCCAJ/AkACQCABQYECTwRAQf0BIQYDQAJAIAAgBmoiB0EDaiwAAEG/f0wEQCAHQQJqLAAAQb9/TA0BIAZBAmohBgwFCyAGQQNqIQYMBAsgB0EBaiwAAEG/f0oNAiAHLAAAQb9/Sg0DIAZBBGsiBkF9Rw0AC0EAIQYMAgsgBSABNgIUIAUgADYCEEEBDAILIAZBAWohBgsgBSAANgIQIAUgBjYCFEEFQQAgASAGSyIGGyEHQb+ZwQBBASAGGwshBiAFIAc2AhwgBSAGNgIYAkACQCAFIAEgAk8EfyABIANPDQEgAwUgAgs2AiggBUEDNgI0IAVBiJvBADYCMCAFQgM3AjwgBSAFQRhqrUKAgICAgAiENwNYIAUgBUEQaq1CgICAgIAIhDcDUCAFIAVBKGqtQoCAgIDAA4Q3A0gMAQsCfwJAAkACQCACIANNBEAgAkUgASACTXJFBEAgBUEMaiAFQQhqIAAgAmosAABBv39KGygCACEDCyAFIAM2AiAgASADTQ0CQQAhByADRQ0BA0AgACADaiwAAEG/f0oEQCADIQcMAwsgA0EBayIDDQALDAELIAVBBDYCNCAFQeiZwQA2AjAgBUIENwI8IAUgBUEYaq1CgICAgIAIhDcDYCAFIAVBEGqtQoCAgICACIQ3A1ggBSAFQQxqrUKAgICAwAOENwNQIAUgBUEIaq1CgICAgMADhDcDSAwECyABIAdGDQACQCAAIAdqIgIsAAAiA0EASARAIAItAAFBP3EhACADQR9xIQEgA0FfSw0BIAFBBnQgAHIhBgwDCyAFIANB/wFxNgIkQQEMAwsgAi0AAkE/cSAAQQZ0ciEAIANBcEkEQCAAIAFBDHRyIQYMAgsgAUESdEGAgPAAcSACLQADQT9xIABBBnRyciIGQYCAxABHDQELIAQQewALIAUgBjYCJEEBIAZBgAFJDQAaQQIgBkGAEEkNABpBA0EEIAZBgIAESRsLIQAgBSAHNgIoIAUgACAHajYCLCAFQQU2AjQgBUHImsEANgIwIAVCBTcCPCAFIAVBGGqtQoCAgICACIQ3A2ggBSAFQRBqrUKAgICAgAiENwNgIAUgBUEoaq1CgICAgJAIhDcDWCAFIAVBJGqtQoCAgICgCIQ3A1AgBSAFQSBqrUKAgICAwAOENwNICyAFIAVByABqNgI4IAVBMGogBBBfAAsUACAAKAIAIAEgACgCBCgCDBEAAAvnBgEFfwJ/AkACQAJAAkACQAJAAkAgAEEEayIHKAIAIghBeHEiBEEEQQggCEEDcSIFGyABak8EQCAFQQAgAUEnaiIGIARJGw0BAkAgAkEJTwRAIAIgAxAcIgINAUEADAoLQQAhAiADQcz/e0sNCEEQIANBC2pBeHEgA0ELSRshASAAQQhrIQYgBUUEQCAGRSABQYACSXIgBCABa0GAgAhLIAEgBE9ycg0HIAAMCgsgBCAGaiEFAkAgASAESwRAIAVB7K3BACgCAEYNAUHorcEAKAIAIAVHBEAgBSgCBCIIQQJxDQkgCEF4cSIIIARqIgQgAUkNCSAFIAgQHSAEIAFrIgVBEE8EQCAHIAEgBygCAEEBcXJBAnI2AgAgASAGaiIBIAVBA3I2AgQgBCAGaiIEIAQoAgRBAXI2AgQgASAFEBoMCQsgByAEIAcoAgBBAXFyQQJyNgIAIAQgBmoiASABKAIEQQFyNgIEDAgLQeCtwQAoAgAgBGoiBCABSQ0IAkAgBCABayIFQQ9NBEAgByAIQQFxIARyQQJyNgIAIAQgBmoiASABKAIEQQFyNgIEQQAhBUEAIQEMAQsgByABIAhBAXFyQQJyNgIAIAEgBmoiASAFQQFyNgIEIAQgBmoiBCAFNgIAIAQgBCgCBEF+cTYCBAtB6K3BACABNgIAQeCtwQAgBTYCAAwHCyAEIAFrIgRBD00NBiAHIAEgCEEBcXJBAnI2AgAgASAGaiIBIARBA3I2AgQgBSAFKAIEQQFyNgIEIAEgBBAaDAYLQeStwQAoAgAgBGoiBCABSw0EDAYLIAMgASABIANLGyIDBEAgAiAAIAP8CgAACyAHKAIAIgNBeHEiByABQQRBCCADQQNxIgMbakkNAiADRSAGIAdPcg0GQeiGwQBBLkGYh8EAEFMAC0GohsEAQS5B2IbBABBTAAtB6IbBAEEuQZiHwQAQUwALQaiGwQBBLkHYhsEAEFMACyAHIAEgCEEBcXJBAnI2AgAgASAGaiIFIAQgAWsiAUEBcjYCBEHkrcEAIAE2AgBB7K3BACAFNgIACyAGRQ0AIAAMAwsgAxACIgFFDQEgA0F8QXggBygCACICQQNxGyACQXhxaiICIAIgA0sbIgIEQCABIAAgAvwKAAALIAEhAgsgABARCyACCwsQACAAKAIEIAAoAgggARAKCxAAIAAoAgAgACgCBCABEAoLEQAgACgCACAAKAIEIAEQhQELEQAgACgCBCAAKAIIIAEQhQELEAAgASAAKAIAIAAoAgQQbgsTACAAQZiGwQA2AgQgACABNgIACxAAIAEgACgCACAAKAIEEBMLXwEBfwJAAkAgAEEEaygCACICQXhxIgNBBEEIIAJBA3EiAhsgAWpPBEAgAkEAIAMgAUEnaksbDQEgABARDAILQaiGwQBBLkHYhsEAEFMAC0HohsEAQS5BmIfBABBTAAsLDgBBvJzBAEErIAAQUwALDQAgAUH1lMAAQQ4Qbgv1BgEEfwJ/IAAoAgAhACMAQSBrIgIkAAJAAkACQAJAAkACQCAALQAAQQFrDgMBAgMACyACIAAoAgQ2AgQgAkEIaiIAIAFByPnAAEECEGAgAEHc+cAAQQQgAkEEakHM+cAAECMgAkEpOgATQfD5wABBBCACQRNqQeD5wAAQI0EUQQEQfiIARQ0EIABBEGpBvIDBACgAADYAACAAQQhqQbSAwQApAAA3AAAgAEGsgMEAKQAANwAAIAJBFDYCHCACIAA2AhggAkEUNgIUQYT6wABBByACQRRqQfT5wAAQIxBEIQAgAigCFCIBRQ0DIAIoAhggAUEBEHoMAwsgAiAALQABOgAIIAJBFGoiACABKAIAQYv6wABBBCABKAIEKAIMEQEAOgAIIAAgATYCBCAAQQA6AAkgAEEANgIAIAJBCGohBSMAQSBrIgEkACAAKAIAIQQgAAJ/QQEgAC0ACA0AGiAAKAIEIgMtAApBgAFxRQRAQQEgAygCAEGQl8EAQZSXwQAgBBtBAkEBIAQbIAMoAgQoAgwRAQANARogBSADQez5wAAoAgARAAAMAQsgBEUEQEEBIAMoAgBBlZfBAEECIAMoAgQoAgwRAQANARoLIAFBAToADyABQZyXwQA2AhQgASADKQIANwIAIAEgAykCCDcCGCABIAFBD2o2AgggASABNgIQQQEgBSABQRBqQez5wAAoAgARAAANABogASgCEEGSl8EAQQIgASgCFCgCDBEBAAs6AAggACAEQQFqNgIAIAFBIGokACAAIgEtAAghAwJAIAAoAgAiBEUEQCADIQAMAQtBASEAAkAgA0EBcUUEQCABKAIEIQMgBEEBRw0BIAEtAAlBAXFFDQEgAy0ACkGAAXENASADKAIAQZiXwQBBASADKAIEKAIMEQEARQ0BCyABQQE6AAgMAQsgASADKAIAQZeXwQBBASADKAIEKAIMEQEAIgA6AAgLIABBAXEhAAwCCyAAKAIEIQAgAkEUaiIDIAFBj/rAAEEFEGAgA0Hw+cAAQQQgAEEIakHg+cAAECNBhPrAAEEHIABBlPrAABAjEEQhAAwBCyACIAAoAgQiADYCFCABQbT6wABBBkHw+cAAQQQgAEEIakHg+cAAQbr6wABBBSACQRRqQaT6wAAQMyEACyACQSBqJAAgAAwBC0EBQRQQawALCxkAAn8gAUEJTwRAIAEgABAcDAELIAAQAgsLPgACQAJ/IAFBCU8EQCABIAAQHAwBCyAAEAILIgFFDQAgAUEEay0AAEEDcUUgAEVyDQAgAUEAIAD8CwALIAELDQAgAUGwl8AAQQUQbgsNACAAQZSfwAAgARAXCw0AIABBhIHBACABEBcLDAAgACABKQIANwMACxkAIAAgAUGErsEAKAIAIgBBKCAAGxECAAALCgAgAiAAIAEQEwsNACAAQZyXwQAgARAXCwkAIABBADYCAAsL/6UBJABBgIDAAAvVFgEAAAAEAAAABAAAAAIAAABjYWxsZWQgYFJlc3VsdDo6dW53cmFwKClgIG9uIGFuIGBFcnJgIHZhbHVlL3J1c3RjL2YwNGUzZGZjODdkN2UyYjZhZDUzZTdhNTIyNTM4MTJjZDYyZWJhNTAvbGlicmFyeS9hbGxvYy9zcmMvY29sbGVjdGlvbnMvYnRyZWUvbWFwL2VudHJ5LnJzAC9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3NlcmRlX2pzb24tMS4wLjE0MC9zcmMvdmFsdWUvaW5kZXgucnMAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc2VyZGVfanNvbi0xLjAuMTQwL3NyYy9zZXIucnMAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvY3N2LWNvcmUtMC4xLjExL3NyYy9yZWFkZXIucnMAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvY3N2LTEuMy4xL3NyYy9yZWFkZXIucnMAL3J1c3RjL2YwNGUzZGZjODdkN2UyYjZhZDUzZTdhNTIyNTM4MTJjZDYyZWJhNTAvbGlicmFyeS9hbGxvYy9zcmMvc3RyaW5nLnJzAC9ydXN0Yy9mMDRlM2RmYzg3ZDdlMmI2YWQ1M2U3YTUyMjUzODEyY2Q2MmViYTUwL2xpYnJhcnkvYWxsb2Mvc3JjL2NvbGxlY3Rpb25zL2J0cmVlL25hdmlnYXRlLnJzAGxpYnJhcnkvY29yZS9zcmMvdW5pY29kZS9wcmludGFibGUucnMAL3J1c3RjL2YwNGUzZGZjODdkN2UyYjZhZDUzZTdhNTIyNTM4MTJjZDYyZWJhNTAvbGlicmFyeS9hbGxvYy9zcmMvY29sbGVjdGlvbnMvYnRyZWUvbm9kZS5ycwAvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9jc3YtMS4zLjEvc3JjL2J5dGVfcmVjb3JkLnJzAGxpYnJhcnkvY29yZS9zcmMvZm10L21vZC5ycwBsaWJyYXJ5L2FsbG9jL3NyYy9yYXdfdmVjL21vZC5ycwAvcnVzdC9kZXBzL2RsbWFsbG9jLTAuMi4xMC9zcmMvZGxtYWxsb2MucnMAbGlicmFyeS9zdGQvc3JjL2FsbG9jLnJzAC9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2Nzdi1jb3JlLTAuMS4xMS9zcmMvbGliLnJzAC9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL29uY2VfY2VsbC0xLjE5LjAvc3JjL2xpYi5ycwAA3AQQAAoAAAAZAAAANAAAANwEEAAKAAAAFAAAACEAAAADAAAABAAAAAQAAAAEAAAA3AQQAAoAAAARAAAAHQAAANwEEAAKAAAADAAAACEAAABMAxAAXgAAABEBAAA4AAAATAMQAF4AAAD0AQAAFwAAAEwDEABeAAAAtQIAABMAAAAAAAAABAAAAAQAAAAFAAAARXJyb3IAAAAAAAAABAAAAAQAAAAGAAAASW8AAAAAAAAgAAAACAAAAAcAAAAAAAAABAAAAAQAAAAIAAAAVXRmOHBvc2VycgAAAAAAAAgAAAAIAAAACQAAAAAAAAAEAAAABAAAAAoAAABVbmVxdWFsTGVuZ3Roc2V4cGVjdGVkX2xlbmxlblNlZWsAAAAAAAAABAAAAAQAAAALAAAAU2VyaWFsaXplAAAAAAAAAAQAAAAEAAAADAAAAERlc2VyaWFsaXplX19Ob25leGhhdXN0aXZlAABqAhAAXwAAAFgCAAAwAAAATm9uZQAAAAAEAAAABAAAAA0AAABTb21lAAAAABAAAAAIAAAADgAAAAAAAAAEAAAABAAAAA8AAABEZXNlcmlhbGl6ZUVycm9yZmllbGRraW5kTWVzc2FnZVVuc3VwcG9ydGVkVW5leHBlY3RlZEVuZE9mUm93AAAAAAAAAAQAAAAEAAAAEAAAAEludmFsaWRVdGY4AAAAAAAEAAAABAAAABEAAABQYXJzZUJvb2wAAAAAAAAABAAAAAQAAAASAAAAUGFyc2VJbnQAAAAABAAAAAQAAAATAAAAUGFyc2VGbG9hdAAATAMQAF4AAAA0AwAAFwAAAEwDEABeAAAANwMAACIAAAAEARAAXwAAAD8IAABAAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZQQBEABfAAAADQYAABIAAAAEARAAXwAAAEwIAAAzAAAAZmFsc2VcIlxcXGJcZlxuXHJcdABqAhAAXwAAABYCAAAvAAAATAMQAF4AAAD/AQAAJAAAAEwDEABeAAAA9AEAABcAAABMAxAAXgAAACMCAAAZAAAATAMQAF4AAAC1AgAAEwAAAMQBEABZAAAAXAcAADIAAABhc3NlcnRpb24gZmFpbGVkOiBsaW5lID4gMAAATAMQAF4AAAB4AgAACQAAAMQBEABZAAAAagYAAB4AAADEARAAWQAAAGkGAAAgAAAAxAEQAFkAAAAxBQAAMwAAAEwDEABeAAAANAMAABcAAABMAxAAXgAAADcDAAAiAAAAMDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUxNjE3MTgxOTIwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyMzMzNDM1MzYzNzM4Mzk0MDQxNDI0MzQ0NDU0NjQ3NDg0OTUwNTE1MjUzNTQ1NTU2NTc1ODU5NjA2MTYyNjM2NDY1NjY2NzY4Njk3MDcxNzI3Mzc0NzU3Njc3Nzg3OTgwODE4MjgzODQ4NTg2ODc4ODg5OTA5MTkyOTM5NDk1OTY5Nzk4OTkAAAAABAAAAAQAAAAUAAAAAAAAAAQAAAAEAAAAFQAAAFV0ZjhFcnJvcmZpZWxkdmFsaWRfdXBfdG8AAABqAhAAXwAAAMYAAAAnAAAAAAAAAAgAAAAIAAAAFgAAAAAAAAAEAAAABAAAAAoAAABQb3NpdGlvbmJ5dGVsaW5lcmVjb3JkAAAAAAAABAAAAAQAAAAXAAAAZXJyb3JfbGVuTm9uZQAAAAAAAAAEAAAABAAAABgAAABTb21lRW1wdHlJbnZhbGlkRGlnaXRQb3NPdmVyZmxvd05lZ092ZXJmbG93WmVybwAAAAAABAAAAAQAAAAZAAAAUGFyc2VJbnRFcnJvcmtpbmRQYXJzZUJvb2xFcnJvckludmFsaWQAAAAAAAAEAAAABAAAABoAAABQYXJzZUZsb2F0RXJyb3IABQAAAAwAAAALAAAACwAAAAQAAAAoChAALQoQADkKEABEChAATwoQAExhenkgaW5zdGFuY2UgaGFzIHByZXZpb3VzbHkgYmVlbiBwb2lzb25lZAAA1AoQACoAAACJBBAAXQAAAAgDAAAZAAAAcmVlbnRyYW50IGluaXQAABgLEAAOAAAAiQQQAF0AAAB6AgAADQAAAB4AAAAMAAAABAAAAB8AAAAgAAAAIQBB4JbAAAvvCAEAAAAiAAAAYSBEaXNwbGF5IGltcGxlbWVudGF0aW9uIHJldHVybmVkIGFuIGVycm9yIHVuZXhwZWN0ZWRseQAeAhAASwAAAPgKAAAOAAAARXJyb3JFcnJvcigsIGxpbmU6ICwgY29sdW1uOiApAAC1CxAABgAAALsLEAAIAAAAwwsQAAoAAADNCxAAAQAAAEVPRiB3aGlsZSBwYXJzaW5nIGEgbGlzdEVPRiB3aGlsZSBwYXJzaW5nIGFuIG9iamVjdEVPRiB3aGlsZSBwYXJzaW5nIGEgc3RyaW5nRU9GIHdoaWxlIHBhcnNpbmcgYSB2YWx1ZWV4cGVjdGVkIGA6YGV4cGVjdGVkIGAsYCBvciBgXWBleHBlY3RlZCBgLGAgb3IgYH1gZXhwZWN0ZWQgaWRlbnRleHBlY3RlZCB2YWx1ZWV4cGVjdGVkIGAiYGludmFsaWQgZXNjYXBlaW52YWxpZCBudW1iZXJudW1iZXIgb3V0IG9mIHJhbmdlaW52YWxpZCB1bmljb2RlIGNvZGUgcG9pbnRjb250cm9sIGNoYXJhY3RlciAoXHUwMDAwLVx1MDAxRikgZm91bmQgd2hpbGUgcGFyc2luZyBhIHN0cmluZ2tleSBtdXN0IGJlIGEgc3RyaW5naW52YWxpZCB2YWx1ZTogZXhwZWN0ZWQga2V5IHRvIGJlIGEgbnVtYmVyIGluIHF1b3Rlc2Zsb2F0IGtleSBtdXN0IGJlIGZpbml0ZSAoZ290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AAA7AAAAAAEHAgMEBQYICQAAZAEQAF8AAAA1AwAAEgAAAGaehFAUhccbG4tVRGUrplFtXcvWLFDrY3hBpldxG4u5AQAAAAAAAABPcwAAAAAAAAQAAAAEAAAALAAAAGNvZGUAAAAAAQAAAAEAAAAtAAAAa2luZC4AAAAMAAAABAAAAC8AAABtZXNzYWdlS2luZEVycm9yAAAAAAgAAAAEAAAAMAAAAAAAAAAEAAAABAAAADEAAABDdXN0b21lcnJvcmVudGl0eSBub3QgZm91bmRwZXJtaXNzaW9uIGRlbmllZGNvbm5lY3Rpb24gcmVmdXNlZGNvbm5lY3Rpb24gcmVzZXRob3N0IHVucmVhY2hhYmxlbmV0d29yayB1bnJlYWNoYWJsZWNvbm5lY3Rpb24gYWJvcnRlZG5vdCBjb25uZWN0ZWRhZGRyZXNzIGluIHVzZWFkZHJlc3Mgbm90IGF2YWlsYWJsZW5ldHdvcmsgZG93bmJyb2tlbiBwaXBlZW50aXR5IGFscmVhZHkgZXhpc3Rzb3BlcmF0aW9uIHdvdWxkIGJsb2Nrbm90IGEgZGlyZWN0b3J5aXMgYSBkaXJlY3RvcnlkaXJlY3Rvcnkgbm90IGVtcHR5cmVhZC1vbmx5IGZpbGVzeXN0ZW0gb3Igc3RvcmFnZSBtZWRpdW1maWxlc3lzdGVtIGxvb3Agb3IgaW5kaXJlY3Rpb24gbGltaXQgKGUuZy4gc3ltbGluayBsb29wKXN0YWxlIG5ldHdvcmsgZmlsZSBoYW5kbGVpbnZhbGlkIGlucHV0IHBhcmFtZXRlcmludmFsaWQgZGF0YXRpbWVkIG91dHdyaXRlIHplcm9ubyBzdG9yYWdlIHNwYWNlc2VlayBvbiB1bnNlZWthYmxlIGZpbGVxdW90YSBleGNlZWRlZGZpbGUgdG9vIGxhcmdlcmVzb3VyY2UgYnVzeWV4ZWN1dGFibGUgZmlsZSBidXN5ZGVhZGxvY2tjcm9zcy1kZXZpY2UgbGluayBvciByZW5hbWV0b28gbWFueSBsaW5rc2ludmFsaWQgZmlsZW5hbWVhcmd1bWVudCBsaXN0IHRvbyBsb25nb3BlcmF0aW9uIGludGVycnVwdGVkdW5zdXBwb3J0ZWR1bmV4cGVjdGVkIGVuZCBvZiBmaWxlb3V0IG9mIG1lbW9yeWluIHByb2dyZXNzb3RoZXIgZXJyb3J1bmNhdGVnb3JpemVkIGVycm9yb3BlcmF0aW9uIHN1Y2Nlc3NmdWxtZW1vcnkgYWxsb2NhdGlvbiBvZiAgYnl0ZXMgZmFpbGVkAABAQBAAFQAAAFVAEAANAAAAEwQQABgAAABkAQAACQAAAC4AAAAMAAAABAAAADIAAAAzAAAANAAAAAAAAAAIAAAABAAAADUAAAA2AAAANwAAADgAAAA5AAAAEAAAAAQAAAA6AAAAOwAAADwAAAA9AAAAV291bGRCbG9jayAob3MgZXJyb3IgKQAAAQAAAAAAAADeQBAACwAAAOlAEAABAAAATm90Rm91bmRQZXJtaXNzaW9uRGVuaWVkQ29ubmVjdGlvblJlZnVzZWRDb25uZWN0aW9uUmVzZXRIb3N0VW5yZWFjaGFibGVOZXR3b3JrVW5yZWFjaGFibGVDb25uZWN0aW9uQWJvcnRlZE5vdENvbm5lY3RlZEFkZHJJblVzZUFkZHJOb3RBdmFpbGFibGVOZXR3b3JrRG93bkJyb2tlblBpcGVBbHJlYWR5RXhpc3RzTm90QURpcmVjdG9yeUlzQURpcmVjdG9yeURpcmVjdG9yeU5vdEVtcHR5UmVhZE9ubHlGaWxlc3lzdGVtRmlsZXN5c3RlbUxvb3BTdGFsZU5ldHdvcmtGaWxlSGFuZGxlSW52YWxpZElucHV0SW52YWxpZERhdGFUaW1lZE91dFdyaXRlWmVyb1N0b3JhZ2VGdWxsTm90U2Vla2FibGVRdW90YUV4Y2VlZGVkRmlsZVRvb0xhcmdlUmVzb3VyY2VCdXN5RXhlY3V0YWJsZUZpbGVCdXN5RGVhZGxvY2tDcm9zc2VzRGV2aWNlc1Rvb01hbnlMaW5rc0ludmFsaWRGaWxlbmFtZUFyZ3VtZW50TGlzdFRvb0xvbmdJbnRlcnJ1cHRlZFVuc3VwcG9ydGVkVW5leHBlY3RlZEVvZk91dE9mTWVtb3J5SW5Qcm9ncmVzc090aGVyVW5jYXRlZ29yaXplZAAAAAAIAAAABAAAAD4AAABhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA+PSBzaXplICsgbWluX292ZXJoZWFkAADoAxAAKgAAALEEAAAJAAAAYXNzZXJ0aW9uIGZhaWxlZDogcHNpemUgPD0gc2l6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";
|
|
2
|
+
|
|
3
|
+
export { dataURL as default };
|
|
4
|
+
//# sourceMappingURL=web_csv_toolbox_wasm_bg.wasm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertCommonOptions.js","sources":["../src/assertCommonOptions.ts"],"sourcesContent":["import type { CommonOptions } from \"./common/types.ts\";\nimport { CR, LF } from \"./constants.ts\";\n\n/**\n * Asserts that the provided value is a string and satisfies certain conditions.\n * @param value - The value to be checked.\n * @param name - The name of the option.\n * @throws {RangeError} If the value is empty, longer than 1 byte, or includes CR or LF.\n * @throws {TypeError} If the value is not a string.\n */\nfunction assertOptionValue(\n value: string,\n name: string,\n): asserts value is string {\n if (typeof value === \"string\") {\n switch (true) {\n case value.length === 0:\n throw new RangeError(`${name} must not be empty`);\n case value.length > 1:\n throw new RangeError(`${name} must be a single character`);\n case value === LF:\n case value === CR:\n throw new RangeError(`${name} must not include CR or LF`);\n default:\n break;\n }\n } else {\n throw new TypeError(`${name} must be a string`);\n }\n}\n\n/**\n * Asserts that the provided options object contains all the required properties.\n * Throws an error if any required property is missing\n * or if the delimiter and quotation length is not 1 byte character,\n * or if the delimiter is the same as the quotation.\n *\n * @example\n *\n * ```ts\n * assertCommonOptions({\n * quotation: '\"',\n * delimiter: ',',\n * });\n * ```\n *\n * @param options - The options object to be validated.\n * @throws {RangeError} If any required property is missing or if the delimiter is the same as the quotation.\n * @throws {TypeError} If any required property is not a string.\n */\nexport function assertCommonOptions<\n Delimiter extends string,\n Quotation extends string,\n>(\n options: Required<CommonOptions<Delimiter, Quotation>>,\n): asserts options is Required<CommonOptions<Delimiter, Quotation>> {\n for (const name of [\"delimiter\", \"quotation\"] as const) {\n assertOptionValue(options[name], name);\n }\n // @ts-ignore: TS doesn't understand that the values are strings\n if (options.delimiter === options.quotation) {\n throw new RangeError(\n \"delimiter must not be the same as quotation, use different characters\",\n );\n }\n}\n"],"names":[],"mappings":";;AAUA,SAAS,iBAAA,CACP,OACA,IACyB,EAAA;AACzB,EAAI,IAAA,OAAO,UAAU,QAAU,EAAA;AAC7B,IAAA,QAAQ,IAAM;AAAA,MACZ,KAAK,MAAM,MAAW,KAAA,CAAA;AACpB,QAAA,MAAM,IAAI,UAAA,CAAW,CAAG,EAAA,IAAI,CAAoB,kBAAA,CAAA,CAAA;AAAA,MAClD,KAAK,MAAM,MAAS,GAAA,CAAA;AAClB,QAAA,MAAM,IAAI,UAAA,CAAW,CAAG,EAAA,IAAI,CAA6B,2BAAA,CAAA,CAAA;AAAA,MAC3D,KAAK,KAAU,KAAA,EAAA;AAAA,MACf,KAAK,KAAU,KAAA,EAAA;AACb,QAAA,MAAM,IAAI,UAAA,CAAW,CAAG,EAAA,IAAI,CAA4B,0BAAA,CAAA,CAAA;AAExD;AACJ,GACK,MAAA;AACL,IAAA,MAAM,IAAI,SAAA,CAAU,CAAG,EAAA,IAAI,CAAmB,iBAAA,CAAA,CAAA;AAAA;AAElD;AAqBO,SAAS,oBAId,OACkE,EAAA;AAClE,EAAA,KAAA,MAAW,IAAQ,IAAA,CAAC,WAAa,EAAA,WAAW,CAAY,EAAA;AACtD,IAAkB,iBAAA,CAAA,OAAA,CAAQ,IAAI,CAAA,EAAG,IAAI,CAAA;AAAA;AAGvC,EAAI,IAAA,OAAA,CAAQ,SAAc,KAAA,OAAA,CAAQ,SAAW,EAAA;AAC3C,IAAA,MAAM,IAAI,UAAA;AAAA,MACR;AAAA,KACF;AAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../../src/common/constants.ts"],"sourcesContent":["/**\n * FiledDelimiter is a symbol for field delimiter of CSV.\n * @category Constants\n */\nexport const FieldDelimiter = Symbol.for(\"web-csv-toolbox.FieldDelimiter\");\n/**\n * RecordDelimiter is a symbol for record delimiter of CSV.\n * @category Constants\n */\nexport const RecordDelimiter = Symbol.for(\"web-csv-toolbox.RecordDelimiter\");\n/**\n * Field is a symbol for field of CSV.\n * @category Constants\n */\nexport const Field = Symbol.for(\"web-csv-toolbox.Field\");\n"],"names":[],"mappings":"AAIa,MAAA,cAAA,GAAiB,MAAO,CAAA,GAAA,CAAI,gCAAgC;AAK5D,MAAA,eAAA,GAAkB,MAAO,CAAA,GAAA,CAAI,iCAAiC;AAK9D,MAAA,KAAA,GAAQ,MAAO,CAAA,GAAA,CAAI,uBAAuB;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sources":["../../src/common/errors.ts"],"sourcesContent":["import type { Position } from \"./types.js\";\n\n/**\n * Options for creating a parse error.\n */\nexport interface ParseErrorOptions extends ErrorOptions {\n /**\n * The position where the error occurred.\n */\n position?: Position;\n}\n\n/**\n * Error class for parse errors.\n *\n * @remarks\n * This error is thrown when a parsing error occurs.\n * {@link ParseError} is a subclass of {@link !SyntaxError}.\n *\n * This is in reference to the specification\n * that the error thrown when a parse error occurs in the {@link !JSON.parse} function is {@link !SyntaxError}.\n */\nexport class ParseError extends SyntaxError {\n /**\n * The position where the error occurred.\n */\n public position?: Position;\n\n constructor(message?: string, options?: ParseErrorOptions) {\n super(message, { cause: options?.cause });\n this.name = \"ParseError\";\n this.position = options?.position;\n }\n}\n"],"names":[],"mappings":"AAsBO,MAAM,mBAAmB,WAAY,CAAA;AAAA;AAAA;AAAA;AAAA,EAInC,QAAA;AAAA,EAEP,WAAA,CAAY,SAAkB,OAA6B,EAAA;AACzD,IAAA,KAAA,CAAM,OAAS,EAAA,EAAE,KAAO,EAAA,OAAA,EAAS,OAAO,CAAA;AACxC,IAAA,IAAA,CAAK,IAAO,GAAA,YAAA;AACZ,IAAA,IAAA,CAAK,WAAW,OAAS,EAAA,QAAA;AAAA;AAE7B;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commonParseErrorHandling.js","sources":["../src/commonParseErrorHandling.ts"],"sourcesContent":["import { ParseError } from \"./common/errors\";\n\n/**\n * Common error handling for parsing CSV data.\n *\n * @param error - The error to handle.\n * @throws {ParseError} When an error occurs while parsing the CSV data.\n * @throws {RangeError} When an invalid option is provided.\n * @throws {TypeError} When an invalid option is provided.\n */\n\nexport function commonParseErrorHandling(error: unknown): never {\n if (\n error instanceof ParseError ||\n error instanceof RangeError ||\n error instanceof TypeError\n ) {\n throw error;\n }\n throw new ParseError(\"An error occurred while parsing the CSV data.\", {\n cause: error,\n });\n}\n"],"names":[],"mappings":";;AAWO,SAAS,yBAAyB,KAAuB,EAAA;AAC9D,EAAA,IACE,KAAiB,YAAA,UAAA,IACjB,KAAiB,YAAA,UAAA,IACjB,iBAAiB,SACjB,EAAA;AACA,IAAM,MAAA,KAAA;AAAA;AAER,EAAM,MAAA,IAAI,WAAW,+CAAiD,EAAA;AAAA,IACpE,KAAO,EAAA;AAAA,GACR,CAAA;AACH;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../src/constants.ts"],"sourcesContent":["export const CR = \"\\r\";\nexport type CR = typeof CR;\n\nexport const CRLF = \"\\r\\n\";\nexport type CRLF = typeof CRLF;\n\nexport const LF = \"\\n\";\nexport type LF = typeof LF;\n\nexport type Newline = CRLF | CR | LF;\n\n/**\n * COMMA is a symbol for comma(,).\n */\nexport const COMMA = \",\";\n\n/**\n * DOUBLE_QUOTE is a symbol for double quote(\").\n */\nexport const DOUBLE_QUOTE = '\"';\n\nexport const DEFAULT_DELIMITER = COMMA;\nexport type DEFAULT_DELIMITER = typeof DEFAULT_DELIMITER;\n\nexport const DEFAULT_QUOTATION = DOUBLE_QUOTE;\nexport type DEFAULT_QUOTATION = typeof DEFAULT_QUOTATION;\n"],"names":[],"mappings":"AAAO,MAAM,EAAK,GAAA;AAGX,MAAM,IAAO,GAAA;AAGb,MAAM,EAAK,GAAA;AAQX,MAAM,KAAQ,GAAA;AAKd,MAAM,YAAe,GAAA;AAErB,MAAM,iBAAoB,GAAA;AAG1B,MAAM,iBAAoB,GAAA;;;;"}
|
|
@@ -5,7 +5,7 @@ export interface EscapeFieldOptions<Delimiter extends string, Quotation extends
|
|
|
5
5
|
/**
|
|
6
6
|
* Escape the field.
|
|
7
7
|
*
|
|
8
|
-
* DO NOT USE THIS FUNCTION BEFORE
|
|
8
|
+
* DO NOT USE THIS FUNCTION BEFORE ASSERTED BY `{@link assertCommonOptions}`.
|
|
9
9
|
* @param value The field value to escape.
|
|
10
10
|
* @param options The options.
|
|
11
11
|
* @returns The escaped field.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getOptionsFromResponse.js","sources":["../src/getOptionsFromResponse.ts"],"sourcesContent":["import type { ParseBinaryOptions } from \"./common/types.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 {RangeError} - The content type is not supported.\n */\nexport function getOptionsFromResponse<Header extends ReadonlyArray<string>>(\n response: Response,\n options: ParseBinaryOptions<Header> = {},\n): ParseBinaryOptions<Header> {\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 RangeError(`Invalid mime type: \"${contentType}\"`);\n }\n const decomposition =\n (headers.get(\"content-encoding\") as CompressionFormat) ?? undefined;\n const charset = mime.parameters.charset ?? \"utf-8\";\n // TODO: Support header=present and header=absent\n // const header = mime.parameters.header ?? \"present\";\n return {\n decomposition,\n charset,\n ...options,\n };\n}\n"],"names":[],"mappings":";;AAWO,SAAS,sBACd,CAAA,QAAA,EACA,OAAsC,GAAA,EACV,EAAA;AAC5B,EAAM,MAAA,EAAE,SAAY,GAAA,QAAA;AACpB,EAAA,MAAM,WAAc,GAAA,OAAA,CAAQ,GAAI,CAAA,cAAc,CAAK,IAAA,UAAA;AACnD,EAAM,MAAA,IAAA,GAAO,UAAU,WAAW,CAAA;AAClC,EAAI,IAAA,IAAA,CAAK,SAAS,UAAY,EAAA;AAC5B,IAAA,MAAM,IAAI,UAAA,CAAW,CAAuB,oBAAA,EAAA,WAAW,CAAG,CAAA,CAAA,CAAA;AAAA;AAE5D,EAAA,MAAM,aACH,GAAA,OAAA,CAAQ,GAAI,CAAA,kBAAkB,CAA2B,IAAA,MAAA;AAC5D,EAAM,MAAA,OAAA,GAAU,IAAK,CAAA,UAAA,CAAW,OAAW,IAAA,OAAA;AAG3C,EAAO,OAAA;AAAA,IACL,aAAA;AAAA,IACA,OAAA;AAAA,IACA,GAAG;AAAA,GACL;AACF;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadWASM.js","sources":["../src/loadWASM.ts"],"sourcesContent":["import init, { type InitInput } from \"web-csv-toolbox-wasm\";\n\nimport dataURL from \"web-csv-toolbox-wasm/web_csv_toolbox_wasm_bg.wasm\";\n\n/**\n * Load WASM module.\n *\n * This must be called before calling WebAssembly functions.\n *\n * @example\n *\n * ```ts\n * import { loadWASM, parseStringWASM } from \"web-csv-toolbox\";\n *\n * await loadWASM();\n *\n * const csv = \"a,b,c\\n1,2,3\";\n * const parsed = parseStringWASM(csv);\n * ```\n */\nexport async function loadWASM(input?: InitInput | Promise<InitInput>) {\n await init(input ?? dataURL);\n}\n"],"names":["init"],"mappings":";;;AAoBA,eAAsB,SAAS,KAAwC,EAAA;AACrE,EAAM,MAAAA,UAAA,CAAK,SAAS,OAAO,CAAA;AAC7B;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadWASM.web.js","sources":["../src/loadWASM.web.ts"],"sourcesContent":["import init, { type InitInput } from \"web-csv-toolbox-wasm\";\n\n/**\n * Load WASM module.\n *\n * This must be called before calling WebAssembly functions.\n *\n * @example\n *\n * ```ts\n * import { loadWASM, parseStringWASM } from \"web-csv-toolbox\";\n *\n * await loadWASM();\n *\n * const csv = \"a,b,c\\n1,2,3\";\n * const parsed = parseStringWASM(csv);\n * ```\n */\nexport async function loadWASM(input?: InitInput | Promise<InitInput>) {\n await init(input);\n}\n"],"names":["init"],"mappings":";;AAkBA,eAAsB,SAAS,KAAwC,EAAA;AACrE,EAAA,MAAMA,WAAK,KAAK,CAAA;AAClB;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sources":["../src/parse.ts"],"sourcesContent":["import type {\n CSV,\n CSVBinary,\n CSVRecord,\n CSVString,\n ParseBinaryOptions,\n ParseOptions,\n} from \"./common/types.ts\";\nimport type { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from \"./constants.ts\";\nimport { parseBinary } from \"./parseBinary.ts\";\nimport { parseResponse } from \"./parseResponse.ts\";\nimport { parseString } from \"./parseString.ts\";\nimport { parseStringStream } from \"./parseStringStream.ts\";\nimport { parseUint8ArrayStream } from \"./parseUint8ArrayStream.ts\";\nimport * as internal from \"./utils/convertThisAsyncIterableIteratorToArray.ts\";\nimport type { PickCSVHeader } from \"./utils/types.ts\";\n\n/**\n * Parse CSV to records.\n *\n * {@link !String}, {@link !ReadableStream}<string | {@link !Uint8Array}> and {@link !Response} are supported.\n *\n *\n * @typeParam Header Header type like `['name', 'age']`.\n *\n * @param csv CSV string to parse.\n * @param options Parsing options for CSV string parsing.\n * @returns Async iterable iterator of records.\n *\n * If you want array of records, use {@link parse.toArray} function.\n * @category High-level API\n *\n * @remarks\n * {@link parseString}, {@link parseBinary}, {@link parseUint8ArrayStream},\n * {@link parseStringStream} and {@link parseResponse} are used internally.\n *\n * If you known the type of the CSV, it performs better to use them directly.\n *\n * | If you want to parse a... | Use... | Options... |\n * | -------------------------------------------- | ----------------------------- | -------------------------- |\n * | {@link !String} | {@link parseString} | {@link ParseOptions} |\n * | {@link !ReadableStream}<{@link !String}> | {@link parseStringStream} | {@link ParseOptions} |\n * | {@link !Uint8Array} \\| {@link !ArrayBuffer} | {@link parseBinary} | {@link ParseBinaryOptions} |\n * | {@link !ReadableStream}<{@link !Uint8Array}> | {@link parseUint8ArrayStream} | {@link ParseBinaryOptions} |\n * | {@link !Response} | {@link parseResponse} | {@link ParseBinaryOptions} |\n *\n * @example Parsing CSV files from strings\n *\n * ```ts\n * import { parse } from 'web-csv-toolbox';\n *\n * const csv = `name,age\n * Alice,42\n * Bob,69`;\n *\n * for await (const record of parse(csv)) {\n * console.log(record);\n * }\n * // Prints:\n * // { name: 'Alice', age: '42' }\n * // { name: 'Bob', age: '69' }\n * ```\n *\n * @example Parsing CSV files from streams\n *\n * ```ts\n * import { parse } from 'web-csv-toolbox';\n *\n * const csv = `name,age\n * Alice,42\n * Bob,69`;\n *\n * const stream = new ReadableStream({\n * start(controller) {\n * controller.enqueue(csv);\n * controller.close();\n * }\n * });\n *\n * for await (const record of parse(stream)) {\n * console.log(record);\n * }\n * // Prints:\n * // { name: 'Alice', age: '42' }\n * // { name: 'Bob', age: '69' }\n * ```\n *\n *\n * @example Parsing CSV files with headers\n *\n * ```ts\n * import { parse } from 'web-csv-toolbox';\n *\n * // This CSV has no header.\n * const csv = `Alice,42\n * Bob,69`;\n *\n * for await (const record of parse(csv, { header: ['name', 'age'] })) {\n * console.log(record);\n * }\n * // Prints:\n * // { name: 'Alice', age: '42' }\n * // { name: 'Bob', age: '69' }\n * ```\n *\n * @example Parsing CSV files with different delimiters characters\n *\n * ```ts\n * import { parse } from 'web-csv-toolbox';\n *\n * const csv = `name\\tage\n * Alice\\t42\n * Bob\\t69`;\n *\n * for await (const record of parse(csv, { delimiter: '\\t' })) {\n * console.log(record);\n * }\n * // Prints:\n * // { name: 'Alice', age: '42' }\n * // { name: 'Bob', age: '69' }\n * ```\n */\nexport function parse<const CSVSource extends CSVString>(\n csv: CSVSource,\n): AsyncIterableIterator<CSVRecord<PickCSVHeader<CSVSource>>>;\nexport function parse<const Header extends ReadonlyArray<string>>(\n csv: CSVString,\n): AsyncIterableIterator<CSVRecord<Header>>;\nexport function parse<const Header extends ReadonlyArray<string>>(\n csv: CSVString,\n options: ParseOptions<Header>,\n): AsyncIterableIterator<CSVRecord<Header>>;\nexport function parse<\n const CSVSource extends CSVString,\n const Delimiter extends string = DEFAULT_DELIMITER,\n const Quotation extends string = DEFAULT_QUOTATION,\n const Header extends ReadonlyArray<string> = PickCSVHeader<\n CSVSource,\n Delimiter,\n Quotation\n >,\n>(\n csv: CSVSource,\n options: ParseOptions<Header, Delimiter, Quotation>,\n): AsyncIterableIterator<CSVRecord<Header>>;\n/**\n * Parse CSV binary to records.\n *\n * @param csv CSV binary to parse.\n * @param options Parsing options for CSV binary parsing.\n *\n * @example Parsing CSV files from responses\n *\n * ```ts\n * import { parse } from 'web-csv-toolbox';\n *\n * // This CSV data is not gzipped and encoded in utf-8.\n * const response = await fetch('https://example.com/data.csv');\n *\n * for await (const record of parse(response)) {\n * // ...\n * }\n * ```\n *\n * @example Parsing CSV files with options spcialized for binary\n *\n * ```ts\n * import { parse } from 'web-csv-toolbox';\n *\n * // This CSV data is gzipped and encoded in shift-jis and has BOM.\n * const response = await fetch('https://example.com/data.csv.gz');\n *\n * for await (const record of parse(response, {\n * charset: 'shift-jis',\n * ignoreBOM: true,\n * decomposition: 'gzip',\n * })) {\n * // ...\n * }\n * ```\n */\nexport function parse<const Header extends ReadonlyArray<string>>(\n csv: CSVBinary,\n options?: ParseBinaryOptions<Header>,\n): AsyncIterableIterator<CSVRecord<Header>>;\nexport async function* parse<const Header extends ReadonlyArray<string>>(\n csv: CSV,\n options?: ParseBinaryOptions<Header>,\n): AsyncIterableIterator<CSVRecord<Header>> {\n if (typeof csv === \"string\") {\n yield* parseString(csv, options);\n } else if (csv instanceof Uint8Array || csv instanceof ArrayBuffer) {\n yield* parseBinary(csv, options);\n } else if (csv instanceof ReadableStream) {\n const [branch1, branch2] = csv.tee();\n const reader1 = branch1.getReader();\n const { value: firstChunk } = await reader1.read();\n reader1.releaseLock();\n if (typeof firstChunk === \"string\") {\n yield* parseStringStream(branch2 as ReadableStream<string>, options);\n } else if (firstChunk instanceof Uint8Array) {\n yield* parseUint8ArrayStream(\n branch2 as ReadableStream<Uint8Array>,\n options,\n );\n }\n } else if (csv instanceof Response) {\n yield* parseResponse(csv, options);\n }\n}\n\nexport declare namespace parse {\n /**\n * Parse CSV string to array of records,\n * ideal for smaller data sets.\n *\n * @example Parse a CSV as array of records\n *\n * ```ts\n * import { parse } from 'web-csv-toolbox';\n *\n * const csv = `name,age\n * Alice,42\n * Bob,69`;\n *\n * const records = await parse.toArray(csv);\n * console.log(records);\n * // Prints:\n * // [ { name: 'Alice', age: '42' }, { name: 'Bob', age: '69' } ]\n * ```\n */\n export function toArray<Header extends ReadonlyArray<string>>(\n csv: CSVString,\n options?: ParseOptions<Header>,\n ): Promise<CSVRecord<Header>[]>;\n /**\n * Parse CSV string to array of records,\n * ideal for smaller data sets.\n *\n * @example Parse a CSV as array of records\n *\n * ```ts\n * import { parse } from 'web-csv-toolbox';\n *\n * const response = await fetch('https://example.com/data.csv');\n *\n * const records = await parse.toArray(response);\n * console.log(records);\n * ```\n */\n export function toArray<Header extends ReadonlyArray<string>>(\n csv: CSVBinary,\n options?: ParseBinaryOptions<Header>,\n ): Promise<CSVRecord<Header>[]>;\n}\n\nObject.defineProperties(parse, {\n toArray: {\n enumerable: true,\n writable: false,\n value: internal.convertThisAsyncIterableIteratorToArray,\n },\n});\n"],"names":["internal.convertThisAsyncIterableIteratorToArray"],"mappings":";;;;;;;AAyLuB,gBAAA,KAAA,CACrB,KACA,OAC0C,EAAA;AAC1C,EAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AAC3B,IAAO,OAAA,WAAA,CAAY,KAAK,OAAO,CAAA;AAAA,GACtB,MAAA,IAAA,GAAA,YAAe,UAAc,IAAA,GAAA,YAAe,WAAa,EAAA;AAClE,IAAO,OAAA,WAAA,CAAY,KAAK,OAAO,CAAA;AAAA,GACjC,MAAA,IAAW,eAAe,cAAgB,EAAA;AACxC,IAAA,MAAM,CAAC,OAAA,EAAS,OAAO,CAAA,GAAI,IAAI,GAAI,EAAA;AACnC,IAAM,MAAA,OAAA,GAAU,QAAQ,SAAU,EAAA;AAClC,IAAA,MAAM,EAAE,KAAO,EAAA,UAAA,EAAe,GAAA,MAAM,QAAQ,IAAK,EAAA;AACjD,IAAA,OAAA,CAAQ,WAAY,EAAA;AACpB,IAAI,IAAA,OAAO,eAAe,QAAU,EAAA;AAClC,MAAO,OAAA,iBAAA,CAAkB,SAAmC,OAAO,CAAA;AAAA,KACrE,MAAA,IAAW,sBAAsB,UAAY,EAAA;AAC3C,MAAO,OAAA,qBAAA;AAAA,QACL,OAAA;AAAA,QACA;AAAA,OACF;AAAA;AACF,GACF,MAAA,IAAW,eAAe,QAAU,EAAA;AAClC,IAAO,OAAA,aAAA,CAAc,KAAK,OAAO,CAAA;AAAA;AAErC;AA+CA,MAAA,CAAO,iBAAiB,KAAO,EAAA;AAAA,EAC7B,OAAS,EAAA;AAAA,IACP,UAAY,EAAA,IAAA;AAAA,IACZ,QAAU,EAAA,KAAA;AAAA,IACV,OAAOA;AAAS;AAEpB,CAAC,CAAA;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseBinary.js","sources":["../src/parseBinary.ts"],"sourcesContent":["import type { CSVRecord, ParseBinaryOptions } from \"./common/types.ts\";\nimport { parseBinaryToArraySync } from \"./parseBinaryToArraySync.ts\";\nimport { parseBinaryToIterableIterator } from \"./parseBinaryToIterableIterator.ts\";\nimport { parseBinaryToStream } from \"./parseBinaryToStream.ts\";\nimport { convertIterableIteratorToAsync } from \"./utils/convertIterableIteratorToAsync.ts\";\nimport * as internal from \"./utils/convertThisAsyncIterableIteratorToArray.ts\";\n\n/**\n * Parse a binary from an {@link !Uint8Array}.\n *\n * @category Middle-level API\n *\n * @param bytes CSV bytes to parse.\n * @param options Parsing options\n * @returns Async iterable iterator of records.\n *\n * @example Parsing CSV binary\n *\n * ```ts\n * import { parseUint8Array } from 'web-csv-toolbox';\n *\n * const csv = Uint8Array.from([\n * // ...\n * ]);\n *\n * for await (const record of parseUint8Array(csv)) {\n * console.log(record);\n * }\n * ```\n */\nexport function parseBinary<Header extends ReadonlyArray<string>>(\n bytes: Uint8Array | ArrayBuffer,\n options?: ParseBinaryOptions<Header>,\n): AsyncIterableIterator<CSVRecord<Header>> {\n const iterator = parseBinaryToIterableIterator(bytes, options);\n return convertIterableIteratorToAsync(iterator);\n}\n\nexport declare namespace parseBinary {\n /**\n * Parse a binary from an {@link !Uint8Array} to an array of records.\n *\n * @param bytes CSV bytes to parse.\n * @param options Parsing options\n * @returns Array of records\n *\n * @example\n * ```ts\n * import { parseUint8Array } from 'web-csv-toolbox';\n *\n * const csv = Uint8Array.from([\n * // ...\n * ]);\n *\n * const records = await parseUint8Array.toArray(csv);\n * ```\n */\n export function toArray<Header extends ReadonlyArray<string>>(\n bytes: Uint8Array | ArrayBuffer,\n options?: ParseBinaryOptions<Header>,\n ): Promise<CSVRecord<Header>[]>;\n /**\n * Parse a binary from an {@link !Uint8Array} to an array of records.\n *\n * @param bytes CSV bytes to parse.\n * @param options Parsing options\n * @returns Array of records\n * @example\n *\n * ```ts\n * import { parseUint8Array } from 'web-csv-toolbox';\n *\n * const csv = Uint8Array.from([\n * // ...\n * ]);\n *\n * const records = parseUint8Array.toArraySync(csv);\n * ```\n */\n export function toArraySync<Header extends ReadonlyArray<string>>(\n bytes: Uint8Array | ArrayBuffer,\n options?: ParseBinaryOptions<Header>,\n ): CSVRecord<Header>[];\n\n /**\n * Parse a binary from an {@link !Uint8Array} to an iterable iterator of records.\n *\n * @param bytes CSV bytes to parse.\n * @param options Parsing options\n * @returns Async iterable iterator of records.\n * @example\n * ```ts\n * import { parseUint8Array } from 'web-csv-toolbox';\n *\n * const csv = Uint8Array.from([\n * // ...\n * ]);\n *\n * for (const record of parseUint8Array.toIterableIterator(csv)) {\n * console.log(record);\n * }\n * ```\n */\n export function toIterableIterator<Header extends ReadonlyArray<string>>(\n bytes: Uint8Array,\n options?: ParseBinaryOptions<Header>,\n ): IterableIterator<CSVRecord<Header>>;\n\n /**\n * Parse a binary from an {@link !Uint8Array} to a stream of records.\n *\n * @param bytes CSV bytes to parse.\n * @param options Parsing options\n * @returns Stream of records.\n *\n * @example\n *\n * ```ts\n * import { parseUint8Array } from 'web-csv-toolbox';\n *\n * const csv = Uint8Array.from([\n * // ...\n * ]);\n *\n * const stream = parseUint8Array.toStream(csv);\n *\n * await stream.pipeTo(\n * new WritableStream({\n * write(record) {\n * console.log(record);\n * },\n * }),\n * );\n * ```\n */\n export function toStream<Header extends ReadonlyArray<string>>(\n bytes: Uint8Array,\n options?: ParseBinaryOptions<Header>,\n ): ReadableStream<CSVRecord<Header>>;\n}\n\nObject.defineProperties(parseBinary, {\n toArray: {\n enumerable: true,\n writable: false,\n value: internal.convertThisAsyncIterableIteratorToArray,\n },\n toArraySync: {\n enumerable: true,\n writable: false,\n value: parseBinaryToArraySync,\n },\n toIterableIterator: {\n enumerable: true,\n writable: false,\n value: parseBinaryToIterableIterator,\n },\n toStream: {\n enumerable: true,\n writable: false,\n value: parseBinaryToStream,\n },\n});\n"],"names":["internal.convertThisAsyncIterableIteratorToArray"],"mappings":";;;;;;AA8BgB,SAAA,WAAA,CACd,OACA,OAC0C,EAAA;AAC1C,EAAM,MAAA,QAAA,GAAW,6BAA8B,CAAA,KAAA,EAAO,OAAO,CAAA;AAC7D,EAAA,OAAO,+BAA+B,QAAQ,CAAA;AAChD;AAyGA,MAAA,CAAO,iBAAiB,WAAa,EAAA;AAAA,EACnC,OAAS,EAAA;AAAA,IACP,UAAY,EAAA,IAAA;AAAA,IACZ,QAAU,EAAA,KAAA;AAAA,IACV,OAAOA;AAAS,GAClB;AAAA,EACA,WAAa,EAAA;AAAA,IACX,UAAY,EAAA,IAAA;AAAA,IACZ,QAAU,EAAA,KAAA;AAAA,IACV,KAAO,EAAA;AAAA,GACT;AAAA,EACA,kBAAoB,EAAA;AAAA,IAClB,UAAY,EAAA,IAAA;AAAA,IACZ,QAAU,EAAA,KAAA;AAAA,IACV,KAAO,EAAA;AAAA,GACT;AAAA,EACA,QAAU,EAAA;AAAA,IACR,UAAY,EAAA,IAAA;AAAA,IACZ,QAAU,EAAA,KAAA;AAAA,IACV,KAAO,EAAA;AAAA;AAEX,CAAC,CAAA;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseBinaryToArraySync.js","sources":["../src/parseBinaryToArraySync.ts"],"sourcesContent":["import type { CSVRecord, ParseBinaryOptions } from \"./common/types.ts\";\nimport { commonParseErrorHandling } from \"./commonParseErrorHandling.ts\";\nimport { parseStringToArraySync } from \"./parseStringToArraySync.ts\";\nimport { convertBinaryToString } from \"./utils/convertBinaryToString.ts\";\n\nexport function parseBinaryToArraySync<Header extends ReadonlyArray<string>>(\n binary: Uint8Array | ArrayBuffer,\n options: ParseBinaryOptions<Header> = {},\n): CSVRecord<Header>[] {\n try {\n const csv = convertBinaryToString(binary, options);\n return parseStringToArraySync(csv, options);\n } catch (error) {\n commonParseErrorHandling(error);\n }\n}\n"],"names":[],"mappings":";;;;AAKO,SAAS,sBACd,CAAA,MAAA,EACA,OAAsC,GAAA,EACjB,EAAA;AACrB,EAAI,IAAA;AACF,IAAM,MAAA,GAAA,GAAM,qBAAsB,CAAA,MAAA,EAAQ,OAAO,CAAA;AACjD,IAAO,OAAA,sBAAA,CAAuB,KAAK,OAAO,CAAA;AAAA,WACnC,KAAO,EAAA;AACd,IAAA,wBAAA,CAAyB,KAAK,CAAA;AAAA;AAElC;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseBinaryToIterableIterator.js","sources":["../src/parseBinaryToIterableIterator.ts"],"sourcesContent":["import type { CSVRecord, ParseBinaryOptions } from \"./common/types.ts\";\nimport { commonParseErrorHandling } from \"./commonParseErrorHandling.ts\";\nimport { parseStringToIterableIterator } from \"./parseStringToIterableIterator.ts\";\nimport { convertBinaryToString } from \"./utils/convertBinaryToString.ts\";\n\n/**\n * Parses the given binary data into an iterable iterator of CSV records.\n *\n * @param binary - The binary data to parse.\n * @param options - The parse options.\n * @returns An iterable iterator of CSV records.\n * @throws {ParseError} When an error occurs while parsing the CSV data.\n */\nexport function parseBinaryToIterableIterator<\n Header extends ReadonlyArray<string>,\n>(\n binary: Uint8Array | ArrayBuffer,\n options: ParseBinaryOptions<Header> = {},\n): IterableIterator<CSVRecord<Header>> {\n try {\n const csv = convertBinaryToString(binary, options);\n return parseStringToIterableIterator(csv, options);\n } catch (error) {\n commonParseErrorHandling(error);\n }\n}\n"],"names":[],"mappings":";;;;AAaO,SAAS,6BAGd,CAAA,MAAA,EACA,OAAsC,GAAA,EACD,EAAA;AACrC,EAAI,IAAA;AACF,IAAM,MAAA,GAAA,GAAM,qBAAsB,CAAA,MAAA,EAAQ,OAAO,CAAA;AACjD,IAAO,OAAA,6BAAA,CAA8B,KAAK,OAAO,CAAA;AAAA,WAC1C,KAAO,EAAA;AACd,IAAA,wBAAA,CAAyB,KAAK,CAAA;AAAA;AAElC;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseBinaryToStream.js","sources":["../src/parseBinaryToStream.ts"],"sourcesContent":["import type { CSVRecord, ParseBinaryOptions } from \"./common/types.ts\";\nimport { commonParseErrorHandling } from \"./commonParseErrorHandling.ts\";\nimport { parseStringToStream } from \"./parseStringToStream.ts\";\nimport { convertBinaryToString } from \"./utils/convertBinaryToString.ts\";\n\nexport function parseBinaryToStream<Header extends ReadonlyArray<string>>(\n binary: Uint8Array | ArrayBuffer,\n options: ParseBinaryOptions<Header> = {},\n): ReadableStream<CSVRecord<Header>> {\n try {\n const csv = convertBinaryToString(binary, options);\n return parseStringToStream(csv, options);\n } catch (error) {\n commonParseErrorHandling(error);\n }\n}\n"],"names":[],"mappings":";;;;AAKO,SAAS,mBACd,CAAA,MAAA,EACA,OAAsC,GAAA,EACH,EAAA;AACnC,EAAI,IAAA;AACF,IAAM,MAAA,GAAA,GAAM,qBAAsB,CAAA,MAAA,EAAQ,OAAO,CAAA;AACjD,IAAO,OAAA,mBAAA,CAAoB,KAAK,OAAO,CAAA;AAAA,WAChC,KAAO,EAAA;AACd,IAAA,wBAAA,CAAyB,KAAK,CAAA;AAAA;AAElC;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseResponse.js","sources":["../src/parseResponse.ts"],"sourcesContent":["import type { CSVRecord, ParseOptions } from \"./common/types.ts\";\nimport { commonParseErrorHandling } from \"./commonParseErrorHandling.ts\";\nimport { getOptionsFromResponse } from \"./getOptionsFromResponse.ts\";\nimport { parseResponseToStream } from \"./parseResponseToStream.ts\";\nimport { parseUint8ArrayStream } from \"./parseUint8ArrayStream.ts\";\nimport * as internal from \"./utils/convertThisAsyncIterableIteratorToArray.ts\";\n\n/**\n * Parse HTTP Response what contains CSV to records,\n * ideal for smaller data sets.\n *\n * @remarks\n * This function automatically treats response headers.\n *\n * - If `Content-Type` header is not set, it assumes `text/csv`.\n * - If `Content-Type` header is not `text/csv`, it throws an error.\n * - If `Content-Type` header has charset parameter, it uses it for decoding.\n * - If `Content-Encoding` header is set, it decompresses the response.\n * - Should there be any conflicting information between the header and the options, the option's value will take precedence.\n *\n * @category Middle-level API\n * @param response\n * @param options\n * @returns Async iterable iterator of records.\n *\n * If you want array of records, use {@link parseResponse.toArray} function.\n *\n * @example Parsing CSV Response\n *\n * ```ts\n * import { parseResponse } from 'web-csv-toolbox';\n *\n * const response = await fetch('https://example.com/data.csv');\n *\n * for await (const record of parseResponse(response)) {\n * console.log(record);\n * }\n * ```\n */\nexport function parseResponse<Header extends ReadonlyArray<string>>(\n response: Response,\n options?: ParseOptions<Header>,\n): AsyncIterableIterator<CSVRecord<Header>> {\n try {\n const options_ = getOptionsFromResponse(response, options);\n if (response.body === null) {\n throw new RangeError(\"Response body is null\");\n }\n return parseUint8ArrayStream(response.body, options_);\n } catch (error) {\n commonParseErrorHandling(error);\n }\n}\n\nexport declare namespace parseResponse {\n /**\n * Parse CSV Response to array of records.\n *\n * @returns Array of records\n *\n * @example Parsing CSV Response\n *\n * ```ts\n * import { parseResponse } from 'web-csv-toolbox';\n *\n * const response = await fetch('https://example.com/data.csv');\n *\n * const records = await parseResponse.toArray(response);\n * console.log(records);\n * ```\n */\n export function toArray<Header extends ReadonlyArray<string>>(\n response: Response,\n options?: ParseOptions<Header>,\n ): Promise<CSVRecord<Header>[]>;\n /**\n * Parse CSV Response to stream of records.\n *\n * @param response Response to parse\n * @returns Stream of records\n *\n * @example Parsing CSV Response\n *\n * ```ts\n * import { parseResponse } from 'web-csv-toolbox';\n *\n * const response = await fetch('https://example.com/data.csv');\n *\n * await parseResponse.toStream(response)\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 response: Response,\n options?: ParseOptions<Header>,\n ): ReadableStream<CSVRecord<Header>[]>;\n}\n\nObject.defineProperties(parseResponse, {\n toArray: {\n enumerable: true,\n writable: false,\n value: internal.convertThisAsyncIterableIteratorToArray,\n },\n toStreamSync: {\n enumerable: true,\n writable: false,\n value: parseResponseToStream,\n },\n});\n"],"names":["internal.convertThisAsyncIterableIteratorToArray"],"mappings":";;;;;;AAuCgB,SAAA,aAAA,CACd,UACA,OAC0C,EAAA;AAC1C,EAAI,IAAA;AACF,IAAM,MAAA,QAAA,GAAW,sBAAuB,CAAA,QAAA,EAAU,OAAO,CAAA;AACzD,IAAI,IAAA,QAAA,CAAS,SAAS,IAAM,EAAA;AAC1B,MAAM,MAAA,IAAI,WAAW,uBAAuB,CAAA;AAAA;AAE9C,IAAO,OAAA,qBAAA,CAAsB,QAAS,CAAA,IAAA,EAAM,QAAQ,CAAA;AAAA,WAC7C,KAAO,EAAA;AACd,IAAA,wBAAA,CAAyB,KAAK,CAAA;AAAA;AAElC;AAuDA,MAAA,CAAO,iBAAiB,aAAe,EAAA;AAAA,EACrC,OAAS,EAAA;AAAA,IACP,UAAY,EAAA,IAAA;AAAA,IACZ,QAAU,EAAA,KAAA;AAAA,IACV,OAAOA;AAAS,GAClB;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,UAAY,EAAA,IAAA;AAAA,IACZ,QAAU,EAAA,KAAA;AAAA,IACV,KAAO,EAAA;AAAA;AAEX,CAAC,CAAA;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseResponseToStream.js","sources":["../src/parseResponseToStream.ts"],"sourcesContent":["import type { CSVRecord, ParseBinaryOptions } from \"./common/types.ts\";\nimport { commonParseErrorHandling } from \"./commonParseErrorHandling.ts\";\nimport { getOptionsFromResponse } from \"./getOptionsFromResponse.ts\";\nimport { parseUint8ArrayStreamToStream } from \"./parseUint8ArrayStreamToStream.ts\";\n\nexport function parseResponseToStream<Header extends ReadonlyArray<string>>(\n response: Response,\n options?: ParseBinaryOptions<Header>,\n): ReadableStream<CSVRecord<Header>> {\n try {\n const options_ = getOptionsFromResponse(response, options);\n if (response.body === null) {\n throw new RangeError(\"Response body is null\");\n }\n return parseUint8ArrayStreamToStream(response.body, options_);\n } catch (error) {\n commonParseErrorHandling(error);\n }\n}\n"],"names":[],"mappings":";;;;AAKgB,SAAA,qBAAA,CACd,UACA,OACmC,EAAA;AACnC,EAAI,IAAA;AACF,IAAM,MAAA,QAAA,GAAW,sBAAuB,CAAA,QAAA,EAAU,OAAO,CAAA;AACzD,IAAI,IAAA,QAAA,CAAS,SAAS,IAAM,EAAA;AAC1B,MAAM,MAAA,IAAI,WAAW,uBAAuB,CAAA;AAAA;AAE9C,IAAO,OAAA,6BAAA,CAA8B,QAAS,CAAA,IAAA,EAAM,QAAQ,CAAA;AAAA,WACrD,KAAO,EAAA;AACd,IAAA,wBAAA,CAAyB,KAAK,CAAA;AAAA;AAElC;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseString.js","sources":["../src/parseString.ts"],"sourcesContent":["import type { CSVRecord, ParseOptions } from \"./common/types.ts\";\nimport { commonParseErrorHandling } from \"./commonParseErrorHandling.ts\";\nimport type { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from \"./constants.ts\";\nimport { parseStringToArraySync } from \"./parseStringToArraySync.ts\";\nimport { parseStringToIterableIterator } from \"./parseStringToIterableIterator.ts\";\nimport { parseStringToStream } from \"./parseStringToStream.ts\";\nimport * as internal from \"./utils/convertThisAsyncIterableIteratorToArray.ts\";\nimport type { PickCSVHeader } from \"./utils/types.ts\";\n\n/**\n * Parse CSV string to records.\n *\n * @category Middle-level API\n * @param csv CSV string to parse\n * @param options Parsing options. See {@link ParseOptions}.\n * @returns Async iterable iterator of records.\n *\n * If you want array of records, use {@link parseString.toArray} function.\n * @example Parsing CSV files from strings\n *\n * ```ts\n * import { parseString } from 'web-csv-toolbox';\n *\n * const csv = `name,age\n * Alice,42\n * Bob,69`;\n *\n * for await (const record of parseString(csv)) {\n * console.log(record);\n * }\n * // Prints:\n * // { name: 'Alice', age: '42' }\n * // { name: 'Bob', age: '69' }\n * ```\n */\nexport function parseString<const CSVSource extends string>(\n csv: CSVSource,\n): AsyncIterableIterator<CSVRecord<PickCSVHeader<CSVSource>>>;\nexport function parseString<const Header extends ReadonlyArray<string>>(\n csv: string,\n): AsyncIterableIterator<CSVRecord<Header>>;\nexport function parseString<const Header extends ReadonlyArray<string>>(\n csv: string,\n options: ParseOptions<Header>,\n): AsyncIterableIterator<CSVRecord<Header>>;\nexport function parseString<\n const CSVSource extends string,\n const Delimiter extends string = DEFAULT_DELIMITER,\n const Quotation extends string = DEFAULT_QUOTATION,\n const Header extends ReadonlyArray<string> = PickCSVHeader<\n CSVSource,\n Delimiter,\n Quotation\n >,\n>(\n csv: CSVSource,\n options?: ParseOptions<Header, Delimiter, Quotation>,\n): AsyncIterableIterator<CSVRecord<Header>>;\nexport function parseString(\n csv: string,\n options?: ParseOptions,\n): AsyncIterableIterator<CSVRecord<string[]>>;\nexport async function* parseString<Header extends ReadonlyArray<string>>(\n csv: string,\n options?: ParseOptions<Header>,\n): AsyncIterableIterator<CSVRecord<Header>> {\n try {\n yield* parseStringToIterableIterator(csv, options);\n } catch (error) {\n commonParseErrorHandling(error);\n }\n}\nexport declare namespace parseString {\n /**\n * Parse CSV string to records.\n *\n * @returns Array of records\n *\n * @example\n * ```ts\n * import { parseString } from 'web-csv-toolbox';\n *\n * const csv = `name,age\n * Alice,42\n * Bob,69`;\n *\n * const records = await parseString.toArray(csv);\n * console.log(records);\n * // Prints:\n * // [ { name: 'Alice', age: '42' }, { name: 'Bob', age: '69' } ]\n * ```\n */\n export function toArray<Header extends ReadonlyArray<string>>(\n csv: string,\n options?: ParseOptions<Header>,\n ): Promise<CSVRecord<Header>[]>;\n /**\n * Parse CSV string to records.\n *\n * @returns Array of records\n *\n * @example\n *\n * ```ts\n * import { parseString } from 'web-csv-toolbox';\n *\n * const csv = `name,age\n * Alice,42\n * Bob,69`;\n *\n * const records = parseString.toArraySync(csv);\n * console.log(records);\n * // Prints:\n * // [ { name: 'Alice', age: '42' }, { name: 'Bob', age: '69' } ]\n * ```\n */\n export function toArraySync<Header extends ReadonlyArray<string>>(\n csv: string,\n options?: ParseOptions<Header>,\n ): CSVRecord<Header>[];\n /**\n * Parse CSV string to records.\n *\n * @returns Async iterable iterator of records\n *\n * @example\n * ```ts\n * import { parseString } from 'web-csv-toolbox';\n *\n * const csv = `name,age\n * Alice,42\n * Bob,69`;\n *\n * for (const record of parseString.toIterableIterator(csv)) {\n * console.log(record);\n * }\n * // Prints:\n * // { name: 'Alice', age: '42' }\n * // { name: 'Bob', age: '69' }\n * ```\n */\n export function toIterableIterator<Header extends ReadonlyArray<string>>(\n csv: string,\n options?: ParseOptions<Header>,\n ): IterableIterator<CSVRecord<Header>>;\n /**\n * Parse CSV string to records.\n *\n * @returns Readable stream of records\n *\n * @example\n * ```ts\n * import { parseString } from 'web-csv-toolbox';\n *\n * const csv = `name,age\n * Alice,42\n * Bob,69`;\n *\n * await parseString.toStream(csv)\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 csv: string,\n options?: ParseOptions<Header>,\n ): ReadableStream<CSVRecord<Header>>;\n}\nObject.defineProperties(parseString, {\n toArray: {\n enumerable: true,\n writable: false,\n value: internal.convertThisAsyncIterableIteratorToArray,\n },\n toArraySync: {\n enumerable: true,\n writable: false,\n value: parseStringToArraySync,\n },\n toIterableIterator: {\n enumerable: true,\n writable: false,\n value: parseStringToIterableIterator,\n },\n toStream: {\n enumerable: true,\n writable: false,\n value: parseStringToStream,\n },\n});\n"],"names":["internal.convertThisAsyncIterableIteratorToArray"],"mappings":";;;;;;AA8DuB,gBAAA,WAAA,CACrB,KACA,OAC0C,EAAA;AAC1C,EAAI,IAAA;AACF,IAAO,OAAA,6BAAA,CAA8B,KAAK,OAAO,CAAA;AAAA,WAC1C,KAAO,EAAA;AACd,IAAA,wBAAA,CAAyB,KAAK,CAAA;AAAA;AAElC;AAyGA,MAAA,CAAO,iBAAiB,WAAa,EAAA;AAAA,EACnC,OAAS,EAAA;AAAA,IACP,UAAY,EAAA,IAAA;AAAA,IACZ,QAAU,EAAA,KAAA;AAAA,IACV,OAAOA;AAAS,GAClB;AAAA,EACA,WAAa,EAAA;AAAA,IACX,UAAY,EAAA,IAAA;AAAA,IACZ,QAAU,EAAA,KAAA;AAAA,IACV,KAAO,EAAA;AAAA,GACT;AAAA,EACA,kBAAoB,EAAA;AAAA,IAClB,UAAY,EAAA,IAAA;AAAA,IACZ,QAAU,EAAA,KAAA;AAAA,IACV,KAAO,EAAA;AAAA,GACT;AAAA,EACA,QAAU,EAAA;AAAA,IACR,UAAY,EAAA,IAAA;AAAA,IACZ,QAAU,EAAA,KAAA;AAAA,IACV,KAAO,EAAA;AAAA;AAEX,CAAC,CAAA;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseStringStream.js","sources":["../src/parseStringStream.ts"],"sourcesContent":["import type { CSVRecord, ParseOptions } from \"./common/types.ts\";\nimport type { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from \"./constants.ts\";\nimport { parseStringStreamToStream } from \"./parseStringStreamToStream.ts\";\nimport { convertStreamToAsyncIterableIterator } from \"./utils/convertStreamToAsyncIterableIterator.ts\";\nimport * as internal from \"./utils/convertThisAsyncIterableIteratorToArray.ts\";\nimport type { PickCSVHeader } from \"./utils/types.ts\";\n\n/**\n * Parse CSV string stream to records.\n *\n * @category Middle-level API\n * @param stream CSV string stream to parse\n * @param options Parsing options.\n * @returns Async iterable iterator of records.\n *\n * If you want array of records, use {@link parseStringStream.toArray} function.\n *\n * @example Parsing CSV files from strings\n *\n * ```ts\n * import { parseStringStream } from 'web-csv-toolbox';\n *\n * const csv = `name,age\n * Alice,42\n * Bob,69`;\n *\n * const stream = new ReadableStream({\n * start(controller) {\n * controller.enqueue(csv);\n * controller.close();\n * },\n * });\n *\n * for await (const record of parseStringStream(csv)) {\n * console.log(record);\n * }\n * // Prints:\n * // { name: 'Alice', age: '42' }\n * // { name: 'Bob', age: '69' }\n * ```\n */\nexport function parseStringStream<\n const CSVSource extends ReadableStream<string>,\n const Delimiter extends string = DEFAULT_DELIMITER,\n const Quotation extends string = DEFAULT_QUOTATION,\n const Header extends ReadonlyArray<string> = PickCSVHeader<\n CSVSource,\n Delimiter,\n Quotation\n >,\n>(\n csv: CSVSource,\n options: ParseOptions<Header, Delimiter, Quotation>,\n): AsyncIterableIterator<CSVRecord<Header>>;\nexport function parseStringStream<\n const CSVSource extends ReadableStream<string>,\n const Header extends ReadonlyArray<string> = PickCSVHeader<CSVSource>,\n>(\n csv: CSVSource,\n options?: ParseOptions<Header>,\n): AsyncIterableIterator<CSVRecord<Header>>;\nexport function parseStringStream<const Header extends ReadonlyArray<string>>(\n stream: ReadableStream<string>,\n options?: ParseOptions<Header>,\n): AsyncIterableIterator<CSVRecord<Header>>;\nexport function parseStringStream<Header extends ReadonlyArray<string>>(\n stream: ReadableStream<string>,\n options?: ParseOptions<Header>,\n): AsyncIterableIterator<CSVRecord<Header>> {\n const recordStream = parseStringStreamToStream(stream, options);\n return convertStreamToAsyncIterableIterator(recordStream);\n}\n\nexport declare namespace parseStringStream {\n /**\n * Parse CSV string stream to records.\n *\n * @returns Array of records\n *\n * @example\n *\n * ```ts\n * import { parseStringStream } from 'web-csv-toolbox';\n *\n * const csv = `name,age\n * Alice,42\n * Bob,69`;\n *\n * const stream = new ReadableStream({\n * start(controller) {\n * controller.enqueue(csv);\n * controller.close();\n * },\n * });\n *\n * const records = await parseStringStream.toArray(stream);\n * console.log(records);\n * // Prints:\n * // [ { name: 'Alice', age: '42' }, { name: 'Bob', age: '69' } ]\n * ```\n */\n export function toArray<Header extends ReadonlyArray<string>>(\n stream: ReadableStream<string>,\n options?: ParseOptions<Header>,\n ): Promise<CSVRecord<Header>[]>;\n /**\n * Parse CSV string stream to records.\n *\n * @returns Array of records\n *\n * @example\n *\n * ```ts\n * import { parseStringStream } from 'web-csv-toolbox';\n *\n * const csv = `name,age\n * Alice,42\n * Bob,69`;\n *\n * const stream = new ReadableStream({\n * start(controller) {\n * controller.enqueue(csv);\n * controller.close();\n * },\n * });\n *\n * await parseStringStream.toStream(stream)\n * .pipeTo(\n * new WritableStream({\n * write(record) {\n * console.log(record);\n * },\n * }),\n * );\n * ```\n */\n export function toStream<Header extends ReadonlyArray<string>>(\n stream: ReadableStream<string>,\n options?: ParseOptions<Header>,\n ): ReadableStream<CSVRecord<Header>>;\n}\n\nObject.defineProperties(parseStringStream, {\n toArray: {\n enumerable: true,\n writable: false,\n value: internal.convertThisAsyncIterableIteratorToArray,\n },\n toStream: {\n enumerable: true,\n writable: false,\n value: parseStringStreamToStream,\n },\n});\n"],"names":["internal.convertThisAsyncIterableIteratorToArray"],"mappings":";;;;AAiEgB,SAAA,iBAAA,CACd,QACA,OAC0C,EAAA;AAC1C,EAAM,MAAA,YAAA,GAAe,yBAA0B,CAAA,MAAA,EAAQ,OAAO,CAAA;AAC9D,EAAA,OAAO,qCAAqC,YAAY,CAAA;AAC1D;AAuEA,MAAA,CAAO,iBAAiB,iBAAmB,EAAA;AAAA,EACzC,OAAS,EAAA;AAAA,IACP,UAAY,EAAA,IAAA;AAAA,IACZ,QAAU,EAAA,KAAA;AAAA,IACV,OAAOA;AAAS,GAClB;AAAA,EACA,QAAU,EAAA;AAAA,IACR,UAAY,EAAA,IAAA;AAAA,IACZ,QAAU,EAAA,KAAA;AAAA,IACV,KAAO,EAAA;AAAA;AAEX,CAAC,CAAA;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseStringStreamToStream.js","sources":["../src/parseStringStreamToStream.ts"],"sourcesContent":["import { LexerTransformer } from \"./LexerTransformer.ts\";\nimport { RecordAssemblerTransformer } from \"./RecordAssemblerTransformer.ts\";\nimport type { CSVRecord, ParseOptions } from \"./common/types.ts\";\nimport type { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from \"./constants.ts\";\nimport { pipeline } from \"./utils/pipeline.ts\";\nimport type { PickCSVHeader } from \"./utils/types.ts\";\n\nexport function parseStringStreamToStream<\n const CSVSource extends ReadableStream<string>,\n const Delimiter extends string = DEFAULT_DELIMITER,\n const Quotation extends string = DEFAULT_QUOTATION,\n const Header extends ReadonlyArray<string> = PickCSVHeader<\n CSVSource,\n Delimiter,\n Quotation\n >,\n>(\n stream: CSVSource,\n options: ParseOptions<Header, Delimiter, Quotation>,\n): ReadableStream<CSVRecord<Header>>;\nexport function parseStringStreamToStream<\n const CSVSource extends ReadableStream<string>,\n const Header extends ReadonlyArray<string> = PickCSVHeader<CSVSource>,\n>(\n stream: CSVSource,\n options?: ParseOptions<Header>,\n): ReadableStream<CSVRecord<Header>>;\nexport function parseStringStreamToStream<\n const Header extends ReadonlyArray<string>,\n>(\n stream: ReadableStream<string>,\n options?: ParseOptions<Header>,\n): ReadableStream<CSVRecord<Header>>;\nexport function parseStringStreamToStream<\n const Header extends ReadonlyArray<string>,\n>(\n stream: ReadableStream<string>,\n options?: ParseOptions<Header>,\n): ReadableStream<CSVRecord<Header>> {\n return pipeline(\n stream,\n new LexerTransformer(options),\n new RecordAssemblerTransformer(options),\n );\n}\n"],"names":[],"mappings":";;;;AAiCgB,SAAA,yBAAA,CAGd,QACA,OACmC,EAAA;AACnC,EAAO,OAAA,QAAA;AAAA,IACL,MAAA;AAAA,IACA,IAAI,iBAAiB,OAAO,CAAA;AAAA,IAC5B,IAAI,2BAA2B,OAAO;AAAA,GACxC;AACF;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseStringToArraySync.js","sources":["../src/parseStringToArraySync.ts"],"sourcesContent":["import { Lexer } from \"./Lexer.ts\";\nimport { RecordAssembler } from \"./RecordAssembler.ts\";\nimport type { CSVRecord, ParseOptions } from \"./common/types.ts\";\nimport { commonParseErrorHandling } from \"./commonParseErrorHandling.ts\";\nimport type { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from \"./constants.ts\";\nimport type { PickCSVHeader } from \"./utils/types.ts\";\n\nexport function parseStringToArraySync<\n const CSVSource extends string,\n const Delimiter extends string = DEFAULT_DELIMITER,\n const Quotation extends string = DEFAULT_QUOTATION,\n const Header extends ReadonlyArray<string> = PickCSVHeader<\n CSVSource,\n Delimiter,\n Quotation\n >,\n>(\n csv: CSVSource,\n options: ParseOptions<Header, Delimiter, Quotation>,\n): CSVRecord<Header>[];\nexport function parseStringToArraySync<\n const CSVSource extends string,\n const Header extends ReadonlyArray<string> = PickCSVHeader<CSVSource>,\n>(csv: CSVSource, options?: ParseOptions<Header>): CSVRecord<Header>[];\nexport function parseStringToArraySync<\n const Header extends ReadonlyArray<string>,\n>(csv: string, options?: ParseOptions<Header>): CSVRecord<Header>[];\nexport function parseStringToArraySync<\n const Header extends ReadonlyArray<string>,\n>(csv: string, options?: ParseOptions<Header>): CSVRecord<Header>[] {\n try {\n const lexer = new Lexer(options);\n const assembler = new RecordAssembler(options);\n const tokens = lexer.lex(csv);\n return [...assembler.assemble(tokens)];\n } catch (error) {\n commonParseErrorHandling(error);\n }\n}\n"],"names":[],"mappings":";;;;AA2BgB,SAAA,sBAAA,CAEd,KAAa,OAAqD,EAAA;AAClE,EAAI,IAAA;AACF,IAAM,MAAA,KAAA,GAAQ,IAAI,KAAA,CAAM,OAAO,CAAA;AAC/B,IAAM,MAAA,SAAA,GAAY,IAAI,eAAA,CAAgB,OAAO,CAAA;AAC7C,IAAM,MAAA,MAAA,GAAS,KAAM,CAAA,GAAA,CAAI,GAAG,CAAA;AAC5B,IAAA,OAAO,CAAC,GAAG,SAAU,CAAA,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,WAC9B,KAAO,EAAA;AACd,IAAA,wBAAA,CAAyB,KAAK,CAAA;AAAA;AAElC;;;;"}
|