diff --git a/packages/csv-generate/lib/stream.js b/packages/csv-generate/lib/stream.js index 88c88f2f8..273fb669e 100644 --- a/packages/csv-generate/lib/stream.js +++ b/packages/csv-generate/lib/stream.js @@ -15,8 +15,12 @@ const generate = (opts) => { chunk = Buffer.from(chunk); controller.enqueue(chunk); }, - function () { - controller.close(); + function (err) { + if (err) { + controller.error(err); + } else { + controller.close(); + } }, ); }, diff --git a/packages/csv-generate/test/api.web_stream.js b/packages/csv-generate/test/api.web_stream.js index df49f5db6..49e8ac706 100644 --- a/packages/csv-generate/test/api.web_stream.js +++ b/packages/csv-generate/test/api.web_stream.js @@ -1,8 +1,36 @@ import "should"; +import assert from "node:assert/strict"; import { generate as generateStream } from "../lib/stream.js"; import { generate as generateClassic } from "../lib/index.js"; describe("api stream", function () { + it("rejects invalid column values", async function () { + const reader = generateStream({ + length: 1, + columns: [() => ({})], + }).getReader(); + const error = { + message: + "INVALID_VALUE: values returned by column function must be a string, a number or null, got {}", + }; + await Promise.all([ + assert.rejects(reader.read(), error), + assert.rejects(reader.closed, error), + ]); + }); + + it("closes after generating valid values", async function () { + const reader = generateStream({ + length: 1, + columns: [() => "a", () => null, () => 1], + }).getReader(); + const { value, done } = await reader.read(); + assert.equal(done, false); + assert.equal(value.toString(), "a,,1"); + assert.deepEqual(await reader.read(), { value: undefined, done: true }); + await reader.closed; + }); + it.skip("perf classic", async function () { console.time("classic"); const generator = generateClassic({