open-index/open-npm huggingface dataset:
npm package: @liamattclarke/vector-n
Description: Simple vector classes written in Typescript
Author: Liam A. Clarke
Latest version: 1.0.2

# vector-n

Simple vector classes written in Typescript.

[Documentation](https://atticus.dev/vector-n/)

## Installation
```
npm install --save @liamattclarke/vector-n
```

## Example:
```
import { Vector2 } from "vector-n";

const v1 = new Vector2(4, 2);

v1.normalize()
  .negate()
  .rotateDeg(45);
```

## TODOs
- Add Vector3 class
npm package: @liamb13/edubank-ui-qiconpicker
Description: QIconPicker - Quasar component
Author: Liam Barr
Latest version: 1.1.5

# EdubankQIconPicker (Quasar v2, UMD and Vue v3 Compatible)

Based on [QIconPicker by Jeff Galbraith and Razvan Stoenescu (Quasar Framework)](https://github.com/quasarframework/quasar-ui-qiconpicker)
It's likely that's the package you're looking for.

This version adds a custom icon collection (edubank-icons) to QIconPicker.
Although QIconPicker supports custom icons with prop `icons`, I found it to be slower than the `icon-set` option.

Icons for EduBank are using [Fluent System Icons](https://icons8.com/l/fluency-system/)

[![npm](https://img.shields.io/npm/v/@liamb13/edubank-ui-qiconpicker/next?label=@liamb13/edubank-ui-qiconpicker)](https://www.npmjs.com/package/@liamb13/edubank-ui-qiconpicker)
[![npm](https://img.shields.io/npm/dt/@liamb13/edubank-ui-qiconpicker.svg)](https://www.npmjs.com/package/@liamb13/edubank-ui-qiconpicker)

EdubankQIconPicker is a [Quasar](https://quasar.dev) component. It creates an Icon Picker for EduBank.

![EdubankQIconPicker](https://user-images.githubusercontent.com/69778531/189470468-c6b638f5-9eff-4598-a9c8-da8ba0c36e45.png)

# Examples and Documentation

Original documentation and examples [Can be found here](https://quasarframework.github.io/quasar-ui-qiconpicker)
Only variation is ability to use `edubank-icons` in `icon-set`

# Building the Projects

## Setup

In both the `ui` and `ui/dev` folders:

```bash
$ yarn
```

## Developing

In the `ui` folder

```bash
# start dev in SPA mode
$ yarn dev

# start dev in UMD mode
$ yarn dev:umd

# start dev in SSR mode
$ yarn dev:ssr

# start dev in Cordova iOS mode
$ yarn dev:ios

# start dev in Cordova Android mode
$ yarn dev:android

# start dev in Electron mode
$ yarn dev:electron
```

## Building package

```bash
$ yarn build
```

# build just the JSON API

```bash
$ yarn build:api
```

# Donate

This package wouldn't be possible without the hard work done before me. Please consider donating to [Quasar](https://donate.quasar.dev) or [Jeff Galbraith](https://github.com/sponsors/hawkeye64).

# License

MIT (c) Jeff Galbraith <jeff@quasar.dev>

MIT (c) Liam Barr <liam@lbarr.com>
npm package: @liamb13/gea-icons-react
Description: Includes a handful of farming icons as React components.
Author: liamb13
Latest version: 1.1.12

# React Icons for GEA

Includes a handful of farming icons as React components.

## Installation (for standard modern project)

```bash
yarn add @liamb13/gea-icons-react
# or
npm install @liamb13/gea-icons-react --save
```

example usage

```jsx
import { FiCarrotAltIcon } from "@liamb13/gea-icons-react"

function Question() {
  return (
    <h3>
      It's <FiCarrotAltIcon /> season
    </h3>
  )
}
```
npm package: @liamb13/sanity-plugin-gea-icons
Description: A Sanity plugin for GEA specific icons
Author: Christopher Af Bjur
Latest version: 1.1.12

# sanity-plugin-gea-icons

> This is a **Sanity Studio v3** plugin.

## Installation

```sh
npm install sanity-plugin-gea-icons
```

## Usage

Add it as a plugin in `sanity.config.ts` (or .js):

```ts
import {defineConfig} from 'sanity'
import {myPlugin} from 'sanity-plugin-gea-icons'

export default defineConfig({
  //...
  plugins: [myPlugin({})],
})
```

## License

[MIT](LICENSE) © liamb13

## Develop & test

This plugin uses [@sanity/plugin-kit](https://github.com/sanity-io/plugin-kit)
with default configuration for build & watch scripts.

See [Testing a plugin in Sanity Studio](https://github.com/sanity-io/plugin-kit#testing-a-plugin-in-sanity-studio)
on how to run this plugin with hotreload in the studio.
npm package: @liamcottle/huawei-e8372h.js
Description: NodeJS library for interacting with a Huawei E8372H LTE USB modem
Author: Liam Cottle
Latest version: 0.0.1

# Huawei E8372H

This is a NodeJS library for interacting with the [Huawei E8372H](https://consumer.huawei.com/en/routers/e8372/) LTE USB modem.

## Install

To use this library in your own NodeJS app, you can install it via npm.

```shell
npm install @liamcottle/huawei-e8372h.js
```

## Example

```js
const Modem = require('@liamcottle/huawei-e8372h.js');
const modem = new Modem('192.168.8.1', 'admin', 'admin');

// log in to modem before using any features
modem.login().then(async () => {

    // list sms messages
    const messages = await modem.api.sms.list();
    console.log(messages);

    // send an sms
    // await modem.api.sms.send('+64210000000', 'message content');
    
    // logout of modem
    await modem.logout();
    
});
```

## Supported Features

- [x] Listing SMS from Inbox/Outbox.
- [x] Sending SMS to multiple phone numbers.
- [x] Marking SMS on the modem as read.
- [x] Deleting SMS from the modem.

```js
modem.api.sms.list();
modem.api.sms.send();
modem.api.sms.markAsRead();
modem.api.sms.delete();
```


## Password Types

- `password_type=3`: password is base64 encoded.
- `password_type=4`: username, password and token are base64 and hex encoded.

## References

- https://github.com/arska/e3372/issues/1
- https://github.com/evert-arias/huawei-e8372h
- https://github.com/avinh/Huawei-E8372h-toggle-on-off/blob/master/app.js
- https://github.com/manoaratefy/huawei-e8372-api
npm package: @liamcottle/meshcore.js
Description: A Javascript library for interacting with a [MeshCore](https://github.com/meshcore-dev/MeshCore) device running the [Companion Radio Firmware](https://github.com/meshcore-dev/MeshCore/blob/main/examples/companion_radio/main.cpp).
Author: Liam Cottle
Latest version: 1.13.0

# MeshCore.js

A Javascript library for interacting with a [MeshCore](https://github.com/meshcore-dev/MeshCore) device running the [Companion Radio Firmware](https://github.com/meshcore-dev/MeshCore/blob/main/examples/companion_radio/main.cpp).

This library can be used in a Web Browser to connect to MeshCore Companion devices over BLE or USB Serial.

It can also be used in NodeJS to connect to MeshCore Companion devices over TCP/WiFi or USB Serial.

## Supported Connection Methods

- Web Browser
  - BLE: [WebBleConnection()](./src/connection/web_ble_connection.js)
  - USB/Serial: [WebSerialConnection()](./src/connection/web_serial_connection.js)
- NodeJS
  - TCP/WiFi: [TCPConnection("host", "port")](./src/connection/tcp_connection.js)
  - USB/Serial: [NodeJSSerialConnection("/dev/ttyUSB0")](./src/connection/nodejs_serial_connection.js)

## Install

```
npm install @liamcottle/meshcore.js
```

## Simple Example

```
import { TCPConnection, NodeJSSerialConnection } from "@liamcottle/meshcore.js";

// serial connections are supported by "companion_radio_usb" firmware
const connection = new NodeJSSerialConnection("/dev/cu.usbmodem14401");

// tcp connections are supported by "companion_radio_wifi" firmware
// const connection = new TCPConnection("10.1.0.226", 5000);

// wait until connected
connection.on("connected", async () => {

    // we are now connected
    console.log("connected!");

    // log contacts
    const contacts = await connection.getContacts();
    for(const contact of contacts) {
        console.log(`Contact: ${contact.advName}`);
    }

    // disconnect
    connection.close();

});

// connect to meshcore device
await connection.connect();
```

## Examples

There's a few other examples scripts in the [examples](./examples) folder.

## License

MIT
npm package: @liamcottle/meshtastic-websocket-proxy
Description: Proxies [ToRadio](https://github.com/meshtastic/protobufs/blob/master/meshtastic/mesh.proto#L1426) and [FromRadio](https://github.com/meshtastic/protobufs/blob/master/meshtastic/mesh.proto#L1336) packets between a single Meshtastic device and multiple web
Latest version: 0.0.3

# Meshtastic Websocket Proxy

Proxies [ToRadio](https://github.com/meshtastic/protobufs/blob/master/meshtastic/mesh.proto#L1426) and [FromRadio](https://github.com/meshtastic/protobufs/blob/master/meshtastic/mesh.proto#L1336) packets between a single Meshtastic device and multiple websocket clients.

The `/api/v1/fromradio` endpoint of the [Meshtastic HTTP API](https://meshtastic.org/docs/development/device/http-api/) only supports one client connection at a time. If you have more than one client fetching the `fromradio` endpoint, one of the clients will "consume" those packets from the device, and they will not be received by the other clients.

This project expects to be the only client connecting to your Meshtastic device. It runs a simple websocket server, which will forward all `FromRadio` packets received from the device to all clients connected to the websocket.

You will be able to connect multiple clients to the websocket, as all connected clients will receive the same packets. The websocket also allows multiple clients to send packets to the radio at the same time.

## How to run it?

```
node src/index.js --help
```

```
Meshtastic Websocket Proxy

  Proxies ToRadio and FromRadio packets between a single Meshtastic device and multiple WebSocket clients.                                                   

Options

  -h, --help                 Display this usage guide.
  --meshtastic-host string   IP address of Meshtastic device (default: 127.0.0.1)
  --meshtastic-tls string    Use TLS when connecting to Meshtastic device (default: true)
  --websocket-port number    Port to run Websocket Server on (default: 8080)
  --ignore-history string    When enabled, does not send packets to websocket clients if rxTime is before we connected to the device (default: true)
```

To proxy Meshtastic Linux Native over a websocket on port 8080, you could do something like the following;

```
node src/index.js --meshtastic-host 127.0.0.1 --websocket-port 8080
```

Alternatively, you can run the latest version directly from npm without downloading the source.

```
npx @liamcottle/meshtastic-websocket-proxy --meshtastic-host 127.0.0.1 --websocket-port 8080
```

## TODO

- Add docs for sending/receiving packets over the websocket
- Support proxying BLE and Serial connections.

## License

MIT
npm package: @liamcottle/push-receiver
Description: A library to subscribe to GCM/FCM and receive notifications within a node process.
Latest version: 0.0.4

# push-receiver

A library to subscribe to GCM/FCM and receive notifications within a node process.

For [Electron](https://github.com/electron/electron), you can use [electron-push-receiver](https://github.com/MatthieuLemoine/electron-push-receiver) instead which provides a convenient wrapper.

See [this blog post](https://medium.com/@MatthieuLemoine/my-journey-to-bring-web-push-support-to-node-and-electron-ce70eea1c0b0) for more details.

## When should I use `push-receiver` ?

- I want to **receive** push notifications sent using Firebase Cloud Messaging in an [electron](https://github.com/electron/electron) desktop application.
- I want to communicate with a node process/server using Firebase Cloud Messaging infrastructure.

## When should I not use `push-receiver` ?

- I want to **send** push notifications (use the firebase SDK instead)
- My application is running on a FCM supported platform (Android, iOS, Web).

## Install

`
npm i -S push-receiver
`

## Requirements

- Node v8 (async/await support)
- Firebase sender id to receive notification
- Firebase serverKey to send notification (optional)

## Usage

### Electron

You can use [electron-push-receiver](https://github.com/MatthieuLemoine/electron-push-receiver) instead which provides a convenient wrapper.

### Node

```javascript
const { register, listen } = require('push-receiver');

// First time
// Register to GCM and FCM
const credentials = await register(senderId); // You should call register only once and then store the credentials somewhere
storeCredentials(credentials) // Store credentials to use it later
const fcmToken = credentials.fcm.token; // Token to use to send notifications
sendTokenToBackendOrWhatever(fcmToken);


// Next times
const credentials = getSavedCredentials() // get your saved credentials from somewhere (file, db, etc...)
// persistentIds is the list of notification ids received to avoid receiving all already received notifications on start.
const persistentIds = getPersistentIds() || [] // get all previous persistentIds from somewhere (file, db, etc...)
await listen({ ...credentials, persistentIds}, onNotification);

// Called on new notification
function onNotification({ notification, persistentId }) {
  // Update list of persistentId in file/db/...
  updatePersistentIds([...persistentIds, persistentId]);
  // Do someting with the notification
  display(notification)
}
```

### Test notification

To test, you can use the [send script](scripts/send/index.js) provided in this repo, you need to pass your serverKey and the FCM token as arguments :

```
node scripts/send --serverKey="<FIREBASE_SERVER_KEY>" --token="<FIREBASE_TOKEN>"
```
npm package: @liamcottle/sungrow-eyem4-api
Description: This is a NodeJS library for interacting with the websocket server running on the Sungrow EyeM4 Dongle.
Latest version: 0.0.6

# Sungrow-EyeM4-API

[![npm](https://img.shields.io/npm/v/%40liamcottle%2Fsungrow-eyem4-api)](https://www.npmjs.com/package/@liamcottle/sungrow-eyem4-api)
![GitHub License](https://img.shields.io/github/license/liamcottle/sungrow-eyem4-api)


This is a NodeJS library for interacting with the websocket server running on the [Sungrow EyeM4 Dongle](https://en.sungrowpower.com/productDetail/1008/intelligent-gateway-eyem4).

## Installing

```
npm install @liamcottle/sungrow-eyem4-api
```

## Features

- [x] `connect`
- [x] `disconnect`
- [x] `getAbout`
- [x] `getProduct`
- [x] `getDeviceTypes`
- [x] `getDeviceInfo(deviceId)`
- [x] `authenticate`
- [x] `getState`
- [x] `getRuntime`
- [x] `getStatistics`
- [x] `getFaults`
- [x] `getSystemInformation`
- [x] `getDeviceList(deviceType)`
- [x] `getDeviceRealtimeData(deviceId)`
- [x] `getDeviceDCData(deviceId)`

## Example

```javascript
const Client = require("@liamcottle/sungrow-eyem4-api");

(async () => {

    // create new client
    const client = new Client("192.168.1.175");

    // wait until connected
    client.on("connected", async () => {

        // authenticate
        await client.authenticate();

        // log state
        const state = await client.getState();
        console.log(state);

        // log runtime
        const runtime = await client.getRuntime();
        console.log(runtime);

        // log statistics
        const statistics = await client.getStatistics();
        console.log(statistics);

        // log faults
        const faults = await client.getFaults();
        console.log(faults);

        // log system information
        const systemInformation = await client.getSystemInformation();
        console.log(systemInformation);

        // log realtime data for each device
        const deviceList = await client.getDeviceList();
        console.log(deviceList);
        for(const device of deviceList.list){
            const realtimeDataResponse = await client.getDeviceRealtimeData(device.dev_id);
            console.log(realtimeDataResponse);
        }

        // we are done here
        client.disconnect();

    });

    // connect
    client.connect();

})();
```

## References

- https://en.sungrowpower.com/productDetail/1008/intelligent-gateway-eyem4
- https://service.sungrowpower.com.au/files/Web_Files/FAQ/TD_202006_EyeM4%20-WiFi-_Quick%20Guide%20for%20SG30-50-110CX%20Inverters_V1.1.pdf
npm package: @liamcottle/sungrow-eyem4-exporter
Description: A Prometheus exporter and Grafana dashboard for the Sungrow EyeM4 Dongle.
Latest version: 0.0.3

# Sungrow EyeM4 Exporter

A Prometheus exporter and Grafana dashboard for the Sungrow EyeM4 Dongle.

![Screenshot of Sungrow EyeM4 Exporter's Grafana dashboard](grafana-dashboard/screenshot.png)
*Screenshot of Sungrow EyeM4 Exporter's Grafana dashboard*

## How does it work?

The exporter uses [@liamcottle/sungrow-eyem4-api](https://github.com/liamcottle/sungrow-eyem4-api) to connect to the websocket running on the Sungrow EyeM4 dongle and then processes and serves the data in the expected format for Prometheus to scrape.

## How to run it?

You can run the latest version of the exporter with `npx`, or you can download the package manually and run from source.

```
npx @liamcottle/sungrow-eyem4-exporter serve --ip 192.168.1.175 --listen-port 8080
```

```
Sungrow EyeM4 Exporter

  A Prometheus exporter for the Sungrow EyeM4 Dongle. 

Usage

  $ sungrow-eyem4-exporter <options> <command> 

Command List

  help    Print this usage guide.                     
  serve   Serves prometheus style metrics at /metrics 

Options

  --ip string            IP address of the dongle. (e.g: 192.168.1.175)         
  --timeout string       Timeout in milliseconds for querying the dongle. (e.g: 10000)                                                 
  --listen-port string   Port the exporter will listen on. (e.g: 8080)          
```

## How to add to Prometheus?

You will need to add a scrape job to your `prometheus.yml` config file.

```
- job_name: sungrow_eyem4_exporter
  scrape_interval: 60s
  static_configs:
    - targets: ['1.2.3.4:8080']
```

> NOTE: Make sure to replace `1.2.3.4` with the IP address of the server running the exporter and `8080` with the listen port you set with `--listen-port`.
npm package: @liamdawson/disable-react-native-flipper-databases-expo-plugin
Description: Disable the default React Native Flipper Database plugin in EAS or expo prebuild
Author: Liam Dawson
Latest version: 44.0.0

# disable-react-native-flipper-databases-expo-plugin

Disable the default React Native Flipper Database plugin (on Android) in EAS or expo prebuild

> Tested against Expo SDK 44

## Usage (Quick Guide)

**1.** Install the module: `yarn add -D @liamdawson/disable-react-native-flipper-databases-expo-plugin`

**2.** Add `@liamdawson/disable-react-native-flipper-databases-expo-plugin` configuration to the `plugins` section of your `app.json`, as per the example below.

## Configuration

```json
{
  "expo": {
    "..."
    "plugins": [
      "@liamdawson/disable-react-native-flipper-databases-expo-plugin"
    ]
  }
}
```
npm package: @liamdev23/react-native-custom-date-picker
Description: Customizable date picker for React Native
Author: LiamDev
Latest version: 1.0.5

# React Native Custom DatePicker

A customizable date picker component for React Native applications.

## Installation

```bash
npm install --save react-native-custom-datepicker
# or
yarn add react-native-custom-datepicker
```

## Usage

```jsx
import DatePicker from 'react-native-custom-datepicker';

// Basic usage
<DatePicker 
  onDateChange={(date) => console.log(date)}
/>
```

## Props

| Prop | Type | Description | Default |
|------|------|-------------|---------|
| onDateChange | function | Callback when date is selected | Required |
| initialDate | Date | Initial selected date | new Date() |
| minDate | Date | Minimum selectable date | null |
| maxDate | Date | Maximum selectable date | null |

## License

MIT
npm package: @liamgen/utils
Description: ## Utils.js vous permettera de créer simplement des projets en JavaScript
Author: liamgen
Latest version: 0.0.1

# Utils.js

## Utils.js vous permettera de créer simplement des projets en JavaScript

`npm i  @liamgen/utils.js`


### Voici quelques exemples :

__Créer un website__

```js
const utils = require('@liamgen/utils.js')
const monSite = new utils.Website()
monSite.createPage('/', "Bienvenue dans l'acceuil !")
monSite.createFilePage('/home', '/views/home.html') // Votre fichier html doit etre dans un dossier nommé views
monSite.connect(3000)
````

__Utilitaire__

```js
const utils = require('@liamgen/utils.js')
const console = new utils.console()

console.imprimer('Salut')
// Envoit salut dans la console

console.clear()
// Vide la console

console.sendError("Unne erreur s'est produite", '4', 'index.js')
// Envoyer une erreur dans la console 1: message d'erreur. 2: ligne de l'erreur. 3: fichier

// Date 
console.imprimer(utils.date.getDate()) // Retourne la date

/*

Fonctions de la date:

utils.date.getMonth()
utils.date.getYear()
utils.date.getHour()
utils.date.getMinutes()
utils.date.getSeconds()
utils.date.getDay()

*/
```

[Github](https://github.com/liam-gen/utils.js)
npm package: @liamgen/utils.js
Description: Utils.js vous permettera de créer simplement des projets en JavaScript
Author: liamgen
Latest version: 0.1.0

# Utils.js

## Utils.js vous permettera de créer simplement des projets en JavaScript

`npm i  @liamgen/utils.js`


### Voici quelques exemples :

__Créer un website__

```js
const utils = require('@liamgen/utils.js')
const monSite = new utils.Website()
monSite.createPage('/', "Bienvenue dans l'acceuil !")
monSite.createFilePage('/home', '/views/home.html') // Votre fichier html doit etre dans un dossier nommé views
monSite.connect(3000)
````

__Utilitaire__

```js
const utils = require('@liamgen/utils.js')
const console = new utils.console()

console.imprimer('Salut')
// Envoit salut dans la console

console.clear()
// Vide la console

console.sendError("Unne erreur s'est produite", '4', 'index.js')
// Envoyer une erreur dans la console 1: message d'erreur. 2: ligne de l'erreur. 3: fichier

```

[Github](https://github.com/liam-gen/utils.js)
npm package: @liamhtml/pylon-cli
Description: a cli for the discord bot creator pylon
Author: liamhtml
Latest version: 1.1.2

# pylon-cli
a cli for [pylon](https://pylon.bot) <br>
i am aware that the code is a mess, might change that someday
## installation
```
npm i @liamhtml/pylon-cli
```
## setup
once you have pylon on your discord server, run `pylon init` to get started. 
## commands

<table>
  <tr>
    <th>command</th>
    <th>purpose</th>
    <th>aliases</th>
  </tr>
  <tr>
    <td><code>pylon help</code></td>
    <td>displays a help message</td>
    <td><code>-h, --help</code></td>
  </tr>
  <tr>
    <td><code>pylon <command> help</code></td>
    <td>displays more information about a command</td>
    <td><code>-h, --help</code></td>
  </tr>
  <tr>
    <td><code>pylon init</code></td>
    <td>locally creates a new project, grabs the code from your Pylon online editor, <strong>using this command will overwrite your locally saved code permanently, so be careful!</strong></td>
    <td><code>i</code></td>
  </tr>
  <tr>
    <td><code>pylon publish</code></td>
    <td>publishes all of your scripts to the Pylon editor, <strong>using this command will overwrite your Pylon editor code permanently, so be careful!</strong></td>
    <td><code>p</code></td>
  </tr>
  <tr>
    <td><code>pylon pull</code></td>
    <td>pulls the code of your project from the Pylon editor, <strong>using this command will overwrite your locally saved code permanently, so be careful!</strong></td>
    <td>none</td>
  </tr>
  <tr>
    <td><code>pylon version</code></td>
    <td>checks the current version of the cli you have installed</td>
    <td><code>-v, --version</code></td>
  </tr>
</table>
npm package: @liamjcooper/keys.js
Description: A library suited to help with musical notes, frequency and MIDI.
Author: Liam Cooper
Latest version: 1.0.1

# keys.js 🎹
A helper library written in Javascript to help with the development of music-oriented web applications. It is very basic at the moment due to it only being used for a personal project that simply needs these common functions so far, but it can:
- [x] Calculate a frequency based on the number of semitones away from A4 (assumed 440Hz tune)
- [x] Calculate a frequency based on a MIDI note number (not piano note)

I hope in the future I can get it to:
- [] Take into account different tuning frequencies for its base calculation
- [] Calculate a frequency based on a musical note and octave i.e. F#4, D2
- [] Allow detuning by cents to alter frequency calculation bias
- [] Convert a musical note to semitone difference from root
- [] Convert a MIDI note to a musical note
- [] And any other conversions in between
- [] Be available as an ES Module

# Install & usage
Install with either
````bash
npm i @liamjcooper/keys.js
````
or...
```bash
yarn add @liamjcooper/keys.js
```

And then to use, you can either
```js
const { frequency } = require("@liamjcooper/keys.js");
```
or...
```js
const frequency = require("@liamjcooper/keys.js/frequency");
```

# Documentation
Currently, you only have the choice of converting a semitone difference or MIDI note to a frequency as a float.

To do either conversion:
```js
frequency.forSemitoneFromRoot(3) // 523.251... (3 notes up from A4)
frequency.forMidiNote(66) // 369.994... (3 notes down from A4)
```

# Notes
All PRs welcome! Don't be afraid to say hi if this has helped you in any way, all feedback is also welcome 🙂
npm package: @liammartens/figma-plugin-helpers
Description: A collection of helper functions useful when creating Figma plugins
Author: Figma Community
Latest version: 0.16.1

# Figma Plugin Helper functions
[![npm](https://img.shields.io/npm/v/@figma-plugin/helpers?logo=npm&cacheSeconds=1800)](https://www.npmjs.com/package/@figma-plugin/helpers)
[![npm bundle size](https://img.shields.io/bundlephobia/minzip/@figma-plugin/helpers?cacheSeconds=1800)](https://bundlephobia.com/result?p=@figma-plugin/helpers)

A collection of useful helper functions to import to your Figma plugin project

## Installation

```bash
npm i @figma-plugin/helpers
# or
yarn add @figma-plugin/helpers
```
## Usage

```jsx
import { isTextNode } from "@figma-plugin/helpers";

const firstTextNode = figma.currentPage.findOne(node => isTextNode(node));
```

## Documentation

Find more information about each helper function in [`/docs`](./docs/globals.md) directory.

## Roadmap
- Write a contribution guidelines
- Source additional helper functions from the community
- Write a docs
npm package: @liamnewmarch/static
Description: A lightweight and configurable static site generator
Author: Liam Newmarch
Latest version: 0.3.2

# Static

__Note: Static is still experimental! Its API may, and probably will, change.__

Static is a static site generator for Node.js and is designed to be lightweight and configurable. Static doesn’t come with a templating engine out of the box, instead you’re encouraged to bring-your-own via plugins.

## Usage

```
Usage: @liamnewmarch/static [options] [command]

Lightweight static site builder

Options:
  -V, --version        output the version number
  -c, --config <path>  path to static config file (default: "static.config.js")
  -h, --help           display help for command

Commands:
  build                builds the site to the output directory
  serve                runs a local server and watches for changes
  help [command]       display help for command
```

## Project goals

### Lightweight

Dependencies are carefully considered to keep the installed size of the project low.

* [`@liamnewmarch/static-server`](https://www.npmjs.com/package/@liamnewmarch/static-server) for the local development server.
* [`chalk`](https://www.npmjs.com/package/chalk) for making the output readable.
* [`chokidar`](https://www.npmjs.com/package/chokidar) for watching files.
* [`commander`](https://www.npmjs.com/package/commander) for parsing CLI input.
* [`fs-extra`](https://www.npmjs.com/package/fs-extra) for reading and writing files.
* [`js-yaml`](https://www.npmjs.com/package/js-yaml) for parsing YAML.
* [`yaml-front-matter`](https://www.npmjs.com/package/yaml-front-matter) for reading file metadata.

## Configurable

Static is designed to be used with plugins. Plugins can add support for parsing different file types and for different rendering engines.

* `@liamnewmarch/static-plugin-nunjucks` experimental support for Nunjucks templates (`.njk`).
npm package: @liamnewmarch/static-plugin-html-minifier
Description: Static plugin to add support for HTMLMinifier
Author: Liam Newmarch
Latest version: 0.1.2

# HTMLMinifier plugin for Static

This plugin adds HTMLMinifier support to [Static](https://www.npmjs.com/package/@liamnewmarch/static).

## Usage

First, install Static and this plugin

```sh
npm install @liamnewmarch/static @liamnewmarch/static-plugin-html-minifier
```

Next add the plugin in your `static.config.js`

```js
import minifier from '@liamnewmarch/static-plugin-html-minifier';

export default {
  // Other Static options here (optional)
  plugins: [
    minifier({
      // Plugin options here (optional)
    }),
  ],
}
```

## Options

The HTMLMinifier plugin is a function which can take an optional options object. See the [HTMLMinifier options quick reference](https://www.npmjs.com/package/html-minifier#options-quick-reference).
npm package: @liamnewmarch/static-plugin-nunjucks
Description: Static plugin to add support for Nunjucks
Author: Liam Newmarch
Latest version: 0.1.3

# Nunjucks plugin for Static

This plugin adds the Nunjucks template engine to [Static](https://www.npmjs.com/package/@liamnewmarch/static).

## Usage

First, install Static and this plugin

```sh
npm install @liamnewmarch/static @liamnewmarch/static-plugin-nunjucks
```

Next add the plugin in your `static.config.js`

```js
import nunjucks from '@liamnewmarch/static-plugin-nunjucks';

export default {
  // Other Static options here (optional)
  plugins: [
    nunjucks({
      // Plugin options here (optional)
    }),
  ],
}
```

## Options

The Nunjucks plugin is a function which can take an optional options object.

* __`extensions` (default: `{}`)__: an object containing [Nunjucks extensions](https://mozilla.github.io/nunjucks/api.html#addextension) to add.
* __`filters` (default: `{}`)__: an object containing [Nunjucks filters](https://mozilla.github.io/nunjucks/api.html#addfilter) to add.
* __`globals` (default: `{}`)__: an object containing [Nunjucks globals](https://mozilla.github.io/nunjucks/api.html#addglobal) to add.
* __`templates` (default: `"templates"`)__: the string path used by [Nunjucks FileSystemLoader](https://mozilla.github.io/nunjucks/api.html#filesystemloader) to load templates.
npm package: @liamnewmarch/static-server
Description: A minimal HTTP server for static files.
Author: Liam Newmarch
Latest version: 0.1.1

# Static server

A minimal HTTP server for static files.

Really, really minimal. In fact there are only two dependencies, [chalk](https://www.npmjs.com/package/chalk) and [mime-types](https://www.npmjs.com/package/mime-types), the rest is handled by a custom file system handler for Node [http](https://nodejs.org/api/http.html).

The server can be used via the CLI or imported as a module.

## Install

```
npm install @liamnewmarch/static-server
```

## CLI usage

```
Usage: static-server [options]

A minimal HTTP server for static files

Options:
  -V, --version           output the version number
  -h, --help              display help for command
  -6, --ipv6              force use of IPv6  (default: false)
  -d, --directory <path>  directory to serve (default: ".")
  -H, --host <name>       host name to use   (default: use OS default)
  -p, --port <port>       port number to use (default: use OS default)
```

## Module

Simple version, serves the current directory (not recommended) on a random port

```js
import { staticServer } from '@liamnewmarch/static-server';

staticServer();
```

More complex version, serves a `static` folder at http://localhost:3000 with a custom handler for http://localhost:3000/hello-world.

```js
import { staticServer } from '@liamnewmarch/static-server';

// All options are optional
const options = {
  directory: 'static',
  host: '127.0.0.1',
  port: 3000,
  ipv6: false,
  handlers: [
    myCustomHandler,
  ],
};

function myCustomHandler(request, response, next) {
  // Custom handlers use request and response from the Node http API
  if (request.url === '/hello-world') {
    response.writeHead(200, { 'Content-Type': 'text/plain' });
    response.end('Hello, world!', 'utf-8');
  }
  // The next() callback tells the request listener to use the next handler
  next();
}

staticServer(options);
```
npm package: @liamrad/lanchat
Description: have a chat in lan use Socket.IO
Author: Liam Shi
Latest version: 0.1.1

# lanchat

[![NPM version](https://img.shields.io/npm/v/pkg-name?color=a1b858&label=)](https://www.npmjs.com/package/@liamrad/lanchat)

> [start with example that on Socket.IO](https://socket.io/get-started/chat)

have a chat in lan use Socket.IO

## Usage

```bash
npx git://github.com/liamrad/lanchat lanchat
# or
npx @liamrad/lanchat
```

## FAQ

Q: ERR_ADDRESS_UNREACHABLE
S: Close the firewall
npm package: @liamrad/vssue-vue3
Description: > A vue-powered issue-based comment plugin for vue3.
Author: Liam Shi
Latest version: 0.1.1

> A vue-powered issue-based comment plugin for vue3.  

## Base

[Vssue](https://www.github.com/meteorlxy/vssue). 

## Install

```bash
pnpm i @liamrad/vssue-vue3
```

## Usage

> [more info](https://vssue.js.org/zh/guide/)  

```js
// 引入 vue
import { createApp } from 'vue'
// 引入 vssue
import Vssue from '@liamrad/vssue-vue3'
// 引入对应平台的 api 包
import GithubV4 from '@vssue/api-github-v4'
// 引入 vssue 的样式文件
import '@liamrad/vssue-vue3/style.css'

const app = createApp({
  // ...
})

app.use(Vssue, {
  // 设置要使用的平台 api
  api: GithubV4,

  // 在这里设置你使用的平台的 OAuth App 配置
  owner: 'OWNER_OF_REPO',
  repo: 'NAME_OF_REPO',
  clientId: 'YOUR_CLIENT_ID',
  clientSecret: 'YOUR_CLIENT_SECRET', // 只有在使用某些平台时需要
})
```