open-index/open-npm huggingface dataset:
npm package: @masx200/acorn-parse-escodegen-generate-esm-broweser
Description: 在浏览器中使用 acorn和escodegen 来 进行 javascript 源代码 和 抽象语法树的相互转换的ES模块
Author: masx200
Latest version: 2.0.0

# acorn-parse-escodegen-generate-esm-broweser

可以在浏览器中运行，不需要 nodejs 环境，压缩后体积为 155KB

使用 `acorn`和`escodegen` 来 进行 `javascript` 源代码 和 `抽象语法树`的相互转换的`ES`模块,

把`escodegen`和`estraverse`和`esutils`模块都从`commonjs`模块改成`ES`模块,`acorn`使用自带的`ES`模块

并且使用`rollup` 打包,并开启`tree-shaking`和使用`terser`代码压缩

## 获取已压缩模块

### ES 模块

从 cdn 获取

https://cdn.jsdelivr.net/gh/masx200/acorn-parse-escodegen-generate-esm-broweser@latest/dist/acorn-parse-escodegen-generate.esm.min.js

```html
<script type="module">
    import {
        parse,
        generate,
    } from "https://cdn.jsdelivr.net/gh/masx200/acorn-parse-escodegen-generate-esm-broweser@latest/dist/acorn-parse-escodegen-generate.esm.min.js";
</script>
```

# 安装模块

```bash
npm install --save https://github.com/masx200/acorn-parse-escodegen-generate-esm-broweser.git
```

或者

```shell
yarn add https://github.com/masx200/acorn-parse-escodegen-generate-esm-broweser.git

```

```javascript
import { parse, generate } from "acorn-parse-escodegen-generate-esm-broweser";
```

```javascript
var code = "var b=3";
var ast = parse(code);
var text = generate(ast);
```

A small, fast, JavaScript-based JavaScript parser

https://github.com/acornjs/acorn

https://npm.taobao.org/package/acorn

ECMAScript code generator

https://npm.taobao.org/package/escodegen

https://github.com/estools/escodegen
npm package: @masx200/async-task-current-limiter
Description: 异步任务限流器 async-task-current-limiter
Author: masx200
Latest version: 2.1.0

# async-task-current-limiter

# 介绍

异步任务限流器 `async-task-current-limiter`

为了解决`Error: EMFILE, too many open files`的问题而生.

有太多的文件已打开，已经不能再打开了。

当您尝试一次在系统上打开太多文件时，就会发生这种情况。

由于 `Node` 的异步特性，如果您`fs.readFile`快速连续执行很多或类似的操作，则可以轻松达到系统的 `maxfiles` 限制。

# 安装教程

```shell
yarn add https://github.com/masx200/async-task-current-limiter.git
```

# 使用说明

```js
import AsyncLimiterClass from "@masx200/async-task-current-limiter";
```

# 示例

创建一个异步限流器对象,设定最大同时执行的异步任务数 30 个

当成函数使用

```js
const asynclimiter = AsyncLimiterClass(30);
```

或者当成类使用

```js
const asynclimiter = new AsyncLimiterClass(30);
```

监听异步限流器的`free`和`full`的事件

```js
const listener = (data) => console.log(JSON.stringify(data));

asynclimiter.target.on("free", listener);

asynclimiter.target.on("full", listener);
```

用异步限流包装器,包装一个要限流的异步操作函数,

```js
async function asyncread() {
    return await new Promise((s) => {
        setTimeout(() => {
            s("data:" + Math.random());
        }, Math.random() * 2000);
    });
}

const limitread = asynclimiter.asyncwrap(asyncread);
```

进行大批量异步操作的限流

```js
for (let i = 0; i < 1000; i++) {
    setTimeout(() => {
        limitread().then(console.log);
    }, Math.random() * 5000);
}
```

# 原理

通过调用被限流的异步函数,将调用传入内部队列。如果活跃调用小于最大并发数，将会被取出直接执行，反之则继续呆在队列中。

当一个异步调用结束的时候，会从队列前取出调用执行。以此来保证异步调用的活跃量不高于限定值。

# API

https://github.com/masx200/async-task-current-limiter/blob/master/dist/index.d.ts

## `AsyncLimiterClass(max)`

1.当成函数使用

2.当成类使用

传入参数为限流器设定最大同时执行的任务数

## `asynclimiter.target`

发布订阅的事件目标对象

https://github.com/masx200/event-emitter-target

### 事件 'free'

在限流器空闲的时候触发

可监听的参数类型为 `statusdata`接口

### 事件 'full'

在限流器占满的时候触发

可监听的参数类型为 `statusdata`接口

```ts
interface statusdata {
    status: 空闲状态;
    queue: {
        max: number;
        current: number;
    };
    limiter: {
        max: number;
        current: number;
    };
}
```

## `asynclimiter.asyncwrap(fun)`

异步限流包装器

传入函数必须返回一个`Promise`,

返回一个被限流的异步操作函数

## `asynclimiter.status()`

获取限流器状态的函数,返回'free'或者'full'

## `asynclimiter.limiter.max`

异步限流器的最大同时执行的任务数

## `asynclimiter.limiter.current`

异步限流器的当前同时执行的任务数

## `asynclimiter.queue.max`

异步限流器的异步任务队列总数

## `asynclimiter.queue.current`

异步限流器的异步任务队列中已经执行的任务个数

# 应用解决问题例子

使用异步限流器解决同时打开过多文件的报错

```ts
import fs from "fs";
import AsyncLimiterClass from "@masx200/async-task-current-limiter";
const asynclimiter = AsyncLimiterClass(50);

declare const files: string[];
const limitreadfile = asynclimiter.asyncwrap(fs.promises.readFile);
files.forEach(async (file) => {
    const buf = await limitreadfile(file);
    console.log(buf);
});
```
npm package: @masx200/baidupcs-batch-upload
Description: 使用baidupcs-go,百度网盘批量上传文件夹中的文件
Author: masx200
Latest version: 1.3.2

# baidupcs-batch-upload

https://github.com/iikira/BaiduPCS-Go

使用 `baidupcs-go`,百度网盘批量上传文件,高并发支持

在上传超过几百个文件时，速度快得多

给上传操作限流,防止打开过多报错,默认最多同时运行 15 个上传进程,可传参更多并发上传数

如果遇到 几 种网络问题上传失败,则自动重试，比直接用 一个 `BaiduPCS-Go` 命令上传更快

解决了上传文件有小概率上传未成功，但`baidupcs-go`返回上传成功的问题，

解决思路：使用`upload`上传完文件之后，使用`meta`命令，检查文件是否存在于网盘中，然后重传失败的文件

# 目前适配的版本

BaiduPCS-Go version v3.6.2

BaiduPCS-Go-v3.6.2-windows-x64

下载网址

https://github.com/masx200/baidupcs-batch-upload/releases/download/1.1.5/BaiduPCS-Go-v3.6.2-windows-x64.zip

https://github.com/felixonmars/BaiduPCS-Go/releases/tag/v3.6.2

https://github.com/masx200/baidupcs-batch-upload/releases/download/1.1.8/BaiduPCS-Go.arm64.android-v3.6.2-devel.rar

# 使用方法

安装

```shell
npm i -g @masx200/baidupcs-batch-upload
```

或者

```shell
yarn global add @masx200/baidupcs-batch-upload
```

## 安装 `node_modules`

```shell
yarn install
```

## 编译脚本

```shell
yarn build
```

## 运行脚本

```shell
yarn start
```

# 使用之前先登陆

```shell
BaiduPCS-Go login
```

