0.3.5 • Published 2 years ago
@saintno/needed-tools v0.3.5
JS Needed tools
Collection of saintno's useful tools
Install this into your project
- Run in cmd:
yarn add @saintno/needed-toolsMethods and Classes
Browser
Return set of Browser's feature
import { Browser } from "@saintno/needed-tools";
// Detect browser
Browser.isOpera: boolean;
Browser.isSafari: boolean;
Browser.isChrome: boolean;
Browser.isIE: boolean;
Browser.isFirefox: boolean;
Browser.isEdge: boolean;
Browser.isBlink: boolean;
// Detect features
Browser.isMobile: boolean; // Return `true` if current browser is in mobile
Browser.isTouchScreen: boolean; // Return `true` if current browser's screen have touch
Browser.isDarkMode: boolean; // Return `true` if current browser is in darkmodeCommonRegex
Return some useful regex
import { CommonRegex } from "@saintno/needed-tools";
CommonRegex.hex = /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i,
CommonRegex.number = /^-?\d*\.?\d*$/,
CommonRegex.phone = /^\+?[\d\s]{8,}$/,
CommonRegex.email = /^[^\s@]+@[^\s@]+\.[^\s@]+$/,Logger
Useful class to log info in console
import { Logger } from '@saintno/needed-tools';
// Logger need `name` of object that log belongs to
// Logger(object_name, activated?, config_override?)
const MainScreenLogger = new Logger('MainScreen');
// For type of login:
// i: Info: For some output of function or data's contents
// w: Warning: Something wrong happen but your app still work as normal
// b: Bug: Critical error happen and will stop your app
// d: Doing: Log about running job, background services
// Log functions need 3 params: fnName, fnMessage, fnData
MainScreenLogger.i('useEffect', 'Hello from useEffect'); // Without data
MainScreenLogger.i('useEffect', 'Hello from useEffect with data', { name: 'Kiss me' }); // With data
MainScreenLogger.w('useEffect', 'Prefetch cache failed', e);
MainScreenLogger.b('useEffect', 'Cant detect screens size', e);
MainScreenLogger.d('Web3Provider', 'Getting list of address');
// Generate own customize log
// print(msg: string, opts?: { background: string; color: string; bold: boolean }): void
MainScreenLogger.print("Hello World!", { background: "#ffffff"; color: "ff00ff"; bold: true });
// Bug fallback, in case when bug happen, bind your fallback to tracking bug or alert it to user
MainScreenLogger.setBugFallback(({fnName, fnMessage, fnData}) => {
// Do some bug tracking or alert
});QueueManager
Make an queue into your code, init an queue and pushing job into it, the queue will do the job in queue each time you call add, all the job in queue will be trigger parallel with max worker by max_job
import { QueueManager } from '@saintno/needed-tools';
// QueueManager(name_of_queue, max_job = 4, log = true)
const MainQueue = new QueueManager('MainQueue');
// Push an job into queue without wait
MainQueue.add(() => {
console.log('Hello world!');
});
// With high priority, this job will be place in top of queue
MainQueue.add(() => {
console.log('Hello world!');
}, true);
// Push and wait with high priority
await MainQueue.wait(() => {
console.log('Hello world!');
}, true);CacheManager
Caching everything in IndexDB with CacheManager
import { CacheManager } from '@saintno/needed-tools';
// CacheManager(store_name_of_cache, activated = true, log = true)
const MainCache = new CacheManager('MainCache');
// Set some cache with `set`
MainCache.set({
key: 'DATA_2022',
data: [{ name: '1' }, { name: '2' }],
tl: CacheManager.TIME['5min'], // Caching in 5min
tags: ['DATA'], // Will be auto matic delete if call clean by tag
onStorage: false, // False will store on ram
});
// Get some cache with `get` and fallback into generator
const data = await MainCache.get({
key: 'DATA_2022',
tl: CacheManager.TIME['5min'], // Caching in 5min
tags: ['DATA_2'], // Will be auto matic delete if call clean by tag
generator: async () => [{ name: '1' }, { name: '2' }], // If cache not found => call generator => set new cache => return data from generator
onStorage: false, // False will store on ram if generator return data
});
// Clear all cache with tag
MainCache.clearByTag('DATA');
MainCache.clearByTags(['DATA', 'DATA_2']); // Multiple tags
// Clear all cache in store
MainCache.clear();APIQueueItem
Call api much more easier with Cache and Queue
import { APIQueueItem } from '@saintno/needed-tools';
// Support 5 methods: GET, POST, PUT, DELETE, PATCH
// Only GET method support caching, set cache on other method will not works
const data = new APIQueueItem('https://google.com.vn').get(); // Default without cache and placing bottom of queue
const data = new APIQueueItem('https://google.com.vn').high().get(); // Calling without cache and high priority
// Setting cache, without queue, type binding
const data = new APIQueueItem('https://google.com.vn')
.cache({
tl: '5min', // Caching time
tags: ['DATA'], // Tag of this cache on CacheManager
deps: ['DATA_1'], // Auto clear other tags when call this
})
.now() // Bypass queue, call directly into fetch
.get<IAppData>();
// Post method, high priority
new APIQueueItem(`https://google.com.vn/${id}`).high().post({ name: 'SaintNo' });
// Default APIQueueItem will use fetch instance, if you want customize that instance, using hooks:
APIQueueItem.setHook({
beforeCall: (url: string, config: RequestInit) => {
return { config, url };
},
beforeReturn: (data: any, _config: RequestInit) => {
return data;
},
onError: (error: Response, _config: RequestInit): any => {
throw error;
},Other Tools
Some tools that may useful
import { Tools } from '@saintno/needed-tools';
// Delay function for fake api, fake loading...
await Tools.delay(3000); // Delay 3s
// Get current mouse position
Tools.getMousePosition(); // Return {x: number, y: number} in screen
// Get element offset position in parent element
Tools.getWindowRelativeOffset(parent_ele, child_ele);
// This will return offset object
const offset = {
left: 0, // Pixel offset from parent left
top: 0,
right: 0,
bottom: 0,
};Technologies
- Typescript : Language
- BunJS : Bundler
- @kvs/env : Storage
- chalk : Colorful console
- lru-cache : Ram Cache
- queue-typed : API queue
Maintainer
@tctien342
0.3.5
2 years ago
0.3.4
2 years ago
0.3.3
2 years ago
0.3.2
2 years ago
0.3.1
2 years ago
0.3.0
2 years ago
0.2.19
2 years ago
0.2.18
2 years ago
0.2.16
2 years ago
0.2.15
2 years ago
0.2.10
2 years ago
0.2.1
2 years ago
0.2.0
2 years ago
0.2.17
2 years ago
0.2.6
2 years ago
0.2.9
2 years ago
0.2.8
2 years ago
0.2.2
2 years ago
0.2.5
2 years ago
0.1.2
3 years ago
0.1.8
3 years ago
0.1.7
3 years ago
0.1.6
3 years ago
0.1.5
3 years ago
0.1.1
4 years ago
0.1.0
4 years ago