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

@flexacms/client

v0.3.1

Published

Typed, dependency-free client for the Flexa headless CMS content API.

Readme

@flexacms/client

Typed, dependency-free client for the Flexa headless CMS content API. Works in Node 20+, Bun, Deno, edge runtimes and browsers.

npm install @flexacms/client
import { createClient, localize } from '@flexacms/client';

const flexa = createClient({
    apiKey: process.env.FLEXA_API_KEY!,
    // url: 'https://staging.example.com', // optional, defaults to https://flexacms.com
});

const { data: posts, meta } = await flexa
    .entity('posts')
    .list({ status: 'published', perPage: 12 });
const post = await flexa.entity('posts').find('hello-world'); // null when missing
const headline = localize(post?.values.headline, 'es', ['en']);

Keep the API key on the server. Anyone with it can do what its abilities allow; use a Read key limited to the entities a public site needs.

Typed content

Generate types for your workspace with @flexacms/cli and pass them to the client:

import type { FlexaSchema } from './flexa';

const flexa = createClient<FlexaSchema>({ url, apiKey });
const page = await flexa.entity('pages').get('home');
page.values.headline.en; // string | null | undefined, typed from your content model

API

| Method | Description | | ---------------------------------------------------- | ------------------------------------------------------------------------------------------ | | entities() | Content models the key can read | | entity(slug).schema() | Fields, groups, categories and locales | | entity(slug).list(params) | One page: status, search, category, page, perPage, trashed, includeRelations | | entity(slug).all(params) / iterate(params) | Every matching entry, page by page | | entity(slug).get(idOrSlug) / find(idOrSlug) | One entry (find resolves to null on 404) | | entity(slug).create(input) / update(id, input) | Write entries (Write ability) | | entity(slug).delete(id, { force }) / restore(id) | Trash, delete for good or restore |

Every method accepts a last { signal, init } argument; init is merged into the fetch call.

Errors and retries

Failed requests throw a FlexaError with status, message, errors (validation errors keyed by field) and helpers such as isNotFound or isValidationError. Reads are retried after 429, 502, 503, 504 and network failures (honouring Retry-After); writes are never retried.

| Option | Default | | | --------- | -------------- | ---------------------------------------- | | apiPath | /api/v1 | Path of the content API | | timeout | 30000 | Milliseconds before a request is aborted | | retries | 2 | Retries for reads | | headers | — | Extra headers on every request | | fetch | global fetch | Custom fetch implementation |