codesign-mcp-server 0.0.0-stage → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +310 -2
- package/dist/client.d.ts +85 -0
- package/dist/client.js +678 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +15 -0
- package/dist/errors.js +108 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +327 -0
- package/dist/index.js.map +1 -0
- package/dist/spec.d.ts +18 -0
- package/dist/spec.js +274 -0
- package/dist/spec.js.map +1 -0
- package/dist/tools.d.ts +59 -0
- package/dist/tools.js +156 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +173 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/concurrency.d.ts +2 -0
- package/dist/utils/concurrency.js +15 -0
- package/dist/utils/concurrency.js.map +1 -0
- package/dist/utils/filename.d.ts +10 -0
- package/dist/utils/filename.js +32 -0
- package/dist/utils/filename.js.map +1 -0
- package/dist/version.d.ts +7 -0
- package/dist/version.js +8 -0
- package/dist/version.js.map +1 -0
- package/package.json +52 -4
package/README.md
CHANGED
|
@@ -1,3 +1,311 @@
|
|
|
1
|
-
#
|
|
1
|
+
# codesign-mcp-server
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
腾讯 CoDesign 设计稿 MCP 服务。让 AI 直接读取设计稿的图层标注、下载切图、生成还原规格。
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
帮我读取并还原设计稿 https://codesign.qq.com/app/s/<分享ID>
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## 能做什么
|
|
10
|
+
|
|
11
|
+
| 工具 | 作用 |
|
|
12
|
+
|---|---|
|
|
13
|
+
| `design_get` | 读取设计稿:画板列表 + 完整图层树(坐标、尺寸、字体、字号、字距、颜色、圆角、渐变、效果) |
|
|
14
|
+
| `design_download_slices` | 批量下载切图,自动处理 OSS 签名地址 |
|
|
15
|
+
| `design_download_previews` | 下载画板整图,供 AI 视觉理解 |
|
|
16
|
+
| `design_get_spec` | 转成前端可直接用的 CSS 规格(默认 750 → 375 换算) |
|
|
17
|
+
|
|
18
|
+
所有工具的参数都由 zod 校验,传错类型会直接返回明确的参数错误,不会带着脏数据往下跑。
|
|
19
|
+
|
|
20
|
+
## 安装
|
|
21
|
+
|
|
22
|
+
### 方式一:npx(推荐)
|
|
23
|
+
|
|
24
|
+
在项目根目录的 `.mcp.json`:
|
|
25
|
+
|
|
26
|
+
```json
|
|
27
|
+
{
|
|
28
|
+
"mcpServers": {
|
|
29
|
+
"codesign-mcp-server": {
|
|
30
|
+
"command": "npx",
|
|
31
|
+
"args": ["-y", "codesign-mcp-server"],
|
|
32
|
+
"env": {
|
|
33
|
+
"CODESIGN_COOKIE": "你的 Cookie"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 方式二:本地构建
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
git clone https://github.com/geniyangge/codesign-mcp-server.git
|
|
44
|
+
cd codesign-mcp-server
|
|
45
|
+
npm install
|
|
46
|
+
npm run build
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
构建后把 `dist/index.js` 的**绝对路径**填到 `args` 里:
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
{
|
|
53
|
+
"mcpServers": {
|
|
54
|
+
"codesign-mcp-server": {
|
|
55
|
+
"command": "node",
|
|
56
|
+
"args": ["/path/to/codesign-mcp-server/dist/index.js"],
|
|
57
|
+
"env": {
|
|
58
|
+
"CODESIGN_COOKIE": "你的 Cookie"
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
> Windows 下路径写成 `"D:\\\\path\\\\to\\\\codesign-mcp-server\\\\dist\\\\index.js"` 或 `"D:/path/to/codesign-mcp-server/dist/index.js"`。
|
|
66
|
+
|
|
67
|
+
## 获取 Cookie
|
|
68
|
+
|
|
69
|
+
图层标注和切图需要登录态,**必须先配置 Cookie**。
|
|
70
|
+
|
|
71
|
+
1. 浏览器登录 https://codesign.qq.com
|
|
72
|
+
2. 打开目标设计稿的分享页
|
|
73
|
+
3. `F12` → **Network** 面板
|
|
74
|
+
4. 刷新页面,任选一条 `/api/` 开头的请求
|
|
75
|
+
5. 右键 → **Copy** → **Copy as cURL (bash)**
|
|
76
|
+
6. 找到 `-b '...'` 引号里的内容,整段复制
|
|
77
|
+
|
|
78
|
+
或者 `F12` → Console 输入 `document.cookie`,但部分 token 是 httpOnly,用上面 Copy as cURL 的方式更完整。
|
|
79
|
+
|
|
80
|
+
把这段内容填到 `CODESIGN_COOKIE`。`access_token` 通常 30 天有效,过期后重新复制即可。
|
|
81
|
+
|
|
82
|
+
> 不想把 Cookie 写进仓库?用环境变量:
|
|
83
|
+
> ```json
|
|
84
|
+
> "env": { "CODESIGN_COOKIE": "${CODESIGN_COOKIE}" }
|
|
85
|
+
> ```
|
|
86
|
+
> 然后在 shell 配置文件里 `export CODESIGN_COOKIE="..."`
|
|
87
|
+
>
|
|
88
|
+
> 旧版本用的 `CODEDESIGN_COOKIE` 已废弃,请改用 `CODESIGN_COOKIE`。
|
|
89
|
+
|
|
90
|
+
## 环境变量
|
|
91
|
+
|
|
92
|
+
| 变量 | 必填 | 说明 |
|
|
93
|
+
|---|---|---|
|
|
94
|
+
| `CODESIGN_COOKIE` | 读标注/切图必填 | CoDesign 登录 Cookie |
|
|
95
|
+
| `CODESIGN_PASSWORD` | 否 | 默认分享访问密码,工具未传 `password` 时兜底 |
|
|
96
|
+
| `CODESIGN_SCALE` | 否 | 默认切图倍率,默认 `2`;工具传了 `scale` 时以工具参数为准 |
|
|
97
|
+
| `CODESIGN_OUT_DIR` | 否 | 默认输出目录,默认 `./codesign-assets` |
|
|
98
|
+
| `CODESIGN_CONCURRENCY` | 否 | 并发请求数,默认 4,范围 1–16;被限流(429)时调小 |
|
|
99
|
+
| `CODESIGN_TIMEOUT_MS` | 否 | 单次请求超时,默认 30000,范围 1000–120000 |
|
|
100
|
+
|
|
101
|
+
> 不再读取通用的 `COOKIE` 环境变量,避免误用 shell 里无关的 Cookie。
|
|
102
|
+
|
|
103
|
+
## 使用
|
|
104
|
+
|
|
105
|
+
配好后直接在 Claude Code 里说:
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
帮我读取并还原设计稿 https://codesign.qq.com/app/s/<分享ID>
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
AI 会自动按这个顺序工作:
|
|
112
|
+
|
|
113
|
+
1. `design_download_previews` — 先看整体视觉
|
|
114
|
+
2. `design_get` — 拿精确图层标注
|
|
115
|
+
3. `design_download_slices` — 下载切图
|
|
116
|
+
4. `design_get_spec` — 生成 CSS 规格
|
|
117
|
+
5. 写代码
|
|
118
|
+
|
|
119
|
+
也可以指定画板:
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
读取这个设计稿的弹窗画板(ID: <画板ID>)
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
> 分享 ID 和画板 ID 都在设计稿链接里:`/app/s/<分享ID>/<画板ID>`。
|
|
126
|
+
|
|
127
|
+
## 带密码的设计稿
|
|
128
|
+
|
|
129
|
+
分享时勾选了「密码保护」的设计稿,直接读取会返回 403「请输入密码」,此时把密码作为 `password` 参数传入即可:
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
帮我读取并还原设计稿 https://codesign.qq.com/s/<分享ID>/<画板ID>/inspect,密码 ABCD
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
工具会自动:
|
|
136
|
+
|
|
137
|
+
1. `POST /api/sharings/<id>/state-keys` 用密码换一个 `state-key`
|
|
138
|
+
2. 后续分享详情请求带上 `state-key` 头(同一密码会缓存,不用反复换)
|
|
139
|
+
3. 画板详情、图层和切图接口沿用原有 Cookie 鉴权,不需要 `state-key`
|
|
140
|
+
|
|
141
|
+
也可以设一次环境变量,之后都不用传:
|
|
142
|
+
|
|
143
|
+
```json
|
|
144
|
+
"env": { "CODESIGN_PASSWORD": "ABCD" }
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**密码解不开权限**:密码只解锁「分享内容」这一层。如果当前 `CODESIGN_COOKIE` 的账号不在设计稿所属项目里,密码正确仍会返回「您当前暂无权限」。这种情况需要换用有权限的账号,或让设计同学把账号加入项目。
|
|
148
|
+
|
|
149
|
+
## 工具参数
|
|
150
|
+
|
|
151
|
+
### design_get
|
|
152
|
+
|
|
153
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
154
|
+
|---|---|---|---|
|
|
155
|
+
| `url` | string | ✅ | 分享链接 |
|
|
156
|
+
| `password` | string | | 分享访问密码,密码保护的分享必填 |
|
|
157
|
+
| `screenId` | number | | 只解析指定画板 |
|
|
158
|
+
| `includeLayers` | boolean | | 是否返回图层树,默认 true |
|
|
159
|
+
| `maxLayers` | number | | 每个画板最多返回的图层数,默认 800 |
|
|
160
|
+
| `maxDepth` | number | | 最多下钻层数,默认不限 |
|
|
161
|
+
|
|
162
|
+
图层数超过 `maxLayers` 时结果里会出现 `truncated` 和 `warning`,不会静默截断。
|
|
163
|
+
|
|
164
|
+
### design_download_slices
|
|
165
|
+
|
|
166
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
167
|
+
|---|---|---|---|
|
|
168
|
+
| `url` | string | ✅ | 分享链接 |
|
|
169
|
+
| `password` | string | | 分享访问密码,密码保护的分享必填 |
|
|
170
|
+
| `screenId` | number | | 画板 ID |
|
|
171
|
+
| `outDir` | string | | 输出目录 |
|
|
172
|
+
| `scale` | number | | 导出倍率,默认 2 |
|
|
173
|
+
|
|
174
|
+
**倍率优先级**:用户在对话里明确要求 > 环境变量 `CODESIGN_SCALE` > 内置默认 2x。
|
|
175
|
+
|
|
176
|
+
某图层若没有目标倍率的导出,会就近取(优先取不高于目标的最高档),并在返回的 `warning` 里逐条列出,不会静默替换。返回值里的 `scaleUsage` 汇总了实际用到的倍率,`requestedScale` 是本次请求的倍率。
|
|
177
|
+
|
|
178
|
+
```json
|
|
179
|
+
{
|
|
180
|
+
"requestedScale": 2,
|
|
181
|
+
"scaleUsage": { "3": 44, "2.84": 2 },
|
|
182
|
+
"warning": "以下 46 张切图在设计稿里没有 2 倍导出,已就近取其他倍率:..."
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
同名图层自动追加 `_2`、`_3`,不会互相覆盖。返回的 `path` 是相对 `outDir` 的文件名,和 `design_get_spec` 里的 `file` 字段一致。
|
|
187
|
+
|
|
188
|
+
导出格式同时有 `png` 和 `svg` 时都会下载。注意 `imageMogr2` 是腾讯云图片处理参数,只能处理位图,代码对 svg 会自动跳过(否则会返回 400 `InvalidImageFormat`)。
|
|
189
|
+
|
|
190
|
+
### design_download_previews
|
|
191
|
+
|
|
192
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
193
|
+
|---|---|---|---|
|
|
194
|
+
| `url` | string | ✅ | 分享链接 |
|
|
195
|
+
| `password` | string | | 分享访问密码,密码保护的分享必填 |
|
|
196
|
+
| `screenId` | number | | 画板 ID |
|
|
197
|
+
| `outDir` | string | | 输出目录 |
|
|
198
|
+
|
|
199
|
+
只拉画板详情,不会额外请求图层树和切图清单。
|
|
200
|
+
|
|
201
|
+
### design_get_spec
|
|
202
|
+
|
|
203
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
204
|
+
|---|---|---|---|
|
|
205
|
+
| `url` | string | ✅ | 分享链接 |
|
|
206
|
+
| `password` | string | | 分享访问密码,密码保护的分享必填 |
|
|
207
|
+
| `screenId` | number | | 画板 ID |
|
|
208
|
+
| `cssWidth` | number | | 目标 CSS 宽度,默认 375;传 750 输出原始 px |
|
|
209
|
+
| `maxLayers` | number | | 最多输出多少图层,默认 500 |
|
|
210
|
+
| `maxDepth` | number | | 最多下钻层数,默认不限 |
|
|
211
|
+
|
|
212
|
+
输出里的 `nodes` 按图层树嵌套顺序排列,`name` 前的空格表示层级,`objectId` 可与切图清单关联。
|
|
213
|
+
`slices[].style` 会带上该图层自带的 CSS(组图层没有,需要看子图层)。
|
|
214
|
+
|
|
215
|
+
## 技术说明
|
|
216
|
+
|
|
217
|
+
CoDesign 没有开放 API,本项目通过逆向其内部接口实现:
|
|
218
|
+
|
|
219
|
+
| 接口 | 鉴权 |
|
|
220
|
+
|---|---|
|
|
221
|
+
| `/api/sharings/<shareId>` | 无需登录;密码分享需 `state-key` 头 |
|
|
222
|
+
| `/api/sharings/<shareId>/state-keys` | `POST {password}` → `{key, expires}` |
|
|
223
|
+
| `/api/designs/<designId>/screens/<screenId>` | Cookie + `Authorization: Bearer` |
|
|
224
|
+
| `cdn4.codesign.qq.com/meta/...`(图层/切图 JSON) | 需 `Origin: https://codesign.qq.com` |
|
|
225
|
+
| 切图图片 | 同上,位图需带 `?imageMogr2/format/png`,svg 不能带 |
|
|
226
|
+
|
|
227
|
+
几个坑已在代码里处理(均经真实设计稿实测):
|
|
228
|
+
|
|
229
|
+
- 切图清单给的是 OSS 签名直链,直接下会 `AccessDenied` → 自动换 CDN 域名并追加 `imageMogr2` 参数(保留原有签名参数顺序,不重排)
|
|
230
|
+
- CDN 资源只带 Referer 会 403,必须有 Origin
|
|
231
|
+
- 鉴权接口只带 Cookie 会返回「非项目成员」,必须显式带 Bearer token
|
|
232
|
+
- **meta 里的 `layers` 与 `groups` 是两个扁平数组**,真实层级只存在于 `parent_id` 上,代码会重建整棵树(否则拿到的是没有父子关系的散图层,`maxDepth` 也会失效)
|
|
233
|
+
- `rect` 已经是相对画板的绝对坐标,不需要逐层累加
|
|
234
|
+
- 文本字号要取 `impliedFontSize`,`textStyle.size` 是会被缩放的排版原始值(两者可能相差 15% 以上)
|
|
235
|
+
- `textKey` 才是正文内容
|
|
236
|
+
- `fontCaps: "allCaps"` 在线上数据里普遍出现在越南语等普通文本上,**不是真的大写**,因此不输出 `text-transform`
|
|
237
|
+
- 颜色 alpha 单位不固定:普通填充是 0–1,半透明遮罩会返回 `a:100`、`color-hex: "#000000 10000%"`,`css-rgba` 也是非法的 `rgba(0,0,0,100)`。代码会统一归一化
|
|
238
|
+
- CoDesign 自带的 `css` 字段里也有非法 alpha(形如 `rgba(R,G,B,100)`),浏览器会整条丢弃,代码会修正后再用
|
|
239
|
+
- 组图层本身通常没有 `css`,视觉效果要么来自子图层,要么由切图提供;两种情况代码都在 notes 里提示
|
|
240
|
+
- 密码保护的分享:**带 Cookie 访问时返回的是「您当前暂无权限」而不是「请输入密码」**,无法从一次请求判断是否缺密码;代码会用一个不含 Cookie 的探测请求确认后再提示补密码
|
|
241
|
+
- 密码错误返回 `403「密码错误!」`(不是 422);`422` 只用于密码长度等格式校验
|
|
242
|
+
- 接口返回的 JSON 会把中文转义成 `\uXXXX`,错误判断必须先解开 `message` 字段,否则永远匹配不到「请输入密码」
|
|
243
|
+
- `imageMogr2` 只能处理位图,对 svg 会返回 `400 InvalidImageFormat`,代码按导出格式自动跳过
|
|
244
|
+
- `fontStyleName` 既可能是 `"Bold"` 也可能是数字 `700`,两者都要能转成 CSS `font-weight`
|
|
245
|
+
|
|
246
|
+
实现上有几点值得一提:
|
|
247
|
+
|
|
248
|
+
- **按需加载**:`design_download_previews` 不会去拉图层树,`design_get` 不传 `includeLayers` 也不拉
|
|
249
|
+
- **并发**:画板解析与切图下载都走固定并发池(`mapLimit`),不会一个画板一个画板地串行等
|
|
250
|
+
- **超时与重试**:每个请求带超时;`5xx` / `429` 自动退避重试,`4xx` 直接失败不白等
|
|
251
|
+
- **文件名**:统一走 `sanitizeFilename`,处理 Windows 非法字符、保留名(CON/NUL…)和尾部点空格,同名自动加序号
|
|
252
|
+
- **样式优先级**:图层自带的 `css` > 代码从 fills/radius/borders/effects 拼接
|
|
253
|
+
|
|
254
|
+
## 开发
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
npm run dev # tsc --watch
|
|
258
|
+
npm test # 校验版本号 + 编译测试 + node:test 跑单测
|
|
259
|
+
npm run build # 产出 dist/
|
|
260
|
+
npm run version:check # 校验版本号是否一致
|
|
261
|
+
npm run version:sync # 把 src/version.ts 的版本号同步到 package.json
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
测试覆盖纯函数(链接解析、CDN 地址改写、文件名、并发池、规格生成)以及 client 的鉴权头、错误翻译与重试行为。
|
|
265
|
+
|
|
266
|
+
### 发布新版本
|
|
267
|
+
|
|
268
|
+
版本号只维护 **`src/version.ts`** 一处,`package.json` 是它的副本:
|
|
269
|
+
|
|
270
|
+
```bash
|
|
271
|
+
# 1. 改 src/version.ts 里的 VERSION
|
|
272
|
+
# 2. 同步到 package.json
|
|
273
|
+
npm run version:sync
|
|
274
|
+
|
|
275
|
+
# 3. 同步到 package-lock.json
|
|
276
|
+
npm install --package-lock-only
|
|
277
|
+
|
|
278
|
+
# 4. 验证并提交打 tag
|
|
279
|
+
npm run version:check
|
|
280
|
+
git commit -am "chore: release v1.0.1"
|
|
281
|
+
git tag -a 1.0.1 -m "v1.0.1"
|
|
282
|
+
git push && git push origin 1.0.1
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
`npm test` 和 `prepublishOnly` 都会执行 `version:check`,两处版本号不一致时直接失败,避免漏同步。
|
|
286
|
+
|
|
287
|
+
## 常见问题
|
|
288
|
+
|
|
289
|
+
**返回「非项目成员」**
|
|
290
|
+
|
|
291
|
+
账号不在设计稿所属团队。让设计同学把账号加进项目,或者请对方开启分享页的「可查看标注」权限。
|
|
292
|
+
|
|
293
|
+
**切图下载失败**
|
|
294
|
+
|
|
295
|
+
检查分享设置里 `assetsDownloadable` 是否为 true。为 false 时设计稿禁止下载切图,需要设计同学开启。
|
|
296
|
+
|
|
297
|
+
**图层是空的**
|
|
298
|
+
|
|
299
|
+
`includeLayers` 为 false,或者该画板没有上传源文件(只有预览图)。
|
|
300
|
+
|
|
301
|
+
**结果被截断**
|
|
302
|
+
|
|
303
|
+
图层太多时按 `maxLayers`(默认 800)截断,结果里会带 `truncated` 和 `warning`。指定 `screenId` 逐个读,或调大 `maxLayers`。
|
|
304
|
+
|
|
305
|
+
**接口随时可能失效**
|
|
306
|
+
|
|
307
|
+
这是对未公开接口的逆向实现,腾讯改接口或加风控都可能让它失效。遇到异常请先确认网页端是否正常。
|
|
308
|
+
|
|
309
|
+
## License
|
|
310
|
+
|
|
311
|
+
MIT
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { Layer, LayerTree, ScreenDetail, ShareInfo, SliceItem } from "./types.js";
|
|
2
|
+
export interface ClientOptions {
|
|
3
|
+
/** 单次请求超时,毫秒 */
|
|
4
|
+
timeoutMs?: number;
|
|
5
|
+
/** 幂等请求的重试次数(不含首次) */
|
|
6
|
+
retries?: number;
|
|
7
|
+
/** 环境变量里配置的默认访问密码,工具未显式传 password 时作为兜底 */
|
|
8
|
+
defaultPassword?: string;
|
|
9
|
+
}
|
|
10
|
+
/** 从分享链接里解析分享 ID,兼容带不带 hash 前缀的写法 */
|
|
11
|
+
export declare function parseShareId(url: string): number;
|
|
12
|
+
/** 从分享链接里解析当前打开的画板 ID(可选) */
|
|
13
|
+
export declare function parseScreenId(url: string): number | undefined;
|
|
14
|
+
export declare class CoDesignClient {
|
|
15
|
+
private readonly cookie;
|
|
16
|
+
private readonly accessToken?;
|
|
17
|
+
private readonly cookieTeamId?;
|
|
18
|
+
private readonly timeoutMs;
|
|
19
|
+
private readonly retries;
|
|
20
|
+
private readonly defaultPassword?;
|
|
21
|
+
/** 分享密码 → state-key 缓存,密码有效期由服务端决定(响应里带 expires) */
|
|
22
|
+
private readonly stateKeys;
|
|
23
|
+
constructor(cookie?: string, options?: ClientOptions);
|
|
24
|
+
get hasCookie(): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* 用访问密码换 state-key。
|
|
27
|
+
* 带密码的分享,`GET /api/sharings/:id` 会返回 403「请输入密码!」,
|
|
28
|
+
* 必须先 `POST /api/sharings/:id/state-keys` 拿 key,再以 `state-key` 头访问。
|
|
29
|
+
* 注意画板详情接口不需要这个头。
|
|
30
|
+
*/
|
|
31
|
+
exchangePassword(shareId: number, password: string): Promise<string>;
|
|
32
|
+
/** 鉴权接口:Cookie + Bearer(两者缺一不可,只带 Cookie 会返回「非项目成员」) */
|
|
33
|
+
private authHeaders;
|
|
34
|
+
/** CDN 资源:必须带 Origin,否则 403 */
|
|
35
|
+
private cdnHeaders;
|
|
36
|
+
/**
|
|
37
|
+
* 带超时与重试的请求。只对幂等方法重试:CDN 素材全是 GET,
|
|
38
|
+
* 本项目的鉴权接口也都是查询,所以默认全部可重试。
|
|
39
|
+
*/
|
|
40
|
+
private send;
|
|
41
|
+
private request;
|
|
42
|
+
/**
|
|
43
|
+
* 设计稿元数据。公开分享无需登录即可拿到标题、团队、画板列表;
|
|
44
|
+
* 带密码的分享需要传 password,内部会先换 state-key 再请求。
|
|
45
|
+
*/
|
|
46
|
+
getShare(shareId: number, password?: string): Promise<ShareInfo>;
|
|
47
|
+
/** 画板详情:拿 meta_url / slices_url / 预览图地址 */
|
|
48
|
+
getScreen(designId: number, screenId: number): Promise<ScreenDetail>;
|
|
49
|
+
/**
|
|
50
|
+
* 下载并解析图层树 JSON。
|
|
51
|
+
* 注意:CoDesign 的 meta 里 `layers` 与 `groups` 是两个**扁平**数组,
|
|
52
|
+
* 真实层级只体现在 `parent_id` 上,必须自己重建,否则拿到的是一堆没有父子关系的散图层。
|
|
53
|
+
*/
|
|
54
|
+
getMeta(metaUrl: string): Promise<LayerTree>;
|
|
55
|
+
/** 下载并解析切图清单 JSON */
|
|
56
|
+
getSlices(slicesUrl: string): Promise<SliceItem[]>;
|
|
57
|
+
/** 下载任意 CDN 图片到 Buffer */
|
|
58
|
+
downloadImage(url: string): Promise<Buffer>;
|
|
59
|
+
/**
|
|
60
|
+
* 探测某个分享是否设置了访问密码。
|
|
61
|
+
* 不带 Cookie/Bearer 请求分享详情:密码分享会返回 403「请输入密码!」,
|
|
62
|
+
* 普通分享则正常返回 200。仅用于诊断,失败时按「不需要密码」处理。
|
|
63
|
+
*/
|
|
64
|
+
private needsPassword;
|
|
65
|
+
private requireCookie;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 把 OSS 直链换成可下载的 CDN 直链。
|
|
69
|
+
* 注意:`imageMogr2` 是腾讯云图片处理参数,只能处理位图;
|
|
70
|
+
* 对 svg 这类矢量格式会直接报 `InvalidImageFormat` 400,必须跳过。
|
|
71
|
+
*/
|
|
72
|
+
export declare function toCdnUrl(url: string, cdnHost?: string, format?: string): string;
|
|
73
|
+
/**
|
|
74
|
+
* CoDesign 的颜色对象字段是 r/g/b/a,同时带 color-hex / css-rgba 等现成写法。
|
|
75
|
+
*
|
|
76
|
+
* 实测数据里 alpha 的单位**不固定**:普通填充是 0–1(a:1),
|
|
77
|
+
* 但半透明遮罩会返回 a:100 并把 color-hex 写成 `#000000 10000%`
|
|
78
|
+
* —— 它的 css-rgba 也是 `rgba(0,0,0,100)`,是错的。所以 alpha 必须自己归一化。
|
|
79
|
+
*/
|
|
80
|
+
export declare function rgba(c?: Record<string, any>): string | undefined;
|
|
81
|
+
/**
|
|
82
|
+
* 用 parent_id 把扁平的 layers + groups 重建成真正的树。
|
|
83
|
+
* 画板自身的 object_id 是根;找不到父节点的节点挂到根上,避免丢数据。
|
|
84
|
+
*/
|
|
85
|
+
export declare function buildLayerTree(nodes: any[], rootId: unknown): Layer[];
|