open-index/open-npm huggingface dataset:
npm package: @peopledata/peopledata-did-registrar
Description: ## Use private IPFS
Latest version: 1.2.1

# Peopledata-did-registrar 

## Use private IPFS

```js
const http = require('http');

const projectId = '<>';
const projectSecret = '<>';

const options = {
    host: '1.13.193.137', // Private testnet only
    port: 9094,
    path: '/id',
    method: 'GET',
    //auth: projectId + ':' + projectSecret,
};

let req = http.request(options, (res) => {
    let body = '';
    res.on('data', function (chunk) {
        body += chunk;
    });
    res.on('end', function () {
        console.log(body);
    });
});
req.end();
```
The out put:
```json
{
  "id": "12D3KooWHRY6sBefa9tKfysDNDejPs3CqPm1ArDhxjp5PvLgaVDz",
  "addresses": [
    "/ip4/172.18.0.7/tcp/9096/p2p/12D3KooWHRY6sBefa9tKfysDNDejPs3CqPm1ArDhxjp5PvLgaVDz",
    "/ip4/127.0.0.1/tcp/9096/p2p/12D3KooWHRY6sBefa9tKfysDNDejPs3CqPm1ArDhxjp5PvLgaVDz"
  ],
  "cluster_peers": [
    "12D3KooWFzq7VP9sAF1VgxSR563Px8dWGy4ouEchC3LLHbUad3mY",
    "12D3KooWHRY6sBefa9tKfysDNDejPs3CqPm1ArDhxjp5PvLgaVDz",
    "12D3KooWJXhVRjHVvjn1jpCXCceZqvZbSRQWbzPgpxmpcSaooK4f"
  ],
  "cluster_peers_addresses": [
    "/ip4/127.0.0.1/tcp/9096/p2p/12D3KooWFzq7VP9sAF1VgxSR563Px8dWGy4ouEchC3LLHbUad3mY",
    "/ip4/172.18.0.5/tcp/9096/p2p/12D3KooWFzq7VP9sAF1VgxSR563Px8dWGy4ouEchC3LLHbUad3mY",
    "/ip4/127.0.0.1/tcp/9096/p2p/12D3KooWJXhVRjHVvjn1jpCXCceZqvZbSRQWbzPgpxmpcSaooK4f",
    "/ip4/172.18.0.6/tcp/9096/p2p/12D3KooWJXhVRjHVvjn1jpCXCceZqvZbSRQWbzPgpxmpcSaooK4f"
  ],
  "version": "1.0.2+gitc4d78d52f8a37ad28fdf12c3c6af8009d05c4a6e",
  "commit": "",
  "rpc_protocol_version": "/ipfscluster/1.0/rpc",
  "error": "",
  "ipfs": {
    "id": "12D3KooWC5NtGeh8drV6AeJKrd44CdkqSkmH9C6te8pnc8GFudbj",
    "addresses": [
      "/ip4/1.13.193.137/tcp/4001/p2p/12D3KooWC5NtGeh8drV6AeJKrd44CdkqSkmH9C6te8pnc8GFudbj",
      "/ip4/1.13.193.137/udp/27473/quic/p2p/12D3KooWC5NtGeh8drV6AeJKrd44CdkqSkmH9C6te8pnc8GFudbj",
      "/ip4/127.0.0.1/tcp/4001/p2p/12D3KooWC5NtGeh8drV6AeJKrd44CdkqSkmH9C6te8pnc8GFudbj",
      "/ip4/127.0.0.1/udp/4001/quic/p2p/12D3KooWC5NtGeh8drV6AeJKrd44CdkqSkmH9C6te8pnc8GFudbj",
      "/ip4/172.18.0.3/tcp/4001/p2p/12D3KooWC5NtGeh8drV6AeJKrd44CdkqSkmH9C6te8pnc8GFudbj",
      "/ip4/172.18.0.3/udp/4001/quic/p2p/12D3KooWC5NtGeh8drV6AeJKrd44CdkqSkmH9C6te8pnc8GFudbj"
    ],
    "error": ""
  },
  "peername": "cluster0"
}
```
npm package: @peopledata/peopledata-did-resolver
Description: This module encapsulates the logic required to resolve Peopledata Identities using an instance of the Peopledata registry smart contract and an IPFS gateway. The exported interface is compatible with the DIF DID-Resolver module.
Author: jerry zhang
Latest version: 1.2.0

