open-index/open-npm huggingface dataset:
npm package: @hcfy/check-google-translate-ip
Description: Determines if a specific IP or Host can be used by Google Translate.
Latest version: 1.2.1

# check-google-translate-ip

Determines if a specific IP or Host can be used by Google Translate.

## Usage

First, install this module:

```zsh
npm i @hcfy/check-google-translate-ip
```

Then:

```js
import { check, checkAll } from '@hcfy/check-google-translate-ip'

// check IP
check('123.232.345.90').then((result) => {
  console.log(result)
})

// check mirror host
check('mirror-for-google-translate.com').then((result) => {
  console.log(result)
})

// Specifies the timeout period in milliseconds, defaults to 10 seconds.
check('mirror-for-google-translate.com', 1000).then((result) => {
  console.log(result)
})

// Specifies agent
import HttpsProxyAgent from 'https-proxy-agent'
check('translate.googleapis.com', {
  timeout: 1000,
  agent: new HttpsProxyAgent('http://127.0.0.1:7890'),
}).then((result) => {
  console.log(result)
})

// Check multiple hosts
checkAll(['123.232.345.90', 'mirror-for-google-translate.com'], {
  timeout: 1000,
  agent: new HttpsProxyAgent('http://127.0.0.1:7890'),
}).then((resultArray) => {
  console.log(resultArray)
})

// By default, `checkAll` will sort the detection results, ranking the hosts with the shortest response times first.
// You can customize the sorting function, or pass `null` to not sort.
checkAll(['123.232.345.90', 'mirror-for-google-translate.com'], {
  sorter: (resultA, resultB) => resultA.host.length - resultB.host.length,
})
```

Detection of IPv6 addresses is not currently supported.

`result` has the following properties:

- `result.host`: String.
- `result.valid`: Boolean, `true` if available.
- `result.time`: Number, exists only when `result.valid` is `true`. Response time in milliseconds.
- `result.timeout`: Boolean, `true` if the reason for unavailability is that there is no response after the timeout period.
- `result.statusCode`: Number. When this attribute is exist, it means that the IP / Host is not available because it returns a response code other than 200.
- `result.error`: When this attribute is exist, it means that the IP / Host is not available because an error occurred during the request.
npm package: @hcfy/create-toaster
Description: `Toaster.create()` of Blueprintjs v5 uses `ReactDOM.render()`, which will generate warnings in React 18, so I created this module to replace `Toaster.create()`.
Latest version: 3.1.0

`Toaster.create()` of Blueprintjs v5 uses `ReactDOM.render()`, which will generate warnings in React 18, so I created this module to replace `Toaster.create()`.

Before:

```js
const toaster = Toaster.create(props, container)
```

After:

```js
import { createToaster } from '@hcfy/create-toaster'

const toasterPromise = createToaster(props, container)

toasterPromise.then(toaster =>{
  toaster.show({ message: 'Hello toaster!' })
})
```

You can also use the following hook to use it synchronously in function components:

```js
import { createToaster, useToasterState }  from '@hcfy/create-toaster'

const toasterPromise = createToaster(props, container)

function App() {
  const toaster = useToasterState(toasterPromise)

  useEffect(() => {
    toaster?.show({ message: 'Hello toaster!' })
  }, [toaster])
}
```

or:

```js
import { createToaster, useToasterRef }  from '@hcfy/create-toaster'

const toasterPromise = createToaster(props, container)

function App() {
  const toasterRef = useToasterRef(toasterPromise)

  useEffect(() => {
    toasterRef.current?.show({ message: 'Hello toaster!' })
  }, [toasterRef.current])
}
```
npm package: @hcfy/fetch-error
Description: ## 动机
Latest version: 1.1.0

# FetchError

## 动机

在使用 Fetch API 时，错误处理有点棘手：

- 服务器返回非 200 的 HTTP 响应码时，fetch 不会抛错，需要我们自己手动生成一个错误对象
- 出现网络错误时，fetch 抛出的错误没有特征，无法准确分辨一个错误是 fetch 抛出的还是其它代码抛出的

为此，这个模块定义了统一的 FetchError。

## 如何使用

```js
import FetchError, { isFetchError } from '@hcfy/fetch-error'

function myFetch() {
  const request = { url: '...', method: 'POST' }
  return fetch(request.url, request).then(
    (response) => {
      if (!response.ok) {
        throw new FetchError(response, request)
      }
      return response
    },
    (e) => {
      return Promise.reject(new FetchError(e, request))
    }
  )
}

myFetch().then(
  (response) => {
    // 代码执行到这里，response.ok 一定是 true
  },
  (error) => {
    if (isFetchError(error)) {
      // 这是 fetch 抛出的错
      // 可以访问 request
      console.log(error.request)

      if (error.response) {
        // 这是由于 response.ok 不是 true 而抛的错
      } else {
        // 这是 fetch 直接抛的错，即网络问题导致请求没有送达服务器、或者被用户中断了。
        // 可以通过 error.cause 拿到具体错误。
        const originError = error.cause
      }
    } else {
      // 这是其它错误
    }
  }
)
```

### 注意事项

