open-index/open-npm huggingface dataset:
npm package: @kokkoro/core
Description: Core features for kokkoro.
Author: Yuki
Latest version: 3.0.13

# core

[![package](https://img.shields.io/npm/v/@kokkoro/core?color=57B497&label=@kokkoro/core&style=flat-square&labelColor=FAFAFA&logo=npm)](https://www.npmjs.com/package/@kokkoro/core)
[![engine](https://img.shields.io/node/v/@kokkoro/core?color=339933&style=flat-square&labelColor=FAFAFA&logo=Node.js)](https://nodejs.org)

如果你想快速开发机器人，建议直接使用 [kokkoro](https://github.com/kokkorojs/kokkoro) 框架，该库不包含 web 与 database 等服务。

作为 kokkoro 的核心依赖库，特性与 [amesu](https://github.com/xueelf/amesu) 保持一致，并在此基础上扩展了插件体系。

## Install:

```bash
npm i @kokkoro/core
```

## Usage:

```javascript
import { Bot } from '@kokkoro/core';

/**
 * @type {import('@kokkoro/core').BotConfig}
 */
const config = {};
const bot = new Bot(config);

bot.online();
```

## Plugin:

你可以在根目录创建 `plugins` 文件夹来存放你编写的插件。

```tex
.
├ plugins/
│ └ example/
└ index.js
```

当然，这并不是强制要求，推荐这么做只是为了方便插件的分类与管理。

```javascript
// plugins/example/index.js
import { useCommand, useEvent } from '@kokkoro/core';

/**
 * @type {import('@kokkoro/core').Metadata}
 */
export const metadata = {
  name: 'example',
  description: '插件示例',
};

export default function Example() {
  useEvent(
    ctx => {
      ctx.logger.mark('link start');
    },
    ['session.ready'],
  );

  useCommand('/测试', () => 'hello world');
  useCommand('/复读 <message>', ctx => ctx.query.message);
}
```

只要对插件进行 `mountPlugin` 操作，就可将其挂载：

```javascript
// index.js
import { Bot, mountPlugin } from '@kokkoro/core';

await mountPlugin('./plugins/example/index.js');

/**
 * @type {import('@kokkoro/core').BotConfig}
 */
const config = {};
const bot = new Bot(config);

bot.online();
```

你也可以直接安装 npm 插件来进行使用。

```bash
npm i kokkoro-plugin-hitokoto
```

```javascript
// index.js
import { Bot, mountPlugin } from '@kokkoro/core';

await mountPlugin('./plugins/example/index.js');
await mountPlugin('kokkoro-plugin-hitokoto');

/**
 * @type {import('@kokkoro/core').BotConfig}
 */
const config = {};
const bot = new Bot(config);

bot.online();
```

使用 `mountPlugin` 方法所传入的路径，与 `import` 的规则是保持一致的。不过值得注意的是，kokkoro 是一个 **esm** 模块包，完全遵守 ESModule 规范，而不是 Commonjs。

```javascript
import { mountPlugin } from '@kokkoro/core';

// Good
await mountPlugin('./example.js');
await mountPlugin('example');

// Bad
await mountPlugin('example.js');
await mountPlugin('./example');
await mountPlugin('./plugins/example');
```

## Config:

配置项与 amesu 基本一致，在此基础上添加了 `plugins` 属性，传入字符串数组。

```javascript
import { Bot, mountPlugin } from '@kokkoro/core';

await mountPlugin('./plugins/example/index.js');
await mountPlugin('kokkoro-plugin-hitokoto');

/**
 * @type {import('@kokkoro/core').BotConfig}
 */
const config = {
  // ...
  plugins: ['hitokoto'],
};
const bot = new Bot(config);

bot.online();
```

如果 `plugins` 不传入，则默认所有已挂载的插件会对 bot 生效。如果添加了相应字段，那么只有被添加 name（编写插件时导出的 metadata 属性）的插件才会被实例对象使用。

例如上面的例子，当前 bot 只有 hitokoto 插件被应用，example 插件不会对指令作出响应，这便于多个 bot 实例针对不同插件来管理。
npm package: @kokkoro/jsondb
Description: Local JSON database (◕ω＜)☆
Author: yuki
Latest version: 1.2.3

# jsondb

Local JSON database (◕ω＜)☆

```javascript
const { Database } = require('@kokkoro/jsondb');

const db = new Database('kokkoro'); // created "kokkoro/index.json"

console.log(db); // JSON file => {}
db.message = 'hello world'; // JSON file => { "message": "hello world" }

setInterval(() => {
  // modify local JSON file to support hot update
  console.log(db.message);
}, 2000);
```
npm package: @kokkoro/web
Description: Create web serve for kokkoro.
Author: yuki
Latest version: 0.1.4

# kokkoro-web

Create web serve for kokkoro.

```typescript
import { app } from '@kokkoro/web';

const port = 2333;

app.listen(port, () => {
  console.log(`web serve started at http://localhost:${port}`);
});
```
npm package: @kokojs/babel-preset-miniapp
Description: Babel preset for miniapp projects.
Latest version: 4.0.36

# Babel 预设配置 - 小程序

`babel-preset-miniapp` 是有赞小程序应用统一的 Babel 配置。

## 使用方式

### 安装

```bash
yarn add @kokojs/babel-preset-miniapp --dev
```

### 配置

在 `babel.config.js` 中添加对应的 preset：

```js
module.exports = {
  presets: ['@kokojs/babel-preset-miniapp'],
};
```

## 内置插件列表

#### @babel/preset-env

用于 polyfill ESNext 语法。

#### @babel/plugin-transform-runtime

用于将 Babel helper 转换为 import 形式，减少代码体积。

#### @babel/preset-typescript

用于转换 TypeScript 语法。

#### babel-plugin-import

用于组件库按需引入，目前包含以下组件库：

- @youzan-open/vant-tee

#### @babel/plugin-proposal-class-properties

用于转换 class 的属性。

#### @babel/plugin-proposal-decorators

装饰器语法支持。

## 维护者

陈嘉涵。
npm package: @kokojs/plugin-babel
Description: `@kokojs/plugin-babel` 基于 `babel` 提供 js 和 ts 的编译能力。
Latest version: 4.0.36

# Babel 插件

`@kokojs/plugin-babel` 基于 `babel` 提供 js 和 ts 的编译能力。

## 安装

```bash
yarn add @kokojs/plugin-babel --dev
```

安装完成后，在 `koko.config.js` 中添加如下配置：

```js
module.exports = {
  plugins: {
    babel: {},
  },
};
```

## 配置 Babel

koko 中不包含 babel 配置文件，因此需要在项目里自行配置。

- C 端应用：使用 [babel-preset-h5](/packages/@kokojs/babel-preset-h5/)
- B 端应用：使用 [babel-preset-pc](/packages/@youzan/babel-preset-pc/)

## 配置项

### presets

- Type: `PluginItem[]`
- Default: `undefined`

自定义 Babel Presets，详见 [Presets](https://babeljs.io/docs/en/presets)。

```js
// koko.config.js
module.exports = {
  plugins: {
    babel: {
      presets: ['@babel/preset-react'],
    },
  },
};
```

### plugins

- Type: `PluginItem[]`
- Default: `undefined`

自定义 Babel Plugins，详见 [Plugins](https://babeljs.io/docs/en/plugins)。

```js
// koko.config.js
module.exports = {
  plugins: {
    babel: {
      plugins: ['@babel/plugin-proposal-class-properties'],
    },
  },
};
```

### checkType

- Type: `boolean`
- Default: `true`

是否开启 TypeScript 编译时类型检查，基于 [fork-ts-checker-webpack-plugin](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin) 实现。

项目中存在 `tsconfig.json` 文件时才会开启。

### scriptTranspile

- Type: `'dev' | 'build' | 'all' | 'none'`
- Default: `'all'`

是否开启 Babel 编译，默认开启。

- 值为 `dev` 时，表示仅在 dev 模式下开启
- 值为 `build` 时，表示仅在 build 模式下开启
- 值为 `all` 时，会在 dev & build 模式下开启
- 值为 `none` 时，表示不开启

### nodeModulesTransform

- Type: `'prod-only' | 'none'`
- Default: `'none'`

是否对 node_modules 中的代码进行编译，`prod-only` 表示只在生产环境构建时编译，`none` 表示不编译。

按照社区的约定，node_modules 中的前端库默认会提供 ES5 格式的代码，因此大部分工具不会对 node_modules 进行 babel 编译。

但是随着 ES6 语法的广泛运用，经常会出现未经编译的 ES6 代码被发布到 npm 的情况，并导致引入代码的项目出现线上兼容性问题。为了避免这样的问题，可以在以下两种方式中进行选择：

1. 使用 `compilePackages` 或 `nodeModulesTransform`，对 node_modules 中的代码采取基本的 babel 编译，这样做会对编译速度有一定影响。
2. 使用 `koko-plugin-es-guard`，检测 node_modules 中的 ES6 语法，并手动处理。

### compilePackages

- Type: `string[]`
- Default: `undefined`

需要编译的 npm 包列表，如果 node_modules 中存在使用 ESNext 语法的 npm 包，可以通过配置该选项进行编译。

```js
// koko.config.js
module.exports = {
  plugins: {
    babel: {
      compilePackages: ['query-string'],
    },
  },
};
```

## 维护者

陈嘉涵。
npm package: @kokojs/plugin-dll
Description: 通过 `@kokojs/plugin-dll` 可以构建 DLL 文件，提升代码编译速度。
Latest version: 4.0.36

# DLL 插件

通过 `@kokojs/plugin-dll` 可以构建 DLL 文件，提升代码编译速度。

## 安装

```bash
yarn add @kokojs/plugin-dll --dev
```

## 配置项

### name

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

DLL 文件名称。

### include

- Type: `string[]`
- Default: `[]`

打包到 DLL 中的模块名称列表。

### cacheKey

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

缓存标识符，当缓存标识符未发生变化时，会跳过 DLL 的编译过程，直接复用上次编译结果。

通过执行 `npx koko clean` 可以清除缓存。

### prodCache

- Type: `boolean`
- Default: `false`

是否启用生产环境缓存。

未启用该选项时，缓存只会在 dev 模式下生效，启用后 prod 模式也会走缓存。使用该选项时，需要确保 cacheKey 能正确唯一标识 DLL 的内容。

## 示例

### 配置单个 DLL

在 `koko.config.js` 中添加如下配置：

```js
module.exports = {
  plugins: {
    dll: {
      name: 'common',
      include: ['@youzan/a', '@youzan/b'],
    },
  },
};
```

> Tips: 配置 DLL 后，需要在 HTML 中引入对应的 JS 文件。

### 配置多个 DLL

可以通过数组的形式配置多个 DLL，按照数组顺序进行构建。

```js
module.exports = {
  plugins: {
    dll: [
      {
        name: 'common',
        include: ['@youzan/a', '@youzan/b'],
      },
      {
        name: 'common2',
        include: ['@youzan/c', '@youzan/b'],
      },
    ],
  },
};
```

## DLL 依赖关系

当项目中有多个 DLL 时，会按照顺序依次打包，先打包的 DLL 作为后打包 DLL 的依赖。

## 维护者

陈嘉涵。
npm package: @kokojs/plugin-esbuild
Description: `@kokojs/plugin-esbuild` 提供了基于 [esbuild](https://github.com/evanw/esbuild) 进行压缩的能力。
Latest version: 4.0.36

# ESBuild 插件

`@kokojs/plugin-esbuild` 提供了基于 [esbuild](https://github.com/evanw/esbuild) 进行压缩的能力。

## 安装

```bash
yarn add @kokojs/plugin-esbuild --dev
```

安装完成后，在 `koko.config.js` 中添加如下配置：

```js
module.exports = {
  plugins: {
    esbuild: {},
  },
};
```

## 介绍

ESBuild 是使用 Go 语言编写的 JavaScript bundler & minifier，它的特点是构建速度极快，相比 Terser 有数十倍的提升。

在大型工程中使用本插件，可以大幅度减少编译所需的时间。

### minify

- Type: `Boolean`
- Default: `true`

是否在 build 时使用 ESBuild 进行代码压缩，开启此选项时，会替换 Webpack 默认的 Terser 压缩。

### scriptTranspile

- Type: `'dev' | 'build' | 'all' | 'none'`
- Default: `'none'`

是否通过 esbuild-loader 来编译 JS/TS 代码。

- 值为 `dev` 时，表示仅在 dev 模式下开启（推荐使用）
- 值为 `build` 时，表示仅在 build 模式下开启
- 值为 `all` 时，会在 dev & build 模式下开启
- 值为 `none` 时，表示不开启

```js
// koko.config.js
module.exports = {
  plugins: {
    // 在 dev 时使用 esbuild
    esbuild: {
      scriptTranspile: 'dev',
    },
    // 在 build 时使用 babel
    babel: {
      scriptTranspile: 'build',
    },
  },
};
```

## 注意事项

ESBuild 压缩结果中会产生 ES6 语法，比如模板字符串，在使用时请考虑业务对兼容性的要求，不建议在 C 端业务中使用。

另外，在使用 ESBuild 插件时，一般需要关闭 ES Guard 插件。

```js
module.exports = {
  plugins: {
    'es-guard': {
      enable: false,
    },
  },
};
```

## 维护者

陈嘉涵。
npm package: @kokojs/plugin-npm-duplicate
Description: `@kokojs/plugin-npm-duplicate` 用于检测 npm 依赖包是否重复安装了多个版本。
Latest version: 4.0.36

# Npm Duplicate 插件

`@kokojs/plugin-npm-duplicate` 用于检测 npm 依赖包是否重复安装了多个版本。

如果白名单内的依赖被安装了多个版本，Npm Duplicate 插件会直接阻止代码编译，直到版本冲突被解决。

## 使用场景

这个插件的主要用处是避免某些包被重复安装，尤其是单实例的包、体积较大的包。

如果需要全量分析项目中的重复依赖，可以使用 `Analyze 插件`。

## 安装

```bash
yarn add @kokojs/plugin-npm-duplicate --dev
```

安装完成后，在 `koko.config.js` 中添加如下配置：

```js
module.exports = {
  plugins: {
    'npm-duplicate': {
      packages: ['@youzan/znb'],
    },
  },
};
```

## 配置项

### packages

- Type: `string[]`
- Default: `[]`

需要被检测的包列表，如 `['lodash', 'date-fns']`。

### yarnLockPath

- Type: `string`
- Default: 'yarn.lock'

需要检测的 yarnLock 文件所在路径。

## 常见问题

### 如何优化重复依赖？

重复依赖有两种情况：

#### 1. semver 可以匹配，但 yarn.lock 中存在多个版本

这种情况一般是在依赖升级过程中 `yarn.lock` 文件没有正确更新引起的。

直接使用 [yarn-deduplicate](https://github.com/atlassian/yarn-deduplicate) 这个工具进行合并即可，它会自动将可匹配的版本进行合并。

```bash
# 消除所有依赖
npx yarn-deduplicate

# 消除特定重复依赖
npx yarn-deduplicate --packages @youzan/znb,@youzan/utils
```

#### 2. semver 无法匹配

对于 semver 无法匹配的情况，需要手动修改版本号范围，使之能够匹配。

如果暂时无法修改版本号范围，也可以通过 yarn 提供的 [resolutions](https://classic.yarnpkg.com/en/docs/selective-version-resolutions/) 字段来指定一个版本号。

```json
// package.json
{
  "resolutions": {
    "@youzan/utils": "^3.0.0"
  }
}
```

## 维护者

新春。
npm package: @kokojs/plugin-rem
Description: `@kokojs/plugin-rem` 提供 rem 适配的能力。
Latest version: 4.0.36

# Rem 插件

`@kokojs/plugin-rem` 提供 rem 适配的能力。

## 安装

```bash
yarn add @kokojs/plugin-rem --dev
```

安装完成后，在 `koko.config.js` 中添加如下配置：

```js
module.exports = {
  plugins: {
    rem: {},
  },
};
```

## 功能

`@kokojs/plugin-rem` 主要做了两件事：

#### 1. px 转 rem

在编译过程中通过 postcss 的 [postcss-pxtorem](https://github.com/cuth/postcss-pxtorem) 插件，将代码中的 px 单位自动转换为 rem 单位。

```scss
// input
.image {
  width: 100px;
  height: 75px;
}

// output
.image {
  width: 2rem;
  height: 1.5rem;
}
```

#### 2. 设定 rem 基准值

`@kokojs/plugin-rem` 会插入一小段运行时代码，代码执行时，会根据屏幕宽度计算 rem 基准值并设置到根节点上。

```html
<html style="font-size: 50px;">
  <!-- content -->
</html>
```

## 配置项

### pxtoremOptions

- Type: `object`
- Default: `{ rootValue: 50, propList: ['*'] }`

postcss-pxtorem 插件的配置选项，详见 [postcss-pxtorem 文档](https://github.com/cuth/postcss-pxtorem)。

## 维护者

陈嘉涵。
npm package: @kokojs/plugin-style
Description: `@kokojs/plugin-style` 提供了预处理 CSS 的能力，支持 Sass 语法，不再支持原有的 precss、sass-like 等语法。
Latest version: 4.0.36

# Style 插件

`@kokojs/plugin-style` 提供了预处理 CSS 的能力，支持 Sass 语法，不再支持原有的 precss、sass-like 等语法。

## 安装

```bash
yarn add @kokojs/plugin-style --dev
```

安装完成后，在 `koko.config.js` 中添加如下配置：

```js
module.exports = {
  plugins: {
    style: {},
  },
};
```

## 配置项

### extract

- Type: `boolean`
- Default: `true`

是否将样式提取至独立的 CSS 文件中。

禁用该选项时，样式将打包到 JS 文件中，并通过 [style-loader](https://github.com/webpack-contrib/style-loader) 注入到页面上。

### postcssPlugins

- Type: `PostcssPlugin[]`
- Default: `undefined`

`koko-plugin-style` 默认包含 [autoprefixer](https://github.com/postcss/autoprefixer) 插件，通过此选项可以配置额外的 postcss 插件

```js
// koko.config.js
module.exports = {
  plugins: {
    style: {
      postcssPlugins: [require('some-postcss-plugin')],
    },
  },
};
```

### loaderOptions

- Type: `object`
- Default: `-`

传递给 loader 的选项，支持以下 loader：

- [css-loader](https://github.com/webpack-contrib/css-loader)
- [sass-loader](https://github.com/webpack-contrib/sass-loader)
- [style-loader](https://github.com/webpack-contrib/style-loader)
- [postcss-loader](https://github.com/postcss/postcss-loader)

```js
// koko.config.js
module.exports = {
  plugins: {
    style: {
      loaderOptions: {
        css: {
          // css-loader 选项
        },
        sass: {
          // sass-loader 选项
        },
        style: {
          // style-loader 选项，仅在设置 extract: false 后有效
        },
        postcss: {
          // postcss-loader 选项
        },
      },
    },
  },
};
```

### enableDevAutoprefixer

- Type: `boolean`
- Default: `false`

是否在 dev 模式下启用 postcss 的 autoprefixer 插件，注意开启后会降低 dev 的编译速度。

默认情况下，我们仅在 build 阶段启用 postcss 和 autoprefixer 插件。

### customStyleLoader

- Type: `(extract?: boolean) => string`
- Default: `style-loader`

加载自定义 `style-loader` 的方法，可用于替换内置的默认样式注入行为。

```js
// koko.config.js
module.exports = {
  plugins: {
    style: {
      customStyleLoader: () => require.resolve('./my-style-loader'),
    },
  },
};
```

### globalModules

- Type: `boolean`
- Default: `false`

当 globalModules 为 true 时，所有样式文件都会开启 CSS Modules。

## CSS Modules

koko 根据文件后缀名来判断是否启用 CSS Modules:

- `.css` 和 `.scss` 文件默认不支持 CSS Modules，若 `globalModules` 为 `true`，则支持 CSS Modules，作用域为 `:global`
- `.m.css` 和 `.m.scss` 文件支持 CSS Modules，默认作用域为 `:local`
- `.global.m.css` 和 `.global.m.scss` 文件支持 CSS Modules，默认作用域为 `:global`

## 维护者

陈嘉涵。
npm package: @kokojs/plugin-ufile
Description: 用于上传文件到 [ufile 对象存储空间](https://doc.qima-inc.com/pages/viewpage.action?pageId=12987820)。
Latest version: 4.0.36

# Ufile 插件

用于上传文件到 [ufile 对象存储空间](https://doc.qima-inc.com/pages/viewpage.action?pageId=12987820)。

## 安装

```bash
yarn add @kokojs/plugin-ufile --dev
```

安装完成后，在 `koko.config.js` 中添加如下配置：

```js
module.exports = {
  plugins: {
    ufile: {},
  },
};
```

## 配置项

### sourcePath

- Type: `string`
- Default: `path.resolve(process.cwd(), 'dist')`

配置源文件地址路径，目录 / 文件。如果是目录会使用 tar 压缩后上传。

### tarballPath

- Type: `string`
- Default: `path.resolve(process.cwd(), 'dist.tar.gz')`

压缩文件输出路径。

### filename

- Type: `string`
- Default: `dist-[contenthash].tar.gz`

上传文件名称，`[contenthash]` 会被替换为文件内容的 hash 值。如果不使用 hash，将会导致同名文件被覆盖。

### outputFile

- Type: `string`
- Default: `path.resolve(process.cwd(), 'ufile.json')`

上传完成后，会将返回值保存在此文件中。如果`error`不为空，则上传发生错误。

```json
{
  "error": "",
  "downloadUrl": "",
  "filename": ""
}
```

### fetchAuthConfigApi

- Type: `string`
- Default: ``

可以获取 `bucket` `privateKey` `publicKey` `domain` 的接口，返回值为 json

```json
{
  "bucket": "",
  "publicKey": "",
  "privateKey": "",
  "domain": ""
}
```

## 命令

执行 `koko ufile` 命令有四个参数。这些参数为了安全不建议保存在源码中，所以需要通过 命令行参数/接口 的方式传入。

> 如果没有配置 `fetchAuthConfigApi`，则命令必须传下面的参数

- `--bucket` : ufile 空间名称
- `--privateKey` : 空间私钥
- `--publicKey` : 空间公钥
- `--domain` : 空间域名

### 示例

```bash
koko ufile --bucket xxx --publicKey xxx --privateKey xxx --domain xxx.ufileos.com
```

## 维护者

Jake（于成杰）、陈嘉涵。
npm package: @kokojs/plugin-vue
Description: `@kokojs/plugin-vue` 提供了编译 .vue 单文件组件的能力，并内置 Vue 基础 DLL。
Latest version: 4.0.36

# Vue 插件

`@kokojs/plugin-vue` 提供了编译 .vue 单文件组件的能力，并内置 Vue 基础 DLL。

## 安装

```bash
yarn add @kokojs/plugin-vue --dev
```

安装完成后，在 `koko.config.js` 中添加如下配置：

```js
module.exports = {
  plugins: {
    vue: {},
  },
};
```

## 内置 DLL

Vue 插件内置的 DLL 中包含了以下内容：

- vue
- vuex
- vue-router
- vue-lazyload

> Tips: 如果项目中没有安装上述的库，他们将不会被打包进 DLL 中。

### DLL 缓存

`koko-plugin-vue` 开启了 DLL 缓存的功能，并将依赖库的版本号作为 `cacheKey`，依赖库的版本号未变化时，会直接使用上次构建的 DLL 缓存结果。

## 配置项

### dll

- Type: `boolean`
- Default: `true`

是否需要构建内置 DLL，如果设置为 `false`，将不会生成 `Framework DLL`。

```js
module.exports = {
  plugins: {
    vue: {
      dll: false,
    },
  },
};
```

## 维护者

陈嘉涵。
npm package: @kokojs/tsconfig
Description: `@kokojs/tsconfig` 提供了统一的 tsconfig 配置。
Latest version: 4.0.36

# 统一 tsconfig 配置

`@kokojs/tsconfig` 提供了统一的 tsconfig 配置。

## 安装

```bash
yarn add @kokojs/tsconfig --dev
```

> Tips: 若项目中安装了 koko-preset-h5 或 koko-preset-pc，则无需手动安装上述依赖。

## 使用方式

创建 `tsconfig.json` 文件并添加如下配置：

```json
{
  "extends": "@kokojs/tsconfig",
  "compilerOptions": {
    "outDir": "dist",
    "target": "es2018",
    "lib": ["es2018"]
  }
}
```

## 校验规则

`@kokojs/tsconfig` 中包含了以下规则集合：

```json
{
  "compilerOptions": {
    "target": "es2017", // Node.js 8
    "module": "commonjs",
    "esModuleInterop": true,
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "jsx": "preserve",
    "strict": true,
    "noImplicitReturns": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noFallthroughCasesInSwitch": true,
    "noEmitOnError": true,
    "useDefineForClassFields": true,
    "forceConsistentCasingInFileNames": true,
    "skipLibCheck": true
  }
}
```

## 维护者

章永胜、陈嘉涵。
npm package: @kokomoswap-libs/sdk
Description: 🛠 An SDK for building applications on top of kokomoswap.
Latest version: 0.0.6

# Pancakeswap SDK

[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)
[![Actions Status](https://github.com/pancakeswap/pancakeswap-sdk/workflows/CI/badge.svg)](https://github.com/pancakeswap/pancakeswap-sdk)
[![npm version](https://img.shields.io/npm/v/@pancakeswap-lib/sdk/latest.svg)](https://www.npmjs.com/package/@pancakeswap-lib/sdk/v/latest)

## Running tests

To run the tests, follow these steps. You must have at least node v10 and [yarn](https://yarnpkg.com/) installed.

First clone the repository:

```sh
git clone https://github.com/pancakeswap/pancakeswap-sdk.git
```

Move into the pancakeswap-sdk working directory

```sh
cd pancakeswap-sdk/
```

Install dependencies

```sh
yarn install
```

Run tests

```sh
yarn test
```

You should see output like the following:

```sh
yarn run v1.22.4
$ tsdx test
 PASS  test/constants.test.ts
 PASS  test/pair.test.ts
 PASS  test/fraction.test.ts
 PASS  test/miscellaneous.test.ts
 PASS  test/entities.test.ts
 PASS  test/trade.test.ts

Test Suites: 1 skipped, 6 passed, 6 of 7 total
Tests:       3 skipped, 82 passed, 85 total
Snapshots:   0 total
Time:        5.091s
Ran all test suites.
✨  Done in 6.61s.
```
npm package: @kokomoswap-libs/uikit
Description: Set of UI components for kokomo projects
Latest version: 0.6.4

# 🥞 Pancake UIkit

[![Version](https://img.shields.io/npm/v/@pancakeswap-libs/uikit)](https://www.npmjs.com/package/@pancakeswap-libs/uikit) [![Size](https://img.shields.io/bundlephobia/min/@pancakeswap-libs/uikit)](https://www.npmjs.com/package/@pancakeswap-libs/uikit)

Pancake UIkit is a set of React components and hooks used to build pages on Pancake's apps. It also contains a theme file for dark and light mode.

## Install

`yarn add @pancakeswap-libs/uikit`

## Setup

### Theme

Before using Pancake UIkit, you need to provide the theme file to styled-component.

```
import { ThemeProvider } from 'styled-components'
import { light, dark } from '@pancakeswap-libs/uikit'
...
<ThemeProvider theme={isDark}>...</ThemeProvider>
```

### Reset

A reset CSS is available as a global styled component.

```
import { ResetCSS } from '@pancakeswap-libs/uikit'
...
<ResetCSS />
```

### Types

This project is built with Typescript and export all the relevant types.

## How to use the UIkit

If you want to use components from the UIkit, check the [Storybook documentation](https://pancakeswap.github.io/pancake-uikit/)
npm package: @kokoniai/integrations-core
Description: Shared utilities for KokoniAI integrations (eBay, Crisp, Shopify)
Author: KokoniAI
Latest version: 0.1.0

# @kokoni/integrations-core

Shared utilities for KokoniAI marketplace integrations (eBay, Crisp, Shopify).

## Installation

```bash
npm install @kokoni/integrations-core
```

## Modules

### Crypto (`@kokoni/integrations-core/crypto`)

Token encryption and webhook signature verification.

```typescript
import { encryptToken, decryptToken, verifyCrispWebhookSignature } from '@kokoni/integrations-core/crypto';

// Encrypt OAuth tokens for storage
const encrypted = await encryptToken(accessToken, ENCRYPTION_KEY);
const decrypted = await decryptToken(encrypted, ENCRYPTION_KEY);

// Verify Crisp webhook signatures
const isValid = await verifyCrispWebhookSignature({
  rawBody,
  signature,
  timestamp,
  secret: WEBHOOK_SECRET,
});
```

### Validation (`@kokoni/integrations-core/validation`)

Input validation and sanitization utilities.

```typescript
import { 
  isValidUUID, 
  isValidWebsiteId, 
  sanitizeString, 
  escapeXml 
} from '@kokoni/integrations-core/validation';

// Validate inputs
if (!isValidUUID(userId)) throw new Error('Invalid user ID');
if (!isValidWebsiteId(websiteId)) throw new Error('Invalid website ID');

// Sanitize user input
const safeName = sanitizeString(userInput, 100);

// Escape for XML APIs (eBay Trading API)
const xmlSafe = escapeXml(message);
```

### Auth (`@kokoni/integrations-core/auth`)

JWT validation and OAuth state management.

```typescript
import { validateJWT, createSignedState, verifyAndDecodeState } from '@kokoni/integrations-core/auth';

// Validate JWT in edge functions
const auth = await validateJWT(req.headers.get('Authorization'), supabaseClient);
if (!auth) return new Response('Unauthorized', { status: 401 });
const userId = auth.user.id;

// Create signed OAuth state
const state = await createSignedState(
  { userId, uuid: crypto.randomUUID(), iat: Date.now() / 1000 },
  SECRET_KEY
);

// Verify OAuth callback state
const decoded = await verifyAndDecodeState(state, SECRET_KEY);
if (!decoded) throw new Error('Invalid or expired state');
```

## Development

```bash
# Install dependencies
npm install

# Build
npm run build

# Watch mode
npm run dev
```

## Publishing

```bash
npm publish --access public
```

## License

MIT