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

@prefig/upact-supabase

v0.3.0

Published

Supabase Auth adapter for upact.

Readme

@prefig/upact-supabase

Supabase Auth adapter for the upact identity port. Wraps Supabase's User shape behind upact's Upactor contract, with privacy minima enforced at the adapter boundary.

Install

npm install @prefig/upact-supabase @prefig/upact

Usage

import { createSupabaseAdapter } from '@prefig/upact-supabase';
import { createClient } from '@supabase/supabase-js';

const supabase = createClient(URL, ANON_KEY); // request-bound for SSR
const port = createSupabaseAdapter(supabase);

const upactor = await port.currentUpactor(request);
if (upactor?.capabilities.has('email')) {
	// gate email-bound features
}

The adapter is per-request: instantiate it inside request handlers from a request-bound SupabaseClient (e.g. SvelteKit's event.locals.supabase), not as a module singleton. The userToUpactor and capabilitiesFromUser helpers are also exported as a sync convenience for consumers whose substrate populates a User synchronously and want to keep their own identity-derivation paths sync.

Conformance statement

Per upact §10:

| Item | Value | |---|---| | Spec version | upact v0.3 | | Substrate | Supabase Auth (@supabase/supabase-js ^2.0.0) | | Self-declared capabilities | email, recovery when user.email is present; empty otherwise | | Capability coupling | Supabase's recovery is email-based; this adapter binds recovery to email (both present together or both absent). Not a generalisable pattern; see upact/docs/adapter-shapes.md. | | Threat model | Low-to-medium-stakes coordination. The Supabase substrate is centrally hosted; its threat model is acceptable in exchange for simplicity. Higher-stakes deployments should select an adapter against a substrate appropriate to their threat model. | | Channel-bound operations | Deferred per upact §5.3 (channel operations are explicitly outside the spec's scope). The adapter declares the email and recovery capabilities; channel implementations follow when a real consumer drives the design. | | issueRenewal substrate behaviour | Both identity and evidence parameters are unused on this adapter. Supabase's refreshSession() acts on the cookie-bound client; the operation refreshes whichever identity owns the request cookies. Applications SHOULD only call issueRenewal in an explicit renewal context (sliding-window middleware, scheduled refresh), not on every request. | | display_hint provenance | Sourced from user_metadata.display_name (application-writable in Supabase). The adapter trims whitespace and rejects email-shaped strings (per upact §4.2 MUST NOT: display hints must not be email addresses). It does not perform deeper sanitisation: applications that care about impersonation prevention should override display_hint with their own logic (petnames, vetted display names, …). | | Session opacity | Sessions are hardened opaque markers from createOpaqueSession (@prefig/upact/internal). This adapter keeps no session-to-state association: substrate state lives in the cookie-bound SupabaseClient, so no WeakMap is held. Adapter back-channel closure verified by the sixteen-case reflection test at tests/back-channel.test.ts. | | AuthError vocabulary | Port-level codes, unified with @prefig/upact-simplex: credential_invalid, credential_rejected, substrate_unavailable, identity_unavailable, rate_limited, auth_failed. Codes describe failure category at the port layer, not Supabase semantics. Substrate detail goes in message; raw substrate error text is not propagated verbatim to callers. | | SHOULD-clause deviations | None for v0.3. |

Status

v0.3.0. Breaking changes between v0.x revisions are permitted; v1.0 marks the first stable version.

Licence

Apache-2.0.