open-index/open-npm huggingface dataset:
npm package: @laodeus/vcard
Description: Laodeus v-card
Author: Laodeus
Latest version: 0.0.20

npx-card
--------

launch
    npx/laodeus [arg:optional]
        no [arg]
            display my vcard
        arg:hisGreatVoice
            get a quote from our lord
        arg:joke
            get a joke about our lord
        arg:theLittleGreatOne
            get a little picture from our lord
        arg:theGreatOne
            get a great picture from our lord
npm package: @laogong5i0/immutable
Description: 对immutable的二次封装
Author: laogong5i0
Latest version: 1.0.0

# @ttk/vue

> 这是一个基于 Vue+Vuex+Vue-router 进行封装的业务基础框架，默认提供登录，还有常用的API。支持路由覆盖，及去中心化等特点，开发者无需关注框架的实现，只需按Vue+Vuex开发规范进行数据绑定即可。
> 

目前版本为 `v0.1` 基于 `vue-cli` 进行构建，它依赖 vue-cli.

## 框架特点
- 去中心化，路由和页面store的操作都统一写在在一个文件夹下，代码结构更清晰，一个页面一个文件夹。

- 支持路由覆盖，业务代码中定义与框架中相同名称的路由名称即可覆盖框架路由。

- 支持重写框架的view层，无需修改store，复用框架中的store。

- 封装了部分常用接口，开发者可以直接使用，也可以自己重新写。

- 保留vue原有特性和数据操作的方法，降低框架学习成本

- UI在Element-UI V2.12的基础上进行了2次封装，继承Eleemnt-UI所有特性

- 提供一些常用工具集，如日期格式化，phone校验，ajax封装等。

- 自带mock和eslint，无需再配置
  

## 相关项目

