Compare commits

..

4 Commits

Author SHA1 Message Date
ff4401934c Fixed formatDate month shortform
All checks were successful
Build / Build NPM Project (push) Successful in 1m21s
Build / Tag Version (push) Successful in 13s
Build / Publish Documentation (push) Successful in 1m57s
2024-11-16 11:02:32 -05:00
ce3c8d012a Fixed import
All checks were successful
Build / Build NPM Project (push) Successful in 1m5s
Build / Tag Version (push) Successful in 14s
Build / Publish Documentation (push) Successful in 2m2s
2024-11-15 16:22:01 -05:00
a86e8350ee bump 0.22.9
Some checks failed
Build / Build NPM Project (push) Failing after 24s
Build / Tag Version (push) Has been skipped
Build / Publish Documentation (push) Has been skipped
2024-11-15 16:18:45 -05:00
7b4e17e4c4 Added advanced search function
Some checks failed
Build / Build NPM Project (push) Failing after 20s
Build / Tag Version (push) Has been skipped
Build / Publish Documentation (push) Has been skipped
2024-11-15 16:17:52 -05:00
4 changed files with 41 additions and 2 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "@ztimson/utils", "name": "@ztimson/utils",
"version": "0.22.8", "version": "0.22.10",
"description": "Utility library", "description": "Utility library",
"author": "Zak Timson", "author": "Zak Timson",
"license": "MIT", "license": "MIT",

View File

@ -13,6 +13,7 @@ export * from './misc';
export * from './objects'; export * from './objects';
export * from './path-events'; export * from './path-events';
export * from './promise-progress'; export * from './promise-progress';
export * from './search';
export * from './string'; export * from './string';
export * from './time'; export * from './time';
export * from './types'; export * from './types';

38
src/search.ts Normal file
View File

@ -0,0 +1,38 @@
import {dotNotation, JSONAttemptParse} from './objects';
export function search(rows: any[], search: string, regex?: boolean, transform: Function = (r: any) => r) {
if(!rows) return [];
return rows.filter(r => {
// Empty search
const value = transform(r);
if(!search) return true;
// Regex search
if(regex) {
return !!Object.values(value).filter((v: any) => {
try { return RegExp(search, 'gm').test(v.toString()); }
catch { return false; }
}).length
}
// Make sure at least one OR passes
const or = search.split('||').map(p => p.trim()).filter(p => !!p);
return -1 != or.findIndex(p => {
// Make sure all ANDs pass
const and = p.split('&&').map(p => p.trim()).filter(p => !!p);
return and.filter(p => {
// Boolean operator
const prop = /(\w+)\s*(==?|!=|>=|>|<=|<)\s*(\w+)/g.exec(p);
if(prop) {
const a = JSON.stringify(JSONAttemptParse(dotNotation<any>(value, prop[1])));
const operator = prop[2] == '=' ? '==' : prop[2];
const b = JSON.stringify(JSONAttemptParse(prop[3]));
return eval(`${a} ${operator} ${b}`);
}
// Case-sensitive
const v = Object.values(value).join('');
if(/[A-Z]/g.test(search)) return v.includes(p);
// Case-insensitive
return v.toLowerCase().includes(p);
}).length == and.length;
})
});
}

View File

@ -100,7 +100,7 @@ export function formatDate(date: Date | number | string, format = 'YYYY-MM-DD H:
.replaceAll('YY', date.getFullYear().toString().slice(2)) .replaceAll('YY', date.getFullYear().toString().slice(2))
// Month // Month
.replaceAll('MMMM', month(date.getMonth())) .replaceAll('MMMM', month(date.getMonth()))
.replaceAll('MMM', month(date.getMonth()).slice(0, 2)) .replaceAll('MMM', month(date.getMonth()).slice(0, 3))
.replaceAll('MM', (date.getMonth() + 1).toString().padStart(2, '0')) .replaceAll('MM', (date.getMonth() + 1).toString().padStart(2, '0'))
.replaceAll('M', (date.getMonth() + 1).toString()) .replaceAll('M', (date.getMonth() + 1).toString())
// Day // Day