# peopledata-did-resolver

This module encapsulates the logic required to resolve Peopledata Identities using an instance of the Peopledata registry smart contract and an IPFS gateway. The exported interface is compatible with the DIF DID-Resolver module.

*Please note that this module is not meant to be used directly, but rather through an integration with either the peopledata did resolver Library (source), or the DIF DID-Resolver module (as shown in the example below)*

## Usage Examples

In combination with the <font color=Blue>DIF DID-Resolver</font>:

```js
import { getResolver } from "@peopledata/peopledata-did-resolver";
import { Resolver } from "did-resolver";

const resolver = new Resolver(getResolver());
const didDocument = await resolver.resolve(did);
// didDocument now contains the corresponding Did Document in JSON form.
```
A number of configuration options can be passed to the getResolver function, as shown in this example:

```js
import { getResolver } from "@peopledata/peopledata-did-resolver";
import { Resolver } from "did-resolver";

// The Ethereum gateway to use for reading the registry contract state and broadcasting transactions
const ethGatewayEndpoint = 'https://rinkeby.infura.io/v3/000085cafc1934feaa09ccb83630d5d8'

// The Ethereum address of a instance of the registry smart contract to use for anchoring / resolution
const registryContractAddress = '0xD333333333333333333AAAAAAAAAAFFFFFFFFF20'

// A public IPFS gateway which can be used to store and retrieve documents
const ipfsGatewayEndpoint = 'https://ipfs.example.com:443'

const resolver = new Resolver(getResolver(ethGatewayEndpoint, registryContractAddress, ipfsGatewayEndpoint));
const didDocument = await resolver.resolve(did);
// didDocument now contains the corresponding Did Document in JSON form.
```

If no arguments are passed to the `getResolver()` function, <font color=Blue>default arguments are used</font>.
npm package: @peopleforce/turbo
Description: The speed of a single-page web application without having to write any JavaScript
Author: javan, packagethief, sstephenson
Latest version: 7.0.0-beta.7

# Turbo

Turbo uses complementary techniques to dramatically reduce the amount of custom JavaScript that most web applications will need to write:

* Turbo Drive accelerates links and form submissions by negating the need for full page reloads.
* Turbo Frames decompose pages into independent contexts, which scope navigation and can be lazily loaded.
* Turbo Streams deliver page changes over WebSocket or in response to form submissions using just HTML and a set of CRUD-like actions.
* Turbo Native lets your majestic monolith form the center of your native iOS and Android apps, with seamless transitions between web and native sections.