# 获取 bduss 的方法

http://tool.cccyun.cc/tool/bduss/index3.html

https://bduss.lingtings.com/index3.html

# 命令行示例

必选参数 `input`:类型`string`,输入本地文件目录

必选参数 `dest`:类型`string`,上传到的网盘文件目录

可选参数`concurrent`:类型`number`,同时并发的上传文件个数

```shell

npx @masx200/baidupcs-batch-upload  --input=D:/baidupandownload/图片输入本地 --dest=/baidupandownload/图片输出网盘
```

```shell
npx @masx200/baidupcs-batch-upload --input=D:/baidupandownload/图片输入本地 --dest=/baidupandownload/图片输出网盘 --concurrent=20
```

对于 windows 系统,

如果是带空格的本地目录/网盘目录场景,

可以使用如下命令:

```powershell

baidupcs-batch-upload.cmd --input="d:\2 2" --dest="/test/t s" --concurrent=20
```
npm package: @masx200/custom-elements-random-define
Description: web-components随机定义custom-elements,并且防止重名定义的js库
Author: masx200
Latest version: 1.0.7

# custom-elements-random-define

`web-components` 随机定义 `custom-elements`,并且防止重名定义的 js 库

如果定义重名,则自动使用随机名称定义

由于修改了 `customElements` 的 API,所以需要在最前面引入此模块

# 安装 npm 模块

```powershell
cnpm install --save @masx200/custom-elements-random-define
```

或者

```powershell
yarn add @masx200/custom-elements-random-define
```

# 使用 npm 模块

```js
import RandomDefine from "@masx200/custom-elements-random-define";
```

# 在浏览器中使用

从 cdn 获取

https://cdn.jsdelivr.net/gh/masx200/custom-elements-random-define@latest/dist/index.min.js

```js
import RandomDefine from "https://cdn.jsdelivr.net/gh/masx200/custom-elements-random-define@latest/dist/index.min.js";
```

# API

```ts
declare var RandomDefine: (
    initclass: CustomElementConstructor,
    extendsname?: string | undefined
) => string;
```

# 使用方法

## 普通组件

```js
var mycom = class extends HTMLElement {};
const tag = RandomDefine(mycom);
var myele = new mycom();

let inst = document.createElement(tag);
```

## 继承组件

```js
var mycom = class extends HTMLDivElement {};
const tag = RandomDefine(mycom, "div");
var myele = new mycom();
let inst = document.createElement("div", { is: tag });
```
npm package: @masx200/deno-ddns-over-https-client
Description: 可以和 deno-dns-over-https-server 一起使用
Author: masx200
Latest version: 1.6.2

# deno-ddns-over-https-client

可以和 deno-dns-over-https-server 一起使用

### 使用方法

```
deno run -A ./run_ddns_interval_client.ts --name=xxxxxx-xxxx.xxxxx.xxx.xxx --service_url=https://xxxxxxxxxxxxxxxxxx.xxxxx.xxxxxxxx/dns_records --token=xxxxxxxxxxxxxxxxxxxxxxxx
```

#### 命令参数

- interval: 数值,表示更新间隔时间（单位：毫秒）,默认为 30000.
-
- ipv4: 布尔值,表示是否启用 IPv4 地址,默认为 true.
-
- ipv6: 布尔值,表示是否启用 IPv6 地址,默认为 true.
-
- tailscale: 布尔值,表示是否启用 Tailscale 地址,默认为 false.
-
- public: 布尔值,表示是否启用公共地址,默认为 true.
-
- get_ip_url:布尔值或字符串,向服务器查询本机的公共地址,可以为多个字符串,逗号分割,默认为
-

```json
[
    "https://ipv6.ident.me/",
    "https://ipv4.ident.me/",
    "https://speed4.neu6.edu.cn/getIP.php",
    "https://speed.neu6.edu.cn/getIP.php",
    "https://api4.ipify.org",
    "https://api6.ipify.org/",
    "https://api-ipv6.ip.sb/ip",
    "https://api-ipv4.ip.sb/ip"
]
```

-
-
- private: 布尔值,表示是否启用私有地址,忽略回环地址,默认为 false。
-
-
- token: 字符串,表示 API 令牌,必须的.
-
- name: 字符串,表示 主机域名,可以有多个域名,用逗号分隔,必须的.
-
- service_url: 字符串,表示 DDNS 服务 URL,必须的.
-
- 必须的参数: token /name/ service_url.
-
- interfaces:布尔值或字符串,表示是否启用接口地址,忽略回环地址,或者可以是多个
  接口名,用逗号分隔,比如 eth0,eth1.默认为 false.
-
npm package: @masx200/dns-over-https-node
Description: RFC-8484 Compliant DNS-over-HTTPS API
Author: masx200 Kedmi
Latest version: 1.0.0

# DNS-over-HTTPS API for Node.js

