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

supaorm

v0.0.45

Published

SupaORM is a service-based ORM that augments the Supabase JavaScript Client. It is designed to be used with TypeScript and provides a simple, type-safe API for interacting with your Supabase database.

Downloads

18

Readme

SupaORM

SupaORM is a service-based object relationship manager that builds on top of the Supabase JavaScript Client. It utilizes the types automatically generated by the Supabase CLI to offer strong type safety for your queries. It provides core convenience functions, while allowing you to expand upon the functionality on an indivudal table, view, or function level.

How to use

Supabase allows to to generate your TypeScript database schema with this command:

npx supabase gen types typescript --project-id '<YOUR-PROJECT-ID>' --schema public > src/types/supabase.ts

You should also have your Supabase URL and Anon Key defined as environment variables PUBLIC_SUPABASE_URL and PUBLIC_SUPABASE_ANON_KEY, which is standard in the Supabase setup procedure.

Create a file in your project called something like src/supaorm.ts with this contents:

import { createClient } from "@supabase/supabase-js";
import { Database } from "./types/supabase.ts";
import SupaORM from "supaorm";

// Instantiate a singleton of SupaORM, referencing the database schema
const orm = SupaORM<Database>();

// Instantiate Supabase client
const supabase = createClient<Database>(
  process.env.PUBLIC_SUPABASE_URL || "",
  process.env.PUBLIC_SUPABASE_ANON_KEY || ""
);
// Connect the Supabase client with SupaORM
orm.init(supabase);

export default orm;

This creates your Supabase client, with a reference to your database structure, and then passes it into SupaORM.

Create a new folder called src/services to contain the services for your individual tables. For this example, our first file will be for a table called organization and called src/services/organization.service.ts with these contents:

import orm from "../supaorm";

export class OrganizationService extends orm.TableService(
  "organization", // Name of the table
  "id" // Name of the primary key column
) {}

Now in another file in your project you can use it like this to get a list of all organizations:

import { OrganizationService } from "./services/organization.service";

const organizations = new OrganizationService();
const orgs = await organizations.findMany();

To find a single organization

const org = await organizations.findOne(id);

Or to get multiple rows with filtering and pagination

const orgs = await organizations.findMany({
  select: ["id", "name"],
  where: [["country", "eq", "USA"]],
  page: 1,
  perPage: 50,
});

Now let's create a ContactService method, with a contact table that has id, first_name, last_name, and organization_id columns. We will create an additional function for this service to find contacts by organization.

import orm from "../supaorm";

export class ContactService extends orm.TableService("contact", "id") {
  public findByOrganizationId(id: string) {
    return this.findMany({ where: [["organization_id", "eq", id]] });
  }
}