npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@maiyunnet/kebab

v9.0.2

Published

Simple, easy-to-use, and fully-featured Node.js framework that is ready-to-use out of the box.

Readme

Simple, easy-to-use, and fully-featured Node.js framework that is ready-to-use out of the box.

Languages

简体中文 | 繁體中文

Requirement

Node 22+

Installation

Run npm i @maiyunnet/kebab to install the latest version. After installation, run npx kebab init to initialize, then run npx kebab to start the project.

You can also use pm2 to start the project by running:

pm2 start npx --name "kebab" -- kebab

Library

Ai, Buffer, Captcha, Consistent, Core, Cron, Crypto, Db (MySQL, PostgreSQL), Dns (DNSPod, Alibaba Cloud), Fs, Kv (Redis), Lan, Lang, Net, S3, Scan, Session, Socket, Sql, Ssh (Shell, Sftp), Text, Time, Turnstile (Cloudflare, Tencent Cloud), Vector (Milvus), Ws, Zip, Zlib.

Partial Features

Ready-to-use

Following the principle of "ready-to-use", this package includes commonly used libraries in a unified style.

Hot update

By calling the Core.sendRestart method, you can smoothly achieve alternating hot updates between old and new code without interrupting any existing business or connections.

Multi-process support

Create a multi-process model based on the number of CPU cores to fully utilize the multi-core CPU.

Global connection pool

If different sites in the same process connect to the same server, such as db, kv, etc., they share the same connection pool, maximizing efficiency and reducing overhead.

Super Easy-to-use net Library

const res = await lNet.open('https://xxx/test').post().data({ 'a': '1', 'b': '2' }).request();

It can also be used like this:

const res = await lNet.get('https://xxx/test');

You can set custom parsing results:

const res = await lNet.get('https://xxx/test', {
    'hosts': {
        'xxx': '111.111.111.111'
    }
});

You can also choose other local network cards to access:

const res = await lNet.get('https://xxx/test', {
    'local': '123.123.123.123'
});

It also has a complete cookie manager, which can easily obtain and store cookies anywhere. When sending a request, the system will select the domain and path based on the cookie settings. If Set-Cookie has an illegal cross-domain setting, it will be discarded and not recorded, just like a real browser.

const res1 = await lNet.get('https://xxx1.xxx/test1', { 'cookie': cookie });
const res2 = await lNet.get('https://xxx2.xxx/test2', { 'cookie': cookie });

Note: The net library supports both options and open chain operations. For example, await lNet.open('xxx').follow().timeout(60).save(this._config.const.rootPath + 'doc/test.txt').request();

Easy-to-Use Db Library

With a large number of useful interfaces, you can easily filter the data you need from the database:

const ls = Order.where<Order>(this, db, {
    'state': '1'
}).by('id', 'DESC').page(10, 1);
const list = await ls.all();
const count = await ls.count();
const total = await ls.total();

Get a user:

const user = await User.select<User>(this, db, ['id', 'user']).filter([
    ['time_add', '>=', '1583405134']
]).first();

XSRF Detection

Use the _checkXInput method to perform XSRF detection and prevent malicious access.

Scan Login

With the help of the Scan library, it's easy to implement scan login.

Reverse Proxy

Achieve reverse proxy functionality effortlessly by utilizing the rproxy method from the net library, combined with route parameters.

There are more features waiting for you to explore

Examples

Creating a 16-bit random number

let str: string = Core.random(16, Core.RANDOM_N)

Creating a verification code

Captcha.get(400, 100).getBuffer();

Getting a list

const userList = await User.where<User>(this, db, [
    ['state', '!=', '0'],
    {
        'type': ['1', '2', '3'],
        'is_lock': '0'
    }
]).all();

Note: All database operations have been protected against injection attacks.

Sql Library Automatically Adds Table Prefixes and Wrapping Characters "`"

sql.select(['SUM(user.age) age'], 'order').leftJoin('user', {'order.user_id': lSql.column('user.id')});

The output will be:

SELECT SUM(`test_user`.`age`) AS `age` FROM `test_order` LEFT JOIN `test_user` ON `test_order`.`user_id` = `test_user`.`id`

It's so easy to write!

Localization

await this._loadLocale(this._get['lang'], 'test');
return this._l('copy');

Based on the different values of lang, the output will be: Copy, 复制, 複製, コピー, etc., configured in the /data/locale/ directory.

Data Validation

Directly validate submitted data based on strings, numbers, comparisons, and even regular expressions. It's convenient!

{
    'he': ['require', [0, 'The he param does not exist.']],
    'num': ['> 10', [0, 'The num param must > 10.']],
    'reg': ['/^[A-CX-Z5-7]+$/', [0, 'The reg param is incorrect.']],
    'arr': [['a', 'x', 'hehe'], [0, 'The arr param is incorrect.']]
}

See: /test/ctr-checkinput

Other Examples

You can visit /test/ to see more examples.

License

This library is published under Apache-2.0 license.