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

dokit

v0.1.0

Published

A collection of functions, classes, etc to make this faster to do.

Downloads

2

Readme

DoKit

DoKit - A modern Javascript library for getting tasks done quickly and easily.

Table Of Contents

Overview

DoKit is a library that simplifies common or complex tasks in your project. It serves as a building block rather than a framework, meaning it complements your project rather than being the main driver of it. You can use DoKit to implement specific features, but it is not intended to handle all aspects of your project. It is meant to be used alongside other libraries to enhance your development experience. While DoKit can be helpful, it is not intended as a one-stop solution for all your development needs. Wow, that was a big wall of text.

DoKit Dictionary

So-, as you know, Javascript has objects, right? Well, those are great and all, but a little clunky. Let me explain.

// Javascript
const obj = {foo:"bar"};
Object.keys(obj); // [foo]
Object.values(obj) // [bar]

// doKit
import dk from "dokit";
const dict = new dk.Dict({foo:"bar"});
dict.keys // [foo]
dict.values // [bar]

Same result, but much cleaner.

DoKit's dictionaries have many methods and properties like that.

Setting a value

const dict = new dk.Dict();
dict.set("key", "value");  // Also adds values

Setting it with options

const dict = new dk.Dict();
dict.add("key", "value", options); // Also sets the value

Options

In a doKit dictionary, there are many ways to modify the behavior. For example, you can set options on the entire dictionary, like so:

const dict = new Dict({/* Put keys and values here */}, options);

Here's the typescript interface for entire dictionary options:

interface dictOptions {
    /** Allows `dict.hasHiddenItems` to be read. If true, will return true if any items are hidden. If false, will return false. @default `true` @see `dictOptions.throwErrorWhenCheckingHiddenItems` */
    allowCheckingForHiddenItems?:boolean
    /** Requires `allowCheckingHiddenItems` to be false. If true, will throw an error when `dict.hasHiddenItems` is read. If false, and the former is true, null is returned. @default `false` */
    throwErrorWhenCheckingHiddenItems?:boolean
    /** Wether to allow `forEach` to read hidden items. @default `true`*/
    allowLoopingOverHiddenItems?:boolean
    /** Wether to allow `filter` to read hidden items. @default `true` */
    allowFilteringHiddenItems?:boolean
    /** Wether to allow `map` to read and set hidden items @default `true` */
    allowMappingHiddenItems?:boolean
}

Okay, but this is currently just a glorified object, right? Well, you'd be mostly correct, except, as well as object wide options, each value can have options too. Here's how you set them, again

const dict = new dk.Dict();
dict.add("key", "value", options);
// Or
dict.setOptions("key", options);

Here's the typescript interface for value options:

interface DictValueOptions {
    /** Default value */
    default?:any,
    /** Wether key is readonly Default:false */
    readonly?:boolean,
    /** Wether to delete after read, default:false */
    burn?:boolean,
    /** Wether to freeze options, default:false  */
    freezeOptions?:boolean,
    /** Wether or not to not return value/key when `items`, `keys`, or `forEach` is called. Requires some permissions on the dictionary to be set in advance.  */
    hidden?:boolean
}

Okay, we've covered the basics of options.

Deleting Values

In a doKit dictionary, you can delete values like so:

const dict = new dk.Dict({foo:"bar"});
dict.delete("foo");
// Or
dict.del("foo");

Getting a list of values

Use Dictionary.values. This turns hidden items to undefined. If this behavior is undesirable, use Dictionary.items, where hidden items are not returned at all.

const dict = new dk.Dict({foo:"bar"});
dict.values // [bar]

Getting a list of keys

Similar to values, use Dictionary.keys. This ignores hidden keys.

const dict = // dict from before
dict.keys // [foo]

Getting a specific item

Use Dictionary.item. This can retrieve hidden values.

const dict = // dict from before
dict.item("foo") // "bar"

Looping over each item in the dictionary

You could use a for...in or a for...of loop, but doKit provides a forEach method Similar to Array.forEach, you use it almost the same

dict.forEach((key, value, index)=>{
    // do something
    // Note, index is the index of the key. Don't know why you'd use it, but you can.
});

There are a bunch of other methods like filter and such, but this is quite long already.

Hidden Values

In DoKit, you can create hidden values by using the Hidden class. These values are only accessible to things that you want to have access (and of course, doKit). Here's an example

const hidden = dk.Hidden.from("value", {
    accessControl(key:any, action:"read"|"write"){
        return false; // Prevent anything but doKit itself from reading the value (outside code cannot read the value, only the doKit script itself)
    }
});
// You can't access the value.

For a more realistic example, here's how you could actually use this:

// Make this value readonly in real JS, not just Typescript.
const hidden = dk.Hidden.from("value", {
    accessControl(key:any, action:"read"|"write") {
        return action==="read";
    }
});
// Then, to get the value
dk.Hidden.getValue(hidden, "key"); // "value"
// But when writing to the value, you cannot.
dk.Hidden.setValue(hidden, "newValue", "key");

Reactivity

In doKit there are two ways to define reactive values, with Store and the @reactive decorator. The latter you can find in Decorators With the store object, you subscribe to changes, and when the value changes, the subscriber is notified.

Creating a Store

Create one like so:

import {Store} from "dokit" // or dk.Store
const store = new Store(value);

Accessing the value

Access the value with value

store.value // The value of the store

Setting the vale

Just assign to value

store.value = "new value"

Now, subscribers will be notified

Using multiple data types (Typescript)

If your store can contain many types of data, declare it like a typescript generic.

const store:Store<string|number> = new Store("value");

Now, when doing this, even as the store is storing a string, you can assign a number.

store.value = 100;

Subscribing to the store

store.subscribe((oldValue,newValue)=>{
    // do something
});

When the value, you get the old and new value.

Unsubscribing from the store

The subscribe method returns a function, and when called, it unsubscribes from the store.

const unsubscribe = store.subscribe((oldValue,newValue)=>{

});
// Unsubscribe
unsubscribe(); // Now, the the callback is no longer triggered on changes.

That's about it for stores.

DoKit Strings

In DoKit, you have a dkString which is like a string, except with more methods.

Creating a DoKit string

Either create a new object, or use the from method.

const str = new dkString("regular Javascript string");
// Or
const str = dkString.from("regular Javascript string");

Okay, but what if a function or something needs a PJS (Plain Javascript String)? Well, just use string.str to get the PJS.

const str = dkString.fom("regular Javascript string")
str.str // regular Javascript string

Now, you can use DoKit strings in your apps.

Now, you can use DoKit's strings in your code. DoKit strings have many methods to make things easier

Naming

DoKit's methods for naming are simple. Make it as close to English as possible. For example:

// Convert celsius to fahrenheit, it reads like english.
import {Convert} from "dokit";
Convert.celsiusToFahrenheit(0) // 32

You can read it like an english sentence. Its function is clear: Convert 0 degrees celsius to fahrenheit.

Please note, this readme is just the start of what doKit can do. Use your IDE to see more details, but for convince, as of v0.0.1, this is all the things doKit exports:

  • Dictionary,
  • Dict (alias for Dictionary),
  • Store,
  • String (alias for dkString),
  • dkString,
  • Number (alias for dkNumber),
  • dkNumber,
  • Array (alias for dkArray),
  • Convert,
  • Stack,
  • Tuple,
  • Misc,
  • Hidden,
  • Decorators