Package Exports
- xoo-tools
- xoo-tools/index.js
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (xoo-tools) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
xoo-tools
Toolkit Node.js tanpa dependensi. Cepat, sederhana, dan lengkap.
Instalasi
npm i xoo-toolsImport
const xoo = require('xoo-tools')HTTP / REQUEST
const xoo = require('xoo-tools')
const { request } = xoo
async function run() {
const r1 = await request.get('https://httpbin.org/get', { responseType: 'json' })
console.log(r1.status, r1.headers, r1.data)
const r2 = await request.post(
'https://httpbin.org/post',
{ hello: 'world' },
{ responseType: 'json', timeout: 5000 }
)
console.log(r2.status, r2.data)
const r3 = await request('https://httpbin.org/gzip', { responseType: 'text', maxRedirects: 5 })
console.log(r3.status)
const r4 = await request('https://example.com', { method: 'HEAD' })
console.log(r4.status)
}
run()HTML Parser Mini
const xoo = require('xoo-tools')
const { html } = xoo
const $ = html.load('<div id="app"><p class="x">Hello</p><a href="/a">Link</a></div>')
const nodes = $.find('#app .x')
console.log(nodes.length)
console.log(html.textContent(nodes[0]))Regex Utils
const xoo = require('xoo-tools')
const { regex } = xoo
const allMatches = regex.matchAll('a1 b22 c333', /\d+/g).map(x => x[0])
const extracted = regex.extract('user:42', /user:(\d+)/, 1)
const isValid = regex.testMany('hello@example.com', [regex.patterns.email])
const replaced = regex.replaceMany('visit http://x.com', [[/https?:\/\/\S+/g, '<url>']])
const stripped = regex.stripTags('<b>ok</b>')
console.log(allMatches)
console.log(extracted)
console.log(isValid)
console.log(replaced)
console.log(stripped)Format Tanggal
const { date } = xoo
console.log(date.format(new Date(), 'YYYY-MM-DD HH:mm:ss'))
console.log(date.fromNow(new Date(Date.now() - 65000)))IP Publik
const xoo = require('xoo-tools')
const run = async () => {
console.log(await xoo.ip.getPublicIP())
}
run()Storage
const xoo = require('xoo-tools')
async function run() {
const { storage } = xoo
await storage.write('data/test.txt', 'hello')
console.log(await storage.read('data/test.txt'))
console.log(await storage.exists('data/test.txt'))
await storage.jsonWrite('data/test.json', { a: 1 })
console.log(await storage.jsonRead('data/test.json'))
console.log(storage.join('data', 'foo', 'bar'))
await storage.copy('data/test.txt', 'data/test-copy.txt')
await storage.move('data/test-copy.txt', 'data/moved.txt')
console.log(await storage.list('data', { recursive: true }))
await storage.remove('data/moved.txt')
}
run()DB Lokal
const xoo = require('xoo-tools')
const { db } = xoo
const { LocalDB } = db
const store = new LocalDB('./mydb.json')
async function main() {
await store.init()
await store.set('user:1', { name: 'A', age: 20 })
const user1 = await store.get('user:1')
const adults = await store.find(({ value }) => value.age >= 18)
const queryResult = await store.query({
where: ({ value }) => value.age >= 18,
map: ({ key, value }) => ({ id: key, ...value })
})
console.log(user1)
console.log(adults)
console.log(queryResult)
}
main()JSON Utils
const xoo = require('xoo-tools')
const { jsonUtils } = xoo
const obj = { b: 1, a: { d: 2, c: 3 } }
console.log(jsonUtils.sortKeys(obj))
console.log(jsonUtils.pick({ a: 1, b: 2 }, ['a']))
console.log(jsonUtils.omit({ a: 1, b: 2 }, ['b']))CLI Prompt
const xoo = require('xoo-tools')
const { cli } = xoo
async function main() {
const name = await cli.prompt('Enter Name: ')
const pass = await cli.password('Enter Password: ')
const ok = await cli.confirm('Next? (y/N) ')
const choice = await cli.select('Pilih:', ['one', 'two', 'thre'])
console.log({ name, pass, ok, choice })
}
main()Auth dan Token
const xoo = require('xoo-tools')
const { auth } = xoo
const hashed = auth.hashPassword('hello')
console.log('Hash:', hashed)
console.log('Verify:', auth.verifyPassword('hello', hashed))
const token = auth.signToken({ uid: 1 }, 'secret', { expiresIn: 3600 })
console.log('Token:', token)
console.log('Verify Token:', auth.verifyToken(token, 'secret'))CORS Helper
const xoo = require('xoo-tools')
const http = require('http')
const cors = xoo.cors({ origin: '*', credentials: true })
http.createServer((req, res) => {
if (cors(req, res)) return
res.setHeader('content-type', 'application/json')
res.end(JSON.stringify({ ok: true }))
}).listen(3000, () => {
console.log('Server running on http://localhost:3000')
})Parsing & Convert
const xoo = require('xoo-tools')
const { convert } = xoo
const b64 = convert.toBase64('hello')
console.log('Base64:', b64)
console.log('From Base64:', convert.fromBase64(b64).toString('utf8'))
console.log('Bytes Format:', convert.bytesFormat(123456))
const csv = convert.csvStringify([{ a: 1, b: 'x' }, { a: 2, b: 'y' }])
console.log('CSV Stringify:\n', csv)
console.log('CSV Parse:', convert.csvParse(csv))FFmpeg Wrapper
const xoo = require('xoo-tools')
const { ffmpeg } = xoo
;(async () => {
const result = await ffmpeg.run(['-version'])
console.log(result)
})()YouTube Search
const xoo = require('xoo-tools')
const ytsearch = xoo.ytsearch
;(async () => {
const results = await ytsearch('lofi')
console.log(results)
})()15 Tools Lanjutan
1. Cache (LRU + TTL)
const xoo = require('xoo-tools')
const { cache } = xoo
const { LRUCache } = cache
const c = new LRUCache({ max: 3, ttl: 1000 })
c.set('a', 1)
c.set('b', 2)
c.set('c', 3)
console.log('Get a:', c.get('a'))
c.set('d', 4)
console.log('Keys after eviction:', c.keys())2. Queue (Task Concurrency)
const xoo = require('xoo-tools')
const { queue } = xoo
const { TaskQueue } = queue
;(async () => {
const q = new TaskQueue({ concurrency: 2, timeout: 2000 })
q.add(async (n) => n * 2, 2).then(console.log) // -> 4
q.add(async () => new Promise(r => setTimeout(() => r('slow'), 300))).then(console.log) // -> slow
await q.onIdle()
console.log('All tasks done!')
})()3. Retry (Exponential Backoff)
const xoo = require('xoo-tools')
const { retry } = xoo
;(async () => {
let i = 0
const v = await retry.retry(async () => {
i++
if (i < 3) throw new Error('fail')
return 'ok'
}, { retries: 5, minTimeout: 50, factor: 2 })
console.log('Result:', v)
})()4. Logger
const xoo = require('xoo-tools')
const { logger } = xoo
;(async () => {
const log = logger.createLogger({ level: 'debug', name: 'app' })
log.info('start')
const end = log.time('work')
await new Promise(r => setTimeout(r, 100))
end()
log.warn('done', { code: 200 })
})()5. Validator
const xoo = require('xoo-tools')
const { validator } = xoo
const schema = validator.object({
email: validator.string({ pattern: /^[^\s@]+@[^\s@]+\.[^\s@]+$/ }),
age: validator.number({ min: 18, integer: true }),
tags: validator.array(validator.string({ min: 1 }), { min: 1 })
})
console.log(schema({ email: 'a@b.com', age: 20, tags: ['x'] }))6. Crypto Utils
const xoo = require('xoo-tools')
const { crypto } = xoo
console.log('SHA256:', crypto.hashSha256('x'))
console.log('HMAC:', crypto.hmacSha256('k', 'x'))
console.log('UUID:', crypto.uuid())
const s = crypto.signToken({ id: 1 }, 'secret', { expSec: 60 })
console.log('Token:', s)
console.log('Verify:', crypto.verifyToken(s, 'secret'))7. URL Utils
const xoo = require('xoo-tools')
const { urlUtils } = xoo
console.log(urlUtils.parseQuery('?a=1&b=2'))
console.log(urlUtils.stringifyQuery({ q: 'hello world', page: 2 }))
console.log(urlUtils.buildURL('https://x.com?a=1', { b: 2 }))
console.log(urlUtils.joinURL('https://x.com/', '/a/', '/b'))8. File Watch
const xoo = require('xoo-tools')
const { fileWatch } = xoo
const w = fileWatch.watch('./data', { recursive: true })
w.on('change', (e) => console.log('change', e))
setTimeout(() => w.close(), 5000)9. Env
const xoo = require('xoo-tools')
const { env } = xoo
env.load('.env')
env.required(['API_KEY'])
console.log(env.get('API_KEY'))
console.log(env.bool('DEBUG', false))
console.log(env.int('PORT', 3000))10. Tokenizer
const xoo = require('xoo-tools')
const { tokenizer } = xoo
console.log(tokenizer.normalize('Ábç'))
console.log(tokenizer.slugify('Hello World!!'))
console.log(tokenizer.words('Hello, world! 123'))
console.log(tokenizer.sentences('Hi. Apa kabar? Oke!'))11. MIME
const xoo = require('xoo-tools')
const { mime } = xoo
const fs = require('fs')
console.log(mime.lookupByExt('file.jpg'))
const buf = fs.readFileSync(__filename)
console.log(mime.sniff(buf))12. CSV
const xoo = require('xoo-tools')
const { csv } = xoo
const s = csv.stringify([{ a: 1, b: 'x' }, { a: 2, b: 'y' }])
console.log(s)
console.log(csv.parse(s, { header: true }))13. XML Parser Mini
const xoo = require('xoo-tools')
const { xml } = xoo
const node = xml.parse('<a id="x"><b>c</b></a>')
console.log(JSON.stringify(node))14. Scheduler (Cron Mini)
const xoo = require('xoo-tools')
const { scheduler } = xoo
const job = scheduler.schedule('* * * * *', () => console.log('tick'))
setTimeout(() => job.stop(), 3100)15. Compress
const xoo = require('xoo-tools')
const { compress } = xoo
;(async () => {
const gz = await compress.gzip('hello')
console.log((await compress.gunzip(gz)).toString())
const br = await compress.brotliCompress('hello')
console.log((await compress.brotliDecompress(br)).toString())
})()CLI Bawaan
npx xoo-tools