It's all done by sending HTML over the wire. And for those instances when that's not enough, you can reach for the other side of Hotwire, and finish the job with [Stimulus](https://github.com/hotwired/stimulus).

Read more on [turbo.hotwire.dev](https://turbo.hotwire.dev).

_Note: Turbo is currently in beta. We're using it in production with [HEY](https://hey.com), but expect that significant changes might be made in response to early feedback ✌️❤️_

© 2021 Basecamp, LLC.
npm package: @peopleforce/turbo_dev
Description: The speed of a single-page web application without having to write any JavaScript
Author: javan, packagethief, sstephenson
Latest version: 7.0.0-beta.8

# Turbo

Turbo uses complementary techniques to dramatically reduce the amount of custom JavaScript that most web applications will need to write:

* Turbo Drive accelerates links and form submissions by negating the need for full page reloads.
* Turbo Frames decompose pages into independent contexts, which scope navigation and can be lazily loaded.
* Turbo Streams deliver page changes over WebSocket or in response to form submissions using just HTML and a set of CRUD-like actions.
* Turbo Native lets your majestic monolith form the center of your native iOS and Android apps, with seamless transitions between web and native sections.

It's all done by sending HTML over the wire. And for those instances when that's not enough, you can reach for the other side of Hotwire, and finish the job with [Stimulus](https://github.com/hotwired/stimulus).

Read more on [turbo.hotwire.dev](https://turbo.hotwire.dev).

_Note: Turbo is currently in beta. We're using it in production with [HEY](https://hey.com), but expect that significant changes might be made in response to early feedback ✌️❤️_

© 2021 Basecamp, LLC.
npm package: @peoplefund-tech/stylelint-order
Description: Stylelint config that sorts related property declarations by grouping together following the order: Positioning, Box Model, Typography, Visual, Animation, Other.
Author: Peoplefund
Latest version: 0.1.0

# Peoplefund Style Lint Rule

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

Stylelint config that sorts related property declarations by grouping together following the order:

1.  Positioning
2.  Box Model
3.  Typography
4.  Visual
5.  Animation
6.  Misc

```css
.declaration-order {
  /* Positioning */
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: 10;

  /* Box Model */
  display: block;
  float: right;
  width: 100px;
  height: 100px;
  margin: 10px;
  padding: 10px;

  /* Typography */
  color: #888;
  font: normal 16px Helvetica, sans-serif;
  line-height: 1.3;
  text-align: center;

  /* Visual */
  background-color: #eee;
  border: 1px solid #888;
  border-radius: 4px;
  opacity: 1;

  /* Animation */
  transition: all 1s;

  /* Misc */
  user-select: none;
}
```

## Usage

1.  Add `stylelint`, `stylelint-order` and this package to your project:

```bash
npm install --save-dev stylelint stylelint-order stylelint-config-rational-order
# or, if you prefer yarn over npm:
yarn add --dev stylelint stylelint-order stylelint-config-rational-order
```

2.  Add this package to the end of your extends array inside Stylelint
    configuration (.stylelintrc for example):

```javascript
{
  "extends": [
    // "stylelint-config-standard",
    "stylelint-config-rational-order"
  ]
}
```

This shareable config contains the following:
```javascript
{
  "plugins": [
    "stylelint-order",
    "stylelint-config-rational-order/plugin"
  ],
  "rules": {
    "order/properties-order": [],
    "plugin/peoplefund-order": [true, {
      "border-in-box-model": false,
      "empty-line-between-groups": false,
    }]
  }
}
```

Since it adds `stylelint-order` and `stylelint-config-rational-order` to plugins and also adds required rules, you don't have to do this yourself when extending this config.


## Optional options / rules

#### border-in-box-model

Defines to which group the **border** property belongs to.

If `true` **border** property belongs to the **box model section**.
The default value is `false` (**border** property belongs to the **visual section**).


#### empty-line-between-groups

If `true` adds an empty line between groups. The default value is `false`.
npm package: @peopleplus/components
Description: A collection of Svelte components using tailwind.
Latest version: 0.7.0

# PeoplePlus Svelte Components

A set of opinionated Svelte components with a focus on accesibility, no JavaScript fallback, and
SvelteKit/SSR support. See the [showcase/docs here](https://peopleplus-components.pages.dev/).

## Test coverage

| Statements                                                                                                                                                         | Branches                                                                                                                                                       | Functions                                                                                                                                                        | Lines                                                                                                                                                    |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ![Statements](https://img.shields.io/endpoint?style=flat&url=https://gist.githubusercontent.com/jamesbirtles/30db617e41d5bf83af5927c7c071bbeb/raw/statements.json) | ![Branches](https://img.shields.io/endpoint?style=flat&url=https://gist.githubusercontent.com/jamesbirtles/30db617e41d5bf83af5927c7c071bbeb/raw/branches.json) | ![Functions](https://img.shields.io/endpoint?style=flat&url=https://gist.githubusercontent.com/jamesbirtles/30db617e41d5bf83af5927c7c071bbeb/raw/functions.json) | ![Lines](https://img.shields.io/endpoint?style=flat&url=https://gist.githubusercontent.com/jamesbirtles/30db617e41d5bf83af5927c7c071bbeb/raw/lines.json) |

## Developing

```bash
npm run dev

# or start the server and open the app in a new browser tab
npm run dev -- --open
```

Everything inside `src/lib` is part of the library, everything inside `src/routes` is used to
showcase and document that library.

## Building

To build the library:

```bash
npm run package
```

To create a production version of the showcase app:

```bash
npm run build
```

You can preview the production build with `npm run preview`.

## Contributing

See our [Contribution Guidelines](./CONTRIBUTING.md).

## Publishing

Publishes to npm are done automatically on pushes to main where the package.json version has
changed. The docs/showcase are updated on pushed to main.
npm package: @peopleplus/sveltekit-graphql
Description: Opinionated GraphQL server and client setup for SvelteKit applications, utilising [Houdini](https://houdinigraphql.com) and [Yoga](https://the-guild.dev/graphql/yoga-server).
Latest version: 0.4.4

# SvelteKit GraphQL

Opinionated GraphQL server and client setup for SvelteKit applications, utilising [Houdini](https://houdinigraphql.com) and [Yoga](https://the-guild.dev/graphql/yoga-server).

- 🔧 Minimal configuration
- 🎩 Powered by [Houdini](https://houdinigraphql.com) & [Yoga](https://the-guild.dev/graphql/yoga-server)
- ⚡ Quick & easy setup

## Introduction

SvelteKit GraphQL consists of three parts.

### CLI

The CLI is used on initial setup to quickly scaffold out a skeleton graphql server in an existing
SvelteKit app. It can also be used to add new modules later down the line.

### Vite Plugin

The vite plugin adds hooks to vite to run codegen on build, and on the dev server as you change your
schemas. It also automatically adds in the houdini vite plugin.

### Runtime Package

To avoid needing to manually install and configure many of the dependencies you typically need when
working with GraphQL, SvelteKit GraphQL provides a package wrapping and/or exporting these as
needed.

## Getting Started

The following assumes you already have a SvelteKit app set up and working, and that you are in the
root directory of your app in your terminal. If you don't have a SvelteKit app yet, follow the
official SvelteKit documentaion to create one and then come back here once that is confirmed
working.

Install sveltekit-graphql

```bash
npm i -D sveltekit-graphql
```

Run the script to initialise your repo. It is recommended to commit any pending changes
before running this.

```bash
npx sveltekit-graphql init
```

Assuming everything worked as intended, you should now have a working GraphQL setup in your
SvelteKit app!

Run the dev server to check if everything is working:

```bash
npm run dev
```

Going to http://localhost:5173/graphql, you should see the Yoga GraphiQL interface.

### Next Steps

You can now start building out your GraphQL queries and mutations. The CLI has set you up with the
beginnings of a module structure in 'src/graphql/' allowing you to split up your schema into
separate areas of concern. You are free to expand on this or simply stay with one module. Check out
the [Yoga documentation](https://the-guild.dev/graphql/yoga-server) to learn more.

Houdini is set up and ready for you to start making client queries. Check out the [houdini
documentation](https://houdinigraphql.com/intro) to learn more.
npm package: @peoplesgrocers/seti-ui-file-icons
Description: File icons from Seti-UI
Author: Karl Marx
Latest version: 1.11.3

[![npm](https://img.shields.io/npm/v/@peoplesgrocers/seti-ui-file-icons?label=@peoplesgrocers/seti-ui-file-icons&logo=npm)](https://www.npmjs.com/package/@peoplesgrocers/seti-ui-file-icons)
# seti-ui-file-icons

> File icons from Seti-UI

All of the icons come from [jesseweed/seti-ui](https://github.com/jesseweed/seti-ui). 
This repo just packages them up so you can use them with `npm install`.

This package is primarily intended for use in static sites.
All of the icons are stored in a JSON file as SVG strings.
For most static sites, you only want a few icons on a page (and will likely reuse the same few icons across the entire site).
As a result, it is best to inline the icons in the pages.

In other cases, this approach does not make sense. 
For example, in a webapp where the icons are used dynamically, it would likely be better to use an SVG spritesheet to enable caching of the icons instead of bundling 100K of SVG strings.

# Usage

By default, the color name from Seti-UI is returned for icons.

```js
import { getIcon } from "@peoplesgrocers/seti-ui-file-icons";

const { svg, color } = getIcon("README.md");
```

To replace the color keywords, use `themeIcons`.

```js
import { themeIcons } from "@peoplesgrocers/seti-ui-file-icons";

const getIcon = themeIcons({
  blue: "#268bd2",
  grey: "#657b83",
  "grey-light": "#839496",
  green: "#859900",
  orange: "#cb4b16",
  pink: "#d33682",
  purple: "#6c71c4",
  red: "#dc322f",
  white: "#fdf6e3",
  yellow: "#b58900",
  ignore: "#586e75",
})

const { svg, color } = getIcon("README.md");
```

# Development

## Available Scripts

In the project directory, you can run:

### `./build/build.sh`

Runs a complete build from a fresh install

### `npm run build`

Builds the package using typescript into `./lib`

### `npm run extract`

Processes the icons and styles in `seti-ui` into JSON files

### `npm test`

Uses UVU to run tests.

### `npm run lint`

Checks code for style issues and syntax errors with TSLint and Prettier.

### `npm run lint:fix`

Checks code for style issues and syntax errors with TSLint and Prettier, attempting to fix them when possible.

## SVGO Version Note

This project currently uses SVGO version 1.6, while the latest version is 4.0.0 (as of Aug 2025). An attempt was made to upgrade to the newer version, but after spending approximately 1 hour trying to configure SVGO 4.0.0 to produce the same SVG paths as the original 1.6 version, visual differences remained that could not be adequately resolved. To maintain the integrity and consistency of the existing icons, the decision was made to continue using the original SVGO 1.6 configuration.

## Publishing a new version

Manually
npm package: @peopleswarm/doctor
Description: Debugging tool for the swarm
Author: jerry zhang
Latest version: 1.0.0

# @peopleswarm/doctor

Debugging tool for the swarm

```
npm install -g @peopleswarm/doctor
```

## Usage

``` sh
pplswarm-doctor # prints initial info
pplswarm-doctor --server # spin up a test server
pplswarm-doctor --client=pubkey # connect to a test server and test transfer
```

## License

MIT
npm package: @peopleswarm/testnet
Description: Spin up a local Hyperswarm testnet
Author: jerry zhang
Latest version: 1.0.0

# testnet
Spin up a local peopleswarm testnet

# @peopleswarm/testnet

Small module to help you spin up a local Hyperswarm testnet.

```
npm install @peopleswarm/testnet
```

Use this if you want to use the swarm in tests, etc.

## Usage

``` js
const createTestnet = require('@peopleswarm/testnet')

const testnet = await createTestnet(10) // create a local testnet with 10 dht nodes
```

## API

#### `const testnet = await createTestnet(size = 10, [options])`

Create a new testnet. `size` is how many DHT nodes you want in it. Options include:

```js
{
  port: preferredLocalPort, // defaults to ANY (0)
  host: preferredLocalHost, // defaults to 127.0.0.1
  teardown // optional async teardown helper ie, t.teardown in brittle/tap etc
}
```

#### `testnet.nodes`

An array of nodes in the testnet.

#### `testnet.bootstrap`

An array of bootstrap addresses of the testnet.

#### `const node = testnet.createNode([options])`

Create an additional ephemeral node and add it to the testnet. 

#### `for (const node of testnet)`

Iterate over the nodes of the testnet.

## License

MIT
npm package: @peopleticker/babel-preset-react-app
Description: Babel preset used by Create React App
Latest version: 3.1.2-0

# babel-preset-react-app

This package includes the Babel preset used by [Create React App](https://github.com/facebookincubator/create-react-app).<br>
Please refer to its documentation:

* [Getting Started](https://github.com/facebookincubator/create-react-app/blob/master/README.md#getting-started) – How to create a new app.
* [User Guide](https://github.com/facebookincubator/create-react-app/blob/master/packages/react-scripts/template/README.md) – How to develop apps bootstrapped with Create React App.

## Usage in Create React App Projects

The easiest way to use this configuration is with [Create React App](https://github.com/facebookincubator/create-react-app), which includes it by default. **You don’t need to install it separately in Create React App projects.**

## Usage Outside of Create React App

If you want to use this Babel preset in a project not built with Create React App, you can install it with following steps.

First, [install Babel](https://babeljs.io/docs/setup/).

Then install babel-preset-react-app.

```sh
npm install babel-preset-react-app --save-dev
```

Then create a file named `.babelrc` with following contents in the root folder of your project:

  ```js
  {
    "presets": ["react-app"]
  }
  ```

This preset uses the `useBuiltIns` option with [transform-object-rest-spread](http://babeljs.io/docs/plugins/transform-object-rest-spread/) and [transform-react-jsx](http://babeljs.io/docs/plugins/transform-react-jsx/), which assumes that `Object.assign` is available or polyfilled.
npm package: @peopleticker/create-react-app
Description: Create React apps with no build configuration.
Latest version: 1.5.4-4

# create-react-app

This package includes the global command for [Create React App](https://github.com/facebookincubator/create-react-app).<br>
Please refer to its documentation:

* [Getting Started](https://github.com/facebookincubator/create-react-app/blob/master/README.md#getting-started) – How to create a new app.
* [User Guide](https://github.com/facebookincubator/create-react-app/blob/master/packages/react-scripts/template/README.md) – How to develop apps bootstrapped with Create React App.
npm package: @peopleticker/react-error-overlay
Description: An overlay for displaying stack frames.
Author: Joe Haddad
Latest version: 4.0.2-0

# `react-error-overlay`

`react-error-overlay` is an overlay which displays when there is a runtime error.

## Development

When developing within this package, make sure you run `npm start` (or `yarn start`) so that the files are compiled as you work.
This is ran in watch mode by default.

If you would like to build this for production, run `npm run build:prod` (or `yarn build:prod`).<br>
If you would like to build this one-off for development, you can run `NODE_ENV=development npm run build` (or `NODE_ENV=development yarn build`).
npm package: @peopleticker/react-scripts
Description: Configuration and scripts for Create React App.
Latest version: 1.1.5-4

# react-scripts

This package includes scripts and configuration used by [Create React App](https://github.com/facebookincubator/create-react-app).<br>
Please refer to its documentation:

* [Getting Started](https://github.com/facebookincubator/create-react-app/blob/master/README.md#getting-started) – How to create a new app.
* [User Guide](https://github.com/facebookincubator/create-react-app/blob/master/packages/react-scripts/template/README.md) – How to develop apps bootstrapped with Create React App.
npm package: @peopleweek/react-org-chart
Description: Simple, high-performance react component for d3 org chart
Author: PeopleWeek, based on work of UNICEF and Fouad Matin
Latest version: 0.4.3

# React Organizational Chart
[![npm version](https://badge.fury.io/js/%40PeopleWeek%2Freact-org-chart.svg)](https://badge.fury.io/js/%40PeopleWeek%2Freact-org-chart)

React component for displaying organizational charts.

This component is based on [unicef/react-org-chart](https://github.com/unicef/react-org-chart).
npm package: @peoro/destroy
Description: API to destroy objects, forcing them to free the event loop
Author: peoro
Latest version: 1.0.4

# @peoro/destroy ![npm (scoped)](https://img.shields.io/npm/v/@peoro/destroy.svg?style=popout) ![NpmLicense](https://img.shields.io/npm/l/@peoro/destroy.svg?style=popout) ![David](https://img.shields.io/david/peoro/destroy.svg?style=popout) ![Travis (.com)](https://img.shields.io/travis/com/peoro/destroy.svg?style=popout) ![Coveralls github](https://img.shields.io/coveralls/github/peoro/destroy.svg?style=popout)

> API to destroy objects, forcing them to free the event loop

## Installation

```bash
npm install --save @peoro/destroy
```
npm package: @peoro/eslint-config
Description: peoro's ESLint config
Author: peoro
Latest version: 1.0.1


# @peoro/eslint-config

> peoro's ESLint config

## Installation

```bash
npm install --save-dev @peoro/eslint-config
```

## Usage

Set your `.eslintrc.*`'s `extends` field to `"@peoro/eslint-config"`:

```json
{
	"extends": "@peoro/eslint-config"
}
```

That's it, ESLint will now use this config.
npm package: @peoro/signal
Description: Simple and lightweight signal emitter library
Author: peoro
Latest version: 1.0.2

# @peoro/signal ![npm (scoped)](https://img.shields.io/npm/v/@peoro/signal.svg?style=popout) ![NpmLicense](https://img.shields.io/npm/l/@peoro/signal.svg?style=popout) ![David](https://img.shields.io/david/peoro/signal.svg?style=popout) ![Travis (.com)](https://img.shields.io/travis/com/peoro/signal.svg?style=popout) ![Coveralls github](https://img.shields.io/coveralls/github/peoro/signal.svg?style=popout)

> Simple and lightweight signal emitter library

## Installation

```bash
npm install --save @peoro/signal
```