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

@venn-lang/date

v0.9.0

Published

The date namespace: building a moment, formatting one, and reading it where somebody stands.

Readme

@venn-lang/date

The date namespace: building a moment, writing one out, and reading it where somebody stands.

What a moment answers about itself is a member of it, in UTC, and lives in the kernel:

at.year        at.date        at.plus(2h)      at.until(other)      at.isBefore(other)

What is here is what a moment cannot know alone: what time it is now, how to write it out, and what the same instant reads as somewhere else on earth.

Install

Part of the stdlib the venn CLI and the language server load:

import { date } from "venn/date"

Usage

import { date } from "venn/date"

const started = date.now()
const deadline = started.plus(30m)

print date.format(started, "YYYY-MM-DD HH:mm")
print date.format(started, "HH:mm", "America/Sao_Paulo")

const sent = "2026-07-23T12:00:00Z"
const parsed = date.parse(sent)
if parsed == null {
  fail "the server sent something that is not a date"
}

Verbs

| Verb | Signature | What it does | | --- | --- | --- | | date.now | () -> instant | The moment this run calls now, from the run's own clock. | | date.of | ({ year, month, … }) -> instant | A moment from its parts, in UTC. | | date.parse | (string) -> instant \| null | A moment from text, null when the text is not one. | | date.format | (instant, string, string?) -> string | Written out by a pattern, in a zone if one is named. | | date.in | (instant, string) -> { … } \| null | Its parts where somebody stands. |

Patterns are YYYY, YY, MM, M, DD, D, HH, H, mm, ss. Anything that is not a token is written as it stands, so "on YYYY at HH" reads back as itself.

The clock is the run's

date.now() asks the Clock port, not the machine. A test binds a virtual clock and decides what time it is, which is the difference between a suite that can test an expiry and one that has to wait for it.

Timezones are named, never assumed

Everything a moment answers about itself is UTC, and every verb here that could mean somewhere else takes the place as an argument:

import { date } from "venn/date"

const at = date.parse("2026-07-23T12:00:00Z")

print date.format(at, "HH:mm")                        # 12:00
print date.format(at, "HH:mm", "America/Sao_Paulo")   # 09:00
print date.format(at, "HH:mm", "Asia/Tokyo")          # 21:00

Reading a date in the machine's own zone is how a suite passes in one office and fails in another. A zone the runtime does not know is refused, rather than quietly answered in UTC.

The zones themselves come from the runtime's own table, through Intl. Doing the arithmetic here would mean shipping a copy of that table and watching it go out of date.

API

| Export | What it is | | --- | --- | | datePlugin (also the default export) | The PluginDefinition: namespace date. | | dateActions | The five ActionDefinitions. | | partsIn | The parts of a moment in a zone, or nothing when the zone is unknown. | | formatParts | The pattern filler, on parts that were already read. |

See also