open-index/open-npm huggingface dataset:
npm package: @lukekaalim/http-client
Description: Simple HTTP REST Client abstraction over some common HTTP implementations on javascript platforms
Author: luke kaalim
Latest version: 6.1.0

# http-client

Simple abstraction over the various platforms HTTP clients, to make simple REST calls using Promises.

[![CircleCI](https://img.shields.io/circleci/build/github/lukekaalim/http-client)](https://circleci.com/gh/lukekaalim/workflows/http-client)
[![npm (scoped)](https://img.shields.io/npm/v/@lukekaalim/http-client)](https://www.npmjs.com/package/@lukekaalim/http-client)

## Motivation
Fetch is a pretty good function for making network requests, but is a pretty complicated interface to implement.

This library provides a shared abstraction for a fetch-like client object, which can be constructed for the browsers `window.fetch` property, or node's `require('http').request` property.

The intention is then further, more specific libraries can be written that use this client's interface so functionality can be the same across node and in web without any complicated gymnastics.
npm package: @lukekaalim/http-server
Description: Simple utility library for defining a node server listener from a series of routes
Author: luke kaalim
Latest version: 13.7.0

# @lukekaalim/server

Library for building simple servers.

## Installation
```bash
npm i @lukekaalim/server
```

## Usage

This server will return "Hello World" on port 8080 when requesting "/greetings", and 404 on all other responses.
```js
const { text, route, router } = require('@lukekaalim/server');
const { createServer } = require('http');

const main = () => {
  const myRoute = route(
    'GET',
    '/greetings',
    () => text.plain(200, 'Hello World!')
  );
  const myRouter = router([myRoute]);
  const myServer = createServer(myRouter);

  myServer.listen(8080);
};

main();
```
npm package: @lukekaalim/libstraydice
Description: Typescript data structures and functions for Stray Dice.
Author: Luke Kaalim
Latest version: 1.1.0

# Libstraydice

[![NPM Version](https://img.shields.io/npm/v/%40lukekaalim%2Flibstraydice)](https://www.npmjs.com/package/@lukekaalim/libstraydice)


Typescript data structures and functions for Stray Dice.

```bash
npm i @lukekaalim/libstraydice
```
npm package: @lukekaalim/schema
Description: A generic schema-defining library that can export JSON schemas in multiple formats
Author: luke kaalim
Latest version: 0.6.2

# `@lukekaalim/schema`
_Portable data structure definition toolkit_

Use this API to create 'schema' objects, than can then be exported into a variety of functions, objects or generated code such as:
 - [flow](https://flow.org/)
 - [json-schema](https://json-schema.org/)
 - [superstruct](https://github.com/ianstormtaylor/superstruct)

# Docs
Take a look at our [examples](./example/schemaConstruction.js)
npm package: @lukekaalim/server
Description: Simple utility library for defining a node server listener from a series of routes
Author: luke kaalim
Latest version: 11.0.0

# @lukekaalim/server

Library for building simple servers.

## Installation
```bash
npm i @lukekaalim/server
```

## Usage

This server will return "Hello World" on port 8080 when requesting "/greetings", and 404 on all other responses.
```js
const { text, route, router } = require('@lukekaalim/server');
const { createServer } = require('http');

const main = () => {
  const myRoute = route(
    'GET',
    '/greetings',
    () => text.plain(200, 'Hello World!')
  );
  const myRouter = router([myRoute]);
  const myServer = createServer(myRouter);

  myServer.listen(8080);
};

main();
```
npm package: @lukekaalim/terraform-node-cli
Description: A command line tool to assist in the creation of terraform plugins for nodejs
Author: Luke Kaalim
Latest version: 0.1.0

# `terraform-node-cli`

A CLI utility tool to help setup node terraform projects.

## Init
```bash
node-terraform init
```
Creates a empty project in the current folder.

## Install
```bash
node-terraform install
```
Install the package locally as a terraform provider.
npm package: @lukekaalim/terraform-plugin-sdk
Description: An SDK for developing terraform plugins
Author: Luke Kaalim
Latest version: 4.0.0

# `@lukekaalim/terraform-plugin-sdk`
This project is an npm package that provides tools for building Terraform Plugins.

Terraform plugins can be used to leverage and extend terraform capabilities, allowing new providers and resource types.

## What's a Plugin?
All of terraform's ability to interact with API's comes from [_plugins_](https://www.terraform.io/docs/plugins/index.html). Terraform manages the configuration, orchestration, and dependency resolution on the resources you create, but it's a terraform plugin that allows it to interact with the world.

A plugin composes of an _executable file_ that perform a hashicorp/go-plugin handshake and then opens up a GRPC server.

That GRPC server then implements the terraform-plugin prototypes, providing a Schema (which is a declaration of the provider and all resources that provider manages) and some functions that terraform calls to create or apply terraform plans.

The Terraform Plugin SDK allows you to create plugins declaratively, allowing you create a plugin without needing to perform all the boilerplate work.

## Why create Plugins?
Terraform has a wealth of plugins available to it already created that allow you to manage a vast amount of resources in an interconnected graph, but it doesn't have all of them.

When using terraform, you may wish to:
- Create resources that talk to a proprietary or internal API
- Create resource for an API that doesn't have a provider yet
- Manage a resource for an existing provider that doesn't provide certain functionality
- Disagree with the implementation of an API and want to give yourself greater flexibility
- Model existing build scripts a declarative structures?

## Documentation

Take a look at our [guides](docs/guides.md), our [api](docs/api.md) or some [examples](examples/readme.md).
npm package: @lukekaalim/terraform-service
Description: An implementation of a Terraform Plugin GRPC service
Author: Luke Kaalim
Latest version: 2.0.1

---
title: "@lukekaalim/terraform-service"
layout: default
parent: Packages
nav_order: 6
---
# `@lukekaalim/terraform-service`

Provides a bare-bones implementation of the Terraform GRPC service. Use with `@lukekaalim/hashicorp-go-plugin` to create a terraform plugin.

## Installation
```bash
npm install @lukekaalim/terraform-service
```
## API
### `createTerraformService()`
```js
const { createTerraformService } = require('@lukekaalim/terraform-service');

const options = {
  getSchema,
};

const service = createTerraformService(
  console,        // Console
  server,         // Server
  options,        // ServiceOptions
);
const {
  definition,     // GRPCServiceDefinition
  implementation, // GRPCServiceImplementation
} = service;
```

```ts
const getSchema = async () => ({
  provider,           // Schema
  resourceSchemas,    // { [string]: Schema }
  dataSourceSchemas,  // { [string]: Schema }
  diagnostics,        // Diagnostic[] 
});
```

### `getDynamicValue()`
### `setPackedDynamicValue()`
### `setJSONDynamicValue()`
### `new Unknown()`

## TODO
  -  Finish API documentation
npm package: @lukekaalim/to
Description: A small library to help build typesafe object converters and checkers
Author: lukekaalim
Latest version: 1.2.0

# `@lukekaalim/to`

[![CircleCI](https://circleci.com/gh/lukekaalim/to.svg?style=svg)](https://circleci.com/gh/lukekaalim/to)

There and ~~back again~~.

## Installation

```bash
npm i @lukekaalim/to
```

##  Usage

```javascript
const { toString, toNumber, toObject } = require('@lukekaalim/to');

const toUser = toObject({
  name: toString,
  age: toNumber,
  meta: toObject({
    createdAt: toNumber,
    modifiedAt: toNumber,
  }),
});

const userJson = `
{
  "name": "luke",
  "age": 24,
  "meta": { "createdAt": 0, "modifiedAt": 0 }
}
`;

const user = toUser(JSON.parse(userJson));
```

Recursive object structure checking for typing those pesky models.

## API

#### toAString
```javascript
const { toAString } = require('@lukekaalim/to');

const name = toAString('luke'); // name === 'luke'
```
Identity if the value is a string, throw a `NotStringError` if not.
Naming is seperate than other (Normall would be `toString`) but is different to avoid naming clashes with the standard `object.toString();` method

#### toNumber
```javascript
const { toNumber } = require('@lukekaalim/to');

const age = toNumber(25); // age === 25
```
Identity if the value is a number, throw a `NotNumberError` if not.

#### toBoolean
```javascript
const { toBoolean } = require('@lukekaalim/to');

const isDev = toBoolean(true); // isDev === true
```
Identity if the value is a boolean, throw a `NotBooleanError` if not.

#### toObject
```javascript
const { toObject } = require('@lukekaalim/to');

const toLukeName = value => {
  if (value === 'luke') {
    return value;
  }
  throw new Error('I\'m not luke!');
};

const toLuke = toObject({
  name: toLukeName,
});

const luke = toLuke({ name: 'luke' });
```
Given a map of converters, creates a function that accepts an object (Throws a `NotObjectError` or `ValueWasNullError` error if not), and **creates a new object** with properties based on running the arguments through the converter who's key is the property's key. A converted just needs to accept any value, and return anything.

If a converter throws an error, that error is wrapped in a `PropertyError`.

#### toArray
```javascript
const { toArray } = require('@lukekaalim/to');

const toFunc = value => {
  if (typeof value === 'function') {
    return value;
  }
  throw new Error('Not a function!');
};

const toFuncArray = toArray(toFunc);

const funcArray = toFuncArray([console.log, console.error]);
```
Given a converter, creates a function that accepts an array (Throws a `NotArrayError` error if not), and **creates a new array** with elements based on running the converter through each element. A converter just needs to accept any value, and return anything.

If a element throws an error, that error is wrapped in a `ElementError`.
npm package: @lukekarrys/audiobook
Description: Take some wav files and try to make a chapterized mp3.
Latest version: 0.0.3

# @lukekarrys/audiobook

Take some `wav` files and try to make a chapterized `mp3`.

It's a mess and a hack (see the prereqs), but it kinda sorta works.

## Prereqs:

- `mediainfo`
- `ffmpeg`
- `sox`
- `python@2` + `mutagen`
- `node 8+`

## Usage

```sh
brew install mediainfo ffmpeg sox python@2
pip install mutagen
npm install @lukekarrys/audiobook -g
audiobook \
  # Directory to look for wavfiles
  # Generated files will be put as siblings of this directory
  --dir "./data/wavs" \
  # This will be the name of the generated files and the episodes title
  --title "An Awesome Great Book" \
  # It will look for this file in --dir
  --cover "cover.jpg" \
  # Delete generated files first before running
  # Helpful if you want to run it again from scratch, otherwise
  # the previously generated wav and mp3 files are reused
  --clean true
# Output looks like
# { metadata: {...}, tags: {...} }
```

```sh
data
├── wavs # This directory already existed
│   ├── 1-01 Opening Titles.wav
│   ├── 1-02 Dedication.wav
│   ├── 1-03 Introduction A.wav
│   ├── 1-04 Introduction B.wav
│   ├── 2-01 Chapter 1a.wav
│   ├── 2-02 Chapter 1b.wav
│   ├── 2-03 Chapter 2a.wav
│   ├── 2-04 Chapter 2b.wav
│   ├── 2-05 Chapter 2c.wav
│   ├── 3-01 End Credits.wav
│   └── cover.jpg
├── An Awesome Great Book.mp3  # Generated combined mp3 file w/ chapters
└── An Awesome Great Book.wav  # Generated combined wav file
```

### LICENSE

MIT
npm package: @lukekarrys/dayone-templates
Description: DayOne CLI with template support.
Author: Luke Karrys
Latest version: 1.1.2

dayone-templates
======================

[DayOne CLI](http://help.dayoneapp.com/command-line-interface-cli/) with template support.

**Note: this only works with DayOne v2.**

[![NPM](https://nodei.co/npm/@lukekarrys/dayone-templates.png)](https://nodei.co/npm/@lukekarrys/dayone-templates/)
[![Build Status](https://travis-ci.org/lukekarrys/dayone-templates.png?branch=master)](https://travis-ci.org/lukekarrys/dayone-templates)
[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard)
[![Greenkeeper badge](https://badges.greenkeeper.io/lukekarrys/dayone-templates.svg)](https://greenkeeper.io/)


## Install

**Prereqs**
```
# Install the dayone2 executable
sudo /Applications/Day\ One.app/Contents/Resources/install_cli.sh
```

**CLI**
```
npm install @lukekarrys/dayone-templates -g
```

**Module**
```
npm install @lukekarrys/dayone-templates --save
```


## Usage

This module is a system for creating DayOne entries that are populated via templates and passing data to those templates.

By default `dayone-templates` will look for templates in `~/.config/dayone-templates`. If you want to point it to somewhere else, use the `dir` option.

So first thing you should do is create some [mustache](https://mustache.github.io/) templates in the templates directory. For this example, let's say there's one in there called `run`.

Templates can have front-matter which can be used to populate the template with default data. When you're creating an entry, you can pass in data which will override that default data.

**~/.config/dayone-templates/run**
```
---
title: Run
tags:
  - run
  - workout
---
# {{title}}

**Workout**
{{workout}}

**Result**
{{result}}

**Notes**
{{notes}}
```

Then you can run the `dayone-templates` command. Specify the `name` of the template you just created, and any additional `tags` you want the entry to have. You can also populate any of the template variables. Also since `title` wasn't passed in, it will use the default `title` from the front-matter.

```sh
dayone-templates \
  --name run \
  --tags intervals \
  --workout "4x400" \
  --result "52, 51, 50, 49" \
  --notes "😄"
```

Then you'll have an entry that looks like this:

![](./output.png)


## CLI API

_See [the real dayone CLI](http://help.dayoneapp.com/command-line-interface-cli/) for a list of all available options. All those options can be passed to `dayone-templates` as well._

### `name` (required)

`String`

The name of the template to use. This should be a file located inside the `dir` option.

### `dir` (optional, default: `~/.config/dayone-templates`)

`String`

The directory to look for templates in.


### LICENSE

MIT
npm package: @lukekarrys/entry-watcher
Description: Entry watcher for bracket.club
Author: Luke Karrys
Latest version: 5.1.5
Deprecated: This package is no longer maintained

entry-watcher
==============

Entry watcher for [bracket.club](https://bracket.club).

[![Build Status](https://travis-ci.org/bracketclub/entry-watcher.png?branch=master)](https://travis-ci.org/bracketclub/entry-watcher)
[![Greenkeeper badge](https://badges.greenkeeper.io/bracketclub/entry-watcher.svg)](https://greenkeeper.io/)


## Usage

```js
const EntryWatcher = require('entry-watcher');
new EntryWatcher({
  logger: null,
  sport: 'ncaam',
  year: '2015',
  domain: 'bracket.club',
  tags: ['bracketclub'],
  type: 'tweet',
  auth: {
    // Passed to twitter streaming listener
    // Could be extended in the future based on `options.type`
    'consumer_key': '',
    'consumer_secret': '',
    'access_token': '',
    'access_token_secre': ''
  }
  onSave: function (entry) {
    // Entry is the full entry passsed back
    // plus the `bracket` value
  },
  onError: function () {
    // Can be used to plug in to when there are entries
    // that dont meet the validation such as not having a valid
    // bracket or being outside the time limit
  }
}).start();
```

## Checking a Specific Tweet

```js
new EntryWatcher({
  // All the same options as above
}).find(TWEET_ID)
```

## What is it doing?

It is setting up a Twitter listener using [`twit`](https://github.com/ttezel/twit) and when a tweet is found, it is checking whether it contains a valid bracket. If it does, it will call the `onSave` handler.

## Is it on npm?

Yeah, now that there are publically scoped modules it's at `npm install @lukekarrys/entry-watcher`.

### LICENSE

MIT
npm package: @lukekarrys/eslint-config
Description: My eslint config.
Author: Luke Karrys
Latest version: 6.0.4
Deprecated: This is no longer maintained

# @lukekarrys/eslint-config

[![NPM](https://img.shields.io/npm/v/@lukekarrys/eslint-config.svg)](https://www.npmjs.com/package/@lukekarrys/eslint-config)
[![Build Status](https://img.shields.io/travis/lukekarrys/eslint-config/master.svg)](https://travis-ci.org/lukekarrys/eslint-config)
[![Greenkeeper badge](https://badges.greenkeeper.io/lukekarrys/eslint-config.svg)](https://greenkeeper.io/)

This is my [`eslint`](http://eslint.org/) config.

Use it if you want to write code exactly like me. It's probably not that useful to you though.

I'll probably change stuff quite a bit and just bump the patch version, and leave major versions for when I don't want to update existing projects to lint against the latest config.

Things it does

- `babel-eslint` (or just ES6 for node stuff)
- `react`
- Some stuff copied from `standard`
- Some stuff copied from the old 0.x.y `eslint` defaults


## Usage

```sh
npm install @lukekarrys/eslint-config eslint eslint-plugin-import --save-dev
# If the project does babel/react stuff
npm install @lukekarrys/eslint-config eslint babel-eslint eslint-plugin-{babel,react,classes,promise,import} --save-dev
# Write eslitnrc configs for babel/react stuff
echo '{\n  "extends": "@lukekarrys/eslint-config"\n}' > .eslintrc
# or if its not using babel
echo '{\n  "extends": "@lukekarrys/eslint-config/no-babel"\n}' > .eslintrc
```

## License

MIT
npm package: @lukekarrys/organize-photos
Description: Organize my photos and videos.
Author: Luke Karrys
Latest version: 1.3.3

organize-photos
======================

Organize my photos and videos.

[![NPM](https://nodei.co/npm/@lukekarrys/organize-photos.png)](https://nodei.co/npm/@lukekarrys/organize-photos/)
[![Build Status](https://travis-ci.org/lukekarrys/organize-photos.png?branch=master)](https://travis-ci.org/lukekarrys/organize-photos)
[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard)
[![Greenkeeper badge](https://badges.greenkeeper.io/lukekarrys/organize-photos.svg)](https://greenkeeper.io/)


## Install

**CLI**
```
npm install @lukekarrys/organize-photos -g
```

**Module**
```
npm install @lukekarrys/organize-photos --save
```

## What does this do?

1. Takes a `src` dir and copies *everything* to a `dest` dir
1. Every file copied is cleaned up with the following
    1. Lowercase file extension
    1. Removes trailing ` #5` and ` (3)` from filenames
1. If a file is not a recognized type it is moved to `dest/UNKNOWN`
1. If a file has no date associated, it is moved to `dest/UNSORTED`
1. If a file does have a date, it is moved to `dest/yyyy/mm/dd/yyyy-mm-dd hh:mm:ss.ext`
1. Dates are found by the following
    1. exif `CreateDate` field
    1. Any other exif fields passed in with `exifDate`
    1. Some special filenames like screenshots or photobooth files
    1. If the file is named like `yyyy-mm-dd hh?:mm?:ss?`
    1. A parent directory that is named like `yyyy-mm-dd hh?:mm?:ss?`
1. If no exif dates are found, but a date is found from the path, that will be written to exif data
1. Files are never clobbered but instead `a-z` is appended to the destination until there are no conflicts
1. By default, everything is a dry run (can be changed with `real`)
1. By default, `dest` is never cleared but always added to (can be changed with `clean`)
1. Can optionally `move` all the files instead


### LICENSE

MIT
npm package: @lukekarrys/r2d2
Description: Ring my R2D2 phone.
Author: Luke Karrys
Latest version: 1.0.10

# R2D2

Ring my R2D2 phone.

```
   .-""-.
  /[O] __\
 _|__o LI|_
/ | ==== | \
|_| ==== |_|
 ||" ||  ||
 ||LI  o ||
 ||'----'||
/__|    |__\
```

### Usage

Here's how I have this running currently, future Luke:

**Sync Files to Server**

```sh
ssh server "cd /volume1/docker && rm -rf r2d2/ && mkdir r2d2 && cd r2d2 && curl -L https://github.com/lukekarrys/R2D2/tarball/main | tar xzvf - --strip-components=1"
```

Alternatively run this from this repo on your local machine, to copy everything over before pushing:

```sh
rsync -avh . /Volumes/docker/r2d2 --delete --exclude="node_modules/"
```

**Env Vars**

```sh
ADMIN_USER=USERNAME
ADMIN_SECRET=PASSWORD
```

**Configure and Run Docker Container**

```sh
./build.sh
./run.sh # ./run.sh --interactive locally to debug stuff
```

### CLI

This connects directly to the Asterisk Manager Interface running inside the Docker container:

```sh
npx @lukekarrys/r2d2@latest -h $HOST -u USERNAME -p PASSWORD
```

### Web

Send a `POST` request to port `8000` on the Docker container with a username and password:

```sh
curl $HOST:8000/call -X POST -d "username=USERNAME&password=PASSWORD"
```

If you only want to be able to hit it via this URL, you can not expose port `5038` in the `Dockerfile` and `run.sh` script. The server and AMI are running in the same container.

### Obihai Setup

**Server**
![server instructions](docs/server.png)

**SIP**
![sip instructions](docs/sip.png)

### History

I originally wrote this in 2014 (see the [blog post](http://lukecod.es/2014/03/28/beep-boop-ringing-an-r2d2-telephone-with-obihai-asterisk-and-node/)). I wanted to get it working again, so now it's a Docker container and CLI that can be run via `npx`.
npm package: @lukekarrys/score-watcher
Description: Score watcher for brakcet.club.
Author: Luke Karrys
Latest version: 5.2.4
Deprecated: This package is no longer maintained

score-watcher
==============

[![Greenkeeper badge](https://badges.greenkeeper.io/bracketclub/score-watcher.svg)](https://greenkeeper.io/)
[![Build Status](https://travis-ci.org/bracketclub/score-watcher.png?branch=master)](https://travis-ci.org/bracketclub/score-watcher)

Score watcher for [bracket.club](https://bracket.club).

## Usage

```js
const ScoreWatcher = require('score-watcher');

new ScoreWatcher({
    // Required
    sport: 'ncaam',
    year: '2015',
    // An optional bracket to initialize the updater with
    // Will default to an empty bracket for the sport/year
    master: '',
    // Optional log file
    logger: null,
    // The callbacks
    onSave: function (master, cb) {
        // Will be called with each master as a string
        // `cb` is optional but should be used to ensure
        // that each bracket is saved before moving to
        // the next one
    },
    scores: {
        // Config for scores module
        interval: '1m',
        url: 'http://url.com'
    }
}).start();

```

## What is it doing?

It is setting up an async.queue and creating a watcher/emitter with [`scores`](http://github.com/bracketclub/scores). Then every time the queue drains, it calls `onSave` with the latest master (and an optional callback to notify the watcher when it has been added).

## Is it on npm?

Yeah, now that there are publically scoped modules it's at `npm install @lukekarrys/score-watcher`.

### LICENSE

MIT
npm package: @lukemorales/eslint-config
Description: ESLint and Prettier Config from Luke Morales
Author: Luke Morales
Latest version: 1.0.16
Deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.

# Eslint and Prettier Setup
These are my settings for ESLint and Prettier

## What it does
* Lints Typescript based on the latest standards
* Fixes issues and formatting errors with Prettier
* Lints + Fixes React via eslint-config-airbnb
* You can see all the [rules here](https://github.com/lukemorales/eslint-config-lukemorales/blob/master/.eslintrc.json).

## Installing

1. Use the following command to install all the necessary deps **(remove the -Y if you don't use Yarn)**:

```
npx install-peerdeps --dev @lukemorales/eslint-config -Y
```

2. You can see in your package.json there are now a big list of devDependencies.

3. Add the following code to your `package.json`:

```json
"eslintConfig": {
   "extends": [
      "@lukemorales"
   ],
},
```

You can alternatively create a `.eslintrc` file in the root of your project's directory (it should live where package.json does). Your `.eslintrc` file should look like this:

```json
{
  "extends": [
    "@lukemorales"
  ],
}
```

4. You can add two scripts to your package.json to lint and/or fix:

```json
"scripts": {
  "lint": "eslint .",
  "lint:fix": "eslint . --fix"
},
```

5. Now you can manually lint your code by running `npm run lint` and fix all fixable issues with `npm run lint:fix`. You probably want your editor to do this though.

## Settings

If you'd like to overwrite eslint or prettier settings, you can add the rules in your `.eslintrc` file. The [ESLint rules](https://eslint.org/docs/rules/) go directly under `"rules"` while [prettier options](https://prettier.io/docs/en/options.html) go under `"prettier/prettier"`. Note that prettier rules overwrite anything in my config (trailing comma, and single quote), so you'll need to include those as well.

```js
{
  "extends": [
    "@lukemorales"
  ],
  "rules": {
    "no-console": "off"
  }
}
```

## With Create React App

1. Run `npx install-peerdeps --dev @lukemorales/eslint-config`
1. Crack open your `package.json` and replace `"extends": "react-app"` with `"extends": "@lukemorales"`
npm package: @lukemorales/prettier-config
Description: ## 📦 Install
Latest version: 1.1.1

# Prettier config

## 📦 Install

This Prettier config is available as a package on NPM, install with your favorite package manager:

```dircolors
npm install @lukemorales/prettier-config
```

## ⚡ Quick start
Add the following code to your `package.json`:

```json
"prettier": "@lukemorales/prettier-config"
```

You can alternatively create a `.prettierrc` file in the root of your project's directory. Your `.prettierrc` file should look like this:

```json
"@lukemorales/prettier-config"
```

Add scripts to your `package.json` to format and fix:

```json
"scripts": {
  "format": "prettier --check .",
  "format:fix": "prettier --write ."
},
```

## 📝 Formatting configurations

This package exposes different formatting configurations:

### Default

Contains opinionated formatting rules.

```json
"prettier": "@lukemorales/prettier-config"
```

### TailwindCSS

Extends the default configuration and adds the `tailwindcss` plugin.

```json
"prettier": "@lukemorales/prettier-config/with-tailwind"
```
> If you're using this configuration, make sure to install the `prettier-plugin-tailwindcss` peerDependency
npm package: @lukemorales/tsconfig
Description: This is an official pnpm starter turborepo.
Latest version: 0.0.1

# Turborepo starter

This is an official pnpm starter turborepo.

## What's inside?

This turborepo uses [pnpm](https://pnpm.io) as a package manager. It includes the following packages/apps:

### Packages

- `eslint-config-lukemorales`: `eslint` configurations (includes `eslint-config-next` and `eslint-config-prettier`)
- `tsconfig`: `tsconfig.json`s used throughout the monorepo

Each package is 100% [TypeScript](https://www.typescriptlang.org/).

### Utilities

This turborepo has some additional tools already setup for you:

- [TypeScript](https://www.typescriptlang.org/) for static type checking
- [ESLint](https://eslint.org/) for code linting
- [Prettier](https://prettier.io) for code formatting

### Build

To build all apps and packages, run the following command:

```
cd my-turborepo
pnpm run build
```

### Develop

To develop all apps and packages, run the following command:

```
cd my-turborepo
pnpm run dev
```

### Remote Caching

Turborepo can use a technique known as [Remote Caching](https://turborepo.org/docs/core-concepts/remote-caching) to share cache artifacts across machines, enabling you to share build caches with your team and CI/CD pipelines.

By default, Turborepo will cache locally. To enable Remote Caching you will need an account with Vercel. If you don't have an account you can [create one](https://vercel.com/signup), then enter the following commands:

```
cd my-turborepo
pnpm dlx turbo login
```

This will authenticate the Turborepo CLI with your [Vercel account](https://vercel.com/docs/concepts/personal-accounts/overview).

Next, you can link your Turborepo to your Remote Cache by running the following command from the root of your turborepo:

```
pnpm dlx turbo link
```

## Useful Links

Learn more about the power of Turborepo:

- [Pipelines](https://turborepo.org/docs/core-concepts/pipelines)
- [Caching](https://turborepo.org/docs/core-concepts/caching)
- [Remote Caching](https://turborepo.org/docs/core-concepts/remote-caching)
- [Scoped Tasks](https://turborepo.org/docs/core-concepts/scopes)
- [Configuration Options](https://turborepo.org/docs/reference/configuration)
- [CLI Usage](https://turborepo.org/docs/reference/command-line-reference)
npm package: @lukeocodes/changelog-log
Description: GitHub Action: detect new changelog entries and post JSON webhooks
Author: Luke Oliff
Latest version: 0.1.7

# Changelog Log

GitHub Action that detects new changelog entries and posts them as structured JSON to a webhook.

## Features

- 🎯 Git diff-based - Only parses lines actually added
- 📝 Structured JSON output with sections and bullets
- 🚀 Posts to any webhook with custom headers
- 📋 Supports Keep a Changelog & Conventional Changelog formats
- 🔧 Configurable glob patterns and entry separators

## Quick Start

```yaml
name: Changelog Log
on:
  push:
    branches: [main]
    paths: ["**/CHANGELOG*.md"]

jobs:
  notify:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - uses: lukeocodes/changelog-log@v1
        with:
          webhook_url: ${{ secrets.CHANGELOG_WEBHOOK_URL }}
```

## Configuration

| Input                   | Required | Default               | Description                                   |
| ----------------------- | -------- | --------------------- | --------------------------------------------- |
| `webhook_url`           | Yes      | -                     | Destination URL for JSON payload              |
| `file_globs`            | No       | `CHANGELOG.md,**/...` | Changelog file patterns to watch              |
| `entry_separator_regex` | No       | `^##\s+.*$`           | Regex for entry headers                       |
| `http_method`           | No       | `POST`                | HTTP method (POST/PUT/PATCH)                  |
| `webhook_headers_json`  | No       | -                     | Extra headers as JSON string                  |
| `extra_body_json`       | No       | -                     | Extra fields to merge into payload            |
| `include_body_raw`      | No       | `false`               | Include unparsed entry text                   |
| `log_level`             | No       | `warn`                | Log level (trace/debug/info/warn/error/fatal) |

## JSON Payload

```json
{
  "filePath": "CHANGELOG.md",
  "commit": { "before": "abc123...", "after": "def456..." },
  "header": "## [1.2.3] - 2025-10-17",
  "version": "1.2.3",
  "date": "2025-10-17",
  "sections": {
    "Added": ["New feature X"],
    "Fixed": ["Bug Z"]
  }
}
```

### Custom Fields

Use `extra_body_json` to add custom fields to the payload:

```yaml
- uses: lukeocodes/changelog-log@v1
  with:
    webhook_url: ${{ secrets.WEBHOOK_URL }}
    extra_body_json: '{"project":"myapp","environment":"production"}'
```

This will merge the extra fields into the payload:

```json
{
  "filePath": "CHANGELOG.md",
  "version": "1.2.3",
  "project": "myapp",
  "environment": "production",
  ...
}
```

## Contributing

See [CONTRIBUTING.md](./CONTRIBUTING.md). Use conventional commits for PRs.

## License

MIT © [Luke Oliff](https://lukeoliff.com)
npm package: @lukepeavey/graphql-import
Description: [![CircleCI](https://circleci.com/gh/prisma/graphql-import.svg?style=shield)](https://circleci.com/gh/prisma/graphql-import) [![npm version](https://badge.fury.io/js/graphql-import.svg)](https://badge.fury.io/js/graphql-import)
Latest version: 0.0.0-semantic-release

# graphql-import

[![CircleCI](https://circleci.com/gh/prisma/graphql-import.svg?style=shield)](https://circleci.com/gh/prisma/graphql-import) [![npm version](https://badge.fury.io/js/graphql-import.svg)](https://badge.fury.io/js/graphql-import)

Import &amp; export definitions in GraphQL SDL (also refered to as GraphQL modules)

> There is also a [`graphql-import-loader`](https://github.com/prisma/graphql-import-loader) for Webpack available.

## Install

```sh
yarn add graphql-import
```

## Usage

```ts
import { importSchema } from 'graphql-import'
import { makeExecutableSchema } from 'graphql-tools'

const typeDefs = importSchema('schema.graphql')
const resolvers = {}

const schema = makeExecutableSchema({ typeDefs, resolvers })
```

Assume the following directory structure:

```
.
├── schema.graphql
├── posts.graphql
└── comments.graphql
```

`schema.graphql`

```graphql
# import Post from "posts.graphql"

type Query {
  posts: [Post]
}
```

`posts.graphql`

```graphql
# import Comment from 'comments.graphql'

type Post {
  comments: [Comment]
  id: ID!
  text: String!
  tags: [String]
}
```

`comments.graphql`

```graphql
type Comment {
  id: ID!
  text: String!
}
```

Running `console.log(importSchema('schema.graphql'))` produces the following output:

```graphql
type Query {
  posts: [Post]
}

type Post {
  comments: [Comment]
  id: ID!
  text: String!
  tags: [String]
}

type Comment {
  id: ID!
  text: String!
}
```

## [Full documentation](https://oss.prisma.io/content/graphql-import/overview)

## Related topics & next steps

- Static import step as build time
- Namespaces
- Support importing from HTTP endpoints (or [Links](https://github.com/apollographql/apollo-link))
- Create RFC to add import syntax to GraphQL spec

<p align="center"><a href="https://oss.prisma.io"><img src="https://imgur.com/IMU2ERq.png" alt="Prisma" height="170px"></a></p>
npm package: @lukepeavey/react-redux
Description: Official React bindings for Redux
Author: Dan Abramov
Latest version: 5.1.0-test.1

React Redux
=========================

Official React bindings for [Redux](https://github.com/reduxjs/redux).  
Performant and flexible.

[![build status](https://img.shields.io/travis/reduxjs/react-redux/master.svg?style=flat-square)](https://travis-ci.org/reduxjs/react-redux) [![npm version](https://img.shields.io/npm/v/react-redux.svg?style=flat-square)](https://www.npmjs.com/package/react-redux)
[![npm downloads](https://img.shields.io/npm/dm/react-redux.svg?style=flat-square)](https://www.npmjs.com/package/react-redux)
[![redux channel on discord](https://img.shields.io/badge/discord-redux@reactiflux-61DAFB.svg?style=flat-square)](http://www.reactiflux.com)


## Installation

React Redux requires **React 0.14 or later.**

```
npm install --save react-redux
```

This assumes that you’re using [npm](http://npmjs.com/) package manager with a module bundler like [Webpack](https://webpack.js.org/) or [Browserify](http://browserify.org/) to consume [CommonJS modules](http://webpack.github.io/docs/commonjs.html).

If you don’t yet use [npm](http://npmjs.com/) or a modern module bundler, and would rather prefer a single-file [UMD](https://github.com/umdjs/umd) build that makes `ReactRedux` available as a global object, you can grab a pre-built version from [cdnjs](https://cdnjs.com/libraries/react-redux). We *don’t* recommend this approach for any serious application, as most of the libraries complementary to Redux are only available on [npm](http://npmjs.com/).

## React Native

As of React Native 0.18, React Redux 5.x should work with React Native. If you have any issues with React Redux 5.x on React Native, run `npm ls react` and make sure you don’t have a duplicate React installation in your `node_modules`. We recommend that you use `npm@3.x` which is better at avoiding these kinds of issues.

If you are on an older version of React Native, you’ll need to keep using [React Redux 3.x branch and documentation](https://github.com/reduxjs/react-redux/tree/v3.1.0) because of [this problem](https://github.com/facebook/react-native/issues/2985).

## Documentation

- [Redux: Usage with React](https://redux.js.org/basics/usage-with-react)
- [API](docs/api.md#api)
  - [`<Provider store>`](docs/api.md#provider-store)
  - [`connect([mapStateToProps], [mapDispatchToProps], [mergeProps], [options])`](docs/api.md#connectmapstatetoprops-mapdispatchtoprops-mergeprops-options)
- [Troubleshooting](docs/troubleshooting.md#troubleshooting)

## How Does It Work?

We do a deep dive on how React Redux works in [this readthesource episode](https://www.youtube.com/watch?v=VJ38wSFbM3A).  
Enjoy!

## License

MIT
npm package: @lukeramsden/postgraphile-plugin-fulltext-filter
Description: Full text searching on tsvector fields for use with postgraphile-plugin-connection-filter
Author: Mark Lipscombe
Latest version: 2.0.0

[![Package on npm](https://img.shields.io/npm/v/postgraphile-plugin-fulltext-filter.svg)](https://www.npmjs.com/package/postgraphile-plugin-fulltext-filter)
[![CircleCI](https://circleci.com/gh/mlipscombe/postgraphile-plugin-fulltext-filter/tree/master.svg?style=svg)](https://circleci.com/gh/mlipscombe/postgraphile-plugin-fulltext-filter/tree/master)

# postgraphile-plugin-fulltext-filter
This plugin implements a full text search operator for `tsvector` columns in PostGraphile v4 via @mattbretl's excellent `postgraphile-plugin-connection-filter` plugin.

## Getting Started

### CLI

``` bash
postgraphile --append-plugins postgraphile-plugin-connection-filter,postgraphile-plugin-fulltext-filter
```

See [here](https://www.graphile.org/postgraphile/extending/#loading-additional-plugins) for
more information about loading plugins with PostGraphile.

### Library

``` js
const express = require('express');
const { postgraphile } = require('postgraphile');
const PostGraphileConnectionFilterPlugin = require('postgraphile-plugin-connection-filter');
const PostGraphileFulltextFilterPlugin = require('postgraphile-plugin-fulltext-filter');

const app = express();

app.use(
  postgraphile(pgConfig, schema, {
    appendPlugins: [
      PostGraphileConnectionFilterPlugin,
      PostGraphileFulltextFilterPlugin,
    ],
  })
);

app.listen(5000);
```

## Performance

All `tsvector` columns that aren't @omit'd should have indexes on them:

``` sql
ALTER TABLE posts ADD COLUMN full_text tsvector;
CREATE INDEX full_text_idx ON posts USING gin(full_text);
```

## Operators

This plugin adds the `matches` filter operator to the filter plugin, accepting
a GraphQL String input and using the `@@` operator to perform full-text searches
on `tsvector` columns.

This plugin uses [pg-tsquery](https://github.com/caub/pg-tsquery) to parse the
user input to prevent Postgres throwing on bad user input unnecessarily.

## Fields

For each `tsvector` column, a rank column will be automatically added to the 
GraphQL type for the table by appending `Rank` to the end of the column's name.
For example, a column `full_text` will appear as `fullText` in the GraphQL type,
and a second column, `fullTextRank` will be added to the type as a `Float`.

This rank field can be used for ordering and is automatically added to the orderBy
enum for the table.

## Examples

``` graphql
query {
  allPosts(
    filter: {
      fullText: { matches: 'foo -bar' }
    }
    orderBy: FULL_TEXT_RANK_DESC
  }) {
    ...
    fullTextRank
  }
}
```
npm package: @lukeramsden/postgraphile-upsert-plugin
Description: add postgres upsert mutations to postgraphile
Latest version: 2.0.0

# postgraphile-upsert-plugin

Add postgres `upsert` mutations to [postgraphile](https://www.graphile.org/postgraphile).

[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com) [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) [![Greenkeeper badge](https://badges.greenkeeper.io/cdaringe/postgraphile-upsert.svg)](https://greenkeeper.io/) [![CircleCI](https://circleci.com/gh/cdaringe/postgraphile-upsert.svg?style=svg)](https://circleci.com/gh/cdaringe/postgraphile-upsert)

## Getting Started

### Install

```bash
yarn add @lukeramsden/postgraphile-upsert-plugin
```

### CLI

```bash
postgraphile --append-plugins @lukeramsden/postgraphile-upsert-plugin:PgMutationUpsertPlugin
```

See [here](https://www.graphile.org/postgraphile/extending/#loading-additional-plugins) for
more information about loading plugins with PostGraphile.

### Library

```js
const express = require("express");
const { postgraphile } = require("postgraphile");
const {
  PgMutationUpsertPlugin
} = require("@lukeramsden/postgraphile-upsert-plugin");

const app = express();

app.use(
  postgraphile(pgConfig, schema, {
    appendPlugins: [PgMutationUpsertPlugin]
  })
);

app.listen(5000);
```

## Usage

This plugin creates an addition operation to `upsert<Table>` using a `where` clause, which is any unique constraint on the table. Supports multi-column unique indexes.

## Example

```sql
create table bikes (
  id serial PRIMARY KEY,
  "serialNumber" varchar UNIQUE NOT NULL,
  weight real,
  make varchar,
  model varchar
)
```

An upsert would look like this:

```graphql
mutation {
  upsertBike(
    where: { serialNumber: "abc123" }
    input: {
      bike: {
        serialNumber: "abc123"
        weight: 25.6
        make: "kona"
        model: "cool-ie deluxe"
      }
    }
  ) {
    clientMutationId
  }
}
```

## Credits

- This is a fork of the "upsert with where" [postgraphile-upsert-plugin](https://github.com/jashmenn/postgraphile-upsert-plugin)
- Which itself is a fork of the [TypeScript postgraphile-upsert-plugin](https://github.com/cdaringe/postgraphile-upsert)
- Which itself is a fork of [the original upsert plugin](https://github.com/einarjegorov/graphile-upsert-plugin/blob/master/index.js)
npm package: @lukeshay/eslint-config
Description: My eslint configuration
Author: Luke Shay
Latest version: 1.0.3
Deprecated: Archived

<h1 align="center">Welcome to @lukeshay/eslint-config-typescript 👋</h1>
<p>
  <img alt="Version" src="https://img.shields.io/badge/version-0.0.0-blue.svg?cacheSeconds=2592000" />
  <a href="https://github.com/LukeShay/lukeshay-web#readme" target="_blank">
    <img alt="Documentation" src="https://img.shields.io/badge/documentation-yes-brightgreen.svg" />
  </a>
  <a href="https://github.com/LukeShay/lukeshay-web/graphs/commit-activity" target="_blank">
    <img alt="Maintenance" src="https://img.shields.io/badge/Maintained%3F-yes-green.svg" />
  </a>
  <a href="https://github.com/LukeShay/lukeshay-web/blob/master/LICENSE" target="_blank">
    <img alt="License: MIT" src="https://img.shields.io/github/license/LukeShay/@lukeshay/eslint-config-typescript" />
  </a>
</p>

> My eslint configuration

### 🏠 [Homepage](https://github.com/LukeShay/lukeshay-web#readme)

## Author

👤 **Luke Shay <shay.luke17@gmail.com>**

* Github: [@LukeShay](https://github.com/LukeShay)

## 🤝 Contributing

Contributions, issues and feature requests are welcome!<br />Feel free to check [issues page](https://github.com/LukeShay/lukeshay-web/issues). You can also take a look at the [contributing guide](https://github.com/LukeShay/lukeshay-web/blob/master/CONTRIBUTING.md).

## Show your support

Give a ⭐️ if this project helped you!

## 📝 License

Copyright © 2020 [Luke Shay <shay.luke17@gmail.com>](https://github.com/LukeShay).<br />
This project is [MIT](https://github.com/LukeShay/lukeshay-web/blob/master/LICENSE) licensed.

***
_This README was generated with ❤️ by [readme-md-generator](https://github.com/kefranabg/readme-md-generator)_
npm package: @lukeshay/eslint-config-typescript
Description: My eslint configuration for typescript.
Author: Luke Shay
Latest version: 1.0.4
Deprecated: Archived

<h1 align="center">Welcome to @lukeshay/eslint-config-typescript 👋</h1>
<p>
  <a href="https://www.npmjs.com/package/@lukeshay/eslint-config-typescript" target="_blank">
    <img alt="Version" src="https://img.shields.io/npm/v/@lukeshay/eslint-config-typescript.svg">
  </a>
  <a href="https://github.com/LukeShay/lukeshay-web#readme" target="_blank">
    <img alt="Documentation" src="https://img.shields.io/badge/documentation-yes-brightgreen.svg" />
  </a>
  <a href="https://github.com/LukeShay/lukeshay-web/graphs/commit-activity" target="_blank">
    <img alt="Maintenance" src="https://img.shields.io/badge/Maintained%3F-yes-green.svg" />
  </a>
  <a href="https://github.com/LukeShay/lukeshay-web/blob/master/LICENSE" target="_blank">
    <img alt="License: MIT" src="https://img.shields.io/github/license/LukeShay/@lukeshay/eslint-config-typescript" />
  </a>
</p>

> My eslint configuration for typescript.

### 🏠 [Homepage](https://github.com/LukeShay/lukeshay-web#readme)

## Install

```sh
npm install
```

## Run tests

```sh
npm run test
```

## Author

👤 **Luke Shay <https://github.com/LukeShay>**

* Github: [@LukeShay](https://github.com/LukeShay)

## 🤝 Contributing

Contributions, issues and feature requests are welcome!<br />Feel free to check [issues page](https://github.com/LukeShay/lukeshay-web/issues). You can also take a look at the [contributing guide](https://github.com/LukeShay/lukeshay-web/blob/master/CONTRIBUTING.md).

## Show your support

Give a ⭐️ if this project helped you!

## 📝 License

Copyright © 2020 [Luke Shay <https://github.com/LukeShay>](https://github.com/LukeShay).<br />
This project is [MIT](https://github.com/LukeShay/lukeshay-web/blob/master/LICENSE) licensed.

***
_This README was generated with ❤️ by [readme-md-generator](https://github.com/kefranabg/readme-md-generator)_
npm package: @lukeshay/next-ga
Description: Adds Google Analytics to your Next.js application. For it to work, you need the environment variable `NEXT_PUBLIC_GOOGLE_ANALYTICS_ID` to be set.
Author: Luke Shay
Latest version: 0.5.0

# @lukeshay/next-ga

Adds Google Analytics to your Next.js application. For it to work, you need the environment variable `NEXT_PUBLIC_GOOGLE_ANALYTICS_ID` to be set.

To set up, you need `<GoogleAnalytics />` to be added to your document component in the `Head`. Then add `useAppInit()` in your app component. To record web vitals, you can export `reportWebVitals` from your app component.

## Example

`pages/_document.js`:

```javascriptreact
import Document, { Html, Head, Main, NextScript } from 'next/document';
import { GoogleAnalytics } from '@lukeshay/next-ga';

class MyDocument extends Document {
  render() {
    return (
      <Html>
        <Head>
          <GoogleAnalytics />
        </Head>
        <body>
          <Main />
          <NextScript />
        </body>
      </Html>
    );
  }
}
```

`pages/_app.js`:

```javascriptreact
import { useAppInit, reportWebVitals } from '@lukeshay/next-ga';

export default function MyApp() {
  GoogleAnalytics.useAppInit();
  ...
};

export reportWebVitals;
```
npm package: @lukeshay/next-router
Description: Adds basic routing to Next.js API routes. Also allows for wrapping handler functions to mutate the context that is being passed in.
Author: Luke Shay
Latest version: 0.5.0

# @lukeshay/next-router

Adds basic routing to Next.js API routes. Also allows for wrapping handler functions to mutate the context that is being passed in.

## Example

`pages/api/hello.js`:

```javascript
import { router } from "@lukeshay/next-router";

const wrapper = (req, res, handler) => handler({ req, res, wrapped: true });

const get = (ctx) => ctx.res.json({ message: "Hello, World!" });

export default middleware(wrapper).get(get).handler();
```
npm package: @lukeshay/prettier-config
Description: The prettier config I use on my projects.
Author: Luke Shay
Latest version: 0.5.0

# @lukeshay/prettier-config

The prettier config I use on my projects.

## Getting Started

Install using the package manager of your choice.

```
npm i -D prettier @lukeshay/prettier-config
```

```
pnpm i -D prettier @lukeshay/prettier-config
```

```
yarn add -D prettier @lukeshay/prettier-config
```

Create a file named `.prettierrc.cjs` with the following contents.

```js
module.exports = {
  ...require("@lukeshay/prettier-config"),
};
```