From cb8adaabf7de8043f7b7d175e55812272434b932 Mon Sep 17 00:00:00 2001 From: Huanyi Xie <74809554+xiehuanyi@users.noreply.github.com> Date: Sun, 11 Oct 2026 21:11:21 +0300 Subject: [PATCH] fix(csv-generate): throw synchronous generation validation errors --- packages/csv-generate/dist/cjs/sync.cjs | 4 +++ packages/csv-generate/dist/esm/sync.js | 4 +++ packages/csv-generate/dist/iife/sync.js | 4 +++ packages/csv-generate/dist/umd/sync.js | 4 +++ packages/csv-generate/lib/sync.js | 4 +++ packages/csv-generate/test/api.sync.js | 33 +++++++++++++++++++++++++ 6 files changed, 53 insertions(+) diff --git a/packages/csv-generate/dist/cjs/sync.cjs b/packages/csv-generate/dist/cjs/sync.cjs index 706d85218..925b7fc1f 100644 --- a/packages/csv-generate/dist/cjs/sync.cjs +++ b/packages/csv-generate/dist/cjs/sync.cjs @@ -289,6 +289,10 @@ const generate = function (options) { } chunks.push(chunk); }; + // Surface validation errors synchronously instead of emitting stream errors. + generator.destroy = function (err) { + throw err; + }; while (work) { generator.__read(options.highWaterMark); } diff --git a/packages/csv-generate/dist/esm/sync.js b/packages/csv-generate/dist/esm/sync.js index 79425a1ee..3ee36b7cc 100644 --- a/packages/csv-generate/dist/esm/sync.js +++ b/packages/csv-generate/dist/esm/sync.js @@ -5399,6 +5399,10 @@ const generate = function (options) { } chunks.push(chunk); }; + // Surface validation errors synchronously instead of emitting stream errors. + generator.destroy = function (err) { + throw err; + }; while (work) { generator.__read(options.highWaterMark); } diff --git a/packages/csv-generate/dist/iife/sync.js b/packages/csv-generate/dist/iife/sync.js index 567b84111..4e077caab 100644 --- a/packages/csv-generate/dist/iife/sync.js +++ b/packages/csv-generate/dist/iife/sync.js @@ -5402,6 +5402,10 @@ var csv_generate_sync = (function (exports) { } chunks.push(chunk); }; + // Surface validation errors synchronously instead of emitting stream errors. + generator.destroy = function (err) { + throw err; + }; while (work) { generator.__read(options.highWaterMark); } diff --git a/packages/csv-generate/dist/umd/sync.js b/packages/csv-generate/dist/umd/sync.js index 1db9d412f..e22a99ea2 100644 --- a/packages/csv-generate/dist/umd/sync.js +++ b/packages/csv-generate/dist/umd/sync.js @@ -5405,6 +5405,10 @@ } chunks.push(chunk); }; + // Surface validation errors synchronously instead of emitting stream errors. + generator.destroy = function (err) { + throw err; + }; while (work) { generator.__read(options.highWaterMark); } diff --git a/packages/csv-generate/lib/sync.js b/packages/csv-generate/lib/sync.js index a4e744541..644d6b1d5 100644 --- a/packages/csv-generate/lib/sync.js +++ b/packages/csv-generate/lib/sync.js @@ -28,6 +28,10 @@ const generate = function (options) { } chunks.push(chunk); }; + // Surface validation errors synchronously instead of emitting stream errors. + generator.destroy = function (err) { + throw err; + }; while (work) { generator.__read(options.highWaterMark); } diff --git a/packages/csv-generate/test/api.sync.js b/packages/csv-generate/test/api.sync.js index cd4443faa..ae96456ac 100644 --- a/packages/csv-generate/test/api.sync.js +++ b/packages/csv-generate/test/api.sync.js @@ -1,3 +1,4 @@ +import assert from "node:assert/strict"; import "should"; import { generate } from "../lib/sync.js"; @@ -17,6 +18,38 @@ describe("api sync", function () { ); }); + for (const value of [true, undefined, {}]) { + it(`throws for unsupported column value ${JSON.stringify(value)}`, function () { + (() => generate({ length: 1, columns: [() => value] })).should.throw( + /^INVALID_VALUE:/, + ); + }); + } + + it("throws instead of returning partially generated records", function () { + (() => + generate({ + length: 2, + columns: [({ state }) => (state.count_created === 0 ? "ok" : true)], + })).should.throw(/^INVALID_VALUE:/); + }); + + it("preserves errors thrown by column functions", function () { + const error = new Error("column failed"); + assert.throws( + () => + generate({ + length: 1, + columns: [ + () => { + throw error; + }, + ], + }), + (caught) => caught === error, + ); + }); + it("accept length as an integer", function () { const data = generate(1000); data.split(/\n/).length.should.eql(1000);