open-index/open-npm huggingface dataset:
npm package: @random-di/v1-loader
Description: A @random-di/container service loader for @botflx/dependency-injection-container container
Author: Victor Mendele
Latest version: 0.0.7

[![Build Status](https://travis-ci.com/botflux/random-di.svg?branch=main)](https://travis-ci.com/botflux/random-di)
[![npm version](https://img.shields.io/npm/v/@random-di%2Fv1-loader.svg)](https://npmjs.org/package/@random-di/v1-loader)
[![Coverage Status](https://coveralls.io/repos/github/botflux/random-di/badge.svg?branch=main)](https://coveralls.io/github/botflux/dependency-injection-container?branch=main)
[![Lightweight](https://img.shields.io/bundlephobia/minzip/@random-di/v1-loader)](https://bundlephobia.com/result?p=@random-di/v1-loader)
[![GitHub issues](https://img.shields.io/github/issues/botflux/random-di.svg)](https://GitHub.com/botflux/random-di/issues/)
[![GitHub license](https://img.shields.io/github/license/botflux/random-di.svg)](https://github.com/botflux/random-di/blob/main/LICENCE)

# `@random-di/v1-loader`

An adapter from `@botflx/dependency-injection-container` to `@random-di/container`.

## Installation

```shell
npm i --save @random-di/v1-loader
```

```shell
yarn add @random-di/v1-loader
```

## Usage

```typescript
import {createServiceContainer} from '@botflx/dependency-injection-container'
import {createContainerBuilder, SyncServiceProviderInterface} from '@random-di/container'
import {v1Loader} from '@random-di/v1-loader'

class ServiceA {
    public hello: string

    constructor(provider: SyncServiceProviderInterface) {
        this.hello = provider.get<string>('hello')
    }
}

const v1Container = createServiceContainer()
    .addFactory('hello', () => 'world')
    .add('ServiceA', ServiceA)

const v2Container = createContainerBuilder({
    loaders: [v1Loader(v1Container)]
}).build()

const hello = v2Container.get<string>('hello')
const serviceA = v2Container.get<ServiceA>('ServiceA')
```
npm package: @random-fixtures/address
Description: This library can be used to generate random data (as the name suggest for use in fixtures or for example tests).  It is inspired by the http client library in any Jetbrains IDE which also has a $random variable that can be used  to generate all kinds of d
Author: Jurriaan Ruitenberg
Latest version: 0.0.7

# random-fixtures

This library can be used to generate random data (as the name suggest for use in fixtures or for example tests). 
It is inspired by the http client library in any Jetbrains IDE which also has a $random variable that can be used 
to generate all kinds of data (Which is also probably a Java library by itself). This library is very much a work 
in progress as more modules and features will be added. For the time being use at your own discretion.

There are multiple modules that can be included as separate packages:

* address (Streets, cities, countries and country codes)
* ancient (Greek gods, heroes, titans)
* chuck norris (Chuck Norris programming facts)

Examples:

    import { $random } from '@random-fixtures/core'

    console.log($random.number.int(100, 1000)) // A number between 100 and 1000 inclusive


Or using one of the modules

    import { $random } from '@random-fixtures/core'
    import '@random-fixtures/chuck-norris'

    console.log($random.chuckNorris.fact) // A truthful fact about chuck norris
npm package: @random-fixtures/ancient
Description: This library can be used to generate random data (as the name suggest for use in fixtures or for example tests).  It is inspired by the http client library in any Jetbrains IDE which also has a $random variable that can be used  to generate all kinds of d
Author: Jurriaan Ruitenberg
Latest version: 0.0.7

# random-fixtures

This library can be used to generate random data (as the name suggest for use in fixtures or for example tests). 
It is inspired by the http client library in any Jetbrains IDE which also has a $random variable that can be used 
to generate all kinds of data (Which is also probably a Java library by itself). This library is very much a work 
in progress as more modules and features will be added. For the time being use at your own discretion.

There are multiple modules that can be included as separate packages:

* address (Streets, cities, countries and country codes)
* ancient (Greek gods, heroes, titans)
* chuck norris (Chuck Norris programming facts)

Examples:

    import { $random } from '@random-fixtures/core'

    console.log($random.number.int(100, 1000)) // A number between 100 and 1000 inclusive


Or using one of the modules

    import { $random } from '@random-fixtures/core'
    import '@random-fixtures/chuck-norris'

    console.log($random.chuckNorris.fact) // A truthful fact about chuck norris
npm package: @random-fixtures/chuck-norris
Description: This library can be used to generate random data (as the name suggest for use in fixtures or for example tests).  It is inspired by the http client library in any Jetbrains IDE which also has a $random variable that can be used  to generate all kinds of d
Author: Jurriaan Ruitenberg
Latest version: 0.0.7

# random-fixtures

This library can be used to generate random data (as the name suggest for use in fixtures or for example tests). 
It is inspired by the http client library in any Jetbrains IDE which also has a $random variable that can be used 
to generate all kinds of data (Which is also probably a Java library by itself). This library is very much a work 
in progress as more modules and features will be added. For the time being use at your own discretion.

There are multiple modules that can be included as separate packages:

* address (Streets, cities, countries and country codes)
* ancient (Greek gods, heroes, titans)
* chuck norris (Chuck Norris programming facts)

Examples:

    import { $random } from '@random-fixtures/core'

    console.log($random.number.int(100, 1000)) // A number between 100 and 1000 inclusive


Or using one of the modules

    import { $random } from '@random-fixtures/core'
    import '@random-fixtures/chuck-norris'

    console.log($random.chuckNorris.fact) // A truthful fact about chuck norris
npm package: @random-fixtures/core
Description: This library can be used to generate random data (as the name suggest for use in fixtures or for example tests).  It is inspired by the http client library in any Jetbrains IDE which also has a $random variable that can be used  to generate all kinds of d
Author: Jurriaan Ruitenberg
Latest version: 0.0.7

# random-fixtures

This library can be used to generate random data (as the name suggest for use in fixtures or for example tests). 
It is inspired by the http client library in any Jetbrains IDE which also has a $random variable that can be used 
to generate all kinds of data (Which is also probably a Java library by itself). This library is very much a work 
in progress as more modules and features will be added. For the time being use at your own discretion.

There are multiple modules that can be included as separate packages:

* address (Streets, cities, countries and country codes)
* ancient (Greek gods, heroes, titans)
* chuck norris (Chuck Norris programming facts)

Examples:

    import { $random } from '@random-fixtures/core'

    console.log($random.number.int(100, 1000)) // A number between 100 and 1000 inclusive


Or using one of the modules

    import { $random } from '@random-fixtures/core'
    import '@random-fixtures/chuck-norris'

    console.log($random.chuckNorris.fact) // A truthful fact about chuck norris
npm package: @random-guys/bucket
Description: Wrapper around axios for interservice communication
Latest version: 0.10.1

# bucket

Bucket is an implementation of the [Repository](https://martinfowler.com/eaaCatalog/repository.html) pattern over mongoose

## How to install

```shell
yarn add @random-guys/bucket
```

or

```shell
npm install @random-guys/bucket
```

## How does it work

Bucket is made up of 3 parts. An interface that defines the properties of the your model, a repository that defines basic operations and queries as well as custom ones, and a schema to help with conversion of types as well as validate input.

## Quick Start

Define the properties of your model

```ts
import { Model } from "@random-guys/bucket";

export interface Book extends Model {
  isbn: string;
  title: string;
  version: Version;
}

export interface Version {
  major: number;
  minor: number;
  patch: number;
}
```

`Model` is just an extension of mongoose's `Document` with support for timestamps as well as string(UUID) based id, \_id.

Then define a schema for your data using [SchemaTypes](https://mongoosejs.com/docs/schematypes.html) and custom schemas

```ts
import { SchemaTypes, SchemaDefinition } from "mongoose";
import { SchemaFactory } from "@random-guys/bucket";

const VersionSchema: SchemaDefinition = {
  major: { type: SchemaTypes.Number, default: 0 },
  minor: { type: SchemaTypes.Number, default: 1 },
  patch: { type: SchemaTypes.Number, default: 0 }
};

export const BookSchema = SchemaFactory({
  isbn: { type: SchemaTypes.String, trim: true },
  title: { type: SchemaTypes.String, trim: true },
  version: VersionSchema
});
```

`SchemaFactory` gives you automatic UUID for `_id`, the actual definitions for timestamps and a `toJSON` mapper.

Next, extend the `BaseRepository` which gives you access to generic operations and queries.

```ts
import { Book } from "./path/to/model";
import { BookSchema } from "./path/to/schema";
import { BaseRepository } from "@random-guys/bucket";
import mongoose from "mongoose";

class PersonRepository extends BaseRepository<Person> {
  constructor() {
    super(mongoose, "Person", PersonSchema);
  }
}

export const PersonRepo = new PersonRepository();
```

Now we are ready to use the DB.

```ts
import { PersonRepo } from './path/to/repo';
import { defaultMongoOpts } from '@random-guys/bucket';
import mongoose from 'mongoose';

await mongoose.connect(url, defaultMongoOpts)

const person = await PersonRepo.byID(id));
const people = await PersonRepo.all({});
```
npm package: @random-guys/express-bunyan
Description: Wrapper around axios for interservice communication
Latest version: 0.2.0

# express-bunyan

Express middleware for logging `Request`s

Included in the package:
- UUIDs for each request
- Request serializer
- Helpers for logging request and responses

## How to install?
`yarn add @random-guys/express-bunyan`

## How does it work?

```ts
const logger = createLogger({
  name: 'some_name',
  serializers: {
    // ...other serializers
    req: createRequestSerializer('password', 'dob')
  }
})

// log all incoming requests
app.use(logRequests(logger))

app.get('/request-watcher', (req, res) => {
  // each request gets a UUID
  console.log('New request with', req.id)

  // use log helpers
  logResponse(logger, req, res)
  // ....
})

```

## TODO
[ ] Improve coverage of tests
npm package: @random-guys/express-joi
Description: Wrapper around axios for interservice communication
Latest version: 0.1.0

# express-joi

Express middleware for [joi](https://github.com/hapijs/joi)

## How to install?

`yarn add @random-guys/express-joi`

## How does it work?

Validate body of `POST` requests
```ts
import { refreshJSend } from "@random-guys/express-jsend";

// make use to use the jsend middleware
app.use(refreshJSend)

const schema = joi.object({
  name: joi.string().required(),
  age: joi.number().required()
})

app.post('/endpoint', validate(schema), (_req, res) => {
  res.status(200).json({})
})
```

or `GET` queries
```ts
const schem = joi.object({
  canType: joi.bool(),
  age: joi.number()
})

app.get('/query', validate(schem, 'query'), (_req, res) => {
  res.status(200).json({})
})
```
npm package: @random-guys/express-jsend
Description: Wrapper around axios for interservice communication
Latest version: 0.1.0

# express-jsend
Integration of [jsend](https://github.com/omniti-labs/jsend) and [express](https://github.com/expressjs/express)

## How to install?
`yarn add @random-guys/express-jsend`

## How does it work?
```ts
app.get('/success', async (_req, res) => {
  res.jSend.success({ result: 0 })
})

app.get('/error', (_req, res) => {
  // @ts-ignore 
  res.jSend.error({ field: 'name' }, 'This fields are required', 422)
})
```
npm package: @random-guys/iris
Description: Wrapper around Axios for inter-service REST API calls
Author: Chukwudi Oranu
Latest version: 1.1.1

<p align="center">
  <img width="70" height="70" src="https://res.cloudinary.com/chudi/image/upload/v1561911811/sterling/i.svg">
</p>

<p align="center">Wrapper around Axios for inter-service REST API calls</p>

# Iris offers

- Out of the box configurable request retries
- Minimal overhead and complexity

# Installation

Install via yarn

`yarn add @random-guys/iris`

Install with NPM

`npm install @random-guys/iris`

# Usage

## Boostrap Iris

```javascript
import Iris from '@random-guys/iris';

Iris.bootstrap('service-name', 'custom-auth-scheme');
```
npm package: @random-guys/memory
Description: Wrapper around redis
Latest version: 0.2.1

# memory

Wrapper around redis.

## How to install?

`yarn install @random-guys/memory`

## How does it work?
```ts
const store = new RedisStore(redisUrl)

// save data for 10m
await redis.save('something', 'some that things...hehe..fool', 60 * 10);

// save an object
await redis.save('myobject', {
  tomatoes: 'tomaetoes',
  biscuit: 'bone'
})

// get a normal string
await redis.get('something')

// get an object
await redis.get('myobject', true)

// clean the table
await redis.delete('myobject')
await redis.delete('something')
```
npm package: @random-guys/pdfmills
Description: Wrapper around pdfkit
Latest version: 0.4.0

# pdfmills

A simple wrapper around [pdfkit](https://github.com/foliojs/pdfkit) that favors declarative style.

## What's inside

- Elements:
  - `Text` or `Paragraph`s
  - `Image`s
- Layouts:
  - `Block`
  - `Flex`
  - `RatioFlex`
  - `EqualFlex`
- Spacing:
  - `LineBreaks` for vertical spaces
  - `Margin`
  - `Padding`
- Automatic page management

## How to install

```sh
yarn add @random-guys/pdfmills
```

or

```sh
npm i @random-guys/pdfmills
```

## Get Started

```ts
import { block, Text } from "@random-guys/pdfmills";

// arrange elements vertically
const divStyle: BlockStyle = {
  display: "block",
  margin: 0
};

const flexStyle: FlexStyle = {
  display: "flex"
};

div(
  { ...divStyle, margin: 4 },
  row({
    style: flexStyle,
    elements: [
      col(p("START DATE"), ["right"], 60),
      col(p("ACCOUNT NUMBER", alignRight), ["right", "left"], 100),
      col(p("INCOME", alignRight), ["left"], 60)
    ]
  }),
  row({
    style: flexStyle,
    elements: [
      col(p("12/03/07", { ...headerFont, align: "left" }), ["right"], 60),
      col(p("0087567843", headerFont), ["right", "left"], 100),
      col(p("₦250,000", headerFont), ["left"], 60)
    ]
  }),
  br(20),
  row({
    style: flexStyle,
    elements: [
      col(p("END DATE"), ["right"], 60),
      col(p("BALANCE", alignRight), ["right", "left"], 100),
      col(p("INCOME", alignRight), ["left"], 60)
    ]
  }),
  row({
    style: flexStyle,
    elements: [
      col(p("12/03/07", { ...headerFont, align: "left" }), ["right"], 60),
      col(p("₦560,000", headerFont), ["right", "left"], 100),
      col(p("₦25,000", headerFont), ["left"], 60)
    ]
  })
);

// arrange elements horizontally
const headerFont: FontStyle = { ...alignRight, fontColor: [130, 134, 145] };
row({
  style: flexStyle,
  elements: [
    col(p("12/03/07", { ...headerFont, align: "left" }), ["right"], 60),
    col(p("0087567843", headerFont), ["right", "left"], 100),
    col(p("₦250,000", headerFont), ["left"], 60)
  ]
});

// load the element
const elements = [firstRow, br(50), secondRow, br(40), thirdRow];

// write the elements to the buffer
render(context, elements);

// you can write the buffer to the file stream
save(context.raw, "output.pdf");

// you can also upload the file to Azure blob storage
import { Blobber } from "@random-guys/blobber";
import uuid from "uuid/v4";

const tempName = `${uuid()}.pdf`;
const uploader = new Blobber<any>("reports");
context.raw.end();
return await uploader.streamLocalFile(tempName, this.context.raw);
```

Checkout the [examples](https://github.com/random-guys/pdfmills/tree/develop/examples) folder for real life examples.
npm package: @random-guys/pro-mails
Description: Email Templates for Sterling Pro
Author: Olakunle Arewa
Latest version: 0.2.3

# Sterling Pro Mails

Every email for the sterling pro service

## How to install?
```shell
$ yarn add @random-guys/pro-mails`
```

## How does it work?

```ts
import { sessionRequestMail } from '@random-guys/pro-mail';

const destination = (token) => `https://myapp.netlify.com/enter-password/${token}`
const mailMessage = await sessionRequestMail({
  firstname: 'xxxtacion',
  workspaces: [
    {
      name: 'Dangote Records',
      link: token(magicToken)
    }
  ]
})
```

## Mails-to-be-done
In no particular order:
 - [x] Session Request
 - [x] Existing/Migrated User Login
 - [x] New User
 - [x] Login Confirmation
 - [x] Failed Authorization Request
 - [x] Corporate Admin Activation
 - [x] Single Signatory Activation
 - [x] Soft Token
 - [x] Hard Token
 - [x] Authorization Letter
npm package: @random-guys/pro-vcs
Description: Repo for implementing review requests
Latest version: 0.25.2

# pro-vcs

Database abstraction to simplify review request workflow

## How to install

Run `yarn add @random-guys/pro-vcs`

## How it works

## TODO

- [x] [Less complex code](https://dave.cheney.net/2019/07/09/clear-is-better-than-clever)
- [x] Timestamps
- [ ] Introduction of transactions for better concurrency guarantees
- [ ] Arrange tests
- [ ] True data uniqueness by taking `object_state` into consideration
- [ ] proxy `ModelNotFound` errors from `inplace` methods to `InconsistentState` error

### Pending Tests

- `event.repo`
  - `create`
    - [x] object is in `created` state
    - [ ] `prohub` is notified
    - [ ] DB constraints are held
  - `createApproved`
    - [ ] object is in `stable` state
  - `assertExists`
    - [ ] throws `DuplicateModelError` only when duplicate exists
  - `get`
    - [x] return `frozen` for `created/updated/deleted` when request is not from owner
    - [ ] return `stable` objects as is
    - [ ] patches objects for `updated` owners
  - `byQuery`
    - same as `get`
    - [ ] hides `created` objects by default
    - [ ] shows `created` objects on `allowNew`
  - `all`
    - [ ] same as `get`
    - [x] same as `byQuery`
  - `list`
    - [ ] same as `all`
  - `update`
    - [x] updates `created` objects
    - [x] updates `updated` objects
    - [x] returns patched object
    - [ ] sends patches to `prohub` for `created` objects
    - [ ] sends patches to `prohub` for `updated` objects
    - [ ] throws `InvalidOperation` for `deleted` objects
    - [x] create a new update for a `stable` object
    - [ ] send a new event for `stable` objects
    - [ ] throws `InvalidOperation` for objects not owner by user
  - `delete`
    - [ ] sends close event to `prohub` for `created` objects
    - [ ] sends close event to `prohub` for `updated` objects
    - [ ] sends close event to `prohub` for `deleted` objects
    - [x] undo `updated` objects
    - [x] undo `deleted` objects
    - [x] deletes `created` events
    - [x] creates new `deleted` event for `stable` objects
    - [ ] throws `InvalidOperation` for objects not owner by user
  - `merge`
    - [ ] stabilises `created` objects
    - [ ] stabilises `updated` objects with the new data. i.e other users can now see the changes
    - [ ] obliterates `deleted` objects
    - [ ] throws `InvalidOperation` for `stable` objects
    - [ ] stabilises `created` with additional updates
    - [ ] stabilises `updated` with additional updates
  - `reject`
    - [ ] cleans up `created` objects
    - [ ] reverts `updated/deleted` objects
    - [ ] throws `InvalidOperation` for `stable` objects
    - [ ] reverts `updated` with additional updates
- `merge.app`
  - [ ] `onApprove`
  - [ ] `onReject`
  - [ ] `onChecks`
npm package: @random-guys/rented-bucket
Description: Wrapper around axios for interservice communication
Latest version: 0.1.0

# rented-bucket

A repo to use when working with a multi-tenant products. 

## Why
Sometimes you have objects that cannot be stored without an external ID, a foreign key if you will. Everything that you'll do, read, write, update will be done based on this ID. You under no circumstances want to query those objects based solely on their own properties. This package helps you enforce it in your repo methods.

## How to install?
`yarn add @random-guys/rented-bucket`

## How does it work?
```ts
// create base model
export interface SchoolModel extends Model {
  school: string
}

// base repo
export class SchoolRepository<T extends SchoolModel> extends RentedRepository<T> {
  constructor(mongoose: MongooseNamespace,name: string, schema: Schema) {
    super(mongoose, name, 'school', schema)
  }
}

// use the model
export interface Student extends SchoolModel {
  full_name: string
  class: string
  age: number
  average_grade: number
}

export class SchoolRepository extends SchoolRepository<Student> {
  constructor(mongoose: MongooseNamespace) {
    super(mongoose, 'Student', RoleSchema)
  }

  // live with it
  getIdiots(school: string) {
    return this.all({
      conditions: {
        average_grade: { $lte: 4.0 }
      }
    })
  }
}

export const StudentSchema = RentedSchema('school', {
  class: { ...trimmedString, required: true },
  full_name: { ...trimmedString, required: true, unique: true, index: true },
  // figure out the rest, I'm tired of writing
})
```

## TODO
[ ] Tests
npm package: @random-guys/siber
Description: Controllers as classes... with batteries 😬
Latest version: 0.15.1

# siber

Controllers as classes. This lib abstracts away the internals of controllers.

## How to install?

`yarn add @random-guys/siber`

Also, you need `yarn add inversify-express-utils`

## How does it work?

`my.controller.ts`

```ts
export class MyController extends Controller<MyResponseType> {
  @httpGet('/', myMiddleWare)
  async getData(@request() req: Request, @response() res: Response) {
    try {
      // ...do somethings
      this.handleSuccess(req, res, myResponse);
    } catch (err) {
      this.handleError(req, res, err);
    }
  }
}
```

In your `ioc.ts`

```ts
import { Container } from 'inversify';
import './my.controller.ts';

const container = new Container();
export default container;
```

Finally, in your `app.ts`

```ts
const server = new InversifyExpressServer(container, null);
.server.setConfig((app: Application) => {
  siber.buildInto(app, logger, {
    cors: false,
    jsend: true,
    tracking: true
  })
})
```

## TODO

- [ ] Tests
- [ ] Refactor filesystem structure
- [ ] Removed dependency on JSend
- Move integration code to new packages
  - [ ] `siber-bucket`
  - [ ] `siber-provcs`
npm package: @random-tables/generator-logic
Description: logic manager for table generator; build index, call table
Latest version: 1.0.2

# generator-logic
Background logic for building indexes &amp; returning data


### TDD

`npm run test`

## Glossary

`Collection` - Thematically linked collection of tables, this provides the root index called, these id's should be unique   
`TableSet` - A subset of a Collection for sub categorisation    
`Table` - A single table that when called will return a random value


## buildIndex - function

[ARGS] arrayOfTableIndexes[Array], onComplete[function]

Pass this an Array of Collections and it will build the index, once complete it will fire the onComplete function.
if run a second time will reset the buildindex to only those Collections provided

## appendIndex

[ARGS] arrayOfTableIndexes[Object], onComplete[function]

Same as buildIndex, but just passing a single Object and adds non destructively

## getCall

[ARGS] tableCallString[string] - should match pattern `collectionID/tableSet/table`

Returns below object based on call provided

```
{
	data?: [ (field used for non-utility tables)
        {
            title: [string] (table item title)
            data: [string] (actual table data)
            class?: [string] (css class)
            icon?: [string] (url/data for icon image)
            iconclass?: [string] (css class for icon)
        },
        ...
    ];
	utility?: [string] (field used if requesting a utility table)
	type?: [string] (currently unused futureproofing for increasing flexibility)
    missingLib: [bool] (returns true if a required library is missing)
	call: [string] ()
}
```
npm package: @random-tables/npc-fantasy
Description: tabes data for fantasy NPC's
Latest version: 1.6.6

# Fantasy NPC Library

A library for generating fantasy NPC's

#### Example

[Dwarf Male]
Baern Grimtooth
Dwarf 45
he is tall, stocky with bright green eyes, a crooked nose and wavy blonde hair, his facial experssion is strong in character

He is fast thinker, cheerful and prone to cruelty, has a job as a bookkeeper, and spends his free time on carpentry.
He is motivated by wealth and hides a gambling addiction.

Has two sisters and a brother.
Grew up in a farming community, was for a while a lawyer, and during their younger years injured in battle

### Atributions
- http://members.iinet.net.au/~rene1/realnpc.htm
npm package: @random-tables/utility-names
Description: names data for random tables
Author: aronedwards91
Latest version: 1.3.1

# Names Utility Library

Utility library for randomised tables, focusing on modern names.

### Categories status list

Aim for about ~150 - 200 first names, and around ~ 200 - 300 names to consider a group complete

<b>Category</b> - <b>Data size</b>

- English - high
- french - complete
- tibetan - mid

### Atributions
npm package: @random-tables/utility-names-fantasy
Description: table data for fantasy names
Latest version: 1.4.3

# Names Utility Library

Utility library for randomised tables, focusing on medieval/tolkenesque fantasy names.

### Categories status list

Aim for about ~150 - 200 first names, and around ~ 200 - 300 surnames or ~20(prefix)/20(postfix) for surname generation to consider a group complete

<b>Category</b> - <b>Data size</b>

- Dwarf - fM 90  fF 75 l 26 / 20
- Elven - fM 60  fF 50 l 26 / 20

### Atributions

- [Elven] https://askmiddlearth.tumblr.com/post/56336984476/gendered-names-in-middle-earth


### Utility

converts an array to uppercase & sorts
```
const a = [];

console.log(a.map(x => x.charAt(0).toUpperCase() + x.slice(1)).sort())
```
npm package: @random-tables/utility-names-historic
Description: Utility library for randomised tables, focusing on historic/modern names.
Latest version: 1.1.2

# Historic Names Utility Library

Utility library for randomised tables, focusing on historic/modern names.

## Adding to repo

- Keep alphabetical for ease of addition

### Categories status list

Aim for about ~150 - 200 first names, and around ~ 200 - 300 surnames to consider a group complete

<b>Category</b> - <b>Data size</b>

- Anglo Saxon - low

### Atributions

### Resources

-Anglo Saxon https://darkagessociety.co.uk/anglo-saxon-names/
npm package: @random-tables/utility-npc
Description: data for random tables - npc's
Latest version: 1.5.1

# NPC Utility Library

Utility library for randomised tables, focusing on NPC details that are era/theme unspecific.

### Categories status list

##### Physical

- Body Attributes: height, build, facial features, hair type
- Face attributes: demeanour
  (he is `height`, `build` with {{color}} eyes, `facial-features` and `hair-type` {{color}} hair, his facial expression is `demeanour`)
  (he is Tall, stocky  with bright green eyes, a crooked nose and wavy blonde hair, his facial expression is strong in character)

##### behviour & roles

- Personality -- Strengths, Aspects, faults
  (he/she is `strength`, `aspect` and `fault`)
  (He/she is fast thinker, cheerful and prone to cruelty)
- hobby
  (spends his free time on `hobby`)
  (spends his free time on carpentry)
- motivations
- secret
  (He is motivated by `motivation` and hides `secret`)
  (He is motivated by wealth and hides a gambling addiction)

##### history

- family
  (Has `family`)
  (Has two sisters and a brother)

### Atributions

- http://members.iinet.net.au/~rene1/realnpc.htm
- http://angband.oook.cz/steamband/CharacterTraits.pdf
- https://www.proofreadingservices.com/pages/words-describing-peoples-height
- https://www.iluenglish.com/describing-people-a-persons-physical-appearance/
- https://describingwords.io/for/demeanor
- https://www.chaosgen.com/wfrp/character_motivation
npm package: @random-tables/utility-npc-fantasy
Description: table data for fantasy NPC's
Latest version: 1.4.1

# NPC Utility Library

Utility library for randomised tables, focusing on NPC details focusing on medieval fantasy.

### Categories status list

##### behviour & roles

- hobby
  (spends his free time on `hobby`)
  (spends his free time on carpentry)
- life roles / jobs
  (and has a job as a `job`)
  (and has a job as a bookkeeper)

##### history

- youth
- past roles
- life events
  (Grew up `youth`, was for a while `past roles`,and during their younger years `life events`)
  (Grew up in a farming community, was for a while a lawyer, and during their younger years injured in battle)

### Atributions

- https://midnight-wolf.fandom.com/wiki/Fantasy/Medieval_Character_Jobs_or_Occupations
npm package: @random-tables/utility-senses
Description: tables data for senses
Latest version: 1.11.3

# Table Library

Utility library for randomised table library, focusing on descriptive terms.

### Categories

- colors - soft,light/dark
- smell - (places) nature/factory/street
- feel - rough material/ 
- sound - temperate-woodland/mountain/street


## Resources

#### Colors v1+
https://ingridsnotes.wordpress.com/2014/02/04/the-color-thesaurus/
https://www.valsparpaint.co.uk/colours/pre-selected-colours/blues/
https://dalerrowney-corp-live.cphostaccess.com/artists-watercolour-paint-tubes/

#### Smells v1+

should always play well as
`{{utility-senses/smell/strength-light}} of {{utility-senses/smell/foul}}`
as in 
`stuffy waft of nauseating decay`
or
`evocative wisp of rich sap`

#### Feel v1+

should work with `it felt ...`
eg:
- `it felt leathery`
- `it felt cold`

#### Sound v3+

should work with `you could hear the sound of ...`
eg:
- `you could hear the sound of leaves rustling`

##### To Add ?
human smells
hair smells
air smells

### Attributions

https://en.wikipedia.org/wiki/Human_hair_color
npm package: @random-ui/cover-image
Description: ```bash yarn add @random-ui/cover-image ```
Latest version: 1.0.0-beta.2

# Button

```bash
yarn add @random-ui/cover-image
```

```js
import { CoverImage } from '@random-ui/cover-image'

<CoverImage src="imageUrl">
  Figure Caption
</CoverImage>

```
npm package: @random-ui/icons
Description: ## Inslations ```sh yarn add @random-ui/icons ```
Latest version: 1.0.0-beta.2

# icons

## Inslations
```sh
yarn add @random-ui/icons
```

## Usage
```js
import { Cube } from '@random-ui/icons'

const App = () => (
  <div>
    <Cube />
  </div>
)
```
npm package: @random-ui/nav
Description: ## Inslations ```sh yarn add @random-ui/nav ```
Latest version: 1.0.0-beta.3

# nav

## Inslations
```sh
yarn add @random-ui/nav
```

## Usage
```js
import { Nav, Item } from '@random-ui/nav'

const App = () => (
  <Nav>
    <Item>
      Item1
    </Item>
    <Item>
      <span>Item2</span>
    </Item>
    <Item selected onClick={() => {
      console.log('clicked')
    }}>
      Item 3
    </Item>
  </Nav>
)
```