web-csv-toolbox 0.0.0-next-20240315095842 → 0.0.0-next-20240316092725
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/dist/cjs/Lexer.cjs.map +1 -1
- package/dist/cjs/LexerTransformer.cjs.map +1 -1
- package/dist/cjs/RecordAssembler.cjs.map +1 -1
- package/dist/cjs/RecordAssemblerTransformer.cjs.map +1 -1
- package/dist/cjs/_virtual/web_csv_toolbox_wasm_bg.wasm.cjs +1 -1
- package/dist/cjs/assertCommonOptions.cjs.map +1 -1
- package/dist/cjs/convertBinaryToString.cjs.map +1 -1
- package/dist/cjs/getOptionsFromResponse.cjs.map +1 -1
- package/dist/cjs/loadWASM.cjs.map +1 -1
- package/dist/cjs/loadWASM.web.cjs.map +1 -1
- package/dist/cjs/parse.cjs.map +1 -1
- package/dist/cjs/parseBinary.cjs.map +1 -1
- package/dist/cjs/parseBinaryToArraySync.cjs.map +1 -1
- package/dist/cjs/parseBinaryToIterableIterator.cjs.map +1 -1
- package/dist/cjs/parseBinaryToStream.cjs.map +1 -1
- package/dist/cjs/parseResponse.cjs.map +1 -1
- package/dist/cjs/parseResponseToStream.cjs.map +1 -1
- package/dist/cjs/parseString.cjs.map +1 -1
- package/dist/cjs/parseStringStream.cjs.map +1 -1
- package/dist/cjs/parseStringStreamToStream.cjs.map +1 -1
- package/dist/cjs/parseStringToArraySync.cjs.map +1 -1
- package/dist/cjs/parseStringToArraySyncWASM.cjs.map +1 -1
- package/dist/cjs/parseStringToIterableIterator.cjs.map +1 -1
- package/dist/cjs/parseStringToStream.cjs.map +1 -1
- package/dist/cjs/parseUint8ArrayStream.cjs.map +1 -1
- package/dist/cjs/parseUint8ArrayStreamToStream.cjs.map +1 -1
- package/dist/es/Lexer.js.map +1 -1
- package/dist/es/LexerTransformer.js.map +1 -1
- package/dist/es/RecordAssembler.js.map +1 -1
- package/dist/es/RecordAssemblerTransformer.js.map +1 -1
- package/dist/es/_virtual/web_csv_toolbox_wasm_bg.wasm.js +1 -1
- package/dist/es/assertCommonOptions.js.map +1 -1
- package/dist/es/convertBinaryToString.js.map +1 -1
- package/dist/es/getOptionsFromResponse.js.map +1 -1
- package/dist/es/loadWASM.js.map +1 -1
- package/dist/es/loadWASM.web.js.map +1 -1
- package/dist/es/parse.js.map +1 -1
- package/dist/es/parseBinary.js.map +1 -1
- package/dist/es/parseBinaryToArraySync.js.map +1 -1
- package/dist/es/parseBinaryToIterableIterator.js.map +1 -1
- package/dist/es/parseBinaryToStream.js.map +1 -1
- package/dist/es/parseResponse.js.map +1 -1
- package/dist/es/parseResponseToStream.js.map +1 -1
- package/dist/es/parseString.js.map +1 -1
- package/dist/es/parseStringStream.js.map +1 -1
- package/dist/es/parseStringStreamToStream.js.map +1 -1
- package/dist/es/parseStringToArraySync.js.map +1 -1
- package/dist/es/parseStringToArraySyncWASM.js.map +1 -1
- package/dist/es/parseStringToIterableIterator.js.map +1 -1
- package/dist/es/parseStringToStream.js.map +1 -1
- package/dist/es/parseUint8ArrayStream.js.map +1 -1
- package/dist/es/parseUint8ArrayStreamToStream.js.map +1 -1
- package/dist/types/Lexer.d.ts +1 -1
- package/dist/types/LexerTransformer.d.ts +1 -1
- package/dist/types/RecordAssembler.d.ts +1 -1
- package/dist/types/RecordAssemblerTransformer.d.ts +1 -1
- package/dist/types/assertCommonOptions.d.ts +1 -1
- package/dist/types/common/types.d.ts +1 -1
- package/dist/types/convertBinaryToString.d.ts +1 -1
- package/dist/types/escapeField.d.ts +1 -1
- package/dist/types/getOptionsFromResponse.d.ts +1 -1
- package/dist/types/loadWASM.d.ts +1 -1
- package/dist/types/loadWASM.web.d.ts +1 -1
- package/dist/types/parse.d.ts +1 -1
- package/dist/types/parseBinary.d.ts +1 -1
- package/dist/types/parseBinaryToArraySync.d.ts +1 -1
- package/dist/types/parseBinaryToIterableIterator.d.ts +1 -1
- package/dist/types/parseBinaryToStream.d.ts +1 -1
- package/dist/types/parseResponse.d.ts +1 -1
- package/dist/types/parseResponseToStream.d.ts +1 -1
- package/dist/types/parseString.d.ts +1 -1
- package/dist/types/parseStringStream.d.ts +1 -1
- package/dist/types/parseStringStreamToStream.d.ts +1 -1
- package/dist/types/parseStringToArraySync.d.ts +1 -1
- package/dist/types/parseStringToArraySyncWASM.d.ts +1 -1
- package/dist/types/parseStringToIterableIterator.d.ts +1 -1
- package/dist/types/parseStringToStream.d.ts +1 -1
- package/dist/types/parseUint8ArrayStream.d.ts +1 -1
- package/dist/types/parseUint8ArrayStreamToStream.d.ts +1 -1
- package/dist/web-csv-toolbox.umd.cjs +1 -1
- package/dist/web-csv-toolbox.umd.cjs.map +1 -1
- package/dist/web_csv_toolbox_wasm_bg.wasm +0 -0
- package/package.json +4 -3
package/dist/cjs/Lexer.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Lexer.cjs","sources":["../../src/Lexer.ts"],"sourcesContent":["import { assertCommonOptions } from \"./assertCommonOptions.ts\";\nimport { Field, FieldDelimiter, RecordDelimiter } from \"./common/constants.ts\";\nimport { CommonOptions, Token } from \"./common/types.ts\";\nimport { COMMA, CRLF, DOUBLE_QUOTE, LF } from \"./constants.ts\";\nimport { escapeRegExp } from \"./utils/escapeRegExp.ts\";\n\nexport class Lexer {\n #delimiter: string;\n #delimiterLength: number;\n #quotation: string;\n #quotationLength: number;\n #matcher: RegExp;\n #buffer = \"\";\n #flush = false;\n\n constructor({\n delimiter = COMMA,\n quotation = DOUBLE_QUOTE,\n }: CommonOptions = {}) {\n assertCommonOptions({ delimiter, quotation });\n this.#delimiter = delimiter;\n this.#delimiterLength = delimiter.length;\n this.#quotation = quotation;\n this.#quotationLength = quotation.length;\n\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 }\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 public flush(): Token[] {\n this.#flush = true;\n return [...this.#tokens()];\n }\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, -CRLF.length);\n } else if (this.#buffer.endsWith(LF)) {\n this.#buffer = this.#buffer.slice(0, -LF.length);\n }\n }\n let currentField: Token | null = null;\n for (let token: Token | null; (token = this.#nextToken()); ) {\n switch (token) {\n case FieldDelimiter:\n if (currentField) {\n yield currentField;\n currentField = null;\n }\n yield token;\n break;\n case RecordDelimiter:\n if (currentField) {\n yield currentField;\n currentField = null;\n }\n yield token;\n break;\n default:\n // If currentField is not null, append the new token's value to it\n if (currentField) {\n currentField.value += token.value;\n } else {\n currentField = token;\n }\n break;\n }\n }\n if (currentField) {\n yield currentField;\n }\n }\n\n #nextToken(): Token | null {\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 return RecordDelimiter;\n }\n\n // Check for LF\n if (this.#buffer.startsWith(LF)) {\n this.#buffer = this.#buffer.slice(1);\n return RecordDelimiter;\n }\n\n // Check for Delimiter\n if (this.#buffer.startsWith(this.#delimiter)) {\n this.#buffer = this.#buffer.slice(this.#delimiterLength);\n return FieldDelimiter;\n }\n\n // Check for Quoted String\n if (this.#buffer.startsWith(this.#quotation)) {\n // If not flushing and the buffer doesn't end with a quote, then return null.\n if (this.#flush === false && this.#buffer.endsWith(this.#quotation)) {\n return null;\n }\n return this.#extractQuotedString();\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 this.#buffer = this.#buffer.slice(match[0].length);\n return { type: Field, value: match[0] };\n }\n\n // Otherwise, return null\n return null;\n }\n\n #extractQuotedString(): Token | null {\n let end = this.#quotationLength; // Skip the opening quote\n let value = \"\";\n\n while (end < this.#buffer.length) {\n // Escaped quote\n if (\n this.#buffer.slice(end, end + this.#quotationLength) ===\n this.#quotation &&\n this.#buffer.slice(\n end + this.#quotationLength,\n end + this.#quotationLength * 2,\n ) === this.#quotation\n ) {\n value += this.#quotation;\n end += this.#quotationLength * 2;\n continue;\n }\n\n // Closing quote\n if (\n this.#buffer.slice(end, end + this.#quotationLength) === this.#quotation\n ) {\n // If flushing and the buffer doesn't end with a quote, then return null\n if (\n this.#flush === false &&\n end + this.#quotationLength < this.#buffer.length &&\n this.#buffer.slice(\n end + this.#quotationLength,\n this.#delimiterLength,\n ) !== this.#delimiter &&\n this.#buffer.slice(\n end + this.#quotationLength,\n end + this.#quotationLength + 2 /** CRLF.length */,\n ) !== CRLF &&\n this.#buffer.slice(\n end + this.#quotationLength,\n end + this.#quotationLength + 1 /** LF.length */,\n ) !== LF\n ) {\n return null;\n }\n\n // Otherwise, return the quoted string\n this.#buffer = this.#buffer.slice(end + this.#quotationLength);\n return { type: Field, value };\n }\n\n value += this.#buffer[end];\n end++;\n }\n\n // If we get here, we've reached the end of the buffer\n return null;\n }\n}\n"],"names":["delimiter","delimiterLength","quotation","quotationLength","matcher","buffer","flush","constructor","COMMA","DOUBLE_QUOTE","assertCommonOptions","this","length","d","escapeRegExp","q","RegExp","lex","chunk","buffering","tokens","endsWith","CRLF","slice","LF","currentField","token","nextToken","FieldDelimiter","RecordDelimiter","value","startsWith","extractQuotedString","match","exec","type","Field","end"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Lexer.cjs","sources":["../../src/Lexer.ts"],"sourcesContent":["import { assertCommonOptions } from \"./assertCommonOptions.ts\";\nimport { Field, FieldDelimiter, RecordDelimiter } from \"./common/constants.ts\";\nimport type { CommonOptions, Token } from \"./common/types.ts\";\nimport { COMMA, CRLF, DOUBLE_QUOTE, LF } from \"./constants.ts\";\nimport { escapeRegExp } from \"./utils/escapeRegExp.ts\";\n\nexport class Lexer {\n #delimiter: string;\n #delimiterLength: number;\n #quotation: string;\n #quotationLength: number;\n #matcher: RegExp;\n #buffer = \"\";\n #flush = false;\n\n constructor({\n delimiter = COMMA,\n quotation = DOUBLE_QUOTE,\n }: CommonOptions = {}) {\n assertCommonOptions({ delimiter, quotation });\n this.#delimiter = delimiter;\n this.#delimiterLength = delimiter.length;\n this.#quotation = quotation;\n this.#quotationLength = quotation.length;\n\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 }\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 public flush(): Token[] {\n this.#flush = true;\n return [...this.#tokens()];\n }\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, -CRLF.length);\n } else if (this.#buffer.endsWith(LF)) {\n this.#buffer = this.#buffer.slice(0, -LF.length);\n }\n }\n let currentField: Token | null = null;\n for (let token: Token | null; (token = this.#nextToken()); ) {\n switch (token) {\n case FieldDelimiter:\n if (currentField) {\n yield currentField;\n currentField = null;\n }\n yield token;\n break;\n case RecordDelimiter:\n if (currentField) {\n yield currentField;\n currentField = null;\n }\n yield token;\n break;\n default:\n // If currentField is not null, append the new token's value to it\n if (currentField) {\n currentField.value += token.value;\n } else {\n currentField = token;\n }\n break;\n }\n }\n if (currentField) {\n yield currentField;\n }\n }\n\n #nextToken(): Token | null {\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 return RecordDelimiter;\n }\n\n // Check for LF\n if (this.#buffer.startsWith(LF)) {\n this.#buffer = this.#buffer.slice(1);\n return RecordDelimiter;\n }\n\n // Check for Delimiter\n if (this.#buffer.startsWith(this.#delimiter)) {\n this.#buffer = this.#buffer.slice(this.#delimiterLength);\n return FieldDelimiter;\n }\n\n // Check for Quoted String\n if (this.#buffer.startsWith(this.#quotation)) {\n // If not flushing and the buffer doesn't end with a quote, then return null.\n if (this.#flush === false && this.#buffer.endsWith(this.#quotation)) {\n return null;\n }\n return this.#extractQuotedString();\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 this.#buffer = this.#buffer.slice(match[0].length);\n return { type: Field, value: match[0] };\n }\n\n // Otherwise, return null\n return null;\n }\n\n #extractQuotedString(): Token | null {\n let end = this.#quotationLength; // Skip the opening quote\n let value = \"\";\n\n while (end < this.#buffer.length) {\n // Escaped quote\n if (\n this.#buffer.slice(end, end + this.#quotationLength) ===\n this.#quotation &&\n this.#buffer.slice(\n end + this.#quotationLength,\n end + this.#quotationLength * 2,\n ) === this.#quotation\n ) {\n value += this.#quotation;\n end += this.#quotationLength * 2;\n continue;\n }\n\n // Closing quote\n if (\n this.#buffer.slice(end, end + this.#quotationLength) === this.#quotation\n ) {\n // If flushing and the buffer doesn't end with a quote, then return null\n if (\n this.#flush === false &&\n end + this.#quotationLength < this.#buffer.length &&\n this.#buffer.slice(\n end + this.#quotationLength,\n this.#delimiterLength,\n ) !== this.#delimiter &&\n this.#buffer.slice(\n end + this.#quotationLength,\n end + this.#quotationLength + 2 /** CRLF.length */,\n ) !== CRLF &&\n this.#buffer.slice(\n end + this.#quotationLength,\n end + this.#quotationLength + 1 /** LF.length */,\n ) !== LF\n ) {\n return null;\n }\n\n // Otherwise, return the quoted string\n this.#buffer = this.#buffer.slice(end + this.#quotationLength);\n return { type: Field, value };\n }\n\n value += this.#buffer[end];\n end++;\n }\n\n // If we get here, we've reached the end of the buffer\n return null;\n }\n}\n"],"names":["delimiter","delimiterLength","quotation","quotationLength","matcher","buffer","flush","constructor","COMMA","DOUBLE_QUOTE","assertCommonOptions","this","length","d","escapeRegExp","q","RegExp","lex","chunk","buffering","tokens","endsWith","CRLF","slice","LF","currentField","token","nextToken","FieldDelimiter","RecordDelimiter","value","startsWith","extractQuotedString","match","exec","type","Field","end"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LexerTransformer.cjs","sources":["../../src/LexerTransformer.ts"],"sourcesContent":["import { Lexer } from \"./Lexer.ts\";\nimport { CommonOptions, Token } from \"./common/types.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\" }\n * // FieldDelimiter\n * // { type: Field, value: \"age\" }\n * // RecordDelimiter\n * // { type: Field, value: \"Alice\" }\n * // FieldDelimiter\n * // { type: Field, value: \"20\" }\n * // RecordDelimiter\n * ```\n */\nexport class LexerTransformer extends TransformStream<string, Token[]> {\n constructor(options: CommonOptions = {}) {\n const lexer = new Lexer(options);\n super({\n transform: (chunk, controller) => {\n if (chunk.length !== 0) {\n controller.enqueue([...lexer.lex(chunk, true)]);\n }\n },\n flush: (controller) => {\n controller.enqueue(lexer.flush());\n },\n });\n }\n}\n"],"names":["LexerTransformer","TransformStream","constructor","options","lexer","Lexer","super","transform","chunk","controller","length","enqueue","lex","flush"],"mappings":"+GAiCO,MAAMA,UAAyBC,gBACpC,WAAAC,CAAYC,EAAyB,IAC7B,MAAAC,EAAQ,IAAIC,QAAMF,GAClBG,MAAA,CACJC,UAAW,CAACC,EAAOC,KACI,IAAjBD,EAAME,QACGD,EAAAE,QAAQ,IAAIP,EAAMQ,IAAIJ,GAAO,IAC1C,EAEFK,MAAQJ,IACKA,EAAAE,QAAQP,EAAMS,QAAO,GAGtC"}
|
|
1
|
+
{"version":3,"file":"LexerTransformer.cjs","sources":["../../src/LexerTransformer.ts"],"sourcesContent":["import { Lexer } from \"./Lexer.ts\";\nimport type { CommonOptions, Token } from \"./common/types.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\" }\n * // FieldDelimiter\n * // { type: Field, value: \"age\" }\n * // RecordDelimiter\n * // { type: Field, value: \"Alice\" }\n * // FieldDelimiter\n * // { type: Field, value: \"20\" }\n * // RecordDelimiter\n * ```\n */\nexport class LexerTransformer extends TransformStream<string, Token[]> {\n constructor(options: CommonOptions = {}) {\n const lexer = new Lexer(options);\n super({\n transform: (chunk, controller) => {\n if (chunk.length !== 0) {\n controller.enqueue([...lexer.lex(chunk, true)]);\n }\n },\n flush: (controller) => {\n controller.enqueue(lexer.flush());\n },\n });\n }\n}\n"],"names":["LexerTransformer","TransformStream","constructor","options","lexer","Lexer","super","transform","chunk","controller","length","enqueue","lex","flush"],"mappings":"+GAiCO,MAAMA,UAAyBC,gBACpC,WAAAC,CAAYC,EAAyB,IAC7B,MAAAC,EAAQ,IAAIC,QAAMF,GAClBG,MAAA,CACJC,UAAW,CAACC,EAAOC,KACI,IAAjBD,EAAME,QACGD,EAAAE,QAAQ,IAAIP,EAAMQ,IAAIJ,GAAO,IAC1C,EAEFK,MAAQJ,IACKA,EAAAE,QAAQP,EAAMS,QAAO,GAGtC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecordAssembler.cjs","sources":["../../src/RecordAssembler.ts"],"sourcesContent":["import { FieldDelimiter, RecordDelimiter } from \"./common/constants.ts\";\nimport {
|
|
1
|
+
{"version":3,"file":"RecordAssembler.cjs","sources":["../../src/RecordAssembler.ts"],"sourcesContent":["import { FieldDelimiter, RecordDelimiter } from \"./common/constants.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\n constructor(options: RecordAssemblerOptions<Header> = {}) {\n if (options.header !== undefined && Array.isArray(options.header)) {\n this.#setHeader(options.header);\n }\n }\n\n public *assemble(\n tokens: Iterable<Token>,\n flush = true,\n ): IterableIterator<CSVRecord<Header>> {\n for (const token of tokens) {\n switch (token) {\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 Error(\"The header must not be empty.\");\n }\n if (new Set(this.#header).size !== this.#header.length) {\n throw new Error(\"The header must not contain duplicate fields.\");\n }\n }\n}\n"],"names":["fieldIndex","row","header","dirty","constructor","options","Array","isArray","this","setHeader","assemble","tokens","flush","token","FieldDelimiter","RecordDelimiter","Object","fromEntries","map","index","at","length","fill","value","filter","v","Error","Set","size"],"mappings":"kJAOO,MACLA,GAAc,EACdC,GAAiB,GACjBC,GACAC,IAAS,EAET,WAAAC,CAAYC,EAA0C,SAC7B,IAAnBA,EAAQH,QAAwBI,MAAMC,QAAQF,EAAQH,SACnDM,MAAAC,EAAWJ,EAAQH,OAE5B,CAEA,SAAQQ,CACNC,EACAC,GAAQ,GAER,IAAA,MAAWC,KAASF,EAClB,OAAQE,GACN,KAAKC,EAAAA,eACEN,MAAAR,IACLQ,MAAKL,GAAS,EACd,MACF,KAAKY,EAAAA,qBACkB,IAAjBP,MAAKN,EACFM,MAAAC,EAAWD,MAAKP,GAEjBO,MAAKL,QACDa,OAAOC,YACXT,MAAKN,EAAQgB,KAAI,CAAChB,EAAQiB,IAAU,CAClCjB,EACAM,MAAKP,EAAKmB,GAAGD,aAIXH,OAAOC,YACXT,MAAKN,EAAQgB,KAAKhB,GAAW,CAACA,EAAQ,OAK5CM,MAAKR,EAAc,EACdQ,MAAAP,EAAO,IAAIK,MAAME,MAAKN,GAASmB,QAAQC,KAAK,IACjDd,MAAKL,GAAS,EACd,MACF,QACEK,MAAKL,GAAS,EACdK,MAAKP,EAAKO,MAAKR,GAAea,EAAMU,MAKtCX,UACKJ,KAAKI,QAEhB,CAEA,MAAQA,QACe,IAAjBJ,MAAKN,GACHM,MAAKL,UACDa,OAAOC,YACXT,MAAKN,EACFsB,QAAQC,GAAMA,IACdP,KAAI,CAAChB,EAAQiB,IAAU,CAACjB,EAAQM,MAAKP,EAAKmB,GAAGD,OAIxD,CAEA,EAAAV,CAAWP,GAEL,GADJM,MAAKN,EAAUA,EACa,IAAxBM,MAAKN,EAAQmB,OACT,MAAA,IAAIK,MAAM,iCAEd,GAAA,IAAIC,IAAInB,MAAKN,GAAS0B,OAASpB,MAAKN,EAAQmB,OACxC,MAAA,IAAIK,MAAM,gDAEpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecordAssemblerTransformer.cjs","sources":["../../src/RecordAssemblerTransformer.ts"],"sourcesContent":["import { RecordAssembler } from \"./RecordAssembler.ts\";\nimport {
|
|
1
|
+
{"version":3,"file":"RecordAssemblerTransformer.cjs","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 constructor(options: RecordAssemblerOptions<Header> = {}) {\n const assembler = new RecordAssembler(options);\n super({\n transform: (tokens, controller) => {\n for (const token of assembler.assemble(tokens, false)) {\n controller.enqueue(token);\n }\n },\n flush: (controller) => {\n for (const token of assembler.flush()) {\n controller.enqueue(token);\n }\n },\n });\n }\n}\n"],"names":["RecordAssemblerTransformer","TransformStream","constructor","options","assembler","RecordAssembler","super","transform","tokens","controller","token","assemble","enqueue","flush"],"mappings":"yHAkDO,MAAMA,UAEHC,gBACR,WAAAC,CAAYC,EAA0C,IAC9C,MAAAC,EAAY,IAAIC,kBAAgBF,GAChCG,MAAA,CACJC,UAAW,CAACC,EAAQC,KAClB,IAAA,MAAWC,KAASN,EAAUO,SAASH,GAAQ,GAC7CC,EAAWG,QAAQF,EACrB,EAEFG,MAAQJ,IACK,IAAA,MAAAC,KAASN,EAAUS,QAC5BJ,EAAWG,QAAQF,EACrB,GAGN"}
|