coer-elements 1.0.1 → 1.0.2

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.
@@ -0,0 +1,27 @@
1
+ import moment from "moment";
2
+
3
+ export class DateTime {
4
+ /** Get UTC Offset */
5
+ public static GetUTCOffset(): number {
6
+ return moment().utcOffset();
7
+ }
8
+
9
+
10
+ /** Convert UTC Date to Local Zone */
11
+ public static ToLocalZone(utcDate: string | Date | moment.Moment): string {
12
+ return moment(utcDate).add(DateTime.GetUTCOffset(), 'minutes').format('YYYY-MM-DD HH:mm:ss');
13
+ }
14
+
15
+
16
+ /** Convert Local Zone Date to UTC */
17
+ public static ToUTC(utcDate: string | Date | moment.Moment): string {
18
+ return moment(utcDate).subtract(DateTime.GetUTCOffset(), 'minutes').format('YYYY-MM-DD HH:mm:ss');
19
+ }
20
+
21
+
22
+ /** DD MMM YYYY */
23
+ public static GetDateFormat(date: string | Date | moment.Moment): string {
24
+ if ((typeof date === 'string')) date = date.replaceAll('/', '-');
25
+ return moment(date).parseZone().local(true).format('DD MMM YYYY');
26
+ }
27
+ }
@@ -0,0 +1,102 @@
1
+ import { Tools } from ".";
2
+ import * as XLSX from 'xlsx';
3
+
4
+ export class Files {
5
+ private static readonly EXCEL_EXTENSIONS: string[] = ['xls', 'xlsx', 'csv'];
6
+
7
+ /** Get Extension File */
8
+ public static GetExtension(file: File): string | null {
9
+ const fileName = file.name;
10
+
11
+ if (fileName.includes('.')) {
12
+ let worlds = fileName.split('.') as string[];
13
+
14
+ if (worlds.length > 0) {
15
+ let extension = worlds.pop()!;
16
+ extension = extension.trim().toLowerCase();
17
+ if (extension.length > 0) return extension;
18
+ }
19
+ }
20
+
21
+ return null;
22
+ }
23
+
24
+
25
+ /** Is Excel File */
26
+ public static IsExcel(file: File): boolean {
27
+ const EXTENSION = Files.GetExtension(file);
28
+
29
+ return Tools.IsNotNull(EXTENSION)
30
+ ? this.EXCEL_EXTENSIONS.includes(EXTENSION!)
31
+ : false;
32
+ }
33
+
34
+
35
+ /** Read excel file */
36
+ public static ReadExcel<T>(file: File) {
37
+ return new Promise<{ columns: string[]; rows: T[]; }>(Resolve => {
38
+ let columns: string[] = [];
39
+ let rows: T[] = [];
40
+
41
+ const reader = new FileReader();
42
+ reader.readAsArrayBuffer(file);
43
+
44
+ reader.onload = () => {
45
+ const dataBytes = new Uint8Array(reader.result as any);
46
+
47
+ if (dataBytes) {
48
+ const workbook = XLSX.read(dataBytes, {});
49
+ const sheet = workbook.Sheets[workbook.SheetNames[0]];
50
+ let dataSheet: any[] = XLSX.utils.sheet_to_json(sheet, {
51
+ header: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
52
+ });
53
+
54
+ //Get Headers
55
+ for(const column in dataSheet[0]) {
56
+ columns.push(Tools.FirstCharToLower(String(dataSheet[0][column]).replaceAll(' ', '')));
57
+ }
58
+
59
+ //Get Rows
60
+ rows = XLSX.utils.sheet_to_json(sheet, { header: columns });
61
+ rows.shift();
62
+
63
+ rows = rows.map(row => {
64
+ const item = Tools.BreakReference<any>(row);
65
+ delete item['__rowNum__'];
66
+ return item;
67
+ });
68
+ }
69
+
70
+ Resolve({ columns, rows });
71
+ }
72
+
73
+ reader.onerror = () => { Resolve({ columns, rows }) }
74
+ });
75
+ }
76
+
77
+
78
+ /** Export to excel file */
79
+ public static ExportExcel<T>(data: T[], fileName: string = 'coer_report', sheetName: string = 'Sheet1') {
80
+ sheetName = Tools.CleanUpBlanks(sheetName);
81
+ fileName = Tools.CleanUpBlanks(fileName);
82
+
83
+ if(fileName.endsWith('.xls') || fileName.endsWith('.xlsx') || fileName.endsWith('.csv')) {
84
+ if (fileName.includes('.xls')) {
85
+ fileName = fileName.replaceAll('.xls', '.xlsx');
86
+ }
87
+
88
+ if (fileName.includes('.csv')) {
89
+ fileName = fileName.replaceAll('.csv', '.xlsx');
90
+ }
91
+ }
92
+
93
+ else {
94
+ fileName += '.xlsx';
95
+ }
96
+
97
+ const WORK_SHEET = XLSX.utils.json_to_sheet(data);
98
+ const WORK_BOOK = XLSX.utils.book_new();
99
+ XLSX.utils.book_append_sheet(WORK_BOOK, WORK_SHEET, 'Sheet1');
100
+ XLSX.writeFile(WORK_BOOK, fileName);
101
+ }
102
+ }
package/Tools/index.ts ADDED
@@ -0,0 +1,134 @@
1
+ import { Guid } from "guid-typescript";
2
+
3
+ export const Tools = {
4
+ /** Generate a Guid */
5
+ GetGuid: (seed: string = 'coer-system') => {
6
+ return `${seed}-${Guid.create().toString()}`;
7
+ },
8
+
9
+ /** Returns true if the value is null or undefined, false otherwise */
10
+ IsNull: (value: any): boolean => {
11
+ if (value === undefined) return true;
12
+ if (value === null) return true;
13
+ return false;
14
+ },
15
+
16
+
17
+ /** Returns true if the value is not null or undefined, false otherwise */
18
+ IsNotNull: (value: any): boolean => {
19
+ if (value === undefined) return false;
20
+ if (value === null) return false;
21
+ return true;
22
+ },
23
+
24
+
25
+ /** Break reference of a object or array */
26
+ BreakReference: <T>(object: T): T => {
27
+ if (object === undefined) return undefined as T;
28
+ if (object === null) return null as T;
29
+ const OBJECT = JSON.parse(JSON.stringify(object))
30
+ return (Array.isArray(OBJECT)) ? [...OBJECT] : { ...OBJECT }
31
+ },
32
+
33
+
34
+ /** Clean extra whitespaces */
35
+ CleanUpBlanks: (text: string | number): string => {
36
+ if(Tools.IsNull(text)) return '';
37
+ let worlds: string[] = String(text).split(' ');
38
+ worlds = worlds.filter(x => x.length > 0);
39
+ return worlds.join(' ');
40
+ },
41
+
42
+
43
+ /** Get properties of an object */
44
+ GetObjectProperties: <T>(obj: T | null | undefined): string[] => {
45
+ const properties: string[] = [];
46
+ if(Tools.IsNull(obj)) return properties;
47
+ for(const property in obj) properties.push(String(property));
48
+ return properties;
49
+ },
50
+
51
+
52
+ /**
53
+ * Set an index and merge more arrays of the same type
54
+ * @returns A new array
55
+ * */
56
+ SetIndex: <T>(array: T[], ...args: T[][]): T[] => {
57
+ let index = 0;
58
+ for (const arg of args) {
59
+ array = Tools.BreakReference(array).concat(Tools.BreakReference(arg));
60
+ }
61
+
62
+ return Tools.BreakReference(array).map(item => Object.assign({ index: index++ }, item));
63
+ },
64
+
65
+
66
+ /** Set First Char To Lower */
67
+ FirstCharToLower: (text: string | null | undefined): string => {
68
+ if (Tools.IsNull(text)) return '';
69
+
70
+ const textArray: string[] = [];
71
+ for(let i = 0; i < text!.length; i++) {
72
+ if(i === 0) textArray.push(text![i].toLowerCase());
73
+ else textArray.push(text![i]);
74
+ }
75
+
76
+ return textArray.join('');
77
+ },
78
+
79
+
80
+ /** Set First Char To Upper */
81
+ FirstCharToUpper: (text: string | null | undefined): string => {
82
+ if (Tools.IsNull(text)) return '';
83
+
84
+ const textArray: string[] = [];
85
+ for(let i = 0; i < text!.length; i++) {
86
+ if(i === 0) textArray.push(text![i].toUpperCase());
87
+ else textArray.push(text![i]);
88
+ }
89
+
90
+ return textArray.join('');
91
+ },
92
+
93
+
94
+ /**
95
+ * Sort an array in ascending order by property
96
+ * @returns A new array
97
+ * */
98
+ SortBy: <T>(array: T[], property: string, propertyType: 'string' | 'number' = 'string'): T[] => {
99
+ switch (propertyType) {
100
+ case 'string': {
101
+ return [...array].sort((x: any, y: any) => {
102
+ if (String(x[property]).toUpperCase().trim() < String(y[property]).toUpperCase().trim()) return -1;
103
+ else if (String(x[property]).toUpperCase().trim() > String(y[property]).toUpperCase().trim()) return 1;
104
+ else return 0;
105
+ });
106
+ }
107
+
108
+ case 'number': {
109
+ return array.sort((x: any, y: any) => Number(x[property] - Number(y[property])));
110
+ }
111
+ }
112
+ },
113
+
114
+
115
+ /**
116
+ * Sort an array in descending order by property
117
+ * @returns A new array
118
+ * */
119
+ SortByDesc: <T>(array: T[], property: string, propertyType: 'string' | 'number' = 'string'): T[] => {
120
+ switch (propertyType) {
121
+ case 'string': {
122
+ return array.sort((x: any, y: any) => {
123
+ if (String(x[property]).toUpperCase().trim() < String(y[property]).toUpperCase().trim()) return 1;
124
+ else if (String(x[property]).toUpperCase().trim() > String(y[property]).toUpperCase().trim()) return -1;
125
+ else return 0;
126
+ });
127
+ }
128
+
129
+ case 'number': {
130
+ return array.sort((x: any, y: any) => Number(Number(y[property])) - x[property]);
131
+ }
132
+ }
133
+ }
134
+ };
package/index.ts CHANGED
@@ -1,127 +1,3 @@
1
- export const Tools = {
2
- /** Returns true if the value is null or undefined, false otherwise */
3
- IsNull: (value: any): boolean => {
4
- if (value === undefined) return true;
5
- if (value === null) return true;
6
- return false;
7
- },
8
-
9
-
10
- /** Returns true if the value is not null or undefined, false otherwise */
11
- IsNotNull: (value: any): boolean => {
12
- if (value === undefined) return false;
13
- if (value === null) return false;
14
- return true;
15
- },
16
-
17
-
18
- /** Break reference of a object or array */
19
- BreakReference: <T>(object: T): T => {
20
- if (object === undefined) return undefined as T;
21
- if (object === null) return null as T;
22
- const OBJECT = JSON.parse(JSON.stringify(object))
23
- return (Array.isArray(OBJECT)) ? [...OBJECT] : { ...OBJECT }
24
- },
25
-
26
-
27
- /** Clean extra whitespaces */
28
- CleanUpBlanks: (text: string | number): string => {
29
- if(Tools.IsNull(text)) return '';
30
- let worlds: string[] = String(text).split(' ');
31
- worlds = worlds.filter(x => x.length > 0);
32
- return worlds.join(' ');
33
- },
34
-
35
-
36
- /** Get properties of an object */
37
- GetObjectProperties: <T>(obj: T | null | undefined): string[] => {
38
- const properties: string[] = [];
39
- if(Tools.IsNull(obj)) return properties;
40
- for(const property in obj) properties.push(String(property));
41
- return properties;
42
- },
43
-
44
-
45
- /**
46
- * Set an index and merge more arrays of the same type
47
- * @returns A new array
48
- * */
49
- SetIndex: <T>(array: T[], ...args: T[][]): T[] => {
50
- let index = 0;
51
- for (const arg of args) {
52
- array = Tools.BreakReference(array).concat(Tools.BreakReference(arg));
53
- }
54
-
55
- return Tools.BreakReference(array).map(item => Object.assign({ index: index++ }, item));
56
- },
57
-
58
-
59
- /** Set First Char To Lower */
60
- FirstCharToLower: (text: string | null | undefined): string => {
61
- if (Tools.IsNull(text)) return '';
62
-
63
- const textArray: string[] = [];
64
- for(let i = 0; i < text!.length; i++) {
65
- if(i === 0) textArray.push(text![i].toLowerCase());
66
- else textArray.push(text![i]);
67
- }
68
-
69
- return textArray.join('');
70
- },
71
-
72
-
73
- /** Set First Char To Upper */
74
- FirstCharToUpper: (text: string | null | undefined): string => {
75
- if (Tools.IsNull(text)) return '';
76
-
77
- const textArray: string[] = [];
78
- for(let i = 0; i < text!.length; i++) {
79
- if(i === 0) textArray.push(text![i].toUpperCase());
80
- else textArray.push(text![i]);
81
- }
82
-
83
- return textArray.join('');
84
- },
85
-
86
-
87
- /**
88
- * Sort an array in ascending order by property
89
- * @returns A new array
90
- * */
91
- SortBy: <T>(array: T[], property: string, propertyType: 'string' | 'number' = 'string'): T[] => {
92
- switch (propertyType) {
93
- case 'string': {
94
- return [...array].sort((x: any, y: any) => {
95
- if (String(x[property]).toUpperCase().trim() < String(y[property]).toUpperCase().trim()) return -1;
96
- else if (String(x[property]).toUpperCase().trim() > String(y[property]).toUpperCase().trim()) return 1;
97
- else return 0;
98
- });
99
- }
100
-
101
- case 'number': {
102
- return array.sort((x: any, y: any) => Number(x[property] - Number(y[property])));
103
- }
104
- }
105
- },
106
-
107
-
108
- /**
109
- * Sort an array in descending order by property
110
- * @returns A new array
111
- * */
112
- SortByDesc: <T>(array: T[], property: string, propertyType: 'string' | 'number' = 'string'): T[] => {
113
- switch (propertyType) {
114
- case 'string': {
115
- return array.sort((x: any, y: any) => {
116
- if (String(x[property]).toUpperCase().trim() < String(y[property]).toUpperCase().trim()) return 1;
117
- else if (String(x[property]).toUpperCase().trim() > String(y[property]).toUpperCase().trim()) return -1;
118
- else return 0;
119
- });
120
- }
121
-
122
- case 'number': {
123
- return array.sort((x: any, y: any) => Number(Number(y[property])) - x[property]);
124
- }
125
- }
126
- }
127
- };
1
+ export * from './Tools'
2
+ export * from './Tools/Files.class';
3
+ export * from './Tools/DateTime.class';
@@ -0,0 +1,5 @@
1
+ export interface IPatch {
2
+ op: 'remove' | 'add' | 'replace';
3
+ path: string;
4
+ value: any;
5
+ }
package/package.json CHANGED
@@ -1,8 +1,11 @@
1
1
  {
2
2
  "name": "coer-elements",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "author": "Christian Omar Escamilla Rodríguez",
5
- "keywords": ["coer", "tools"],
5
+ "keywords": [
6
+ "coer",
7
+ "tools"
8
+ ],
6
9
  "description": "",
7
10
  "license": "MIT",
8
11
  "main": "dist_node/index.js",
@@ -18,7 +21,12 @@
18
21
  "build": "npm run build-browser & npm run build-node",
19
22
  "publish": "npm publish --access public"
20
23
  },
24
+ "dependencies": {
25
+ "guid-typescript": "^1.0.9",
26
+ "moment": "^2.30.1",
27
+ "xlsx": "^0.18.5"
28
+ },
21
29
  "devDependencies": {
22
30
  "typescript": "^5.5.4"
23
31
  }
24
- }
32
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "compilerOptions": {
3
+ /* Visit https://aka.ms/tsconfig to read more about this file */
4
+ "outDir": "./dist/out-tsc",
5
+ "strict": true,
6
+ "noImplicitOverride": true,
7
+ "noPropertyAccessFromIndexSignature": true,
8
+ "noImplicitReturns": true,
9
+ "noFallthroughCasesInSwitch": true,
10
+ "skipLibCheck": true,
11
+ "esModuleInterop": true,
12
+ "sourceMap": true,
13
+ "declaration": false,
14
+ "experimentalDecorators": true,
15
+ "moduleResolution": "node",
16
+ "importHelpers": true,
17
+ "target": "ES2022",
18
+ "module": "ES2022",
19
+ "useDefineForClassFields": false,
20
+ "lib": ["ES2022", "dom"],
21
+ "baseUrl": "./"
22
+ }
23
+ }