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 🙏

© 2024 – Pkg Stats / Ryan Hefner

cf-kvprefix

v1.3.0

Published

Clouflare KV prefix handler

Downloads

3

Readme

CF KVPrefix (experimental)

Store data normally with Cloudflare KV but with linked indexes. Technically it handle put and delete of all linked keys.

Why

KV is a key value store only! You can't create complex queries easily. You have to duplicate the data for new query logic. I created this simple package to handle duplicate data. For example, removing the main key of a particular data will remove all linked keys. Without this helper, you have to manually code and handle put and delete for each duplicate data with different keys that are in relation with each other.

How to use it

Use case

Let's say we have a list of users and we want to:

  • Get all disabled users
  • Check if username / email is taken
  • Get latest created users
  • Filter by role
import { Prefix, KVPrefix } from 'cf-kvprefix'

// The custom KV metadata
interface User {
  role: string
  username: string
  email: string
  disabled: boolean
  createdAt: number
}

// This create the prefixes/keys based on defined indexes
const usersPrefix = new Prefix<User>(`users`)

// Disabled index
usersPrefix.setIndex(`disabled`, {
  sortValue: (data) => data.disabled.toString()
})

// Username index
usersPrefix.setIndex(`username`, {
  keyValue: (data) => data.username
})

// Email index
usersPrefix.setIndex(`email`, {
  keyValue: (data) => data.email
})

// CreatedAt index
usersPrefix.setIndex(`createdAt_desc`, {
  sortValue: (data) => `${32503680000 - data.createdAt}` // Keys are always returned in lexicographically sorted order so we have to inverse the timestamp to get descending order
})

// Option 1: Admin role index
usersPrefix.setIndex(`admin`, {
  filter: (data) => data.role === 'admin'
})

// Option 2: Admin role index
usersPreix.setIndex(`role`, {
  sortValue: (data) => data.role
})

// Contain functions to put, delete or list data for all indexes defined
const kvUsers = new KVPrefix<User>(DATA, usersPrefix)

// Get all disabled users
const res = await kvUsers.list({ indexKey: 'disabled::true' })

// Check if username is taken
const res = await kvUsers.getData('{username}', 'username')

// Check if email is taken
const res = await kvUsers.getData('{email}', 'email')

// Get latest created users
const res = await kvUsers.list({ indexKey: 'createdAt_desc' })

// Option 1: Get admin users only
const res = await kvUsers.list({ indexKey: 'admin' })

// Option 2: Get admin users only
const res = await kvUsers.list({ indexKey: 'role::admin' })
const res = await kvUsers.list({ indexKey: 'role::user' })

CLI

TODO

Notes / Caveats

Warning

No idea if this should be use in production app. I have no knowledge on how database create indexes or store data in relation with each other. Please, I welcome anyone for feedback or extensive knowledge about this subject. I feel that I'm missing a lot of things about storing data efficiently, and I want to make it better.

Creating an index on existing data

You need to update all existing keys yourself if you are adding a new index in the code afterward. CFApi can help you edit multiple keys at once efficiently. TODO: The CLI will contain helpers to update indexes