[`@masx200/dns-over-https-node`](https://www.npmjs.com/package/@masx200/dns-over-https-node)
is an RFC-8484 compliant Node.js
[DNS over HTTPS](https://en.wikipedia.org/wiki/DNS_over_HTTPS) API.

[![CircleCI](https://circleci.com/gh/masx200/dns-over-https-node.svg?style=svg)](https://circleci.com/gh/masx200/dns-over-https-node)
[![Coverage Status](https://coveralls.io/repos/github/masx200/dns-over-https-node/badge.svg?branch=master)](https://coveralls.io/github/masx200/dns-over-https-node?branch=master)
[![MIT License](https://img.shields.io/npm/l/@masx200/dns-over-https-node.svg?style=flat-square)](http://opensource.org/licenses/MIT)
[![version](https://img.shields.io/npm/v/@masx200/dns-over-https-node.svg?style=flat-square)](http://npm.im/@masx200/dns-over-https-node)

## Installation

```
$ npm install --save @masx200/dns-over-https-node
```

## API

We import as follows:

```js
const doh = require("@masx200/dns-over-https-node");
```

#### doh.query(...)

```js
doh.query = {
  name,
  method: "POST",
  hostname: "cloudflare-dns.com",
  path: "/dns-query",
  port: 443,
  userAgent: "@masx200/dns-over-https-node",
  type: "A",
  klass: "IN",
  useHttps: true,
};
```

A `name` is mandatory. You can set your own `method`, `hostname`, `path`,
`port`, `userAgent`, `type`, `klass` and `useHttps`.

A `Promise` that resolves to a `DNS` response object is returned.

For instance,

```js
const doh = require("@masx200/dns-over-https-node")(async () => {
  const dnsResponse = await doh.query({ name: "dns.google" });
})();
```

Results in:

```
{
  "id": 0,
  "type": "response",
  "flags": 384,
  "flag_qr": true,
  "opcode": "QUERY",
  "flag_aa": false,
  "flag_tc": false,
  "flag_rd": true,
  "flag_ra": true,
  "flag_z": false,
  "flag_ad": false,
  "flag_cd": false,
  "rcode": "NOERROR",
  "questions": [
    {
      "name": "dns.google",
      "type": "A",
      "class": "IN"
    }
  ],
  "answers": [
    {
      "name": "dns.google",
      "type": "A",
      "ttl": 300,
      "class": "IN",
      "flush": false,
      "data": "151.101.1.195"
    },
    {
      "name": "dns.google",
      "type": "A",
      "ttl": 300,
      "class": "IN",
      "flush": false,
      "data": "151.101.65.195"
    }
  ],
  "authorities": [],
  "additionals": []
}
```

More usage examples can be found in
[`example`](https://github.com/masx200/dns-over-https-node/blob/master/example/index.js).

## License

MIT
npm package: @masx200/event-emitter-target
Description: 用typescript函数式编程写成的发布订阅事件机制模块
Author: masx200
Latest version: 2.0.5

# event-emitter-target

发布订阅事件机制模块

用 Typescript 函数式编程写成

添加事件监听器有自动去重功能

事件触发时，监听器函数异步执行

# 安装模块

```shell
yarn add https://github.com/masx200/event-emitter-target.git

```

# 导入模块

```javascript
import EventEmitterTargetClass from "@masx200/event-emitter-target";
```

# 示例

创建 `EventEmitterTarget`对象,有两种方法

1.当做函数使用

```js
let emitter = EventEmitterTargetClass();
```

2.当做类使用

```js
class myemitter extends EventEmitterTargetClass {}

let emitter = new myemitter();
```

3.以下示例显示了`EventEmitterTarget`具有单个侦听器的简单实例。

该`EventEmitterTarget.on()`方法用于注册侦听器，

而该`EventEmitterTarget.emit()`方法用于触发事件。

```js
emitter.on("event", () => {
    console.log("an event occurred!");
});
emitter.emit("event");
```

4.使用参数`sync`创建同步的`EventEmitterTarget`

```js
let emitter = EventEmitterTargetClass({ sync: true });
```

如果参数`sync`为`true`,则在触发事件时,使用同步的方式调用侦听器.

如果参数`sync`为`false`,则在触发事件时,使用异步的方式调用侦听器.

# API

typescript 类型声明文件

https://github.com/masx200/event-emitter-target/blob/master/src/index.ts

## `EventEmitterTargetClass()`

1.可当做函数使用

2.可当做类使用

返回一个`EventEmitterTarget`对象

## `emitter[Symbol.toStringTag]`

此属性值为 `"EventEmitterTarget"`，

可以用来判断对象类型。

## `emitter[Symbol.iterator]()`

返回所有的事件名和监听器的数组迭代器

## `emitter.entries()`

别名 `emitter[Symbol.iterator]()`

## `emitter.listenerCount(eventName)`

返回侦听名为`eventName`的事件的侦听器数

## `emitter.clear(eventName)`

别名 `emitter.removeAllListeners(eventName)`

## `emitter.removeAllListeners(eventName)`

删除指定`eventName`的所有侦听器。

删除代码中其他地方添加的侦听器是一种不好的做法，尤其是在`EventEmitterTarget`实例由其他组件或模块创建时。

## `emitter.on(eventName, listener)`

将监听器函数添加到名为`eventName`的事件的监听器数组的末尾。检查是否已添加侦听器。通过`eventName`和`listener`的相同组合进行的多次调用不会导致多次添加和调用该监听器。

## `emitter.addListener(eventName, listener)`

别名 `emitter.on(eventName, listener)`

## `emitter.off(eventName, listener)`

别名 `emitter.removeListener(eventName, listener)`.

## `emitter.removeListener(eventName, listener)`

从名为`eventName`的事件的侦听器数组中删除指定的侦听器。

`removeListener()`将最多从侦听器数组中删除一个侦听器实例。如果已将任何单个侦听器多次添加到指定`eventName`的侦听器数组，则`removeListener()`无需多次调用即可删除每个实例。

## `emitter.once(eventName, listener)`

为名为`eventName`的事件添加一次性侦听器函数。下次`eventName`触发时，将删除此侦听器，然后调用它。

## `emitter.emit(eventName, args)`

以注册事件`eventName`的顺序异步调用为名为的事件注册的每个侦听器，并将提供的参数传递给每个侦听器。

## `emitter.dispatch(eventName, args)`

别名 `emitter.emit(eventName, args)`

## `emitter.eventNames()`

返回一个数组，该数组列出发射器已为其注册侦听器的事件。数组中的值将是`string`或`symbol`。

## `emitter.listeners(eventName)`

返回名为`eventName`的事件的侦听器数组的副本。
npm package: @masx200/fetch-file-list-to-mongodb
Description: 获取百度网盘所有文件信息保存到MongoDB数据库的脚本
Author: masx200
Latest version: 2.0.5

# fetch-file-list-to-mongodb

这个代码库是`百度网盘批量清理重复文件计划`的一部分。

批量获取百度网盘所有文件信息保存到 `MongoDB` 数据库的脚本

保存数据到数据库的位置

"dbname" 是'baidupan'

"collection" 是"panfile"

百度网盘批量清理重复文件计划

https://github.com/masx200/baidu-pan-delete-repeated-files

https://github.com/masx200/fetch-baidu-pan-files-api

https://github.com/masx200/fetch-file-list-to-mongodb

https://github.com/masx200/mongodb-file-find-md5-repeat

# 使用方法

# 全局安装

```
yarn global add @masx200/fetch-file-list-to-mongodb
```

# 使用准备

先使用`@masx200/fetch-baidu-pan-files-api`登陆保存一下`cookie`

## 安装 `node_modules`

```shell
yarn install
```

## 编译脚本

```shell
yarn build
```

## 运行脚本

```shell
yarn start
```

# 使用前需要 `MongoDB`

安装 `MongoDB`到电脑上

```shell
sudo apt install mongodb
```

启动`MongoDB` 服务

```shell
mongod --dbpath /path/to/your/db
```

# 清除数据库的百度网盘文件信息

```shell
mongo  mongodb://127.0.0.1:27017/baidupan ./mongo/clean.js
```

# 命令行示例

可选参数 `db`:本地数据库的名称 `string`

可选参数 `collect`:数据库中集合的名称 `string`

可选参数 `mongourl`：mongodb 数据库的 URL

例如： "mongodb://127.0.0.1:27017/?readPreference=primary&appname=MongoDB%20Compass%20Community&ssl=false"

```shell
fetch-file-list-to-mongodb --db=baidupan  --collect=panfile --mongourl=mongodb://127.0.0.1:27017

```
npm package: @masx200/image-conversion-compression-webp
Description: 图片转换和压缩到webp
Author: masx200
Latest version: 1.2.0

# Image-conversion-compression-webp

图片其他类型转换和压缩到 `webp`格式 ,可设置输出图片最大像素数

给文件读取异步操作限流,防止文件打开过多报错

判断输入图片内容类型,是否`webp`,如果是,则重命名扩展名为`webp`,因为有些图片的扩展名不正确

## 安装依赖

### 先安装 `GraphicsMagick`

```shell
sudo apt install graphicsmagick

```

或者下载`GraphicsMagick`

ftp://ftp.graphicsmagick.org/pub/GraphicsMagick/windows/GraphicsMagick-1.3.35-Q8-win64-dll.exe

https://cdn.jsdelivr.net/gh/masx200/long-image-split-square@GraphicsMagick-1.3.34-Q16-win64/GraphicsMagick-1.3.34-Q16-win64-dll.exe.zip

https://cdn.jsdelivr.net/gh/masx200/long-image-split-square@GraphicsMagick-1.3.34-Q16-win64/GraphicsMagick-1.3.34.tar.xz

### 需要安装`libwebp`

```shell
sudo apt install  libwebp

```

或者下载`libwebp`的可执行文件

http://downloads.webmproject.org/releases/webp/

http://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.1.0-windows-x64.zip

https://cdn.jsdelivr.net/gh/masx200/long-image-split-square@libwebp/libwebp-1.0.1-windows-x64.zip

https://cdn.jsdelivr.net/gh/masx200/long-image-split-square@libwebp-1.1.0-aarch64/libwebp-1.1.0-aarch64.zip

### 安装 `node_modules`

```
yarn add @masx200/image-conversion-compression-webp
```

```shell
yarn install
```

## 编译脚本

```shell
yarn build
```

## 运行脚本

```shell
yarn start
```

# 命令行示例:

必选参数 `input`:类型 `string`,输入图片目录

必选参数 `output`:类型`string`,输出图片目录

可选参数 `maxpixels`:类型`number`,输出图片最大像素数

可选参数 `concurrent`:类型`number`,同时运行的图片处理进程最大值

可选参数 `inputextentions`:类型`string`,输入的文件扩展名,使用逗号分隔

```shell
node ./dist/cli.js --input=D:/baidupandownload/图片输入/ --output=D:/baidupandownload/图片输出/

```

```shell
node ./dist/cli.js --input=D:/baidupandownload/图片输入/ --output=D:/baidupandownload/图片输出/ --maxpixels=4000000 --concurrent=4
```

```
npx @masx200/image-conversion-compression-webp --input=C:\Pictures\2020年5月17日\图片 --output=C:\Pictures\2020年5月17日\图片
```
npm package: @masx200/jsfuck-and-hieroglyphy-decoder-and-encoder
Description: JSfuck and hieroglyphy Decoder and  ENCODER
Author: masx200
Latest version: 2.1.2

# JSfuck-and-hieroglyphy-Decoder-and-ENCODER

JSfuck and hieroglyphy Decoder and ENCODER

JSFuck 是一种基于 JavaScript 原子部分的深奥教育编程风格。它只使用六个不同的字符来编写和执行代码

hieroglyphy 是一个工具和 javascript 库，用于将字符串，数字和脚本转换为 的等效序列！在浏览器中运行的字符

<code>
    ()+[]!
</code>
    和
<code>
()[]{}+!
</code>

[类型声明](src/index.ts)

# 使用方法

```js
import {
    jsfuckString,
    jsfuckScript,
    hieroglyphyString,
    hieroglyphyScript,
    decode,
} from "@masx200/jsfuck-and-hieroglyphy-decoder-and-encoder";
```

四种编码方法:

`jsfuckString`,
`jsfuckScript`,
`hieroglyphyString`,
`hieroglyphyScript`,

一种解码方法:

`decode`

# 在线演示

https://js-fuck-and-hieroglyphy-decoder-and-encoder.vercel.app

# 优化了 jsfuck 的代码执行流程,修复了加载 jsfuck 导致网页卡顿的问题

Loading jsfuck causes problems with webpages ，May cause the page to be stuck for 5 seconds

Execute the following initialization code when the first load is made, causing problems with webpages.

Modified to execute these initialization code after calling jsfuck's encode method

把原本的第一次加载就执行以下初始化代码,导致网页卡顿的问题

```javascript
fillMissingDigits();
fillMissingChars();
replaceMap();
replaceStrings();
```

修改成在调用 jsfuck 的 encode 方法之后再执行这些初始化代码

```javascript
var haveinit = 0;
function encode(input, wrapWithEval) {
    if (haveinit === 0) {
        fillMissingDigits();
        fillMissingChars();
        replaceMap();
        replaceStrings();
        haveinit = 1;
    }

    //.....................................
}
```

# 改进编码和解码算法

基于 jsfuck 和 hieroglyphy，并且改进了 jsfuck 对中文字的编码方式，

缩小编码之后的体积，借鉴于 hieroglyphy，把中文字转换成 Unicode 编码

,并且改进了解码的算法，可以同时解码两种编码生成的 script 和 string

改进了 hieroglyphy 中对于花括号的编码方式，缩小体积，借鉴于 jsfuck

例如把"你的男的女的男的女的哦洗涤剂嗯嗯额"转换成"\u4f60\u7684\u7537\u7684\u5973\u7684\u7537\u7684\u5973\u7684\u54e6\u6d17\u6da4\u5242\u55ef\u55ef\u989d"

Improved coding and decoding algorithms

Based on jsfuck and hieroglyphy, and improved the way jsfuck encodes Chinese characters,

Reduce the volume after encoding, learn from hieroglyphy, convert Chinese characters into Unicode encoding

And improved the decoding algorithm, which can simultaneously decode the script and string generated by the two encodings.

Improved the coding of curly braces in hieroglyphy, reducing the size, drawing on jsfuck

# 浏览器兼容性

建议在最新超高版本 chrome 或者 Firefox 或者 safari 浏览器中运行

或者用 webpack 或者 parcel bundler,babel 转换代码,可以在老旧浏览器中运行

# 感谢

<a href="https://github.com/aemkei/jsfuck/blob/master/jsfuck.js">https://github.com/aemkei/jsfuck/blob/master/jsfuck.js
</a>
<br>
<a href="https://github.com/alcuadrado/hieroglyphy/blob/master/hieroglyphy.js">https://github.com/alcuadrado/hieroglyphy/blob/master/hieroglyphy.js</a>
npm package: @masx200/koa-range
Description: range request implementation for koa
Author: masx200
Latest version: 1.0.5

# koa-range

forked from

https://github.com/koajs/koa-range

It seems that the original project has not been updated for a long time.

The following problems have been fixed.

https://github.com/koajs/koa-range/issues/17

https://github.com/koajs/koa-range/issues/15

https://github.com/koajs/koa-range/issues/16

https://github.com/koajs/koa-range/issues/19

https://github.com/koajs/koa-range/issues/20

=================

range request implementation for koa

[![NPM version][npm-img]][npm-url]
[![Build status][travis-img]][travis-url]
[![Test coverage][coveralls-img]][coveralls-url]
[![License][license-img]][license-url]
[![Dependency status][david-img]][david-url]

[![NPM](https://nodei.co/npm/koa-range.png?stars&downloads)](https://nodei.co/npm/koa-range/)
[![NPM](https://nodei.co/npm-dl/koa-range.png)](https://nodei.co/npm/koa-range/)

### Installation

```sh
$ npm install @masx200/koa-range
```

### Usage (with koa@2)

```js
var fs = require("fs");
var range = require("@masx200/koa-range");
var route = require("koa-route");
var Koa = require("koa");
var app = new Koa();

app.use(range);

// via buffer
app.use(
    route.get("/", async function (ctx) {
        ctx.body = new Buffer(100);
    })
);

// via object
app.use(
    route.get("/json", async function (ctx) {
        ctx.body = {
            foo: "bar",
        };
    })
);

// via readable stream
app.use(
    route.get("/stream", async function (ctx) {
        ctx.body = fs.createReadStream("your path");
    })
);
```

Until async/await is supported by default, you will need to do one of the following:

-   Transpile your code with somehting like Babel
-   Use node v7 with --harmony-async-await flag

### License

MIT

[npm-img]: https://img.shields.io/npm/v/koa-range.svg?style=flat-square
[npm-url]: https://npmjs.org/package/koa-range
[travis-img]: https://img.shields.io/travis/koajs/koa-range.svg?style=flat-square
[travis-url]: https://travis-ci.org/koajs/koa-range
[coveralls-img]: https://img.shields.io/coveralls/koajs/koa-range.svg?style=flat-square
[coveralls-url]: https://coveralls.io/r/koajs/koa-range?branch=master
[license-img]: https://img.shields.io/badge/license-MIT-green.svg?style=flat-square
[license-url]: https://opensource.org/licenses/MIT
[david-img]: https://img.shields.io/david/koajs/koa-range.svg?style=flat-square
[david-url]: https://david-dm.org/koajs/koa-range
npm package: @masx200/local-aria2-webui
Description: 本地化的 aria2 webui
Author: masx200
Latest version: 1.1.2

# local-aria2-webui

本地化的 aria2 webui

感谢原作者

https://github.com/ziahamza/webui-aria2

在线访问

https://masx200.github.io/local-aria2-webui/static

# 安装

安装 nodejs

https://nodejs.org/

```shell
apt install nodejs
```

安装 yarn

https://yarnpkg.com/

```shell
npm install -g yarn
```

安装 live-server

https://www.npmjs.com/package/live-server

```shell
yarn global add live-server

```

```bash
yarn global add @masx200/local-aria2-webui
```

# 启动

```bash
npx @masx200/local-aria2-webui --port=8080 --host=localhost
```

使用浏览器打开网址

http://127.0.0.1:8080

aria2c RPC 配置

https://github.com/masx200/aria2c-backend-rpc-config
npm package: @masx200/long-image-split-square
Description: 批量把长图拆分成接近正方形的小图片的脚本
Author: masx200
Latest version: 1.5.3

# long-image-split-square

此仓库仅供学习交流之用

批量把长图竖直或水平拆分成接近正方形的小图片的脚本

给文件读取异步操作限流,防止文件打开过多报错

这些图片往往是微博图片特色，或者是全景照片

## 安装依赖

先安装 `GraphicsMagick`

```shell
sudo apt install graphicsmagick
```

或者下载`GraphicsMagick`

https://cdn.jsdelivr.net/gh/masx200/long-image-split-square@GraphicsMagick-1.3.34-Q16-win64/GraphicsMagick-1.3.34-Q16-win64-dll.exe.zip

https://cdn.jsdelivr.net/gh/masx200/long-image-split-square@GraphicsMagick-1.3.34-Q16-win64/GraphicsMagick-1.3.34.tar.xz

如果要处理`webp`文件需要安装`libwebp`

```shell
sudo apt install  libwebp
```

或者下载`libwebp`的可执行文件

http://downloads.webmproject.org/releases/webp/

https://cdn.jsdelivr.net/gh/masx200/long-image-split-square@libwebp/libwebp-1.0.1-windows-x64.zip

https://cdn.jsdelivr.net/gh/masx200/long-image-split-square@libwebp-1.1.0-aarch64/libwebp-1.1.0-aarch64.zip

官方说明

https://github.com/webmproject/libwebp

http://www.linuxfromscratch.org/blfs/view/svn/general/libwebp.html

http://www.graphicsmagick.org/README.html

## 安装 `node_modules`

```
yarn add @masx200/long-image-split-square
```

```shell
yarn install
```

## 编译脚本

```shell
yarn build
```

## 运行脚本

```shell
yarn start
```

# 长图判定方法

图片长边与短边的比例大于 3，且短边大于 400 像素,横向或竖向均可

## 配置

编辑`image-config.json`文件

https://github.com/masx200/long-image-split-square/blob/master/dist/IMAGECONFIG.d.ts

`inputextentions`：输入的文件扩展名,使用逗号分隔

`input`：输入文件的目录

`output`：输出文件的目录

`outputextention`:输出文件的扩展名

`maxpixels`:输出图片的最大像素总数限制,若无限制,则为 0

```ts
interface IMAGECONFIG {
    inputextentions: string[];
    input: string;
    output: string;
    outputextention: string;
    maxpixels: number;
}
```

# 支持的图片格式

`webp` 和 `GraphicsMagick Supported Formats`

https://github.com/masx200/long-image-split-square/blob/master/gm%20convert%20-list%20format.txt

http://www.graphicsmagick.org/formats.html

# 命令行用法示例

必选参数 `input`:类型`string`,输入图片目录

必选参数 `output`:类型`string`,输出图片目录

可选参数 `maxpixels`:类型`number`,输出图片最大像素数

可选参数 concurrent:类型:number,同时运行的图片处理进程最大值

可选参数 gm-path: 类型:string,输入 gm 的路径

可选参数 cwebp-path: 类型:string,输入 cwebp 的路径

```shell
node ./dist/cli.js --input=D:/baidupandownload/图片输入  --output=D:/baidupandownload/输出切割图片/
```

```shell
node ./dist/cli.js --input=D:/baidupandownload/图片输入  --output=D:/baidupandownload/输出切割图片/ --maxpixels=4000000 --concurrent=4
```

```shell
npx @masx200/long-image-split-square --input=D:/baidupandownload/图片输入  --output=D:/baidupandownload/输出切割图片/ --maxpixels=4000000
```

# 更新日志

升级版本 GraphicsMagick 1.3.45 之后支持了 webp 作为输入文件格式了
npm package: @masx200/mini-cli-args-parser
Description: 迷你版命令行参数解析器
Author: masx200
Latest version: 1.1.0

# mini-cli-args-parser

迷你版命令行参数解析器

Take a set of command line arguments, optionally with a set of options, and return an object representing the flags found in the passed arguments.

By default, any arguments starting with `-` or `--` are considered boolean flags. If the argument name is followed by an equal sign (`=`) it is considered a key-value pair. Any arguments which could not be parsed are available in `Array.from(parsedArgs)`.

Any arguments after '`--`' will not be parsed and will end up in `Array.from(parsedArgs)`.

# 安装

```shell
yarn add "@masx200/mini-cli-args-parser"
```

# 使用方法

```js
import parse from "@masx200/mini-cli-args-parser";
const args = process.argv.slice(2);
const opts = parse(args);
const arr = Array.from(opts);

console.log(opts);
console.log(arr);
```

# 类型声明

```ts
function parse(args: string[]): any;
```

## 获取命名参数

```js
const opts = parse(args);
```

## 获取其他参数

```js
const arr = Array.from(opts);
```

# 查看例子

```js
const args = [
    "aaaaaaa",
    "bbbbbb",
    "--cccccc=555555555",
    "--ddddd=xcvsaz",
    "xxxxxxxxxxxxx",
    "--ttt=bbb=1",
];

const opts = parse(args);
const arr = Array.from(opts);

console.log(opts);
console.log(arr);
```

```

[Object: null prototype] {
  cccccc: '555555555',
  ddddd: 'xcvsaz',
  ttt: 'bbb=1',
  [Symbol(Symbol.iterator)]: [Function: bound values]
}
[ 'aaaaaaa', 'bbbbbb', 'xxxxxxxxxxxxx' ]

```

```ts
const res = parse([
    "-a",
    "-he",
    "--dddd",
    "--eeeeee=3333",
    "--",
    "haha",
    "--",
    "-o",
    "--p",
]);
const arr = [...res];
console.log(res, arr);
```

```
[Object: null prototype] {
  eeeeee: '3333',
  a: true,
  h: true,
  e: true,
  dddd: true,
  [Symbol(Symbol.iterator)]: [Function (anonymous)]
} [ 'haha', '--', '-o', '--p' ]
```
npm package: @masx200/mn5-cc-image-downloader
Description: 以下两个网站的图片爬虫 www.mn5.cc 和 www.xiurenji.com
Author: masx200
Latest version: 1.2.7

# mn5-cc-image-downloader

#### 介绍

以下图片网站的相册图片下载器

https://www.xiurenb.com/

https://www.xiurenji.com/

https://www.mn5.cc/

https://www.mntp.vip/

https://www.jpxgyw.vip/

带有限流功能和网络重试功能

# 配合 aria2 rpc

需要配合 arai2c 使用，

aria2 RPC 调用网址默认为，

http://localhost:6800/jsonrpc

也可以传入参数`rpcurl`来修改调用的 URL。

# 安装

```
yarn global add "@masx200/mn5-cc-image-downloader"
```

# 使用方法

命令行模式支持多个相册的 URL 参数传入

必选参数: 多个相册的 URL

可选参数 `rpcurl` : 指定调用 aria2 rpc 的 URL

例如

```
npx @masx200/mn5-cc-image-downloader https://www.mn5.cc/YouMi/14745.html https://www.xiurenji.com/XiuRen/6197.html

```

```shell

npx @masx200/mn5-cc-image-downloader --rpcurl=http://127.0.0.1:7000/jsonrpc   'https://www.mn5.cc/Mtcos/Mtcos14529.html' "https://www.mn5.cc/YouMi/14550.html"

```

# 推荐 aria2c RPC 配置

https://github.com/masx200/aria2c-backend-rpc-config
npm package: @masx200/mn5-cc-search-downloader
Description: 网站 www.mn5.cc 的搜索页面的批量下载图片浏览器脚本
Author: masx200
Latest version: 1.2.3

# mn5-cc-search-downloader

网站 https://www.mn5.cc 和 https://www.xiurenji.com 的搜索页面的批量下载图片浏览器脚本

# 使用方法

1.打开搜索页面

https://www.mn5.cc/plus/search/index.asp

或者

https://www.xiurenji.com/plus/search/index.asp

搜索框输入内容,点击搜索

3.把内容复制到浏览器控制台运行

```js
import(
    "https://cdn.jsdelivr.net/gh/masx200/mn5-cc-search-downloader@latest/src/index.js"
);
```

# 注意:

需要配合 arai2c 使用，

https://aria2.github.io/

aria2 RPC 默认调用网址为

http://localhost:6800/jsonrpc

也可以在加载脚本前,通过设置变量`window[Symbol.for("rpcurl")]`来修改,例如

```js
window[Symbol.for("rpcurl")] = "http://localhost:7000/jsonrpc";
```

aria2c RPC 配置

https://github.com/masx200/aria2c-backend-rpc-config
npm package: @masx200/mongodb-file-find-md5-repeat
Description: 从本地 `mongodb` 数据库中查找保存的文件信息中有 `md5` 重复的文件
Author: masx200
Latest version: 1.2.1

# mongodb-file-find-md5-repeat

这个代码库是`百度网盘批量清理重复文件计划`的一部分。

从本地 `mongodb` 数据库中查找保存的文件信息中有 校验码 重复的文件

本地 `mongodb` 数据库中需要有一张表,有`md5`和`path`字段

`md5` : 文件的校验码

`path`:文件的路径

查找完成后输出文件信息

百度网盘批量清理重复文件计划

https://github.com/masx200/baidu-pan-delete-repeated-files

https://github.com/masx200/fetch-baidu-pan-files

https://github.com/masx200/fetch-file-list-to-mongodb

https://github.com/masx200/mongodb-file-find-md5-repeat

# 使用方法

# 安装

```shell
yarn add @masx200/mongodb-file-find-md5-repeat
```

## 安装 `node_modules`

```shell
yarn install
```

## 编译脚本

```shell
yarn build
```

## 运行脚本

```shell
yarn test
```

# 输出重复文件列表举例

```ts
type repeatfiles = [hash, path[]][];

type hash = string;
type path = string;
```

```json
[
    [
        "0002c8865pfdfa8e4cc4ddac9efa8fcb",
        [
            "/!我的图片-20190604/微博美图暴力切割-2020-01-05 225127/微博美图cosplay-暴力切割图片-2020-01-05 225127-8(1).rar_20200108075529/8/d056376101218de1175142244de798cb.webp",
            "/!我的图片-2020-02-10/手机相册微博图片图片合集-20200210/微博美图cosplay-暴力切割图片-2020-01-05/微博美图cosplay-暴力切割图片-2020-01-05 225127-8/8/d056376101218de1175142244de798cb.webp"
        ]
    ],
    [
        "000f76c4aj6c23bc48f02f6af0dbc9cc",
        [
            "/!我的图片-20190604/微博美图暴力切割-2020-01-05 225127/微博美图cosplay-暴力切割图片-2020-01-05 225127-2(1).rar_20200108075402/2/2ac7ee53012c33a37970042349d36a0d.webp",
            "/!我的图片-2020-02-10/手机相册微博图片图片合集-20200210/微博美图cosplay-暴力切割图片-2020-01-05/微博美图cosplay-暴力切割图片-2020-01-05 225127-2/2/2ac7ee53012c33a37970042349d36a0d.webp"
        ]
    ]
]
```
npm package: @masx200/pi-calculation-multithreading
Description: Pi calculation, multithreading, based on large number frames decimal.js and webworker 圆周率计算，多线程，基于大数框架 decimal.js 和 webworker 圆周率计算-可设置圆周率位数-可选择线程个数-多线程大数框架 webworker 输出 useragent 大数框架
Author: masx200
Latest version: 1.0.3

# Pi-calculation-multithreading

Pi calculation, multithreading, based on large number frames decimal.js and webworker

圆周率计算，多线程，基于大数框架 decimal.js 和 webworker

圆周率计算-可设置圆周率位数-可选择线程个数-多线程大数框架 webworker 输出 useragent 大数框架

# 圆周率计算多线程,使用 BigInteger.js 和浏览器原生的 BigInt 之后速度得到巨大提升!

需要浏览器 chrome68 以上,才原生支持 BigInt

<h3>BigInteger.js</h3>
<p>
  BigInteger.js是Javascript的任意长度整数库，允许对无限大小的整数进行算术运算，尽管存在内存和时间限制。
  更新（2018年12月2日）：BigInt被添加为JavaScript的本机功能。
  此库现在可用作polyfill：如果环境支持本机BigInt，则此库充当本机实现的瘦包装器。
  建议升级浏览器到chrome68以上,才可支持原生BigInt.
<b>如果浏览器原生支持BigInt,则运行速度有巨大提升!</b>
</p>

<h3>计算运行速度排行:</h3>
<br />1.原生BigInt最快,<br />2.BigInteger.js中速,<br />3.Decimal.js最慢。
<hr>
<br />
<h4> 线程数为4 圆周率计算6000位测试结果</h4>
<br />
firefox 66 测试 decimal.js 达到1倍速度
<br />
firefox 66 测试 BigInteger.js 达到2.163倍速度
<br />
chrome 75 测试 decimal.js 达到3.4375倍速度
<br />
chrome 75 测试 原生BigInt 达到74.038倍速度
<p></p>
<hr>
<h4> 线程数为4 圆周率计算10000位测试结果</h4>
<br />
firefox 66 测试 decimal.js 达到1倍速度
<br />
firefox 66 测试 BigInteger.js 达到2.066倍速度
<br />
chrome 75 测试 decimal.js 达到3.688倍速度
<br />
chrome 75 测试 原生BigInt 达到100.773倍速度
<p></p>
<hr>

可以测试浏览器的 JavaScript 运行引擎速度

建议在最新版本的 chrome 或者 Firefox 或者 safari 中运行，否则速度可能特别慢

```
UserAgent: Mozilla/5.0 (Linux; Android 9; MHA-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.136 Mobile Safari/537.36
开始圆周率多线程测试
线程数为 8
圆周率计算 1000 位
计算圆周率中......
计算完成,用时 1.476 秒第 340 次
圆周率 1000 位
```

[查看算法](src/pi_calc.AsciiMath)

[查看示例](src/index.html)

# 在线演示

https://pi-calculation-multithreading.pages.dev/

# API

[类型声明](src/index.ts)

## 主线程中使用的计算圆周率的函数

`bigintCalculatePi`:使用 "big-integer"进行圆周率计算

`decimalCalculatePi`:使用 "decimal.js"进行圆周率计算

参数 1:创建`webworker`的函数

参数 2:要计算圆周率的位数

参数 3:要开启的多线程个数

返回值 1:圆周率字符串

返回值 2:计算迭代次数

## 主线程中关闭所有`webworker`的方法

`bigintcleanup`和`decimalcleanup`

## 子线程中添加消息事件处理程序

`bigintworkersetup`和`decimalworkersetup`

# 使用方法

## 在 `webworker` 文件中添加消息事件处理程序

```js
import { bigintworkersetup } from "@masx200/pi-calculation-multithreading";

bigintworkersetup();
```

## 在主线程文件中

### 当需要关闭所有 `webworker` 的时候使用如下函数

```js
import { bigintcleanup } from "@masx200/pi-calculation-multithreading";

bigintcleanup();
```

### 启动`webworker`并计算圆周率

```js
import { bigintCalculatePi } from "@masx200/pi-calculation-multithreading";
import MyWorker from "./mythread1-bigint.js?worker";

//创建webworker的函数

function createworker() {
    return new MyWorker();
}
```

```js
const [resultpi, x] = await bigintCalculatePi(createworker, piwei, threadgeshu);
```
npm package: @masx200/rename-by-md5
Description: 批量使用文件的md5值给文件重命名
Author: masx200
Latest version: 1.1.6

# rename-by-md5

批量使用文件的 `md5` 值给文件重命名

对于没有使用`md5`命名的文件,在文件名后面添加`md5`

对于使用`md5`命名的文件,在文件名后面不重复添加`md5`

# 安装方法

```shell
npm i -g @masx200/rename-by-md5
```

安装依赖

```
yarn install
```

编译脚本

```
yarn build
```

运行脚本

```
yarn  start
```

# 配置参数

在"rename-config.json"文件中配置参数

递归查找输入文件夹`dir`的

指定后缀名`extention`的文件

配置参数中的`keeporigin`代表是否保留原文件名

```ts
interface RENAMECONFIG {
    extention: string[];
    dir: string;
    keeporigin: boolean;
}
```

# 命令行参数

必须参数 dir:类型 string ,指定文件夹目录

可选参数 extention:类型 string ,指定文件扩展名

# 命令行脚本执行示例

```powershell
node ./cli.js "--dir=D:\baidupandownload\"
```

使用方法

```shell
npx @masx200/rename-by-md5  "--dir=C:\Example Files" "--extention=jpg,webp"
```

```shell
npx @masx200/rename-by-md5  "--dir=C:\Example Files" --extention=jpg
```
npm package: @masx200/rollup-plugin-http-resolve
Description: ``` rollup-plugin-http-resolve```
Author: masx200
Latest version: 5.0.2

# @masx200/rollup-plugin-http-resolve

```
npm install @masx200/rollup-plugin-http-resolve --save
```

缓存默认为内存缓存,
添加了文件系统缓存的功能,可以按需使用

## Example

```ts
// rollup.config.js
import { httpResolve } from "@masx200/rollup-plugin-http-resolve";
export default {
    input: "index.js",
    plugins: [
        httpResolve({
            cache,
        }),
    ],
};
```

## Example: CDN Resolve

```ts
const vol = Volume.fromJSON({
    "/index.js": `
    import {h} from "preact";
    console.log(h);
    `,
});

const memfs = createFs(vol) as IPromisesAPI;
const rolled = await rollup({
    input: "/index.js",
    plugins: [
        httpResolve({
            fallback(id) {
                // Avoid local relative path
                if (!id.startsWith(".")) {
                    return `https://esm.sh/${id}`;
                }
            },
        }),
        memfsPlugin(memfs),
    ],
});
const out = await rolled.generate({ format: "es" });
const code = out.output[0].code;
```

## With transform import

Rewrite `https://` code by your self.

```js
import ts from "typescript";
export default {
  plugins: [
    httpResolve(),
    {
      name: "transform-cdn",
      transform(code, id) {
        if (id?.startsWith("https://")) {
          const out = ts.transpileModule(code, {
            compilerOptions: {
              module: ts.ModuleKind.ESNext,
              target: ts.ScriptTarget.ES5,
            },
          });
          return {
            code: out.outputText,
            map: out.sourceMapText,
          };
        }
      },
    },
  ],
});
```

## LICENSE

MIT
npm package: @masx200/serve-cli
Description: ## Description
Author: masx200
Latest version: 1.3.1

# serve-cli

## Description

A simple zero-configuration command-line static file server based on koa2.

支持范围请求，条件请求，内容压缩，跨域访问，添加 etag 头部

## Installation

#### Globally via yarn

```bash
yarn global add @masx200/serve-cli
```

#### Running on-demand:

```bash
npx @masx200/serve-cli [options]
```

## Examples

```bash
npx @masx200/serve-cli --help
```

```txt
serve-cli
usage: serve-cli [options]

options:
  --path,-pa       Path to folder [process.cwd()]
  --host,-h       Host to use [0.0.0.0]
  --port,-po       Port to use [4000]
  --ssl,-s        Enable https [false]
  --sslKey     Path to ssl key file [self-signed]
  --sslCert    Path to ssl cert file [self-signed]
  --help,-h       Print this list and exit
```

## TLS/SSL

First, you need to make sure that openssl is installed correctly, and you have `key.pem` and `cert.pem` files.

Then you need to run the server with `--ssl` for enabling SSL and `--sslKey=key.pem --sslCert=cert.pem` for your certificate files.
npm package: @masx200/vite-plugin-virtual-http-resolve
Description: A Vite plugin that resolves remote HTTP/HTTPS modules to virtual modules with caching support
Latest version: 1.0.1

# @masx200/vite-plugin-virtual-http-resolve

A Vite plugin that resolves remote HTTP/HTTPS modules to virtual modules with
caching support.

## Features

- 🚀 Resolves remote HTTP/HTTPS modules as virtual modules
- 📦 Built-in caching (memory and file system)
- 🔧 Customizable fetcher function
- 🎯 Handles relative imports from remote modules
- 🛡️ Variable conflict resolution for node modules
- ⚡ Fast and efficient with pre-processing

## Installation

```bash
npm install @masx200/vite-plugin-virtual-http-resolve
# or
yarn add @masx200/vite-plugin-virtual-http-resolve
# or
pnpm add @masx200/vite-plugin-virtual-http-resolve
```

## Usage

### Basic Usage

```javascript
// vite.config.js
import { defineConfig } from "vite";
import virtualHttpResolve from "@masx200/vite-plugin-virtual-http-resolve";

export default defineConfig({
  plugins: [virtualHttpResolve()],
});
```

### With Custom Options

```javascript
// vite.config.js
import { defineConfig } from "vite";
import virtualHttpResolve, {
  FileCache,
} from "@masx200/vite-plugin-virtual-http-resolve";

export default defineConfig({
  plugins: [
    virtualHttpResolve({
      // Use file cache instead of memory cache
      cache: new FileCache("./custom-cache-folder"),

      // Custom fetcher function
      fetcher: async (url) => {
        const response = await fetch(url);
        if (response.ok) return await response.text();

        throw Error("failed to fetch:" + url);
      },
    }),
  ],
});
```

### In Your Code

```javascript
// Import from remote HTTP/HTTPS URL
import React from "virtual:https://esm.sh/react@18.2.0";
import ReactDOM from "virtual:https://esm.sh/react-dom@18.2.0";

// The plugin will automatically handle relative imports
// from these remote modules
```

## API

### `virtualHttpResolve(options?)`

#### Options

- **`cache`** (`CacheType`) - Cache implementation for storing fetched modules.
  Defaults to in-memory cache.
- **`fetcher`** `(url: string) => Promise<string>` - Custom fetcher function for
  HTTP requests.

### `CacheType` Interface

```typescript
interface CacheType {
  has(key: string): Promise<boolean> | boolean;
  set(key: string, value: string): Promise<any> | any;
  get(key: string): Promise<string | undefined> | string | undefined;
}
```

### `FileCache`

A file system-based cache implementation.

```typescript
const cache = new FileCache(cacheFolder?: string)
```

## How It Works

1. **Virtual Module Resolution**: Converts HTTP/HTTPS URLs to virtual modules
   (`virtual:https://...`)
2. **Relative Import Handling**: Resolves relative imports from remote modules
3. **Caching**: Stores fetched modules to avoid repeated requests
4. **Variable Conflict Resolution**: Automatically resolves variable name
   conflicts in node modules
5. **Pre-processing**: Handles special cases like chunk files and Skypack-style
   redirects

## License

MIT
npm package: @masx200/webdav-cli
Description: A simple zero-configuration command-line webdav server
Author: masx200
Latest version: 3.1.2

# WebDAV CLI

forked from svtslv/webdav-cli

https://github.com/svtslv/webdav-cli

Optimized a problem

https://github.com/OpenMarshal/npm-WebDAV-Server/issues/84

## Description

A simple zero-configuration command-line webdav server

给 "webdav" 服务器加上了 "etag" 头部和条件请求的功能

支持范围请求，跨域访问，支持内容压缩

支持在浏览器中展示文件夹内容了，使用"koa2-serve-index"

如果请求方法是"GET"或者"HEAD"，交给"koa"服务器处理，提供静态文件

使用 "http-auth"进行用户验证。

## Installation

#### Globally via yarn

```bash
yarn global add @masx200/webdav-cli
```

#### Running on-demand:

```bash
npx @masx200/webdav-cli [options]
```

## Examples

```bash
npx @masx200/webdav-cli --help
```

```txt
   usage: webdav-cli [options]

options:
  --path,-pa       Path to folder [process.cwd()]
  --host,-ho       Host to use [0.0.0.0]
  --port,-po       Port to use [1900]
  --digest,-dg     Enable digest authentication [basic]
  --username,-u   Username for basic/digest authentication [random]
  --password,-ps   Password for basic/digest authentication [random]

  --disableAuthentication,-da  The server file becomes read-only without Authentication.[false]
  --ssl,-s        Enable https [false]
  --methodsWithoutAuthentication          methods Without Authentication[undefined]
  --sslKey     Path to ssl key file [self-signed]
  --sslCert    Path to ssl cert file [self-signed]
  --help,-h       Print this list and exit

  --rights,-r     Comma separated values without spaces [all]

        'all', 'canCreate', 'canDelete', 'canMove', 'canRename',
        'canAppend', 'canWrite', 'canRead', 'canSource',
        'canGetMimeType', 'canGetSize', 'canListLocks',
        'canSetLock', 'canRemoveLock', 'canGetAvailableLocks',
        'canGetLock', 'canAddChild', 'canRemoveChild',
        'canGetChildren', 'canSetProperty', 'canGetProperty',
        'canGetProperties', 'canRemoveProperty', 'canGetCreationDate',
        'canGetLastModifiedDate', 'canGetWebName', 'canGetType'
env:
  WEBDAV_CLI_PATH, WEBDAV_CLI_HOST, WEBDAV_CLI_PORT,
  WEBDAV_CLI_USERNAME, WEBDAV_CLI_PASSWORD, WEBDAV_CLI_DIGEST,
  WEBDAV_CLI_SSL, WEBDAV_CLI_SSL_KEY, WEBDAV_CLI_SSL_CERT,
   WEBDAV_CLI_AUTO_INDEX, WEBDAV_CLI_RIGHTS
  WEBDAV_CLI_DISABLE_AUTHENTICATION
```

## TLS/SSL

First, you need to make sure that openssl is installed correctly, and you have `key.pem` and `cert.pem` files. You can generate them using this command:

```shell
openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem
```

Use `0.0.0.0` as value for `Common name` if you want to be able to install the certificate in your OS's root certificate store or browser so that it is trusted.

Then you need to run the server with `--ssl` for enabling SSL and `--sslKey=key.pem --sslCert=cert.pem` for your certificate files.

## License

MIT

# changelog

2022 年 6 月 15 日 10:12:28

添加了可选参数 `methodsWithoutAuthentication`,可以允许某些方法不需要身份验证,例如:

```
'--methodsWithoutAuthentication=GET,HEAD,PROPFIND,OPTIONS'
```
npm package: @masx200/weighted-randomly-select
Description: Randomly select from a list of weighted possible outcomes.
Author: masx200
Latest version: 2.1.1

# Weighted-Randomly-Select

This package lets you easily perform weighted random selection. Provide an array
of objects with `chance` and `result` properties, and a random `result` will be
selected according to the provided `chance` values.

## thanks to author Rifdhan.

https://github.com/Rifdhan/weighted-randomly-select

## add typescript support

https://github.com/masx200/weighted-randomly-select/blob/master/index.d.ts

## `chance` can be provided as `Infinity`

```js
assert.equal(
    9,
    Randomly.select([
        {
            chance: Infinity,
            result: 9,
        },
        {
            chance: 6,
            result: 19,
        },
    ])
);
```

## 使用了二分搜索加快查找速度

# Installation

NPM:

```
npm install --save @masx200/weighted-randomly-select
```

YarnPkg:

```
yarn add @masx200/weighted-randomly-select
```

deno

```ts
import {} from "https://deno.land/x/masx200_weighted_randomly_select/mod.ts";
```

# Examples

```javascript
let Randomly = require("@masx200/weighted-randomly-select");

// Every outcome can be equiprobable
let name = Randomly.select([
    {
        chance: 1,
        result: "John",
    },
    {
        chance: 1,
        result: "Mary",
    },
]);
// name will be either "John" or "Mary"

// Some outcomes can be more probable than others
let coin = Randomly.select([
    {
        chance: 1,
        result: "Heads",
    },
    {
        chance: 1,
        result: "Tails",
    },
    {
        chance: 0.01,
        result: "Side",
    },
]);
// coin will be either "Heads", "Tails", or "Side"

// Chance values can be any positive number, and result values
// can be anything other than null and undefined
let item = Randomly.select([
    {
        chance: 0.8,
        result: { someField: "someValue" },
    },
    {
        chance: 20,
        result: 42,
    },
    {
        chance: 1.5,
        result: [3, 1, 5],
    },
]);
// item will be either { someField: "someValue" }, 42, or [3, 1, 5]
```

# API Reference

## `Randomly.select(options)`

`options`: an array of objects, each of which having a `chance` number value and
`result` value

`chance`: any positive floating point value (zero is permitted but such an entry
will never be selected)

Note: all `chance` values must add up to a value greater than zero (i.e. there
should be something to select). These values _do not_ have to add up to 1 or any
other specific value.

Return value: one of the `result` values in the `options` array.

Throws errors if any input is invalid.

## `Randomly.selectWithoutValidation(options)`

Same as above but does _not_ perform any validation on the provided input. If
you're encountering unexpected issues, try using the above method, which does
the same thing but _with_ input validation.