@prairielearn/csv 1.0.14 → 2.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/.mocharc.cjs ADDED
@@ -0,0 +1,3 @@
1
+ module.exports = {
2
+ require: ['tsx'],
3
+ };
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @prairielearn/csv
2
2
 
3
+ ## 2.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - 4f30b7e: Publish as native ESM
8
+
9
+ ## 1.0.15
10
+
11
+ ### Patch Changes
12
+
13
+ - c7e6553: Upgrade all JavaScript dependencies
14
+
3
15
  ## 1.0.14
4
16
 
5
17
  ### Patch Changes
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- /// <reference types="node" />
1
+ /// <reference types="node" resolution-mode="require"/>
2
2
  import { stringify, Stringifier, Options as StringifierOptions } from 'csv-stringify';
3
3
  import { Handler as TransformHandler } from 'stream-transform';
4
4
  export { stringify, Stringifier };
package/dist/index.js CHANGED
@@ -1,21 +1,14 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.stringifyStream = exports.stringifyNonblocking = exports.Stringifier = exports.stringify = void 0;
7
- const csv_stringify_1 = require("csv-stringify");
8
- Object.defineProperty(exports, "stringify", { enumerable: true, get: function () { return csv_stringify_1.stringify; } });
9
- Object.defineProperty(exports, "Stringifier", { enumerable: true, get: function () { return csv_stringify_1.Stringifier; } });
10
- const stream_transform_1 = require("stream-transform");
11
- const multipipe_1 = __importDefault(require("multipipe"));
1
+ import { stringify, Stringifier } from 'csv-stringify';
2
+ import { transform } from 'stream-transform';
3
+ import multipipe from 'multipipe';
4
+ export { stringify, Stringifier };
12
5
  /**
13
6
  * Streaming transform from an array of objects to a CSV that doesn't
14
7
  * block the event loop.
15
8
  */
