From 0b598a3a73ec5d26f6d6ecf9d8409ee246b45f80 Mon Sep 17 00:00:00 2001 From: Huanyi Xie <74809554+xiehuanyi@users.noreply.github.com> Date: Sun, 11 Oct 2026 21:05:55 +0300 Subject: [PATCH 1/3] fix(csv-generate): allow numeric and null column return types --- packages/csv-generate/dist/cjs/index.d.cts | 4 +++- packages/csv-generate/dist/esm/index.d.ts | 4 +++- packages/csv-generate/lib/index.d.ts | 4 +++- packages/csv-generate/test/api.types.ts | 15 +++++++++++++++ 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/packages/csv-generate/dist/cjs/index.d.cts b/packages/csv-generate/dist/cjs/index.d.cts index 581ed32f4..909056478 100644 --- a/packages/csv-generate/dist/cjs/index.d.cts +++ b/packages/csv-generate/dist/cjs/index.d.cts @@ -14,7 +14,9 @@ export type ColumnsFunctionArgs = { options: Options; state: State; }; -export type ColumnsFunction = (args: ColumnsFunctionArgs) => string; +export type ColumnsFunction = ( + args: ColumnsFunctionArgs, +) => string | number | null; export type State = { start_time: number; diff --git a/packages/csv-generate/dist/esm/index.d.ts b/packages/csv-generate/dist/esm/index.d.ts index 581ed32f4..909056478 100644 --- a/packages/csv-generate/dist/esm/index.d.ts +++ b/packages/csv-generate/dist/esm/index.d.ts @@ -14,7 +14,9 @@ export type ColumnsFunctionArgs = { options: Options; state: State; }; -export type ColumnsFunction = (args: ColumnsFunctionArgs) => string; +export type ColumnsFunction = ( + args: ColumnsFunctionArgs, +) => string | number | null; export type State = { start_time: number; diff --git a/packages/csv-generate/lib/index.d.ts b/packages/csv-generate/lib/index.d.ts index 581ed32f4..909056478 100644 --- a/packages/csv-generate/lib/index.d.ts +++ b/packages/csv-generate/lib/index.d.ts @@ -14,7 +14,9 @@ export type ColumnsFunctionArgs = { options: Options; state: State; }; -export type ColumnsFunction = (args: ColumnsFunctionArgs) => string; +export type ColumnsFunction = ( + args: ColumnsFunctionArgs, +) => string | number | null; export type State = { start_time: number; diff --git a/packages/csv-generate/test/api.types.ts b/packages/csv-generate/test/api.types.ts index 23f66e392..8a7918118 100644 --- a/packages/csv-generate/test/api.types.ts +++ b/packages/csv-generate/test/api.types.ts @@ -61,6 +61,21 @@ describe("API Types", function () { ]; }); + it("column functions can return numbers and null", function (next) { + generate( + { + length: 1, + encoding: "utf8", + columns: [() => 42, () => null], + }, + (err, records) => { + if (err) return next(err); + (records as string).should.eql("42,"); + next(); + }, + ); + }); + it("delimiter", function () { const options: Options = {}; options.delimiter = "|"; From e2818b7b603095742666d1cbfbe781f6608d949a Mon Sep 17 00:00:00 2001 From: Huanyi Xie <74809554+xiehuanyi@users.noreply.github.com> Date: Mon, 12 Oct 2026 01:36:53 +0300 Subject: [PATCH 2/3] test(csv-generate): typecheck existing column option coverage --- packages/csv-generate/dist/cjs/index.d.cts | 1 + packages/csv-generate/dist/esm/index.d.ts | 1 + packages/csv-generate/lib/index.d.ts | 1 + packages/csv-generate/test/api.types.ts | 15 --------------- .../{options.columns.js => options.columns.ts} | 10 ++++++---- 5 files changed, 9 insertions(+), 19 deletions(-) rename packages/csv-generate/test/{options.columns.js => options.columns.ts} (93%) diff --git a/packages/csv-generate/dist/cjs/index.d.cts b/packages/csv-generate/dist/cjs/index.d.cts index 909056478..8e0931a87 100644 --- a/packages/csv-generate/dist/cjs/index.d.cts +++ b/packages/csv-generate/dist/cjs/index.d.cts @@ -5,6 +5,7 @@ import * as stream from "stream"; type Callback = (err?: Error, records?: unknown) => void; export class Generator extends stream.Readable { + end(): void; constructor(options?: Options); readonly options: Options; diff --git a/packages/csv-generate/dist/esm/index.d.ts b/packages/csv-generate/dist/esm/index.d.ts index 909056478..8e0931a87 100644 --- a/packages/csv-generate/dist/esm/index.d.ts +++ b/packages/csv-generate/dist/esm/index.d.ts @@ -5,6 +5,7 @@ import * as stream from "stream"; type Callback = (err?: Error, records?: unknown) => void; export class Generator extends stream.Readable { + end(): void; constructor(options?: Options); readonly options: Options; diff --git a/packages/csv-generate/lib/index.d.ts b/packages/csv-generate/lib/index.d.ts index 909056478..8e0931a87 100644 --- a/packages/csv-generate/lib/index.d.ts +++ b/packages/csv-generate/lib/index.d.ts @@ -5,6 +5,7 @@ import * as stream from "stream"; type Callback = (err?: Error, records?: unknown) => void; export class Generator extends stream.Readable { + end(): void; constructor(options?: Options); readonly options: Options; diff --git a/packages/csv-generate/test/api.types.ts b/packages/csv-generate/test/api.types.ts index 8a7918118..23f66e392 100644 --- a/packages/csv-generate/test/api.types.ts +++ b/packages/csv-generate/test/api.types.ts @@ -61,21 +61,6 @@ describe("API Types", function () { ]; }); - it("column functions can return numbers and null", function (next) { - generate( - { - length: 1, - encoding: "utf8", - columns: [() => 42, () => null], - }, - (err, records) => { - if (err) return next(err); - (records as string).should.eql("42,"); - next(); - }, - ); - }); - it("delimiter", function () { const options: Options = {}; options.delimiter = "|"; diff --git a/packages/csv-generate/test/options.columns.js b/packages/csv-generate/test/options.columns.ts similarity index 93% rename from packages/csv-generate/test/options.columns.js rename to packages/csv-generate/test/options.columns.ts index ab49d9aa4..548c256f3 100644 --- a/packages/csv-generate/test/options.columns.js +++ b/packages/csv-generate/test/options.columns.ts @@ -5,7 +5,7 @@ describe("Option `columns`", function () { it("as number", function (next) { this.timeout(1000000); let count = 0; - const data = []; + const data: Buffer[] = []; const generator = generate({ columns: 3 }); generator.on("readable", () => { let d; @@ -26,7 +26,7 @@ describe("Option `columns`", function () { it("as types", function (next) { this.timeout(1000000); let count = 0; - const data = []; + const data: Buffer[] = []; const generator = generate({ columns: ["int", "bool"], seed: 1 }); generator.on("readable", () => { let d; @@ -52,6 +52,7 @@ describe("Option `columns`", function () { try { generate({ columns: ["int", "bool", "invalid"] }); } catch (err) { + if (!(err instanceof Error)) throw err; err.message.should.eql( 'Invalid column type: got "invalid", default values are ["ascii","int","bool"]', ); @@ -61,7 +62,7 @@ describe("Option `columns`", function () { describe("user function", function () { it("accept string or null or number", function (next) { this.timeout(1000000); - const data = []; + const data: string[] = []; const generator = generate({ length: 1, columns: [() => "a", () => null, () => 1], @@ -81,6 +82,7 @@ describe("Option `columns`", function () { it("validate return argument", function (next) { this.timeout(1000000); + // @ts-expect-error Exercise runtime rejection of unsupported return values. const generator = generate({ objectMode: true, columns: [() => ({})], @@ -104,7 +106,7 @@ describe("Option `columns`", function () { it("validate arguments in objectMode", function (next) { this.timeout(1000000); - const data = []; + const data: unknown[] = []; const generator = generate({ objectMode: true, length: 1, From aaac3ac625bff87844e345227e59d587fdf0425e Mon Sep 17 00:00:00 2001 From: Huanyi Xie <74809554+xiehuanyi@users.noreply.github.com> Date: Mon, 12 Oct 2026 01:49:22 +0300 Subject: [PATCH 3/3] test(csv-generate): keep error narrowing static --- packages/csv-generate/test/options.columns.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/csv-generate/test/options.columns.ts b/packages/csv-generate/test/options.columns.ts index 548c256f3..1b00d7e26 100644 --- a/packages/csv-generate/test/options.columns.ts +++ b/packages/csv-generate/test/options.columns.ts @@ -52,8 +52,7 @@ describe("Option `columns`", function () { try { generate({ columns: ["int", "bool", "invalid"] }); } catch (err) { - if (!(err instanceof Error)) throw err; - err.message.should.eql( + (err as Error).message.should.eql( 'Invalid column type: got "invalid", default values are ["ascii","int","bool"]', ); }