@cfworker/csv 1.12.2 → 1.12.3
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/dist/encode.d.ts +4 -1
- package/dist/encode.js +13 -8
- package/package.json +1 -1
- package/src/encode.ts +37 -11
package/dist/encode.d.ts
CHANGED
package/dist/encode.js
CHANGED
|
@@ -3,25 +3,30 @@ const quoteRegex = /"/g;
|
|
|
3
3
|
const delimiter = ',';
|
|
4
4
|
const rowDelimiter = '\r\n';
|
|
5
5
|
const requiresQuoteRegex = /["\r\n,]/;
|
|
6
|
-
export function encode(rows) {
|
|
6
|
+
export function encode(rows, { columns } = {}) {
|
|
7
7
|
const { readable, writable } = new TransformStream();
|
|
8
8
|
(async () => {
|
|
9
9
|
const writer = writable.getWriter();
|
|
10
|
-
|
|
10
|
+
if (rows.length > 0) {
|
|
11
|
+
if (!columns) {
|
|
12
|
+
columns = Object.keys(rows[0]).reduce((p, c) => {
|
|
13
|
+
p[c] = c;
|
|
14
|
+
return p;
|
|
15
|
+
}, {});
|
|
16
|
+
}
|
|
17
|
+
await writeRows(writer, rows, columns);
|
|
18
|
+
}
|
|
11
19
|
await writer.close();
|
|
12
20
|
})();
|
|
13
21
|
return readable;
|
|
14
22
|
}
|
|
15
|
-
async function writeRows(writer, rows) {
|
|
23
|
+
async function writeRows(writer, rows, columns) {
|
|
16
24
|
const text = new TextEncoder();
|
|
17
25
|
const utf8 = text.encode.bind(text);
|
|
18
26
|
const write = writer.write.bind(writer);
|
|
19
|
-
|
|
27
|
+
const keys = Object.keys(columns);
|
|
28
|
+
await write(utf8(keys.map(k => encodeValue(columns[k])).join(delimiter)));
|
|
20
29
|
for (const row of rows) {
|
|
21
|
-
if (keys === undefined) {
|
|
22
|
-
keys = Object.keys(row);
|
|
23
|
-
await write(utf8(keys.map(encodeValue).join(delimiter)));
|
|
24
|
-
}
|
|
25
30
|
await write(utf8(rowDelimiter));
|
|
26
31
|
let s = '';
|
|
27
32
|
let first = true;
|
package/package.json
CHANGED
package/src/encode.ts
CHANGED
|
@@ -4,32 +4,58 @@ const delimiter = ',';
|
|
|
4
4
|
const rowDelimiter = '\r\n';
|
|
5
5
|
const requiresQuoteRegex = /["\r\n,]/;
|
|
6
6
|
|
|
7
|
-
export
|
|
7
|
+
export interface EncodeOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Properties to include. Values will be used as column name.
|
|
10
|
+
*/
|
|
11
|
+
columns?: Record<string, string>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Encode an array of objects as a CSV
|
|
16
|
+
* @param rows An array of objects. Each item in the array represents a row.
|
|
17
|
+
* @param options
|
|
18
|
+
* @returns
|
|
19
|
+
*/
|
|
20
|
+
export function encode(
|
|
21
|
+
rows: any[],
|
|
22
|
+
{ columns }: EncodeOptions = {}
|
|
23
|
+
): ReadableStream {
|
|
8
24
|
// Cloudflare Workers cannot construct a ReadableStream
|
|
9
25
|
const { readable, writable } = new TransformStream();
|
|
10
|
-
|
|
11
26
|
(async () => {
|
|
12
27
|
const writer = writable.getWriter();
|
|
13
|
-
|
|
28
|
+
if (rows.length > 0) {
|
|
29
|
+
if (!columns) {
|
|
30
|
+
columns = Object.keys(rows[0]).reduce<Record<string, string>>(
|
|
31
|
+
(p, c) => {
|
|
32
|
+
p[c] = c;
|
|
33
|
+
return p;
|
|
34
|
+
},
|
|
35
|
+
{}
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
await writeRows(writer, rows, columns);
|
|
39
|
+
}
|
|
14
40
|
await writer.close();
|
|
15
41
|
})();
|
|
16
42
|
|
|
17
43
|
return readable;
|
|
18
44
|
}
|
|
19
45
|
|
|
20
|
-
async function writeRows(
|
|
46
|
+
async function writeRows(
|
|
47
|
+
writer: WritableStreamDefaultWriter,
|
|
48
|
+
rows: any[],
|
|
49
|
+
columns: Record<string, string>
|
|
50
|
+
) {
|
|
21
51
|
const text = new TextEncoder();
|
|
22
52
|
const utf8 = text.encode.bind(text);
|
|
23
53
|
const write = writer.write.bind(writer);
|
|
24
|
-
|
|
54
|
+
const keys = Object.keys(columns);
|
|
55
|
+
// write header row
|
|
56
|
+
await write(utf8(keys.map(k => encodeValue(columns[k])).join(delimiter)));
|
|
25
57
|
|
|
26
58
|
for (const row of rows) {
|
|
27
|
-
// write header row
|
|
28
|
-
if (keys === undefined) {
|
|
29
|
-
keys = Object.keys(row);
|
|
30
|
-
await write(utf8(keys.map(encodeValue).join(delimiter)));
|
|
31
|
-
}
|
|
32
|
-
|
|
33
59
|
// write row delimiter
|
|
34
60
|
await write(utf8(rowDelimiter));
|
|
35
61
|
|