@sakitam-gis/sprite-cli 1.0.0 → 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/dist/cli.js +103 -91
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +303 -0
- package/dist/index.js +883 -0
- package/dist/index.js.map +1 -0
- package/package.json +13 -6
package/dist/index.d.ts
ADDED
|
@@ -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 };
|