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

gehenna

v1.1.4

Published

Awesome ES6 polyfills and mega utilities for Adobe scripting

Downloads

86

Readme

gehenna

Awesome ES6 polyfills and mega helpers for Adobe scripting

| Installation | Arrays | Objects | Numbers | Strings | ILST | Examples | | ----------------------------- | :---------------: | :-----------------: | :-----------------: | :-----------------: | :------------------: | :-------------------: |

Installation

🚀 Using brutalism? As of 2.0.9, Gehenna is automatically loaded before utils-folder from within Panel and there's no need to manually install it.

npm i gehenna
import gehenna from "gehenna";

// To automatically load all utilies (including app-specific helpers, if any):
await gehenna();

// Or promisified:
gehenna().then(() => {
  // Utilities now loaded
});

Arrays

| Method | Params | Description | | :------------------------------------------------------------------------------------------------------------ | :------------------ | --------------------------------------------------------------------------------------------------------------------------------: | | filter() | callback function | creates a new array with all elements that pass the test implemented by the provided function. | | find() | callback function | returns the value of the first element in the provided array that satisfies the provided testing function. | | flat() | | creates a new array with all sub-array elements concatenated into it recursively up to the specified depth. | | forEach() | callback function | executes a provided function once for each array element. | | includes() | value any | determines whether an array includes a certain value among its entries, returning true or false as appropriate. | | map() | callback function | creates a new array populated with the results of calling a provided function on every element in the calling array. | | max() | | returns the highest numeric value in array | | min() | | returns the lowest numeric value in array | | reduce() | callback function | executes a reducer function (that you provide) on each element of the array, resulting in single output value. | | some() | callback function | tests whether at least one element in the array passes the test implemented by the provided function. It returns a Boolean value. |

Objects

| Method | Params | Description | | :----------------------------------------------------------------------------------------------------------- | :------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------: | | assign() | target Object, source Object | copies all enumerable own properties from one or more source objects to a target object. It returns the target object. | | entries() | target Object | method returns an array of a given object's own enumerable string-keyed property [key, value] pairs, in the same order as that provided by a for...in loop. | | keys() | target Object | returns an array of a given object's own enumerable property names, iterated in the same order that a normal loop would. |

JSON

  • JSON.stringify()
  • JSON.parse()

Numbers

| Method | Params | Description | | :---------- | :------------------------- | ---------------------------------------------------------------------------: | | isBetween() | min number, max number | returns boolean of whether value is between min / max values | | clamp() | min number, max number | clamps current value to strictly stay within min/max, never exceeding either |

Strings

| Method | Params | Description | | :--------------------------------------------------------------------------------------------------------------- | :----- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | | includes() | | determines whether one string may be found within another string, returning true or false as appropriate. | | padEnd() | | pads the current string with a given string (repeated, if needed) so that the resulting string reaches a given length. The padding is applied from the end of the current string. | | padStart() | | pads the current string with another string (multiple times, if needed) until the resulting string reaches the given length. The padding is applied from the start of the current string. | | trim() | | removes whitespace from both ends of a string. | | trimEnd() | | method removes whitespace from the end of a string. | | trimStart() | | method removes whitespace from the beginning of a string. |

Console

  • console.log()
  • console.error()
  • console.debug()
  • console.clear()

Illustrator

| | | | | :--------------------- | :------------------------------------------ | ----------------------------------------------------------------: | | get() | key string, parent? object | universal getter converts any native collection to standard array | | RGBColor().create() | red number, green number, blue number | creates a new instance of RGBColor | | RGBColor().fromHex() | hex string | creates RGBColor from a given Hex string | | RGBColor().toHex() | | returns hexadecimal string of current color |

Examples

Retrieving a layer by a particular name is much better via find() since it won't cause a script to silently fail:

let vanillaFail = app.activeDocument.layers.getByName("test");
// if "test" does not exist, causes silent fail of entire script

let newPass = get("layers").find((layer) => layer.name == "test");
// if "test" does not exist, returns null. Does not fail and continues executing code below this line.

The above is also not limited to name prop alone and can query any valid property of the object in question, like if we want to select all layers with a "Light Red" label color:

get("layers").filter((layer) => layer.color.toHex() == "#f05152");

Since the get() utility in Illustrator turns collections into native arrays, we can use any ES6 Array methods on them. For instance retrieving all layers which begin with "Layer" can be done as easily as:

let genericallyNamedLayers = get("layers").filter((layer) => {
  return /^Layer/.test(layer.name);
});

Say we want to act on every pathItem within a specified layer:

// Reads "get [iterable key] of [parent]". If parent param is not included defaults to app.activeDocument
get("pathItems", app.activeDocument.layers[1]).forEach((pathItem) => {
  alert(pathItem);
});

Or create a new color in a much easier way than Illustrator allows:

let oldWay = new RGBColor();
oldWay.red = 255;
oldWay.green = 0;
oldWay.blue = 0;

let newWay = new RGBColor().create(255, 0, 0);
let hexColor = newWay.toHex(); // Returns "#ff0000"
let blueColor = new RGBColor().fromHex("#46a0f5");

Clean up coordinate data by rounding each value:

let coordinateArray = get("pathItems")[0].pathPoints;
// This could return long floats like [ [0.092130984, 100.487023098], ... ]
let newCoords = coordinateArray.map((point) => {
  // Modify each coordinate array
  return point.map((axis) => {
    // Modify each coordinate array entry, as in x and y individually. Round them
    return Math.round(axis);
    // Now return the rounded array back as the original entry
  });
  // And return the entire collection back as a single object without mutating the original array.
});
// We now have clean data like [ [0, 100], ... ]

Use AE expression-like syntax:

let min = 1,
  max = 6;
for (let value = 0; value <= 8; value++) {
  alert(value.clamp(min, max));
  // Returns 1, 1, 2, 3, 4, 5, 6, 6, 6
}