[@ttk/vue](https://github.com/fx-mobile/vue)

[tax-group-demo](https://github.com/fx-mobile/tax-group-demo)

[@ttk/vue-ui](https://github.com/fx-mobile/vue-ui)


## 使用实例

```bash
# 克隆项目
git clone https://github.com/laogong5i0/tax-group-demo

# 进入项目目录
cd tax-group-demo

# 安装依赖
npm install

# 建议不要直接使用 cnpm 安装以来，会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题
npm install --registry=https://registry.npm.taobao.org

# 启动服务
npm run dev
```

## 发布

```bash
# 构建测试环境
npm run build:stage

# 构建生产环境
npm run build:prod
```

## 其它

```bash
# 预览发布环境效果
npm run preview

# 预览发布环境效果 + 静态资源分析
npm run preview -- --report

# 代码格式检查
npm run lint

# 代码格式检查并自动修复
npm run lint -- --fix
```

更多信息请参考 `待更新：使用文档`

## Demo

`demo`

## Browsers support

Modern browsers and Internet Explorer 10+.

| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari |
| --------- | --------- | --------- | --------- |
| IE>=9, Edge| last 2 versions| last 2 versions| last 2 versions

## License

[MIT](https://github.com/fx-mobile/tax-group-demo/blob/master/LICENSE) license.

Copyright (c) 2017-present PanJiaChen
npm package: @laomao800/mark-match
Description: [![Actions Status](https://github.com/laomao800/mark-match/workflows/package-ci/badge.svg)](https://github.com/laomao800/mark-match/actions) [![codecov](https://codecov.io/gh/laomao800/mark-match/branch/master/graph/badge.svg)](https://codecov.io/gh/laom
Latest version: 1.1.2

# mark-match

[![Actions Status](https://github.com/laomao800/mark-match/workflows/package-ci/badge.svg)](https://github.com/laomao800/mark-match/actions)
[![codecov](https://codecov.io/gh/laomao800/mark-match/branch/master/graph/badge.svg)](https://codecov.io/gh/laomao800/mark-match)

## Usage

```js
import { markMatch, markExactMatch, hasMatch, hasExactMatch } from '@laomao800/mark-match'

// Normal match
markMatch('1234567890', '34') // -> '12<mark>34</mark>567890'

// Multiple keyword split by spaces
markMatch('1234567890', '3 6 9') // -> '12<mark>3</mark>45<mark>6</mark>78<mark>9</mark>0'

// Mark match by exact keyword include spaces
markExactMatch('1 2 3 4 5 6 7 8 9', '3 4 5') // -> '1 2 <mark>3 4 5</mark> 6 7 8 9'

// Custom match template
markMatch('1234567890', '34', match => `<span class="keyword">${match}</span>`)
markExactMatch('1234567890', '34', match => `<span class="keyword">${match}</span>`)
// -> '12<span class="keyword">34</span>567890'

// Works like `markMatch` & `markExactMatch` except is return boolean value
hasMatch('1234567890', '3 6 9') // true
hasExactMatch('1234567890', '3 6 9') // false
```
npm package: @laomao800/parse-size
Description: A helper to parse 'size like' value into a valid size with unit.
Latest version: 2.0.1

# parse-size

A helper to parse 'size like' value into a valid size with unit.

## Install

```bash
yarn add @laomao800/parse-size

# or

npm install --save @laomao800/parse-size
```

## Usage

```js
import parseSize from '@laomao800/parse-size'

parseSize(50) // '50px'
parseSize('50') // '50px'
parseSize('50px') // '50px'
parseSize('50%') // '50%'
parseSize('50.5px') // '50.5px'
parseSize('50.5%') // '50.5%'
parseSize('a') // undefined

// Default unit. Supports all CSS valid unit.
parseSize(50, 'em') // '50em'
```
npm package: @laomao800/parse-size-with-unit
Description: A helper to parse 'size like' value into a valid size with unit.
Latest version: 1.0.3

# parse-size-with-unit

A helper to parse 'size like' value into a valid size with unit.

## Install

```bash
yarn add @laomao800/parse-size-with-unit

# or

npm install --save @laomao800/parse-size-with-unit
```

## Usage

```js
import parseSize from '@laomao800/parse-size-with-unit'

parseSize(50) // '50px'
parseSize('50') // '50px'
parseSize('50px') // '50px'
parseSize('50%') // '50%'
parseSize('50.5px') // '50.5px'
parseSize('50.5%') // '50.5%'
parseSize('a') // null

// Default unit. Supports all CSS valid unit.
parseSize(50, 'em') // '50em'
```
npm package: @laomao800/vue-demo-box
Description: vue-demo-box provides a container component that presents both the demo and the code. For more demonstrations, check out the [Example](./example).
Latest version: 1.1.7

# vue-demo-box

vue-demo-box provides a container component that presents both the demo and the code. For more demonstrations, check out the [Example](./example).

Recommended to use with [Vuepress import code snippets](https://vuepress.vuejs.org/guide/markdown.html#import-code-snippets) to make it easier to reuse the code to create a presentation:

<!-- markdownlint-disable MD033 -->
<img src="./docs/.vuepress/public/preview.png" alt="vue-demo-box preview" style="width:80%;box-shadow:#ddd 0 0 10px;" />

## Install

```bash
yarn add -D @laomao800/vue-demo-box

# or

npm install --save-dev @laomao800/vue-demo-box
```

## Documentation

[中文](https://laomao800.github.io/vue-demo-box/zh/) | [English](https://laomao800.github.io/vue-demo-box/)
npm package: @laomao800/vue-listview
Description: [![CI-CD](https://github.com/laomao800/vue-listview/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/laomao800/vue-listview/actions/workflows/ci.yml) [![Coverage Status](https://coveralls.io/repos/github/laomao800/vue-listview/badge.s
Author: laomao800
Latest version: 2.1.1

# Vue Listview

[![CI-CD](https://github.com/laomao800/vue-listview/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/laomao800/vue-listview/actions/workflows/ci.yml)
[![Coverage Status](https://coveralls.io/repos/github/laomao800/vue-listview/badge.svg?branch=master)](https://coveralls.io/github/laomao800/vue-listview?branch=master)

> 本分支为 Listivew v2.x 版本，v1.x 相关文档请查阅 [1.x](https://github.com/laomao800/vue-listview/tree/1.x) 。

Vue Listview 为一个基于 [Vue.js 2.x](https://cn.vuejs.org/) 和 [Element-UI](http://element.eleme.io/) 的列表页面类布局组件：

![预览](./docs/preview.png)

## 文档 & Demo

- 文档： <https://laomao800.github.io/vue-listview/>
- Demo： <https://laomao800.github.io/vue-listview/demo/layout/all.html>

## 安装

```bash
yarn add @laomao800/vue-listview@next

# OR

npm i @laomao800/vue-listview@next
```

**`element-ui` 作为 peerDependencies 需要在宿主项目中独立安装。**

## 使用

### 局部注册

```vue
<template>
  <Listview />
</template>

<script>
import Listview from '@laomao800/vue-listview'
export default {
  components: { Listview }
}
</script>
```

### 全局注册

```js
// main.js
import Vue from 'vue'
import Listview from '@laomao800/vue-listview'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'

Vue.use(Listview)
Vue.use(ElementUI)
```

### 全局配置

通过 create 方法可对部分 props 默认值进行全局配置，并生成全新的组件。

可用于项目间接口格式不同，或者项目内部有多个不同默认布局等特殊场景。

```js
// main.js
// ...
import { create as createListview } from '@laomao800/vue-listview'

const Listview = createListview({
  validateResponse: res => res.other_success_status,
  pagePosition: 'right',
  // ...
})
Vue.use(Listview)
```

详细说明及支持配置可查看 [create](docs/dev/create.md) 章节

### UMD

演示： [jsfiddle](https://jsfiddle.net/laomao800/92Lvg1rn/4/)

```html
<div id="app">
  <Listview />
</div>

<script src="//unpkg.com/vue/dist/vue.js"></script>
<script src="//unpkg.com/@laomao800/vue-listview/dist/listview.umd.min.js"></script>
<script>
new Vue().$mount('#app')
</script>
```
npm package: @laomao800/vue-nav-box
Description: https://laomao800.github.io/vue-nav-box/
Author: laomao800
Latest version: 1.4.0

# vue-nav-box

## Demo

https://laomao800.github.io/vue-nav-box/

### Preview

![preview](./preview.gif)

## Usage

```vue
<template>
  <nav-box height="360px" :foldable="true">
    <nav-box-pane>
      <div slot="title">Form 1 <strong style="color:#f90">(Html surport)</strong></div>
      <!-- <example-form /> -->
    </nav-box-pane>
    <nav-box-pane title="Form 2 (Fold by default)" :fold="true">
      <!-- <example-form /> -->
    </nav-box-pane>
    <nav-box-pane title="Form 3 (Can't fold)" :foldable="false">
      <!-- <example-form /> -->
    </nav-box-pane>
  </nav-box>
</template>

<script>
import { NavBox, NavBoxPane } from '@laomao800/vue-nav-box'

export default {
  components: {
    NavBox,
    NavBoxPane
  }
}
</script>
```

## Props

### `<nav-box />`

| Prop      | Type           | Default | Info                                                              |
| --------- | -------------- | ------- | ----------------------------------------------------------------- |
| height    | String, Number | `null`  | Navigation wrap box's height. e.g. `500`, `500px`                 |
| navWidth  | String, Number | `null`  | Navigation sidebar width. e.g. `160`, `160px`                     |
| navePosition | String | `''` | Navigation sidebar position. e.g. `'left'` |
| duration  | Number         | `400`   | Scroll animation time.                                            |
| offsetTop | Number         | `0`     | Amount of space between top of wrapper and the section to active. |
| foldable  | Boolean        | `false` | Enable child panes foldable                                       |
| navHidden | Boolean        | `false` | Whether hide the navbar                                           |

### `<nav-box-pane />`

**needs to wrap in the `<nav-box />`**

| Prop     | Type    | Default | Info                                                                                       |
| -------- | ------- | ------- | ------------------------------------------------------------------------------------------ |
| title    | String  | `null`  | Section title                                                                              |
| foldable | Boolean | `true`  | Specify the child pane foldable. Only on `<nav-box />` `foldable` is `true`                |
| fold     | Boolean | `false` | Specify the child pane whether fold by default. Only on `<nav-box />` `foldable` is `true` |

## Project scrips

```bash
# Develop
yarn run serve

# Build component dist
yarn run build:lib

# Build example page
yarn run build:example
```
npm package: @laomao800/water-mark
Description: ## Install
Latest version: 1.0.0

# Water mark

## Install

```bash
yarn add @laomao800/water-mark

# or

npm install @laomao800/water-mark
```

## Usage

```js
import renderWaterMark, { createWaterMarkImage } from '@laomao800/water-mark'

renderWaterMark('Mark-text-43784')

createWaterMarkImage('Mark-text') // { dataURL: 'data:image/png;base64,xxxx', width: number, width: number }
```

## API

`waterMark(string | Options)`

```ts
export interface Options {
  /**
   * 水印文本
   */
  text: string

  /**
   * 水印挂载节点
   * @default document.body
   */
  el?: string | HTMLElement

  /**
   * 切换水印位置为固定位置显示或跟随滚动
   * @default true
   */
  fixed?: boolean

  /**
   * 水印文本颜色
   * @default '#000'
   */
  color?: string

  /**
   * 水印文字大小
   * @default 14
   */
  fontSize?: number

  /**
   * 水印文本间隔，单位像素，支持[x轴, y轴]
   * @default 120
   */
  gap?: number | [number, number]

  /**
   * 水印文本旋转角度
   * @default -15
   */
  rotate?: number

  /**
   * 指定水印画布宽度，默认自动计算，
   * 可在文字显示不完整时与 offset 配合调整偏移量
   * @default null
   */
  width?: number

  /**
   * 指定水印画布高度，默认自动计算，
   * 可在文字显示不完整时与 offset 配合调整偏移量
   * @default null
   */
  height?: number

  /**
   * 水印文本整体偏移量，单位像素，支持[x轴, y轴]
   * @default 0 [0, 0]
   */
  offset?: number | [number, number]

  /**
   * 水印层 z-index 值
   * @default 999999
   */
  zIndex?: number

  /**
   * 显示渲染调试辅助线
   * @default false
   */
  debug?: boolean
}
```
npm package: @laomao800/webpack-archive-plugin
Description: Webpack plugin to create archives of emitted files.
Author: laomao800
Latest version: 2.0.0

# webpack-archive-plugin

Webpack plugin to create archives of emitted files.

## Installation

```bash
# for webpack 4.x
npm install --save-dev @laomao800/webpack-archive-plugin
```

```bash
# for webpack < 4
npm install --save-dev @laomao800/webpack-archive-plugin@1.x
```

## Usage

webpack.config.js:

```javascript
const ArchivePlugin = require('@laomao800/webpack-archive-plugin');

module.exports = {
  // ...
  output: {
    path: path.join(__dirname, 'dist'),
    filename: 'bundle.js'
  },
  plugins: [
    new ArchivePlugin({
      // the output location, can be relative (to Webpack output path) or absolute
      output: '',

      // output archive filename, defaults to the Webpack output filename (above),
      // if not present, use the basename of the path
      filename: '',

      // defaults to the array ['zip', 'tar']
      // valid format is 'zip' and 'tar', can be a string or an array,
      format: '',

      // OPTIONAL: defaults to the empty string
      // the file extension to use instead of 'zip' or 'tar.gz'
      // if 'format' is Array, extension needs to be like { zip: 'zipext', tar: 'tarext' }
      extension: '',

      // OPTIONAL: defaults to the empty string
      // the prefix for the files included in the zip/tar.gz file
      pathPrefix: 'relative/path'
    })
  ],
}
```

Will create two archives in the same directory as output.path (`__dirname/dist` in the example),
`${output.filename}.tar.gz` and `${output.filename}.zip` containing all compiled assets.
npm package: @laomeifun/gemini-image-mcp
Description: MCP server: generate images via an OpenAI-compatible Gemini endpoint
Latest version: 0.0.1
Deprecated: This package has been renamed to @laomeifun/gemini-images

# gemini-image-mcp

一个基于 **MCP (Model Context Protocol)** 的 Node.js 服务：通过本地 `OpenAI-compatible` 网关（默认 `http://127.0.0.1:8317`）调用 Gemini 图片模型 `gemini-3-pro-image-preview` 生成图片，供 Claude Code/Claude Desktop 等 IDE 工具动态使用。

## 1) 安装

```bash
npm install
```

## 2) 环境变量（可选）

- `OPENAI_BASE_URL`：OpenAI-compatible 服务地址（默认 `http://127.0.0.1:8317`）
- `OPENAI_API_KEY`：如果你的网关需要鉴权就填（可留空）
- `OPENAI_MODEL`：默认 `gemini-3-pro-image-preview`
- `OPENAI_IMAGE_SIZE`：可选，仅作为未传入 `size` 时的默认值；建议让客户端在调用 `generate_image` 时自己传 `size`
- `OPENAI_IMAGE_MODE`：`chat|images|auto`，默认 `chat`（CLIProxyAPI 这类网关通常用 `/v1/chat/completions` 出图；若你的网关支持 `/v1/images/generations` 可设为 `images`）
- `OPENAI_IMAGE_RETURN`：`path|image`，默认 `path`（`path` 会把图片保存到本地并返回文件路径，避免 base64 导致 token 暴涨；`image` 返回 MCP `image` content）
- `OPENAI_IMAGE_OUT_DIR`：保存目录（默认 `debug-output/`；相对路径以项目根目录为基准）
- `OPENAI_DEBUG`：设为 `1` 时会在 stderr 打印上游请求信息（不打印 key）
- `OPENAI_TIMEOUT_MS`：默认 `120000`

可参考 `.env.example`。

## 3) 本地调试（不用放进 Claude Code）

推荐把 `.env.example` 复制成 `.env`，然后在 `.env` 里填好 `OPENAI_API_KEY`（`.gitignore` 已忽略 `.env`）。

- 直连上游调试（确认你的 `http://127.0.0.1:8317` 是否能出图）：
  - `npm run debug:upstream -- --prompt "A beautiful sunset over mountains" --size 1024x1024`
- 走 MCP 工具调试（等价于 Claude Code 调用 `generate_image`）：
  - `npm run debug:mcp -- --prompt "A beautiful sunset over mountains" --n 1 --size 1024x1024`

图片会输出到 `debug-output/`。

## 4) 作为 MCP Server 使用（stdio）

该项目是 **stdio** 传输方式的 MCP Server，不建议直接在终端手动运行（会等待客户端请求）。

在 Claude Code / Claude Desktop 的 MCP 配置里添加类似如下（按你的实际路径修改）：

```json
{
  "mcpServers": {
    "gemini-image": {
      "command": "node",
      "args": ["d:/task/myself/nodejs/geminiimagemcp/src/index.js"],
      "env": {
        "OPENAI_BASE_URL": "http://127.0.0.1:8317",
        "OPENAI_API_KEY": "<YOUR_KEY>",
        "OPENAI_MODEL": "gemini-3-pro-image-preview"
      }
    }
  }
}
```

也可以直接参考 `mcp.example.json`。

## 5) 可用工具

- `generate_image`
  - 入参：`prompt`（必填）, `size`（可选）, `n`（可选，1-4）, `output`（可选：`path|image`）, `outDir`（可选）
  - 返回：默认返回保存后的图片文件路径（多行）；`output=image` 时返回 MCP `image` content（base64 + mimeType）
npm package: @laomu/handsontable
Description: handsontable with formula
Author: laomu1988
Latest version: 1.0.6

# 可编辑公式的表格
* [x] 公式单元格展示计算结果
* [x] 点击公式单元格展示并可编辑公式
* [x] 公式单元格黄色背景
* [x] 非法数据红色背景
* [x] 撤销和重做、粘贴等数据更新
* [x] 调整宽度
* [x] 禁止编辑状态
* [x] 数据修改后其他依赖该数据的需要重新计算
* [x] 菜单改为中文
* [x] 公式默认展示计算结果，hover时提示公式内容
* [x] 支持Object对象属性计算
* [x] Object对象预览
* [x] Object对象属性别名
* [x] Object对象删除
* [x] Object对象复制
* [x] 公式中引用另一个单元格的计算结果
* [ ] 自定义对象展示函数
* [ ] 条件表达式
* [ ] SUM等区域函数
* [ ] 中间插入或删除行或列时，更新所有公式中包含了底部或右侧区域的内容
* [ ] 可下拉选择数据
* [ ] 单元格合并及对齐方式修改存储
* [x] 外界更新数据时如何更新界面(render函数)
* [x] [ObjectEditor自定义编辑支持](https://docs.handsontable.com/pro/5.0.2/tutorial-cell-editor.html)
* [ ] 禁止复制对象
* [ ] 禁止删除对象
* [ ] 避免对象覆盖编辑(可删除后重新编辑)

## [效果预览](https://laomu1988.github.io/handsontable/)
<a href="https://laomu1988.github.io/handsontable/" target="_blank"><img src="https://raw.githubusercontent.com/laomu1988/handsontable/master/doc/preview.png"></a>

## 示例（参考src/example.js）
```
require('@laomu/handsontable/dist/style.css')
const Tabel = require('@laomu/handsontable')
var data = [
    ['说明', '内容', null],
    ['数据', 10, 11],
    ['字符串', 'AAA', ''],
    ['对象', {name: '对象A', value: 123, hide: false}, {name: '对象B', value: 133}],
    ['公式', '=B2+C2'],
    ['错误示例', '=B1+B2'],
    ['对象属性计算', '=B4.value + 1'],
    ['别名计算示例', '=B4.值 + 1'],
    ['不存在的属性', '=B4.notExist'],
    ['公式套公式', '=B5 + 10'],
]

var container = document.getElementById('table')
var hot = new Tabel({
    dom: container,
    data: data,
    // 属性别名
    propAlias: {
        'value': '值'
    },
    // 合并单元格
    mergeCells: [
        {row: 0, col: 1, rowspan: 1, colspan: 2}
    ],
    // 对齐方式
    metas: [
        {row: 0, col: 0, meta: {className: 'htRight'}}
    ],
})

// 需要选择数据时触发
hot.on('dblclick-object', function(row, col, data) {
    console.log('select:', row, col, data);
    setTimeout(() => {
        let value = data.value
        hot.setDataAtCell(row, col, {
            name: '值:' + (value + 1),
            value: (value + 1)
        })
    }, 1000)
});

// 当有数据变化时触发
hot.on('update', function(data) {
    console.log('update:', hot.getDataWithFormat());
})
```

## 初始化参数
* dom 编辑区所在dom
* data 编辑区使用的数据
* config 覆盖handsontable默认配置
* disabled 是否禁止编辑，默认false
* propAlias 对象属性的中文别名
* commentNeedAlias 只有指定了别名，对象的属性才会展示在注释中，避免注释内容过多, 默认false

## 事件
* dblclick(row, col, data) 点击单元格触发
* dblclick-object(row, col, obj) 点击了对象单元格
* selection(row1, col1, row2, col2) 选中了某个区域时触发
* select-cell(row, col) 选择了某个单元格时触发
* change/update(array) 数据更新事件

## 方法
* getData() 获取数据
* setDataAtCell(row, col, data) 设置单元格的值
* getCellData(row, col) 获取单元格计算后的值
* getCellOrigin(row, col) 获取单元格原始数据
* getDataWithFormat() 取得包含格式等内容的数据
* updateSettings() 更新配置后调用

## 相关链接
* handsantable: https://github.com/handsontable/handsontable
* handsantable事件列表: https://docs.handsontable.com/pro/1.18.1/tutorial-using-callbacks.html
* formula-parser公式计算: https://github.com/handsontable/formula-parser

## 开发说明
执行`npm run dev`

## 版本
* v1.0.6
    - 普通公式计算修复
    - 增加DateToNumber和NumberToDate函数，方便时间计算
    - 公式递归报错
* v1.0.5
    - 表格初始化时包含合并单元格和对齐方式
* v1.0.4
    - 对象可复制、删除
    - 公式嵌套公式
npm package: @laomu/npm-proxy
Description: 简单的npm包缓存服务器，不使用数据库，直接用本地文件
Author: laomu1988@qq.com
Latest version: 0.1.6

# npm包缓存服务器

简单的npm缓存服务，第一次请求的包会缓存到本地文件，后续再次请求时就直接使用本地服务。
无需数据库，直接使用本地静态资源作为服务器

## 安装
```
npm install @laomu/npm-proxy
```

## 使用

1. 首先创建js文件,例如proxy.js
```
const proxy = require('@laomu/npm-proxy');
proxy({
    registry: 'registry.npm.baidu.com', // 转发到的npm服务地址
    port: 8221,                         // 本地监听端口
    timeout: 30000,                     // 缓存超时时间，定期对数据进行清理,单位秒，默认2天
    localhost: 'proxy.server.host:8221',// 远程加载时请求的服务器地址
    saveTo: __dirname + '/cache'        // 缓存文件保存目录
})
```
2. 启动proxy.js
```
node proxy.js
# 或者
pm2 start proxy.js
```
3. 如何使用缓存服务
```
npm install --registry=http://proxy.server.host:8221
```

## 如何工作
请求npm包信息时，转发请求前将包信息中的tgz地址更换为服务器地址，之后请求tgz包内容时会请求服务器地址
在请求转发后，将转发内容存储到服务器，下次请求相同文件时将直接使用本地文件而达到加速效果

## 问题
* 因为存在缓存,最近发布的包的地址可能不在缓存内部，会出现下载失败的情况，此时可以通过访问链接`http://proxy.server.host:8221/@clear/cache`清空缓存(修改host为自己的host)

## 版本记录
* v1.0.6
    - 增加主动清理缓存链接：/@clear/cache
* v1.0.5
    - 清理记录时，不清理根文件夹，避免上传文件失败
* v1.0.4
    - 增加upload配置项，可上传文件，默认关闭
* v1.0.3
    - 增加timeout参数，配置缓存过期时间
* v1.0.2
    - 基本缓存功能
npm package: @laomu/sails-nedb
Description: NeDB adapter for Sails / Waterline - 0.10.x
Author: Aditya Mukhopadhyay
Latest version: 0.11.1

![image_squidhome@2x.png](http://i.imgur.com/RIvu9.png)

# NeDB Adapter [![Build Status](https://travis-ci.org/laomu1988/sails-nedb.svg?branch=master)](https://travis-ci.org/laomu1988/sails-nedb)

## update
- 升级nedb版本
- 修改数据时可以使用$inc
- 修复sails-nedb中每次重启后id就改变的问题

[![Npm Downloads](https://nodei.co/npm/sails-nedb.png?downloads=true&stars=true)](https://www.npmjs.org/package/sails-nedb)

Waterline adapter for NeDB.

A persistent object store which uses [Node Embedded Database](https://github.com/louischatriot/nedb) as the storage engine.

## Caution

In case you run multiple sails workers on a machine as part of a load balancing strategy: NeDB is not designed to synchronize file writes across multiple concurrent processes. Running an NeDB-backed sails app with more than 1 worker **WILL** eventually lead to inconsistent, and very likely corrupted data.

## Installation

Install from NPM.

```bash
$ npm install @laomu/sails-nedb --save
```

The NeDB dependency is actually pulled from my forked repo of the original, because I needed to add aggregation support at the DB layer. If and when [this pull request](https://github.com/louischatriot/nedb/pull/153) gets merged into the main line, the dependendency will be switched back to the npm module.

## Sails Configuration

Add the nedb config to the `config/connections.js` file.
No special configuration is necessary. One can optionally set the `filePath` to point to a particular location. Files get saved to `.tmp` inside the application root by default.

## Acknowledgement

A big thanks to the contributors of **NeDB**, **sails-disk**, and **sails-mongo**. This adapter owes its existence in no small amount to each of these projects :).

## About Sails.js
http://sailsjs.com

## About Waterline
Waterline is a new kind of storage and retrieval engine.  It provides a uniform API for accessing stuff from different kinds of databases, protocols, and 3rd party APIs.  That means you write the same code to get users, whether they live in mySQL, LDAP, MongoDB, or Facebook.
npm package: @laomu/validator
Description: - 使用[async-validator](https://www.npmjs.com/package/async-validator)进行校验 - 返回Promise
Latest version: 1.0.1

# 字段校验工具
- 使用[async-validator](https://www.npmjs.com/package/async-validator)进行校验
- 返回Promise

## 安装
```sh
npm install @laomu/validator
```

## usage
```js
let Validate = require('@laomu/validator')
let rules = {
    username: [
        {type: 'string', required: true, message: '请输入用户名'},
        {min: 6, max: 10, message: '请输入6到10位字符'},
    ],
    password: [
        {type: 'string', required: true, message: '请输入密码'},
        {min: 6, max: 10, message: '请输入6到10位字符'},
    ],
    email: [
        {type: 'email', message: '邮箱格式非法'}
    ]
};

let validator = new Validate(rules);

validator
    .validate({username: '123', password: '123'})
    .catch(err => {
        console.log(err);
    });
/*** 将输出错误
[ { message: '请输入6到10位字符', field: 'username' },
  { message: '请输入6到10位字符', field: 'password' } ]
***/
```

### api
* new Validate(rules) 生成新的校验程序实例
* instance.validate(data) 校验数据，返回一个promise
* instance.validExist(data) 校验数据中存在的属性（可枚举并在rules中定义过）
* instance.validAttr(data, attr) 校验一个属性, 例如validAttrs(data, 'username')
* instance.validAttrs(data, attrs) 校验属性列表，例如validAttrs(data, ['username', 'password'])

## 其他
rule配置规则请参考[async-validator](https://www.npmjs.com/package/async-validator)
npm package: @laosb/protobuf-jsonschema
Description: Compiles Protobuf IDL to JSON Schema
Latest version: 2.0.0

# protobuf-jsonschema

Compiles [Protocol Buffer IDL](https://developers.google.com/protocol-buffers/docs/proto3)
to [JSON Schema](http://json-schema.org) definitions.

> **Fork of [protobuf-jsonschema](https://github.com/devongovett/protobuf-jsonschema)**
>
> This is a modernized version of the original library, with updated dependencies, rewritten in modern ES2020 syntax and is ESM only. Credits to [devongovett](https://github.com/devongovett) for the original library.

## Usage

You can use `protobuf-jsonschema` as a command line tool, or as a function in node.

The CLI can output JSON or YAML (e.g. for Swagger). If you specify a protobuf message
name along with a file, it will output just that message and all dependencies. Otherwise,
it will output all messages.

```shell
$ npm install protobuf-jsonschema -g
$ protobuf-jsonschema --help

  Usage: protobuf-jsonschema [options] <file> [model]

  Options:

    -h, --help             output usage information
    -V, --version          output the version number
    -f, --format [format]  output format: json or yaml [json]
```

In node, `protobuf-jsonschema` exports a single function that returns an object
with the JSON Schema model.

```javascript
var compile = require('protobuf-jsonschema');

var all = compile('models.proto');
var single = compile('models.proto', 'MyModel');
```

## License

MIT
npm package: @laosb/react-native-sfsymbols
Description: Use SF Symbols in iOS apps
Author: Birkir Gudjonsson
Latest version: 1.2.0

# react-native-sfsymbols

Use SF Symbols in React Native for iOS

- ⚠️ iOS 14+ only ([& more soon](https://github.com/birkir/react-native-sfsymbols/issues/1))
- 💔 [Android or other platforms cannot be supported](https://github.com/birkir/react-native-sfsymbols/issues/3)

![iOS Simulator with icons example](https://media.giphy.com/media/5gB4qLjkuYwVn10O77/giphy.gif) ![Example app](https://i.ibb.co/F03LBxj/Simulator-Screen-Shot-i-Phone-12-2021-06-23-at-11-47-54.png)

## Setup

```console
npm install --save react-native-sfsymbols

# --- or ---

yarn add react-native-sfsymbols
```

_Don't forget to run `cd ios && pod install && cd ..` after that !_

### Manual installation

#### iOS

1. In XCode, in the project navigator, right click `Libraries` ➜ `Add Files to [your project's name]`
2. Go to `node_modules` ➜ `react-native-sfsymbols` and add `RNSfsymbols.xcodeproj`
3. In XCode, in the project navigator, select your project. Add `libRNSfsymbols.a` to your project's `Build Phases` ➜ `Link Binary With Libraries`
4. Run your project (`Cmd+R`)<

</details>

## Usage

```jsx
import { SFSymbol } from "react-native-sfsymbols";

export function Example() {
  return (
    <SFSymbol
      name="thermometer.sun.fill"
      weight="semibold"
      scale="large"
      color="red"
      size={16}
      resizeMode="center"
      multicolor={false}
      style={{ width: 32, height: 32 }}
    />
  );
}
```

They can be animated with Animated

```jsx
import { Animated } from "react-native";
import { SFSymbol } from "react-native-sfsymbols";

const AnimatedSFSymbol = Animated.createAnimatedComponent(SFSymbol);

<AnimatedSFSymbol
  name="sun.min.fill"
  style={{
    opacity: new Animated.Value(1),
  }}
/>;
```

## Props

### name

The symbol name you want to display, can be seen in the [SF Symbols application](https://developer.apple.com/sf-symbols/).

### color (optional)

The color of the symbol written as a hex or color value. PlatformColor and DynamicColorIOS also works.

### weight (optional)

The (font) weight of the symbol.

```
ultralight
light
thin
regular
medium
semibold
bold
heavy
```

Multicolor has issues with this "thin" weight.

### scale (optional)

The scale of the symbol, it will optimise the thickness of detail strokes in the icon for different sizes.

```
small
medium
large
```

### multicolor (optional)

Enable multicolor, don't pass a "color" for it to work properly.

### size (optional)

Font size of the icon as a number.

### resizeMode (optional)

Resize mode of the icon. When "size" is given, it will default to "center" otherwise "scale-aspect-fill".

```
scale-to-fill
scale-aspect-fit
scale-aspect-fill
redraw
center
top
bottom
left
right
top-left
top-right
bottom-left
bottom-right
cover
contain
stretch
```
npm package: @laosing/linie-avatars
Description: React component for line avatars
Author: Drew Rattana
Latest version: 0.1.3

## React Linie Avatars

#### What is linie-avatars?

linie-avatars is a collection of simple line avatars for React.js. Each avatar is designed with an emphasis on simplicity, consistency and readability.

Linie means line in German

<p align="middle">
<img src="https://raw.githubusercontent.com/Laosing/linie-avatars/90516a09893fb0a6df2c06246f198783128dac14/icons/avatar-01.svg">
<img src="https://raw.githubusercontent.com/Laosing/linie-avatars/90516a09893fb0a6df2c06246f198783128dac14/icons/avatar-02.svg">
<img src="https://raw.githubusercontent.com/Laosing/linie-avatars/90516a09893fb0a6df2c06246f198783128dac14/icons/avatar-03.svg">
<img src="https://raw.githubusercontent.com/Laosing/linie-avatars/90516a09893fb0a6df2c06246f198783128dac14/icons/avatar-04.svg">
<img src="https://raw.githubusercontent.com/Laosing/linie-avatars/90516a09893fb0a6df2c06246f198783128dac14/icons/avatar-05.svg">
<img src="https://raw.githubusercontent.com/Laosing/linie-avatars/90516a09893fb0a6df2c06246f198783128dac14/icons/avatar-06.svg">
<img src="https://raw.githubusercontent.com/Laosing/linie-avatars/90516a09893fb0a6df2c06246f198783128dac14/icons/avatar-07.svg">
<img src="https://raw.githubusercontent.com/Laosing/linie-avatars/90516a09893fb0a6df2c06246f198783128dac14/icons/avatar-08.svg">
<img src="https://raw.githubusercontent.com/Laosing/linie-avatars/90516a09893fb0a6df2c06246f198783128dac14/icons/avatar-09.svg">
<img src="https://raw.githubusercontent.com/Laosing/linie-avatars/90516a09893fb0a6df2c06246f198783128dac14/icons/avatar-10.svg">
<img src="https://raw.githubusercontent.com/Laosing/linie-avatars/90516a09893fb0a6df2c06246f198783128dac14/icons/avatar-11.svg">
<img src="https://raw.githubusercontent.com/Laosing/linie-avatars/90516a09893fb0a6df2c06246f198783128dac14/icons/avatar-12.svg">
<img src="https://raw.githubusercontent.com/Laosing/linie-avatars/90516a09893fb0a6df2c06246f198783128dac14/icons/avatar-13.svg">
<img src="https://raw.githubusercontent.com/Laosing/linie-avatars/90516a09893fb0a6df2c06246f198783128dac14/icons/avatar-14.svg">
<img src="https://raw.githubusercontent.com/Laosing/linie-avatars/90516a09893fb0a6df2c06246f198783128dac14/icons/avatar-15.svg">
<img src="https://raw.githubusercontent.com/Laosing/linie-avatars/90516a09893fb0a6df2c06246f198783128dac14/icons/avatar-16.svg">
</p>

### Installation

    yarn add @laosing/linie-avatars

or

    npm i @laosing/linie-avatars

### Usage

```javascript
import React from "react"
import { Avatar01 } from "@laosing/linie-avatars"

const App = () => {
  return <Avatar01 />
}

export default App
```

Icons can be configured with inline props:

```javascript
<Avatar01 color="red" size={48} />
```

You can also include the whole icon pack:

```javascript
import React from "react"
import * as Icon from "@laosing/linie-avatars"

const App = () => {
  return <Icon.Avatar01 />
}

export default App
```

### Development

```bash
yarn compile
```

```bash
yarn build
```

## License

MIT License