open-index/open-npm huggingface dataset:
npm package: @justinmoon/agent-tools
Description: CLI tooling for AI agent project hygiene: docs indexing, justfile linting.
Latest version: 0.1.1

# @justinmoon/agent-tools

CLI tooling for AI agent project hygiene.

## Usage

```bash
npx @justinmoon/agent-tools <command>
```

## Commands

### list-docs

List docs in `./docs/` with frontmatter summaries and "read when" hints.

```bash
npx @justinmoon/agent-tools list-docs
```

### check-docs

Validate all docs have proper frontmatter. Use in CI.

```bash
npx @justinmoon/agent-tools check-docs
```

#### Doc format

```markdown
---
summary: Brief description of what this doc covers
read_when:
  - when working on feature X
  - when debugging Y
---
```

### check-justfile

Verify all justfile recipes have a `#` summary comment. Use in CI.

```bash
npx @justinmoon/agent-tools check-justfile
npx @justinmoon/agent-tools check-justfile path/to/justfile
```

## CI Integration

Add to your `pre-merge` justfile recipe:

```just
pre-merge: lint test
    npx -y @justinmoon/agent-tools check-docs
    npx -y @justinmoon/agent-tools check-justfile
```
npm package: @justinmoto/frontend-guardian-core
Description: Scan engine for Frontend Guardian.
Latest version: 0.1.21

# @justinmoto/frontend-guardian-core

Scan engine for **Frontend Guardian**.

**What is Frontend Guardian?** It helps frontend teams keep UIs consistent. After you ship, spacing, borders, colors, and components often drift. This tool scans your code (Tailwind, JSX/TSX) and flags inconsistent spacing, arbitrary colors, mixed border-radius, duplicate components, and similar issues so you can fix them before they pile up.

Use this package only if you want to run the scanner from your own Node code (programmatic use).

**Most users:** run the CLI instead (no install):

```bash
# Scan current folder for Tailwind/component consistency
npx frontend-guardian .

# Add GitHub Actions workflow to run the check on push/PR
npx frontend-guardian init

# Same scan + AI fix suggestions
npx frontend-guardian . --suggest
```

**Install (optional)** — only if you're embedding the scanner in your app:

```bash
npm i @justinmoto/frontend-guardian-core
```
npm package: @justinmusti/storage
Description: JustinMusti Node and Browser unified storage.
Author: JustinMusti
Latest version: 0.0.9

## @justinmusti/storage

This is a platform-agnostic storage utility class.  

Supported environments:
    * Node
    * Browser

## How to Use  


### import 

```javascript

import {Storage} from "@justinmusti/storage"

```

### Init
``` javascript
// Browser
const storage = new Storage()

// Node
const storage = new Storage({path: "path-to-file-to-write-to"})
```

### Create entry in storage

```javascript
storage.set("test", "hello")
// Browser: localStorage now has `test` entry with value 'hello'
// Node: file at provided path now has `test` entry with value 'hello'

```
### Check if storage has key

```javascript
storage.has('uploadURL') // returns true or false
```

### Delete key from storage.
```javascript
storage.removeitem('test')
storage.has('test')  // Now this returns false.
```

### Remove all/Clear 

```javascript
storage.clear()
// All entries are removed.
```
npm package: @justinribeiro/barcode-reader
Description: A web component that uses the Shape Detection API and module scripts in DedicatedWorker to detect barcodes.
Author: Justin Ribeiro
Latest version: 0.1.0

