open-index/open-npm huggingface dataset:
npm package: @stbzmi/common-node
Description: 精简说明：本包提供图片尺寸计算与压缩/转码策略；真实编码/解码能力由可选依赖 `sharp` 及其插件承担。只有在需要 **HEIC(HEIF) 支持** 时才要求执行 sharp 重建（使用系统 libvips 开启对应格式）。
Latest version: 0.3.23

# @stbzmi/common-node

精简说明：本包提供图片尺寸计算与压缩/转码策略；真实编码/解码能力由可选依赖 `sharp` 及其插件承担。只有在需要 **HEIC(HEIF) 支持** 时才要求执行 sharp 重建（使用系统 libvips 开启对应格式）。

---
## 为什么要重建 sharp
官方预编译 `sharp` 默认内置的 libvips 在部分平台不启用 HEIC/HEIF 支持。通过重建并链接系统安装的 **libvips >= 8.17.3**：
- 解锁 HEIC/HEIF 读取与转换。
- 统一 webp/avif/heif 等格式的处理能力，避免不同机器行为不一致。
- 降低后期升级到更高 libvips 时的阻力（无需等待官方重新发布预编译）。

不需要 HEIC 时可以直接使用预编译版本，跳过重建过程。

---
## 安装
按需安装原生依赖：
```bash
pnpm add sharp sharp-bmp -F @stbzmi/common-node
```
未安装时仍可使用纯逻辑函数（尺寸/策略）。调用需要实际转码的 API 会给出缺依赖错误。

---
## 快速重建指引
执行 monorepo 中的构建脚本以保证依赖准备；需要 HEIC 时再触发 sharp 重建：
```bash
pnpm build:shared      # （按要求）先执行公共构建；确保基础类型/工具就绪
# 如果使用场景需要 HEIC：
node newTmm/scripts/rebuild-sharp.js --auto-install
```
说明：`rebuild-sharp.js` 会自动检测/安装缺失的 `libvips`、`pkg-config` 等，并清理预编译 @img 目录后源码编译。Windows 默认跳过（直接使用预编译）。

---
## 环境最小要求
| 项 | 要求 | 目的 |
| -- | ---- | ---- |
| Node | >=20 | 与仓库统一，避免编译链差异 |
| libvips | >=8.17.3 | 启用 heif/webp/avif 支持 |
| 构建工具 | pkg-config, make, clang/gcc, python3 | sharp 编译依赖 |

可选环境变量：`SHARP_FORCE_GLOBAL_LIBVIPS=1`（强制使用系统 libvips）。

---
## 常见问题速查
| 问题 | 解决 |
| ---- | ---- |
| 缺 pkg-config / vips | `brew install vips pkg-config` 后重跑脚本 |
| heif 仍不可用 | 确认 `vips --version` >= 8.17.3 且未加载内置 @img 目录 |
| ABI 报错 | 删除 `node_modules` 执行 `pnpm install` 再重建 |

排查命令：
```bash
vips --version
file node_modules/sharp/build/Release/sharp.node
```

---
## 与其他包
只提供图片策略与尺寸计算；上传/下载等由 `@stbzmi/common-web` 负责。无需图片转码时可不装 sharp。

---
## 快速自检
```bash
node -v              # >=20
vips --version       # >=8.17.3 (需要 HEIC 时检查)
```

---
更多背景与全量说明见根仓库 `common/README.md`。
npm package: @stbzmi/core
Description: This library was generated with [Nx](https://nx.dev).
Latest version: 1.1.5

# core

This library was generated with [Nx](https://nx.dev).

## Building

Run `nx build core` to build the library.

## Running unit tests

Run `nx test core` to execute the unit tests via [Vitest](https://vitest.dev/).
npm package: @stbzmi/electron
Description: This library was generated with [Nx](https://nx.dev).
Latest version: 1.1.5

# electron

This library was generated with [Nx](https://nx.dev).

## Building

Run `nx build electron` to build the library.

## Running unit tests

Run `nx test electron` to execute the unit tests via [Vitest](https://vitest.dev/).
npm package: @stbzmi/imsdk
Description: ```bash npm run dev #运行开发服务器,项目入口 example #暂无build sdk npm run build #仅打包模块，不打包依赖 npm run build:all_dep #打包并且将依赖打包进去 ```
Latest version: 1.30.4

## 运行
```bash
npm run dev #运行开发服务器,项目入口 example
#暂无build sdk
npm run build #仅打包模块，不打包依赖
npm run build:all_dep #打包并且将依赖打包进去
```

## npm package name


## 项目相关
 - 添加模块请加入 `peerDependencies` or `devDependencies` , 尽可能不加入 `dependencies`

## 文档

- sdk: https://shimo.im/docs/LfSep3MinZALlNgY
- api: http://148.70.15.154:8889/web/#/235?page_id=4424

## 文件结构

- example 例子
- sdkAssets sdk受用不同项目,资源通过npm scripts切换。不同资源放置不同位置
- src
  - api 接口代码
  - assets 资源文件
  - common 各平台通用,满足ECMA-262 2015+环境即可,跟SDK相关逻辑
    - log.ts 
    - exception.ts 抛出异常
  - components 视图组件
  - context instance上下文
    - db 
      - operator 提供dao所需要的数据库表的读写能力,操作适配层
      - dao  对接数据库表访问，提供持久化能力
    - net socket请求实例
    - store 视图状态层
  - platform 平台相关
    - node NodeJs平台代码
    - browser Browser平台代码
  - services 对应不同表的不同行为
  - types 一些公共类型
  - utils 工具函数,和common不同的是提供存粹的js工具函数
  - IMSDK.ts 暴露类


## 开发事项

### 持久化数据

./src/utils/fileSystem/index.ts

> 提供了前端文件读写的能力，文件目录下README提供了使用例子。支持流式API读写。数据落地到idb。优点不需要区分环境。缓存随着清理消失。缺点相较于系统读写慢，可做日志存储，缓存存储。

### 如何输出日志
```typescript
//实例logger到需要打印的类中
//例如
Context.loggerService = new LoggerService()

//...code
try{
  throw new ApiException({xxx})
} catch (exception) {
  Context.loggerService.error(exception.message)
}

//全局日志
IMSDK.logger.xxx() 
```

### 如何抛出错误

```typescript
import {ApiException,/* ...more exception */} from '@/common/exception'

throw new ApiException({})
```

### worker运行某部分功能

```typescript
import {WorkerEx} from '@/utils'
function add(a: any, b: any): number {
  return a + b;
}
const worker = new WorkerEx(
  (a, b) => {
    return add(a, b);
  },
  { add: add }
);
worker.init();
const result = await worker.run(1, 2);
console.log("main :", result);
```

### 业务层ID转换到SDK ID

业务层ID为A开头的对应ID

```typescript
import {ChatId} from '@/common/id'

//所有的id转换都在id下
ChatId.create(message.achatId)
```

### 销毁器

- 规范销毁方式

```typescript
const disposer = new Disposer();
disposer.add(()=>{console.log('dispose xxx')})


disposer.dispose()
```

### 开发组件

- 参考 example/route.tsx
- 新增 route, 添加自己的组件即可,隔离上下文只用来开发视图