open-index/open-npm huggingface dataset:
npm package: @jimmyclchu/cangjie
Description: Fast Chinese characters lookup for Cangjie and Sucheng codes.
Author: Jimmy Chu
Latest version: 1.0.0

# @jimmyclchu/cangjie

A TypeScript library for Cangjie/Sucheng input method code lookup.

## Installation

```bash
npm install @jimmyclchu/cangjie
```

## Usage

### JavaScript
```javascript
const { Cangjie } = require('@jimmyclchu/cangjie');

const cj = new Cangjie();
console.log(cj.searchCodes('香港')); // ['hda', 'etcu']
```

### TypeScript
```typescript
import { Cangjie, CangjieOptions } from '@jimmyclchu/cangjie';

const cj = new Cangjie({ inputMethod: 'cangjie' });
console.log(cj.searchCodes('同熱愛這片土地')); // ['bmr', 'gif', 'bbpe', 'yymr', 'llml', 'g', 'gpd']
```

## API

### Constructor
```typescript
new Cangjie(options?: CangjieOptions)
```

### Methods

#### `searchCodes(text: string): string[]`
Get Cangjie codes for Chinese characters.
```typescript
cj.searchCodes('難'); // ['toog']
cj.searchCodes('Hello香港World'); // ['hda', 'etcu'] - auto-extracts Chinese
```

#### `searchCharacters(code: string): string[]`
Get characters for a given code.
```typescript
cj.searchCharacters('a'); // ['日', '曰']
```

#### `searchRadicals(text: string): string[]`
Get radical representations grouped by character.
```typescript
cj.searchRadicals('日月'); // ['日', '月']
cj.searchRadicals('你好'); // ['人弓火', '女弓木']
```

#### `containsChinese(text: string): boolean`
Check if text contains any Chinese characters.
```typescript
cj.containsChinese('Hello香港'); // true
```

#### `isAllChinese(text: string): boolean`
Check if text contains only Chinese characters.
```typescript
cj.isAllChinese('香港'); // true
cj.isAllChinese('Hello香港'); // false
```

#### `extractChinese(text: string): string`
Extract only Chinese characters from text.
```typescript
cj.extractChinese('Hello朋友World'); // '朋友'
```

#### `setInputMethod(method: 'cangjie' | 'sucheng'): void`
Switch between Cangjie and Sucheng input methods.
```typescript
cj.setInputMethod('sucheng');
cj.searchCodes('你'); // ['of'] - first + last code only
cj.searchRadicals('你'); // ['人火'] - simplified radicals for sucheng
```

## Input Methods

- **Cangjie**
- **Sucheng**

## License

MIT
npm package: @jimmycode/draft-js-autosave-plugin
Description: Autosave changes of your draft-js editor
Author: JimmyCode Social
Latest version: 0.5.2

# draft-js-autosave-plugin

