open-index/open-npm huggingface dataset:
npm package: @momo_to33/mcp-youtube
Description: YouTube subtitle downloader for MCP
Latest version: 0.0.2

# YouTube MCP Server

Uses `yt-dlp` to download subtitles from YouTube and connects it to claude.ai via [Model Context Protocol](https://modelcontextprotocol.io/introduction). Try it by asking Claude, "Summarize the YouTube video <<URL>>". Requires `yt-dlp` to be installed locally e.g. via Homebrew.

### How do I get this working?

1. Install `yt-dlp` (Homebrew and WinGet both work great here)
2、 use `@momo_to33/mcp-youtube` in your mcp client

> Note: refer to 1、[Model Context Protocol](https://modelcontextprotocol.io/introduction) for more information on how to use MCP.
> 2、[@anaisbetts/mcp-youtube](https://github.com/anaisbetts/mcp-youtube)
npm package: @momocode/parse-s3-uri
Description: Parse s3://bucket/key style uri
Author: Simo Tukiainen
Latest version: 0.0.2

parse-s3-uri
============

`parse-s3-uri` is a very simple function to parse uris of form

    s3://bucket/key

and optionally to interpret whether a "directory" is intended if key ends with a slash e.g

    s3://bucket/dir/

Usage
-----

    const parseS3Uri = require('@momocode/parse-s3-uri')
    parseS3Uri('s3://bucket/key')
    // { bucket: 'bucket', key: 'key' }
    parseS3Uri('s3://bucket/no-slash', {interpretDirectory: true})
    // { bucket: 'bucket', key: 'no-slash', isDirectory: false }
    parseS3Uri('s3://bucket/dir/', {interpretDirectory: true})
    // { bucket: 'bucket', key: 'dir', isDirectory: true }

Note that only uris of form s3://bucket/key are parsed i.e anything else
including actual s3 https urls such as `https://s3.amazonaws.com/bucket/key`
will not work.

If anything but a string is given as parameter, a `TypeError` is thrown. If the
uri is not of the expected form, a `parseS3Uri.S3UriError` is thrown.
npm package: @momocode/s3-backed-object
Description: Encapsulates an S3-backed object that is also cached in memory
Author: Momocode Ltd
Latest version: 1.0.4

s3-backed-object
================

S3-backed-object is a small wrapper that takes bucket and key in
constructor and provides `set` and `get` methods for accessing the
encapsulated object. The object is cached in memory from last `set` or
`get` call, but on every `get` a call to S3 is made to ensure that the
version in memory is the latest.

Usage
-----

This module makes use of async/await and requires Node 8 at minimum to
run.

Both `get` and `set` return a `Promise`. Any errors (except 404 when
getting, and 304 when not modified) from S3 are forwarded as-is.

Basic usage:

    S3Object = require('s3-backed-object')
    const obj = new S3Object({bucket: 'bucket', key: 'key'}, {region: 'eu-west-1'})
    await obj.set({hello: 'world'})
    // The object is now stored as s3://bucket/key and obj instance remembers
    // the ETag returned by s3.putObject.
    await obj.get()
    // The above will resolve into {hello: 'world'} after checking with s3.getObject
    // and the remembered ETag for changes (and getting 304 not modified).

The constructor parameters are `S3Object({bucket, key}, s3opts)`, where:

-   bucket and key specify the object
-   s3opts specify any additional options for AWS.S3 constructor such as
    region or access keys.
npm package: @momocow/cloudflare-worker-leetcode-progress
Description: > Generate LeetCode progress as a SVG deployed on Cloudflare Workers.
Author: MomoCow
Latest version: 0.1.2

# Cloudflare Worker LeetCode Progress

> Generate LeetCode progress as a SVG deployed on Cloudflare Workers.

## Usage

```js

const createHandler = require('@momocow/cloudflare-worker-leetcode-progress').default
const handleRequest = createHandler({ /* options */ });

addEventListener('fetch', (event) => {
  event.respondWith(handleRequest(event) ?? new Response('', { status: 405 }));
});
```

> Remember to configure your `wrangler.toml` to build with webpack.
>
> ```toml
> type = "webpack"
> ``` 

## Options
- `cacheName`: string = undefined
  > If it is `undefined`, no caches will be used. If it's `"default"`, the default cache will be used; otherwise a new cache is opened using the provided name. See [`await caches.open(name)`](https://developers.cloudflare.com/workers/runtime-apis/cache#accessing-cache).
- `cacheTTL`: number = 300000 (in ms)
  > The value is used to generate the max age of `Cache-Control` and compute the `Expires` time.
- `cors`: boolean = false
  > Allow CORS or not. If set, CORS headers will be generated and OPTIONS method will be handled.
- `hashAlgorithm`: "sha1" | "sha256" | "sha384" | "sha512" = "sha1"
  > Hash algorithm to use to generate ETag.
- `leetcodeGraphqlUrl`: string = "https://leetcode.com/graphql"
  > LeetCode GraphQL endpoint.
- `progressType`: "global" | "session" = "global"
  > Type of LeetCode progress to display. If it's "session", the statistics of the current active session is fetched.
  > 
  > This option is set for the default progress type; however, at each request, ones can provided `progress-type` parameter in the query string to change the value.
- `userlist`: Set&lt;string&gt; = undefined
  > Access control for your Worker. If provided, only usernames appear in the set is allowed to generate the progress; otherwise, 403 forbidden is responsed.
  >  
  > Note that leave it undefined means access control disabled, every is allowed to access the Worker.
- `fetch`: typeof [fetch](https://developers.cloudflare.com/workers/runtime-apis/fetch) = fetch
  > This option is passed to `graphql-request` to avoid using XMLHttpRequest (No such API in Worker Runtime).

## Query String Parameters
- `username`: string
- `progress-type`: "global" | "session"
npm package: @momoko/babel-preset-base
Description: @momoko / Babel 基础预置
Author: momoko
Latest version: 1.0.1
Deprecated: discard

# @momoko/babel-preset-base

## 安装

```bash
yarn add -D @momoko/babel-preset-base
```

## 使用

> package.json 中添加

```js
  "babel": {
    "presets": [
      // for js
      "@momoko/base"
      // for vue
      // "@momoko/babel-preset-base/vue"
      // for react
      // "@momoko/babel-preset-base/react"
    ]
  },
  // https://github.com/browserslist/browserslist
  "browserslist": [
    "iOS >= 8",
    "Android >= 4.4"
  ]
```
npm package: @momoko/eslint-config-base
Description: @momoko / ESLint 基础配置
Author: momoko
Latest version: 1.2.0
Deprecated: discard

# @momoko/eslint-config-base

## 安装

```bash
yarn add -D @momoko/eslint-config-base
```

## 使用

```js
// package.json 中添加
  "eslintConfig": {
    "extends": [
      // for js
      "@momoko/base"
      // for vue
      // "@momoko/base/vue"
      // for react
      // "@momoko/base/react"
    ]
  },
```
npm package: @momomemory/openclaw-momo
Description: OpenClaw plugin that gives agents persistent memory using Momo
Latest version: 0.1.1

# openclaw-momo

OpenClaw plugin for persistent memory using [Momo](https://github.com/momomemory/momo).

Long-term memory for OpenClaw. Automatically recalls relevant context, captures conversation turns, and gives your bot memory tools and commands.

## Install

```bash
openclaw plugins install @momomemory/openclaw-momo
```

Restart OpenClaw after installing.

## Configuration

You only need your Momo server URL. API key is optional (required only if your Momo server enforces auth).

Set environment variables:

```bash
export MOMO_OPENCLAW_BASE_URL="http://localhost:3000"
export MOMO_OPENCLAW_API_KEY="your-key" # optional
```

Or configure in `openclaw.json`:

```json5
{
  "plugins": {
    "entries": {
      "openclaw-momo": {
        "enabled": true,
        "config": {
          "baseUrl": "${MOMO_OPENCLAW_BASE_URL}",
          "apiKey": "${MOMO_OPENCLAW_API_KEY}"
        }
      }
    }
  }
}
```

### Advanced options

| Key | Type | Default | Description |
|-----|------|---------|-------------|
| `containerTag` | `string` | `openclaw_{hostname}` | Memory namespace. All channels share this tag. |
| `autoRecall` | `boolean` | `true` | Inject relevant memories before every AI turn. |
| `autoCapture` | `boolean` | `true` | Automatically ingest the latest user/assistant turn after every successful agent run. |
| `maxRecallResults` | `number` | `10` | Max memories injected into context per turn. |
| `profileFrequency` | `number` | `50` | Inject full profile every N user turns. Search matches are injected every turn. |
| `captureMode` | `string` | `"all"` | `"all"` filters short text and injected context. `"everything"` captures all text. |
| `debug` | `boolean` | `false` | Verbose debug logging. |

## How it works

- Auto-Recall: before each AI turn, the plugin queries Momo and injects profile + relevant memories.
- Auto-Capture: after each successful AI turn, the plugin ingests the latest turn into Momo conversation memory.
- Namespacing: all memory operations are scoped by a container tag.

## Slash commands

| Command | Description |
|---------|-------------|
| `/remember <text>` | Manually save something to memory. |
| `/recall <query>` | Search memories and return ranked matches. |

## AI tools

| Tool | Description |
|------|-------------|
| `momo_store` | Save information to long-term memory. |
| `momo_search` | Search memories by query. |
| `momo_forget` | Delete a memory by id or query. |
| `momo_profile` | View the user profile (persistent + recent context). |

## CLI commands

```bash
openclaw momo search <query>    # Search memories
openclaw momo profile           # View profile
openclaw momo wipe              # Delete all memories in container (destructive)
```

## Development

```bash
bun install
bun run check-types
bun test
bun run build
```

## License

MIT
npm package: @momomemory/sdk
Description: TypeScript SDK for Momo — the self-hostable AI memory system
Author: Momo Contributors
Latest version: 0.2.1

# @momomemory/sdk

TypeScript SDK for [Momo](https://github.com/momomemory/momo) — the self-hostable AI memory system.

## Installation

```bash
npm install @momomemory/sdk
# or
bun add @momomemory/sdk
```

## Quick Start

```typescript
import { MomoClient } from "@momomemory/sdk";

const momo = new MomoClient({
  baseUrl: "http://localhost:3000",
  apiKey: "your-api-key",
  defaultContainerTag: "my-app",
});

// Create a document
const doc = await momo.documents.create({
  content: "TypeScript was released in 2012 by Microsoft.",
});

// Search memories
const results = await momo.search.search({
  q: "When was TypeScript created?",
  limit: 5,
});

// Get a specific document
const fetched = await momo.documents.get(doc.id);

// List memories
const { memories } = await momo.memories.list({ limit: 10 });

// Forget a memory
await momo.memories.forgetById("mem-id", { reason: "outdated" });
```

## Error Handling

All API errors are thrown as `MomoError` with typed `status`, `code`, and `message` fields:

```typescript
import { MomoClient, MomoError } from "@momomemory/sdk";

const momo = new MomoClient({ baseUrl: "http://localhost:3000" });

try {
  await momo.documents.get("nonexistent");
} catch (e) {
  if (e instanceof MomoError) {
    console.error(e.code);    // "not_found" | "unauthorized" | "invalid_request" | ...
    console.error(e.status);  // 404
    console.error(e.message); // Human-readable message
    console.error(e.path);    // "/api/v1/documents/nonexistent"
    console.error(e.method);  // "GET"
  }
}
```

## Advanced: Raw Client

Every `MomoClient` instance exposes `client.raw` — a fully-typed `openapi-fetch` client for direct API access:

```typescript
const momo = new MomoClient({
  baseUrl: "http://localhost:3000",
  apiKey: "key",
});

// Use openapi-fetch methods directly
const { data, error } = await momo.raw.GET("/api/v1/health");

// POST with typed body
const { data: doc } = await momo.raw.POST("/api/v1/documents", {
  body: {
    content: "raw access",
    containerTag: null,
    contentType: null,
    customId: null,
    extractMemories: null,
    metadata: {},
  },
});
```

The raw client shares the same auth and envelope-unwrapping middleware as the high-level groups.

## API Reference

Full API documentation: https://github.com/momomemory/momo/blob/main/docs/api.md
npm package: @momopa/image-gallery
Description: React image gallery module
Author: Quentin Sautière
Latest version: 1.0.0

# Image Gallery

[![npm version](https://badge.fury.io/js/npm-check.svg)](https://badge.fury.io/js/npm-check)
![license](https://img.shields.io/npm/l/react-image-gallery)

Reactive image gallery component for React.

## Features

- **Thumbnails navigation** : Navigate through images with thumbnails.
- **Personnalisation** : Apparence customisation by the props.

## Installation

Install package with npm:

```bash
npm install @sautiereqdev/react-image-gallery
```

## Contributor

[Quentin Sautière](https://github.com/SautiereQDev) - Maintainer
npm package: @momos/easy-email-editor
Description: Email editor
Author: m-Ryan
Latest version: 4.7.5

# Easy-email-editor

## Introduction

Email render and preview container.

## usage

```sh
$ npm install --save easy-email-editor
```

or

```sh
$ yarn add easy-email-editor
```

```js
import React from 'react';
import { BlockManager } from '@momos/easy-email-core';
import { EmailEditor, EmailEditorProvider } from 'easy-email-editor';
import 'easy-email-editor/lib/style.css';

const initialValues = {
  subject: 'Welcome to Easy-email',
  subTitle: 'Nice to meet you!',
  content: BlockManager.getBlockByType(BasicType.PAGE).create({}),
};

export function App() {
  return (
    <EmailEditorProvider
      data={initialValues}
      height={'calc(100vh - 72px)'}
    >
      {({ values }) => {
        return <EmailEditor />;
      }}
    </EmailEditorProvider>
  );
}
```

## customize

If you customize the UI yourself,maybe you need to know

- hooks

  - useActiveTab // current tab is edit or preview
  - useBlock // includes addBlock、moveBlock、removeBlock、undo, redo, etc.
  - useHoverIdx // hover block related, dragging status related, dragging direction related
  - useEditorProps // get props from EmailEditorProvider
  - useEditorContext // get form state and initialized status
  - useFocusIdx // focus block related

- utils (These are some very simple methods, it is best to look at the implementation)

  - getBlockNodeByIdx
  - getBlockNodes
  - getShadowRoot
  - scrollBlockEleIntoView

- components
  - BlockAvatarWrapper // allow drag and drop to editor
npm package: @momsfriendlydevco/angular-ui-history
Description: Simple history display component for Angular
Author: Matt Carter
Latest version: 1.4.20

angular-ui-history
==================
Simple history display component for Angular.

[Demo](https://momsfriendlydevco.github.io/angular-ui-history).


Installation
------------
1. Grab the NPM

```shell
npm install --save @momsfriendlydevco/angular-ui-history
```


2. Install the required script + CSS somewhere in your build chain or include it in a HTML header:

```html
<script src="/libs/angular-ui-history/dist/angular-ui-history.min.js"/>
<link href="/libs/angular-ui-history/dist/angular-ui-history.min.css" rel="stylesheet" type="text/css"/>
```

This module also requires several third party dependencies to be exposed:

```html
<script src="/libs/angular-gravatar/build/angular-gravatar.min.js"></script>
<script src="/libs/angular-relative-date/dist/angular-relative-date.min.js"></script>
<script src="/libs/@momsfriendlydevco/angular-bs-tooltip/dist/angular-bs-tooltip.min.js"></script>
<script src="/libs/quill/dist/quill.min.js"></script>
<script src="/libs/ng-quill/dist/ng-quill.min.js"></script>
<script src="/libs/quill-image-drop-module/image-drop.min.js"></script>
<script src="/libs/quill-mention/dist/quill.mention.min.js"></script>
<link rel="stylesheet" href="/libs/quill-mention/dist/quill.mention.min.css">
<link rel="stylesheet" href="/libs/quill/dist/quill.snow.css">
```


3. Include the router in your main `angular.module()` call:

```javascript
var app = angular.module('app', ['angular-ui-history'])
```


4. Use somewhere in your template:

```html
<ui-history query-url="'/api/history'" allow-post="true" allow-upload="true"></ui-history>
```


A demo is also available in the source code - see [follow the instructions in the demo directory](./demo/README.md).


API
===
This package profiles the following directives:

* [uiHistoryProvider (service)](./docs/uiHistoryProvider.md)
* [ui-history (directive)](./docs/ui-history.md)
* [ui-history-files (directive)](./docs/ui-history-files.md)
npm package: @momsfriendlydevco/angular-ui-toggle
Description: Angular-UI-Toggle ================= An Apple iOS inspired toggle switch input control for [Angular 1](https://angularjs.org) applications. This angular directive is extremely lightweight, not requiring a ton of dependencies (only Angular). Options to easi
Author: Adam Gian
Latest version: 1.0.4

Angular-UI-Toggle
=================
An Apple iOS inspired toggle switch input control for [Angular 1](https://angularjs.org) applications. This angular directive is extremely lightweight, not requiring a ton of dependencies (only Angular). Options to easily adjust the styling are provided via Bootstrap-like classes.

![iOS 7/8 Toggle switch](https://cloud.githubusercontent.com/assets/8142632/21925053/6f450396-d9c7-11e6-850a-73ca3b50bc42.gif)

*A recreation of the toggle switch in iOS 7/8. Source: [angular-ui-toggle screenshot](https://dribbble.com/shots/1109255--GIF-iOS-7-switch-3)*


Installation
------------
1. Grab the NPM

```shell
npm install --save @momsfriendlydevco/angular-ui-toggle
```


2. Install the required script + CSS somewhere in your build chain or include it in a HTML header:

```html
<script src="/libs/angular-ui-toggle/dist/angular-ui-toggle.min.js"/>
<link href="/libs/angular-ui-toggle/dist/angular-ui-toggle.min.css" rel="stylesheet" type="text/css"/>
```

3. Include the module in your main `angular.module()` call:

```javascript
var app = angular.module('app', ['uiToggle'])
```


4. Use somewhere in your template:

```html
<ui-toggle ng-model="$ctrl.something"></ui-toggle>
```


A demo is also available. To use this [follow the instructions in the demo directory](./demo/README.md).


API
===

Toggle styles
-------------

```html
<!-- Success (green) -->
<ui-toggle class="toggle-success"></ui-toggle>

<!-- Primary (deep blue) -->
<ui-toggle class="toggle-primary"></ui-toggle>

<!-- Info (light blue) -->
<ui-toggle class="toggle-info"></ui-toggle>

<!-- Warning (orange) -->
<ui-toggle class="toggle-warning"></ui-toggle>

<!-- Danger (red) -->
<ui-toggle class="toggle-danger"></ui-toggle>
```


Toggle sizes
------------

```html
<!-- Extra small -->
<ui-toggle class="toggle-xs"></ui-toggle>

<!-- Small -->
<ui-toggle class="toggle-sm"></ui-toggle>

<!-- Large -->
<ui-toggle class="toggle-lg"></ui-toggle>
```


Directive Properties
--------------------

| Property     | Type       | Default   | Description                                   |
|--------------|------------|-----------|-----------------------------------------------|
| `ngModel`    | `boolean`  |           | Model to bind to                              |
| `class`      | `string`   | `""`      | Optional class style to apply                 |
| `disabled`   | `boolean`  | `false`   | Whether to disable the toggle                 |
| `ngDisabled` | `boolean`  | `false`   | Alternate binding for `disabled`              |
| `ngChange`   | `function` |           | Function to call as ({value}) on value change |
npm package: @momsfriendlydevco/autopsy
Description: Identify meta data about a function
Author: Matt Carter
Latest version: 1.0.0

@MomsFriendlyDevCo/Autopsy
==========================
Identify meta data about a function from its header.


Why
---
I got tired of writing the same function examination code for different libraries and constantly finding edge-cases.
This library serves as a simple utility library centralized in one place along with testkits.


API
===
This module exposes the following functions:


autopsy.identify(fn)
--------------------
Attempts to identify a function's characteristics.
Will return either `"async"`, `"cb"` or `"plain"` based on examining its header.

```javascript
var autopsy = require('@momsfriendlydevco/autopsy');

autopsy.identify(()=> 1) //= "plain"
autopsy.identify(async function (){}) //= "async"
autopsy.identify(function(x) {}) //= "cb"
```

See the [testkits](./test/test.js) for lots more examples.


autopsy.hasCallback(fn)
-----------------------
Examine a function and return whether it *looks like* it may take a callback.
This is really just a wrapper around `autopsy.identify()`.

```javascript
var autopsy = require('@momsfriendlydevco/autopsy');

autopsy.identify(()=> 1) //= false
autopsy.identify(async function (){}) //= false
autopsy.identify(function(x) {}) //= true
```
npm package: @momsfriendlydevco/cli-snip
Description: A less irritating version of the GNU "cut" utility
Author: Matt Carter
Latest version: 1.0.1

@MomsFriendlyDevCo/CLI-Snip
===========================
A less irritating version of the GNU `cut` utility.

**Features:**

* Automatically uses a delimiter which cuts via spaces, tabs and commas
* RegExp compatible delimiters
* Can support complex field specifications - `* X X..Y X-Y X~Y <X <=X >X >=X`
* Can trim input lines
* (Mostly) backwards compatible with the regular `cut` command
* `--verbose` mode to see what the tool is actually doing


Installation
------------
Install via NPM in the usual way:

```
npm i -g @momsfriendlydevco/cli-snip
```

(You may need a `sudo` prefix depending on your Node setup)


Usage
-----

```
Usage: snip [-f fields] [-d delimiter]

Options:
  -V, --version                    output the version number
  -d, --delimiter [chars]          Specify the column delimiter (default:
                                   "/[\\t\\s,]/")
  -f, --fields [field-list]        Specify the fields to output (default is
                                   '*') (default: "*")
  -u, --undefined [string]         What to output when a field value cannot be
                                   found or is falsy (default is an empty
                                   string) (default: "")
  -j, --output-delimiter [string]  Delimiter to use between output fields
                                   (default is a space) (default: " ")
  -v, --verbose                    Output information about the parsed command
                                   line options
  --debug                          Show advanced debugging information per-line
                                   processed
  --trim                           Trim all input lines (default is enabled,
                                   use --no-trim to disable) (default: true)
  --max [number]                   Specify the highest field index to use when
                                   using higher-than ranged fields (e.g. ">3")
  -h, --help                       output usage information

Notes:
  * If delimiter is surrounded by "/" marks its parsed as a RegExp
  * The default delimiter is any space, tab or comma - '/[\s\t,]/'
  * Field ranges can be of the form: X X..Y X-Y X~Y <X <=X >X >=X
  * Input files can be read from specified files or from STDIN if non are specified

Examples:

  # Parse input as a CSV and output only the first field
  snip -d, -f1 <input

  # Cut up input using any space character (as a RegExp) and output fields 1, 2 and 5 to 9
  snip -d '/s/' -f1,2,5-9 <input
```
npm package: @momsfriendlydevco/eslint-config
Description: ESLint plugin for @MomsFriendlyDevCo projects
Author: Matt Carter
Latest version: 2.4.1

@MomsFriendlyDevCo/ESLint-Config
================================
ESLint Rules for Mom's Friendly Dev Co.

Installation
------------
1. Install version 9 or above of eslint + this package

```shell
npm i -D eslint @momsfriendlydevco/eslint-config
```

2. Add this template [eslint.config.js](./eslint.config.js) file to the root of your main module / project
npm package: @momsfriendlydevco/express-events
Description: Improved event emitter for express
Author: Matt Carter
Latest version: 1.1.0

@MomsFriendlyDevCo/Express-Events
=================================
Improved event emitter for express.

This module adds a simple middleware function which transforms `res` into an event emitter and provides hookable functionality.

All events are executed via [Eventer](https://github.com/MomsFriendlyDevCo/eventer) which means all events are async friendly promisable functions which will be waited for before the emitter continues.


```javascript
var express = require('express');
var expressEvents = require('@momsfriendlydevco/express-events');

var app = express();

// Add into all requests from root onwards (use a prefix to limit)
app.use(expressEvents());


// Log how all endpoints took to respond
app.use((req, res, next) => {
	var startTime = Date.now();
	res.on('end', ()=> {
		console.log('HIT', req.path, 'took', Date.now() - startTime, 'ms');
	});
});


// Log how big the output of any buffer response was
app.use('/buffers', (req, res, next) => {
	res.on('send', output => {
		if (Buffer.isBuffer(output)) console.log('Buffered output for endpoint', req.path, 'is', buffer.length, 'bytes');
		return output; // Pass output to actual outputter
	});
	next();
});


// Glue `{status: 'goodbye'}` onto the end of all JSON requests
app.use('/api', (req, res, next) => {
	res.on('json', payload => {...payload, status: 'goodbye'});
	next();
});
```


API
===

Event: end(...args)
-------------------
Emitted when `res.end()` gets called with the original arguments.


Event: json(payload)
--------------------
Emitted on each call to `res.json()` with the original object payload. Subsequent functions can mutate the output before outputting.

```javascript
app.get('/api/test/json', (req, res) => {
	res.on('json', payload => ({...payload, bar: 'Bar!'})) // Glue 'bar' key onto output
	res.send({foo: 'Foo!']) // Eventually outputs {foo: 'Foo!', bar: 'Bar!'}
});
```


Event: redirect(url)
--------------------
Emitted on each call to `res.redirect()` with the original URL payload.


Event: sendFile(stream)
-----------------------
Emitted on each call to `res.sendFile()` with the read stream.
npm package: @momsfriendlydevco/express-middleware-throttle
Description: @MomsFriendlyDevCo/express-middleware-throttle ======================= Async express middleware throttling mechanism based on MongoDB locking.
Author: Matt Carter
Latest version: 0.0.4

@MomsFriendlyDevCo/express-middleware-throttle
=======================
Async express middleware throttling mechanism based on MongoDB locking.

```javascript
var emt = require('@momsfriendlydevco/express-middleware-throttle');

app.middleware.express.throttle = emt();
```


API
===

emt(settings)
--------------
Main middleware factory.


Settings
-------------

| Setting              | Type     | Default                            | Description                                     |
|----------------------|----------|------------------------------------|-------------------------------------------------|
| `wait`             | `number` | 10000                             | Milisecond to wait before releasing lock |
npm package: @momsfriendlydevco/expressy
Description: Express with some extra features
Author: Matt Carter
Latest version: 1.0.5

@MomsFriendlyDevCo/Expressy
===========================
[ExpressJS](https://expressjs.com) with some extra functionality:

* File watch support
* Hot-swap routing - can rebuild routes on the fly for single file changes without rebooting the whole stack
* [Doop-ESM loader](https://github.com/MomsFriendlyDevCo/Expressy#readme) support
* Out-of-the-box base middleware


To use the Expressy module with the Doop-ESM loader see the instructions in [@Doop/ESM-Loader](https://github.com/MomsFriendlyDevCo/Expressy#readme).


Example - Simple web server
---------------------------
```javascript
import Expressy from '@momsfriendlydevco/expressy';

new Expressy()
	.use(bodyParser.json())
	.use((req, res, next) => {
	  // Example middleware injection
	  next();
	})
	.get('/api/widgets', (req, res) => res.send(widgets))
	.get('/api/widgets/:id', (req, res) => res.send(widgets.find(w => w.id == req.params.id)))
	.post('/api/widgets/:id', (req, res) => {
	  return res.send({
		...widgets.find(w => w.id == req.params.id),
		...req.body,
	  });
	})
	.delete('/api/widgets/:id', (req, res) => res.send(
	  widgets = widgets.filter(w => w.id != req.params.id)
	))
```


Base middleware
---------------
This module automatically loads various Express middleware when booting a server.

Configure `expressy.commonMiddleware` ([defaults in commonMiddleware.js](lib/commonMiddleware.js)) to change whether certain items are loaded and with what options.
npm package: @momsfriendlydevco/extract
Description: Extract various types of entity from strings (inclides CLI for STDIN processing)
Author: Matt Carter
Latest version: 1.0.1

@MomsFriendlyDevCo/Extract
==========================
Extract various types of entity from strings.

This project is mainly useful for its CLI which can take STDIN and extract useful information.


API
===

```javascript
var extract = require('@momsfriendlydevco/extract');

var inputString = 'prefix foo/bar.baz suffix quz.quuz'; // Or a Buffer
extract(inputString, {type: 'paths'}); //= ['foo/bar.baz', 'quz.quuz']
```


CLI
===
Install using `npm i -g @MomsFriendlyDevCo/Extract`


```
Usage: extract [--type=TYPE] [files...]

Options:
  -V, --version        output the version number
  -t, --type [parser]  specify a parser type to use (default: "auto")
  -f, --files          set --type=paths
  -p, --paths          set --type=paths
  -v, --verbose        be verbose
  -0, --null           seperate output using nulls instead of linefeeds
  -h, --help           display help for command

Examples:

  # Extact all path-like items from a file
  extract --paths someBigFile.any

  # Extact all path-like items from a stream
  cat someBigFile.any | extract --paths
```
npm package: @momsfriendlydevco/fa-icons
Description: Module which returns the closest FontAwesome class to a file name
Author: Matt Carter
Latest version: 1.0.1

@MomsFriendlyDevCo/Icons
========================
Module which returns the closest FontAwesome class to a file name.


```javascript
var faIcons = require('@momsfriendlydevco/fa-icons');

faIcons('something.mp4') //= "fas fa-file-video"
faIcons('something.csv') //= "fas fa-file-csv"
faIcons('something.weird') //= "fas fa-file"
```


API
===
This module exposes a single function which resolves with the best matching class based on an input file path.


faIcons(path)
-------------
Returns the cloest matching icon based on the internal index.


faIcons.index
-------------
Collection of rules to use when matching the path against the icon.
npm package: @momsfriendlydevco/faxios
Description: Tiny utility wrapper to add Axios functionality to Fetch
Author: Matt Carter
Latest version: 1.0.11

@MomsFriendlyDevCo/Faxios
=========================
Tiny utility wrapper to add Axios functionality to Fetch.

* **Automatic JSON decoding** - No more silly 'await request.json()` calls
* **Single object requests** - Throw around single AxiosRequest objects instead of the URL + config (except the URL query bits of course) stuff that Fetch insists you do
* **Less foot-guns** - URL query strings are automatically handled by the `params` options structure
* **Multipart data encoding** - Simply pass `{dataType: 'formData'}` to wrap all data inside `new FormData()` structures instead of standard JSON encoding
* **Simple default injection** - As with Axios, its simple to extend the `defaults` object to include common headers or data entities that should always be used
* **Error detection + warning (dev mode only)** - Faxios will yell at you nicely if you try to use a feature that you should probably use a full library for like parameter serialization, proxies or agent overrides
* **Intercept / tap into pre-fetch callbacks** - See the value of the final Fetch URL + FetchConfig while logging - see `onConfig()`
* **Fully compatible with Cloudflare workers** - ... and all its weird not-quite-JavaScript runtime API


```javascript
import faxios from '@momsfriendlydevco/faxios';

// Simple posting
let {data} = await faxios.post('https://somewebsite.com/api/something', {
    foo: 1,
    bar: 2,
    baz: 3,
})


// Single object AxiosRequest parity
let {data} = await faxios({
    method: 'PUT',
    url: 'https://somewebsite.com/api/something',
    auth: { // Handle Base64 basic auth natively
        username: 'api',
        password: 'mega-secure-api-token',
    },
    dataType: 'formData', // Encode data with `new FormData()` rather than `JSON.stringify()`
    data: {
        foo: 1,
        bar: 2,
        baz: 3,
    },
})
```
npm package: @momsfriendlydevco/in-range
Description: Numeric range checking
Author: Matt Carter
Latest version: 1.0.0

@MomsFriendlyDevCo/In-Range
===========================
Numeric range checking.

```javascript
import inRange from '@momsfriendlydevco/in-range';

// All of the following evaluate to true
inRange(10, '10')
inRange(10, '=10')
inRange(10, '>9')
inRange(10, '>=10')
inRange(10, '<12')
inRange(10, '<=12')
inRange(10, '9+') // i.e. ">="
inRange(10, '5-20')

// Can also be used in CSV combinations
inRange(10, '1, 2-5, 9+');
```
npm package: @momsfriendlydevco/lawyers.txt
Description: Lawyers.txt file generation
Author: Matt Carter
Latest version: 1.0.0

@MomsFriendlyDevCo/Lawyers.txt
==============================
Simple [Supabase like](https://supabase.com/lawyers.txt) lawyers.txt generation for easy inclusion within projects.

This project exports a single string which can be glued into static files when generated.

It can also be run as `lawyers` from any project its installed in:

```javascript
import {dirName} from '@momsfriendlydevco/es6'; // Or work out where we are somehow
import lawyers from '@momsfriendlydevco/lawyers.txt';

let lawyersSpeil = await lawyers({
    path: dirName(),
});

// ...Do something with the string
```


Auto generation within a Vite project
-------------------------------------
The following is an example of how to generate + output a `lawyers.txt` file using [vite-plugin-inject](https://www.npmjs.com/package/vite-plugin-inject) NPM:

```javascript
// Within vite.config.js
import {dirName} from '@momsfriendlydevco/es6';
import pluginInject from 'vite-plugin-inject';
import lawyers from '@momsfriendlydevco/lawyers.txt';

export default {
    plugins: [
        pluginInject([
            /* ... other plugin config ... */
            {
                name: 'lawyers.txt',
                async content() {
                    return await lawyer({
                        path: dirName(),
                    });
                },
            },
        ])
    ],
}
```


Example Output
--------------

```
Lawyers.txt
-----------
For compliance.

If you're a creator/contributor to one of these packages, thanks!

Last Updated: 2024-03-14

# Package Name License Version                 Repository
- ------------ ------- ----------------------- ----------------------------------------
1 list-it      MIT     1.3.12                  https://github.com/takamin/list-it
2 nlf          MIT     2.1.1                   http://github.com/iandotkelly/nlf
3 node-getopt  MIT     0.3.3-forked-by-takamin https://github.com/jiangmiao/node-getopt
```


API
===

lawyers(options)
----------------
This project exports a single function which takes the root path to scan from and some additional options.
It returns a promise which resolves to a String when generation has completed.

Supported options are:

| Option        | Type            | Default         | Description                                    |
|---------------|-----------------|-----------------|------------------------------------------------|
| `path`        | String          | `process.cwd()` | The path to start scanning from                |
| `exclude`     | Array<String> ` | `[]`            | Array of packages to exclude, by name          |
| `excludeSelf` | `true`          | `true`          | Exclude the named package in the starting path |
| `depth`       | `Number`        | `1`             | Package depth to scan                          |
| `production`  | `Boolean`       | `true`          | Only show production level packages            |
npm package: @momsfriendlydevco/momsfriendlyfont
Description: A collection of miscellaneous SVG icons for various projects
Author: Matt Carter
Latest version: 0.0.4

Moms Friendly Font
==================
A collection of various SVG based icons that arn't already part of the [FontAwesome](http://fortawesome.github.io/Font-Awesome/) project.

[List of provided icons](https://momsfriendlydevco.github.io/MomsFriendlyFont/)


Installation
============
1. Install with npm or bower:

```shell
npm i @momsfriendlydevco/momsfriendlyfont

OR

bower install MomsFriendlyFont
```


2. Include the magical CSS file in your header:

```html
<link href="/libs/MomsFriendlyFont/dist/moms-friendly-font.css" rel="stylesheet" type="text/css" />
```


3. Use the icon in an `<i/>` tag (all icons are prefixed with `mf-`):

```html
<i class="mf-bobba-fett"></i>
```


Adding Icons
============
1. Copy the credit to the icon and place it (with a direct link) in the README.md file
2. Drop the SVG file into `svg/`
3. Run `gulp build`
4. Run `gulp gh-pages`


Credits
=======
* [Spider Web by Franc from the Noun Project](https://thenounproject.com/term/spider-web/742346/)
* [Bobba Fett by Gustavo Ribeiro Vieira from the Noun Project](https://thenounproject.com/term/boba-fett/102981/)
* [Facepalm by Edward Boatman from the Noun Project](https://thenounproject.com/search/?q=face%20palm&i=18486)
* [Worker by alrigel](https://thenounproject.com/term/worker/995066)
* [Submarine by sagit milshtein](https://thenounproject.com/term/submarine/67219)