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

slonik-iterable

v1.0.1

Published

Helpers for query building with iterables

Downloads

2

Readme

slonik-iterable

CI npm

Helpers for query building with iterables. Ships with TS definitions.

Motivation

I've been really enjoying slonik for all of my projects using Postgres. This is a collection of helper functions I have been passing around from project to project for operating on arrays, plain objects, Maps, and Sets.

Requirements

Docs & Examples

The module exports several objects that group types of functionality.

values

Create a list of values from an object.

import { sql } from "slonik"
import { values } from "slonik-iterable"

const payload = {
  col1: "val1",
  col2: "val2",
}

const query = sql`
  INSERT INTO table (col1, col2)
  VALUES (${values.fromObject(payload)})
`

fromMap()

Convenience for passing a Map<string, any>.

import { sql } from "slonik"
import { values } from "slonik-iterable"

const payload = new Map([
  ["col1", "first value"],
  ["col2", 222],
])

const query = sql`
  INSERT INTO table (col1, col2)
  VALUES (${values.fromMap(payload)})
`

identifiers

Create a set of identifiers from an array of strings.

import { sql } from "slonik"
import { identifiers } from "slonik-iterable"

const query = sql`
  SELECT ${identifiers.fromArray(['col1', 'col2'], 'table')}
  FROM table
`

Create a set of identifiers from an object.

import { sql } from "slonik"
import { identifiers } from "slonik-iterable"

const payload = {
  col1: "val1",
  col2: "val2",
}

const query = sql`
  SELECT ${identifiers.fromObject(payload, 'table')}
  FROM table
`

fromSet()

Convenience for passing a Set<string> (behaves the same as fromArray()).

import { values } from "slonik-iterable"

const PUBLIC_COLUMNS = values.fromSet(new Set(["col_1", "col_2", "col_3"]), "table")

assignment

Create an assignment statement from an object for an update.

import { sql } from "slonik"
import { assignment } from "slonik-iterable"

const payload = {
  col1: "val1",
  col2: "val2",
}

const query = sql`
  UPDATE table SET ${assignment.fromObject(payload)}
`

fromMap()

Convenience for passing a Map<string, any>.

import { sql } from "slonik"
import { assignment } from "slonik-iterable"

const payload = new Map([
  ["col1", "first value"],
  ["col2", 222],
])

const query = sql`
  UPDATE table SET ${assignment.fromMap(payload)}
`

TranslateFn

Methods that insert values into sql statements accept an optional translate argument as a function. You can use this as a callback to modify the value inserted into the statement. This allows making sure the value is handled with the proper sql query building helper.

import { sql } from "slonik"
import { assignment } from "slonik-iterable"

const payload = {
  col1: "val1",
  col2: {
    nested1: "val2",
    nested2: "val3",
  },
  col4: 'val4'
}

const expression = assignment.fromObject(payload, (col, val) => {
  switch (col) {
    case 'col2':
      return sql.json(val) // val is { nested1: "val2", nested2: "val3" }
    case 'col3':
      return sql.binary(Buffer.from(val)) // val is 'val4'
    default:
      return val
  }
})

const query = sql`
  UPDATE table
  SET ${expression}
`

Returning a Tuple

The TranslateFn function type also allows returning a Tuple with arity-2 where the first element is a string and the second element the translated value (any ValueExpressionType from slonik). This allows translation of the column name at the same time as value translation.

import { sql } from "slonik"
import { assignment } from "slonik-iterable"
import { snakeCase } from "lodash"

const payload = {
  myColumn: "val1",
  anotherColumn: "val2",
}

const expression = assignment.fromObject(payload, (col, val) => [snakeCase(col), val])

const query = sql`
  UPDATE table
  SET ${expression}
`