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

relation-matcher

v1.0.13

Published

A utility to convert table data (such as out of a SQL query) into structured JSON.

Readme

Relation Matcher

This is a utility to convert unstructured data from a database into structured relational json data.

Contents

Installation

| | Installation Command | | ---- | --------------------------- | | npm | npm i relation-matcher | | yarn | yarn add relation-matcher | | pnpm | pnpm add relation-matcher |

Usage

To use the relation matcher you feed in your data from your database and a schema. For example with drizzle:

import relationMatcher from "relation-matcher";
import db from "~/db/client";

/* Get your data from the database */
const dbData = await db.select().fro...

const data /* Output */ = relationMatcher(
	dbData /* Data */,
	{...} /* Schema */
);

return data;

data

The data's shape should extend:

Array<Record<string, Record<string, unknown> | null>>;

Example

The data could have the following type:

{
	user: {
		id: string;
		email: string;
		password: string;
		...otherColumns
	};

	post: {
		id: string;
		title: string;
		content: string;

		author_id: string; // < Same as user.id
	}
}[]

schema

The schema's shape should be:

{
	base: "name of table",
	id: "distinct column in above table",

	_yourJoinedTableName: {
		base: "name of table to join",
		id: "distinct column of above table",
		joinsFrom: "column of parent table",
		joinsTo: "column of current table",
		joinType: "single" | "array"
	}
}

[!NOTE] Keys for joins start with an underscore; the final property key will have the leading underscore removed.

Example

With the above data, the schema's shape could be:

{
	base: "user",
	id: "id",

	_posts: {
		base: "post",
		id: "id",
		joinsFrom: "id",
		joinsTo: "author_id",
		joinType: "array",
	}
}

output

The outputted data will take the shape of your schema.

Example

For the data and schema provided above, the output will have the following type:

Record<
	string, // The id specified in the root of your schema.
	{
		id: string;
		email: string;
		password: string;
		...otherColumns;

		posts: Array<
			{
				id: string;
				title: string;
				content: string;

				author_id: string;
			}
		>;
	}
>;

Changelog

1.0.13

  • Added readme.

1.0.12

  • Fixed type issue where return type would be repeated union of expected output.