16
- function stringifyNonblocking(data, options = {}) {
9
+ export function stringifyNonblocking(data, options = {}) {
17
10
  const { batchSize = 100, ...stringifierOptions } = options;
18
- const stringifier = new csv_stringify_1.Stringifier(stringifierOptions);
11
+ const stringifier = new Stringifier(stringifierOptions);
19
12
  process.nextTick(function () {
20
13
  let j = 0;
21
14
  function loop() {
@@ -35,7 +28,6 @@ function stringifyNonblocking(data, options = {}) {
35
28
  });
36
29
  return stringifier;
37
30
  }
38
- exports.stringifyNonblocking = stringifyNonblocking;
39
31
  /**
40
32
  * Transforms an object stream into a CSV stream.
41
33
  *
@@ -45,13 +37,12 @@ exports.stringifyNonblocking = stringifyNonblocking;
45
37
  * Works best when combined with the `pipeline` function from
46
38
  * `node:stream/promises`, which will help ensure that errors are handled properly.
47
39
  */
48
- function stringifyStream(options = {}) {
40
+ export function stringifyStream(options = {}) {
49
41
  const { transform: _transform, ...stringifierOptions } = options;
50
- const stringifier = new csv_stringify_1.Stringifier(stringifierOptions);
42
+ const stringifier = new Stringifier(stringifierOptions);
51
43
  if (!_transform)
52
44
  return stringifier;
53
45
  // TODO: use native `node:stream#compose` once it's stable.
54
- return (0, multipipe_1.default)((0, stream_transform_1.transform)(_transform), stringifier);
46
+ return multipipe(transform(_transform), stringifier);
55
47
  }
56
- exports.stringifyStream = stringifyStream;
57
48
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,iDAAsF;AAI7E,0FAJA,yBAAS,OAIA;AAAE,4FAJA,2BAAW,OAIA;AAH/B,uDAA0E;AAC1E,0DAAkC;AAQlC;;;GAGG;AACH,SAAgB,oBAAoB,CAClC,IAAW,EACX,UAAuC,EAAE;IAEzC,MAAM,EAAE,SAAS,GAAG,GAAG,EAAE,GAAG,kBAAkB,EAAE,GAAG,OAAO,CAAC;IAC3D,MAAM,WAAW,GAAG,IAAI,2BAAW,CAAC,kBAAkB,CAAC,CAAC;IAExD,OAAO,CAAC,QAAQ,CAAC;QACf,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,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;AAzBD,oDAyBC;AAOD;;;;;;;;GAQG;AACH,SAAgB,eAAe,CAC7B,UAAkC,EAAE;IAEpC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,kBAAkB,EAAE,GAAG,OAAO,CAAC;IACjE,MAAM,WAAW,GAAG,IAAI,2BAAW,CAAC,kBAAkB,CAAC,CAAC;IACxD,IAAI,CAAC,UAAU;QAAE,OAAO,WAAW,CAAC;IACpC,2DAA2D;IAC3D,OAAO,IAAA,mBAAS,EAAC,IAAA,4BAAS,EAAC,UAAU,CAAC,EAAE,WAAW,CAAC,CAAC;AACvD,CAAC;AARD,0CAQC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAiC,MAAM,eAAe,CAAC;AACtF,OAAO,EAAE,SAAS,EAA+B,MAAM,kBAAkB,CAAC;AAC1E,OAAO,SAAS,MAAM,WAAW,CAAC;AAElC,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;QACV,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;AAOD;;;;;;;;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 { stringify, Stringifier, Options as StringifierOptions } from 'csv-stringify';\nimport { transform, Handler as TransformHandler } from 'stream-transform';\nimport multipipe from 'multipipe';\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 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 = any, U = any>\n 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 = any, 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,8 +1,6 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const node_stream_1 = require("node:stream");
4
- const chai_1 = require("chai");
5
- const index_1 = require("./index");
1
+ import { Readable } from 'node:stream';
2
+ import { assert } from 'chai';
3
+ import { stringifyStream } from './index.js';
6
4
  function streamToString(stream) {
7
5
  const chunks = [];
8
6
  return new Promise((resolve, reject) => {
@@ -13,42 +11,42 @@ function streamToString(stream) {
13
11
  }
14
12
  describe('stringifyStream', () => {
15
13
  it('stringifies a stream of objects', async () => {
16
- const stream = node_stream_1.Readable.from([
14
+ const stream = Readable.from([
17
15
  { a: 1, b: 1 },
18
16
  { a: 2, b: 2 },
19
17
  { a: 3, b: 3 },
20
18
  ]);
21
- const csvStream = stream.pipe((0, index_1.stringifyStream)());
19
+ const csvStream = stream.pipe(stringifyStream());
22
20
  const csv = await streamToString(csvStream);
23
- chai_1.assert.equal(csv, '1,1\n2,2\n3,3\n');
21
+ assert.equal(csv, '1,1\n2,2\n3,3\n');
24
22
  });
25
23
  it('stringifies a stream of arrays', async () => {
26
- const stream = node_stream_1.Readable.from([
24
+ const stream = Readable.from([
27
25
  ['1', '1'],
28
26
  ['2', '2'],
29
27
  ['3', '3'],
30
28
  ]);
31
- const csvStream = stream.pipe((0, index_1.stringifyStream)());
29
+ const csvStream = stream.pipe(stringifyStream());
32
30
  const csv = await streamToString(csvStream);
33
- chai_1.assert.equal(csv, '1,1\n2,2\n3,3\n');
31
+ assert.equal(csv, '1,1\n2,2\n3,3\n');
34
32
  });
35
33
  it('stringifies a stream with a transform', async () => {
36
- const stream = node_stream_1.Readable.from([
34
+ const stream = Readable.from([
37
35
  { a: 1, b: 1 },
38
36
  { a: 2, b: 2 },
39
37
  { a: 3, b: 3 },
40
38
  ]);
41
- const csvStream = stream.pipe((0, index_1.stringifyStream)({ transform: (row) => [row.a + 1, row.b + 2] }));
39
+ const csvStream = stream.pipe(stringifyStream({ transform: (row) => [row.a + 1, row.b + 2] }));
42
40
  const csv = await streamToString(csvStream);
43
- chai_1.assert.equal(csv, '2,3\n3,4\n4,5\n');
41
+ assert.equal(csv, '2,3\n3,4\n4,5\n');
44
42
  });
45
43
  it('stringifies a stream with keyed columns and a transform', async () => {
46
- const stream = node_stream_1.Readable.from([
44
+ const stream = Readable.from([
47
45
  { a: 1, b: 1 },
48
46
  { a: 2, b: 2 },
49
47
  { a: 3, b: 3 },
50
48
  ]);
51
- const stringifier = (0, index_1.stringifyStream)({
49
+ const stringifier = stringifyStream({
52
50
  header: true,
53
51
  columns: [
54
52
  { key: 'a', header: 'first' },
@@ -57,21 +55,21 @@ describe('stringifyStream', () => {
57
55
  transform: (row) => [row.a + 1, row.b + 2],
58
56
  });
59
57
  const csv = await streamToString(stream.pipe(stringifier));
60
- chai_1.assert.equal(csv, 'first,second\n2,3\n3,4\n4,5\n');
58
+ assert.equal(csv, 'first,second\n2,3\n3,4\n4,5\n');
61
59
  });
62
60
  it('stringifies a stream with named columns and a transform', async () => {
63
- const stream = node_stream_1.Readable.from([
61
+ const stream = Readable.from([
64
62
  { a: 1, b: 1 },
65
63
  { a: 2, b: 2 },
66
64
  { a: 3, b: 3 },
67
65
  ]);
68
- const stringifier = (0, index_1.stringifyStream)({
66
+ const stringifier = stringifyStream({
69
67
  header: true,
70
68
  columns: ['first', 'second'],
71
69
  transform: (row) => [row.a + 1, row.b + 2],
72
70
  });
73
71
  const csv = await streamToString(stream.pipe(stringifier));
74
- chai_1.assert.equal(csv, 'first,second\n2,3\n3,4\n4,5\n');
72
+ assert.equal(csv, 'first,second\n2,3\n3,4\n4,5\n');
75
73
  });
76
74
  });
77
75
  //# sourceMappingURL=index.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
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';\nimport { assert } from 'chai';\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(stringifyStream({ transform: (row) => [row.a + 1, row.b + 2] }));\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({\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({\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,6 +1,7 @@
1
1
  {
2
2
  "name": "@prairielearn/csv",
3
- "version": "1.0.14",
3
+ "version": "2.0.0",
4
+ "type": "module",
4
5
  "main": "./dist/index.js",
5
6
  "repository": {
6
7
  "type": "git",
@@ -10,16 +11,16 @@
10
11
  "scripts": {
11
12
  "build": "tsc",
12
13
  "dev": "tsc --watch --preserveWatchOutput",
13
- "test": "mocha --no-config --require tsx src/*.test.ts"
14
+ "test": "mocha src/**/*.test.ts"
14
15
  },
15
16
  "devDependencies": {
16
17
  "@prairielearn/tsconfig": "^0.0.0",
17
18
  "@types/mocha": "^10.0.6",
18
19
  "@types/multipipe": "^3.0.5",
19
- "@types/node": "^20.11.30",
20
+ "@types/node": "^20.12.2",
20
21
  "chai": "^4.4.1",
21
22
  "mocha": "^10.4.0",
22
- "tsx": "^4.7.1",
23
+ "tsx": "^4.9.3",
23
24
  "typescript": "^5.4.3"
24
25
  },
25
26
  "dependencies": {
package/src/index.test.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { Readable } from 'node:stream';
2
2
  import { assert } from 'chai';
3
3
 
4
- import { stringifyStream } from './index';
4
+ import { stringifyStream } from './index.js';
5
5
 
6
6
  function streamToString(stream: NodeJS.ReadableStream): Promise<string> {
7
7
  const chunks: Buffer[] = [];