open-index/open-npm huggingface dataset:
npm package: @kanzhucai/schematics
Description: Nest - modern, fast, powerful node.js web framework (@schematics)
Latest version: 0.3.19

<p align="center">
  <a href="http://nestjs.com/" target="blank"><img src="https://nestjs.com/img/logo-small.svg" width="120" alt="Nest Logo" /></a>
</p>

  <p align="center">A progressive <a href="http://nodejs.org" target="blank">Node.js</a> framework for building efficient and scalable server-side applications.</p>
    <p align="center">
<a href="https://www.npmjs.com/~nestjscore"><img src="https://img.shields.io/npm/v/@nestjs/schematics.svg" alt="NPM Version" /></a>
<a href="https://www.npmjs.com/~nestjscore"><img src="https://img.shields.io/npm/l/@nestjs/schematics.svg" alt="Package License" /></a>
<a href="https://www.npmjs.com/~nestjscore"><img src="https://img.shields.io/npm/dm/@nestjs/schematics.svg" alt="NPM Downloads" /></a>
<a href="https://discord.gg/G7Qnnhy" target="_blank"><img src="https://img.shields.io/badge/discord-online-brightgreen.svg" alt="Discord"/></a>
<a href="https://opencollective.com/nest#backer" target="_blank"><img src="https://opencollective.com/nest/backers/badge.svg" alt="Backers on Open Collective" /></a>
<a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://opencollective.com/nest/sponsors/badge.svg" alt="Sponsors on Open Collective" /></a>
  <a href="https://paypal.me/kamilmysliwiec" target="_blank"><img src="https://img.shields.io/badge/Donate-PayPal-ff3f59.svg"/></a>
  <a href="https://twitter.com/nestframework" target="_blank"><img src="https://img.shields.io/twitter/follow/nestframework.svg?style=social&label=Follow"></a>

## Description

