codesign-mcp-server 0.0.0-stage → 1.1.0
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 +198 -2
- package/dist/client.d.ts +97 -0
- package/dist/client.js +773 -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 +386 -0
- package/dist/index.js.map +1 -0
- package/dist/spec.d.ts +18 -0
- package/dist/spec.js +293 -0
- package/dist/spec.js.map +1 -0
- package/dist/tools.d.ts +61 -0
- package/dist/tools.js +184 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +191 -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 +53 -4
package/dist/spec.js
ADDED
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { createNamer, sanitizeFilename } from "./utils/filename.js";
|
|
2
|
+
const DESIGN_WIDTH = 750;
|
|
3
|
+
const CSS_WIDTH = 375;
|
|
4
|
+
/** tracking 是 Photoshop 千分之一单位,换算成 CSS letter-spacing */
|
|
5
|
+
function trackingToPx(tracking, size) {
|
|
6
|
+
if (tracking === undefined || tracking === null)
|
|
7
|
+
return undefined;
|
|
8
|
+
return Number(((tracking / 1000) * size).toFixed(2));
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 把设计稿自带的 `width:750px` 这类片段按缩放比重写。
|
|
12
|
+
* 顺带修掉 CoDesign 自己输出的非法 alpha(形如 `rgba(R,G,B,100)`),
|
|
13
|
+
* 那种写法浏览器会整条丢弃。
|
|
14
|
+
*/
|
|
15
|
+
function scaleCssValue(css, scale) {
|
|
16
|
+
return fixCssAlpha(css)
|
|
17
|
+
.replace(/(-?\d*\.?\d+)px/g, (_m, n) => `${(Number(n) * scale).toFixed(2)}px`)
|
|
18
|
+
.trim();
|
|
19
|
+
}
|
|
20
|
+
/** `rgba(r,g,b,100)` → `rgba(r,g,b,1)`;>1 的一律按百分比处理 */
|
|
21
|
+
function fixCssAlpha(css) {
|
|
22
|
+
return css.replace(/rgba\(\s*([\d.]+)[,\s]+([\d.]+)[,\s]+([\d.]+)[,\s/]+([\d.]+)\s*\)/gi, (_m, r, g, b, a) => {
|
|
23
|
+
const n = Number(a);
|
|
24
|
+
const alpha = n > 1 ? Number((n / 100).toFixed(3)) : n;
|
|
25
|
+
return alpha >= 1 ? `rgb(${r},${g},${b})` : `rgba(${r},${g},${b},${alpha})`;
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 设计稿自带的 css 是最可靠的(已经处理了渐变、圆角、透明度等),
|
|
30
|
+
* 有就按缩放比重写后直接用;没有才回退到手拼。
|
|
31
|
+
*/
|
|
32
|
+
function styleFromLayerCss(l, scale) {
|
|
33
|
+
if (!l.css?.length)
|
|
34
|
+
return undefined;
|
|
35
|
+
const parts = l.css.map((c) => scaleCssValue(c, scale)).filter(Boolean);
|
|
36
|
+
if (!parts.length)
|
|
37
|
+
return undefined;
|
|
38
|
+
// 文本图层的 css 不带字体信息,由 styleFor 补
|
|
39
|
+
if (l.type !== "text")
|
|
40
|
+
return parts;
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
function flags(l) {
|
|
44
|
+
const out = [];
|
|
45
|
+
if (l.type === "text")
|
|
46
|
+
out.push("text");
|
|
47
|
+
// 位图图层没有矢量信息,标出来避免调用方以为漏了样式
|
|
48
|
+
if (l.isBitmap)
|
|
49
|
+
out.push(l.slice ? "bitmap:slice" : "bitmap:no-slice");
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
function styleFor(l, scale) {
|
|
53
|
+
const css = [];
|
|
54
|
+
if (l.type === "text" && l.text) {
|
|
55
|
+
const t = l.text;
|
|
56
|
+
const parts = [];
|
|
57
|
+
parts.push(`font-size:${(t.size * scale).toFixed(2)}px`);
|
|
58
|
+
if (t.fontName)
|
|
59
|
+
parts.push(`font-family:"${t.fontName}",serif`);
|
|
60
|
+
if (t.fontStyleName)
|
|
61
|
+
parts.push(`font-weight:${mapFontWeight(t.fontStyleName)}`);
|
|
62
|
+
if (t.color)
|
|
63
|
+
parts.push(`color:${t.color}`);
|
|
64
|
+
const ls = t.letterSpacing ?? trackingToPx(t.tracking, t.size);
|
|
65
|
+
if (ls !== undefined && ls !== 0)
|
|
66
|
+
parts.push(`letter-spacing:${(ls * scale).toFixed(2)}px`);
|
|
67
|
+
const lh = t.leading ?? t.lineHeight;
|
|
68
|
+
if (lh)
|
|
69
|
+
parts.push(`line-height:${(lh * scale).toFixed(2)}px`);
|
|
70
|
+
if (t.textAlign)
|
|
71
|
+
parts.push(`text-align:${t.textAlign}`);
|
|
72
|
+
css.push(parts.join("; "));
|
|
73
|
+
return css;
|
|
74
|
+
}
|
|
75
|
+
const own = styleFromLayerCss(l, scale);
|
|
76
|
+
if (own)
|
|
77
|
+
return own;
|
|
78
|
+
const { width, height } = l.rect;
|
|
79
|
+
if (l.radius?.length && l.radius.some((r) => r > 0)) {
|
|
80
|
+
css.push(`border-radius:${l.radius.map((r) => `${(r * scale).toFixed(2)}px`).join(" ")}`);
|
|
81
|
+
}
|
|
82
|
+
for (const f of l.fills ?? []) {
|
|
83
|
+
if (f.type === "color" && f.color)
|
|
84
|
+
css.push(`background:${f.color}`);
|
|
85
|
+
else if (f.css)
|
|
86
|
+
css.push(`background:${f.css}`);
|
|
87
|
+
}
|
|
88
|
+
for (const b of l.borders ?? []) {
|
|
89
|
+
if (b.color) {
|
|
90
|
+
const w = b.width !== undefined ? `${(b.width * scale).toFixed(2)}px` : "1px";
|
|
91
|
+
css.push(`border:${w} ${b.style ?? "solid"} ${b.color}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (l.opacity !== undefined && l.opacity < 1)
|
|
95
|
+
css.push(`opacity:${l.opacity}`);
|
|
96
|
+
if (l.rotation)
|
|
97
|
+
css.push(`transform:rotate(${l.rotation}deg)`);
|
|
98
|
+
if (l.effects?.length) {
|
|
99
|
+
const shadow = effectsToBoxShadow(l.effects, scale);
|
|
100
|
+
if (shadow)
|
|
101
|
+
css.push(`box-shadow:${shadow}`);
|
|
102
|
+
else
|
|
103
|
+
css.push(`/* effects: ${l.effects.length} item(s) — 需对照图层数据手写 */`);
|
|
104
|
+
}
|
|
105
|
+
if (l.images?.length) {
|
|
106
|
+
css.push(`/* bitmap: ${l.images.length} image(s) — use slice instead */`);
|
|
107
|
+
}
|
|
108
|
+
if (!css.length)
|
|
109
|
+
css.push(`width:${(width * scale).toFixed(2)}px; height:${(height * scale).toFixed(2)}px`);
|
|
110
|
+
return css;
|
|
111
|
+
}
|
|
112
|
+
/** 设计稿字体粗细名称/数值 → CSS 数值 */
|
|
113
|
+
export function mapFontWeight(styleName) {
|
|
114
|
+
if (styleName === undefined || styleName === null || styleName === "")
|
|
115
|
+
return "400";
|
|
116
|
+
// 数字或纯数字字符串直接当字重值用
|
|
117
|
+
if (typeof styleName === "number" && Number.isFinite(styleName))
|
|
118
|
+
return String(styleName);
|
|
119
|
+
const raw = String(styleName).trim();
|
|
120
|
+
if (/^\d+$/.test(raw))
|
|
121
|
+
return raw;
|
|
122
|
+
const s = raw.toLowerCase();
|
|
123
|
+
if (/thin|hairline/.test(s))
|
|
124
|
+
return "100";
|
|
125
|
+
if (/extra.?light|ultra.?light/.test(s))
|
|
126
|
+
return "200";
|
|
127
|
+
if (/light/.test(s))
|
|
128
|
+
return "300";
|
|
129
|
+
if (/medium/.test(s))
|
|
130
|
+
return "500";
|
|
131
|
+
if (/semi.?bold|demi.?bold/.test(s))
|
|
132
|
+
return "600";
|
|
133
|
+
if (/extra.?bold|ultra.?bold/.test(s))
|
|
134
|
+
return "800";
|
|
135
|
+
if (/black|heavy/.test(s))
|
|
136
|
+
return "900";
|
|
137
|
+
if (/bold/.test(s))
|
|
138
|
+
return "700";
|
|
139
|
+
return "400";
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* 把 innerGlow / frameFX / dropShadow 之类的 Photoshop 效果
|
|
143
|
+
* 映射成一条或多条 CSS box-shadow。返回 undefined 表示无法可靠映射。
|
|
144
|
+
*/
|
|
145
|
+
function effectsToBoxShadow(effects, scale) {
|
|
146
|
+
const parts = [];
|
|
147
|
+
for (const fx of effects) {
|
|
148
|
+
const color = colorOf(fx.color, fx.opacity);
|
|
149
|
+
const blur = num(fx.blur) ?? num(fx.size);
|
|
150
|
+
const offsetX = num(fx.distance) ?? 0;
|
|
151
|
+
const offsetY = num(fx.distance) ?? 0;
|
|
152
|
+
if (fx.type === "innerGlow") {
|
|
153
|
+
const inset = "inset";
|
|
154
|
+
const b = (blur ?? 0) * scale;
|
|
155
|
+
parts.push(`${inset} 0 0 ${b.toFixed(2)}px ${color ?? "currentColor"}`);
|
|
156
|
+
}
|
|
157
|
+
else if (fx.type === "frameFX") {
|
|
158
|
+
// 描边效果:用 inset 0 0 0 Npx 实现
|
|
159
|
+
const size = (num(fx.size) ?? 0) * scale;
|
|
160
|
+
parts.push(`inset 0 0 0 ${size.toFixed(2)}px ${color ?? "currentColor"}`);
|
|
161
|
+
}
|
|
162
|
+
else if (fx.type === "dropShadow") {
|
|
163
|
+
const b = (blur ?? 0) * scale;
|
|
164
|
+
parts.push(`${(offsetX * scale).toFixed(2)}px ${(offsetY * scale).toFixed(2)}px ${b.toFixed(2)}px ${color ?? "currentColor"}`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return parts.length ? parts.join(", ") : undefined;
|
|
168
|
+
}
|
|
169
|
+
function colorOf(color, opacity) {
|
|
170
|
+
if (!color)
|
|
171
|
+
return undefined;
|
|
172
|
+
const r = Math.round(color.red ?? color.r ?? 0);
|
|
173
|
+
const g = Math.round(color.green ?? color.g ?? 0);
|
|
174
|
+
const b = Math.round(color.blue ?? color.b ?? 0);
|
|
175
|
+
const alphaRaw = typeof opacity === "object" ? opacity?.value : opacity;
|
|
176
|
+
const alpha = typeof alphaRaw === "number" ? (alphaRaw > 1 ? alphaRaw / 100 : alphaRaw) : 1;
|
|
177
|
+
return alpha >= 1 ? `#${[r, g, b].map((v) => v.toString(16).padStart(2, "0")).join("")}` : `rgba(${r},${g},${b},${alpha.toFixed(2)})`;
|
|
178
|
+
}
|
|
179
|
+
function num(v) {
|
|
180
|
+
const n = typeof v === "object" ? v?.value : v;
|
|
181
|
+
return typeof n === "number" && Number.isFinite(n) ? n : undefined;
|
|
182
|
+
}
|
|
183
|
+
function flatten(layers, depth = 0, out = []) {
|
|
184
|
+
for (const l of layers) {
|
|
185
|
+
out.push({ layer: l, depth });
|
|
186
|
+
if (l.children?.length)
|
|
187
|
+
flatten(l.children, depth + 1, out);
|
|
188
|
+
}
|
|
189
|
+
return out;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* 把图层树 + 切图清单整理成前端可直接使用的规格。
|
|
193
|
+
* 默认按 750 设计稿 → 375 CSS 宽输出(scale = 0.5)。
|
|
194
|
+
*/
|
|
195
|
+
export function buildSpec(screen, tree, slices, options = {}) {
|
|
196
|
+
const opts = typeof options === "number" ? { cssWidth: options } : options;
|
|
197
|
+
const cssWidth = opts.cssWidth ?? CSS_WIDTH;
|
|
198
|
+
const maxLayers = opts.maxLayers ?? 500;
|
|
199
|
+
const maxDepth = opts.maxDepth ?? Infinity;
|
|
200
|
+
const namer = opts.namer ?? createNamer();
|
|
201
|
+
const scale = cssWidth / (tree.width || DESIGN_WIDTH);
|
|
202
|
+
const flat = flatten(tree.layers);
|
|
203
|
+
const visible = flat.filter(({ layer }) => layer.visible);
|
|
204
|
+
const withinDepth = visible.filter(({ depth }) => depth <= maxDepth);
|
|
205
|
+
const kept = withinDepth.slice(0, maxLayers);
|
|
206
|
+
const truncated = withinDepth.length > kept.length
|
|
207
|
+
? { total: withinDepth.length, returned: kept.length }
|
|
208
|
+
: undefined;
|
|
209
|
+
const nodes = kept.map(({ layer, depth }) => ({
|
|
210
|
+
name: `${" ".repeat(depth)}${layer.name || layer.type}`,
|
|
211
|
+
type: layer.type,
|
|
212
|
+
objectId: layer.objectId,
|
|
213
|
+
box: {
|
|
214
|
+
left: Number((layer.rect.x * scale).toFixed(2)),
|
|
215
|
+
top: Number((layer.rect.y * scale).toFixed(2)),
|
|
216
|
+
width: Number((layer.rect.width * scale).toFixed(2)),
|
|
217
|
+
height: Number((layer.rect.height * scale).toFixed(2)),
|
|
218
|
+
},
|
|
219
|
+
style: [...flags(layer), ...styleFor(layer, scale)],
|
|
220
|
+
text: layer.text?.content,
|
|
221
|
+
}));
|
|
222
|
+
// 切图按 objectId 关联图层,能带上图层自身的盒子和样式(组图层没有 css)
|
|
223
|
+
const byObjectId = new Map(flat.map(({ layer }) => [layer.objectId, layer]));
|
|
224
|
+
const sliceSpec = slices.flatMap((s) => s.exports.map((ex) => {
|
|
225
|
+
// 用与下载一致的命名器分配文件名,避免 design_download_slices 落盘名字对不上
|
|
226
|
+
const layer = byObjectId.get(String(s.id)) ?? byObjectId.get(String(ex.objectId));
|
|
227
|
+
return {
|
|
228
|
+
name: s.name,
|
|
229
|
+
objectId: s.id,
|
|
230
|
+
left: Number((s.rect.x * scale).toFixed(2)),
|
|
231
|
+
top: Number((s.rect.y * scale).toFixed(2)),
|
|
232
|
+
width: Number((s.rect.width * scale).toFixed(2)),
|
|
233
|
+
height: Number((s.rect.height * scale).toFixed(2)),
|
|
234
|
+
scale: ex.scale,
|
|
235
|
+
file: namer(sanitizeFilename(s.name, "slice"), ex.format),
|
|
236
|
+
...(layer?.css?.length ? { style: layer.css.map((c) => scaleCssValue(c, scale)) } : {}),
|
|
237
|
+
};
|
|
238
|
+
}));
|
|
239
|
+
const maxDepthReached = flat.reduce((m, x) => Math.max(m, x.depth), 0);
|
|
240
|
+
const notes = [
|
|
241
|
+
`设计稿尺寸 ${tree.width}×${tree.height},按 ${cssWidth} 宽输出,缩放比 ${scale}`,
|
|
242
|
+
"box 与 style 中所有数值均已按缩放比换算,可直接写进 CSS",
|
|
243
|
+
"图层坐标为相对画板左上角的绝对定位值",
|
|
244
|
+
`图层共 ${flat.length} 个,最大嵌套深度 ${maxDepthReached}`,
|
|
245
|
+
];
|
|
246
|
+
if (truncated) {
|
|
247
|
+
notes.push(`图层过多,仅输出前 ${truncated.returned} 个(共 ${truncated.total} 个)。` +
|
|
248
|
+
"可传 maxLayers/maxDepth 调整,或指定 screenId 缩小范围");
|
|
249
|
+
}
|
|
250
|
+
const hasBitmapText = nodes.some((n) => n.type === "text" && !n.text);
|
|
251
|
+
if (hasBitmapText) {
|
|
252
|
+
notes.push("部分文本图层缺少文字内容,可能需要 OCR 或人工确认");
|
|
253
|
+
}
|
|
254
|
+
if (sliceSpec.length) {
|
|
255
|
+
notes.push(`共 ${sliceSpec.length} 个切图,可用 design_download_slices 下载`);
|
|
256
|
+
}
|
|
257
|
+
const fonts = new Set(flat.filter(({ layer }) => layer.text?.fontName).map(({ layer }) => layer.text.fontName));
|
|
258
|
+
if (fonts.size) {
|
|
259
|
+
notes.push(`使用的字体:${[...fonts].join(", ")},注意设备端可能缺失需要 web font`);
|
|
260
|
+
}
|
|
261
|
+
const slicedIds = new Set(slices.map((s) => String(s.id)));
|
|
262
|
+
const groupsWithoutCss = flat.filter(({ layer }) => layer.type === "group" && !layer.css?.length && !slicedIds.has(layer.objectId));
|
|
263
|
+
if (groupsWithoutCss.length) {
|
|
264
|
+
notes.push(`${groupsWithoutCss.length} 个组图层既没有 css 也没有切图,其视觉效果来自子图层或未导出的合成,需要人工确认`);
|
|
265
|
+
}
|
|
266
|
+
// 位图图层:设计稿只给盒子尺寸,没有可还原的样式,只能靠切图
|
|
267
|
+
const bitmaps = flat.filter(({ layer }) => layer.isBitmap);
|
|
268
|
+
const bitmapsWithSlice = bitmaps.filter(({ layer }) => layer.slice);
|
|
269
|
+
const bitmapsWithoutSlice = bitmaps.filter(({ layer }) => !layer.slice);
|
|
270
|
+
if (bitmapsWithSlice.length) {
|
|
271
|
+
notes.push(`${bitmapsWithSlice.length} 个位图图层有切图,请用 design_download_slices 下载后以 <img>/background-image 还原,不要按盒子尺寸重画`);
|
|
272
|
+
}
|
|
273
|
+
if (bitmapsWithoutSlice.length) {
|
|
274
|
+
notes.push(`${bitmapsWithoutSlice.length} 个位图图层既没有矢量信息也没有切图,细节无法还原(` +
|
|
275
|
+
bitmapsWithoutSlice
|
|
276
|
+
.slice(0, 5)
|
|
277
|
+
.map(({ layer }) => `${layer.name || layer.type} ${layer.rect.width}×${layer.rect.height}`)
|
|
278
|
+
.join("、") +
|
|
279
|
+
`${bitmapsWithoutSlice.length > 5 ? " 等" : ""})。` +
|
|
280
|
+
"需要设计同学在 CoDesign 里把它们标记为切图导出");
|
|
281
|
+
}
|
|
282
|
+
return {
|
|
283
|
+
screen: screen.name,
|
|
284
|
+
size: { width: tree.width, height: tree.height },
|
|
285
|
+
cssWidth,
|
|
286
|
+
scale,
|
|
287
|
+
nodes,
|
|
288
|
+
slices: sliceSpec,
|
|
289
|
+
notes,
|
|
290
|
+
...(truncated ? { truncated } : {}),
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=spec.js.map
|
package/dist/spec.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../src/spec.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { CoDesignClient } from "./client.js";
|
|
2
|
+
import type { DownloadResult, Layer, LayerTree, ScreenDetail, ShareInfo, SliceExport, SliceItem } from "./types.js";
|
|
3
|
+
import { createNamer } from "./utils/filename.js";
|
|
4
|
+
/** 需要拉取的画板数据:按工具用途惰性加载,避免额外请求 */
|
|
5
|
+
export interface ScreenData {
|
|
6
|
+
/** 画板详情(元数据 / 预览图地址) */
|
|
7
|
+
detail?: boolean;
|
|
8
|
+
/** 图层树 */
|
|
9
|
+
meta?: boolean;
|
|
10
|
+
/** 切图清单 */
|
|
11
|
+
slices?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface ResolvedScreen {
|
|
14
|
+
designId: number;
|
|
15
|
+
detail: ScreenDetail;
|
|
16
|
+
tree?: LayerTree;
|
|
17
|
+
slices?: SliceItem[];
|
|
18
|
+
}
|
|
19
|
+
export interface ResolveOptions extends ScreenData {
|
|
20
|
+
/** 并发度,默认 4 */
|
|
21
|
+
concurrency?: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 决定要处理哪些画板:显式指定 > 链接里的 > 全部。
|
|
25
|
+
* 只按需拉取 meta / slices,且画板之间并发处理。
|
|
26
|
+
* 密码分享的解锁在 getShare 阶段完成,画板详情接口本身不需要 state-key。
|
|
27
|
+
*/
|
|
28
|
+
export declare function resolveScreens(client: CoDesignClient, share: ShareInfo, screenId?: number, options?: ResolveOptions): Promise<ResolvedScreen[]>;
|
|
29
|
+
/** 默认导出倍率,可用环境变量 CODESIGN_SCALE 覆盖 */
|
|
30
|
+
export declare const DEFAULT_SCALE: number;
|
|
31
|
+
/** 每张切图最终选中的导出项,附带是否发生过倍率降级 */
|
|
32
|
+
export interface PickedExport {
|
|
33
|
+
export: SliceExport;
|
|
34
|
+
/** 该图层没有请求的倍率,实际用了别的倍率 */
|
|
35
|
+
substituted: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 每张切图只取一个倍率,避免同一图层下载多份。
|
|
39
|
+
*
|
|
40
|
+
* 倍率优先级:
|
|
41
|
+
* 1. 调用方显式指定(用户在会话里说「要 3 倍图」)—— 优先满足
|
|
42
|
+
* 2. 环境变量 CODESIGN_SCALE
|
|
43
|
+
* 3. 内置默认 2x
|
|
44
|
+
*
|
|
45
|
+
* 若该图层没有正好这个倍率:就近取**不超过**目标的最高档,再退而取最低档,
|
|
46
|
+
* 并把 `substituted` 标出来,由上层如实告知,不静默替换。
|
|
47
|
+
*/
|
|
48
|
+
export declare function pickExports(item: SliceItem, scale?: number): PickedExport[];
|
|
49
|
+
export interface DownloadOptions {
|
|
50
|
+
scale?: number;
|
|
51
|
+
concurrency?: number;
|
|
52
|
+
/** 同一目录内共享命名器,跨画板/跨批次去重 */
|
|
53
|
+
namer?: ReturnType<typeof createNamer>;
|
|
54
|
+
}
|
|
55
|
+
/** 把切图清单挂到图层树上,按 object_id 关联 */
|
|
56
|
+
export declare function attachSlices(layers: Layer[], slices: SliceItem[]): Layer[];
|
|
57
|
+
export declare function downloadSlices(client: CoDesignClient, slices: SliceItem[], outDir: string, options?: DownloadOptions): Promise<DownloadResult[]>;
|
|
58
|
+
export declare function downloadPreviews(client: CoDesignClient, targets: ResolvedScreen[], outDir: string, options?: {
|
|
59
|
+
concurrency?: number;
|
|
60
|
+
namer?: ReturnType<typeof createNamer>;
|
|
61
|
+
}): Promise<DownloadResult[]>;
|
package/dist/tools.js
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { CoDesignError } from "./errors.js";
|
|
4
|
+
import { mapLimit } from "./utils/concurrency.js";
|
|
5
|
+
import { createNamer, sanitizeFilename } from "./utils/filename.js";
|
|
6
|
+
/**
|
|
7
|
+
* 决定要处理哪些画板:显式指定 > 链接里的 > 全部。
|
|
8
|
+
* 只按需拉取 meta / slices,且画板之间并发处理。
|
|
9
|
+
* 密码分享的解锁在 getShare 阶段完成,画板详情接口本身不需要 state-key。
|
|
10
|
+
*/
|
|
11
|
+
export async function resolveScreens(client, share, screenId, options = {}) {
|
|
12
|
+
const { detail = true, meta = false, slices = false, concurrency = 4 } = options;
|
|
13
|
+
const all = share.designs.flatMap((d) => d.screens.map((s) => ({ designId: d.id, ...s })));
|
|
14
|
+
if (!all.length)
|
|
15
|
+
throw new CoDesignError("设计稿里没有找到任何画板");
|
|
16
|
+
const targets = screenId ? all.filter((s) => s.id === screenId) : all;
|
|
17
|
+
if (!targets.length) {
|
|
18
|
+
throw new CoDesignError(`画板 ${screenId} 不存在`, undefined, "可用画板:\n" + all.map((s) => ` ${s.id} ${s.name}`).join("\n"));
|
|
19
|
+
}
|
|
20
|
+
return mapLimit(targets, concurrency, async (t) => {
|
|
21
|
+
// 不拿 detail 时就够不着 meta/slices,直接返回最基本信息
|
|
22
|
+
if (!detail) {
|
|
23
|
+
return {
|
|
24
|
+
designId: t.designId,
|
|
25
|
+
detail: {
|
|
26
|
+
id: t.id,
|
|
27
|
+
name: t.name,
|
|
28
|
+
width: 0,
|
|
29
|
+
height: 0,
|
|
30
|
+
designId: t.designId,
|
|
31
|
+
source: "",
|
|
32
|
+
slicesCount: 0,
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
const detailInfo = await client.getScreen(t.designId, t.id);
|
|
37
|
+
const [tree, sliceList] = await Promise.all([
|
|
38
|
+
meta && detailInfo.metaUrl ? client.getMeta(detailInfo.metaUrl) : undefined,
|
|
39
|
+
slices && detailInfo.slicesUrl ? client.getSlices(detailInfo.slicesUrl) : undefined,
|
|
40
|
+
]);
|
|
41
|
+
return { designId: t.designId, detail: detailInfo, tree, slices: sliceList };
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/** 默认导出倍率,可用环境变量 CODESIGN_SCALE 覆盖 */
|
|
45
|
+
export const DEFAULT_SCALE = (() => {
|
|
46
|
+
const n = Number(process.env.CODESIGN_SCALE);
|
|
47
|
+
return Number.isFinite(n) && n > 0 ? n : 2;
|
|
48
|
+
})();
|
|
49
|
+
/**
|
|
50
|
+
* 每张切图只取一个倍率,避免同一图层下载多份。
|
|
51
|
+
*
|
|
52
|
+
* 倍率优先级:
|
|
53
|
+
* 1. 调用方显式指定(用户在会话里说「要 3 倍图」)—— 优先满足
|
|
54
|
+
* 2. 环境变量 CODESIGN_SCALE
|
|
55
|
+
* 3. 内置默认 2x
|
|
56
|
+
*
|
|
57
|
+
* 若该图层没有正好这个倍率:就近取**不超过**目标的最高档,再退而取最低档,
|
|
58
|
+
* 并把 `substituted` 标出来,由上层如实告知,不静默替换。
|
|
59
|
+
*/
|
|
60
|
+
export function pickExports(item, scale) {
|
|
61
|
+
if (!item.exports.length)
|
|
62
|
+
return [];
|
|
63
|
+
const target = scale ?? DEFAULT_SCALE;
|
|
64
|
+
const exactMatch = (s) => item.exports.filter((e) => e.scale === s);
|
|
65
|
+
const exact = exactMatch(target);
|
|
66
|
+
if (exact.length)
|
|
67
|
+
return exact.map((e) => ({ export: e, substituted: false }));
|
|
68
|
+
const sorted = [...new Set(item.exports.map((e) => e.scale))].sort((a, b) => a - b);
|
|
69
|
+
// 优先取不超过目标的最高档(避免下载到比预期更大的文件)
|
|
70
|
+
const lower = sorted.filter((s) => s < target);
|
|
71
|
+
const fallback = lower.length > 0
|
|
72
|
+
? lower[lower.length - 1]
|
|
73
|
+
: // 只有更高档时向上取最小的一档
|
|
74
|
+
sorted[0];
|
|
75
|
+
return exactMatch(fallback).map((e) => ({ export: e, substituted: true }));
|
|
76
|
+
}
|
|
77
|
+
/** 把切图清单挂到图层树上,按 object_id 关联 */
|
|
78
|
+
export function attachSlices(layers, slices) {
|
|
79
|
+
if (!slices.length)
|
|
80
|
+
return layers;
|
|
81
|
+
const byId = new Map();
|
|
82
|
+
for (const s of slices)
|
|
83
|
+
byId.set(String(s.id), s);
|
|
84
|
+
const link = (l) => {
|
|
85
|
+
const slice = byId.get(l.objectId);
|
|
86
|
+
if (slice && slice.exports.length) {
|
|
87
|
+
const scales = [...new Set(slice.exports.map((e) => e.scale))].sort((a, b) => a - b);
|
|
88
|
+
const formats = [...new Set(slice.exports.map((e) => e.format))];
|
|
89
|
+
// 取最高倍率那一档的实际导出尺寸
|
|
90
|
+
const top = slice.exports.reduce((a, b) => (b.scale > a.scale ? b : a));
|
|
91
|
+
l.slice = {
|
|
92
|
+
objectId: l.objectId,
|
|
93
|
+
scales,
|
|
94
|
+
formats,
|
|
95
|
+
exportWidth: top.width,
|
|
96
|
+
exportHeight: top.height,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
if (l.children?.length)
|
|
100
|
+
l.children = l.children.map(link);
|
|
101
|
+
return l;
|
|
102
|
+
};
|
|
103
|
+
return layers.map(link);
|
|
104
|
+
}
|
|
105
|
+
export async function downloadSlices(client, slices, outDir, options = {}) {
|
|
106
|
+
await mkdir(outDir, { recursive: true });
|
|
107
|
+
const namer = options.namer ?? createNamer();
|
|
108
|
+
const tasks = slices.flatMap((item) => pickExports(item, options.scale).map((p) => ({ item, ex: p.export, substituted: p.substituted })));
|
|
109
|
+
return mapLimit(tasks, options.concurrency ?? 6, async ({ item, ex, substituted }) => {
|
|
110
|
+
// 文件名在下载前一次性分配,保证与 design_get_spec 里给出的名字一致且不互相覆盖
|
|
111
|
+
const file = namer(sanitizeFilename(item.name, "slice"), ex.format);
|
|
112
|
+
const path = join(outDir, file);
|
|
113
|
+
try {
|
|
114
|
+
const buf = await client.downloadImage(ex.downloadUrl);
|
|
115
|
+
await writeFile(path, buf);
|
|
116
|
+
return {
|
|
117
|
+
name: item.name,
|
|
118
|
+
path: file,
|
|
119
|
+
// 实际落盘的倍率,可能与请求的倍率不同(该图层没导出这个倍率时)
|
|
120
|
+
scale: ex.scale,
|
|
121
|
+
substituted: substituted || undefined,
|
|
122
|
+
width: ex.width,
|
|
123
|
+
height: ex.height,
|
|
124
|
+
bytes: buf.length,
|
|
125
|
+
ok: true,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
catch (e) {
|
|
129
|
+
return {
|
|
130
|
+
name: item.name,
|
|
131
|
+
path: file,
|
|
132
|
+
scale: ex.scale,
|
|
133
|
+
substituted: substituted || undefined,
|
|
134
|
+
width: ex.width,
|
|
135
|
+
height: ex.height,
|
|
136
|
+
bytes: 0,
|
|
137
|
+
ok: false,
|
|
138
|
+
error: e instanceof Error ? e.message : String(e),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
export async function downloadPreviews(client, targets, outDir, options = {}) {
|
|
144
|
+
await mkdir(outDir, { recursive: true });
|
|
145
|
+
const namer = options.namer ?? createNamer();
|
|
146
|
+
return mapLimit(targets, options.concurrency ?? 6, async (t) => {
|
|
147
|
+
const file = namer(`${sanitizeFilename(t.detail.name, "screen")}_preview`, "png");
|
|
148
|
+
if (!t.detail.previewUrl) {
|
|
149
|
+
return {
|
|
150
|
+
name: t.detail.name,
|
|
151
|
+
path: file,
|
|
152
|
+
width: t.detail.width,
|
|
153
|
+
height: t.detail.height,
|
|
154
|
+
bytes: 0,
|
|
155
|
+
ok: false,
|
|
156
|
+
error: "该画板没有预览图",
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
const buf = await client.downloadImage(t.detail.previewUrl);
|
|
161
|
+
await writeFile(join(outDir, file), buf);
|
|
162
|
+
return {
|
|
163
|
+
name: t.detail.name,
|
|
164
|
+
path: file,
|
|
165
|
+
width: t.detail.width,
|
|
166
|
+
height: t.detail.height,
|
|
167
|
+
bytes: buf.length,
|
|
168
|
+
ok: true,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
catch (e) {
|
|
172
|
+
return {
|
|
173
|
+
name: t.detail.name,
|
|
174
|
+
path: file,
|
|
175
|
+
width: t.detail.width,
|
|
176
|
+
height: t.detail.height,
|
|
177
|
+
bytes: 0,
|
|
178
|
+
ok: false,
|
|
179
|
+
error: e instanceof Error ? e.message : String(e),
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|