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

chiral

v1.3.5

Published

A library to simplify timekeeping.

Downloads

4

Readme

(01/03/2024) This package has been depreciated. This package separates the intrinsic link between date and time, but in doing so does not support date-times, which are handy more often than they are not. Thus, this package is unhelpful in many situations and has been depreciated to ensure nobody uses it themselves.

Chiral

Chiral is a timekeeping library built for JavaScript and TypeScript projects. It sits as a layer of abstraction on top of JavaScript's Date class, aiming to effectively replace it for most uses.

The primary purpose of Chiral is to separate Date and Time. There are a number of preferential reasons for doing this, most of which are outlined in this Thread. Although exact implementation details are different, the general idea of separating the two remains constant.

Chiral does not support Timezones, due to the inherent complexity of the topic. This is by design, and will almost certainly never be changed.

Installation

npm

npm install chiral

RealTime

The RealTime class represents date-agnostic time. It only has four properties; hours, minutes, seconds and milliseconds. It's epoch is 00:00:00 AM, or midnight. RealTime objects are generally immutable, except when their properties are accessed via setters.

import { RealTime } from "chiral";

const time = new RealTime(9, 35, 40);
console.log(time.toDigital());
// 09:35:40 AM

Individual increments can be set (this is a mutable transformation!):

time.minutes = 41;
console.log(time.toDigital());
// 09:41:40 AM

Rounding to a particular precision precision/p is also possible, and will by default round down. This can be set manually using the rounding/r parameter, which accepts "down", "up" or "nearest":

console.log(time.round({ p: "m" }).toDigital());
// 09:41:00 AM
console.log(time.round({ precision: "m", rounding: "nearest"}).toDigital());
// 09:42:00 AM
console.log(time.round({ p: "m", r: "nearest"}).toDigital());
// 09:42:00 AM

Milliseconds are also supported, but occluded by default:

const time = new RealTime(9, 41, 40, 325);
console.log(time.toDigital());
// 09:41:40 AM
console.log(time.toDigital({ p: "ms" }));
// 09:41:40:325 AM

Arithmetic can also be performed on times, like so:

const time = new RealTime(9, 35, 40);
console.log(time.add({ unit: "m", value: 3 }).toDigital());
// 09:38:40 AM
// OR
console.log(time.add({ u: "m", v: 3 }).toDigital());
// 09:38:40 AM

And with lists of actions, including double-ups, like so:

const time = new RealTime(9, 35, 40);
console.log(time.add([
  { u: "m", v: 3 },
  { u: "m", v: 5 },
  { u: "h", v: 1 },
]).toDigital());
// 10:43:40 AM

The same goes for subtraction.


Equality and comparison checks can also be performed to certain precisions. Rounding to a precision will accept and obey the same default parameters as the .round() function:

const firstTime = new RealTime(9, 35, 40);    // 09:35:40 AM
const secondTime = new RealTime(9);           // 09:00:00 AM

console.log(firstTime.equals(secondTime));
// false
console.log(firstTime.equals(secondTime, { p: "h" }));
// true   - round down by default!
console.log(firstTime.equals(secondTime, { p: "h", r: "nearest" }));
// false

console.log(firstTime.isBefore(secondTime));
// false
console.log(secondTime.isBefore(firstTime));
// true
console.log(firstTime.isBefore(secondTime, { p: "h" }));
// false   - exact equality is not before

// Same behaviour for .isAfter

const thirdTime = new RealTime(9, 41, 40);    // 09:41:40 AM
console.log(thirdTime.isBetween(firstTime, secondTime));
// true
console.log(firstTime.isBetween(firstTime, secondTime));
// true    - here, exact equality is counted
console.log(firstTime.isBetween(secondTime, thirdTime));
// false
console.log(firstTime.isBetween(secondTime, thirdTime, { p: "h" }));
// true    - again, we round down by default!

RealDate

Chiral's RealDate is largely the converse of the RealTime class; it is a time-agnostic date that has the normal JavaScript epoch. Rather than a complete re-implementation (like RealTime is), RealDate is a simple wrapper around JavaScript's Date class that provides a similar API to the RealTime.

import { RealDate } from "chiral";

const date = new RealDate(2023, 10, 25);
console.log(date.toReadable());
// 25/10/2023

The .toReadable() method is the functional equivalent of RealTime's .toDigital() method, but offers the format (f) parameters to format the date as you wish. This defaults to DD/MM/YYYY, because I'm not American and read dates like a normal person.

console.log(date.toReadable({ f: "MM/DD/YYYY" }));
// 10/25/2023    - For all the Americans out there

// Other supported formats are:
// - YYYY/MM/DD      - 2023/10/25
// - Month DD, YYYY  - October 25, 2023

Other methods and parameters are almost identical to those defined RealTime, so they won't be re-explained here. They scale as one would expect to a date object.

Building your own

Chiral also exports the Chiral namespace, which contains all the underlying types used by the RealDate and RealTime classes. This contains parameter types, and the class interfaces for both.

import { Chiral } from "chiral";

class RealTime implements Chiral.Time.I_Time<RealTime> {
  // ...
}

class RealDate implements Chiral.Date.I_Time<RealDate> {
  // ...
}

This is handy if you want to re-implement the classes for your own use, or build extensions or wrappers.