@sakitam-gis/sprite-cli 1.0.0 → 1.0.1

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.
@@ -0,0 +1,303 @@
1
+ /**
2
+ * 图片缓冲区(支持 SVG 和 PNG)
3
+ */
4
+ interface ImageBuffer {
5
+ svg?: Buffer;
6
+ png?: Buffer;
7
+ id: string;
8
+ type?: 'svg' | 'png';
9
+ width?: number;
10
+ height?: number;
11
+ }
12
+ /**
13
+ * 生成配置选项
14
+ */
15
+ interface LayoutOptions {
16
+ imgs: ImageBuffer[];
17
+ pixelRatio: number;
18
+ format: boolean;
19
+ extractMetadata?: boolean;
20
+ }
21
+ /**
22
+ * 生成配置选项(兼容旧名称)
23
+ */
24
+ type GenerateOptions = LayoutOptions;
25
+ /**
26
+ * Mapbox 样式元数据
27
+ * 支持9-patch拉伸和文本占位符
28
+ *
29
+ * @see https://docs.mapbox.com/mapbox-gl-js/style-spec/sprite/#stretch-metadata
30
+ */
31
+ interface SpriteMetadata {
32
+ /** 内容区域边界 [left, top, right, bottom] */
33
+ content?: [number, number, number, number];
34
+ /** 文本占位符区域 [left, top, right, bottom] */
35
+ placeholder?: [number, number, number, number];
36
+ /** 水平拉伸区域数组 [[start, end], ...] */
37
+ stretchX?: Array<[number, number]>;
38
+ /** 垂直拉伸区域数组 [[start, end], ...] */
39
+ stretchY?: Array<[number, number]>;
40
+ }
41
+ /**
42
+ * 雪碧图布局项
43
+ */
44
+ interface LayoutItem {
45
+ width: number;
46
+ height: number;
47
+ x: number;
48
+ y: number;
49
+ pixelRatio: number;
50
+ content?: [number, number, number, number];
51
+ placeholder?: [number, number, number, number];
52
+ stretchX?: Array<[number, number]>;
53
+ stretchY?: Array<[number, number]>;
54
+ data?: any;
55
+ svg?: Buffer;
56
+ png?: Buffer;
57
+ }
58
+ /**
59
+ * 雪碧图布局对象
60
+ */
61
+ type Layout = Record<string, LayoutItem>;
62
+
63
+ /**
64
+ * 雪碧图生成选项
65
+ */
66
+ interface SpriteOptions {
67
+ /** 输出文件路径(不包含扩展名) */
68
+ output: string;
69
+ /** 输入目录路径 */
70
+ input: string;
71
+ /** 像素比率 (默认: 1) */
72
+ ratio?: number;
73
+ /** 是否使用 unique 模式 (默认: false) */
74
+ unique?: boolean;
75
+ /** 是否格式化 JSON 输出 (默认: true) */
76
+ format?: boolean;
77
+ }
78
+ /**
79
+ * 雪碧图生成结果
80
+ */
81
+ interface SpriteResult {
82
+ /** JSON 文件路径 */
83
+ jsonPath: string;
84
+ /** PNG 文件路径 */
85
+ pngPath: string;
86
+ /** 布局对象 */
87
+ layout: Layout;
88
+ /** 生成的图片数量 */
89
+ imageCount: number;
90
+ }
91
+ /**
92
+ * 生成雪碧图
93
+ *
94
+ * @param options 生成选项
95
+ * @returns Promise<SpriteResult> 生成结果
96
+ *
97
+ * @example
98
+ * ```typescript
99
+ * import { generateSprite } from '@sakitam-gis/sprite-cli';
100
+ *
101
+ * // 生成 1x 雪碧图
102
+ * const result = await generateSprite({
103
+ * output: 'output/sprite',
104
+ * input: 'icons/',
105
+ * });
106
+ *
107
+ * // 生成 2x 雪碧图
108
+ * const result2x = await generateSprite({
109
+ * output: 'output/sprite@2x',
110
+ * input: 'icons/',
111
+ * ratio: 2,
112
+ * });
113
+ *
114
+ * // 使用 unique 模式
115
+ * const resultUnique = await generateSprite({
116
+ * output: 'output/sprite-unique',
117
+ * input: 'icons/',
118
+ * unique: true,
119
+ * });
120
+ * ```
121
+ */
122
+ declare function generateSprite(options: SpriteOptions): Promise<SpriteResult>;
123
+ /**
124
+ * 批量生成多个比例的雪碧图
125
+ *
126
+ * @param input 输入目录
127
+ * @param output 输出文件路径(不包含扩展名)
128
+ * @param ratios 像素比率数组 (默认: [1, 2])
129
+ * @param unique 是否使用 unique 模式 (默认: false)
130
+ * @returns Promise<SpriteResult[]> 生成结果数组
131
+ *
132
+ * @example
133
+ * ```typescript
134
+ * import { generateSpriteMultiple } from '@sakitam-gis/sprite-cli';
135
+ *
136
+ * // 生成 1x 和 2x 两个版本
137
+ * const results = await generateSpriteMultiple('icons/', 'output/sprite');
138
+ *
139
+ * // 生成 1x、2x、3x 三个版本
140
+ * const results2 = await generateSpriteMultiple('icons/', 'output/sprite', [1, 2, 3]);
141
+ * ```
142
+ */
143
+ declare function generateSpriteMultiple(input: string, output: string, ratios?: number[], unique?: boolean): Promise<SpriteResult[]>;
144
+ /**
145
+ * 从已加载的图片缓冲区生成雪碧图
146
+ * 适用于需要自定义图片加载逻辑的场景
147
+ *
148
+ * @param buffers 图片缓冲区数组
149
+ * @param output 输出文件路径(不包含扩展名)
150
+ * @param options 额外选项
151
+ * @returns Promise<SpriteResult> 生成结果
152
+ *
153
+ * @example
154
+ * ```typescript
155
+ * import { generateSpriteFromBuffers } from '@sakitam-gis/sprite-cli';
156
+ * import fs from 'fs/promises';
157
+ *
158
+ * const buffers = [
159
+ * { id: 'icon1', svg: await fs.readFile('icon1.svg') },
160
+ * { id: 'icon2', svg: await fs.readFile('icon2.svg') },
161
+ * ];
162
+ *
163
+ * const result = await generateSpriteFromBuffers(buffers, 'output/sprite');
164
+ * ```
165
+ */
166
+ declare function generateSpriteFromBuffers(buffers: ImageBuffer[], output: string, options?: {
167
+ ratio?: number;
168
+ unique?: boolean;
169
+ format?: boolean;
170
+ }): Promise<SpriteResult>;
171
+
172
+ /**
173
+ * 获取目录中所有图片文件的路径(支持 SVG 和 PNG)
174
+ * @param dir 目录路径
175
+ * @returns 文件路径数组
176
+ */
177
+ declare function getFilePaths(dir: string): Promise<string[]>;
178
+ /**
179
+ * 加载单个图片文件(支持 SVG 和 PNG)
180
+ * @param filePath 文件路径
181
+ * @returns 图片缓冲区对象
182
+ */
183
+ declare function loadFile(filePath: string): Promise<ImageBuffer>;
184
+ /**
185
+ * 根据 ID 排序
186
+ * @param a 第一个图片缓冲区
187
+ * @param b 第二个图片缓冲区
188
+ * @returns 排序结果
189
+ */
190
+ declare function sortById(a: ImageBuffer, b: ImageBuffer): number;
191
+
192
+ /**
193
+ * Sprite layout generation
194
+ * Migrated from @mapbox/spritezero with TypeScript enhancements
195
+ */
196
+
197
+ /**
198
+ * 清除 SVG 尺寸缓存
199
+ * 用于测试或内存管理
200
+ */
201
+ declare function clearDimensionsCache(): void;
202
+ /**
203
+ * Generate sprite layout
204
+ * @param options - Layout options
205
+ * @returns Layout object
206
+ */
207
+ declare function generateLayout(options: LayoutOptions): Promise<Layout>;
208
+ /**
209
+ * Generate unique sprite layout (deduplicates identical images)
210
+ * @param options - Layout options
211
+ * @returns Layout object
212
+ */
213
+ declare function generateLayoutUnique(options: LayoutOptions): Promise<Layout>;
214
+
215
+ /**
216
+ * Sprite image generation
217
+ * Migrated from @mapbox/spritezero with TypeScript enhancements
218
+ *
219
+ * 支持:
220
+ * - 标准PNG输出
221
+ * - 优化PNG输出(颜色量化、压缩)
222
+ */
223
+
224
+ /**
225
+ * Generate sprite image from layout
226
+ * @param layout - Sprite layout (must include SVG data)
227
+ * @returns PNG image buffer
228
+ * @throws Error if layout is empty or invalid
229
+ */
230
+ declare function generateImage(layout: Layout): Promise<Buffer>;
231
+ /**
232
+ * PNG 优化选项
233
+ */
234
+ interface OptimizeOptions {
235
+ /** 颜色数量 (default: 256) */
236
+ colors?: number;
237
+ /** 压缩质量 0-100 (default: 80) */
238
+ quality?: number;
239
+ /** 是否使用调色板模式 (default: true) */
240
+ palette?: boolean;
241
+ }
242
+ /**
243
+ * 生成优化的PNG雪碧图
244
+ *
245
+ * 使用 sharp 进行 PNG 优化:
246
+ * - 颜色量化(减少到指定颜色数)
247
+ * - PNG 压缩优化
248
+ * - 减小文件大小 30-50%
249
+ *
250
+ * @param layout - Sprite layout
251
+ * @param options - 优化选项
252
+ * @returns 优化后的PNG buffer
253
+ *
254
+ * @example
255
+ * ```ts
256
+ * const optimizedPng = await generateOptimizedImage(layout, {
257
+ * colors: 256,
258
+ * quality: 80,
259
+ * palette: true
260
+ * });
261
+ * ```
262
+ */
263
+ declare function generateOptimizedImage(layout: Layout, options?: OptimizeOptions): Promise<Buffer>;
264
+
265
+ /**
266
+ * SVG Metadata Extraction
267
+ *
268
+ * 支持从SVG中提取Mapbox样式的stretch元数据和placeholder元数据
269
+ * 用于实现9-patch风格的图像拉伸和文本占位符
270
+ *
271
+ * 元数据通过特殊命名的SVG路径标记提取:
272
+ * - id="mapbox-stretch-x" 或 id="mapbox-stretch" : 水平拉伸区域
273
+ * - id="mapbox-stretch-y" 或 id="mapbox-stretch" : 垂直拉伸区域
274
+ * - id="mapbox-content" : 内容区域
275
+ * - id="mapbox-text-placeholder" : 文本占位符区域
276
+ *
277
+ * @see https://docs.mapbox.com/mapbox-gl-js/style-spec/sprite/#stretch-metadata
278
+ */
279
+
280
+ /**
281
+ * 从SVG Buffer中提取元数据
282
+ *
283
+ * 使用简化的方法:
284
+ * 1. 使用 svgo 优化 SVG(转换形状为路径等)
285
+ * 2. 使用 DOMParser 解析优化后的 SVG
286
+ * 3. 查找带有 mapbox- 前缀的路径
287
+ * 4. 使用 svg-boundings 计算边界
288
+ * 5. 按像素比率缩放并返回
289
+ *
290
+ * @param svg - SVG文件内容
291
+ * @param pixelRatio - 像素比率,用于缩放边界坐标
292
+ * @returns Promise<SpriteMetadata> 提取的元数据
293
+ */
294
+ declare function extractMetadata(svg: Buffer, pixelRatio?: number): Promise<SpriteMetadata>;
295
+ /**
296
+ * 检查SVG是否包含元数据标记
297
+ *
298
+ * @param svg - SVG文件内容
299
+ * @returns boolean 是否包含元数据
300
+ */
301
+ declare function hasMetadata(svg: Buffer): boolean;
302
+
303
+ export { type GenerateOptions, type ImageBuffer, type Layout, type LayoutItem, type LayoutOptions, type SpriteMetadata, type SpriteOptions, type SpriteResult, clearDimensionsCache, extractMetadata, generateImage, generateLayout, generateLayoutUnique, generateOptimizedImage, generateSprite, generateSpriteFromBuffers, generateSpriteMultiple, getFilePaths, hasMetadata, loadFile, sortById };