[![npm version](https://badge.fury.io/js/%40justinribeiro%2Fbarcode-reader.svg)](https://badge.fury.io/js/%40justinribeiro%2Fbarcode-reader)

# \<barcode-reader\>

> A web component that reads barcodes via the Shape Detection API via a Web Worker.

![screenshot of barcode-reader](https://user-images.githubusercontent.com/643503/57164618-8765b100-6da9-11e9-9a22-6e6f7fda9c97.png)

## Features

* Uses Shape Detection API available in Chrome M74 (see https://www.chromestatus.com/feature/4757990523535360).
* Module scripts on DedicatedWorker. You can try the feature with '--enable-experimental-web-platform-features' flag (see https://crbug.com/680046)
* Uses [Comlink](https://github.com/GoogleChromeLabs/comlink) for the proxy of the worker
* Built as a web component via [LitElement](https://lit-element.polymer-project.org/)

## Experimental

Please note, this is **not** production ready. It's not polyfilled, it relies on an experimental platform feature for the Web Worker, and generally I've just been toying with it in various Chrome builds for quite some time.

Use at your own peril! 🐉🔥

## A more complete example

If you're looking for a more complete PWA example of using barcodes on the web, I highly recommend [Paul Kinlans' QR Snapper](https://github.com/PaulKinlan/qrcode) as well as his blog.

## Install

This web component is built with Polymer 3 and ES modules in mind and is
available on NPM:

Install barcode-reader:

```sh
npm i @justinribeiro/barcode-reader
# or
yarn add @justinribeiro/barcode-reader
```

After install, import into your project:

```js
import 'barcode-reader';
```

Finally, use as required:

```html
<barcode-reader></barcode-reader>
<script>
  customElements.whenDefined('barcode-reader').then(() => {
    const barcodeReader = document.querySelector('barcode-reader');

    // start the camera stream
    // always looks for
    // facingMode: {
    //   exact: 'environment',
    // }
    barcodeReader.start();

    // component returns a custom event with results
    document.addEventListener('barcodes-found', (event) => {
      console.log(event.detail.barcodes);

      // if you want to stop streaming, ala, I'm hiding you now
      barcodeReader.stop();
    }, false);
  });
</script>
```
npm package: @justinribeiro/code-block
Description: A web component that utilizes Prism.js and Lit to display nicely formatted code.
Author: Justin Ribeiro
Latest version: 3.0.0

[![npm version](https://badge.fury.io/js/%40justinribeiro%2Fcode-block.svg)](https://badge.fury.io/js/%40justinribeiro%2Fcode-block)

# \<code-block\>

> A web component that displays colorfully formatted code with Prism.js and Lit.

![screenshot of code-block](https://user-images.githubusercontent.com/643503/56254054-0ce02600-6074-11e9-9caf-e9dcc25b3ab1.png)

## Features

* Loads [Prism.js](https://prismjs.com/) language definitions on demand via dynamic imports from `node_modules/prismjs/components/`
* Loads Prism.js custom themes
* Built as a web component on [Lit](https://lit.dev/)

## Install

This web component is built with ES modules in mind and is
available on NPM:

Install code-block:

```sh
npm i @justinribeiro/code-block
# or
yarn add @justinribeiro/code-block
```

After install, import into your project:

```js
import '@justinribeiro/code-block';
```

Finally, use as required:

```html
<code-block language="javascript">
function helloWorld(say) {
  console.log(say);
}

helloWorld('Hi there!');
</code-block>
```

## Attributes

The web component allows certain attributes to be give a little additional
flexibility.

 | Name | Description | Default |
 | --- | --- | --- |
 | `language` | Code language you wish to utilize from Prism | `clike` |
 | `theme` | Path to Prism CSS theme file | `/node_modules/prismjs/themes/prism.css` |

## Building

If you want the ability to load the full spectrum of languages that Prism supports, you'll want to make sure your build script includes the `/node_modules/prismjs/**`, as there are many many language resources (and you don't want them all in your bundle, utilize the dynamic loading).
npm package: @justinribeiro/devtools-to-video
Description: Output a video file from screenshot frames within a Chrome DevTools JSON trace file.
Author: Justin Ribeiro
Latest version: 1.0.0

[![npm version](https://badge.fury.io/js/%40justinribeiro%2Fdevtools-to-video.svg)](https://badge.fury.io/js/%40justinribeiro%2Fdevtools-to-video)

# devtools-to-video

> Output a video file from screenshot frames within a Chrome DevTools JSON trace file.

![image](https://user-images.githubusercontent.com/643503/66878963-26095700-ef71-11e9-96e7-7977b4f73577.png)

Example video output from tool: [justinribeiro.com @ 3G Slow, Moto G4](https://www.youtube.com/watch?v=guJLfqTFfIw)

## Install

```sh
npm i @justinribeiro/devtools-to-video
# or
yarn global add @justinribeiro/devtools-to-video
```

After install, run the command with `-h` to see usage information:

```sh
➜ devtools-to-video -h


  DEVTOOLS-TO-VIDEO
  Output a video file from screenshot frames within a Chrome DevTools JSON trace file.
  Usage: `devtools-to-video [options ...]`


Global Options

  -i, --input string    File path to Chrome DevTools trace JSON file.
  -o, --output string   Output file name for video file.
  -c, --hideClock       If set, hides the time scale clock on the output video file.
  -l, --label string    If set, adds the label above the time scale clock in the output video file.
  -f, --frames number   Sets the frames per second of the output video.
  -h, --help            Print out helpful usage information for this program.
  -v, --version         Print out current program version number.

Version

  0.1.0
```

## Sample command

```sh
➜ devtools-to-video -i Profile-20191015T174036.json -o sample5.mp4 -l '3G Slow @ Moto G4'
 STARTING UP  Checking environment and setting up params.
 CONVERT  Spawning FFMPEG worker with open pipe.
 CONVERT  Begin piping screenshots from DevTools trace to FFMPEG.
 SCREENSHOTS  Processed 24 screenshots into video file.
 CONVERT  DevTools trace successfully converted to MP4.
 LABEL PASS  Adding label and time scale to MP4.
 LABEL PASS  Finished adding label and time scale to MP4.
 COMPLETE  DevTools trace to video is now complete! You file sample5.mp4 is ready
```

## Credit where credit is due

1. WebPageTest does this [way cooler](https://github.com/WPO-Foundation/webpagetest/blob/26e3cf0/www/video/render.php#L567).
2. Kris Selden's [trace-to-mp4.js gist](https://gist.github.com/krisselden/bf98fb0c192fcb73ed32e79c0a7972d2) (mad props)
3. FFMPEG...we're had some adventures haven't we?
npm package: @justinribeiro/html5-dragdroptouch-shim
Description: An opinionated shim that polyfills HTML5 drag and drop support on mobile devices with Event.ComposedPath() support
Author: Justin Ribeiro
Latest version: 0.1.2

[![npm version](https://badge.fury.io/js/%40justinribeiro%2Fhtml5-dragdroptouch-shim.svg)](https://badge.fury.io/js/%40justinribeiro%2Fhtml5-dragdroptouch-shim)

# HTML5 DragDropTouch Shim

> An opinionated shim that polyfills HTML5 drag and drop support on mobile devices with Event.ComposedPath() support

## Key Differences From Other Polyfills

While this is in large part an ES Modules refactor of Bernado's [dragdroptouch](https://github.com/Bernardo-Castilho/dragdroptouch) polyfill (which deserves the bulk of the love by the way), this version differs in two keys areas:

1. Re: finding the draggable. Uses [event.composedPath()](https://developer.mozilla.org/en-US/docs/Web/API/Event/composedPath) to allow use to hunt for draggables within open ShadowRoots

2. Re: finding the dropzone. Uses [event.composedPath()](https://developer.mozilla.org/en-US/docs/Web/API/Event/composedPath) to find the target shadowRoot, then uses [DocumentOrShadowRoot.elementFromPoint](https://developer.mozilla.org/en-US/docs/Web/API/DocumentOrShadowRoot/elementFromPoint) to locate our dropzone target.

This allows it to be more readily be used with ShadowDOM and web components, which is my primary use case for it to be honest.

## Usage

Install via yarn or npm:

```
yarn add @justinribeiro/html5-dragdroptouch-shim
```

Only load the module if device has touch support.

```
if ('ontouchstart' in document) {
  import('@justinribeiro/html5-dragdroptouch-shim/dist/esm.js').then(module => {
    const shim = new module.default();
  });
  status.textContent = 'TOUCH DETECTED: DragDropTouch shim loaded!';
} else {
  status.textContent = 'NATIVE DRAGDROP DETECTED: no shim loaded.';
}
```

## Additional Configuration

The class constructor can take an array of options if you want more control over the various triggers and delays within the shim:

```
import { default as DdtShim } from '@justinribeiro/html5-dragdroptouch-shim';

const opts = {
  threshold = 5,
  opacity = 0.8,
  dblClick = 500,
  ctxMenu = 900,
  isPressHoldMode = 400,
  pressHoldAwait = 400,
  pressHoldMargin = 25,
  pressHoldThreshold = 0
}
const startUpTheShim = new DdtShim(opts);
```

## Examples

> You can run the examples via the [demo site](https://justinribeiro.github.io/html5-dragdroptouch-shim/demo/index.html).

There are a host of examples within the demo holder, including a set of example web components that support drag and drop and the shim. To run locally:

```
yarn dev
```
npm package: @justinribeiro/stl-part-viewer
Description: A web component that displays an STL model with three.js and Lit.
Author: Justin Ribeiro
Latest version: 2.1.1

[![npm version](https://badge.fury.io/js/%40justinribeiro%2Fstl-part-viewer.svg)](https://badge.fury.io/js/%40justinribeiro%2Fstl-part-viewer)

# \<stl-part-viewer\>

> A web component that displays an STL model with [three.js](https://threejs.org/) and [Lit](https://lit.dev/).

![screenshot of stl-part-viewer](https://user-images.githubusercontent.com/643503/41803627-a4daf090-763f-11e8-9ef1-a2e11b0a34c6.png)

## Features

* Uses [Intersection Observer](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API) to load STL files when only in the viewport.
* Uses [Intersection Observer](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API) to pause rendering of scene when viewer is not in viewport
* Loads Binary and ASCII STL files
* Built as a web component on Polymer 3 / LitElement

## Install

This web component is built with Polymer 3 and ES modules in mind and is
available on NPM:

Install stl-part-viewer:

```sh
npm i @justinribeiro/stl-part-viewer
# or
yarn add @justinribeiro/stl-part-viewer
```

After install, import into your project:

```js
import 'stl-part-viewer';
```

Finally, use as required:

```html
<stl-part-viewer src="part.stl"></stl-part-viewer>
```

## Attributes
The web component allows certain attributes to be give a little additional
flexibility.

 | Name | Description | Default |
 | --- | --- | --- |
 | `src` | Location of the STL file you want the viewer to load | `` |
 | `fullscreen` | Text value of the full screen button | `Full Screen` |
 | `backgroundcolor` | Set the background color of the scene; rgb(), hsl(), or X11 color string | `0xf1f1f1` |
 | `floorcolor` | Set the floor plane color; rgb(), hsl(), or X11 color string | `0x666666` |
 | `modelcolor` | Set the model color; rgb(), hsl(), or X11 color string | `0xfffe57` |

## Polyfills Required
`stl-part-viewer` utilizes Custom Elements and Shadow DOM ([Web Components](https://developer.mozilla.org/en-US/docs/Web/Web_Components)), and [Intersection Observer](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API). You may need the [Lit polyfill-support](https://lit.dev/docs/releases/upgrade/#load-polyfill-support-when-using-web-components-polyfills) depending on what you're trying to target.

Within your project, you can load them as such:

```html
<script src="../node_modules/@webcomponents/webcomponentsjs/webcomponents-loader.js"></script>
<script src="../node_modules/lit/platform-support.js">
<script src="../node_modules/intersection-observer/intersection-observer.js"></script>
```
npm package: @justinribeiro/tiny-ga4
Description: An tiny, opinionated Open-Source Google Analytics 4 Client-Side Protocol Implementation for your website.
Author: Justin Ribeiro
Latest version: 1.0.0

# tiny-ga4

> Justin's (Very) Opinionated Google Analytics 4 Measurement Protocol Library, a fork of David's [ga4mp](https://github.com/analytics-debugger/ga4mp).

## The Differences / Features

- Still no dependencies; it's just a vanilla ES module.
- Tiny tiny for the browser only; just 1.66KB Gzip'ed on the wire (98% smaller than GA4's version).
- More type defs, updated to some new browser APIs for speed (e.g., structuredClone)
- No user tracking (IP address or otherwise); I gutted it (my opinion)

## Why?

To be clear, David's [ga4mp](https://github.com/analytics-debugger/ga4mp) works absolutely fine. I gutted this to find more bytes to save, ditch any user tracking whatsoever, and speed up a few very minor things. His version is more flexible than this.

## Install via package manager

This library is built as an ES module and available on NPM:

To install, use your package manager of choice:

```sh
npm i @justinribeiro/tiny-ga4
# or
yarn add @justinribeiro/tiny-ga4
```

## Basic Usage

```js
import analytics from '@justinribeiro/tiny-ga4';
window.analytics = analytics('G-YOUR_TRACKING_ID');
window.analytics.trackEvent('page_view');
```

## Production Ready Usage

If you don't want to use your own build, there is a prebuilt `tiny-ga4.esm.min.js` that is available:

```js
import analytics from '@justinribeiro/tiny-ga4/tiny-ga4.esm.min.js';
window.analytics = analytics('G-YOUR_TRACKING_ID');
window.analytics.trackEvent('page_view');
```

## CDN Usage

You can also use directly from the CDN (should you so please):

```html
<script type="module">
import analytics from 'https://cdn.jsdelivr.net/npm/@justinribeiro/tiny-ga4e@1/tiny-ga4.esm.min.js';
window.analytics = analytics('G-YOUR_TRACKING_ID');
window.analytics.trackEvent('page_view');
</script>
```

## The (Original) Backstory

> From David's [ga4mp](https://github.com/analytics-debugger/ga4mp) original README

This is an open-source implementation for the *client-side* protocol used by **Google Analytics 4**. When I mention "**client-side**" is because it must be differentiated with the official [GA4 Measurement Protocol](https://developers.google.com/analytics/devguides/collection/protocol/ga4) offered by Google.

This library implements the public **Google Analytics 4** protocol to make possible to do a full server-side tracking using NODE/JS which is not actually possible with the official **Measurement Protocol** , which is meant only to augment the current GA4 data and it's not ready for doing a full tracking.

Main differences with the official offers server-side protocol are:

- Trigger new sessions and visits starts
- Track Sessions attribution
- Override the User IP to populate the GEO Details
- View the hits on the DebugView
- Override ANY value you want
- Easily portable to other languages
- Privacy Compliant: Full control over which cookies are created/read and sent to Google
npm package: @justinribeiro/webnfc-reader
Description: Read nfc tags with WebNFC (currently behind a flag in Chrome for Android).
Author: Justin Ribeiro
Latest version: 0.1.1

[![npm version](https://badge.fury.io/js/%40justinribeiro%2Fwebnfc-reader.svg)](https://badge.fury.io/js/%40justinribeiro%2Fwebnfc-reader)

# \<webnfc-reader\>

> A web component that uses [WebNFC](https://w3c.github.io/web-nfc/) to read NFC tags.

## Features

* Props down / events up model: set watch options and simply listen for events via `addEventListener`.
* `sound` attribute uses Web Audio API to make a beep when a tag is read (so hip)
* Built as a web component on Polymer 3 / LitElement

## Install

This web component is built with Polymer 3 and ES modules in mind and is
available on NPM:

Install webnfc-reader:

```sh
npm i @justinribeiro/webnfc-reader
# or
yarn add @justinribeiro/webnfc-reader
```

After install, import into your project:

```js
import 'webnfc-reader';
```

Finally, use as required:

```html
<webnfc-reader sound></webnfc-reader>
```

## Chrome Flag Required

Currently, WebNFC is behind a Chrome flag on Android. To enable, go to chrome://flags and enabled WebNFC on an Android compatible device.

## Attributes

 | Name | Description | Default |
 | --- | --- | --- |
 | `src` | NFCWatchOptions.url property denotes the URL pattern which is used for matching the Web NFC Id of Web NFC messages which are being read. The default value "" means that no matching happens. | `` |
 | `recordtype` | NFCWatchOptions.recordType property denotes the string value which is used for matching the type property of each NFCRecord object in a Web NFC message. The default value "" means that no matching happens. | `` |
 | `mediatype` | NFCWatchOptions.mediaType property denotes the match pattern which is used for matching the type property of each NFCRecord object in a Web NFC message. The default value "" means that no matching happens. | `` |
 | `mode` | NFCWatchOptions.mode property denotes the NFCWatchMode value telling whether only Web NFC content or any NFC content will be watched. | `any` |
 | `verbose` | Status messages sent through custom event `webnfc-reader-status` | false |
 | `sound` | Make a beep sound through Web Audio API when tag is read | false |

## Events

 | Name | Description
 | --- | --- |
 | `webnfc-reader-status` | Watch and status messages |
 | `webnfc-reader-watch` | Receive WebNFC records on tag read |
npm package: @justinrjay/color-thief
Description: Get the dominant color or color palette from an image.
Author: Lokesh Dhakar
Latest version: 3.1.0

# Color Thief

A script for grabbing the color palette from an image. Uses Javascript and the canvas tag to make it happen.

[See a Demo](http://lokeshdhakar.com/projects/color-thief) | [Read more on my blog](http://lokeshdhakar.com/color-thief)


## How to use

### Get the dominant color from an image
```js
var colorThief = new ColorThief();
colorThief.getColor(sourceImage);
```

```js
getColor(sourceImage[, quality])
returns [num, num, num]
```

### Build a color palette from an image

In this example, we build an 8 color palette.

```js
var colorThief = new ColorThief();
colorThief.getPalette(sourceImage, 8);
```

```js
getPalette(sourceImage[, colorCount, quality])
returns [ [num, num, num], [num, num, num], ... ]
```
npm package: @justinrjay/color-thief-xhr-setrequestheader
Description: Get the dominant color or color palette from an image.
Author: Lokesh Dhakar
Latest version: 3.1.0

# Color Thief

A script for grabbing the color palette from an image. Uses Javascript and the canvas tag to make it happen.

[See a Demo](http://lokeshdhakar.com/projects/color-thief) | [Read more on my blog](http://lokeshdhakar.com/color-thief)


## How to use

### Get the dominant color from an image
```js
var colorThief = new ColorThief();
colorThief.getColor(sourceImage);
```

```js
getColor(sourceImage[, quality])
returns [num, num, num]
```

### Build a color palette from an image

In this example, we build an 8 color palette.

```js
var colorThief = new ColorThief();
colorThief.getPalette(sourceImage, 8);
```

```js
getPalette(sourceImage[, colorCount, quality])
returns [ [num, num, num], [num, num, num], ... ]
```
npm package: @justinrohweller/react-native-sort-and-swipe-list
Description: Renders a Sortable and Swipeable List in React Native
Latest version: 6.0.0

# react-native-sort-and-swipe-list
Renders a Sortable and Swipeable List in React Native
Hopefully will update this readme soon.

npm install --save @justinrohweller/react-native-sort-and-swipe-list

import CustomSortAndSwipeList from '@justinrohweller/react-native-sort-and-swipe-list';

<CustomSortAndSwipeList
see example.js for props.
And see two packages documentation for other props.
/>

If you have a warning that says no duplicate props, you tried to use a prop that is already used by this package.

Combines two packages:
react-native-sortable-list: https://github.com/gitim/react-native-sortable-list
react-native-swipe-list-view: https://github.com/jemise111/react-native-swipe-list-view/blob/master/docs/SwipeRow.md

See example.js to see common usage (plus example add/remove rows)
npm package: @justinseibert/depends-on
Description: A decorator for caching class getters and updating the cache based on dependent properties
Author: Justin Seibert
Latest version: 1.2.1

# dependsOn

[![NPM version][npm-image]][npm-url]
[![NPM downloads][downloads-image]][downloads-url]
[![Build status][travis-image]][travis-url]

A decorator for caching class getters and updating the cache based on dependent properties

## Installation

```sh
npm install @justinseibert/depends-on --save
```

## Support

Make sure ES6 [@decorators](https://github.com/tc39/proposal-decorators) are supported in your environment. For instance, in _.tsconfig_:

```json
{
  "compilerOptions": {
    ...
    "experimentalDecorators": true,
  }
}
```

## Usage

### Dependency Array

Apply decorator to a public `get` accessor. Add `string` identifiers of other properties to the dependency array that will trigger a cache update.

Properties added to the dependency array are also tracked in the cache, but do not require their own decoration.

If all of the dependencies are unchanged, the accessor will return the last cached value _instead of_ executing it's underlying function.

```js
import dependsOn from '@justinseibert/depends-on'

class Plant {
  hasWater = true
  hasLight = true

  @dependsOn(['hasWater', 'hasLight'])
  public get canGrow() {
    return this.hasWater && this.hasLight
  }
}
```

### Permanent Caching

If the dependency array is empty, the value of the function will be permanently cached during it's first access.

```js
class Boulder {
  @dependsOn([])
  public get mineralComposition() {
    const feldspar = Math.random()
    const quartz: 1 - feldspar

    return {s
      feldspar,
      quartz,
    }
  }
}
```

### Setter Functions

A setter function will update the cached value and perform any additional computation within.

Related dependencies that are updated within the `set` function are cache-validated so that they do not needlessly trigger a reload during the next `get`

```js
class Lake {
  volume = 100
  topography = [ ... ]

  @dependsOn(['topography', 'volume'])
  public get shoreline() {
    const perimeter = []
    this.topography.forEach((sector) => {
      perimeter.push(...calculatePoints(sector, this.volume))
    })
    return perimeter
  }

  public set shoreline(perimeter) {
    this.volume = calculateVolume(perimeter, this.topography)
  }
}
```

## License

MIT

[npm-image]: https://img.shields.io/npm/v/@justinseibert/depends-on.svg?style=flat
[npm-url]: https://www.npmjs.com/package/@justinseibert/depends-on
[downloads-image]: https://img.shields.io/npm/dm/@justinseibert/depends-on.svg?style=flat
[downloads-url]: https://www.npmjs.com/package/@justinseibert/depends-on
[travis-image]: https://app.travis-ci.com/justinseibert/depends-on.svg?branch=master
[travis-url]: https://app.travis-ci.com/github/justinseibert/depends-on