json-as-xlsx 2.5.1 → 2.5.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022, LuisEnMarroquin <xlsx@marroquin.dev>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,104 @@
1
+ # json-as-xlsx
2
+
3
+ This is a tool that helps to build an excel from a json and it depends only on `xlsx` library
4
+
5
+ You can see a live example of it working on any of this sites (there are many just in case):
6
+
7
+ - [xlsx.pages.dev](https://xlsx.pages.dev)
8
+ - [xlsx.marroquin.dev](https://xlsx.marroquin.dev)
9
+ - [xlsx.luismarroquin.com](https://xlsx.luismarroquin.com)
10
+
11
+ ## Usage
12
+
13
+ ```js
14
+ import xlsx from "json-as-xlsx"
15
+ // or require
16
+ let xlsx = require("json-as-xlsx")
17
+
18
+ let data = [
19
+ {
20
+ sheet: "Adults",
21
+ columns: [
22
+ { label: "User", value: "user" }, // Top level data
23
+ { label: "Age", value: (row) => row.age + " years" }, // Custom format
24
+ { label: "Phone", value: (row) => (row.more ? row.more.phone || "" : "") }, // Run functions
25
+ ],
26
+ content: [
27
+ { user: "Andrea", age: 20, more: { phone: "11111111" } },
28
+ { user: "Luis", age: 21, more: { phone: "12345678" } },
29
+ ],
30
+ },
31
+ {
32
+ sheet: "Children",
33
+ columns: [
34
+ { label: "User", value: "user" }, // Top level data
35
+ { label: "Age", value: "age", format: '# "years"' }, // Column format
36
+ { label: "Phone", value: "more.phone", format: "(###) ###-####" }, // Deep props and column format
37
+ ],
38
+ content: [
39
+ { user: "Manuel", age: 16, more: { phone: 9999999900 } },
40
+ { user: "Ana", age: 17, more: { phone: 8765432135 } },
41
+ ],
42
+ },
43
+ ]
44
+
45
+ let settings = {
46
+ fileName: "MySpreadsheet", // Name of the resulting spreadsheet
47
+ extraLength: 3, // A bigger number means that columns will be wider
48
+ writeMode: "writeFile", // The available parameters are 'WriteFile' and 'write'. This setting is optional. Useful in such cases https://docs.sheetjs.com/docs/solutions/output#example-remote-file
49
+ writeOptions: {}, // Style options from https://docs.sheetjs.com/docs/api/write-options
50
+ RTL: true, // Display the columns from right-to-left (the default value is false)
51
+ }
52
+
53
+ xlsx(data, settings) // Will download the excel file
54
+ ```
55
+
56
+ If you want to trigger something after the file is downloaded, you can use the `callback` parameter:
57
+
58
+ ```js
59
+ let callback = function (sheet) {
60
+ console.log("Download complete:", sheet)
61
+ }
62
+
63
+ xlsx(data, settings, callback) // Will download the excel file
64
+ ```
65
+
66
+ ### Column formatting
67
+
68
+ > **Note:** Cell formatting is type based, i.e. the format type and value type must match.
69
+ >
70
+ > If you want to use a Date format, the value must be of type Date; if you want a number format, the value must be a Number.
71
+
72
+ Column formatting can be provided in the column object, i.e.
73
+
74
+ ```js
75
+ columns: [{ label: "Income", value: "income", format: "€#,##0.00" }]
76
+ ```
77
+
78
+ - A list of SheetJS format examples can be found
79
+ here: [SSF library](https://github.com/SheetJS/sheetjs/blob/f443aa8475ebf051fc4e888cf0a6c3e5b751813c/bits/10_ssf.js#L42)
80
+ - ECMA-376 number formatting
81
+ specification: [Number formats](https://c-rex.net/projects/samples/ooxml/e1/Part4/OOXML_P4_DOCX_numFmts_topic_ID0E6KK6.html)
82
+
83
+ Examples
84
+
85
+ ```js
86
+ // Number formats
87
+ "$0.00" // Basic
88
+ "\£#,##0.00" // Pound
89
+ "0%" // Percentage
90
+ '#.# "ft"' // Number and text
91
+
92
+ // Date formats
93
+ "d-mmm-yy" // 12-Mar-22
94
+ "ddd" // (eg. Sat)
95
+ "dddd" // (eg. Saturday)
96
+ "h:mm AM/PM" // 1:10 PM
97
+ ```
98
+
99
+ ## Examples
100
+
101
+ This are files used for development, please change imports from `../../src/index` to `json-as-xlsx`
102
+
103
+ - [Express with TypeScript](https://github.com/LuisEnMarroquin/json-as-xlsx/blob/main/packages/demo-express)
104
+ - [ReactJS with TypeScript](https://github.com/LuisEnMarroquin/json-as-xlsx/blob/main/packages/demo-reactjs)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "json-as-xlsx",
3
- "version": "2.5.1",
3
+ "version": "2.5.3",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1 +0,0 @@
1
- export {};
@@ -1,44 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const index_1 = require("../index");
4
- test("Should access first level property", () => {
5
- const supportTicket = {
6
- id: "e4te583nbt",
7
- title: "Problem with server",
8
- user: "daniel31",
9
- };
10
- expect((0, index_1.getContentProperty)(supportTicket, "user")).toBe("daniel31");
11
- expect((0, index_1.getContentProperty)(supportTicket, "description")).toBe("");
12
- });
13
- test("Should access second level property", () => {
14
- const employee = {
15
- name: "Sophie",
16
- age: "21",
17
- email: {
18
- work: "sophiedev@job.com",
19
- personal: "sophie@email.com",
20
- },
21
- };
22
- expect((0, index_1.getContentProperty)(employee, "email.work")).toBe("sophiedev@job.com");
23
- expect((0, index_1.getContentProperty)(employee, "email.personal")).toBe("sophie@email.com");
24
- expect((0, index_1.getContentProperty)(employee, "email.business")).toBe("");
25
- });
26
- test("Should access third level property", () => {
27
- const purchase = {
28
- id: "934as44951",
29
- costumer: {
30
- email: "jeniffer@email.com",
31
- phoneNumber: "44444444",
32
- billingAddress: {
33
- line1: "123 Street",
34
- city: "Montreal",
35
- postalCode: 55555,
36
- },
37
- },
38
- };
39
- expect((0, index_1.getContentProperty)(purchase, "costumer.billingAddress.line1")).toBe("123 Street");
40
- expect((0, index_1.getContentProperty)(purchase, "costumer.billingAddress.city")).toBe("Montreal");
41
- expect((0, index_1.getContentProperty)(purchase, "costumer.billingAddress.postalCode")).toBe(55555);
42
- expect((0, index_1.getContentProperty)(purchase, "costumer.billingAddress.countryCode")).toBe("");
43
- });
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudFByb3BlcnR5LnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2NvbnRlbnRQcm9wZXJ0eS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsb0NBQTZDO0FBRTdDLElBQUksQ0FBQyxvQ0FBb0MsRUFBRSxHQUFHLEVBQUU7SUFDOUMsTUFBTSxhQUFhLEdBQUc7UUFDcEIsRUFBRSxFQUFFLFlBQVk7UUFDaEIsS0FBSyxFQUFFLHFCQUFxQjtRQUM1QixJQUFJLEVBQUUsVUFBVTtLQUNqQixDQUFBO0lBRUQsTUFBTSxDQUFDLElBQUEsMEJBQWtCLEVBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBRWxFLE1BQU0sQ0FBQyxJQUFBLDBCQUFrQixFQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUNuRSxDQUFDLENBQUMsQ0FBQTtBQUVGLElBQUksQ0FBQyxxQ0FBcUMsRUFBRSxHQUFHLEVBQUU7SUFDL0MsTUFBTSxRQUFRLEdBQUc7UUFDZixJQUFJLEVBQUUsUUFBUTtRQUNkLEdBQUcsRUFBRSxJQUFJO1FBQ1QsS0FBSyxFQUFFO1lBQ0wsSUFBSSxFQUFFLG1CQUFtQjtZQUN6QixRQUFRLEVBQUUsa0JBQWtCO1NBQzdCO0tBQ0YsQ0FBQTtJQUVELE1BQU0sQ0FBQyxJQUFBLDBCQUFrQixFQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO0lBRTVFLE1BQU0sQ0FBQyxJQUFBLDBCQUFrQixFQUFDLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUE7SUFFL0UsTUFBTSxDQUFDLElBQUEsMEJBQWtCLEVBQUMsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDakUsQ0FBQyxDQUFDLENBQUE7QUFFRixJQUFJLENBQUMsb0NBQW9DLEVBQUUsR0FBRyxFQUFFO0lBQzlDLE1BQU0sUUFBUSxHQUFHO1FBQ2YsRUFBRSxFQUFFLFlBQVk7UUFDaEIsUUFBUSxFQUFFO1lBQ1IsS0FBSyxFQUFFLG9CQUFvQjtZQUMzQixXQUFXLEVBQUUsVUFBVTtZQUN2QixjQUFjLEVBQUU7Z0JBQ2QsS0FBSyxFQUFFLFlBQVk7Z0JBQ25CLElBQUksRUFBRSxVQUFVO2dCQUNoQixVQUFVLEVBQUUsS0FBSzthQUNsQjtTQUNGO0tBQ0YsQ0FBQTtJQUVELE1BQU0sQ0FBQyxJQUFBLDBCQUFrQixFQUFDLFFBQVEsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBRXhGLE1BQU0sQ0FBQyxJQUFBLDBCQUFrQixFQUFDLFFBQVEsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBRXJGLE1BQU0sQ0FBQyxJQUFBLDBCQUFrQixFQUFDLFFBQVEsRUFBRSxvQ0FBb0MsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRXRGLE1BQU0sQ0FBQyxJQUFBLDBCQUFrQixFQUFDLFFBQVEsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQ3RGLENBQUMsQ0FBQyxDQUFBIn0=
@@ -1 +0,0 @@
1
- export {};
@@ -1,52 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const index_1 = require("../index");
4
- test("", () => {
5
- const track = {
6
- id: "4ase432i",
7
- name: "Help",
8
- artist: "Galantis",
9
- album: {
10
- id: "532o48sn3",
11
- name: "Help",
12
- albumType: "single",
13
- totalTracks: 1,
14
- releaseDate: "2014-03-11",
15
- },
16
- explicit: false,
17
- popularity: 21,
18
- durationMs: 4010,
19
- };
20
- expect((0, index_1.getJsonSheetRow)(track, [{ label: "ID", value: "id" }])).toEqual({ ID: "4ase432i" });
21
- expect((0, index_1.getJsonSheetRow)(track, [{ label: "Name", value: "name" }])).toEqual({ Name: "Help" });
22
- expect((0, index_1.getJsonSheetRow)(track, [{ label: "Artist", value: "artist" }])).toEqual({ Artist: "Galantis" });
23
- expect((0, index_1.getJsonSheetRow)(track, [{ label: "Album", value: "album.name" }])).toEqual({ Album: "Help" });
24
- expect((0, index_1.getJsonSheetRow)(track, [
25
- {
26
- label: "Explicit content",
27
- value: (content) => {
28
- return content.explicit ? "Yes" : "No";
29
- },
30
- },
31
- ])).toEqual({ "Explicit content": "No" });
32
- expect((0, index_1.getJsonSheetRow)(track, [{ label: "Popularity", value: "popularity" }])).toEqual({ Popularity: 21 });
33
- expect((0, index_1.getJsonSheetRow)(track, [
34
- {
35
- label: "Duration",
36
- value: (content) => {
37
- return content.durationMs / 1000 + "s";
38
- },
39
- },
40
- ])).toEqual({ Duration: "4.01s" });
41
- expect((0, index_1.getJsonSheetRow)(track, [{ label: "URI", value: "uri" }])).toEqual({ URI: "" });
42
- expect((0, index_1.getJsonSheetRow)(track, [{ label: "Album", value: "album" }])).toEqual({
43
- Album: {
44
- id: "532o48sn3",
45
- name: "Help",
46
- albumType: "single",
47
- totalTracks: 1,
48
- releaseDate: "2014-03-11",
49
- },
50
- });
51
- });
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0SnNvblNoZWV0Um93LnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2dldEpzb25TaGVldFJvdy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsb0NBQW9EO0FBRXBELElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFO0lBQ1osTUFBTSxLQUFLLEdBQUc7UUFDWixFQUFFLEVBQUUsVUFBVTtRQUNkLElBQUksRUFBRSxNQUFNO1FBQ1osTUFBTSxFQUFFLFVBQVU7UUFDbEIsS0FBSyxFQUFFO1lBQ0wsRUFBRSxFQUFFLFdBQVc7WUFDZixJQUFJLEVBQUUsTUFBTTtZQUNaLFNBQVMsRUFBRSxRQUFRO1lBQ25CLFdBQVcsRUFBRSxDQUFDO1lBQ2QsV0FBVyxFQUFFLFlBQVk7U0FDMUI7UUFDRCxRQUFRLEVBQUUsS0FBSztRQUNmLFVBQVUsRUFBRSxFQUFFO1FBQ2QsVUFBVSxFQUFFLElBQUk7S0FDakIsQ0FBQTtJQUVELE1BQU0sQ0FBQyxJQUFBLHVCQUFlLEVBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQTtJQUUxRixNQUFNLENBQUMsSUFBQSx1QkFBZSxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUE7SUFFNUYsTUFBTSxDQUFDLElBQUEsdUJBQWUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFBO0lBRXRHLE1BQU0sQ0FBQyxJQUFBLHVCQUFlLEVBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQTtJQUVwRyxNQUFNLENBQ0osSUFBQSx1QkFBZSxFQUFDLEtBQUssRUFBRTtRQUNyQjtZQUNFLEtBQUssRUFBRSxrQkFBa0I7WUFDekIsS0FBSyxFQUFFLENBQUMsT0FBaUIsRUFBRSxFQUFFO2dCQUMzQixPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO1lBQ3hDLENBQUM7U0FDRjtLQUNGLENBQUMsQ0FDSCxDQUFDLE9BQU8sQ0FBQyxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7SUFFdkMsTUFBTSxDQUFDLElBQUEsdUJBQWUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBRTFHLE1BQU0sQ0FDSixJQUFBLHVCQUFlLEVBQUMsS0FBSyxFQUFFO1FBQ3JCO1lBQ0UsS0FBSyxFQUFFLFVBQVU7WUFDakIsS0FBSyxFQUFFLENBQUMsT0FBaUIsRUFBRSxFQUFFO2dCQUMzQixPQUFRLE9BQU8sQ0FBQyxVQUFxQixHQUFHLElBQUksR0FBRyxHQUFHLENBQUE7WUFDcEQsQ0FBQztTQUNGO0tBQ0YsQ0FBQyxDQUNILENBQUMsT0FBTyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUE7SUFFaEMsTUFBTSxDQUFDLElBQUEsdUJBQWUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBRXJGLE1BQU0sQ0FBQyxJQUFBLHVCQUFlLEVBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDM0UsS0FBSyxFQUFFO1lBQ0wsRUFBRSxFQUFFLFdBQVc7WUFDZixJQUFJLEVBQUUsTUFBTTtZQUNaLFNBQVMsRUFBRSxRQUFRO1lBQ25CLFdBQVcsRUFBRSxDQUFDO1lBQ2QsV0FBVyxFQUFFLFlBQVk7U0FDMUI7S0FDRixDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQSJ9
@@ -1 +0,0 @@
1
- export {};
@@ -1,28 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const xlsx_1 = require("xlsx");
4
- const index_1 = require("../index");
5
- test("Should return only one column width", () => {
6
- const content = { username: "art3mis" };
7
- const columns = [{ label: "Username", value: "username" }];
8
- const jsonSheetRow = (0, index_1.getJsonSheetRow)(content, columns);
9
- const worksheet = xlsx_1.utils.json_to_sheet([jsonSheetRow]);
10
- // Column label is larger than content
11
- expect((0, index_1.getWorksheetColumnWidths)(worksheet)).toEqual([{ width: 9 }]);
12
- expect((0, index_1.getWorksheetColumnWidths)(worksheet, 0)).toEqual([{ width: 8 }]);
13
- expect((0, index_1.getWorksheetColumnWidths)(worksheet, 4)).toEqual([{ width: 12 }]);
14
- });
15
- test("Should return two column widths", () => {
16
- const content = { name: "Interstellar", year: 2014 };
17
- const columns = [
18
- { label: "Movie", value: "name" },
19
- { label: "Year", value: "year" },
20
- ];
21
- const jsonSheetRow = (0, index_1.getJsonSheetRow)(content, columns);
22
- const worksheet = xlsx_1.utils.json_to_sheet([jsonSheetRow]);
23
- // Content is larger than column label
24
- expect((0, index_1.getWorksheetColumnWidths)(worksheet)).toEqual([{ width: 13 }, { width: 5 }]);
25
- expect((0, index_1.getWorksheetColumnWidths)(worksheet, 0)).toEqual([{ width: 12 }, { width: 4 }]);
26
- expect((0, index_1.getWorksheetColumnWidths)(worksheet, 4)).toEqual([{ width: 16 }, { width: 8 }]);
27
- });
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0V29ya3NoZWV0Q29sdW1XaWR0aHMudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vZ2V0V29ya3NoZWV0Q29sdW1XaWR0aHMudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtCQUE0QjtBQUM1QixvQ0FBb0U7QUFFcEUsSUFBSSxDQUFDLHFDQUFxQyxFQUFFLEdBQUcsRUFBRTtJQUMvQyxNQUFNLE9BQU8sR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQTtJQUN2QyxNQUFNLE9BQU8sR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQTtJQUUxRCxNQUFNLFlBQVksR0FBRyxJQUFBLHVCQUFlLEVBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3RELE1BQU0sU0FBUyxHQUFHLFlBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFBO0lBRXJELHNDQUFzQztJQUN0QyxNQUFNLENBQUMsSUFBQSxnQ0FBd0IsRUFBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUVuRSxNQUFNLENBQUMsSUFBQSxnQ0FBd0IsRUFBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFFdEUsTUFBTSxDQUFDLElBQUEsZ0NBQXdCLEVBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBQ3pFLENBQUMsQ0FBQyxDQUFBO0FBRUYsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLEdBQUcsRUFBRTtJQUMzQyxNQUFNLE9BQU8sR0FBRyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFBO0lBQ3BELE1BQU0sT0FBTyxHQUFHO1FBQ2QsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7UUFDakMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7S0FDakMsQ0FBQTtJQUVELE1BQU0sWUFBWSxHQUFHLElBQUEsdUJBQWUsRUFBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDdEQsTUFBTSxTQUFTLEdBQUcsWUFBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUE7SUFFckQsc0NBQXNDO0lBQ3RDLE1BQU0sQ0FBQyxJQUFBLGdDQUF3QixFQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBRWxGLE1BQU0sQ0FBQyxJQUFBLGdDQUF3QixFQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUVyRixNQUFNLENBQUMsSUFBQSxnQ0FBd0IsRUFBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFDdkYsQ0FBQyxDQUFDLENBQUEifQ==
@@ -1 +0,0 @@
1
- export {};
@@ -1,171 +0,0 @@
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
- const xlsx_1 = require("xlsx");
7
- const index_1 = __importDefault(require("../index"));
8
- describe("json-as-xlsx", () => {
9
- it("should return undefined if sheets array is empty", () => {
10
- const sheets = [];
11
- const result = (0, index_1.default)(sheets);
12
- expect(result).toBeUndefined();
13
- });
14
- describe("writeOptions.type is set to buffer", () => {
15
- const settings = {
16
- writeOptions: {
17
- type: "buffer",
18
- },
19
- };
20
- it("should return buffer", () => {
21
- const sheets = [
22
- {
23
- columns: [{ label: "Name", value: "name" }],
24
- content: [{ name: "Martin" }],
25
- },
26
- ];
27
- const buffer = (0, index_1.default)(sheets, settings);
28
- expect(buffer).toBeInstanceOf(Buffer);
29
- });
30
- it("should return parsable xlsx buffer", () => {
31
- const sheets = [
32
- {
33
- columns: [{ label: "Name", value: "name" }],
34
- content: [{ name: "Martin" }],
35
- },
36
- ];
37
- const buffer = (0, index_1.default)(sheets, settings);
38
- const workBook = (0, xlsx_1.read)(buffer);
39
- expect(workBook).toBeDefined();
40
- });
41
- it("should return one column filled cells", () => {
42
- const sheets = [
43
- {
44
- sheet: "Authors",
45
- columns: [{ label: "Name", value: "name" }],
46
- content: [{ name: "Martin" }, { name: "Kent" }],
47
- },
48
- ];
49
- const buffer = (0, index_1.default)(sheets, settings);
50
- const workBook = (0, xlsx_1.read)(buffer);
51
- const workSheet = workBook.Sheets.Authors;
52
- expect(workSheet["!ref"]).toBe("A1:A3");
53
- expect(workSheet.A1.v).toBe("Name");
54
- expect(workSheet.A2.v).toBe("Martin");
55
- expect(workSheet.A3.v).toBe("Kent");
56
- });
57
- it("should return only the column headers if there is no content", () => {
58
- const sheetName = "Authors";
59
- const sheets = [
60
- {
61
- sheet: sheetName,
62
- columns: [
63
- { label: "Name", value: "name" },
64
- { label: "Age", value: "age" },
65
- ],
66
- content: [],
67
- },
68
- ];
69
- const buffer = (0, index_1.default)(sheets, settings);
70
- const workBook = (0, xlsx_1.read)(buffer);
71
- const workSheet = workBook.Sheets[sheetName];
72
- expect(workSheet.A1.v).toBe("Name");
73
- expect(workSheet.B1.v).toBe("Age");
74
- });
75
- it("should handle deep props", () => {
76
- const sheets = [
77
- {
78
- sheet: "Users",
79
- columns: [{ label: "IP", value: "metadata.ip" }],
80
- content: [
81
- { name: "Martin", metadata: { ip: "0.0.0.0" } },
82
- { name: "Robert", metadata: { ip: "0.0.0.1" } },
83
- ],
84
- },
85
- ];
86
- const buffer = (0, index_1.default)(sheets, settings);
87
- const workBook = (0, xlsx_1.read)(buffer);
88
- const workSheet = workBook.Sheets.Users;
89
- expect(workSheet.A1.v).toBe("IP");
90
- expect(workSheet.A2.v).toBe("0.0.0.0");
91
- expect(workSheet.A3.v).toBe("0.0.0.1");
92
- });
93
- it("should handle function column value", () => {
94
- const maskPhoneNumber = (cell) => new String(cell.phone).replace(/^(\d{3})(\d{4}).*/, "$1-$2");
95
- const sheets = [
96
- {
97
- sheet: "Users",
98
- columns: [{ label: "Phone number", value: maskPhoneNumber }],
99
- content: [
100
- { name: "Martin", phone: "1234567" },
101
- { name: "Robert", phone: "1234568" },
102
- ],
103
- },
104
- ];
105
- const buffer = (0, index_1.default)(sheets, settings);
106
- const workBook = (0, xlsx_1.read)(buffer);
107
- const workSheet = workBook.Sheets.Users;
108
- expect(workSheet.A1.v).toBe("Phone number");
109
- expect(workSheet.A2.v).toBe("123-4567");
110
- expect(workSheet.A3.v).toBe("123-4568");
111
- });
112
- it("should call optional callback", () => {
113
- const callback = jest.fn();
114
- const sheets = [
115
- {
116
- columns: [{ label: "Name", value: "name" }],
117
- content: [{ name: "Martin" }],
118
- },
119
- ];
120
- (0, index_1.default)(sheets, settings, callback);
121
- expect(callback).toBeCalledTimes(1);
122
- });
123
- it("should handle multiple sheets", () => {
124
- const sheets = [
125
- {
126
- sheet: "Authors",
127
- columns: [
128
- { label: "Name", value: "name" },
129
- { label: "Age", value: "age" },
130
- ],
131
- content: [
132
- { name: "Martin", age: 50 },
133
- { name: "Robert", age: 20 },
134
- { name: "Andrea", age: 35 },
135
- ],
136
- },
137
- {
138
- sheet: "Books",
139
- columns: [
140
- { label: "Title", value: "title" },
141
- { label: "Author", value: "author" },
142
- ],
143
- content: [
144
- { title: "TDD", author: "Martin" },
145
- { title: "Git", author: "Robert" },
146
- ],
147
- },
148
- ];
149
- const buffer = (0, index_1.default)(sheets, settings);
150
- const workBook = (0, xlsx_1.read)(buffer);
151
- const authorsSheet = workBook.Sheets.Authors;
152
- const booksSheet = workBook.Sheets.Books;
153
- expect(workBook.SheetNames).toEqual(["Authors", "Books"]);
154
- expect(authorsSheet.A1.v).toBe("Name");
155
- expect(authorsSheet.B1.v).toBe("Age");
156
- expect(authorsSheet.A2.v).toBe("Martin");
157
- expect(authorsSheet.B2.v).toBe(50);
158
- expect(authorsSheet.A3.v).toBe("Robert");
159
- expect(authorsSheet.B3.v).toBe(20);
160
- expect(authorsSheet.A4.v).toBe("Andrea");
161
- expect(authorsSheet.B4.v).toBe(35);
162
- expect(booksSheet.A1.v).toBe("Title");
163
- expect(booksSheet.B1.v).toBe("Author");
164
- expect(booksSheet.A2.v).toBe("TDD");
165
- expect(booksSheet.B2.v).toBe("Martin");
166
- expect(booksSheet.A3.v).toBe("Git");
167
- expect(booksSheet.B3.v).toBe("Robert");
168
- });
169
- });
170
- });
171
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5kZXgudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLCtCQUFpRDtBQUNqRCxxREFBb0U7QUFFcEUsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7SUFDNUIsRUFBRSxDQUFDLGtEQUFrRCxFQUFFLEdBQUcsRUFBRTtRQUMxRCxNQUFNLE1BQU0sR0FBaUIsRUFBRSxDQUFBO1FBQy9CLE1BQU0sTUFBTSxHQUFHLElBQUEsZUFBUSxFQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQy9CLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUNoQyxDQUFDLENBQUMsQ0FBQTtJQUVGLFFBQVEsQ0FBQyxvQ0FBb0MsRUFBRSxHQUFHLEVBQUU7UUFDbEQsTUFBTSxRQUFRLEdBQWM7WUFDMUIsWUFBWSxFQUFFO2dCQUNaLElBQUksRUFBRSxRQUFRO2FBQ2Y7U0FDRixDQUFBO1FBRUQsRUFBRSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtZQUM5QixNQUFNLE1BQU0sR0FBRztnQkFDYjtvQkFDRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO29CQUMzQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQztpQkFDOUI7YUFDRixDQUFBO1lBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBQSxlQUFRLEVBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1lBQ3pDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDdkMsQ0FBQyxDQUFDLENBQUE7UUFFRixFQUFFLENBQUMsb0NBQW9DLEVBQUUsR0FBRyxFQUFFO1lBQzVDLE1BQU0sTUFBTSxHQUFHO2dCQUNiO29CQUNFLE9B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