open-index/open-npm huggingface dataset:
npm package: @sharpts/react-scripts
Description: Configuration and scripts for Create React App.
Latest version: 1.1.15

# 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: @sharryland/capacitor-calendar-plugin
Description: add events to calendar
Author: luca.peruzzo@sharry.land
Latest version: 1.0.4

# capacitor-calendar-plugin

add events to calendar

## Install

```bash
npm install @sharryland/capacitor-calendar-plugin
npx cap sync
```

## API

<docgen-index>

* [`saveEventToCalendar(...)`](#saveeventtocalendar)

</docgen-index>

<docgen-api>
<!--Update the source file JSDoc comments and rerun docgen to update the docs below-->

### saveEventToCalendar(...)

```typescript
saveEventToCalendar(options: { eventTitle: string; eventDescription?: string; startDate?: number; endDate?: number; location?: string; }) => Promise<void>
```

| Param         | Type                                                                                                                     |
| ------------- | ------------------------------------------------------------------------------------------------------------------------ |
| **`options`** | <code>{ eventTitle: string; eventDescription?: string; startDate?: number; endDate?: number; location?: string; }</code> |

--------------------

</docgen-api>
npm package: @sharshar/word-to-bin-lib
Description: bin-lib is a minimalistic library that allows you to convert words and text into binary code.
Author: Sharmaine
Latest version: 1.1.2

<h1 align="center">bin-lib</h1>
<p align="center">
  <strong>Convert Words to Binary</strong>
</p>

<p align="center">
  <img src="lib.png" alt="Binary Code" width="400">
</p>

[<img src="https://img.shields.io/badge/ESLint-Passed-brightgreen" alt="ESLint">](https://www.npmjs.com/package/@sharshar/word-to-bin-lib)

[<img src="https://img.shields.io/badge/npm-v1.1.1-blue" alt="ESLint">](https://www.npmjs.com/package/@sharshar/word-to-bin-lib)

[<img src="https://img.shields.io/badge/license-ISC-blue" alt="ESLint">](https://www.npmjs.com/package/@sharshar/word-to-bin-lib)

[npm package link](https://www.npmjs.com/package/@sharshar/word-to-bin-lib)

## Table of Contents

- [About](#about)
- [Features](#features)
- [Getting Started](#getting-started)
  - [Installation](#installation)
  - [Usage](#usage)
- [Examples](#examples)
- [Contributing](#contributing)
- [License](#license)

## About

**bin-lib** is a minimalistic library that allows you to convert words and text into binary code. 

Whether you want to convert your name to binary or explore the world of ones and zeros, **bin-lib** has got you.

## Features

- Convert words and text to binary with ease.
- Handle mixed-case input and characters not in the mapping.
- Transform spaces, numbers, and special characters into their binary representations.
- Enjoy clean and minimalistic code for your binary adventures.

## Getting Started

### Installation

To get started with **bin-lib**, you'll need to install it in your project. You can do this using npm or yarn.

```bash
npm install bin-lib
# or
yarn add bin-lib
npm package: @sharunaraksha/sdk
Description: React SDK for natural language control of web apps via AI agents
Latest version: 0.1.1

# @modelnex/sdk

React SDK for natural language control of web apps. Register actions and context; an AI agent executes actions in response to user commands.

## Install

```bash
npm install @modelnex/sdk react zod
```

## Quick Start

```tsx
import { ModelNexProvider, ModelNexChatBubble } from "@modelnex/sdk";

function App() {
  const [items, setItems] = React.useState([]);

  return (
    <div>
      <ModelNexChatBubble placeholder="Add item, list all..." />
      <ul>{items.map(i => <li key={i.id}>{i.title}</li>)}</ul>
    </div>
  );
}

// Wrap your app (serverUrl defaults to http://localhost:3002)
export default () => (
  <ModelNexProvider>
    <App />
  </ModelNexProvider>
);
```

## Exports

| Export | Purpose |
|--------|---------|
| `ModelNexProvider` | Wraps app, connects to agent server |
| `useRunCommand` | Run commands programmatically (for custom UI) |
| `UIStateProvider` | Holds UI state synced to agent |
| `useUIState` | Read/update UI state |
| `useViewportTrack` | Track element visibility |
| `useVisibleIds` | Get visible element IDs |
| `useAgentViewport` | Register visible IDs with agent |
| `ModelNexChatBubble` | Optional chat bubble UI |

## Custom UI

Use `useRunCommand` instead of `ModelNexChatBubble` for your own command UI:

```tsx
const runCommand = useRunCommand();

<button onClick={() => runCommand("Add a new card")}>Run</button>
```


## Peer Dependencies

- `react` >= 17
- `zod` >= 3

## License

MIT
npm package: @sharyn/actions
Description: [Flux Standard Actions](https://github.com/redux-utilities/flux-standard-action) creator functions.
Latest version: 1.0.0

# 🌹 @sharyn/actions

[Flux Standard Actions](https://github.com/redux-utilities/flux-standard-action) creator functions.

### Installation

```sh
npm install --save @sharyn/actions
# or
yarn add @sharyn/actions
```

### Usage

```js
import { action, errorAction } from '@sharyn/actions'

action('hello', { name: 'Sven' }, 'nice') // { type: 'hello', payload: { name: 'Sven' }, meta: 'nice' }
errorAction('bye') // { error: true, type: 'bye' }
```

<hr />

<p align="center">
  This package is part of <a href="https://github.com/sharynjs/sharyn"><b>Sharyn</b></a>, a collection of utilities and helpers.
</p>
npm package: @sharyn/babel-preset
Description: [![npm](https://img.shields.io/npm/v/@sharyn/babel-preset.svg)](https://www.npmjs.com/package/@sharyn/babel-preset)
Latest version: 3.1.3

# 🌹 @sharyn/babel-preset

[![npm](https://img.shields.io/npm/v/@sharyn/babel-preset.svg)](https://www.npmjs.com/package/@sharyn/babel-preset)

You can use this package as a standalone, but I recommend following the [**development setup tutorial**](https://github.com/sharynjs/sharyn/blob/master/docs/1-development-setup.md) to also install ESLint, Flow, Jest, React, and their Babel-related plugins.

## 🌹 Install

Minimal install:

```bash
yarn add --dev @sharyn/babel-preset @babel/core
```

Add to your `package.json`:

```json
"babel": {
  "presets": [
    "@sharyn"
  ]
},
```

## 🌹 Auto-configured Modules

The following supported modules are automatically configured for Babel if they are detected in your `package.json`:

- [**@babel/plugin-proposal-do-expressions**](https://github.com/babel/babel/tree/master/packages/babel-plugin-proposal-do-expressions) – To use `do { }` expressions
- [**@babel/plugin-proposal-nullish-coalescing-operator**](https://github.com/babel/babel/tree/master/packages/babel-plugin-proposal-nullish-coalescing-operator) – To use `isUndef ?? 'default'`
- [**@babel/plugin-proposal-optional-chaining**](https://github.com/babel/babel/tree/master/packages/babel-plugin-proposal-optional-chaining) – To use `isUndef?.property`
- [**@babel/plugin-proposal-pipeline-operator**](https://github.com/babel/babel/tree/master/packages/babel-plugin-proposal-pipeline-operator) – To use `'hello' |> console.log`
- [**@babel/plugin-syntax-dynamic-import**](https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-dynamic-import) – Dynamic `import()`
- [**@babel/preset-env**](https://github.com/babel/babel/tree/master/packages/babel-preset-env) – The latest Babel preset
- [**@babel/preset-flow**](https://github.com/babel/babel/tree/master/packages/babel-preset-flow) – The Babel preset for Flow
- [**@babel/preset-react**](https://github.com/babel/babel/tree/master/packages/babel-preset-react) – The Babel preset for React
- [**babel-plugin-flow-react-proptypes**](https://github.com/brigand/babel-plugin-flow-react-proptypes) – Generate PropTypes from Flow annotations
- [**babel-plugin-module-resolver**](https://github.com/tleunen/babel-plugin-module-resolver) – To import `from 'foo'` instead of `'../../foo'`

See the [implementation](https://github.com/sharynjs/sharyn/blob/master/packages/babel-preset/index.js).

> **Note**: Flow [does not support](https://github.com/facebook/flow/issues/5443) the pipeline operator yet.
npm package: @sharyn/browser
Description: Helpers for code that runs in the browser.
Latest version: 1.1.11

<!-- This file is auto-generated, don't modify it. Modify docs.js instead. -->

# 🌹 @sharyn/browser

Helpers for code that runs in the browser.

## Installation

```sh
npm i @sharyn/browser
# or
yarn add @sharyn/browser
```

You can alternatively install the entire [**sharyn**](https://github.com/sharynjs/sharyn#getting-started) library or individual modules.

## Modules

- [**clearCaches**](https://github.com/sharynjs/sharyn/tree/master/packages/browser.clearcaches/README.md#readme) – Clears all the service worker caches
- [**getFormData**](https://github.com/sharynjs/sharyn/tree/master/packages/browser.getformdata/README.md#readme) – Gives you the form data as a plain object

<hr />

<p align="center">
  This package is part of <a href="https://github.com/sharynjs/sharyn"><b>Sharyn</b></a>, a collection of utilities and helpers.
</p>
npm package: @sharyn/browser.clearcaches
Description: Clears all the caches used by service workers, and optionally reloads the page.
Latest version: 1.0.10

<!-- This file is auto-generated, don't modify it. Modify the JSDoc instead. -->

# 🌹 clearCaches

**`clearCaches`**: Clears all the [`caches`](https://developer.mozilla.org/en-US/docs/Web/API/Cache) used by service workers.

## Installation

```sh
npm i @sharyn/browser.clearcaches
# or
yarn add @sharyn/browser.clearcaches
```

You can alternatively install the [**@sharyn/browser**](https://github.com/sharynjs/sharyn/blob/master/packages/browser/README.md#readme) package, or the entire [**sharyn**](https://github.com/sharynjs/sharyn#getting-started) library.

## Arguments

**\[reload=false\] (boolean)**: Reloads the page after emptying the caches.

**\[hardReload=true\] (boolean)**: If `reload` is `true`, do a <a href="https://developer.mozilla.org/en-US/docs/Web/API/Location/reload" target="_blank">forced reload</a>.

## Returns

**Promise**

## Example

```jsx
const UpdateBanner = () => (
  <div>
    A new version of the app is available!
    <a onClick={() => clearCaches(true)}>Click here to update</a>
  </div>
)
```

## Imports

Depending on the package you are using, you can `import` or `require` `clearCaches` in the following ways:

```js
// If you installed @sharyn/browser.clearcaches
import clearCaches from '@sharyn/browser.clearcaches' // smaller size, better for client bundles

// If you installed @sharyn/browser
import clearCaches from '@sharyn/browser/clearCaches' // smaller size, better for client bundles
import { clearCaches } from '@sharyn/browser' // more convenient in Node environments

// If you installed sharyn
import clearCaches from 'sharyn/browser/clearCaches' // smaller size, better for client bundles
import { clearCaches } from 'sharyn/browser' // more convenient in Node environments
```

<hr />

<p align="center">
  This package is part of <a href="https://github.com/sharynjs/sharyn"><b>Sharyn</b></a>, a collection of utilities and helpers.
</p>
npm package: @sharyn/browser.getformdata
Description: Gives you the fields and values of a form element. getFormData uses FormData and returns a plain object.
Latest version: 1.0.4

<!-- This file is auto-generated, don't modify it. Modify the JSDoc instead. -->

# 🌹 getFormData

**`getFormData`**: Gives you the fields and data of a `form` element. `getFormData` uses `FormData` and returns a plain object.

## Installation

```sh
npm i @sharyn/browser.getformdata
# or
yarn add @sharyn/browser.getformdata
```

You can alternatively install the [**@sharyn/browser**](https://github.com/sharynjs/sharyn/blob/master/packages/browser/README.md#readme) package, or the entire [**sharyn**](https://github.com/sharynjs/sharyn#getting-started) library.

## Arguments

**formElement (HTMLFormElement)**: The HTML `form` element.

**\[onlyTruthy=false\] (boolean)**: Falsy fields (like `''`) are omitted if `true`.

## Returns

**object**: The plain object of the form data.

## Example

```jsx
const Form = () => {
  const form = useRef(null)
  return (
    <>
      <form ref={form}>
        <input name="firstname" />
        <input name="lastname" />
      </form>
      <button onClick={() => console.log(getFormData(form.current))}>
        Log all form values
      </button>
      <button onClick={() => console.log(getFormData(form.current, true))}>
        Log truthy form values
      </button>
    </>
  )
}
```

If `firstname` is `Stan` and `lastname` is left empty:

```js
getFormData(form.current)       // { firstname: 'Stan', lastname: '' }
getFormData(form.current, true) // { firstname: 'Stan' }
```

## Imports

Depending on the package you are using, you can `import` or `require` `getFormData` in the following ways:

```js
// If you installed @sharyn/browser.getformdata
import getFormData from '@sharyn/browser.getformdata' // smaller size, better for client bundles

// If you installed @sharyn/browser
import getFormData from '@sharyn/browser/getFormData' // smaller size, better for client bundles
import { getFormData } from '@sharyn/browser' // more convenient in Node environments

// If you installed sharyn
import getFormData from 'sharyn/browser/getFormData' // smaller size, better for client bundles
import { getFormData } from 'sharyn/browser' // more convenient in Node environments
```

<hr />

<p align="center">
  This package is part of <a href="https://github.com/sharynjs/sharyn"><b>Sharyn</b></a>, a collection of utilities and helpers.
</p>
npm package: @sharyn/browser.getformfields
Description: Gives you the fields of a form element. getFormFields uses FormData and returns a plain object.
Latest version: 1.0.8

<!-- This file is auto-generated, don't modify it. Modify the JSDoc instead. -->

# 🌹 getFormFields

**`getFormFields`**: Gives you the fields of a `form` element. `getFormFields` uses `FormData` and returns a plain object.

## Installation

```sh
npm i @sharyn/browser.getformfields
# or
yarn add @sharyn/browser.getformfields
```

You can alternatively install the [**`@sharyn/browser`**](https://github.com/sharynjs/sharyn/blob/master/packages/browser/README.md#readme) package, or the entire [**`sharyn`**](https://github.com/sharynjs/sharyn/blob/master/packages/_sharyn/README.md#readme) library.

## Arguments

**formElement (HTMLFormElement)**: The HTML `form` element.

**\[onlyTruthy=false\] (boolean)**: Falsy fields (like `''`) are omitted if `true`.

## Returns

**object**: The plain object of the form data.

## Example

```jsx
const Form = () => {
  const form = useRef(null)
  return (
    <>
      <form ref={form}>
        <input name="firstname" />
        <input name="lastname" />
      </form>
      <button onClick={() => console.log(getFormFields(form.current))}>
        Log all form values
      </button>
      <button onClick={() => console.log(getFormFields(form.current, true))}>
        Log truthy form values
      </button>
    </>
  )
}
```

If `firstname` is `Stan` and `lastname` is left empty:

```js
getFormFields(form.current)       // { firstname: 'Stan', lastname: '' }
getFormFields(form.current, true) // { firstname: 'Stan' }
```

## Imports

Depending on the package you are using, you can `import` or `require` `getFormFields` in the following ways:

```js
import getFormFields from '@sharyn/browser.getformfields'
import getFormFields from '@sharyn/browser/getFormFields'
import getFormFields from 'sharyn/browser/getFormFields'

import { getFormFields } from '@sharyn/browser'
import { getFormFields } from 'sharyn/browser'
import { getFormFields } from 'sharyn'
```

<hr />

<p align="center">
  This package is part of <a href="https://github.com/sharynjs/sharyn"><b>Sharyn</b></a>, a collection of utilities and helpers.
</p>
npm package: @sharyn/chakra-next
Description: Combine a Next `Link` with a Chakra UI `Link`, `Button`, or `MenuItem`:
Latest version: 1.1.0

# @sharyn/chakra-next

Combine a Next `Link` with a Chakra UI `Link`, `Button`, or `MenuItem`:

```jsx
import { Link, LinkButton, LinkMenuItem } from '@sharyn/chakra-next'

const App = () => <LinkButton href="/hello">Hello</Link>
```
npm package: @sharyn/check-setup
Description: [![npm](https://img.shields.io/npm/v/@sharyn/check-setup.svg)](https://www.npmjs.com/package/@sharyn/check-setup)
Latest version: 2.0.9

# 🌹 @sharyn/check-setup

[![npm](https://img.shields.io/npm/v/@sharyn/check-setup.svg)](https://www.npmjs.com/package/@sharyn/check-setup)

It is used internally by Sharyn to determine which features to load.

## 🌹 Install

```bash
yarn add @sharyn/check-setup
```

## 🌹 Usage

```js
import { hasPackage, hasFile } from '@sharyn/check-setup'

hasPackage('koa') // true or false based on your package.json
hasPackage('koa', true) // true or Error

hasFile('webpack.config.js') // true or false from the root of your project
hasFile('webpack.config.js', true) // true or Error
```
npm package: @sharyn/client
Description: [![npm](https://img.shields.io/npm/v/@sharyn/client.svg)](https://www.npmjs.com/package/@sharyn/client)
Latest version: 4.0.1

# 🌹 @sharyn/client

[![npm](https://img.shields.io/npm/v/@sharyn/client.svg)](https://www.npmjs.com/package/@sharyn/client)

This package provides client-side helpers.

## 🌹 Install

```bash
yarn add @sharyn/client
```

## 🌹 Usage

### getFormData

```js
import { getFormData } from '@sharyn/client/form'

const handleSubmit = e => {
  console.log(getFormData(e.target))
}

const Form = () => (
  <form onSubmit={handleSubmit}>
    <input name="foo" />
    <input type="submit" />
  </form>
)

/*
onSubmit:
  { foo: [value] }
*/

```
npm package: @sharyn/commands
Description: Some command strings that I use. You probably won't need this package.
Latest version: 1.2.0

# 🌹 @sharyn/commands

Some command strings, to use alongside with [**@sharyn/scripts**](https://github.com/sharynjs/sharyn/blob/master/packages/scripts/README.md#readme). These are very specific to my personal use, so they will probably not be very useful to you.

### Installation

```sh
npm install --save-dev @sharyn/commands
# or
yarn add --dev @sharyn/commands
```

Check the [**code directly**](https://github.com/sharynjs/sharyn/blob/master/packages/commands/index.js) to see which commands are available.

<hr />

<p align="center">
  This package is part of <a href="https://github.com/sharynjs/sharyn"><b>Sharyn</b></a>, a collection of utilities and helpers.
</p>
npm package: @sharyn/components
Description: [![npm](https://img.shields.io/npm/v/@sharyn/components.svg)](https://www.npmjs.com/package/@sharyn/components)
Latest version: 4.4.0

# 🌹 @sharyn/components

[![npm](https://img.shields.io/npm/v/@sharyn/components.svg)](https://www.npmjs.com/package/@sharyn/components)

This package provides components built with Material UI.

## 🌹 Install

```bash
yarn add @sharyn/components
```

## 🌹 Usage

### Page

```js
// @flow

import React from 'react'
import Page from '@sharyn/components/Page'

const MyCmp = () => <Page>Hello</Page>
// or
const MyCmp = () => <Page middle>Hello</Page>
// options
const MyCmp = () => <Page maxWidth={700} noPadding noPaper containerClass="" paperClass="">Hello</Page>


export default MyCmp
```

### DrawerItem

```js
// @flow

import React from 'react'
import HomeIcon from '@material-ui/icons/Home'
import Page from '@sharyn/components/DrawerItem'

const MyCmp = () => (
  <DrawerItem label="Hello" icon={HomeIcon} />
  <DrawerItem label="Hello without icon" />
)

export default MyCmp
```
npm package: @sharyn/css
Description: [![npm](https://img.shields.io/npm/v/@sharyn/css.svg)](https://www.npmjs.com/package/@sharyn/css)
Latest version: 1.3.2

# 🌹 @sharyn/css

[![npm](https://img.shields.io/npm/v/@sharyn/css.svg)](https://www.npmjs.com/package/@sharyn/css)

## 🌹 Install

```bash
yarn add --dev @sharyn/css
```
npm package: @sharyn/db
Description: [![npm](https://img.shields.io/npm/v/@sharyn/db.svg)](https://www.npmjs.com/package/@sharyn/db)
Latest version: 3.0.2

# 🌹 @sharyn/db

[![npm](https://img.shields.io/npm/v/@sharyn/db.svg)](https://www.npmjs.com/package/@sharyn/db)

This package provides database utilities and configs.

## 🌹 Install

```bash
yarn add @sharyn/db
```

## 🌹 Usage

### knex-config.js

A `knex-config.js` _knexfile_ is provided and is used automatically unless you have your own located at `src/_db/knex-config.js`

### `knex`

```js
import { knex } from '@sharyn/db'

export const findNoteById = (userId, id) =>
  knex('Note')
    .where({ id, userId })
    .first()
```

### `createQuery`

`createQuery` is higher-level than `knex`, the created query already contains the table name, and can pass a `userId` as a `.where({ userId })` clause.

```js
import { createQuery } from '@sharyn/db'

const query = createQuery('Note')

export const createNote = input => query().insert(input)

export const findNoteById = (userId, id) =>
  query(userId)
    .where({ id })
    .first()
```

### `createQuery` with a transaction

You can pass a transaction to `createQuery` as the second parameter:

```js
import { createQuery, knex } from '@sharyn/db'

const tableAQuery = createQuery('tableA')
const tableBQuery = createQuery('tableB')

export const somethingWithATransaction = userId =>
  knex.transaction(async trx => {
    await tableAQuery(userId, trx).something()
    await tableBQuery(null, trx).something()
  })
```
npm package: @sharyn/env
Description: # Deprecated
Latest version: 3.5.4

# 🌹 @sharyn/env

# Deprecated

Use [envalid](https://www.npmjs.com/package/envalid) instead. Example:

```js
const envalid = require('envalid')
const pick = require('lodash.pick')
const either = require('@sharyn/util.either')
const swit = require('@sharyn/util.swit')

const { email, bool, port, str } = envalid

const varDefs = {
  STAGE: str({ choices: ['dev', 'local-prod', 'staging', 'prod'] }),
  TRUE: bool(),
  EMAIL: email({ desc: 'The email of the admin' }),
  PORT: port(),
}

const env = envalid.cleanEnv(
  process.env,
  {
    STAGE: varDefs.STAGE,
    ...swit(
      process.env.STAGE,
      ['dev', 'local-prod', pick(varDefs, 'TRUE', 'PORT')],
      ['staging', 'prod', pick(varDefs, 'EMAIL', 'PORT')]
    ),
  },
  { strict: true }
)

module.exports = env
```

## Usage

```bash
npm install --save-dev @sharyn/env
# or
yarn add --dev @sharyn/env
```

## @sharyn/env

With `@sharyn/env`, you can import your environment variables directly:

```js
import { NODE_ENV, PORT, DATABASE_URL } from '@sharyn/env'
```

This package simply runs `dotenv/config` and exports `process.env` for a convenient access.

Just use `@sharyn/env` in every file that needs access to the environment, and forget about `dotenv` and `process.env` completely.

## @sharyn/env.check

[@sharyn/env.check](https://github.com/sharynjs/sharyn/tree/master/packages/env.check) can also help you validate environment variables.

<hr />

<p align="center">
  This package is part of <a href="https://github.com/sharynjs/sharyn"><b>Sharyn</b></a>, a collection of utilities and helpers.
</p>
npm package: @sharyn/env.check
Description: Helpers to check the validity of your environment variables.
Latest version: 1.0.2

# 🌹 @sharyn/env.check

# Deprecated

Use [envalid](https://www.npmjs.com/package/envalid) instead. Example:

```js
const envalid = require('envalid')
const pick = require('lodash.pick')
const either = require('@sharyn/util.either')
const swit = require('@sharyn/util.swit')

const { email, bool, port, str } = envalid

const varDefs = {
  STAGE: str({ choices: ['dev', 'local-prod', 'staging', 'prod'] }),
  TRUE: bool(),
  EMAIL: email({ desc: 'The email of the admin' }),
  PORT: port(),
}

const env = envalid.cleanEnv(
  process.env,
  {
    STAGE: varDefs.STAGE,
    ...swit(
      process.env.STAGE,
      ['dev', 'local-prod', pick(varDefs, 'TRUE', 'PORT')],
      ['staging', 'prod', pick(varDefs, 'EMAIL', 'PORT')]
    ),
  },
  { strict: true }
)

module.exports = env
```

**`@sharyn/env/check`** provides 3 methods to check that your `process.env` is loaded with the right variables.

## Installation

```sh
npm i @sharyn/env.check
# or
yarn add @sharyn/env.check
```

You can alternatively install the [**`@sharyn/browser`**](https://github.com/sharynjs/sharyn/tree/master/browser) package, or the entire [**`sharyn`**](https://github.com/sharynjs/sharyn) library.

## Usage

In the following example, the `STAGE` corresponds to the various deployment stages, which I like to name `dev`, `local-prod` (with `NODE_ENV` set to `production`), `staging`, and `prod`.

Create a file to check your env, `env-check.js` for instance:

```js
import 'dotenv/config'
import { check, checkPresent, checkAbsent } from '@sharyn/env/check'

checkPresent('DATABASE_URL', 'REDIS_URL') // Checked for all stages

if (process.env.STAGE === 'dev') {
  checkPresent('WEBPACK_DEV_SERVER_PORT')
  checkAbsent('S3_BUCKET', 'ERROR_REPORTING')
}

if (process.env.STAGE === 'prod') {
  checkPresent('S3_BUCKET', 'ERROR_REPORTING')
  checkAbsent('WEBPACK_DEV_SERVER_PORT')
  check('API_URL', url => url.startsWith('https://'), name => `${name} is not an HTTPS URL.`)
}
```

You should check your environment variables at runtime, at the very beginning or your application. Before the initialization of your Express server for instance.

```js
import './env-check'
```

## Imports

Depending on the package you are using, you can `import` or `require` `getFormFields` in the following ways:

```js
import { check, checkPresent, checkAbsent } from '@sharyn/env.check'
import { check, checkPresent, checkAbsent } from '@sharyn/env/check'
import { check, checkPresent, checkAbsent } from 'sharyn/env/check'
```

<hr />

<p align="center">
  This package is part of <a href="https://github.com/sharynjs/sharyn"><b>Sharyn</b></a>, a collection of utilities and helpers.
</p>
npm package: @sharyn/hocs
Description: [![npm](https://img.shields.io/npm/v/@sharyn/hocs.svg)](https://www.npmjs.com/package/@sharyn/hocs)
Latest version: 4.5.0

# 🌹 @sharyn/hocs

[![npm](https://img.shields.io/npm/v/@sharyn/hocs.svg)](https://www.npmjs.com/package/@sharyn/hocs)

This package provides React High-Order Components.

## 🌹 Install

```bash
yarn add @sharyn/hocs
```

## 🌹 Usage

### hideOnScroll

```js
import React from 'react'

import AppBar from '@material-ui/core/AppBar'
import ToolBar from '@material-ui/core/ToolBar'
import Typography from '@material-ui/core/Typography'
import hideOnScroll from '@sharyn/hocs/hide-on-scroll'

const AutoHideAppBar = hideOnScroll(AppBar)

const App = () => (
  <AutoHideAppBar className="hide-on-scroll">
    <ToolBar>
      <Typography variant="h6" color="inherit">
        Hello
      </Typography>
    </ToolBar>
  </AutoHideAppBar>
)
```
npm package: @sharyn/hooks
Description: ## useStateObject
Latest version: 1.1.1

# 🌹 @sharyn/hooks

## useStateObject

```jsx
import { useStateObject } from '@sharyn/hooks'
// or import useStateObject from '@sharyn/hooks/useStateObject'

const Cmp = () => {
  const { set: setField, get: getField, getAll: getFields } = useStateObject()

  return (
    <>
      <input
        name="firstname"
        onChange={e => setField('firstname', e.target.value)}
        value={getField('firstname') || ''}
      />
      <input
        name="lastname"
        onChange={e => setField('lastname', e.target.value)}
        value={getField('lastname') || ''}
      />
      <button onClick={() => console.log(getFields())}></button>
    </>
  )
}
```

### API

**`useStateObject(initialStateObject)`**: Pass an initial object to the hook, defaults to `{}`.

**`getAll()`**: Returns the entire state object

**`get(key)`**: Returns the value for the key

**`set(key, value)`**: Sets the value for the key

**`setAll(obj)`**: Replace the entire state object

**`del(key)`**: Deletes the value for the key

**`clear()`**: Resets the state object to `{}`

**`merge(obj)`**: Merge the state object deeply with an other object using Lodash's [merge](https://www.npmjs.com/package/lodash.merge).

**`assign(obj)`**: Merge the state object shallowly with an other object using `Object.assign()`.

<p align="center">
  This package is part of <a href="https://github.com/sharynjs/sharyn"><b>Sharyn</b></a>, a collection of utilities and helpers.
</p>
npm package: @sharyn/jest-config
Description: [![npm](https://img.shields.io/npm/v/@sharyn/jest-config.svg)](https://www.npmjs.com/package/@sharyn/jest-config)
Latest version: 1.0.4

# 🌹 @sharyn/jest-config

[![npm](https://img.shields.io/npm/v/@sharyn/jest-config.svg)](https://www.npmjs.com/package/@sharyn/jest-config)

## 🌹 Install

```bash
yarn add --dev @sharyn/jest-config
```

## 🌹 Usage

Create a `jest.config.js` file at the root of your project containing:

```js
module.exports = require('@sharyn/jest-config')
```
npm package: @sharyn/koa
Description: [![npm](https://img.shields.io/npm/v/@sharyn/koa.svg)](https://www.npmjs.com/package/@sharyn/koa)
Latest version: 2.2.6

# 🌹 @sharyn/koa

[![npm](https://img.shields.io/npm/v/@sharyn/koa.svg)](https://www.npmjs.com/package/@sharyn/koa)

This package provides a Koa server.

## 🌹 Install

Minimal:

```bash
yarn add @sharyn/koa koa koa-router
```

Full-featured:

```bash
yarn add @sharyn/koa koa koa-router koa-mount koa-static koa-favicon koa-compress
```

## 🌹 Usage

### `startServer, stopServer`

```js
import { startServer, stopServer } from '@sharyn/koa'

const routing = router => {
  router.get('*', ctx => {
    ctx.body = `<!doctype html>
    <html>
      <body>
        Hello world!
      </body>
    </html>`
  })
}

startServer(routing) // Starts server on port PORT of your env, defaulting to 8000


// Mute the output with the silent option or change the port in your tests:
setup = () => startServer(routing, { port: 6000, silent: true })
teardown = () => stopServer({ port: 6000, silent: true })
```
npm package: @sharyn/material-ui
Description: [![npm](https://img.shields.io/npm/v/@sharyn/material-ui.svg)](https://www.npmjs.com/package/@sharyn/material-ui)
Latest version: 2.0.2

# 🌹 @sharyn/material-ui

[![npm](https://img.shields.io/npm/v/@sharyn/material-ui.svg)](https://www.npmjs.com/package/@sharyn/material-ui)

This package provides Material UI components.

## 🌹 Install

```bash
yarn add @sharyn/material-ui
```
npm package: @sharyn/nanoid
Description: A [Nano ID](https://github.com/ai/nanoid) default configuration with no lookalikes (`0`, `O`, `1`, `l`, `I`), and without `-` and `_`.
Latest version: 1.0.1

# 🌹 @sharyn/nanoid

A [Nano ID](https://github.com/ai/nanoid) default configuration with no lookalikes (`0`, `O`, `1`, `l`, `I`), and without `-` and `_`.

To have a risk of collision similar to UUID v4 (149 billion years at 1000 IDs per hour for 1% collision risk on [Nano ID Collision Calculator](https://zelark.github.io/nano-id-cc/)), use a length of `22` (334 billion years), or `21` (44 billion years). The default length used here is `20` (6 billion years), for the only reason that it's a nicer round number, while remaining extremely collision-safe. The age of Earth being 4.5 billion years, I think we're good here.

### Installation

```sh
npm install --save @sharyn/nanoid
# or
yarn add @sharyn/nanoid
```

### Usage

```js
import id from '@sharyn/nanoid'

id() // '4wEkBX8dJmMrzoXFBgQD'
id(10) // 'uCZij3SEne'
```

<hr />

<p align="center">
  This package is part of <a href="https://github.com/sharynjs/sharyn"><b>Sharyn</b></a>, a collection of utilities and helpers.
</p>
npm package: @sharyn/next-auth
Description: ```jsx import { useUser } from '@sharyn/next-auth'
Latest version: 0.1.0

# @sharyn/next-auth

```jsx
import { useUser } from '@sharyn/next-auth'

const App = () => {
  const { user, isUserLoading, session } = useUser()

  if (!user) return null

  return {user.name}
}
```
npm package: @sharyn/prettier
Description: ## Installation
Latest version: 1.2.3

# 🌹 @sharyn/prettier

## Installation

```sh
npm i --save-dev @sharyn/prettier
# or
yarn add --dev @sharyn/prettier
```

## Usage

In `package.json`, use:

```json
{
  "prettier": "@sharyn/prettier"
}
```

## Rules

```js
  printWidth: 100
  semi: false
  singleQuote: true
  trailingComma: 'es5'
```

<hr />

<p align="center">
  This package is part of <a href="https://github.com/sharynjs/sharyn"><b>Sharyn</b></a>, a collection of utilities and helpers.
</p>
npm package: @sharyn/prettier-config
Description: [![npm](https://img.shields.io/npm/v/@sharyn/prettier-config.svg)](https://www.npmjs.com/package/@sharyn/prettier-config)
Latest version: 1.2.5

# 🌹 @sharyn/prettier-config

[![npm](https://img.shields.io/npm/v/@sharyn/prettier-config.svg)](https://www.npmjs.com/package/@sharyn/prettier-config)

## 🌹 Install

```bash
yarn add --dev @sharyn/prettier-config
```

## 🌹 Usage

Create a `.prettierrc.js` file at the root of your project containing:

```js
module.exports = require('@sharyn/prettier-config')
```
npm package: @sharyn/react-hooks
Description: <!-- This file is auto-generated, don't modify it. Modify docs.js instead. -->
Latest version: 2.1.1

<!-- This file is auto-generated, don't modify it. Modify docs.js instead. -->

# 🌹 @sharyn/react-hooks

React Hooks.

## Installation

```sh
npm i @sharyn/react-hooks
# or
yarn add @sharyn/react-hooks
```

You can alternatively install the entire [**sharyn**](https://github.com/sharynjs/sharyn#getting-started) library or individual modules.

## Modules

- [**useStateObject**](https://github.com/sharynjs/sharyn/tree/master/packages/react-hooks.usestateobject/README.md#readme) – A hook to manage a state that is an object

<hr />

<p align="center">
  This package is part of <a href="https://github.com/sharynjs/sharyn"><b>Sharyn</b></a>, a collection of utilities and helpers.
</p>
npm package: @sharyn/react-hooks.usestateobject
Description: Provides a React Hook interface to manipulate a state object.
Latest version: 2.1.1

# 🌹 @sharyn/react-hooks.usestateobject

```jsx
import { useStateObject } from '@sharyn/react-hooks'
// or import useStateObject from '@sharyn/react-hooks/useStateObject'
// or import useStateObject from '@sharyn/react-hooks.usestateobject'

const Cmp = () => {
  const [fields, { set: setField }] = useStateObject()

  return (
    <>
      <input
        name="firstname"
        onChange={e => setField('firstname', e.target.value)}
        value={fields.firstname || ''}
      />
      <input
        name="lastname"
        onChange={e => setField('lastname', e.target.value)}
        value={fields.lastname || ''}
      />
      <button onClick={() => console.log(fields)}>Print</button>
    </>
  )
}
```

### API

**`useStateObject(initialStateObject)`**: Pass an initial object to the hook, defaults to `{}`. You can pass `null` to it.

Returns:

**[stateObject, { set, setAll, del, clear, assign, merge }]**

**`set(key, value)`**: Sets the value for the key

**`setAll(obj)`**: Replace the entire state object

**`del(key)`**: Deletes the value for the key

**`clear()`**: Resets the state object to `{}`

**`merge(obj)`**: Merge the state object deeply with an other object using Lodash's [merge](https://www.npmjs.com/package/lodash.merge).

**`assign(obj)`**: Merge the state object shallowly with an other object using `Object.assign()`.

### ⚠️ Warning ⚠️

Unfortunately you cannot call multiple modifier functions in a row. This won't work:

```js
onClick={() => {
  set('a', 1)
  set('b', 2)
}}
```

This is due to the asynchronous nature of React's `useState` (calling `setState` multiple times in a row also doesn't work, but in the context of an object it's more confusing). There may be better implementations, but for now, combine all your modifications into one using `merge`, `assign`, or `setAll`:

```js
onClick={() => {
  merge({ a: 1, b: 2 })
}}
```

<hr />

<p align="center">
  This package is part of <a href="https://github.com/sharynjs/sharyn"><b>Sharyn</b></a>, a collection of utilities and helpers.
</p>
npm package: @sharyn/react-router
Description: <!-- This file is auto-generated, don't modify it. Modify docs.js instead. -->
Latest version: 1.1.11

<!-- This file is auto-generated, don't modify it. Modify docs.js instead. -->

# 🌹 @sharyn/react-router

Components for React Router.

## Installation

```sh
npm i @sharyn/react-router
# or
yarn add @sharyn/react-router
```

You can alternatively install the entire [**sharyn**](https://github.com/sharynjs/sharyn#getting-started) library or individual modules.

## Modules

- [**PrivateRoute**](https://github.com/sharynjs/sharyn/tree/master/packages/react-router.privateroute/README.md#readme) – A `Route` that redirects unauthenticated users
- [**ServerOnlyRoute**](https://github.com/sharynjs/sharyn/tree/master/packages/react-router.serveronlyroute/README.md#readme) – A `Route` that refreshes the page on the client

<hr />

<p align="center">
  This package is part of <a href="https://github.com/sharynjs/sharyn"><b>Sharyn</b></a>, a collection of utilities and helpers.
</p>
npm package: @sharyn/redis
Description: [![npm](https://img.shields.io/npm/v/@sharyn/redis.svg)](https://www.npmjs.com/package/@sharyn/redis)
Latest version: 2.0.9

# 🌹 @sharyn/redis

[![npm](https://img.shields.io/npm/v/@sharyn/redis.svg)](https://www.npmjs.com/package/@sharyn/redis)

This package provides a convenient access to your Redis instance.

## 🌹 Install

```bash
yarn add @sharyn/redis
```

## 🌹 Usage

```js
import redis from '@sharyn/redis'

const main = async () => {
  await redis.setAsync('some-key', 'hi')
  await redis.getAsync('some-key') // hi
  await redis.delAsync('some-key')
}
```
npm package: @sharyn/redux
Description: [![npm](https://img.shields.io/npm/v/@sharyn/redux.svg)](https://www.npmjs.com/package/@sharyn/redux)
Latest version: 4.9.0

# 🌹 @sharyn/redux

[![npm](https://img.shields.io/npm/v/@sharyn/redux.svg)](https://www.npmjs.com/package/@sharyn/redux)

## 🌹 Install

```bash
yarn add --dev @sharyn/redux
```
npm package: @sharyn/scripts
Description: **Declaring your scripts in a JavaScript file** gives you much more features than using plain text in `package.json`. For more details and for the documentation, please read my [**article about scripts.js**](https://verekia.com/javascript/scripts.js/).
Latest version: 1.7.0

# 🌹 @sharyn/scripts

**Declaring your scripts in a JavaScript file** gives you much more features than using plain text in `package.json`. For more details and for the documentation, please read my [**article about scripts.js**](https://verekia.com/javascript/scripts.js/).

### Installation

```sh
npm install --save-dev @sharyn/scripts
# or
yarn add --dev @sharyn/scripts
```

<hr />

<p align="center">
  This package is part of <a href="https://github.com/sharynjs/sharyn"><b>Sharyn</b></a>, a collection of utilities and helpers.
</p>
npm package: @sharyn/server
Description: [![npm](https://img.shields.io/npm/v/@sharyn/server.svg)](https://www.npmjs.com/package/@sharyn/server)
Latest version: 6.1.8

# 🌹 @sharyn/server

[![npm](https://img.shields.io/npm/v/@sharyn/server.svg)](https://www.npmjs.com/package/@sharyn/server)

This package provides server-side helpers.

## 🌹 Install

```bash
yarn add @sharyn/server
```

## 🌹 Usage

### htmlBase

```js
import { htmlBase } from '@sharyn/server'

const windowVarPairs = [
  ['__A__', { a: "<script>alert('xss')</script>" }],
  ['__B__', 'plop'],
  ['__C__', true],
  ['__D__', 666],
]

console.log(htmlBase(windowVarPairs))

/*
<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <div id="app"></div>
    <script>window.__A__ = {"a":"\\u003Cscript\\u003Ealert('xss')\\u003C\\u002Fscript\\u003E"}</script>
    <script>window.__B__ = "plop"</script>
    <script>window.__C__ = true</script>
    <script>window.__D__ = 666</script>
    <script src="/static/js/bundle.js"></script>
</html>
*/
```

#### Options

The second argument is a custom app-root ID.
npm package: @sharyn/shared
Description: [![npm](https://img.shields.io/npm/v/@sharyn/shared.svg)](https://www.npmjs.com/package/@sharyn/shared)
Latest version: 4.5.2

# 🌹 @sharyn/shared

[![npm](https://img.shields.io/npm/v/@sharyn/shared.svg)](https://www.npmjs.com/package/@sharyn/shared)

This package provides _isomorphic_ / _universal_ utilities than can be used on both the client and the server.

## 🌹 Install

```bash
yarn add @sharyn/shared
```

## 🌹 Usage

### Switch

```js
import Switch from '@sharyn/shared/Switch'
import FooPage from 'foo/cmp-page/foo-page'
import FooIcon from '@material-ui/icons/Foo'

export const fooRoute: Object = {
  path: '/foo',
  exact: true,
  loggedInOnly: true,
  title: 'Foo',
  Icon: FooIcon,
  inNav: true,
}

const routesAndCmps = [
  { route: fooRoute, component: FooPage }
  { route: barRoute, component: BarPage }
]

const App = () => (
  <Switch routesAndCmps={routesAndCmps} />
)
```

### fetchGraphql (don't use it)

```js
// ...

const query = "query ($id: ID!) { getThing(id: $id) { id } }"
const variables = { id: 123 }

const resp = await fetchGraphql({ query, variables })

/*
  {
    data: {
      getThing: { id: 123 }
    },
    errors: [...]
  }
*/
```

#### Options

`fetchGraphql(options, fetchOptions)`

- **options** is an object than can contain:
  - **query** (_required_): The GraphQL query.
  - **variables**: The object of your variables.
  - **host**: The host (`https://www.example.com:12345`). Leave this field empty for client-side fetches.
  - **path**: The GraphQL path (default is `/graphql`)
  - **cookie**: A cookie string (useful for server-side fetches).

- **fetchOptions** is the native options of `fetch` in case you need to override the defaults provided by `fetchGraphql`.
npm package: @sharyn/tags
Description: <!-- This file is auto-generated, don't modify it. Modify docs.js instead. -->
Latest version: 1.0.1

<!-- This file is auto-generated, don't modify it. Modify docs.js instead. -->

# 🌹 @sharyn/tags

No-op ES6 template string tags to enable syntax highlighting in editors.

## Installation

```sh
npm i @sharyn/tags
# or
yarn add @sharyn/tags
```

You can alternatively install the entire [**sharyn**](https://github.com/sharynjs/sharyn#getting-started) library or individual modules.

## Modules

- [**html**](https://github.com/sharynjs/sharyn/tree/master/packages/tags.html/README.md#readme) – A template string tag for HTML syntax highlighting

<hr />

<p align="center">
  This package is part of <a href="https://github.com/sharynjs/sharyn"><b>Sharyn</b></a>, a collection of utilities and helpers.
</p>
npm package: @sharyn/tags.css
Description: **`css`** is a template string tag that does **nothing**. It's a normal template string, but your code editor or its plugins ([es6-string-css](https://marketplace.visualstudio.com/items?itemName=bashmish.es6-string-css) for VSCode) might support syntax hi
Latest version: 1.0.0

## 🌹 css

**`css`** is a template string tag that does **nothing**. It's a normal template string, but your code editor or its plugins ([es6-string-css](https://marketplace.visualstudio.com/items?itemName=bashmish.es6-string-css) for VSCode) might support syntax highlighting for HTML when they are marked with a `css` tag.

**`css`** is part of [`@sharyn/util`](https://github.com/sharynjs/sharyn-util/blob/master/README.md)
npm package: @sharyn/tags.html
Description: **`html`** is a template string tag that does **nothing**. It's a normal template string, but your code editor or its plugins ([lit-html](https://marketplace.visualstudio.com/items?itemName=bierner.lit-html) or [es6-string-html](https://marketplace.visual
Latest version: 1.0.0

## 🌹 html

**`html`** is a template string tag that does **nothing**. It's a normal template string, but your code editor or its plugins ([lit-html](https://marketplace.visualstudio.com/items?itemName=bierner.lit-html) or [es6-string-html](https://marketplace.visualstudio.com/items?itemName=hjb2012.vscode-es6-string-html) for VSCode) might support syntax highlighting for HTML when they are marked with an `html` tag.

```js
const createHtml = ({ title }: { title: string }) =>
  html`
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <title>${title}</title>
      </head>
      <body>
        <h1>${title}</h1>
      </body>
    </html>
  ` // This HTML code has syntax highlighting
```
npm package: @sharyn/testing
Description: [![npm](https://img.shields.io/npm/v/@sharyn/testing.svg)](https://www.npmjs.com/package/@sharyn/testing)
Latest version: 2.0.4

# 🌹 @sharyn/testing

[![npm](https://img.shields.io/npm/v/@sharyn/testing.svg)](https://www.npmjs.com/package/@sharyn/testing)

This package provides testing helpers.

## 🌹 Install

```bash
yarn add --dev @sharyn/testing
```

## 🌹 Usage

### sel

A short helper to target `data-test` attributes with a selector.

```js
import { sel } from '@sharyn/testing'

console.log(sel('hey')) // '[data-test="hey"]'

expect(page).toClick(sel('submit-button'))
```
npm package: @sharyn/tsconfig
Description: ## Installation
Latest version: 1.0.1

# 🌹 @sharyn/tsconfig

## Installation

```sh
npm i --save-dev @sharyn/tsconfig
# or
yarn add --dev @sharyn/tsconfig
```

## Usage

For client bundles, in `tsconfig.json`, use:

```json
{
  "extends": "@sharyn/tsconfig"
}
```

For server bundkes, in `tsconfig.json`, use:

```json
{
  "extends": "@sharyn/tsconfig/server"
}
```

If your editor complains, use `@sharyn/tsconfig/tsconfig.json` or `@sharyn/tsconfig/server/tsconfig.json`.

## Options

Please have a look at the [**source code**](https://github.com/sharynjs/sharyn/blob/master/packages/tsconfig) to see what the options are.

<hr />

<p align="center">
  This package is part of <a href="https://github.com/sharynjs/sharyn"><b>Sharyn</b></a>, a collection of utilities and helpers.
</p>
npm package: @sharyn/util
Description: <!-- This file is auto-generated, don't modify it. Modify docs.js instead. -->
Latest version: 3.13.2

<!-- This file is auto-generated, don't modify it. Modify docs.js instead. -->

# 🌹 @sharyn/util

Lodash-like utils.

## Installation

```sh
npm i @sharyn/util
# or
yarn add @sharyn/util
```

You can alternatively install the entire [**sharyn**](https://github.com/sharynjs/sharyn#getting-started) library or individual modules.

## Modules

- [**between**](https://github.com/sharynjs/sharyn/tree/master/packages/util.between/README.md#readme) – Tests if a value is between two bounds
- [**cycle**](https://github.com/sharynjs/sharyn/tree/master/packages/util.cycle/README.md#readme) – Cycles between multiple values
- [**either**](https://github.com/sharynjs/sharyn/tree/master/packages/util.either/README.md#readme) – Tests equality with multiple values
- [**exists**](https://github.com/sharynjs/sharyn/tree/master/packages/util.exists/README.md#readme) – Returns `true` if not `null` or `undefined`
- [**global**](https://github.com/sharynjs/sharyn/tree/master/packages/util.global/README.md#readme) – Functions to create and access global variables
- [**ifs**](https://github.com/sharynjs/sharyn/tree/master/packages/util.ifs/README.md#readme) – An `if`, `else if`, `else if`... `else` util
- [**inlineThrow**](https://github.com/sharynjs/sharyn/tree/master/packages/util.inlinethrow/README.md#readme) – To `throw` in an expression
- [**invoke**](https://github.com/sharynjs/sharyn/tree/master/packages/util.invoke/README.md#readme) – A self invoking function util
- [**swit**](https://github.com/sharynjs/sharyn/tree/master/packages/util.swit/README.md#readme) – An inline and less verbose `switch`
- [**toggle**](https://github.com/sharynjs/sharyn/tree/master/packages/util.toggle/README.md#readme) – Toggles between two values
- [**tryCatch**](https://github.com/sharynjs/sharyn/tree/master/packages/util.trycatch/README.md#readme) – An inline `try` - `catch` - `finally`
- [**wait**](https://github.com/sharynjs/sharyn/tree/master/packages/util.wait/README.md#readme) – A `Promise`-based delay

<hr />

<p align="center">
  This package is part of <a href="https://github.com/sharynjs/sharyn"><b>Sharyn</b></a>, a collection of utilities and helpers.
</p>