web-csv-toolbox 0.7.2 → 0.7.5

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.
Files changed (88) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +5 -0
  3. package/dist/cjs/Lexer.cjs.map +1 -1
  4. package/dist/cjs/LexerTransformer.cjs.map +1 -1
  5. package/dist/cjs/RecordAssembler.cjs.map +1 -1
  6. package/dist/cjs/RecordAssemblerTransformer.cjs.map +1 -1
  7. package/dist/cjs/_virtual/_web-csv-toolbox-wasm.cjs +1 -1
  8. package/dist/cjs/_virtual/web_csv_toolbox_wasm_bg.wasm.cjs +1 -1
  9. package/dist/cjs/assertCommonOptions.cjs.map +1 -1
  10. package/dist/cjs/convertBinaryToString.cjs.map +1 -1
  11. package/dist/cjs/getOptionsFromResponse.cjs.map +1 -1
  12. package/dist/cjs/loadWASM.cjs.map +1 -1
  13. package/dist/cjs/loadWASM.web.cjs.map +1 -1
  14. package/dist/cjs/parse.cjs.map +1 -1
  15. package/dist/cjs/parseBinary.cjs.map +1 -1
  16. package/dist/cjs/parseBinaryToArraySync.cjs.map +1 -1
  17. package/dist/cjs/parseBinaryToIterableIterator.cjs.map +1 -1
  18. package/dist/cjs/parseBinaryToStream.cjs.map +1 -1
  19. package/dist/cjs/parseResponse.cjs.map +1 -1
  20. package/dist/cjs/parseResponseToStream.cjs.map +1 -1
  21. package/dist/cjs/parseString.cjs.map +1 -1
  22. package/dist/cjs/parseStringStream.cjs.map +1 -1
  23. package/dist/cjs/parseStringStreamToStream.cjs.map +1 -1
  24. package/dist/cjs/parseStringToArraySync.cjs.map +1 -1
  25. package/dist/cjs/parseStringToArraySyncWASM.cjs.map +1 -1
  26. package/dist/cjs/parseStringToIterableIterator.cjs.map +1 -1
  27. package/dist/cjs/parseStringToStream.cjs.map +1 -1
  28. package/dist/cjs/parseUint8ArrayStream.cjs.map +1 -1
  29. package/dist/cjs/parseUint8ArrayStreamToStream.cjs.map +1 -1
  30. package/dist/es/Lexer.js.map +1 -1
  31. package/dist/es/LexerTransformer.js.map +1 -1
  32. package/dist/es/RecordAssembler.js.map +1 -1
  33. package/dist/es/RecordAssemblerTransformer.js.map +1 -1
  34. package/dist/es/_virtual/_web-csv-toolbox-wasm.js +1 -0
  35. package/dist/es/_virtual/_web-csv-toolbox-wasm.js.map +1 -1
  36. package/dist/es/_virtual/web_csv_toolbox_wasm_bg.wasm.js +1 -1
  37. package/dist/es/assertCommonOptions.js.map +1 -1
  38. package/dist/es/convertBinaryToString.js.map +1 -1
  39. package/dist/es/getOptionsFromResponse.js.map +1 -1
  40. package/dist/es/loadWASM.js.map +1 -1
  41. package/dist/es/loadWASM.web.js.map +1 -1
  42. package/dist/es/parse.js.map +1 -1
  43. package/dist/es/parseBinary.js.map +1 -1
  44. package/dist/es/parseBinaryToArraySync.js.map +1 -1
  45. package/dist/es/parseBinaryToIterableIterator.js.map +1 -1
  46. package/dist/es/parseBinaryToStream.js.map +1 -1
  47. package/dist/es/parseResponse.js.map +1 -1
  48. package/dist/es/parseResponseToStream.js.map +1 -1
  49. package/dist/es/parseString.js.map +1 -1
  50. package/dist/es/parseStringStream.js.map +1 -1
  51. package/dist/es/parseStringStreamToStream.js.map +1 -1
  52. package/dist/es/parseStringToArraySync.js.map +1 -1
  53. package/dist/es/parseStringToArraySyncWASM.js.map +1 -1
  54. package/dist/es/parseStringToIterableIterator.js.map +1 -1
  55. package/dist/es/parseStringToStream.js.map +1 -1
  56. package/dist/es/parseUint8ArrayStream.js.map +1 -1
  57. package/dist/es/parseUint8ArrayStreamToStream.js.map +1 -1
  58. package/dist/types/Lexer.d.ts +1 -1
  59. package/dist/types/LexerTransformer.d.ts +1 -1
  60. package/dist/types/RecordAssembler.d.ts +1 -1
  61. package/dist/types/RecordAssemblerTransformer.d.ts +1 -1
  62. package/dist/types/assertCommonOptions.d.ts +1 -1
  63. package/dist/types/common/types.d.ts +1 -1
  64. package/dist/types/convertBinaryToString.d.ts +1 -1
  65. package/dist/types/escapeField.d.ts +1 -1
  66. package/dist/types/getOptionsFromResponse.d.ts +1 -1
  67. package/dist/types/loadWASM.d.ts +1 -1
  68. package/dist/types/loadWASM.web.d.ts +1 -1
  69. package/dist/types/parse.d.ts +1 -1
  70. package/dist/types/parseBinary.d.ts +1 -1
  71. package/dist/types/parseBinaryToArraySync.d.ts +1 -1
  72. package/dist/types/parseBinaryToIterableIterator.d.ts +1 -1
  73. package/dist/types/parseBinaryToStream.d.ts +1 -1
  74. package/dist/types/parseResponse.d.ts +1 -1
  75. package/dist/types/parseResponseToStream.d.ts +1 -1
  76. package/dist/types/parseString.d.ts +1 -1
  77. package/dist/types/parseStringStream.d.ts +1 -1
  78. package/dist/types/parseStringStreamToStream.d.ts +1 -1
  79. package/dist/types/parseStringToArraySync.d.ts +1 -1
  80. package/dist/types/parseStringToArraySyncWASM.d.ts +1 -1
  81. package/dist/types/parseStringToIterableIterator.d.ts +1 -1
  82. package/dist/types/parseStringToStream.d.ts +1 -1
  83. package/dist/types/parseUint8ArrayStream.d.ts +1 -1
  84. package/dist/types/parseUint8ArrayStreamToStream.d.ts +1 -1
  85. package/dist/web-csv-toolbox.umd.cjs +1 -1
  86. package/dist/web-csv-toolbox.umd.cjs.map +1 -1
  87. package/dist/web_csv_toolbox_wasm_bg.wasm +0 -0
  88. package/package.json +8 -5
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2023 Yuki Yamazaki
3
+ Copyright (c) 2023-2024 Yuki Yamazaki
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -4,10 +4,12 @@
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
5
  [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](http://makeapullrequest.com)
6
6
  ![node version](https://img.shields.io/node/v/web-csv-toolbox)
7
+ [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fkamiazya%2Fweb-csv-toolbox.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fkamiazya%2Fweb-csv-toolbox?ref=badge_shield)
7
8
 
8
9
  ![npm package minimized gzipped size](https://img.shields.io/bundlejs/size/web-csv-toolbox)
9
10
  ![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/kamiazya/web-csv-toolbox)
10
11
  ![npm](https://img.shields.io/npm/dm/web-csv-toolbox)
12
+ [![codecov](https://codecov.io/gh/kamiazya/web-csv-toolbox/graph/badge.svg?token=8RbDcXHTFl)](https://codecov.io/gh/kamiazya/web-csv-toolbox)
11
13
 
12
14
  # `🌐 web-csv-toolbox 🧰`
13
15
 
@@ -357,3 +359,6 @@ Please support [kamiazya](https://github.com/sponsors/kamiazya).
357
359
  ## License ⚖️
358
360
 
359
361
  This software is released under the MIT License, see [LICENSE](https://github.com/kamiazya/web-csv-toolbox?tab=MIT-1-ov-file).
362
+
363
+
364
+ [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fkamiazya%2Fweb-csv-toolbox.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fkamiazya%2Fweb-csv-toolbox?ref=badge_large)
@@ -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) {\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 { CSVRecord, RecordAssemblerOptions, Token } 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":"kJAGO,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
+ {"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 { CSVRecord, RecordAssemblerOptions, Token } 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":"yHA8CO,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"}
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"}
@@ -1,2 +1,2 @@
1
- "use strict";let e;Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const n="undefined"!=typeof TextDecoder?new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}):{decode:()=>{throw Error("TextDecoder not available")}};"undefined"!=typeof TextDecoder&&n.decode();let t=null;function o(){return null!==t&&0!==t.byteLength||(t=new Uint8Array(e.memory.buffer)),t}const r=new Array(128).fill(void 0);r.push(void 0,null,!0,!1);let i=r.length;let a=0;const s="undefined"!=typeof TextEncoder?new TextEncoder("utf-8"):{encode:()=>{throw Error("TextEncoder not available")}},c="function"==typeof s.encodeInto?function(e,n){return s.encodeInto(e,n)}:function(e,n){const t=s.encode(e);return n.set(t),{read:e.length,written:t.length}};function u(e){const n=function(e){return r[e]}(e);return function(e){e<132||(r[e]=i,i=e)}(e),n}function l(){const e={wbg:{}};return e.wbg.__wbindgen_string_new=function(e,t){var a,s;return function(e){i===r.length&&r.push(r.length+1);const n=i;return i=r[n],r[n]=e,n}((a=e,s=t,a>>>=0,n.decode(o().subarray(a,a+s))))},e}async function f(n){if(void 0!==e)return e;void 0===n&&(n="/web_csv_toolbox_wasm_bg.wasm");const o=l();("string"==typeof n||"function"==typeof Request&&n instanceof Request||"function"==typeof URL&&n instanceof URL)&&(n=fetch(n));const{instance:r,module:i}=await async function(e,n){if("function"==typeof Response&&e instanceof Response){if("function"==typeof WebAssembly.instantiateStreaming)try{return await WebAssembly.instantiateStreaming(e,n)}catch(t){if("application/wasm"==e.headers.get("Content-Type"))throw t;console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",t)}const o=await e.arrayBuffer();return await WebAssembly.instantiate(o,n)}{const t=await WebAssembly.instantiate(e,n);return t instanceof WebAssembly.Instance?{instance:t,module:e}:t}}(await n,o);return function(n,o){return e=n.exports,f.__wbindgen_wasm_module=o,t=null,e}(r,i)}exports.default=f,exports.parseStringToArraySync=function(n,t){const r=function(e,n,t){if(void 0===t){const t=s.encode(e),r=n(t.length,1)>>>0;return o().subarray(r,r+t.length).set(t),a=t.length,r}let r=e.length,i=n(r,1)>>>0;const u=o();let l=0;for(;l<r;l++){const n=e.charCodeAt(l);if(n>127)break;u[i+l]=n}if(l!==r){0!==l&&(e=e.slice(l)),i=t(i,r,r=l+3*e.length,1)>>>0;const n=o().subarray(i+l,i+r);l+=c(e,n).written}return a=l,i}(n,e.__wbindgen_malloc,e.__wbindgen_realloc),i=a;return u(e.parseStringToArraySync(r,i,t))};
1
+ "use strict";let e;Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const n="undefined"!=typeof TextDecoder?new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}):{decode:()=>{throw Error("TextDecoder not available")}};"undefined"!=typeof TextDecoder&&n.decode();let t=null;function o(){return null!==t&&0!==t.byteLength||(t=new Uint8Array(e.memory.buffer)),t}const r=new Array(128).fill(void 0);r.push(void 0,null,!0,!1);let i=r.length;let a=0;const s="undefined"!=typeof TextEncoder?new TextEncoder("utf-8"):{encode:()=>{throw Error("TextEncoder not available")}},c="function"==typeof s.encodeInto?function(e,n){return s.encodeInto(e,n)}:function(e,n){const t=s.encode(e);return n.set(t),{read:e.length,written:t.length}};function u(e){const n=function(e){return r[e]}(e);return function(e){e<132||(r[e]=i,i=e)}(e),n}function l(){const e={wbg:{}};return e.wbg.__wbindgen_string_new=function(e,t){var a,s;return function(e){i===r.length&&r.push(r.length+1);const n=i;return i=r[n],r[n]=e,n}((a=e,s=t,a>>>=0,n.decode(o().subarray(a,a+s))))},e}async function f(n){if(void 0!==e)return e;void 0===n&&(n="/web_csv_toolbox_wasm_bg.wasm");const o=l();("string"==typeof n||"function"==typeof Request&&n instanceof Request||"function"==typeof URL&&n instanceof URL)&&(n=fetch(n));const{instance:r,module:i}=await async function(e,n){if("function"==typeof Response&&e instanceof Response){if("function"==typeof WebAssembly.instantiateStreaming)try{return await WebAssembly.instantiateStreaming(e,n)}catch(t){if("application/wasm"==e.headers.get("Content-Type"))throw t;console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",t)}const o=await e.arrayBuffer();return await WebAssembly.instantiate(o,n)}{const t=await WebAssembly.instantiate(e,n);return t instanceof WebAssembly.Instance?{instance:t,module:e}:t}}(await n,o);return function(n,o){return e=n.exports,f.__wbindgen_wasm_module=o,t=null,e}(r,i)}exports.default=f,exports.parseStringToArraySync=function(n,t){const r=function(e,n,t){if(void 0===t){const t=s.encode(e),r=n(t.length,1)>>>0;return o().subarray(r,r+t.length).set(t),a=t.length,r}let r=e.length,i=n(r,1)>>>0;const u=o();let l=0;for(;l<r;l++){const n=e.charCodeAt(l);if(n>127)break;u[i+l]=n}if(l!==r){0!==l&&(e=e.slice(l)),i=t(i,r,r=l+3*e.length,1)>>>0;const n=o().subarray(i+l,i+r);l+=c(e,n).written,i=t(i,r,l,1)>>>0}return a=l,i}(n,e.__wbindgen_malloc,e.__wbindgen_realloc),i=a;return u(e.parseStringToArraySync(r,i,t))};
2
2
  //# sourceMappingURL=_web-csv-toolbox-wasm.cjs.map