The Nest CLI is a command-line interface tool that helps you to initialize, develop, and maintain your Nest applications. It assists in multiple ways, including scaffolding the project, serving it in development mode, and building and bundling the application for production distribution. It embodies best-practice architectural patterns to encourage well-structured apps. Read more [here](https://docs.nestjs.com/cli/overview).

## Installation

```bash
$ npm install -g @nestjs/schematics
```

## Usage

Learn more in the [official documentation](https://docs.nestjs.com/).

## Stay in touch

- Website - [https://nestjs.com](https://nestjs.com/)
- Twitter - [@nestframework](https://twitter.com/nestframework)

## License

Nest is [MIT licensed](LICENSE).
npm package: @kanzitelli/if-component
Description: The tiniest missing component for React (Native). Can be used as a TS starter for building components or libraries.
Author: Batyr
Latest version: 0.3.0

<img src="https://xxx-files.ggc.team/oss/if-component/if-component-readme.png" width="100%" title="Logo">

### Install it

```
yarn add @kanzitelli/if-component
```

### Use it

```tsx
import {If} from '@kanzitelli/if-component';

class OrdersScreen = () => {
  return (
    <>
      <If _={loading}
      _then={<LoadingIndicator />}
      _else={<SomethingElse />} />
    </>
  )
}
```

### Expo Web

Since `if-component` uses Reanimated 2, we need its babel plugin to be applied. Expo Web doesn't transpile modules by default, so we'll need to tell it to transpile the library.

1. Install `@expo/webpack-config`:

```
yarn add -D @expo/webpack-config
```

2. Create `webpack.config.js` in the root of your project:

```
const createExpoWebpackConfigAsync = require('@expo/webpack-config')

module.exports = async function (env, argv) {
  const config = await createExpoWebpackConfigAsync(
    {
      ...env,
      babel: { dangerouslyAddModulePathsToTranspile: ['@kanzitelli/if-component'] },
    },
    argv
  )

  return config
}
```

Don't forget to add `webpack.config.js` into `tsconfig.json` under `exclude` section, if needed.

### TS lib starter

```bash
> git clone https://github.com/kanzitelli/if-component rn-lib
> cd rn-lib && rm -rf .git
> yarn
```

Don't forget to change your lib's name in `package.json` and check other scripts.
npm package: @kanzitelli/ts-lib-starter
Description: TS lib starter with scripts to publish it to NPM and create GitHub Releases
Author: Batyr
Latest version: 0.0.1

# TS lib starter

This is a minimalistic TS lib starter with scripts to publish it to `NPM` and create `GitHub releases`.

## Quickstart

1. Clone repo

```sh
npx degit kanzitelli/ts-lib-starter my-library
```

2. Install dependencies

```sh
yarn
```

## License

This project is [MIT licensed](/LICENSE.md)
npm package: @kanziw/auth
Description: Authc & Authz Helper
Author: Jiwoong Jung
Latest version: 0.1.0

# @kanziw/auth

[![npm version](https://img.shields.io/npm/v/@kanziw/auth)](https://www.npmjs.com/package/@kanziw/auth)
[![license](https://img.shields.io/npm/l/@kanziw/auth)](https://www.npmjs.com/package/@kanziw/auth)
[![npm downloads](https://img.shields.io/npm/dt/@kanziw/auth)](https://www.npmjs.com/package/@kanziw/auth)

## Install

```zsh
$ yarn add @kanziw/auth
```
npm package: @kanziw/crypto
Description: Authc & Authz Helper
Author: Jiwoong Jung
Latest version: 0.1.0

# @kanziw/crypto

[![npm version](https://img.shields.io/npm/v/@kanziw/crypto)](https://www.npmjs.com/package/@kanziw/crypto)
[![license](https://img.shields.io/npm/l/@kanziw/crypto)](https://www.npmjs.com/package/@kanziw/crypto)
[![npm downloads](https://img.shields.io/npm/dt/@kanziw/crypto)](https://www.npmjs.com/package/@kanziw/crypto)

## Install

```zsh
$ yarn add @kanziw/crypto
```

## sha256

Hash string with SHA256

```ts
import { sha256 } from '@kanziw/crypto'

// Buffer
const buf = sha256('test')

console.log(buf.toString('hex')) // 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
console.log(buf.toString('base64')) // n4bQgYhMfWWaL+qgxVrQFaO/TxsrC4Is0V1sFbDwCgg=
```
npm package: @kanziw/date
Description: A collection of utility libraries about date
Author: Jiwoong Jung
Latest version: 0.1.1

# @kanziw/date

[![npm version](https://img.shields.io/npm/v/@kanziw/date)](https://www.npmjs.com/package/@kanziw/date)
[![license](https://img.shields.io/npm/l/@kanziw/date)](https://www.npmjs.com/package/@kanziw/date)
[![npm downloads](https://img.shields.io/npm/dt/@kanziw/date)](https://www.npmjs.com/package/@kanziw/date)

## isValidDate

Validate is date object valid

```ts
import { isValidDate } from '@kanziw/date'

isValidDate(new Date()) // true
isValidDate(new Date(NaN)) // false
```
npm package: @kanziw/error
Description: A collection of utility libraries about error
Author: Jiwoong Jung
Latest version: 0.1.0

# @kanziw/error

## wrapUnknownError

```ts
import { wrapUnknownError } from '@kanziw/error'

try {
  someWrongFunction()
} catch (unknownErr: unknown) {
  // Handle err with type Error
  const err: Error = wrapUnknownError(unknownError)
}
```
npm package: @kanziw/kubeflake
Description: Sonyflake + pod hostname as machine id
Latest version: 1.0.0
Deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.

# kubeflake

> sonyflake + pod hostname as machine id  

# DEPRECATED! use [kubeflake](https://www.npmjs.com/package/kubeflake) instead
npm package: @kanziw/promise
Description: A collection of utility libraries about promise
Author: Jiwoong Jung
Latest version: 0.1.1

# @kanziw/promise

[![npm version](https://img.shields.io/npm/v/@kanziw/promise)](https://www.npmjs.com/package/@kanziw/promise)
[![license](https://img.shields.io/npm/l/@kanziw/promise)](https://www.npmjs.com/package/@kanziw/promise)
[![npm downloads](https://img.shields.io/npm/dt/@kanziw/promise)](https://www.npmjs.com/package/@kanziw/promise)


## defer

Handle promise resolve/reject manually.

```ts
import { defer } from '@kanziw/promise'

async function rollbackableInsert() {
  const commitOrRollback = defer<void>()
  const insertedId = defer<string>()

  const txPromise = db.withTransaction(async conn => {
    const { insertId } = await conn.execute(qb.insertInto('table').values({}))
      .then(insertedId.resolve)
      .catch(err => {
        insertedId.reject(err)
        throw err
      });

    await commitOrRollback.promise
  })

  const commit = async () => {
    commitOrRollback.resolve()
    return txPromise
  };

  return {
    insertId: await insertedId.promise,
    commit,
    rollback: deferWaitTransaction.reject,
  }
}

const { insertId, commit, rollback } = await rollbackableInsert()

try {
  // some business logic
  await commit()
} catch (err) {
  await rollback()
  throw err
}
```
npm package: @kanziw/statsd-client
Description: StatsDClient for InfluxDB
Author: kanziw
Latest version: 0.1.0-rc0

# StatsDClient
> StatsDClient for InfluxDB  
> Inspired by [statsd-client](https://github.com/msiebuhr/node-statsd-client) & [hot-shots](https://github.com/brightcove/hot-shots)

## Installation
```zsh
$ npm install @kanziw/statsd-client
```

## API
### Initialization

```ts
import StatsDClient from '@kanziw/statsd-client'

const statsDClient = new StatsDClient({ host: 'statsd.example.com', port: 8125 });
```

Global options:
- prefix: Prefix all stats with this value (default "").

### Counting stuff
Counters are supported, both as raw `.counter(metric, delta)` and with the shortcuts `.increment(metric, [delta=1])`:

```ts
statsDClient.counter('measurements.path', 100) // Increment by 100
statsDClient.increment('measurements.path') // Increment by one
```

### Tags
All the methods above support metric level tags as their last argument. Tags is an object of string key/value pairs:

```ts
statsDClient.counter('measurements.path', 100, { tagKey: tagValue })
statsDClient.increment('measurements.path', 1, { tagKey: tagValue }) // Should write delta
```
npm package: @kanziw/stream
Description: A collection of utility libraries about stream
Author: Jiwoong Jung
Latest version: 0.1.0

# @kanziw/stream

[![npm version](https://img.shields.io/npm/v/@kanziw/stream)](https://www.npmjs.com/package/@kanziw/stream)
[![license](https://img.shields.io/npm/l/@kanziw/stream)](https://www.npmjs.com/package/@kanziw/stream)
[![npm downloads](https://img.shields.io/npm/dt/@kanziw/stream)](https://www.npmjs.com/package/@kanziw/stream)


## drain

Drain stream

```ts
import { drain } from '@kanziw/stream'

const buf = await drain(someStream)
```


## waitUntilFinished

Wait until stream finished

```ts
import { waitUntilFinished } from '@kanziw/stream'

await waitUntilFinished(someStream)
```
npm package: @kanziw/time
Description: A collection of utility libraries about time
Author: Jiwoong Jung
Latest version: 0.3.3

# @kanziw/time

[![npm version](https://img.shields.io/npm/v/@kanziw/time)](https://www.npmjs.com/package/@kanziw/time)
[![license](https://img.shields.io/npm/l/@kanziw/time)](https://www.npmjs.com/package/@kanziw/time)
[![npm downloads](https://img.shields.io/npm/dt/@kanziw/time)](https://www.npmjs.com/package/@kanziw/time)

## cancellableDelay

```ts
import { cancellableDelay } from '@kanziw/time'

const delay100 = cancellableDelay(100)
const delay1000 = cancellableDelay(1000)

// It takes about 100ms
await Promise.all([
  delay100.promise.finally(delay1000.cancel),
  delay1000.promise,
])
```

## delay
```ts
import { delay } from '@kanziw/time'

// It takes about 100ms
await delay(100)
```

## stopwatch

Measure elapsed ms using perf_hooks.performance

```ts
import { startStopwatch } from '@kanziw/time'
import { setTimeout as delay } from 'timers/promises'

const stopwatch = startStopwatch()
await delay(100)

const elapsedMs = stopwatch.end()
console.log(elapsedMs) // 100.74062514305115
```

## timezone

### time formatter

Format date to string with date, time and datetime format

```ts
import { formatWithTimezoneOffset, kstFormat, utcFormat } from '@kanziw/time'

const d = new Date('2022-05-16T00:00:00.000Z')
const dMs = d.getTime()

const timeFormatter = formatWithTimezoneOffset('+17:30')(d) // or formatWithTimezoneOffset('+17:30')(d)
console.log(`${timeFormatter.date()} / ${timeFormatter.time()} / ${timeFormatter.datetime()}`)
// 2022-05-16 / 17:30:00 / 2022-05-16 17:30:00

// utcFormat equals formatWithTimezoneOffset('+00:00')
const utc = utcFormat(d) // or utcFormat(dMs)
console.log(`${utc.date()} / ${utc.time()} / ${utc.datetime()}`)
// 2022-05-16 / 00:00:00 / 2022-05-16 00:00:00

// kstFormat equals formatWithTimezoneOffset('+09:00')
const kst = kstFormat(d) // or kstFormat(dMs)
console.log(`${kst.date()} / ${kst.time()} / ${kst.datetime()}`)
// 2022-05-16 / 09:00:00 / 2022-05-16 09:00:00
```
npm package: @kaokei/di
Description: Tiny di library depends on typescript decorator.
Author: kaokei
Latest version: 5.0.2

<h1 align="center">npm install @kaokei/di</h1>
<div align="center">

[![Build Status](https://github.com/kaokei/di/actions/workflows/build.yml/badge.svg)](https://github.com/kaokei/di/actions/workflows/build.yml)
[![Coverage Status](https://coveralls.io/repos/github/kaokei/di/badge.svg?branch=main)](https://coveralls.io/github/kaokei/di?branch=main)
[![Downloads](https://img.shields.io/npm/dm/@kaokei/di.svg?sanitize=true)](https://npmcharts.com/compare/@kaokei/di?minimal=true)
[![Version](https://img.shields.io/npm/v/@kaokei/di.svg?sanitize=true)](https://www.npmjs.com/package/@kaokei/di)
[![License](https://img.shields.io/npm/l/@kaokei/di.svg?sanitize=true)](https://www.npmjs.com/package/@kaokei/di)
![GitHub Created At](https://img.shields.io/github/created-at/kaokei/di?style=social)

</div>

本库是一个轻量级的依赖注入库，类似的其他比较流行的库有`InversifyJS`和`typedi`。

本库主要特点是参考借鉴了`InversifyJS`和`Angular`的优秀 API 设计，不依赖`reflect-metadata`，支持属性注入的循环依赖。

- [入门指南](./docs/guide/index.md)
- [API 文档](./docs/api/index.md)
- [博客文章](./docs/note/01.什么是Token.md)
- [CodeSandbox 在线示例](./docs/guide/EXAMPLES.md)
npm package: @kaokei/iframe-manager
Description: iframe manager for micro-frontend
Author: kaokei
Latest version: 1.0.6

## github 地址

- [github](https://github.com/kaokei/iframeManager)

## 解决了什么问题？

主要是用来统一管理 iframe，缓存 iframe，避免 iframe 重渲染，从而实现微前端的效果。

## 整体介绍

使用 iframe 来实现微前端的好处非常明显，就是简单，自带 css 隔离和 js 隔离。

但是也面临着很多问题。比如这些问题：

- iframe 重新 reload  
  这个问题是通过 iframeManager 来统一管理缓存来解决的。

- iframe 高度自适应  
  这个问题是采用 iframe-resizer 来解决的。

- iframe 跨域通信  
  这个问题是采用@kaokei/post-bridge 来解决的。

- 父子页面的路由保持一致  
  这个问题并没有以开源库的方式来解决，主要是因为这个问题比较复杂，没有通用的解决方案，但是可以参考 demo 中的最佳实践来实现自己的方案。
npm package: @kaokei/post-bridge
Description: jsbridge for iframes or windows by window.postMessage
Author: kaokei
Latest version: 1.0.2

## github 地址

- [github](https://github.com/kaokei/postBridge)

## 解决了什么问题？

主要是解决了父子 iframe 之间互相通信的问题。可以像 rpc 一样简单的调用对方的方法，并且获取返回值，并支持 Promise。

## 整体方案以及使用方式

考虑这样的场景，一个页面 A 包含两个 iframe，分别是 B 和 C。

那么在 A 页面中：

```js
PostBridge.registerMethods({
  sayHello() {
    console.log('hello from Page A');
  },
  getUserName() {
    return 'userNameA';
  },
});
PostBridge.start();

// 需要手动获取 iframeB 和 iframeC 的dom对象
const postBridgeB = new PostBridge(iframeB.contentWindow);
const postBridgeC = new PostBridge(iframeC.contentWindow);

// iframeB 中输出 `hello from Page B`
postBridgeB.call('sayHello');
// iframeA 中获取 userName，并打印出 `userNameB`
postBridgeB.request('getUserName').then(name => console.log(name));

// iframeC 中输出 `hello from Page C`
postBridgeC.call('sayHello');
// iframeA 中获取 userName，并打印出 `userNameC`
postBridgeC.request('getUserName').then(name => console.log(name));
```

然后在 B 页面中：

```js
PostBridge.registerMethods({
  sayHello() {
    console.log('hello from Page B');
  },
  getUserName() {
    return 'userNameB';
  },
});
PostBridge.start();

// 其实也可以使用 window.top
const postBridgeA = new PostBridge(window.parent);

// iframeA 中输出 `hello from Page A`
postBridgeA.call('sayHello');
// iframeB 中获取 userName，并打印出 `userNameA`
postBridgeA.request('getUserName').then(name => console.log(name));
```

页面 C 和页面 B 是类似的，就不再重复了。

可以发现我们使用静态类 PostBridge 本身代表当前页面，主要是通过 registerMethods 来暴露对外的接口，以及通过 start 来监听所有事件。

我们用 PostBridge 的实例对象来代表我们想要通信的页面，比如在 A 页面中我们需要和 B 以及 C 通信，那么就需要实例化 postBridgeB 和 postBridgeC 两个对象。并且需要传递 iframeDom.contentWindow 作为参数。同样的在页面 B 和页面 C 中则需要传递 window.parent 作为参数。

最终的效果是我们可以使用 postBridgeA 对象调用页面 A 中的函数，使用 postBridgeB 对象调用页面 B 中的函数，使用 postBridgeC 对象调用页面 C 中的函数。

父子页面的通信比较简单直接，如果想要实现页面 B 和页面 C 之间的互相通信，则比较麻烦了，因为页面 B 和页面 C 之间是互相没有感知的。如果确实有这个需求，我们可以通过父页面来中转消息。
npm package: @kaokei/use-react-service
Description: jsbridge for iframes or windows by window.postMessage
Author: kaokei
Latest version: 1.0.3

<h1 align="center">use-react-service</h1>
<div align="center">

[![Node.js CI](https://github.com/kaokei/use-react-service/actions/workflows/build.yml/badge.svg)](https://github.com/kaokei/use-react-service/actions/workflows/build.yml) [![Coverage Status](https://coveralls.io/repos/github/kaokei/use-react-service/badge.svg?branch=main)](https://coveralls.io/github/kaokei/use-react-service?branch=main)

</div>

## 待修改的 5 个名字

- 项目名，也就是项目文件夹的名称，这个在我们创建项目时就已经指定了。
- package.json 中的 name，这个大多数时可能就是和项目名一致了，但是如果是带有 scope 的，或者驼峰的，都需要自己修改。
- package.json 中的 browserVariableName，这个大多数情况下不关心也不会有问题，但是如果我们想要编译的代码想要在浏览器中直接使用，最好是指定一个全局变量。
- package.json 中的 homepage，bugs-url，repository-url 这些外部链接。
- README.md 中的 github 地址。

## github 地址

- [github](https://github.com/kaokei/use-react-service)

## 解决了什么问题？

## 整体方案以及使用方式

## 特性

使用 typescript，并且类型定义统一在 types 文件夹中，建议使用 module 来管理类型，而不是 script 来创建全局的类型。
`tsconfig.json`作为编辑器的默认配置文件，方便编辑器识别。实际构建时使用`tsconfig.app.json`文件

使用 esm 模块化规范

使用 npm 作为包管理

使用 git 作为代码版本工具。

编码规范使用 eslint+prettier+editorconfig

git commit message 采用 angular 规范，以及使用 commitlint 校验

使用 yorkie 自动化校验并格式化代码，自动化校验 commit message

使用 jest 作为单元测试，统一放在`tests`文件夹中。

可以在 playground 中进行代码实验，使用 vscode 配置.vscode/launch.json 可以调试 nodejs

使用 rollup 作为打包工具，同时打包出多个版本的 bundle。支持压缩/未压缩、使用 runtime/不使用 runtime、commonjs/esm、浏览器版本总共 10 个版本。

npm run release:first 第一次发布，会自动创建 CHANGELOG.md 文件
npm run release patch 发布新版本

使用 MIT 作为开源协议
npm package: @kaokei/use-vue-service
Description: Lightweight Vue 3 state management with dependency injection, inspired by Angular services.
Author: kaokei
Latest version: 3.0.2

<h1 align="center">npm install @kaokei/use-vue-service</h1>

<div align="center">

[![Build Status](https://github.com/kaokei/use-vue-service/actions/workflows/build.yml/badge.svg)](https://github.com/kaokei/use-vue-service/actions/workflows/build.yml)
[![Coverage Status](https://coveralls.io/repos/github/kaokei/use-vue-service/badge.svg?branch=main)](https://coveralls.io/github/kaokei/use-vue-service?branch=main)
[![Downloads](https://img.shields.io/npm/dm/@kaokei/use-vue-service.svg?sanitize=true)](https://npmcharts.com/compare/@kaokei/use-vue-service?minimal=true)
[![Version](https://img.shields.io/npm/v/@kaokei/use-vue-service.svg?sanitize=true)](https://www.npmjs.com/package/@kaokei/use-vue-service)
[![License](https://img.shields.io/npm/l/@kaokei/use-vue-service.svg?sanitize=true)](https://www.npmjs.com/package/@kaokei/use-vue-service)
![GitHub Created At](https://img.shields.io/github/created-at/kaokei/use-vue-service?style=social)

</div>

灵感来自 angular 中的服务的概念。在 angular 中不需要全局唯一的数据源 store。而是通过声明服务，以及向组件中注入服务来达到数据管理以及数据共享的。

本库也是实现了类似的效果，可以通过依赖注入实现面向服务编程、实现领域驱动开发。从而可以代替 vuex/pinia。

本库通过类来声明服务，对 typescript 支持非常棒。

- [入门指南](./docs/guide/README.md)
- [API 文档](./docs/api/README.md)
- [博客文章](./docs/note/01.父组件与子组件的理解.md)
- [codesandbox example](https://codesandbox.io/s/di-playground-zjnyv)
- [online demo](https://use-vue-service.vercel.app/)
npm package: @kaokei/vuepress-plugin-frontmatter
Description: vuepress@1.x插件，基于vdoing的主题，增加可以自动化生成frontmatter的命令
Author: kaokei
Latest version: 1.0.2

# [@kaokei/vuepress-plugin-frontmatter](https://github.com/kaokei/vuepress-plugin-frontmatter)

> vuepress@1.x 的插件，增加了`vuepress fmt docs`的命令，可以方便自动化生成 frontmatter 头部数据。

## Install

```bash
npm install -D @kaokei/vuepress-plugin-frontmatter
```

## Usage

```javascript
module.exports = {
  plugins: ["@kaokei/vuepress-plugin-frontmatter"],
};
```

> 需要在项目的 package.json 文件的 scripts 部分新增`"fmt": "vuepress fmt docs",`
> 当新建一个新的 markdown 文件时，默认是一个空文件，当然也没有`frontmatter`，此时可以执行命令`npm run fmt`
> 之所以增加这个命令，是因为`vdoing`主题默认只支持`npm run dev`和`npm run build`这两个命令可以自动生成`frontmatter`
> 除了增加了上面的命令以外，还做了永久链接的重复检查，如果存在重复的永久链接，会在终端进行提示。

## 其他

需要注意本插件是基于 vdoing 主题的。除了新增加了 frontmatter 的命令。

还增加了一个功能就是默认`_posts`文件夹下的所有文件的`frontmatter`的`showSidebar`属性默认为`false`。

注意`showSidebar`属性是一个新增的 vdoing 主题特有的属性，不是 vuepress 原本就支持的属性。

主要是为了解决这样的问题。当 sidebar=false 时，虽然不会显示左侧 sidebar，但是也会导致不现实`rightMenu`。

但是`showSidebar=false`时，仍然可以显示右侧`rightMenu`。
npm package: @kaokei/vuepress-plugin-tongji
Description: vuepress@1.x插件，支持各种平台的统计脚本。
Author: kaokei
Latest version: 1.0.2

# [@kaokei/vuepress-plugin-tongji](https://github.com/kaokei/vuepress-plugin-tongji)

> vuepress 的插件，支持各种平台的统计脚本  
> 目前支持百度、友盟、ga 和 gtag  
> 主要功能就是加载对应的脚本。并且在 router.afterEach 中上报对应的 pageView 事件。

## Install

```bash
npm install -D @kaokei/vuepress-plugin-tongji
```

## Usage

```javascript
module.exports = {
  plugins: [
    "@kaokei/vuepress-plugin-tongji",
    {
      hm: "abcdefghijklmnopqrstuvwxyz12345678",
      ga: "UA-XXXXX-Y",
      gtag: "G-EYE5NYPT4N",
      cnzz: "XXXXXX",
      cnzz_web: "YYYYYYY",
    },
  ],
};
```

or

```javascript
module.exports = {
  plugins: [
    "@kaokei/tongji",
    {
      hm: "abcdefghijklmnopqrstuvwxyz123456",
      ga: "UA-XXXXX-Y",
      gtag: "G-EYE5NYPT4N",
      cnzz: "XXXXXX",
      cnzz_web: "YYYYYYY",
    },
  ],
};
```

or

```javascript
module.exports = {
  plugins: {
    "@kaokei/tongji": {
      hm: "abcdefghijklmnopqrstuvwxyz123456",
      ga: "UA-XXXXX-Y",
      gtag: "G-EYE5NYPT4N",
      cnzz: "XXXXXX",
      cnzz_web: "YYYYYYY",
    },
  },
};
```

## Options

### hm

- Type: `string`
- Default: `undefined`

对应百度的统计 ID。

比如这个链接中的`https://hm.baidu.com/hm.js?46670fd61dde16af9949ec6af1c52ff9`。

hm 对应链接中的`46670fd61dde16af9949ec6af1c52ff9`。

### ga

- Type: `string`
- Default: `undefined`

对应老版本的 google analytics 的 ID。特征是`UA-`开头。

### gtag

- Type: `string`
- Default: `undefined`

对应新版本的 google gtag 的 ID。特征是`G-`开头。

### cnzz 和 cnzz_web

- Type: `string`
- Default: `undefined`

对应友盟，也就是 CNZZ 的统计。需要提供两个 ID。

比如这个链接：`https://s9.cnzz.com/z_stat.php?id=2380698182&web_id=2380698182`

那么 cnzz 对应的是 id 部分，也就是`2380698182`，cnzz_web 对应的是 web_id 部分，也就是`2380698182`。

但是似乎两个 id 是一样的，搞不清楚 CNZZ 为啥需要两个 ID。
npm package: @kaokei/webpack-aliyun-oss
Description: a webpack(version>=4) plugin to upload assets to aliyun oss, can be used with or without webpack.
Author: paul
Latest version: 0.5.3

# webpack-aliyun-oss
A webpack(version>=4) plugin to upload assets to aliyun oss, u can use it with or without webpack.

一个webpack(version>=4)插件，上传资源到阿里云oss。可以作为webpack插件使用，也可独立使用

- 以插件方式使用时，默认按output.path (webpack.config.js) 目录下的文件路径上传(保留原文件路径的层级结构)。
- 独立使用时，按`buildRoot`的文件路径上传(保留原文件路径的层级结构)。
- 以上两种方式，都可以通过`setOssPath`重新配置不同的上传路径。

Install
------------------------
```shell
$ npm i webpack-aliyun-oss -D
```

Options
------------------------

- `from`: 上传哪些文件，支持glob方式，如'./build/**', 可以为glob字符串或者数组。
    - 作为插件使用时：可选。默认为output.path下所有的文件。
    - 独立使用时：必传
- `dist`: 上传到oss哪个目录下，默认为oss根目录。可作为路径前缀使用。
- `region`: 阿里云上传区域
- `accessKeyId`: 阿里云的授权accessKeyId
- `accessKeySecret`: 阿里云的授权accessKeySecret
- `bucket`: 上传到哪个bucket
- `timeout`: oss超时设置，默认为30秒(30000)
- `overwrite`: 是否覆盖oss同名文件。默认false
- `deleteOrigin`: 上传完成是否删除原文件，默认false
- `deleteEmptyDir`: 如果某个目录下的文件都上传过了，是否删除此目录。`deleteOrigin`为true时候生效。默认false。
- `setOssPath`: 自定义每个文件上传路径。接收参数为当前文件路径。不传，或者所传函数返回false则按默认方式上传。
- `setHeaders`: 配置headers的函数。接收参数为当前文件路径。不传，或者所传函数返回false则不设置header。
- `buildRoot`: 构建目录。如：path/to/your/files。独立使用时候需要传。如果已传`setOssPath`可忽略。默认为当前工作目录。
- `test`: 测试，仅查看文件和上传路径，但是不执行上传操作。默认false
- `bail`: 出错是否中断上传。默认false
- `logToLocal`: 出错信息写入本地upload.error.log。默认false

#### 注意: `accessKeyId, accessKeySecret` 很重要，注意保密!!!

Example
------------------------

##### 作为webpack插件使用
```javascript
const WebpackAliyunOss = require('webpack-aliyun-oss');
const webpackConfig = {
  // ... 省略其他
  plugins: [new WebpackAliyunOss({
    from: ['./build/**', '!./build/**/*.html'], // build目录下除html之外的所有文件
    dist: '/path/in/alioss', // oss上传目录
    region: 'your region',
    accessKeyId: 'your key',
    accessKeySecret: 'your secret',
    bucket: 'your bucket',

    // 如果希望自定义上传路径，就传这个函数
    // 否则按 output.path (webpack.config.js) 目录下的文件路径上传
    setOssPath(filePath) {
      // filePath为当前文件路径。函数应该返回路径+文件名。
      // 如果返回/new/path/to/file.js，则最终上传路径为 /path/in/alioss/new/path/to/file.js
      return '/new/path/to/file.js';
    },

    // 如果想定义header就传
    setHeaders(filePath) {
      // 定义当前文件header，可选
      return {
        'Cache-Control': 'max-age=31536000'
      }
    }
  })]
}
```

##### 独立使用

```javascript
const WebpackAliyunOss = require('webpack-aliyun-oss');
new WebpackAliyunOss({
    from: ['./build/**', '!./build/**/*.html'],
    dist: '/path/in/alioss',
    buildRoot: 'build', // 构建目录，如果已传setOssPath，可忽略
    region: 'your region',
    accessKeyId: 'your key',
    accessKeySecret: 'your secret',
    bucket: 'your bucket',

    // 如果希望自定义上传路径，就传这个函数
    // 否则按`buildRoot`下的文件结构上传
    setOssPath(filePath) {
      // filePath为当前文件路径。函数应该返回路径+文件名。
      // 如果返回/new/path/to/file.js，则最终上传路径为 /path/in/alioss/new/path/to/file.js
      return '/new/path/to/file.js';
    },

    // 如果想定义header就传
    setHeaders(filePath) {
      return {
        'Cache-Control': 'max-age=31536000'
      }
    }
}).apply(); 
```
npm package: @kaolatest/kl-clipboard
Description: intro component
Latest version: 1.0.0

# ks clicpboard

@kaolatest/k-s-clipboard

intro component

## API

| 参数名 | 说明 | 必填 | 类型 | 默认值 | 备注 |
| ------ | ---- | ---- | ---- | ------ | ---- |
|        |      |      |      |        |      |
npm package: @kaolatest/kl-divider
Description: intro component
Latest version: 1.0.1

# kl divider

@kaolatest/k-l-divider

intro component

## API

| 参数名 | 说明 | 必填 | 类型 | 默认值 | 备注 |
| ------ | ---- | ---- | ---- | ------ | ---- |
|        |      |      |      |        |      |
npm package: @kaonis/protocol
Description: Shared WoLy node <-> C&C protocol types and runtime schemas
Latest version: 1.0.0
Deprecated: Renamed to @kaonis/woly-protocol

# @kaonis/protocol

Shared protocol types and runtime schemas for communication between `woly-backend` (node agent) and `woly-cnc-backend` (C&C).

## Exports

- `PROTOCOL_VERSION`
- `SUPPORTED_PROTOCOL_VERSIONS`
- `outboundNodeMessageSchema`
- `inboundCncCommandSchema`
- Type exports from `index.d.ts` (`NodeMessage`, `CncCommand`, `NodeRegistration`, etc.)

## Publish

From the `woly-backend` repo root:

```bash
npm run protocol:pack
npm run protocol:publish
```

Or use the GitHub workflow: `Publish Protocol Package`.

## Versioning

1. Bump `packages/protocol/package.json` version.
2. Publish package.
3. Update both repos to consume the new semver version.
4. Run protocol contract tests in both repos before merge.