@lichens-innovation/ts-common 1.7.0 → 1.9.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/README.md +40 -0
- package/dist/csv.cjs +37 -0
- package/dist/csv.cjs.map +1 -0
- package/dist/csv.d.cts +5 -0
- package/dist/csv.d.ts +5 -0
- package/dist/csv.js +29 -0
- package/dist/csv.js.map +1 -0
- package/dist/dimensions.utils-BwIBA5op.d.cts +6 -0
- package/dist/dimensions.utils-BwIBA5op.d.ts +6 -0
- package/dist/excel.cjs +177 -0
- package/dist/excel.cjs.map +1 -0
- package/dist/excel.d.cts +109 -0
- package/dist/excel.d.ts +109 -0
- package/dist/excel.js +167 -0
- package/dist/excel.js.map +1 -0
- package/dist/index.cjs +115 -191
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +21 -7
- package/dist/index.d.ts +21 -7
- package/dist/index.js +40 -95
- package/dist/index.js.map +1 -1
- package/dist/mime.cjs +20 -0
- package/dist/mime.cjs.map +1 -0
- package/dist/mime.d.cts +3 -0
- package/dist/mime.d.ts +3 -0
- package/dist/mime.js +14 -0
- package/dist/mime.js.map +1 -0
- package/dist/pdf.cjs +273 -0
- package/dist/pdf.cjs.map +1 -0
- package/dist/pdf.d.cts +140 -0
- package/dist/pdf.d.ts +140 -0
- package/dist/pdf.js +264 -0
- package/dist/pdf.js.map +1 -0
- package/dist/web.cjs +235 -0
- package/dist/web.cjs.map +1 -0
- package/dist/web.d.cts +82 -0
- package/dist/web.d.ts +82 -0
- package/dist/web.js +219 -0
- package/dist/web.js.map +1 -0
- package/package.json +55 -13
package/dist/excel.js
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import ExcelJS from 'exceljs';
|
|
2
|
+
import mime from 'mime';
|
|
3
|
+
|
|
4
|
+
// src/excel/excel-generator.ts
|
|
5
|
+
var WorksheetBuilder = class {
|
|
6
|
+
worksheet;
|
|
7
|
+
currentRow;
|
|
8
|
+
defaultRowStyles;
|
|
9
|
+
constructor(worksheet) {
|
|
10
|
+
this.worksheet = worksheet;
|
|
11
|
+
this.currentRow = 1;
|
|
12
|
+
this.defaultRowStyles = [];
|
|
13
|
+
}
|
|
14
|
+
/** Returns the current row index (1-based). */
|
|
15
|
+
get rowCount() {
|
|
16
|
+
return this.currentRow;
|
|
17
|
+
}
|
|
18
|
+
addCell({ row, col, value, style }) {
|
|
19
|
+
const cell = this.worksheet.getCell(row + 1, col + 1);
|
|
20
|
+
cell.value = value ?? "";
|
|
21
|
+
if (style) {
|
|
22
|
+
this.applyStyle(cell, style);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
addRow({ values, styles }) {
|
|
26
|
+
const stylesToUse = styles ?? this.defaultRowStyles;
|
|
27
|
+
const row = this.worksheet.addRow(values);
|
|
28
|
+
for (let col = 0; col < values.length; col++) {
|
|
29
|
+
const style = stylesToUse[col];
|
|
30
|
+
if (style) {
|
|
31
|
+
const cell = row.getCell(col + 1);
|
|
32
|
+
this.applyStyle(cell, style);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
this.currentRow++;
|
|
36
|
+
}
|
|
37
|
+
setDefaultRowStyles(styles) {
|
|
38
|
+
this.defaultRowStyles = styles;
|
|
39
|
+
}
|
|
40
|
+
addEmptyRow() {
|
|
41
|
+
this.worksheet.addRow([]);
|
|
42
|
+
this.currentRow++;
|
|
43
|
+
}
|
|
44
|
+
setColumnWidths(columnWidths) {
|
|
45
|
+
this.worksheet.columns = columnWidths.map((width) => ({ width }));
|
|
46
|
+
}
|
|
47
|
+
getWorksheet() {
|
|
48
|
+
return this.worksheet;
|
|
49
|
+
}
|
|
50
|
+
applyStyle(cell, style) {
|
|
51
|
+
if (style.font) {
|
|
52
|
+
cell.font = { ...cell.font, ...style.font };
|
|
53
|
+
}
|
|
54
|
+
if (style.fill) {
|
|
55
|
+
cell.fill = style.fill;
|
|
56
|
+
}
|
|
57
|
+
if (style.alignment) {
|
|
58
|
+
cell.alignment = { ...cell.alignment, ...style.alignment };
|
|
59
|
+
}
|
|
60
|
+
if (style.border) {
|
|
61
|
+
cell.border = { ...cell.border, ...style.border };
|
|
62
|
+
}
|
|
63
|
+
if (style.numFmt) {
|
|
64
|
+
cell.numFmt = style.numFmt;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
// src/excel/excel-generator.types.ts
|
|
70
|
+
var rgbToArgb = (rgb) => {
|
|
71
|
+
return { argb: `FF${rgb}` };
|
|
72
|
+
};
|
|
73
|
+
var getMimeType = (extension) => {
|
|
74
|
+
const mimeType = mime.getType(extension);
|
|
75
|
+
if (!mimeType) {
|
|
76
|
+
throw new Error(`[getMimeType] Mime type not found for extension: "${extension}"`);
|
|
77
|
+
}
|
|
78
|
+
return mimeType;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
// src/utils/types.utils.ts
|
|
82
|
+
var isNullish = (value) => value === null || value === void 0;
|
|
83
|
+
|
|
84
|
+
// src/excel/exceljs.utils.ts
|
|
85
|
+
var sanitizeWorksheetTitle = (title) => {
|
|
86
|
+
const MAX_LENGTH = 31;
|
|
87
|
+
const INVALID_CHARS = /[:/\\?*[\]]/g;
|
|
88
|
+
return title.trim().replace(INVALID_CHARS, "").slice(0, MAX_LENGTH);
|
|
89
|
+
};
|
|
90
|
+
var toSafeCellValue = ({ value, valueType }) => {
|
|
91
|
+
if (!isNullish(value) && valueType === "number") {
|
|
92
|
+
const numValue = typeof value === "number" ? value : Number(value);
|
|
93
|
+
return isNaN(numValue) ? value : numValue;
|
|
94
|
+
}
|
|
95
|
+
return value ?? "";
|
|
96
|
+
};
|
|
97
|
+
var toSafeCellValues = ({ headers, rowData, columnsMetadata }) => {
|
|
98
|
+
return headers.map((header) => {
|
|
99
|
+
const value = rowData[header];
|
|
100
|
+
const metadata = columnsMetadata?.[header];
|
|
101
|
+
const valueType = metadata?.valueType ?? "auto";
|
|
102
|
+
return toSafeCellValue({ value, valueType });
|
|
103
|
+
});
|
|
104
|
+
};
|
|
105
|
+
var applyTextFormatting = ({ row, headers, columnsMetadata }) => {
|
|
106
|
+
for (let colIndex = 0; colIndex < headers.length; colIndex++) {
|
|
107
|
+
const header = headers[colIndex];
|
|
108
|
+
const metadata = columnsMetadata?.[header];
|
|
109
|
+
const valueType = metadata?.valueType ?? "auto";
|
|
110
|
+
if (valueType === "text") {
|
|
111
|
+
const cell = row.getCell(colIndex + 1);
|
|
112
|
+
cell.numFmt = "@";
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
var applyHeaderStyles = (headerRow) => {
|
|
117
|
+
headerRow.font = { bold: true };
|
|
118
|
+
headerRow.fill = {
|
|
119
|
+
type: "pattern",
|
|
120
|
+
pattern: "solid",
|
|
121
|
+
fgColor: { argb: "FFE0E0E0" }
|
|
122
|
+
};
|
|
123
|
+
headerRow.alignment = { wrapText: true, vertical: "top" };
|
|
124
|
+
};
|
|
125
|
+
var setupHeaderFrozenRow = ({ worksheet, headers }) => {
|
|
126
|
+
const headerRow = worksheet.addRow(headers);
|
|
127
|
+
applyHeaderStyles(headerRow);
|
|
128
|
+
worksheet.views = [{ state: "frozen", ySplit: 1 }];
|
|
129
|
+
};
|
|
130
|
+
var applyDataRowStyles = ({ worksheet, startRowIndex, endRowIndex }) => {
|
|
131
|
+
for (let rowIndex = startRowIndex; rowIndex <= endRowIndex; rowIndex++) {
|
|
132
|
+
const row = worksheet.getRow(rowIndex);
|
|
133
|
+
row.alignment = { wrapText: false, vertical: "top" };
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
var setColumnWidths = ({ worksheet, headers, columnsMetadata }) => {
|
|
137
|
+
worksheet.columns = headers.map((header) => {
|
|
138
|
+
const metadata = columnsMetadata[header];
|
|
139
|
+
return metadata ? { width: metadata.width } : {};
|
|
140
|
+
});
|
|
141
|
+
};
|
|
142
|
+
var addDataRows = ({ worksheet, headers, columnsMetadata, data }) => {
|
|
143
|
+
for (const rowData of data) {
|
|
144
|
+
const safeCellValues = toSafeCellValues({ headers, rowData, columnsMetadata });
|
|
145
|
+
const row = worksheet.addRow(safeCellValues);
|
|
146
|
+
applyTextFormatting({ row, headers, columnsMetadata });
|
|
147
|
+
}
|
|
148
|
+
applyDataRowStyles({ worksheet, startRowIndex: 2, endRowIndex: data.length + 1 });
|
|
149
|
+
};
|
|
150
|
+
var generateExcelBlob = async (args) => {
|
|
151
|
+
const { data, columnsMetadata, worksheetTitle } = args;
|
|
152
|
+
if (data.length === 0) {
|
|
153
|
+
throw new Error("No data to export");
|
|
154
|
+
}
|
|
155
|
+
const headers = Object.keys(data[0]);
|
|
156
|
+
const workbook = new ExcelJS.Workbook();
|
|
157
|
+
const worksheet = workbook.addWorksheet(sanitizeWorksheetTitle(worksheetTitle));
|
|
158
|
+
setupHeaderFrozenRow({ worksheet, headers });
|
|
159
|
+
addDataRows({ worksheet, headers, columnsMetadata, data });
|
|
160
|
+
setColumnWidths({ worksheet, headers, columnsMetadata });
|
|
161
|
+
const buffer = await workbook.xlsx.writeBuffer();
|
|
162
|
+
return new Blob([buffer], { type: getMimeType("xlsx") });
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
export { WorksheetBuilder, generateExcelBlob, rgbToArgb, sanitizeWorksheetTitle };
|
|
166
|
+
//# sourceMappingURL=excel.js.map
|
|
167
|
+
//# sourceMappingURL=excel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/excel/excel-generator.ts","../src/excel/excel-generator.types.ts","../src/mime/index.ts","../src/utils/types.utils.ts","../src/excel/exceljs.utils.ts"],"names":[],"mappings":";;;;AAeO,IAAM,mBAAN,MAAuB;AAAA,EACpB,SAAA;AAAA,EACA,UAAA;AAAA,EACA,gBAAA;AAAA,EAER,YAAY,SAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAClB,IAAA,IAAA,CAAK,mBAAmB,EAAC;AAAA,EAC3B;AAAA;AAAA,EAGA,IAAI,QAAA,GAAmB;AACrB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,QAAQ,EAAE,GAAA,EAAK,GAAA,EAAK,KAAA,EAAO,OAAM,EAAsB;AACrD,IAAA,MAAM,OAAO,IAAA,CAAK,SAAA,CAAU,QAAQ,GAAA,GAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AACpD,IAAA,IAAA,CAAK,QAAQ,KAAA,IAAS,EAAA;AAEtB,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,MAAA,CAAO,EAAE,MAAA,EAAQ,MAAA,EAAO,EAAqB;AAC3C,IAAA,MAAM,WAAA,GAAc,UAAU,IAAA,CAAK,gBAAA;AACnC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,MAAM,CAAA;AAGxC,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,MAAA,CAAO,QAAQ,GAAA,EAAA,EAAO;AAC5C,MAAA,MAAM,KAAA,GAAQ,YAAY,GAAG,CAAA;AAC7B,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,GAAA,GAAM,CAAC,CAAA;AAChC,QAAA,IAAA,CAAK,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA,MAC7B;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,UAAA,EAAA;AAAA,EACP;AAAA,EAEA,oBAAoB,MAAA,EAA2B;AAC7C,IAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA;AAAA,EAC1B;AAAA,EAEA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,EAAE,CAAA;AACxB,IAAA,IAAA,CAAK,UAAA,EAAA;AAAA,EACP;AAAA,EAEA,gBAAgB,YAAA,EAA8B;AAC5C,IAAA,IAAA,CAAK,SAAA,CAAU,UAAU,YAAA,CAAa,GAAA,CAAI,CAAC,KAAA,MAAW,EAAE,OAAM,CAAE,CAAA;AAAA,EAClE;AAAA,EAEA,YAAA,GAAkC;AAChC,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA,EAEQ,UAAA,CAAW,MAAoB,KAAA,EAAwB;AAC7D,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,IAAA,CAAK,OAAO,EAAE,GAAG,KAAK,IAAA,EAAM,GAAG,MAAM,IAAA,EAAK;AAAA,IAC5C;AAEA,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,IAAA,CAAK,OAAO,KAAA,CAAM,IAAA;AAAA,IACpB;AAEA,IAAA,IAAI,MAAM,SAAA,EAAW;AACnB,MAAA,IAAA,CAAK,YAAY,EAAE,GAAG,KAAK,SAAA,EAAW,GAAG,MAAM,SAAA,EAAU;AAAA,IAC3D;AAEA,IAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,MAAA,IAAA,CAAK,SAAS,EAAE,GAAG,KAAK,MAAA,EAAQ,GAAG,MAAM,MAAA,EAAO;AAAA,IAClD;AAEA,IAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,MAAA,IAAA,CAAK,SAAS,KAAA,CAAM,MAAA;AAAA,IACtB;AAAA,EACF;AACF;;;ACzCO,IAAM,SAAA,GAAY,CAAC,GAAA,KAA2B;AACnD,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,EAAG;AAC5B;ACrDO,IAAM,WAAA,GAAc,CAAC,SAAA,KAA8B;AACxD,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AACvC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kDAAA,EAAqD,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,EACnF;AAEA,EAAA,OAAO,QAAA;AACT,CAAA;;;ACPO,IAAM,SAAA,GAAY,CAAC,KAAA,KAA8C,KAAA,KAAU,QAAQ,KAAA,KAAU,MAAA;;;ACsB7F,IAAM,sBAAA,GAAyB,CAAC,KAAA,KAA0B;AAC/D,EAAA,MAAM,UAAA,GAAa,EAAA;AACnB,EAAA,MAAM,aAAA,GAAgB,cAAA;AAEtB,EAAA,OAAO,KAAA,CAAM,MAAK,CAAE,OAAA,CAAQ,eAAe,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA;AACpE;AAOA,IAAM,eAAA,GAAkB,CAAC,EAAE,KAAA,EAAO,WAAU,KAAsC;AAChF,EAAA,IAAI,CAAC,SAAA,CAAU,KAAK,CAAA,IAAK,cAAc,QAAA,EAAU;AAC/C,IAAA,MAAM,WAAW,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,OAAO,KAAK,CAAA;AACjE,IAAA,OAAO,KAAA,CAAM,QAAQ,CAAA,GAAI,KAAA,GAAQ,QAAA;AAAA,EACnC;AAEA,EAAA,OAAO,KAAA,IAAS,EAAA;AAClB,CAAA;AAQA,IAAM,mBAAmB,CAAC,EAAE,OAAA,EAAS,OAAA,EAAS,iBAAgB,KAAyC;AACrG,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AAC7B,IAAA,MAAM,KAAA,GAAQ,QAAQ,MAAM,CAAA;AAC5B,IAAA,MAAM,QAAA,GAAW,kBAAkB,MAAM,CAAA;AACzC,IAAA,MAAM,SAAA,GAAY,UAAU,SAAA,IAAa,MAAA;AACzC,IAAA,OAAO,eAAA,CAAgB,EAAE,KAAA,EAAO,SAAA,EAAW,CAAA;AAAA,EAC7C,CAAC,CAAA;AACH,CAAA;AAQA,IAAM,sBAAsB,CAAC,EAAE,GAAA,EAAK,OAAA,EAAS,iBAAgB,KAAqC;AAChG,EAAA,KAAA,IAAS,QAAA,GAAW,CAAA,EAAG,QAAA,GAAW,OAAA,CAAQ,QAAQ,QAAA,EAAA,EAAY;AAC5D,IAAA,MAAM,MAAA,GAAS,QAAQ,QAAQ,CAAA;AAC/B,IAAA,MAAM,QAAA,GAAW,kBAAkB,MAAM,CAAA;AACzC,IAAA,MAAM,SAAA,GAAY,UAAU,SAAA,IAAa,MAAA;AAEzC,IAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,QAAA,GAAW,CAAC,CAAA;AACrC,MAAA,IAAA,CAAK,MAAA,GAAS,GAAA;AAAA,IAChB;AAAA,EACF;AACF,CAAA;AAEA,IAAM,iBAAA,GAAoB,CAAC,SAAA,KAAiC;AAC1D,EAAA,SAAA,CAAU,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,EAAK;AAC9B,EAAA,SAAA,CAAU,IAAA,GAAO;AAAA,IACf,IAAA,EAAM,SAAA;AAAA,IACN,OAAA,EAAS,OAAA;AAAA,IACT,OAAA,EAAS,EAAE,IAAA,EAAM,UAAA;AAAW,GAC9B;AACA,EAAA,SAAA,CAAU,SAAA,GAAY,EAAE,QAAA,EAAU,IAAA,EAAM,UAAU,KAAA,EAAM;AAC1D,CAAA;AAOA,IAAM,oBAAA,GAAuB,CAAC,EAAE,SAAA,EAAW,SAAQ,KAAsC;AACvF,EAAA,MAAM,SAAA,GAAY,SAAA,CAAU,MAAA,CAAO,OAAO,CAAA;AAC1C,EAAA,iBAAA,CAAkB,SAAS,CAAA;AAC3B,EAAA,SAAA,CAAU,QAAQ,CAAC,EAAE,OAAO,QAAA,EAAU,MAAA,EAAQ,GAAG,CAAA;AACnD,CAAA;AAQA,IAAM,qBAAqB,CAAC,EAAE,SAAA,EAAW,aAAA,EAAe,aAAY,KAAoC;AACtG,EAAA,KAAA,IAAS,QAAA,GAAW,aAAA,EAAe,QAAA,IAAY,WAAA,EAAa,QAAA,EAAA,EAAY;AACtE,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA;AACrC,IAAA,GAAA,CAAI,SAAA,GAAY,EAAE,QAAA,EAAU,KAAA,EAAO,UAAU,KAAA,EAAM;AAAA,EACrD;AACF,CAAA;AAQA,IAAM,kBAAkB,CAAC,EAAE,SAAA,EAAW,OAAA,EAAS,iBAAgB,KAAiC;AAC9F,EAAA,SAAA,CAAU,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AAC1C,IAAA,MAAM,QAAA,GAAW,gBAAgB,MAAM,CAAA;AACvC,IAAA,OAAO,WAAW,EAAE,KAAA,EAAO,QAAA,CAAS,KAAA,KAAU,EAAC;AAAA,EACjD,CAAC,CAAA;AACH,CAAA;AASA,IAAM,cAAc,CAAC,EAAE,WAAW,OAAA,EAAS,eAAA,EAAiB,MAAK,KAA6B;AAC5F,EAAA,KAAA,MAAW,WAAW,IAAA,EAAM;AAC1B,IAAA,MAAM,iBAAiB,gBAAA,CAAiB,EAAE,OAAA,EAAS,OAAA,EAAS,iBAAiB,CAAA;AAC7E,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,MAAA,CAAO,cAAc,CAAA;AAC3C,IAAA,mBAAA,CAAoB,EAAE,GAAA,EAAK,OAAA,EAAS,eAAA,EAAiB,CAAA;AAAA,EACvD;AAEA,EAAA,kBAAA,CAAmB,EAAE,WAAW,aAAA,EAAe,CAAA,EAAG,aAAa,IAAA,CAAK,MAAA,GAAS,GAAG,CAAA;AAClF,CAAA;AAYO,IAAM,iBAAA,GAAoB,OAAO,IAAA,KAA+C;AACrF,EAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,cAAA,EAAe,GAAI,IAAA;AAElD,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,EACrC;AAEA,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,CAAC,CAAC,CAAA;AACnC,EAAA,MAAM,QAAA,GAAW,IAAI,OAAA,CAAQ,QAAA,EAAS;AACtC,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,YAAA,CAAa,sBAAA,CAAuB,cAAc,CAAC,CAAA;AAE9E,EAAA,oBAAA,CAAqB,EAAE,SAAA,EAAW,OAAA,EAAS,CAAA;AAC3C,EAAA,WAAA,CAAY,EAAE,SAAA,EAAW,OAAA,EAAS,eAAA,EAAiB,MAAM,CAAA;AACzD,EAAA,eAAA,CAAgB,EAAE,SAAA,EAAW,OAAA,EAAS,eAAA,EAAiB,CAAA;AAEvD,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK,WAAA,EAAY;AAC/C,EAAA,OAAO,IAAI,IAAA,CAAK,CAAC,MAAM,CAAA,EAAG,EAAE,IAAA,EAAM,WAAA,CAAY,MAAM,CAAA,EAAG,CAAA;AACzD","file":"excel.js","sourcesContent":["import ExcelJS from \"exceljs\";\nimport type { CellStyle, CellValue } from \"./excel-generator.types\";\n\ninterface AddCellArgs {\n row: number;\n col: number;\n value: CellValue;\n style?: CellStyle;\n}\n\ninterface AddRowArgs {\n values: CellValue[];\n styles?: CellStyle[];\n}\n\nexport class WorksheetBuilder {\n private worksheet: ExcelJS.Worksheet;\n private currentRow: number;\n private defaultRowStyles: CellStyle[];\n\n constructor(worksheet: ExcelJS.Worksheet) {\n this.worksheet = worksheet;\n this.currentRow = 1; // ExcelJS uses 1-based indexing\n this.defaultRowStyles = [];\n }\n\n /** Returns the current row index (1-based). */\n get rowCount(): number {\n return this.currentRow;\n }\n\n addCell({ row, col, value, style }: AddCellArgs): void {\n const cell = this.worksheet.getCell(row + 1, col + 1); // Convert to 1-based\n cell.value = value ?? \"\";\n\n if (style) {\n this.applyStyle(cell, style);\n }\n }\n\n addRow({ values, styles }: AddRowArgs): void {\n const stylesToUse = styles ?? this.defaultRowStyles;\n const row = this.worksheet.addRow(values);\n\n // Apply styles to each cell in the row\n for (let col = 0; col < values.length; col++) {\n const style = stylesToUse[col];\n if (style) {\n const cell = row.getCell(col + 1); // ExcelJS uses 1-based indexing\n this.applyStyle(cell, style);\n }\n }\n\n this.currentRow++;\n }\n\n setDefaultRowStyles(styles: CellStyle[]): void {\n this.defaultRowStyles = styles;\n }\n\n addEmptyRow(): void {\n this.worksheet.addRow([]);\n this.currentRow++;\n }\n\n setColumnWidths(columnWidths: number[]): void {\n this.worksheet.columns = columnWidths.map((width) => ({ width }));\n }\n\n getWorksheet(): ExcelJS.Worksheet {\n return this.worksheet;\n }\n\n private applyStyle(cell: ExcelJS.Cell, style: CellStyle): void {\n if (style.font) {\n cell.font = { ...cell.font, ...style.font };\n }\n\n if (style.fill) {\n cell.fill = style.fill as ExcelJS.Fill;\n }\n\n if (style.alignment) {\n cell.alignment = { ...cell.alignment, ...style.alignment };\n }\n\n if (style.border) {\n cell.border = { ...cell.border, ...style.border };\n }\n\n if (style.numFmt) {\n cell.numFmt = style.numFmt;\n }\n }\n}\n","import type { Font, Fill, Alignment } from \"exceljs\";\n\nexport type CellValue = string | number | null | undefined;\n\nexport type VerticalAlignment = \"top\" | \"middle\" | \"bottom\";\nexport type HorizontalAlignment = \"left\" | \"center\" | \"right\";\n\nexport type ColumnValueType = \"number\" | \"text\" | \"auto\";\n\nexport interface ColumnMetadata {\n name: string;\n width: number;\n valueType?: ColumnValueType;\n}\n\ninterface BorderSide {\n style?: \"thin\" | \"medium\" | \"thick\" | \"dotted\" | \"dashed\" | \"double\";\n color?: { argb: string };\n}\n\n/**\n * Type for ExcelJS cell borders.\n */\nexport interface CellBorder {\n top?: BorderSide;\n bottom?: BorderSide;\n left?: BorderSide;\n right?: BorderSide;\n}\n\n/**\n * Type for ExcelJS cell styles.\n * This is a simplified version of ExcelJS.Style that focuses on commonly used properties.\n */\nexport interface CellStyle {\n font?: Partial<Font>;\n fill?: Partial<Fill>;\n alignment?: Partial<Alignment>;\n border?: CellBorder;\n numFmt?: string;\n}\n\n/**\n * Helper type to convert RGB color string to ARGB format for ExcelJS.\n * ExcelJS uses ARGB format: \"FFFFFFFF\" where FF is alpha, then RGB.\n */\nexport type ArgbColor = { argb: string };\n\n/**\n * Helper function to convert RGB color string to ARGB format.\n * @param rgb - RGB color string without # (e.g., \"FFFFFF\")\n * @returns ARGB color object (e.g., { argb: \"FFFFFFFF\" })\n */\nexport const rgbToArgb = (rgb: string): ArgbColor => {\n return { argb: `FF${rgb}` };\n};\n","import mime from \"mime\";\n\nexport const getMimeType = (extension: string): string => {\n const mimeType = mime.getType(extension);\n if (!mimeType) {\n throw new Error(`[getMimeType] Mime type not found for extension: \"${extension}\"`);\n }\n\n return mimeType;\n};\n","export const NO_OP: () => void = () => {};\n\nexport const isNullish = (value: unknown): value is null | undefined => value === null || value === undefined;\n\nexport const isNumber = (value?: unknown | null): value is number => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'number') {\n return false;\n }\n\n if (isNaN(value)) {\n return false;\n }\n\n return true;\n};\n\nexport const isString = (value?: unknown | null): value is string => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'string') {\n return false;\n }\n\n return true;\n};\n","import ExcelJS from \"exceljs\";\nimport { getMimeType } from \"../mime\";\nimport { isNullish } from \"../utils\";\nimport type { CellValue, ColumnMetadata } from \"./excel-generator.types\";\n\n/**\n * Sanitizes a worksheet title to comply with Excel's limitations.\n *\n * Excel enforces strict rules for worksheet names:\n * - Maximum length of 31 characters (legacy limitation from older Excel versions)\n * - Certain characters are reserved for special purposes and cannot be used:\n * - `:` (colon) - used in cell range references (e.g., A1:B2)\n * - `/` (forward slash) - used in file paths\n * - `\\` (backslash) - used in file paths and escape sequences\n * - `?` (question mark) - used as wildcard in formulas\n * - `*` (asterisk) - used as wildcard in formulas\n * - `[` and `]` (square brackets) - used in external references (e.g., [Book1.xlsx]Sheet1!A1)\n *\n * This function removes invalid characters and truncates the title to 31 characters\n * to ensure compatibility with Excel's file format specifications.\n *\n * @param title - The original worksheet title to sanitize\n * @returns A sanitized title that complies with Excel's naming rules\n */\nexport const sanitizeWorksheetTitle = (title: string): string => {\n const MAX_LENGTH = 31;\n const INVALID_CHARS = /[:/\\\\?*[\\]]/g;\n\n return title.trim().replace(INVALID_CHARS, \"\").slice(0, MAX_LENGTH);\n};\n\ninterface ToSafeCellValueArgs {\n value: CellValue;\n valueType: ColumnMetadata[\"valueType\"];\n}\n\nconst toSafeCellValue = ({ value, valueType }: ToSafeCellValueArgs): CellValue => {\n if (!isNullish(value) && valueType === \"number\") {\n const numValue = typeof value === \"number\" ? value : Number(value);\n return isNaN(numValue) ? value : numValue;\n }\n\n return value ?? \"\";\n};\n\ninterface ToSafeCellValuesArgs {\n headers: string[];\n rowData: Record<string, CellValue>;\n columnsMetadata?: Record<string, ColumnMetadata>;\n}\n\nconst toSafeCellValues = ({ headers, rowData, columnsMetadata }: ToSafeCellValuesArgs): CellValue[] => {\n return headers.map((header) => {\n const value = rowData[header];\n const metadata = columnsMetadata?.[header];\n const valueType = metadata?.valueType ?? \"auto\";\n return toSafeCellValue({ value, valueType });\n });\n};\n\ninterface ApplyTextFormattingArgs {\n row: ExcelJS.Row;\n headers: string[];\n columnsMetadata?: Record<string, ColumnMetadata>;\n}\n\nconst applyTextFormatting = ({ row, headers, columnsMetadata }: ApplyTextFormattingArgs): void => {\n for (let colIndex = 0; colIndex < headers.length; colIndex++) {\n const header = headers[colIndex];\n const metadata = columnsMetadata?.[header];\n const valueType = metadata?.valueType ?? \"auto\";\n\n if (valueType === \"text\") {\n const cell = row.getCell(colIndex + 1);\n cell.numFmt = \"@\";\n }\n }\n};\n\nconst applyHeaderStyles = (headerRow: ExcelJS.Row): void => {\n headerRow.font = { bold: true };\n headerRow.fill = {\n type: \"pattern\",\n pattern: \"solid\",\n fgColor: { argb: \"FFE0E0E0\" },\n };\n headerRow.alignment = { wrapText: true, vertical: \"top\" };\n};\n\ninterface SetupHeaderFrozenRowArgs {\n worksheet: ExcelJS.Worksheet;\n headers: string[];\n}\n\nconst setupHeaderFrozenRow = ({ worksheet, headers }: SetupHeaderFrozenRowArgs): void => {\n const headerRow = worksheet.addRow(headers);\n applyHeaderStyles(headerRow);\n worksheet.views = [{ state: \"frozen\", ySplit: 1 }];\n};\n\ninterface ApplyDataRowStylesArgs {\n worksheet: ExcelJS.Worksheet;\n startRowIndex: number;\n endRowIndex: number;\n}\n\nconst applyDataRowStyles = ({ worksheet, startRowIndex, endRowIndex }: ApplyDataRowStylesArgs): void => {\n for (let rowIndex = startRowIndex; rowIndex <= endRowIndex; rowIndex++) {\n const row = worksheet.getRow(rowIndex);\n row.alignment = { wrapText: false, vertical: \"top\" };\n }\n};\n\ninterface SetColumnWidthsArgs {\n worksheet: ExcelJS.Worksheet;\n headers: string[];\n columnsMetadata: Record<string, ColumnMetadata>;\n}\n\nconst setColumnWidths = ({ worksheet, headers, columnsMetadata }: SetColumnWidthsArgs): void => {\n worksheet.columns = headers.map((header) => {\n const metadata = columnsMetadata[header];\n return metadata ? { width: metadata.width } : {};\n });\n};\n\ninterface AddDataRowsArgs {\n worksheet: ExcelJS.Worksheet;\n headers: string[];\n columnsMetadata: Record<string, ColumnMetadata>;\n data: Record<string, CellValue>[];\n}\n\nconst addDataRows = ({ worksheet, headers, columnsMetadata, data }: AddDataRowsArgs): void => {\n for (const rowData of data) {\n const safeCellValues = toSafeCellValues({ headers, rowData, columnsMetadata });\n const row = worksheet.addRow(safeCellValues);\n applyTextFormatting({ row, headers, columnsMetadata });\n }\n\n applyDataRowStyles({ worksheet, startRowIndex: 2, endRowIndex: data.length + 1 });\n};\n\ninterface GenerateExcelBlobArgs {\n worksheetTitle: string;\n data: Record<string, CellValue>[];\n /**\n * Metadata for columns, keyed by column name (translated header name).\n * If not provided, columns will use default width and auto-detect value types.\n */\n columnsMetadata: Record<string, ColumnMetadata>;\n}\n\nexport const generateExcelBlob = async (args: GenerateExcelBlobArgs): Promise<Blob> => {\n const { data, columnsMetadata, worksheetTitle } = args;\n\n if (data.length === 0) {\n throw new Error(\"No data to export\");\n }\n\n const headers = Object.keys(data[0]);\n const workbook = new ExcelJS.Workbook();\n const worksheet = workbook.addWorksheet(sanitizeWorksheetTitle(worksheetTitle));\n\n setupHeaderFrozenRow({ worksheet, headers });\n addDataRows({ worksheet, headers, columnsMetadata, data });\n setColumnWidths({ worksheet, headers, columnsMetadata });\n\n const buffer = await workbook.xlsx.writeBuffer();\n return new Blob([buffer], { type: getMimeType(\"xlsx\") });\n};\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -1,94 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
1
|
+
'use strict';
|
|
19
2
|
|
|
20
|
-
|
|
21
|
-
var index_exports = {};
|
|
22
|
-
__export(index_exports, {
|
|
23
|
-
HZ_TO_RPM: () => HZ_TO_RPM,
|
|
24
|
-
M3PS_TO_GPM: () => M3PS_TO_GPM,
|
|
25
|
-
M_TO_INCHES: () => M_TO_INCHES,
|
|
26
|
-
NO_OP: () => NO_OP,
|
|
27
|
-
PA_TO_FT: () => PA_TO_FT,
|
|
28
|
-
PeriodsInMS: () => PeriodsInMS,
|
|
29
|
-
REGEX_ALPHANUMERIC: () => REGEX_ALPHANUMERIC,
|
|
30
|
-
REGEX_IPV4: () => REGEX_IPV4,
|
|
31
|
-
SCHEME_PREFIXES: () => SCHEME_PREFIXES,
|
|
32
|
-
W_TO_HP: () => W_TO_HP,
|
|
33
|
-
buildTicksForChart: () => buildTicksForChart,
|
|
34
|
-
capitalizeFirst: () => capitalizeFirst,
|
|
35
|
-
closeWebSocket: () => closeWebSocket,
|
|
36
|
-
countWords: () => countWords,
|
|
37
|
-
dateAs_HHMMSS: () => dateAs_HHMMSS,
|
|
38
|
-
dateAs_YYYYMMDD: () => dateAs_YYYYMMDD,
|
|
39
|
-
dateAs_YYYYMMDD_HHMMSS: () => dateAs_YYYYMMDD_HHMMSS,
|
|
40
|
-
extractBase64FromDataUri: () => extractBase64FromDataUri,
|
|
41
|
-
formatUnixTimestamp: () => formatUnixTimestamp,
|
|
42
|
-
fromHzToRpm: () => fromHzToRpm,
|
|
43
|
-
fromM3psToGPM: () => fromM3psToGPM,
|
|
44
|
-
fromMToInches: () => fromMToInches,
|
|
45
|
-
fromPaToFt: () => fromPaToFt,
|
|
46
|
-
fromWToHp: () => fromWToHp,
|
|
47
|
-
getColorForPercentage: () => getColorForPercentage,
|
|
48
|
-
getContrastTextColor: () => getContrastTextColor,
|
|
49
|
-
getCurrentUnixTimestamp: () => getCurrentUnixTimestamp,
|
|
50
|
-
getErrorMessage: () => getErrorMessage,
|
|
51
|
-
getLuminance: () => getLuminance,
|
|
52
|
-
getOpacityHexValue: () => getOpacityHexValue,
|
|
53
|
-
getOrderOfMagnitudeExponent: () => getOrderOfMagnitudeExponent,
|
|
54
|
-
getTickDomain: () => getTickDomain,
|
|
55
|
-
hasScheme: () => hasScheme,
|
|
56
|
-
hexToNormalizedRgb: () => hexToNormalizedRgb,
|
|
57
|
-
hexToRgb: () => hexToRgb,
|
|
58
|
-
isActiveTimestamp: () => isActiveTimestamp,
|
|
59
|
-
isAlphanumeric: () => isAlphanumeric,
|
|
60
|
-
isBlank: () => isBlank,
|
|
61
|
-
isExpiredTimestamp: () => isExpiredTimestamp,
|
|
62
|
-
isHttpClientErrorStatus: () => isHttpClientErrorStatus,
|
|
63
|
-
isHttpServerErrorStatus: () => isHttpServerErrorStatus,
|
|
64
|
-
isHttpSuccessStatus: () => isHttpSuccessStatus,
|
|
65
|
-
isLightColor: () => isLightColor,
|
|
66
|
-
isNotBlank: () => isNotBlank,
|
|
67
|
-
isNullish: () => isNullish,
|
|
68
|
-
isNumber: () => isNumber,
|
|
69
|
-
isString: () => isString,
|
|
70
|
-
isWsClosable: () => isWsClosable,
|
|
71
|
-
isWsOpenOrConnecting: () => isWsOpenOrConnecting,
|
|
72
|
-
nowAsDate: () => nowAsDate,
|
|
73
|
-
nowAsDateTime: () => nowAsDateTime,
|
|
74
|
-
nowAsDateTimeForFilename: () => nowAsDateTimeForFilename,
|
|
75
|
-
nowAsTime: () => nowAsTime,
|
|
76
|
-
removeDiacriticalMarks: () => removeDiacriticalMarks,
|
|
77
|
-
rgbToHex: () => rgbToHex,
|
|
78
|
-
rgbToString: () => rgbToString,
|
|
79
|
-
rgbaToHex: () => rgbaToHex,
|
|
80
|
-
rgbaToHexWithAlpha: () => rgbaToHexWithAlpha,
|
|
81
|
-
rgbaToString: () => rgbaToString,
|
|
82
|
-
roundToNiceNumber: () => roundToNiceNumber,
|
|
83
|
-
roundUpToNearest10: () => roundUpToNearest10,
|
|
84
|
-
sleep: () => sleep,
|
|
85
|
-
tickFormatter: () => tickFormatter,
|
|
86
|
-
toFixed: () => toFixed,
|
|
87
|
-
toToleranceLabel: () => toToleranceLabel,
|
|
88
|
-
tooltipValueFormatter: () => tooltipValueFormatter,
|
|
89
|
-
truncate: () => truncate
|
|
90
|
-
});
|
|
91
|
-
module.exports = __toCommonJS(index_exports);
|
|
3
|
+
var dateFns = require('date-fns');
|
|
92
4
|
|
|
93
5
|
// src/utils/types.utils.ts
|
|
94
6
|
var NO_OP = () => {
|
|
@@ -246,32 +158,29 @@ var getColorForPercentage = (percent) => {
|
|
|
246
158
|
};
|
|
247
159
|
return "rgb(" + [color.r, color.g, color.b].join(",") + ")";
|
|
248
160
|
};
|
|
249
|
-
|
|
250
|
-
// src/utils/date.utils.ts
|
|
251
|
-
var import_date_fns = require("date-fns");
|
|
252
161
|
var dateAs_HHMMSS = (value) => {
|
|
253
162
|
if (isNullish(value)) return "";
|
|
254
|
-
return
|
|
163
|
+
return dateFns.format(value, "HH:mm:ss");
|
|
255
164
|
};
|
|
256
165
|
var dateAs_YYYYMMDD = (value) => {
|
|
257
166
|
if (isNullish(value)) return "";
|
|
258
|
-
return
|
|
167
|
+
return dateFns.format(value, "yyyy-MM-dd");
|
|
259
168
|
};
|
|
260
169
|
var dateAs_YYYYMMDD_HHMMSS = (value) => {
|
|
261
170
|
if (isNullish(value)) return "";
|
|
262
|
-
return
|
|
171
|
+
return dateFns.format(value, "yyyy-MM-dd HH:mm:ss");
|
|
263
172
|
};
|
|
264
173
|
var nowAsTime = () => dateAs_HHMMSS(/* @__PURE__ */ new Date());
|
|
265
174
|
var nowAsDate = () => dateAs_YYYYMMDD(/* @__PURE__ */ new Date());
|
|
266
175
|
var nowAsDateTime = () => dateAs_YYYYMMDD_HHMMSS(/* @__PURE__ */ new Date());
|
|
267
176
|
var nowAsDateTimeForFilename = () => {
|
|
268
|
-
return
|
|
177
|
+
return dateFns.format(/* @__PURE__ */ new Date(), "yyyy-MM-dd_HH-mm-ss");
|
|
269
178
|
};
|
|
270
179
|
var DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
|
|
271
180
|
var formatUnixTimestamp = (timestamp, dateFormat = DEFAULT_DATE_FORMAT) => {
|
|
272
181
|
if (!timestamp) return "N/A";
|
|
273
182
|
try {
|
|
274
|
-
return
|
|
183
|
+
return dateFns.format(new Date(timestamp * 1e3), dateFormat);
|
|
275
184
|
} catch {
|
|
276
185
|
return "Invalid date";
|
|
277
186
|
}
|
|
@@ -322,29 +231,6 @@ var isHttpServerErrorStatus = (status) => {
|
|
|
322
231
|
return status >= 500;
|
|
323
232
|
};
|
|
324
233
|
|
|
325
|
-
// src/utils/number.utils.ts
|
|
326
|
-
var toFixed = (value, decimals = 0) => {
|
|
327
|
-
if (isNullish(value)) return 0;
|
|
328
|
-
if (decimals < 0) throw new Error("[toFixed] decimals must be >= 0");
|
|
329
|
-
if (decimals === 0) return Math.round(value);
|
|
330
|
-
const multiplier = Math.pow(10, decimals);
|
|
331
|
-
return Math.round(value * multiplier) / multiplier;
|
|
332
|
-
};
|
|
333
|
-
var roundUpToNearest10 = (value) => {
|
|
334
|
-
if (isNullish(value)) return 0;
|
|
335
|
-
return Math.ceil(value / 10) * 10;
|
|
336
|
-
};
|
|
337
|
-
var getOrderOfMagnitudeExponent = (n) => {
|
|
338
|
-
if (isNullish(n)) return 0;
|
|
339
|
-
if (!isNumber(n)) return 0;
|
|
340
|
-
const absValue = Math.abs(n);
|
|
341
|
-
if (absValue === 0) {
|
|
342
|
-
return 0;
|
|
343
|
-
}
|
|
344
|
-
const integerPart = Math.floor(absValue);
|
|
345
|
-
return Math.floor(Math.log10(integerPart));
|
|
346
|
-
};
|
|
347
|
-
|
|
348
234
|
// src/utils/regex.ts
|
|
349
235
|
var REGEX_ALPHANUMERIC = /^[a-zA-Z0-9-_ $%#(){}:/.]+$/;
|
|
350
236
|
var REGEX_IPV4 = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
|
|
@@ -378,8 +264,43 @@ var truncate = (str, maxLength, ellipsis = "...") => {
|
|
|
378
264
|
return str.slice(0, maxLength - ellipsis.length) + ellipsis;
|
|
379
265
|
};
|
|
380
266
|
|
|
267
|
+
// src/utils/number.utils.ts
|
|
268
|
+
var isInputValidNumber = (value) => {
|
|
269
|
+
if (isBlank(value)) return false;
|
|
270
|
+
const num = Number(value.trim());
|
|
271
|
+
return Number.isFinite(num);
|
|
272
|
+
};
|
|
273
|
+
var isInputValidInteger = (value) => {
|
|
274
|
+
if (!isInputValidNumber(value)) return false;
|
|
275
|
+
const num = Number(value.trim());
|
|
276
|
+
return Number.isInteger(num);
|
|
277
|
+
};
|
|
278
|
+
var formatIntegerDisplay = (value) => String(toFixed(value, 0));
|
|
279
|
+
var toFixed = (value, decimals = 0) => {
|
|
280
|
+
if (isNullish(value)) return 0;
|
|
281
|
+
if (decimals < 0) throw new Error("[toFixed] decimals must be >= 0");
|
|
282
|
+
if (decimals === 0) return Math.round(value);
|
|
283
|
+
const multiplier = Math.pow(10, decimals);
|
|
284
|
+
return Math.round(value * multiplier) / multiplier;
|
|
285
|
+
};
|
|
286
|
+
var roundUpToNearest10 = (value) => {
|
|
287
|
+
if (isNullish(value)) return 0;
|
|
288
|
+
return Math.ceil(value / 10) * 10;
|
|
289
|
+
};
|
|
290
|
+
var getOrderOfMagnitudeExponent = (n) => {
|
|
291
|
+
if (isNullish(n)) return 0;
|
|
292
|
+
if (!isNumber(n)) return 0;
|
|
293
|
+
const absValue = Math.abs(n);
|
|
294
|
+
if (absValue === 0) {
|
|
295
|
+
return 0;
|
|
296
|
+
}
|
|
297
|
+
const integerPart = Math.floor(absValue);
|
|
298
|
+
return Math.floor(Math.log10(integerPart));
|
|
299
|
+
};
|
|
300
|
+
|
|
381
301
|
// src/utils/thread.utils.ts
|
|
382
302
|
var sleep = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds));
|
|
303
|
+
var yieldToMainThread = () => sleep(0);
|
|
383
304
|
|
|
384
305
|
// src/utils/time.utils.ts
|
|
385
306
|
var ONE_SECOND_IN_MS = 1e3;
|
|
@@ -460,74 +381,77 @@ var closeWebSocket = (ws) => {
|
|
|
460
381
|
} catch {
|
|
461
382
|
}
|
|
462
383
|
};
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
384
|
+
|
|
385
|
+
exports.HZ_TO_RPM = HZ_TO_RPM;
|
|
386
|
+
exports.M3PS_TO_GPM = M3PS_TO_GPM;
|
|
387
|
+
exports.M_TO_INCHES = M_TO_INCHES;
|
|
388
|
+
exports.NO_OP = NO_OP;
|
|
389
|
+
exports.PA_TO_FT = PA_TO_FT;
|
|
390
|
+
exports.PeriodsInMS = PeriodsInMS;
|
|
391
|
+
exports.REGEX_ALPHANUMERIC = REGEX_ALPHANUMERIC;
|
|
392
|
+
exports.REGEX_IPV4 = REGEX_IPV4;
|
|
393
|
+
exports.SCHEME_PREFIXES = SCHEME_PREFIXES;
|
|
394
|
+
exports.W_TO_HP = W_TO_HP;
|
|
395
|
+
exports.buildTicksForChart = buildTicksForChart;
|
|
396
|
+
exports.capitalizeFirst = capitalizeFirst;
|
|
397
|
+
exports.closeWebSocket = closeWebSocket;
|
|
398
|
+
exports.countWords = countWords;
|
|
399
|
+
exports.dateAs_HHMMSS = dateAs_HHMMSS;
|
|
400
|
+
exports.dateAs_YYYYMMDD = dateAs_YYYYMMDD;
|
|
401
|
+
exports.dateAs_YYYYMMDD_HHMMSS = dateAs_YYYYMMDD_HHMMSS;
|
|
402
|
+
exports.extractBase64FromDataUri = extractBase64FromDataUri;
|
|
403
|
+
exports.formatIntegerDisplay = formatIntegerDisplay;
|
|
404
|
+
exports.formatUnixTimestamp = formatUnixTimestamp;
|
|
405
|
+
exports.fromHzToRpm = fromHzToRpm;
|
|
406
|
+
exports.fromM3psToGPM = fromM3psToGPM;
|
|
407
|
+
exports.fromMToInches = fromMToInches;
|
|
408
|
+
exports.fromPaToFt = fromPaToFt;
|
|
409
|
+
exports.fromWToHp = fromWToHp;
|
|
410
|
+
exports.getColorForPercentage = getColorForPercentage;
|
|
411
|
+
exports.getContrastTextColor = getContrastTextColor;
|
|
412
|
+
exports.getCurrentUnixTimestamp = getCurrentUnixTimestamp;
|
|
413
|
+
exports.getErrorMessage = getErrorMessage;
|
|
414
|
+
exports.getLuminance = getLuminance;
|
|
415
|
+
exports.getOpacityHexValue = getOpacityHexValue;
|
|
416
|
+
exports.getOrderOfMagnitudeExponent = getOrderOfMagnitudeExponent;
|
|
417
|
+
exports.getTickDomain = getTickDomain;
|
|
418
|
+
exports.hasScheme = hasScheme;
|
|
419
|
+
exports.hexToNormalizedRgb = hexToNormalizedRgb;
|
|
420
|
+
exports.hexToRgb = hexToRgb;
|
|
421
|
+
exports.isActiveTimestamp = isActiveTimestamp;
|
|
422
|
+
exports.isAlphanumeric = isAlphanumeric;
|
|
423
|
+
exports.isBlank = isBlank;
|
|
424
|
+
exports.isExpiredTimestamp = isExpiredTimestamp;
|
|
425
|
+
exports.isHttpClientErrorStatus = isHttpClientErrorStatus;
|
|
426
|
+
exports.isHttpServerErrorStatus = isHttpServerErrorStatus;
|
|
427
|
+
exports.isHttpSuccessStatus = isHttpSuccessStatus;
|
|
428
|
+
exports.isInputValidInteger = isInputValidInteger;
|
|
429
|
+
exports.isInputValidNumber = isInputValidNumber;
|
|
430
|
+
exports.isLightColor = isLightColor;
|
|
431
|
+
exports.isNotBlank = isNotBlank;
|
|
432
|
+
exports.isNullish = isNullish;
|
|
433
|
+
exports.isNumber = isNumber;
|
|
434
|
+
exports.isString = isString;
|
|
435
|
+
exports.isWsClosable = isWsClosable;
|
|
436
|
+
exports.isWsOpenOrConnecting = isWsOpenOrConnecting;
|
|
437
|
+
exports.nowAsDate = nowAsDate;
|
|
438
|
+
exports.nowAsDateTime = nowAsDateTime;
|
|
439
|
+
exports.nowAsDateTimeForFilename = nowAsDateTimeForFilename;
|
|
440
|
+
exports.nowAsTime = nowAsTime;
|
|
441
|
+
exports.removeDiacriticalMarks = removeDiacriticalMarks;
|
|
442
|
+
exports.rgbToHex = rgbToHex;
|
|
443
|
+
exports.rgbToString = rgbToString;
|
|
444
|
+
exports.rgbaToHex = rgbaToHex;
|
|
445
|
+
exports.rgbaToHexWithAlpha = rgbaToHexWithAlpha;
|
|
446
|
+
exports.rgbaToString = rgbaToString;
|
|
447
|
+
exports.roundToNiceNumber = roundToNiceNumber;
|
|
448
|
+
exports.roundUpToNearest10 = roundUpToNearest10;
|
|
449
|
+
exports.sleep = sleep;
|
|
450
|
+
exports.tickFormatter = tickFormatter;
|
|
451
|
+
exports.toFixed = toFixed;
|
|
452
|
+
exports.toToleranceLabel = toToleranceLabel;
|
|
453
|
+
exports.tooltipValueFormatter = tooltipValueFormatter;
|
|
454
|
+
exports.truncate = truncate;
|
|
455
|
+
exports.yieldToMainThread = yieldToMainThread;
|
|
456
|
+
//# sourceMappingURL=index.cjs.map
|
|
533
457
|
//# sourceMappingURL=index.cjs.map
|