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/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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.js","sourceRoot":"","sources":["../src/spec.ts"],"names":[],"mappings":"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"}
@@ -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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"}