@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 +3 -0
- package/CHANGELOG.md +12 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +9 -18
- package/dist/index.js.map +1 -1
- package/dist/index.test.js +18 -20
- package/dist/index.test.js.map +1 -1
- package/package.json +5 -4
- package/src/index.test.ts +1 -1
package/.mocharc.cjs
ADDED
package/CHANGELOG.md
CHANGED
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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
|
|
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
|
|
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 (
|
|
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":"
|
|
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"]}
|
package/dist/index.test.js
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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 =
|
|
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(
|
|
19
|
+
const csvStream = stream.pipe(stringifyStream());
|
|
22
20
|
const csv = await streamToString(csvStream);
|
|
23
|
-
|
|
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 =
|
|
24
|
+
const stream = Readable.from([
|
|
27
25
|
['1', '1'],
|
|
28
26
|
['2', '2'],
|
|
29
27
|
['3', '3'],
|
|
30
28
|
]);
|
|
31
|
-
const csvStream = stream.pipe(
|
|
29
|
+
const csvStream = stream.pipe(stringifyStream());
|
|
32
30
|
const csv = await streamToString(csvStream);
|
|
33
|
-
|
|
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 =
|
|
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(
|
|
39
|
+
const csvStream = stream.pipe(stringifyStream({ transform: (row) => [row.a + 1, row.b + 2] }));
|
|
42
40
|
const csv = await streamToString(csvStream);
|
|
43
|
-
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
72
|
+
assert.equal(csv, 'first,second\n2,3\n3,4\n4,5\n');
|
|
75
73
|
});
|
|
76
74
|
});
|
|
77
75
|
//# sourceMappingURL=index.test.js.map
|
package/dist/index.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"
|
|
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": "
|
|
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
|
|
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.
|
|
20
|
+
"@types/node": "^20.12.2",
|
|
20
21
|
"chai": "^4.4.1",
|
|
21
22
|
"mocha": "^10.4.0",
|
|
22
|
-
"tsx": "^4.
|
|
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[] = [];
|