@cfworker/csv 4.0.4 → 4.0.5
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/commonjs/encode.d.ts +1 -0
- package/dist/commonjs/encode.d.ts.map +1 -0
- package/dist/commonjs/encode.js +4 -2
- package/dist/commonjs/encode.js.map +1 -0
- package/dist/commonjs/index.d.ts +1 -0
- package/dist/commonjs/index.d.ts.map +1 -0
- package/dist/commonjs/index.js +1 -0
- package/dist/commonjs/index.js.map +1 -0
- package/dist/commonjs/package.json +2 -1
- package/dist/esm/encode.d.ts +1 -0
- package/dist/esm/encode.d.ts.map +1 -0
- package/dist/esm/encode.js +4 -2
- package/dist/esm/encode.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +2 -1
- package/package.json +11 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../../src/encode.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa,CAAC,CAAC;IAI9B,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,MAAM,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC;IAC1C,GAAG,EAAE,CAAC,CAAC;IACP,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;CAC1C;AAQD,wBAAgB,MAAM,CAAC,CAAC,SAAS,EAAE,EACjC,IAAI,EAAE,CAAC,EAAE,EACT,EAAE,OAAO,EAAE,GAAE,aAAa,CAAC,CAAC,CAAM,GACjC,cAAc,CAoBhB"}
|
package/dist/commonjs/encode.js
CHANGED
|
@@ -10,9 +10,10 @@ function encode(rows, { columns } = {}) {
|
|
|
10
10
|
const { readable, writable } = new TransformStream();
|
|
11
11
|
(async () => {
|
|
12
12
|
const writer = writable.getWriter();
|
|
13
|
-
|
|
13
|
+
const firstRow = rows[0];
|
|
14
|
+
if (firstRow !== undefined) {
|
|
14
15
|
if (!columns) {
|
|
15
|
-
columns = Object.keys(
|
|
16
|
+
columns = Object.keys(firstRow).map(key => ({
|
|
16
17
|
key: key,
|
|
17
18
|
label: key,
|
|
18
19
|
format: (x) => x
|
|
@@ -54,3 +55,4 @@ function encodeValue(value) {
|
|
|
54
55
|
}
|
|
55
56
|
return String(value);
|
|
56
57
|
}
|
|
58
|
+
//# sourceMappingURL=encode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encode.js","sourceRoot":"","sources":["../../src/encode.ts"],"names":[],"mappings":"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","sourcesContent":["const quote = '\"';\nconst quoteRegex = /\"/g;\nconst delimiter = ',';\nconst rowDelimiter = '\\r\\n';\nconst requiresQuoteRegex = /[\"\\r\\n,]|(?:^\\d+$)/;\n\nexport interface EncodeOptions<T> {\n /**\n * Properties to include\n */\n columns?: Column<T, keyof T>[];\n}\n\nexport interface Column<T, K extends keyof T> {\n key: K;\n label: string;\n format: (value: T[K], row: T) => unknown;\n}\n\n/**\n * Encode an array of objects as a CSV\n * @param rows An array of objects. Each item in the array represents a row.\n * @param options\n * @returns\n */\nexport function encode<T extends {}>(\n rows: T[],\n { columns }: EncodeOptions<T> = {}\n): ReadableStream {\n // Cloudflare Workers cannot construct a ReadableStream\n const { readable, writable } = new TransformStream();\n (async () => {\n const writer = writable.getWriter();\n const firstRow = rows[0];\n if (firstRow !== undefined) {\n if (!columns) {\n columns = Object.keys(firstRow).map(key => ({\n key: key as keyof T,\n label: key,\n format: (x: any) => x\n }));\n }\n await writeRows(writer, rows, columns);\n }\n await writer.close();\n })();\n\n return readable;\n}\n\nasync function writeRows<T>(\n writer: WritableStreamDefaultWriter,\n rows: T[],\n columns: Column<T, keyof T>[]\n) {\n const text = new TextEncoder();\n const utf8 = text.encode.bind(text);\n const write = writer.write.bind(writer);\n // write header row\n await write(utf8(columns.map(c => encodeValue(c.label)).join(delimiter)));\n\n for (const row of rows) {\n // write row delimiter\n await write(utf8(rowDelimiter));\n\n // write data row\n let s = '';\n let first = true;\n for (const { key, format } of columns) {\n s += (first ? '' : ',') + encodeValue(format(row[key], row));\n first = false;\n }\n await write(utf8(s));\n }\n}\n\nfunction encodeValue(value: any): string {\n if (value === null || value === undefined || value === '') {\n return '';\n }\n if (typeof value === 'string') {\n const shouldQuote = requiresQuoteRegex.test(value);\n value = value.replace('\\0', '').replace(quoteRegex, '\"\"');\n if (shouldQuote) {\n value = quote + value + quote;\n }\n return value;\n }\n // Assume value is boolean/number/Date and does not require encoding.\n // Trading robustness for performance.\n return String(value);\n}\n"]}
|
package/dist/commonjs/index.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
|
package/dist/commonjs/index.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B","sourcesContent":["export * from './encode.js';\n"]}
|
package/dist/esm/encode.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../../src/encode.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa,CAAC,CAAC;IAI9B,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,MAAM,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC;IAC1C,GAAG,EAAE,CAAC,CAAC;IACP,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;CAC1C;AAQD,wBAAgB,MAAM,CAAC,CAAC,SAAS,EAAE,EACjC,IAAI,EAAE,CAAC,EAAE,EACT,EAAE,OAAO,EAAE,GAAE,aAAa,CAAC,CAAC,CAAM,GACjC,cAAc,CAoBhB"}
|
package/dist/esm/encode.js
CHANGED
|
@@ -7,9 +7,10 @@ export function encode(rows, { columns } = {}) {
|
|
|
7
7
|
const { readable, writable } = new TransformStream();
|
|
8
8
|
(async () => {
|
|
9
9
|
const writer = writable.getWriter();
|
|
10
|
-
|
|
10
|
+
const firstRow = rows[0];
|
|
11
|
+
if (firstRow !== undefined) {
|
|
11
12
|
if (!columns) {
|
|
12
|
-
columns = Object.keys(
|
|
13
|
+
columns = Object.keys(firstRow).map(key => ({
|
|
13
14
|
key: key,
|
|
14
15
|
label: key,
|
|
15
16
|
format: (x) => x
|
|
@@ -51,3 +52,4 @@ function encodeValue(value) {
|
|
|
51
52
|
}
|
|
52
53
|
return String(value);
|
|
53
54
|
}
|
|
55
|
+
//# sourceMappingURL=encode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encode.js","sourceRoot":"","sources":["../../src/encode.ts"],"names":[],"mappings":"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","sourcesContent":["const quote = '\"';\nconst quoteRegex = /\"/g;\nconst delimiter = ',';\nconst rowDelimiter = '\\r\\n';\nconst requiresQuoteRegex = /[\"\\r\\n,]|(?:^\\d+$)/;\n\nexport interface EncodeOptions<T> {\n /**\n * Properties to include\n */\n columns?: Column<T, keyof T>[];\n}\n\nexport interface Column<T, K extends keyof T> {\n key: K;\n label: string;\n format: (value: T[K], row: T) => unknown;\n}\n\n/**\n * Encode an array of objects as a CSV\n * @param rows An array of objects. Each item in the array represents a row.\n * @param options\n * @returns\n */\nexport function encode<T extends {}>(\n rows: T[],\n { columns }: EncodeOptions<T> = {}\n): ReadableStream {\n // Cloudflare Workers cannot construct a ReadableStream\n const { readable, writable } = new TransformStream();\n (async () => {\n const writer = writable.getWriter();\n const firstRow = rows[0];\n if (firstRow !== undefined) {\n if (!columns) {\n columns = Object.keys(firstRow).map(key => ({\n key: key as keyof T,\n label: key,\n format: (x: any) => x\n }));\n }\n await writeRows(writer, rows, columns);\n }\n await writer.close();\n })();\n\n return readable;\n}\n\nasync function writeRows<T>(\n writer: WritableStreamDefaultWriter,\n rows: T[],\n columns: Column<T, keyof T>[]\n) {\n const text = new TextEncoder();\n const utf8 = text.encode.bind(text);\n const write = writer.write.bind(writer);\n // write header row\n await write(utf8(columns.map(c => encodeValue(c.label)).join(delimiter)));\n\n for (const row of rows) {\n // write row delimiter\n await write(utf8(rowDelimiter));\n\n // write data row\n let s = '';\n let first = true;\n for (const { key, format } of columns) {\n s += (first ? '' : ',') + encodeValue(format(row[key], row));\n first = false;\n }\n await write(utf8(s));\n }\n}\n\nfunction encodeValue(value: any): string {\n if (value === null || value === undefined || value === '') {\n return '';\n }\n if (typeof value === 'string') {\n const shouldQuote = requiresQuoteRegex.test(value);\n value = value.replace('\\0', '').replace(quoteRegex, '\"\"');\n if (shouldQuote) {\n value = quote + value + quote;\n }\n return value;\n }\n // Assume value is boolean/number/Date and does not require encoding.\n // Trading robustness for performance.\n return String(value);\n}\n"]}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
|
package/dist/esm/index.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC","sourcesContent":["export * from './encode.js';\n"]}
|
package/dist/esm/package.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cfworker/csv",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.5",
|
|
4
4
|
"description": "Streaming CSV encoding for Cloudflare Workers and service workers",
|
|
5
5
|
"repository": "https://github.com/cfworker/cfworker",
|
|
6
6
|
"author": "Jeremy Danyow <jdanyow@gmail.com>",
|
|
@@ -32,21 +32,23 @@
|
|
|
32
32
|
],
|
|
33
33
|
"scripts": {
|
|
34
34
|
"prepare": "tshy",
|
|
35
|
-
"build": "
|
|
36
|
-
"
|
|
35
|
+
"build": "tshy",
|
|
36
|
+
"typecheck": "tsc --project tsconfig.json",
|
|
37
|
+
"clean": "tsc --build tsconfig.build.json --clean",
|
|
37
38
|
"pretest": "esbuild test/test.ts --target=esnext --bundle --format=esm --conditions=worker,browser --outdir=dist-test --ignore-annotations",
|
|
38
39
|
"test": "node ../../test.mjs"
|
|
39
40
|
},
|
|
40
41
|
"devDependencies": {
|
|
41
|
-
"@types/chai": "^5.
|
|
42
|
+
"@types/chai": "^5.2.3",
|
|
42
43
|
"@types/mocha": "^10.0.10",
|
|
43
|
-
"chai": "^
|
|
44
|
-
"esbuild": "^0.
|
|
45
|
-
"mocha": "^
|
|
46
|
-
"typescript": "^
|
|
47
|
-
"wrangler": "^
|
|
44
|
+
"chai": "^6.3.0",
|
|
45
|
+
"esbuild": "^0.28.2",
|
|
46
|
+
"mocha": "^12.0.3",
|
|
47
|
+
"typescript": "^7.0.2",
|
|
48
|
+
"wrangler": "^4.156.0"
|
|
48
49
|
},
|
|
49
50
|
"tshy": {
|
|
51
|
+
"project": "./tsconfig.build.json",
|
|
50
52
|
"exports": {
|
|
51
53
|
"./package.json": "./package.json",
|
|
52
54
|
".": "./src/index.ts"
|