@cfworker/csv 1.12.0 → 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 CHANGED
@@ -1 +1,4 @@
1
- export declare function encode(rows: any[]): ReadableStream;
1
+ export interface EncodeOptions {
2
+ columns?: Record<string, string>;
3
+ }
4
+ export declare function encode(rows: any[], { columns }?: EncodeOptions): ReadableStream;
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
- await writeRows(writer, rows);
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
- let keys = undefined;
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cfworker/csv",
3
- "version": "1.12.0",
3
+ "version": "1.12.3",
4
4
  "description": "Streaming CSV encoding for Cloudflare Workers and service workers",
5
5
  "sideEffects": false,
6
6
  "main": "dist/index.js",
@@ -27,11 +27,11 @@
27
27
  "test": "cfworker test test/**/*.spec.ts"
28
28
  },
29
29
  "devDependencies": {
30
- "@cfworker/dev": "^1.12.0",
31
- "@types/chai": "^4.2.22",
32
- "@types/mocha": "^9.0.0",
33
- "chai": "^4.3.4",
34
- "mocha": "^9.1.3",
35
- "typescript": "^4.5.2"
30
+ "@cfworker/dev": "^1.14.0",
31
+ "@types/chai": "^4.3.0",
32
+ "@types/mocha": "^9.1.0",
33
+ "chai": "^4.3.6",
34
+ "mocha": "^9.2.1",
35
+ "typescript": "^4.5.5"
36
36
  }
37
37
  }
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 function encode(rows: any[]): ReadableStream {
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
- await writeRows(writer, rows);
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(writer: WritableStreamDefaultWriter, rows: any[]) {
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
- let keys: string[] | undefined = undefined;
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