@prairielearn/csv 2.0.23 → 3.0.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @prairielearn/csv
2
2
 
3
+ ## 3.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - 3914bb4: Upgrade to Node 24
8
+
9
+ ## 2.0.24
10
+
11
+ ### Patch Changes
12
+
13
+ - 0900843: Switch to the `tsgo` compiler
14
+
3
15
  ## 2.0.23
4
16
 
5
17
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,OAAO,IAAI,kBAAkB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE3F,OAAO,EAAE,KAAK,OAAO,IAAI,gBAAgB,EAAa,MAAM,kBAAkB,CAAC;AAE/E,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AAElC,MAAM,WAAW,2BAA4B,SAAQ,kBAAkB;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,GAAG,EAAE,EACX,OAAO,GAAE,2BAAgC,GACxC,WAAW,CAuBb;AAED,UAAU,gBAAgB,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAE,SAAQ,IAAI,CAAC,kBAAkB,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC3F,SAAS,CAAC,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CACpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,EACxC,OAAO,GAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAM,GACnC,MAAM,CAAC,eAAe,CAMxB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,OAAO,IAAI,kBAAkB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE3F,OAAO,EAAE,KAAK,OAAO,IAAI,gBAAgB,EAAa,MAAM,kBAAkB,CAAC;AAE/E,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AAElC,MAAM,WAAW,2BAA4B,SAAQ,kBAAkB;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,GAAG,EAAE,EACX,OAAO,GAAE,2BAAgC,GACxC,WAAW,CAuBb;AAED,UAAU,gBAAgB,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAE,SAAQ,IAAI,CAAC,kBAAkB,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC3F,SAAS,CAAC,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CACpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,EACxC,OAAO,GAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAM,GACnC,MAAM,CAAC,eAAe,CAMxB","sourcesContent":["import { Stringifier, type Options as StringifierOptions, stringify } from 'csv-stringify';\nimport multipipe from 'multipipe';\nimport { type Handler as TransformHandler, transform } from 'stream-transform';\n\nexport { stringify, Stringifier };\n\nexport interface StringifyNonblockingOptions extends StringifierOptions {\n batchSize?: number;\n}\n\n/**\n * Streaming transform from an array of objects to a CSV that doesn't\n * block the event loop.\n */\nexport function stringifyNonblocking(\n data: any[],\n options: StringifyNonblockingOptions = {},\n): Stringifier {\n const { batchSize = 100, ...stringifierOptions } = options;\n const stringifier = new Stringifier(stringifierOptions);\n\n process.nextTick(function () {\n let j = 0;\n\n function loop() {\n for (let i = 0; i < batchSize; i++) {\n if (j < data.length) {\n stringifier.write(data[j]);\n j += 1;\n } else {\n stringifier.end();\n return;\n }\n }\n setImmediate(loop);\n }\n loop();\n });\n\n return stringifier;\n}\n\ninterface StringifyOptions<T, U = any> extends Pick<StringifierOptions, 'columns' | 'header'> {\n transform?: TransformHandler<T, U>;\n}\n\n/**\n * Transforms an object stream into a CSV stream.\n *\n * This is a thin wrapper around `stringify` from the `csv-stringify` package\n * with added support for transforming the input stream.\n *\n * Works best when combined with the `pipeline` function from\n * `node:stream/promises`, which will help ensure that errors are handled properly.\n */\nexport function stringifyStream<T, U = any>(\n options: StringifyOptions<T, U> = {},\n): NodeJS.ReadWriteStream {\n const { transform: _transform, ...stringifierOptions } = options;\n const stringifier = new Stringifier(stringifierOptions);\n if (!_transform) return stringifier;\n // TODO: use native `node:stream#compose` once it's stable.\n return multipipe(transform(_transform), stringifier);\n}\n"]}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAsC,SAAS,EAAE,MAAM,eAAe,CAAC;AAC3F,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,EAAoC,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE/E,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AAMlC;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAW,EACX,UAAuC,EAAE;IAEzC,MAAM,EAAE,SAAS,GAAG,GAAG,EAAE,GAAG,kBAAkB,EAAE,GAAG,OAAO,CAAC;IAC3D,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAExD,OAAO,CAAC,QAAQ,CAAC;QACf,IAAI,CAAC,GAAG,CAAC,CAAC;QAEV,SAAS,IAAI;YACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;gBACnC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;oBACpB,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC3B,CAAC,IAAI,CAAC,CAAC;gBACT,CAAC;qBAAM,CAAC;oBACN,WAAW,CAAC,GAAG,EAAE,CAAC;oBAClB,OAAO;gBACT,CAAC;YACH,CAAC;YACD,YAAY,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QACD,IAAI,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC;AACrB,CAAC;AAMD;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC7B,UAAkC,EAAE;IAEpC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,kBAAkB,EAAE,GAAG,OAAO,CAAC;IACjE,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,kBAAkB,CAAC,CAAC;IACxD,IAAI,CAAC,UAAU;QAAE,OAAO,WAAW,CAAC;IACpC,2DAA2D;IAC3D,OAAO,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,CAAC;AACvD,CAAC","sourcesContent":["import { Stringifier, type Options as StringifierOptions, stringify } from 'csv-stringify';\nimport multipipe from 'multipipe';\nimport { type Handler as TransformHandler, transform } from 'stream-transform';\n\nexport { stringify, Stringifier };\n\nexport interface StringifyNonblockingOptions extends StringifierOptions {\n batchSize?: number;\n}\n\n/**\n * Streaming transform from an array of objects to a CSV that doesn't\n * block the event loop.\n */\nexport function stringifyNonblocking(\n data: any[],\n options: StringifyNonblockingOptions = {},\n): Stringifier {\n const { batchSize = 100, ...stringifierOptions } = options;\n const stringifier = new Stringifier(stringifierOptions);\n\n process.nextTick(function () {\n let j = 0;\n\n function loop() {\n for (let i = 0; i < batchSize; i++) {\n if (j < data.length) {\n stringifier.write(data[j]);\n j += 1;\n } else {\n stringifier.end();\n return;\n }\n }\n setImmediate(loop);\n }\n loop();\n });\n\n return stringifier;\n}\n\ninterface StringifyOptions<T, U = any> extends Pick<StringifierOptions, 'columns' | 'header'> {\n transform?: TransformHandler<T, U>;\n}\n\n/**\n * Transforms an object stream into a CSV stream.\n *\n * This is a thin wrapper around `stringify` from the `csv-stringify` package\n * with added support for transforming the input stream.\n *\n * Works best when combined with the `pipeline` function from\n * `node:stream/promises`, which will help ensure that errors are handled properly.\n */\nexport function stringifyStream<T, U = any>(\n options: StringifyOptions<T, U> = {},\n): NodeJS.ReadWriteStream {\n const { transform: _transform, ...stringifierOptions } = options;\n const stringifier = new Stringifier(stringifierOptions);\n if (!_transform) return stringifier;\n // TODO: use native `node:stream#compose` once it's stable.\n return multipipe(transform(_transform), stringifier);\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAsC,SAAS,EAAE,MAAM,eAAe,CAAC;AAC3F,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,EAAoC,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE/E,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AAMlC;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAW,EACX,OAAO,GAAgC,EAAE,EAC5B;IACb,MAAM,EAAE,SAAS,GAAG,GAAG,EAAE,GAAG,kBAAkB,EAAE,GAAG,OAAO,CAAC;IAC3D,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAExD,OAAO,CAAC,QAAQ,CAAC,YAAY;QAC3B,IAAI,CAAC,GAAG,CAAC,CAAC;QAEV,SAAS,IAAI,GAAG;YACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;gBACnC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;oBACpB,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC3B,CAAC,IAAI,CAAC,CAAC;gBACT,CAAC;qBAAM,CAAC;oBACN,WAAW,CAAC,GAAG,EAAE,CAAC;oBAClB,OAAO;gBACT,CAAC;YACH,CAAC;YACD,YAAY,CAAC,IAAI,CAAC,CAAC;QAAA,CACpB;QACD,IAAI,EAAE,CAAC;IAAA,CACR,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC;AAAA,CACpB;AAMD;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAO,GAA2B,EAAE,EACZ;IACxB,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,kBAAkB,EAAE,GAAG,OAAO,CAAC;IACjE,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,kBAAkB,CAAC,CAAC;IACxD,IAAI,CAAC,UAAU;QAAE,OAAO,WAAW,CAAC;IACpC,2DAA2D;IAC3D,OAAO,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,CAAC;AAAA,CACtD","sourcesContent":["import { Stringifier, type Options as StringifierOptions, stringify } from 'csv-stringify';\nimport multipipe from 'multipipe';\nimport { type Handler as TransformHandler, transform } from 'stream-transform';\n\nexport { stringify, Stringifier };\n\nexport interface StringifyNonblockingOptions extends StringifierOptions {\n batchSize?: number;\n}\n\n/**\n * Streaming transform from an array of objects to a CSV that doesn't\n * block the event loop.\n */\nexport function stringifyNonblocking(\n data: any[],\n options: StringifyNonblockingOptions = {},\n): Stringifier {\n const { batchSize = 100, ...stringifierOptions } = options;\n const stringifier = new Stringifier(stringifierOptions);\n\n process.nextTick(function () {\n let j = 0;\n\n function loop() {\n for (let i = 0; i < batchSize; i++) {\n if (j < data.length) {\n stringifier.write(data[j]);\n j += 1;\n } else {\n stringifier.end();\n return;\n }\n }\n setImmediate(loop);\n }\n loop();\n });\n\n return stringifier;\n}\n\ninterface StringifyOptions<T, U = any> extends Pick<StringifierOptions, 'columns' | 'header'> {\n transform?: TransformHandler<T, U>;\n}\n\n/**\n * Transforms an object stream into a CSV stream.\n *\n * This is a thin wrapper around `stringify` from the `csv-stringify` package\n * with added support for transforming the input stream.\n *\n * Works best when combined with the `pipeline` function from\n * `node:stream/promises`, which will help ensure that errors are handled properly.\n */\nexport function stringifyStream<T, U = any>(\n options: StringifyOptions<T, U> = {},\n): NodeJS.ReadWriteStream {\n const { transform: _transform, ...stringifierOptions } = options;\n const stringifier = new Stringifier(stringifierOptions);\n if (!_transform) return stringifier;\n // TODO: use native `node:stream#compose` once it's stable.\n return multipipe(transform(_transform), stringifier);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"","sourcesContent":["import { Readable } from 'node:stream';\n\nimport { assert, describe, it } from 'vitest';\n\nimport { stringifyStream } from './index.js';\n\nfunction streamToString(stream: NodeJS.ReadableStream): Promise<string> {\n const chunks: Buffer[] = [];\n return new Promise((resolve, reject) => {\n stream.on('data', (chunk) => chunks.push(Buffer.from(chunk)));\n stream.on('error', reject);\n stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));\n });\n}\n\ndescribe('stringifyStream', () => {\n it('stringifies a stream of objects', async () => {\n const stream = Readable.from([\n { a: 1, b: 1 },\n { a: 2, b: 2 },\n { a: 3, b: 3 },\n ]);\n const csvStream = stream.pipe(stringifyStream());\n const csv = await streamToString(csvStream);\n assert.equal(csv, '1,1\\n2,2\\n3,3\\n');\n });\n\n it('stringifies a stream of arrays', async () => {\n const stream = Readable.from([\n ['1', '1'],\n ['2', '2'],\n ['3', '3'],\n ]);\n const csvStream = stream.pipe(stringifyStream());\n const csv = await streamToString(csvStream);\n assert.equal(csv, '1,1\\n2,2\\n3,3\\n');\n });\n\n it('stringifies a stream with a transform', async () => {\n const stream = Readable.from([\n { a: 1, b: 1 },\n { a: 2, b: 2 },\n { a: 3, b: 3 },\n ]);\n const csvStream = stream.pipe(\n stringifyStream<{ a: number; b: number }>({\n transform: (row) => [row.a + 1, row.b + 2],\n }),\n );\n const csv = await streamToString(csvStream);\n assert.equal(csv, '2,3\\n3,4\\n4,5\\n');\n });\n\n it('stringifies a stream with keyed columns and a transform', async () => {\n const stream = Readable.from([\n { a: 1, b: 1 },\n { a: 2, b: 2 },\n { a: 3, b: 3 },\n ]);\n const stringifier = stringifyStream<{ a: number; b: number }>({\n header: true,\n columns: [\n { key: 'a', header: 'first' },\n { key: 'b', header: 'second' },\n ],\n transform: (row) => [row.a + 1, row.b + 2],\n });\n const csv = await streamToString(stream.pipe(stringifier));\n assert.equal(csv, 'first,second\\n2,3\\n3,4\\n4,5\\n');\n });\n\n it('stringifies a stream with named columns and a transform', async () => {\n const stream = Readable.from([\n { a: 1, b: 1 },\n { a: 2, b: 2 },\n { a: 3, b: 3 },\n ]);\n const stringifier = stringifyStream<{ a: number; b: number }>({\n header: true,\n columns: ['first', 'second'],\n transform: (row) => [row.a + 1, row.b + 2],\n });\n const csv = await streamToString(stream.pipe(stringifier));\n assert.equal(csv, 'first,second\\n2,3\\n3,4\\n4,5\\n');\n });\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { Readable } from 'node:stream';\n\nimport { assert, describe, it } from 'vitest';\n\nimport { stringifyStream } from './index.js';\n\nfunction streamToString(stream: NodeJS.ReadableStream): Promise<string> {\n const chunks: Buffer[] = [];\n return new Promise((resolve, reject) => {\n stream.on('data', (chunk) => chunks.push(Buffer.from(chunk)));\n stream.on('error', reject);\n stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));\n });\n}\n\ndescribe('stringifyStream', () => {\n it('stringifies a stream of objects', async () => {\n const stream = Readable.from([\n { a: 1, b: 1 },\n { a: 2, b: 2 },\n { a: 3, b: 3 },\n ]);\n const csvStream = stream.pipe(stringifyStream());\n const csv = await streamToString(csvStream);\n assert.equal(csv, '1,1\\n2,2\\n3,3\\n');\n });\n\n it('stringifies a stream of arrays', async () => {\n const stream = Readable.from([\n ['1', '1'],\n ['2', '2'],\n ['3', '3'],\n ]);\n const csvStream = stream.pipe(stringifyStream());\n const csv = await streamToString(csvStream);\n assert.equal(csv, '1,1\\n2,2\\n3,3\\n');\n });\n\n it('stringifies a stream with a transform', async () => {\n const stream = Readable.from([\n { a: 1, b: 1 },\n { a: 2, b: 2 },\n { a: 3, b: 3 },\n ]);\n const csvStream = stream.pipe(\n stringifyStream<{ a: number; b: number }>({\n transform: (row) => [row.a + 1, row.b + 2],\n }),\n );\n const csv = await streamToString(csvStream);\n assert.equal(csv, '2,3\\n3,4\\n4,5\\n');\n });\n\n it('stringifies a stream with keyed columns and a transform', async () => {\n const stream = Readable.from([\n { a: 1, b: 1 },\n { a: 2, b: 2 },\n { a: 3, b: 3 },\n ]);\n const stringifier = stringifyStream<{ a: number; b: number }>({\n header: true,\n columns: [\n { key: 'a', header: 'first' },\n { key: 'b', header: 'second' },\n ],\n transform: (row) => [row.a + 1, row.b + 2],\n });\n const csv = await streamToString(stream.pipe(stringifier));\n assert.equal(csv, 'first,second\\n2,3\\n3,4\\n4,5\\n');\n });\n\n it('stringifies a stream with named columns and a transform', async () => {\n const stream = Readable.from([\n { a: 1, b: 1 },\n { a: 2, b: 2 },\n { a: 3, b: 3 },\n ]);\n const stringifier = stringifyStream<{ a: number; b: number }>({\n header: true,\n columns: ['first', 'second'],\n transform: (row) => [row.a + 1, row.b + 2],\n });\n const csv = await streamToString(stream.pipe(stringifier));\n assert.equal(csv, 'first,second\\n2,3\\n3,4\\n4,5\\n');\n });\n});\n"]}
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { Readable } from 'node:stream';\n\nimport { assert, describe, it } from 'vitest';\n\nimport { stringifyStream } from './index.js';\n\nfunction streamToString(stream: NodeJS.ReadableStream): Promise<string> {\n const chunks: Buffer[] = [];\n return new Promise((resolve, reject) => {\n stream.on('data', (chunk) => chunks.push(Buffer.from(chunk)));\n stream.on('error', reject);\n stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));\n });\n}\n\ndescribe('stringifyStream', () => {\n it('stringifies a stream of objects', async () => {\n const stream = Readable.from([\n { a: 1, b: 1 },\n { a: 2, b: 2 },\n { a: 3, b: 3 },\n ]);\n const csvStream = stream.pipe(stringifyStream());\n const csv = await streamToString(csvStream);\n assert.equal(csv, '1,1\\n2,2\\n3,3\\n');\n });\n\n it('stringifies a stream of arrays', async () => {\n const stream = Readable.from([\n ['1', '1'],\n ['2', '2'],\n ['3', '3'],\n ]);\n const csvStream = stream.pipe(stringifyStream());\n const csv = await streamToString(csvStream);\n assert.equal(csv, '1,1\\n2,2\\n3,3\\n');\n });\n\n it('stringifies a stream with a transform', async () => {\n const stream = Readable.from([\n { a: 1, b: 1 },\n { a: 2, b: 2 },\n { a: 3, b: 3 },\n ]);\n const csvStream = stream.pipe(\n stringifyStream<{ a: number; b: number }>({\n transform: (row) => [row.a + 1, row.b + 2],\n }),\n );\n const csv = await streamToString(csvStream);\n assert.equal(csv, '2,3\\n3,4\\n4,5\\n');\n });\n\n it('stringifies a stream with keyed columns and a transform', async () => {\n const stream = Readable.from([\n { a: 1, b: 1 },\n { a: 2, b: 2 },\n { a: 3, b: 3 },\n ]);\n const stringifier = stringifyStream<{ a: number; b: number }>({\n header: true,\n columns: [\n { key: 'a', header: 'first' },\n { key: 'b', header: 'second' },\n ],\n transform: (row) => [row.a + 1, row.b + 2],\n });\n const csv = await streamToString(stream.pipe(stringifier));\n assert.equal(csv, 'first,second\\n2,3\\n3,4\\n4,5\\n');\n });\n\n it('stringifies a stream with named columns and a transform', async () => {\n const stream = Readable.from([\n { a: 1, b: 1 },\n { a: 2, b: 2 },\n { a: 3, b: 3 },\n ]);\n const stringifier = stringifyStream<{ a: number; b: number }>({\n header: true,\n columns: ['first', 'second'],\n transform: (row) => [row.a + 1, row.b + 2],\n });\n const csv = await streamToString(stream.pipe(stringifier));\n assert.equal(csv, 'first,second\\n2,3\\n3,4\\n4,5\\n');\n });\n});\n"]}
package/package.json CHANGED
@@ -1,16 +1,19 @@
1
1
  {
2
2
  "name": "@prairielearn/csv",
3
- "version": "2.0.23",
3
+ "version": "3.0.0",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/PrairieLearn/PrairieLearn.git",
8
8
  "directory": "packages/csv"
9
9
  },
10
+ "engines": {
11
+ "node": ">=24.0.0"
12
+ },
10
13
  "main": "./dist/index.js",
11
14
  "scripts": {
12
- "build": "tsc",
13
- "dev": "tsc --watch --preserveWatchOutput",
15
+ "build": "tsgo",
16
+ "dev": "tsgo --watch --preserveWatchOutput",
14
17
  "test": "vitest run --coverage"
15
18
  },
16
19
  "dependencies": {
@@ -21,10 +24,11 @@
21
24
  "devDependencies": {
22
25
  "@prairielearn/tsconfig": "^0.0.0",
23
26
  "@types/multipipe": "^3.0.5",
24
- "@types/node": "^22.19.3",
25
- "@vitest/coverage-v8": "^4.0.16",
27
+ "@types/node": "^24.10.9",
28
+ "@typescript/native-preview": "^7.0.0-dev.20260106.1",
29
+ "@vitest/coverage-v8": "^4.0.17",
26
30
  "tsx": "^4.21.0",
27
31
  "typescript": "^5.9.3",
28
- "vitest": "^4.0.16"
32
+ "vitest": "^4.0.17"
29
33
  }
30
34
  }