# turbowarp-ts-plugin
**Repository Path**: zmh-program/turbowarp-ts-plugin
## Basic Information
- **Project Name**: turbowarp-ts-plugin
- **Description**: 📦 TurboWarp 开发环境扩展插件 📦 TurboWarp development-env extension plugin
- **Primary Language**: TypeScript
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2023-04-06
- **Last Updated**: 2023-04-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# ⚡ turbowarp-ts-plugin
#### 📦 Turbowarp dev extension plugin
#### 📦 Turbowarp 开发环境扩展插件
## 简介
turbowarp-ts-plugin是一个高效开发部署turbowarp扩展的插件, 提供:
- ✨ **更好的接口风格**
- 🔨 **更好的开发环境**
- 📦 **自动补全**
- 🌀 **webpack 极致压缩大小**
- 🎃 **注册异常检测**
- 🎉 **Typescript 支持**
## 开发
1. 初始化安装依赖 (**yarn** **pnpm**同理, 推荐**pnpm**)
```commandline
npm install
```
2. 入口编写扩展程序 **/src/index.ts** (**javascript**同理)
3. 打包生成
```commandline
webpack
```
webpack打包生成的js文件位于**dist/extension.js**
## 接口
**TurboWarp 扩展接口规范** 更多前往[40code扩展开发文档](https://40code.com/#page=post&id=198)
1. `id`是表示此扩展使用的唯一id的字符串应该只包含字符a-z和0-9 **(同一个扩展应该始终使用相同的ID,因为更改它会破坏现有项目)**
2. `name`是一个字符串,告诉Scratch在侧栏中显示什么名称
3. `color1`是一个hex格式的颜色,将设置为扩展的方块颜色
4. `blocks`是定义扩展包含哪些积木的对象列表
- `opcode`是积木的内部名称,也对应于积木运行时默认将调用的方法*_(可选`func`覆盖调用的方法名, 已弃用)_
- **opcode不应该被更改**
- `blockType` 定义积木的类型
- `Scratch.BlockType.REPORTER` 圆形的带返回值的积木
- `Scratch.BlockType.BOOLEAN` 六边形的返回布尔值的积木
- `Scratch.BlockType.COMMAND` 一个键积木
- `bind` 接受一个**function**, 允许异步执行返回Promise
- `text` 是一个字符串,用于定义积木在编辑器中的名称 格式为 **[参数:类型]**
- `参数` 定义积木接受的参数的对象, 可能将在`default`和`menu`字段中引用
- `类型`定义要创建的输入形状 *(不区分大小写)*
- `STRING` 字符串类型
- `NUMBER` 用于数字输入
- `BOOLEAN` 用于布尔输入 **(默认值将被忽略)**
- `ANGLE` 用于角度
- `COLOR` 颜色类型(hex格式, *如#fff*)
- `MATRIX` 5x5矩阵(以11101010101…字符串格式传递)
- `NOTE` 用于音乐
- `default` 是参数的初始值, 接受一个字典, 键对应`参数`, 值对应参数的`默认值`
- `menu` 如果有参数需选择多个给定的值, 则可加入至此参数, 接受一个字典, 键对应`参数`, 值对应多个给定的值的列表类型, 将生成下拉菜单
- `disableMonitor` 是否积木强制删除复选框来创建监视器, 适用类型为**REPORTER** *(带返回值的积木)*, 如果为真, 则删除变量左处的复选框
5. `docsURI`对应文档链接
没太看懂? 下面展示一个示例
```typescript
new Extension({
id: "ExampleExtension",
name: "example",
color1: "#0800ff",
blocks: [
{
opcode: 'output', /** @ts-ignore */
blockType: Scratch.BlockType.COMMAND,
text: '命令 [block:string] [type:string]',
default: { block : "参数2", type: "类型" },
menu: { block : [ "参数1", "参数2" ] },
bind: function({ block, type }) {
return `内容 ${block} 类型 ${type}`;
},
}, {
opcode: 'list', /** @ts-ignore */
blockType: Scratch.BlockType.REPORTER,
text: '获取一个空列表',
bind: () => [],
disableMonitor: true,
},
]
}).register();
```
上文创建并注册了一个扩展**ExampleExtension**, 并在Scratch中显示为**example**, 方块颜色#0800ff, 并创建了两个方块:
第一个方块*output*的类型为**键积木**, 共有两个参数
1. `block`参数是一个下拉菜单, **字符串**类型, 默认值为`"参数2"`, 可选值为 *参数1*和*参数2*
2. `type`参数是一个输入框, **字符串**类型, 默认值为`"类型"`
绑定一个方法返回`内容 {{block}} 类型 {{type}}`
通过设置`disableMonitor`为真来强制删除复选框
第二个方块*list*的类型为**带返回值的积木**, 方法返回一个空列表

## 为什么要写此插件
举一个非常简单的例子
> 原生 turbowarp
```typescript
class DatabaseExtension {
public getInfo() {
return {
id: 'FetchExtension',
name: 'fetch',
color1: '#00c4ff',
blocks: [
{
opcode: 'fetchReq',
// @ts-ignore
blockType: Scratch.BlockType.REPORTER,
text: 'fetch [uri] 方法[method]',
arguments: {
uri: {
// @ts-ignore
type: Scratch.ArgumentType.STRING,
defaultValue: 'https://example.com/',
},
method: {
// @ts-ignore
type: Scratch.ArgumentType.STRING,
defaultValue: 'GET',
},
}
},
],
menus: {
method: [
"GET",
"POST",
"PUT",
"DELETE",
],
},
};
}
fetchReq({ uri, method }): Promise {
return fetch(uri, {
method: method,
});
}
}
// @ts-ignore
Scratch.extensions.register(new DatabaseExtension());
```
> turbowarp-ts-plugin
```typescript
import Extension from "./plugin";
new Extension({
id: 'FetchExtension',
name: 'fetch',
color1: '#00c4ff',
blocks: [
{
opcode: 'fetch',
blockType: Scratch.BlockType.REPORTER,
text: 'fetch [uri:string] 方法[method:string]',
default: { uri: "https://example.com/" , method: "GET" },
menu: { method: ["GET", "POST", "PUT", "DELETE" ] },
bind: ({ uri, method }): Promise => fetch(uri, { method, }),
},
]
}).register();
```
实际上, 出于文档大小考虑, 这里只节选了一个方块的扩展示例, 那如果是做一个[云数据库](https://gitee.com/LinwinSoft/open-data-api/blob/master/40code/extension.ts)扩展呢? 更大的代码量, 在接口和方法上反复穿行...
所以结合了这一现状, 此插件借鉴Django路由的传参方式设计了更好的接口风格, 此插件的接口代码量仅占约原生的**30~45%**