FetchError 依赖全局环境中的 `Response` 来判断第一个参数是 response 还是引起报错的 cause，所以：

1. 你需要确保全局环境中有 `Response`
2. 你需要确保你的 fetch 函数返回的 response 是全局环境中的 `Response` 的实例

举个例子，Node.js v18 中在全局环境中已有 `Response`，但如果你是用 node-fetch 发起的请求，而由于 node-fetch 的 response 并不是 Node.js v18 中 `Response` 的实例，这就会导致 FetchError 将它识别为错误 cause。这种情况下，你需要将全局环境中的 `Response` 修改为 node-fetch 的 Response。
npm package: @hcfy/google-translate-ip
Description: 收集国内可用的谷歌翻译 IP 地址，见 ips.txt。
Latest version: 1.0.0

# google-translate-ip

收集国内可用的谷歌翻译 IP 地址，见 ips.txt。

## 更新日志

请查看 CHANGELOG.md 文件。
npm package: @hcfy/js-to-mjs
Description: `tsc -m ESNext` 输出的虽然是 es module 文件，但是：
Latest version: 1.1.0

# js-to-mjs

`tsc -m ESNext` 输出的虽然是 es module 文件，但是：

- 文件后缀仍然是 `.js`
- 文件内的模块导入没有加上完整的文件后缀，比如应该用 `import './utils.mjs'` 而不是 `import './utils'`

而 js-to-mjs 的作用就是：将 `.js` 文件重命名为 `.mjs` 文件，并给文件内的相对路径的模块加入完整的文件扩展名。

## 使用示例

首先安装 @hcfy/js-to-mjs：

```
npm i -D @hcfy/js-to-mjs
```

然后参考下方的 package.json：

```json
{
  "type": "commonjs",
  "exports": {
    ".": {
      "types": "./dist/index.d.ts",
      "import": "./dist/index.mjs",
      "require": "./dist/index.js"
    }
  },
  "scripts": {
    "build:mjs": "tsc --outDir dist -m ESNext --moduleResolution bundler -d && js-to-mjs dist",
    "build:cjs": "tsc --outDir dist -m NodeNext --moduleResolution NodeNext",
    "build": "npm run build:mjs && npm run build:cjs",
    "dev": "nodemon --watch src -e ts,tsx,js --exec \"npm run build\""
  }
}
```

如果你使用的是 TypeScript 5.2.0 以下的版本，那么 `build:mjs` 和 `build:cjs` 可以用下面这种写法，但是这个写法在 5.2.0 以后会报错，见 [TypeScript 5.2.0 的说明](https://devblogs.microsoft.com/typescript/announcing-typescript-5-2/#module-and-moduleresolution-must-match-under-recent-node-js-settings)

```json
{
  "scripts": {
    "build:mjs": "tsc --outDir dist -m ESNext --moduleResolution NodeNext -d && js-to-mjs dist",
    "build:cjs": "tsc --outDir dist -m CommonJS --moduleResolution NodeNext"
  }
}
```

以上示例中：

- `build:mjs` 用来输出 ESM 和 \*.d.ts 文件，其中使用了 js-to-mjs 对 tsc 输出的 .js 文件做了处理。
- `build:cjs` 用来输出 CommonJS 文件，注意其中没有 `-d` 参数，这是因为在 `build:mjs` 中已经输出了 \*.d.ts。
- `build` 用来组合上面两个命令。注意顺序，`build:mjs` 要先执行。
- `dev` 用来在文件变更之后自动 build。由于 `tsc --watch` 不提供执行命令的钩子，所以改为用 nodemon 来监听文件变化并执行 build 命令。

## 注意事项

js-to-mjs 只会处理**相对路径**的模块，即以 '.' 开头的模块导入路径：

```js
import '../utils'
// 会变成
import '../utils.mjs'
```

但 node_modules 里的 submodule 是不会处理的，比如：

```js
// 下面的导入语句不会改变
import isEqual from 'lodash/isEqual'
```

这种情况，你需要自行在 .ts 文件里加上后缀，即 `import isEqual from 'lodash/isEqual.js'`

## 全部的转换规则

```js
// 非相对路径的模块：不会改变
import React from 'react'

// 以 / 结尾的模块：
// 如果 utils/index.js 文件存在，则会变成 './utils/index.mjs'，否则不会改变
import utils from './utils/'

// 不是以 / 结尾的模块：
// 如果 ../runSth.js 文件存在，则变为 '../runSth.mjs'；
// 如果 ../runSth/index.js 存在，则变成 '../runSth/index.mjs'；
// 如果都不存在则不会改变
import '../runSth'
```
npm package: @hcgatewood/appa
Description: Live Markdown previews
Author: Hunter Gatewood
Latest version: 0.0.14

# Appa

Appa provides live-reloaded Markdown previews in your browser.

## Features

- Real-time instant preview
- Live reload
- Near parity with GitHub Markdown rendering

## Install

```sh
npm install --global @hcgatewood/appa
```

## Usage

```sh
appa --open [file]
```

## History

Appa is a simplified rewrite of [Livedown](https://github.com/shime/livedown), which is silently no longer maintained.