[![Build Status](https://travis-ci.org/jimmycodesocial/draft-js-autosave-plugin.svg?branch=master)](https://travis-ci.org/jimmycodesocial/draft-js-autosave-plugin)
[![Coverage Status](https://coveralls.io/repos/github/jimmycodesocial/draft-js-autosave-plugin/badge.svg?branch=master)](https://coveralls.io/github/jimmycodesocial/draft-js-autosave-plugin?branch=master)

Autosave changes of your draft-js editor.

*This is a plugin for `draft-js-plugins-editor`.*

## Installation

```
npm install @jimmycode/draft-js-autosave-plugin
```

## Usage

Instantiate the plugin passing the necessary `config`:

```js
import createAutosavePlugin from '@jimmycode/draft-js-autosave-plugin';

const autosavePlugin = createAutosavePlugin(config);
```

And then pass the plugin into a `draft-js-plugins-editor` component:

```js
import Editor from 'draft-js-plugins-editor';

<Editor
  plugins={[autosavePlugin]} />
```

## Configuration

The config options and their defaults are:

| Option         | Default    | Description                                                                                                                                               | 
| -------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------  |
| `saveFunction` | `null`     | Required callback function that will be called upon a save event.                                                                                         |
| `debounceTime` | 3000       | Time, in milliseconds, to [`debounce`](https://css-tricks.com/the-difference-between-throttling-and-debouncing/) the firing of save events after changes. |

## Example

```js
import React from 'react';
import ReactDOM from 'react-dom';

import { EditorState, convertToRaw } from 'draft-js';
import Editor from 'draft-js-plugins-editor';

import createAutosavePlugin from '@jimmycode/draft-js-autosave-plugin';

const saveDraft = (editorState) => {
  const rawContent = convertToRaw(editorState.getCurrentContent());
  localStorage.setItem('draft', JSON.stringify(rawContent));
}

const autosavePlugin = createAutosavePlugin({
  saveFunction: saveDraft,
  debounceTime: 3000
})

class MyEditor extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      editorState: EditorState.createEmpty()
    };
    this.plugins = [
      autosavePlugin
    ];
  }
  
  onChange = (editorState) => {
    this.setState({ editorState });
  }

  render() {
    return (
      <div className="editor">
        <Editor
          editorState={this.state.editorState}
          onChange={this.onChange}
          plugins={this.plugins}
          placeholder="Tell a story" />
      </div>
    );
  }
}

ReactDOM.render(<MyEditor />, document.getElementById('root'));
```

# Acknowledge

https://www.npmjs.com/package/draft-js-autosave-plugin
npm package: @jimmycode/draft-js-select-image-plugin
Description: Embed a local image in your draft-js editor
Author: JimmyCode Social
Latest version: 1.0.0

# draft-js-select-image-plugin
Embed a local image in your draft-js editor

*This is a plugin for `draft-js-plugins-editor`.*

## Installation
```
npm install @jimmycode/draft-js-select-image-plugin
```

## Usage
This plugin exposes a button that integrates with the side toolbar.

```js
import createSelectImagePlugin from '@jimmycode/draft-js-select-image-plugin';
const selectImagePlugin = createSelectImagePlugin({});
const { SelectImageButton } = selectImagePlugin;
```

## Configuration
| Param     | Default | Description                                                                                                  |
|-----------|---------|--------------------------------------------------------------------------------------------------------------|
| imageType | IMAGE   | Type of entity created when inserting the atomic block. By default it's the same value as `draft-js-image-plugin` |

## Integration
Rendering the image is out of scope, but in the following example you can see how to integrate `draft-js-image-plugin`.

```
npm install draft-js-image-plugin
```

```js
import React from 'react';
import ReactDOM from 'react-dom';

import Editor from 'draft-js-plugins-editor';
import { EditorState } from 'draft-js';
import createSideToolbarPlugin from 'draft-js-side-toolbar-plugin';
import BlockTypeSelect from 'draft-js-side-toolbar-plugin/lib/components/BlockTypeSelect';
import createImagePlugin from 'draft-js-image-plugin';
import createSelectImagePlugin from '@jimmycode/draft-js-select-image-plugin';

import 'draft-js-side-toolbar-plugin/lib/plugin.css';
import 'draft-js-image-plugin/lib/plugin.css';

const imagePlugin = createImagePlugin();
const selectImagePlugin = createSelectImagePlugin();
const DefaultBlockTypeSelect = ({ getEditorState, setEditorState, theme }) => (
  <BlockTypeSelect
    getEditorState={getEditorState}
    setEditorState={setEditorState}
    theme={theme}
    structure={[ 
      selectImagePlugin.SelectImageButton
    ]}
  />
);
const sideToolbarPlugin = createSideToolbarPlugin({
  structure: [DefaultBlockTypeSelect],
});
const { SideToolbar } = sideToolbarPlugin;

class MyEditor extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      editorState: EditorState.createEmpty()
    };
    this.plugins = [
      sideToolbarPlugin,
      imagePlugin
    ];
  }

  onChange = (editorState) => {
    this.setState({ editorState });
  }

  render() {
    return (
      <div className="editor">
        <Editor
            editorState={this.state.editorState}
            onChange={this.onChange}
            plugins={this.plugins}
            placeholder="Tell a story" />
        <SideToolbar />
      </div>
    );
  }
}

ReactDOM.render(<MyEditor />, document.getElementById('root'));
```

# Acknowledge
* Icon by: https://www.iconfinder.com/icons/290132/gallery_image_photo_photography_picture_pictures_icon
npm package: @jimmycode/draft-js-soft-newline-plugin
Description: Add support for soft newlines in your draft-js editor.
Author: JimmyCode Social
Latest version: 0.5.1

# Draftjs Soft Newline Plugin
Add support for soft newlines in your draft-js editor.

*This is a plugin for `draft-js-plugins-editor`.*

## Installation

```
npm install @jimmycode/draft-js-soft-newline-plugin
```

## Usage

```js
import createSoftNewLinePlugin from '@jimmycode/draft-js-soft-newline-plugin';
const softNewLinePlugin = createSoftNewLinePlugin();
```

## Example

```js
import React from 'react';
import ReactDOM from 'react-dom';

import Editor from 'draft-js-plugins-editor';
import { EditorState } from 'draft-js';
import createSoftNewLinePlugin from '@jimmycode/draft-js-soft-newline-plugin';

const softNewLinePlugin = createSoftNewLinePlugin();
const plugins = [
  softNewLinePlugin
];

class MyEditor extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      editorState: EditorState.createEmpty()
    };
  }
  
  onChange = editorState => this.setState({ editorState });

  render() {
    return (
      <div className="editor">
        <Editor
          editorState={this.state.editorState}
          onChange={this.onChange}
          plugins={plugins}
          placeholder="Tell a story" />
      </div>
    );
  }
}

ReactDOM.render(<MyEditor />, document.getElementById('root'));
```
npm package: @jimmycode/draft-js-toolbox
Description: Useful goodies for DraftJS
Author: JimmyCode Social
Latest version: 1.0.0

# DraftJs Toolbox
Useful goodies for DraftJS.

## Installation

```
npm install @jimmycode/draft-js-toolbox
```

## Usage
This library contains two sets of functions:
1. Utilities: that determine certain conditions on the editor's state.
2. Modifiers: which perform transformations on the editor's state.

#### Utils

```js
import { getCurrentBlock, isCurrentBlockType, isBlockWithEntityType } from '@jimmycode/draft-js-toolbox';
```

| Function              | Params                          | Description                                                                  |
|-----------------------|---------------------------------|------------------------------------------------------------------------------|
| getCurrentBlock       | editorState                     | Returns the current block selected.                                          |
| isCurrentBlockType    | editorState, blockType          | Checks the current block's type.                                             |
| isBlockWithEntityType | editorState, block, entityType  | Checks if the current block is an atomic block with an specific entity type. |

#### Modifiers

```js
import { addBlock, addAtomicBlock, removeBlock } from '@jimmycode/draft-js-toolbox';
```

| Function       | Params                        | Description                                                     |
|----------------|-------------------------------|-----------------------------------------------------------------|
| addBlock       | editorState, entityType, data | Changes the current block's type and replace its data.          |
| addAtomicBlock | editorState, entityType, data | Inserts an atomic block and creates an Entity with custom data. |
| removeBlock    | editorState, blockKey         | Removes a block given its key.                                  |
npm package: @jimmycode/oauth2-profile
Description: Description
Author: JimmyCode Social
Latest version: 0.0.2

# OAuth2 Profile

Description

## Requirements

Latest Node 8 LTS or newer versions.

## Getting started

```sh
npm install --save @jimmycode/oauth2-profile
```

or 

```sh
yarn add @jimmycode/oauth2-profile
```

### Usage

```ts
```
npm package: @jimmyhedstr0m/interceptor
Description: Intercept JavaScript XMLHttpRequests in systems where you need a callback on certain HTTP requests.
Author: Jimmy Hedström
Latest version: 1.0.4

# Interceptor
Intercept JavaScript ```XMLHttpRequest``` in systems where you need a callback on certain HTTP requests.

## Installation

### Using npm
```console
$ npm install --save @jimmyhedstr0m/interceptor
```
or
```console
$ yarn add @jimmyhedstr0m/interceptor
```

Now import `Interceptor` and start using it:

```js
import Interceptor from '@jimmyhedstr0m/interceptor';
```

### Without a bundler

Add this script to your HTML file:

```html
<script src="https://unpkg.com/@jimmyhedstr0m/interceptor/dist/index.js"></script>
```

## Usage
```javascript
const Interceptor = require('@jimmyhedstr0m/interceptor');

// optional
const options = {
  timeout: 30000
};

const interceptor = new Interceptor(options);

interceptor.register('https://randomuser.me/api/', (err, res) => {
  if (err) {
    console.log('got error', err);
  }

  console.log('success', res);
  interceptor.unregister();
});

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://randomuser.me/api/');
xhr.send();
```

You can also pattern match any url by using RegExp:
```javascript
Interceptor.register(/\/api\//, options, (err, res) => { }
```
npm package: @jimmyhmiller/estel-estree-builder
Description: ESTree compatible AST builder
Author: Sergey Melyukov
Latest version: 0.3.0

# estel-estree-builder

ESTree compatible AST builder for Javascript and Typescript.

All builder code was fully-generated from [ESTree spec](https://github.com/estree/estree)

## Install

```sh
npm install estel-estree-builder
```

## Usage

```js
const builder = require('estel-estree-builder');
const escodegen = require('escodegen');

const ast = builder.functionDeclaration(
    builder.identifier('helloWorld'),
    [builder.identifier('name')],
    builder.functionBody([
        builder.returnStatement(
            builder.binaryExpression(
                '+',
                builder.literal('Hello'),
                builder.identifier('name')
            )
        )
    ])
)

console.log(escodegen.generate(ast));
```

This example generates the following code:
```js
function helloWorld(name) {
    return 'Hello' + name;
}
```

## Using another version of ES

By default, the builder can generate AST with ES2018-features (inclusive ES5/2015/2016/2017 features), but you can choose ES-version:

```js
const es2018builder = require('estel-estree-builder/generated/es2018'); // es5-es2018
const es2015builder = require('estel-estree-builder/generated/es2015'); // es5-es2015
const es5builder = require('estel-estree-builder/generated/es5'); // es5
```

## Using Typescript

You can also use builder in Typescript:

```ts
import es2018builder from 'estel-estree-builder/generated/es2018.ts'; // es5-es2018
import es2015builder from 'estel-estree-builder/generated/es2015.ts'; // es5-es2015
import es5builder from 'estel-estree-builder/generated/es5.ts'; // es5
```

## Generator

The generator is a script that parses ESTree spec and generates the builder source files (JS or/and TS).

```sh
git clone https://github.com/smelukov/estel-estree-builder
cd estel-estree-builder
git submodule init
git submodule update

npm install
npm run generate
```

This will create `generated` directory and put a generated builder sources to it.

### Generator options

There are some options for generator:

`-t` - target source type (default is `[js, ts]`)
* `js`
* `ts`

`-es` - es-features that will be support generated builder (default is `[es2018]`)
* `es5`
* `es2015`
* `es2016`
* `es2017`
* `es2018`

`-o` - output folder (default is `generated`)

For exmaple, `npm run generate -- -es es5 es2015 es2018 -t ts -o types` will generate builder typescript-sources in `types` directory that support all es5+ features.
npm package: @jimmyhmiller/zaphod
Description: Clojure's API for JavaScript's Objects
Author: Dan Prince
Latest version: 0.2.1

# Zaphod
[![Travis](https://img.shields.io/travis/danprince/zaphod.svg?maxAge=2592000)](https://travis-ci.org/danprince/zaphod)
[![Coveralls](https://img.shields.io/coveralls/danprince/zaphod.svg?maxAge=2592000)](https://coveralls.io/github/danprince/zaphod)
[![npm](https://img.shields.io/npm/v/zaphod.svg?maxAge=2592000)](https://npmjs.com/package/zaphod)
[![Gitter](https://img.shields.io/gitter/room/zaphodjs/Lobby.svg?maxAge=2592000)](https://gitter.im/zaphodjs/Lobby)
[![API Docs](https://img.shields.io/badge/API-Docs-blue.svg)][4]

[Clojure's][2] immutable data API for JavaScript's own data structures, using the [function bind operator][9].

```js
import { inc, update } from 'zaphod';

const state = { count: 0 };

state::update('count', inc)
// => { count: 1 }
```

However, you don't need to know Clojure to make the most of Zaphod. This library is just a set of JavaScript functions that make working with immutable data more fun!

Find the [docs][4], [cheatsheet][5] and [rationale][6] at [the website][3].

```sh
npm install --save zaphod
# or
https://unpkg.com/zaphod@0.2.0
```

Check out the [getting started][7] guide for an in-depth explanation on configuring Babel to work with the function-bind operator.

[1]: https://en.wikipedia.org/wiki/Zaphod_Beeblebrox
[2]: https://clojure.org/
[3]: https://zaphod.surge.sh
[4]: https://zaphod.surge.sh/api
[5]: https://zaphod.surge.sh/cheatsheet
[6]: https://zaphod.surge.sh/tutorial
[7]: https://zaphod.surge.sh/getting-started
[8]: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/rest_parameters
[9]: https://github.com/tc39/proposal-bind-operator
[10]: https://gitter.im/zaphod
[11]: https://github.com/danprince/zaphod
[12]: http://babeljs.io/
[13]: http://babeljs.io/docs/plugins/transform-function-bind/ 
[14]: https://babeljs.io/docs/plugins/preset-stage-0/
[15]: https://github.com/danprince/zaphod/issues/6
[16]: https://github.com/sebmarkbage/ecmascript-immutable-data-structures
npm package: @jimmyliao/leapcode
Description: Multi-AI coding CLI wrapper - Connect Gemini, Claude Code, and Codex from anywhere
Author: Jimmy Liao
Latest version: 0.4.4

# @jimmyliao/leapcode

**多 AI 編程 CLI 包裝器** - 目前支援 Gemini CLI

[![npm version](https://img.shields.io/npm/v/@jimmyliao/leapcode.svg)](https://www.npmjs.com/package/@jimmyliao/leapcode)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](../../LICENSE)

[English](README.md) | **繁體中文**

---

## 🚀 安裝

```bash
npm install -g @jimmyliao/leapcode
```

或使用 npx：

```bash
npx @jimmyliao/leapcode gemini
```

---

## 📖 使用方式

### Gemini CLI (✅ 可用)

```bash
export GEMINI_API_KEY="your-api-key"
leapcode gemini
```

### Claude Code (📋 規劃中)

```bash
# 未來版本推出
```

### Codex (📋 規劃中)

```bash
# 未來版本推出
```

---

## 🔧 選項

```bash
leapcode <aiTool> [選項]

選項：
  -s, --server <url>   LeapCode 伺服器 URL
  --offline            離線執行（不同步）（預設）
  --api-key <key>      AI API 金鑰
  -h, --help           顯示說明
  -V, --version        顯示版本
```

---

## 📚 文件

完整文件請參考 [主要 README](../../README.zh-TW.md)。

---

## 🏗️ 套件內容

本套件包裝了流行的 AI 編程工具，提供：

- **統一介面**：單一 CLI 整合所有 AI 工具
- **I/O 攔截**：捕獲 AI 互動內容
- **離線優先**：無需伺服器連線即可運作
- **可選同步**：可選擇同步到行動裝置

---

## 🔗 相關套件

- [@jimmyliao/leapcode-core](../core) - 共享型別與工具

---

## 📄 授權

MIT © [Jimmy Liao](https://github.com/jimmyliao)
npm package: @jimmyliao/leapcode-core
Description: LeapCode Core - Shared types and utilities
Author: Jimmy Liao
Latest version: 0.4.0

# @jimmyliao/leapcode-core

**LeapCode Core** - 共享型別、常數與工具函式

[![npm version](https://img.shields.io/npm/v/@jimmyliao/leapcode-core.svg)](https://www.npmjs.com/package/@jimmyliao/leapcode-core)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](../../LICENSE)

[English](README.md) | **繁體中文**

---

## 📖 說明

核心套件，包含所有 LeapCode 套件使用的共享 TypeScript 型別、常數和工具函式。

---

## 📦 安裝

```bash
npm install @jimmyliao/leapcode-core
```

---

## 🔧 使用方式

### 型別

```typescript
import { AITool, CLIOptions, LeapCodeConfig } from '@jimmyliao/leapcode-core';

const tool: AITool = 'gemini';

const options: CLIOptions = {
  server: 'https://api.leapcode.dev',
  offline: true,
  apiKey: 'your-key',
};
```

### 常數

```typescript
import { DEFAULT_CONFIG, ENV_VARS, APP_META } from '@jimmyliao/leapcode-core';

console.log(APP_META.NAME); // 'LeapCode'
console.log(APP_META.VERSION); // '0.2.0'
console.log(ENV_VARS.GEMINI_API_KEY); // 'GEMINI_API_KEY'
```

### 工具函式

```typescript
import { isValidAITool, getEnv, retry } from '@jimmyliao/leapcode-core';

if (isValidAITool('gemini')) {
  const apiKey = getEnv('GEMINI_API_KEY');

  await retry(async () => {
    // 你的非同步操作
  }, { maxAttempts: 3 });
}
```

---

## 📚 匯出項目

### 型別

- `AITool` - 支援的 AI 工具 ('gemini' | 'claude' | 'codex')
- `CLIOptions` - CLI 命令選項
- `LeapCodeConfig` - 設定結構
- `SocketConfig` - WebSocket 設定
- `OutputMessage` - 輸出訊息格式
- `RPCCall` / `RPCResponse` - RPC 訊息型別
- `PairingData` - 裝置配對資料

### 常數

- `DEFAULT_CONFIG` - 預設設定值
- `ENV_VARS` - 環境變數名稱
- `CLI_COMMANDS` - CLI 命令名稱
- `WS_EVENTS` - WebSocket 事件名稱
- `APP_META` - 應用程式詮釋資料

### 工具函式

- `isValidAITool(tool)` - 驗證 AI 工具名稱
- `getEnv(key, fallback?)` - 取得環境變數
- `formatTimestamp(timestamp)` - 格式化時間戳記為 ISO 字串
- `sleep(ms)` - 睡眠工具
- `retry(fn, options?)` - 指數退避重試

---

## 🔗 相關套件

- [@jimmyliao/leapcode](../cli) - 主要 CLI 套件

---

## 📄 授權

MIT © [Jimmy Liao](https://github.com/jimmyliao)
npm package: @jimmylv/radar
Description: My life radar
Author: JimmyLv
Latest version: 1.4.4

# Life Radar

[🥚🐣🐥 我的迭代人生 之 技术雷达 V1.3](https://radar.thoughtworks.com/?sheetId=https://raw.githubusercontent.com/JimmyLv/CHANGLOG.md/master/packages/radar/%F0%9F%A5%9A%F0%9F%90%A3%F0%9F%90%A5%20%E6%88%91%E7%9A%84%E8%BF%AD%E4%BB%A3%E4%BA%BA%E7%94%9F%20%E4%B9%8B%20%E6%8A%80%E6%9C%AF%E9%9B%B7%E8%BE%BE%20v1.3.csv) `@updated(2019-05-10 12:51:55 AM)`

[🥚🐣🐥 我的迭代人生 之 技术雷达 V1.2](https://radar.thoughtworks.com/?sheetId=https://raw.githubusercontent.com/JimmyLv/CHANGLOG.md/master/packages/radar/%F0%9F%A5%9A%F0%9F%90%A3%F0%9F%90%A5%20%E6%88%91%E7%9A%84%E8%BF%AD%E4%BB%A3%E4%BA%BA%E7%94%9F%20%E4%B9%8B%20%E6%8A%80%E6%9C%AF%E9%9B%B7%E8%BE%BE%20v1.2.csv) `@created(2019-04-30 16:26:34 PM)`
npm package: @jimmyolo/node-fubon-sdk
Description: Repacked version of [fubon-sdk-nodejs](https://www.fbs.com.tw/TradeAPI/).
Author: jimmyolo
Latest version: 1.4.0

# Introduction

Repacked version of [fubon-sdk-nodejs](https://www.fbs.com.tw/TradeAPI/).

convenience for quick setup js project use, without manually override the local file & typescript intelligence support

### (upstream) SDK Version

[official SDK](https://www.fbs.com.tw/TradeAPI/en/docs/download/download-sdk)

- `>= 1.4.0` (SDK: [`v2.1.0`](https://www.fbs.com.tw/TradeAPI/docs/download/download-sdk#210))
- `>= 1.2.0` (SDK: [`v2.0.1`](https://www.fbs.com.tw/TradeAPI/docs/download/download-sdk#201))
- `>= 1.1.0` (SDK: [`v1.3.2`](https://www.fbs.com.tw/TradeAPI/docs/download/download-sdk#132))

## Install

```shell
npm i @jimmyolo/node-fubon-sdk
```

### Changes

- add `index.d.ts`
- fix the inner SDK version coupled with the npm package version after re-packed
- fixup typescript declarations
  - `TpslWrapper` typo
  - `Response<Array<xxx>>` invalid syntax
  - `JsAccount` `JsFutOptOrder` unknown types
  - `const enum` -> `enum`
- details: [patch.diff](./patches.diff)

```bash
npm run download [sdk version]
npm run unpack [sdk version]

# copy the changes
cp index.d.ts build/sdk/
# override the import path
sed -i "s/.\\/sdk\\//.\\//g" build/sdk/index.d.ts

## create patch
diff -ruN node_modules/fubon-neo/ build/sdk/ > patches.diff


## apply patch
cd build
patch -p1 < ../patches.diff
```

## Usage

https://www.fbs.com.tw/TradeAPI/en/docs/trading/introduction/
npm package: @jimmyrichardson.co/lerp
Description: Some of my favorite linear interpolation helpers.
Author: Jimmy Richardson
Latest version: 0.1.1

# Lerp JS

Some of my personal favorite linear interpolation helpers, borrowed from [Trys Mumford](https://www.trysmudford.com/blog/linear-interpolation-functions/).

## Installation

```
npm install @jimmyrichardson.co/lerp
```

## Usage

This package has 4 helpers:
1. __Lerp__: Returns any midpoint from any two numbers when specified between 0 and 1.
2. __Invlerp__: Returns *the* decimal midpoint from any two numbers, from 0 to 1.
3. __Clamp__: Adds a floor and a ceiling to your math for more predictable behavior.
4. __Range__: Returns any midpoint from any 2 sets of numbers, not just a decimal between 0 and 1. The midpoint argument comes from the first set of numbers.

### Lerp Example
```js
import { lerp } from '@jimmyrichardson.co/lerp';

console.log( lerp(0, 100, 0.5) ); // returns 50
```
### InvLerp Example
```js
import { invlerp } from '@jimmyrichardson.co/lerp';

console.log( invlerp(20, 100, 9999) ); // returns 1
```
### Clamp Example

```js
import { clamp } from '@jimmyrichardson.co/lerp';

console.log( clamp(9999, 20, 30) ); // returns 30
```
### Range Example

```js
import { range } from '@jimmyrichardson.co/lerp';

console.log( range(1, 10, 500, 5000, 5) ); // returns 2500
```