@chengyu08/ipa-cli 0.1.8 → 0.1.9
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 +40 -5
- package/dist/src/cli.js +1 -1
- package/dist/src/commands/screenshots.js +47 -13
- package/dist/src/commands/screenshots.js.map +1 -1
- package/dist/src/core/screenshots/background.d.ts +14 -0
- package/dist/src/core/screenshots/background.js +223 -0
- package/dist/src/core/screenshots/background.js.map +1 -0
- package/dist/src/core/screenshots/config-template.d.ts +2 -0
- package/dist/src/core/screenshots/config-template.js +287 -0
- package/dist/src/core/screenshots/config-template.js.map +1 -1
- package/dist/src/core/screenshots/render.js +70 -15
- package/dist/src/core/screenshots/render.js.map +1 -1
- package/dist/src/models/screenshots.d.ts +1611 -4
- package/dist/src/models/screenshots.js +77 -3
- package/dist/src/models/screenshots.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -236,8 +236,9 @@ cp ./scripts/ipatool.env.example ./scripts/ipatool.env
|
|
|
236
236
|
- `compare`:对比两个 IPA 或两个指纹 JSON
|
|
237
237
|
- `scan`:把目标样本与本地基线库做 Top N 检索
|
|
238
238
|
- `smoke`:执行 `analyze + scan + Top1 compare` 的端到端冒烟检查
|
|
239
|
-
- `screenshots init-config
|
|
239
|
+
- `screenshots init-config`:初始化上架图工作区,生成配置、`raw/` 目录和说明文档
|
|
240
240
|
- `screenshots from-ipa`:从 IPA 中提取候选图片并自动生成上架图
|
|
241
|
+
- `screenshots from-simulator`:从 iOS 模拟器采集一张原始截图
|
|
241
242
|
- `screenshots check`:校验上架图目录的尺寸、格式、数量和命名
|
|
242
243
|
- `screenshots render`:根据配置批量渲染上架图
|
|
243
244
|
- `assets review`:批量扫描当前目录或多个子项目中的静态图片风险
|
|
@@ -340,10 +341,10 @@ ipa-cli smoke ./fingerprint.json --library ./data/library --format html
|
|
|
340
341
|
|
|
341
342
|
### `screenshots init-config`
|
|
342
343
|
|
|
343
|
-
|
|
344
|
+
初始化上架图工作区,并生成默认的上架图渲染配置模板。
|
|
344
345
|
|
|
345
346
|
```bash
|
|
346
|
-
ipa-cli screenshots init-config [
|
|
347
|
+
ipa-cli screenshots init-config [path] [--force]
|
|
347
348
|
```
|
|
348
349
|
|
|
349
350
|
示例:
|
|
@@ -351,9 +352,36 @@ ipa-cli screenshots init-config [file] [--force]
|
|
|
351
352
|
```bash
|
|
352
353
|
ipa-cli screenshots init-config
|
|
353
354
|
ipa-cli screenshots init-config ./configs/appstore.screenshot.config.json --force
|
|
355
|
+
ipa-cli screenshots init-config ./screenshots-workspace
|
|
354
356
|
```
|
|
355
357
|
|
|
356
|
-
|
|
358
|
+
默认会同时生成:
|
|
359
|
+
|
|
360
|
+
- `screenshot.config.json`
|
|
361
|
+
- `raw/zh-Hans/`
|
|
362
|
+
- `README.screenshots.md`
|
|
363
|
+
|
|
364
|
+
如果参数传的是目录,例如 `./screenshots-workspace`,这些文件会生成在该目录下;如果参数传的是 `.json` 文件路径,则会生成在该配置文件所在目录下。完整使用流程和字段说明见 [docs/上架图命令说明.md](docs/上架图命令说明.md)。
|
|
365
|
+
|
|
366
|
+
### `screenshots from-simulator`
|
|
367
|
+
|
|
368
|
+
从 iOS 模拟器采集一张原始截图,可选安装并启动 `.app` 后再截图。
|
|
369
|
+
|
|
370
|
+
```bash
|
|
371
|
+
ipa-cli screenshots from-simulator [app] --output <file> [--device <name>] [--udid <udid>] [--bundle-id <id>] [--wait <ms>] [--overwrite] [--format text|json|panel]
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
示例:
|
|
375
|
+
|
|
376
|
+
```bash
|
|
377
|
+
ipa-cli screenshots from-simulator ./Build/Products/Debug-iphonesimulator/Demo.app \
|
|
378
|
+
--bundle-id com.example.demo \
|
|
379
|
+
--device "iPhone 16 Pro Max" \
|
|
380
|
+
--output ./screenshots-workspace/raw/zh-Hans/01_home.png \
|
|
381
|
+
--format panel
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
如果 App 已经安装并且页面已经手工切到位,也可以省略 `[app]` 和 `--bundle-id`,直接截取当前模拟器画面。真机 `.ipa` 不支持这个命令。
|
|
357
385
|
|
|
358
386
|
### `screenshots check`
|
|
359
387
|
|
|
@@ -765,6 +793,12 @@ ipa-cli screenshots render ./screenshot.config.json --output ./screenshots --for
|
|
|
765
793
|
ipa-cli screenshots check ./screenshots --strict --format panel
|
|
766
794
|
```
|
|
767
795
|
|
|
796
|
+
如果你希望把配置、原图和说明集中放到一个目录里,也可以先执行:
|
|
797
|
+
|
|
798
|
+
```bash
|
|
799
|
+
ipa-cli screenshots init-config ./screenshots-workspace
|
|
800
|
+
```
|
|
801
|
+
|
|
768
802
|
### 场景六:从 IPA 自动生成一版上架图草稿
|
|
769
803
|
|
|
770
804
|
```bash
|
|
@@ -827,6 +861,7 @@ ipa-cli assets manifest --help
|
|
|
827
861
|
ipa-cli assets obfuscate --help
|
|
828
862
|
ipa-cli screenshots --help
|
|
829
863
|
ipa-cli screenshots init-config --help
|
|
864
|
+
ipa-cli screenshots from-simulator --help
|
|
830
865
|
ipa-cli screenshots check --help
|
|
831
866
|
ipa-cli screenshots render --help
|
|
832
867
|
ipa-cli baseline --help
|
|
@@ -862,7 +897,7 @@ ipa-cli scan ./YourApp.ipa --library ./data/library --top 5
|
|
|
862
897
|
# 端到端冒烟
|
|
863
898
|
ipa-cli smoke ./YourApp.ipa --library ./data/library --format text
|
|
864
899
|
|
|
865
|
-
#
|
|
900
|
+
# 初始化上架图工作区
|
|
866
901
|
ipa-cli screenshots init-config
|
|
867
902
|
|
|
868
903
|
# 渲染并校验上架图
|
package/dist/src/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { access, mkdir, writeFile } from "node:fs/promises";
|
|
1
|
+
import { access, mkdir, stat, writeFile } from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { loadFingerprintInput } from "./analyze.js";
|
|
4
|
-
import { createDefaultScreenshotRenderConfig, DEFAULT_SCREENSHOT_RENDER_CONFIG_FILE } from "../core/screenshots/config-template.js";
|
|
4
|
+
import { createDefaultScreenshotRenderConfig, createScreenshotWorkspaceReadme, DEFAULT_SCREENSHOT_RENDER_CONFIG_FILE, DEFAULT_SCREENSHOT_WORKSPACE_README_FILE } from "../core/screenshots/config-template.js";
|
|
5
5
|
import { renderScreenshotCheckPanel, renderScreenshotCheckText, renderScreenshotRenderPanel, renderScreenshotRenderText, renderScreenshotSimulatorCapturePanel, renderScreenshotSimulatorCaptureText } from "../core/screenshots/report.js";
|
|
6
6
|
import { checkScreenshots } from "../core/screenshots/validate.js";
|
|
7
7
|
import { withProgress } from "../lib/progress.js";
|
|
@@ -9,18 +9,31 @@ export function registerScreenshotsCommand(program) {
|
|
|
9
9
|
const screenshots = program.command("screenshots").description("校验和生成 App Store 上架图。");
|
|
10
10
|
screenshots
|
|
11
11
|
.command("init-config")
|
|
12
|
-
.description("
|
|
13
|
-
.argument("[
|
|
14
|
-
.option("--force", "
|
|
15
|
-
.action(async (
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
12
|
+
.description("初始化上架图工作目录,并生成默认渲染配置模板。")
|
|
13
|
+
.argument("[path]", "初始化目录或输出配置文件路径", DEFAULT_SCREENSHOT_RENDER_CONFIG_FILE)
|
|
14
|
+
.option("--force", "允许覆盖已有配置和说明文件", false)
|
|
15
|
+
.action(async (targetPath, options) => {
|
|
16
|
+
const initPaths = await resolveInitConfigPaths(targetPath);
|
|
17
|
+
const config = createDefaultScreenshotRenderConfig();
|
|
18
|
+
if (!(options.force ?? false)) {
|
|
19
|
+
if (await exists(initPaths.configPath)) {
|
|
20
|
+
throw new Error(`配置文件已存在: ${initPaths.configPath}。如需覆盖,请使用 --force。`);
|
|
21
|
+
}
|
|
22
|
+
if (await exists(initPaths.readmePath)) {
|
|
23
|
+
throw new Error(`说明文件已存在: ${initPaths.readmePath}。如需覆盖,请使用 --force。`);
|
|
24
|
+
}
|
|
19
25
|
}
|
|
20
|
-
|
|
21
|
-
await mkdir(path.
|
|
22
|
-
|
|
23
|
-
|
|
26
|
+
await mkdir(initPaths.rootDir, { recursive: true });
|
|
27
|
+
await Promise.all(config.locales.map((locale) => mkdir(path.join(initPaths.rootDir, "raw", locale), { recursive: true })));
|
|
28
|
+
const content = JSON.stringify(config, null, 2);
|
|
29
|
+
const readme = createScreenshotWorkspaceReadme(initPaths.configPath, config);
|
|
30
|
+
await writeFile(initPaths.configPath, `${content}\n`, "utf8");
|
|
31
|
+
await writeFile(initPaths.readmePath, readme, "utf8");
|
|
32
|
+
process.stdout.write(`已初始化上架图工作区:\n` +
|
|
33
|
+
`- 目录: ${initPaths.rootDir}\n` +
|
|
34
|
+
`- 配置: ${initPaths.configPath}\n` +
|
|
35
|
+
`- 原图目录: ${path.join(initPaths.rootDir, "raw")}\n` +
|
|
36
|
+
`- 说明: ${initPaths.readmePath}\n`);
|
|
24
37
|
});
|
|
25
38
|
screenshots
|
|
26
39
|
.command("from-ipa")
|
|
@@ -195,4 +208,25 @@ async function exists(filePath) {
|
|
|
195
208
|
return false;
|
|
196
209
|
}
|
|
197
210
|
}
|
|
211
|
+
async function resolveInitConfigPaths(targetPath) {
|
|
212
|
+
const resolvedPath = path.resolve(targetPath);
|
|
213
|
+
const stats = await readPathStats(resolvedPath);
|
|
214
|
+
const treatAsDirectory = stats?.isDirectory() || (!stats && path.extname(resolvedPath).toLowerCase() !== ".json");
|
|
215
|
+
const rootDir = treatAsDirectory ? resolvedPath : path.dirname(resolvedPath);
|
|
216
|
+
const configPath = treatAsDirectory ? path.join(resolvedPath, DEFAULT_SCREENSHOT_RENDER_CONFIG_FILE) : resolvedPath;
|
|
217
|
+
const readmePath = path.join(rootDir, DEFAULT_SCREENSHOT_WORKSPACE_README_FILE);
|
|
218
|
+
return {
|
|
219
|
+
rootDir,
|
|
220
|
+
configPath,
|
|
221
|
+
readmePath
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
async function readPathStats(filePath) {
|
|
225
|
+
try {
|
|
226
|
+
return await stat(filePath);
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
return undefined;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
198
232
|
//# sourceMappingURL=screenshots.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenshots.js","sourceRoot":"","sources":["../../../src/commands/screenshots.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"screenshots.js","sourceRoot":"","sources":["../../../src/commands/screenshots.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ScreenshotBackground, ScreenshotTargetId } from "../../models/screenshots.js";
|
|
2
|
+
export interface RenderBackgroundOptions {
|
|
3
|
+
background: ScreenshotBackground;
|
|
4
|
+
backgroundPresets: Record<string, ScreenshotBackground>;
|
|
5
|
+
width: number;
|
|
6
|
+
height: number;
|
|
7
|
+
configDir: string;
|
|
8
|
+
rawPath: string;
|
|
9
|
+
locale: string;
|
|
10
|
+
targetId: ScreenshotTargetId;
|
|
11
|
+
frameName: string;
|
|
12
|
+
visitedPresets?: string[];
|
|
13
|
+
}
|
|
14
|
+
export declare function renderBackground(options: RenderBackgroundOptions): Promise<Buffer>;
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import sharp from "sharp";
|
|
3
|
+
export async function renderBackground(options) {
|
|
4
|
+
if (options.background.type === "preset") {
|
|
5
|
+
return await renderPresetBackground({
|
|
6
|
+
...options,
|
|
7
|
+
background: options.background
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
if (options.background.type === "stack") {
|
|
11
|
+
return await renderBackgroundStack({
|
|
12
|
+
...options,
|
|
13
|
+
background: options.background
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
return await renderBackgroundLeaf({
|
|
17
|
+
background: options.background,
|
|
18
|
+
width: options.width,
|
|
19
|
+
height: options.height,
|
|
20
|
+
configDir: options.configDir,
|
|
21
|
+
rawPath: options.rawPath,
|
|
22
|
+
locale: options.locale,
|
|
23
|
+
targetId: options.targetId,
|
|
24
|
+
frameName: options.frameName
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
async function renderPresetBackground(options) {
|
|
28
|
+
const visitedPresets = options.visitedPresets ?? [];
|
|
29
|
+
if (visitedPresets.includes(options.background.name)) {
|
|
30
|
+
throw new Error(`背景预设循环引用: ${[...visitedPresets, options.background.name].join(" -> ")}`);
|
|
31
|
+
}
|
|
32
|
+
const preset = options.backgroundPresets[options.background.name];
|
|
33
|
+
if (!preset) {
|
|
34
|
+
throw new Error(`未找到背景预设: ${options.background.name}`);
|
|
35
|
+
}
|
|
36
|
+
return await renderBackground({
|
|
37
|
+
...options,
|
|
38
|
+
background: preset,
|
|
39
|
+
visitedPresets: [...visitedPresets, options.background.name]
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
async function renderBackgroundStack(options) {
|
|
43
|
+
let output = await createTransparentCanvas(options.width, options.height);
|
|
44
|
+
for (const layer of options.background.layers) {
|
|
45
|
+
let input;
|
|
46
|
+
if (layer.type === "preset") {
|
|
47
|
+
input = await renderPresetBackground({
|
|
48
|
+
...options,
|
|
49
|
+
background: layer
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
input = await renderBackgroundLeaf({
|
|
54
|
+
background: layer,
|
|
55
|
+
width: options.width,
|
|
56
|
+
height: options.height,
|
|
57
|
+
configDir: options.configDir,
|
|
58
|
+
rawPath: options.rawPath,
|
|
59
|
+
locale: options.locale,
|
|
60
|
+
targetId: options.targetId,
|
|
61
|
+
frameName: options.frameName
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
if (layer.opacity < 1) {
|
|
65
|
+
input = await applyOpacity(input, options.width, options.height, layer.opacity);
|
|
66
|
+
}
|
|
67
|
+
output = await sharp(output)
|
|
68
|
+
.composite([{ input, top: 0, left: 0, blend: layer.blend }])
|
|
69
|
+
.png()
|
|
70
|
+
.toBuffer();
|
|
71
|
+
}
|
|
72
|
+
return output;
|
|
73
|
+
}
|
|
74
|
+
async function renderBackgroundLeaf(options) {
|
|
75
|
+
switch (options.background.type) {
|
|
76
|
+
case "solid":
|
|
77
|
+
return await sharp({
|
|
78
|
+
create: {
|
|
79
|
+
width: options.width,
|
|
80
|
+
height: options.height,
|
|
81
|
+
channels: 4,
|
|
82
|
+
background: options.background.color
|
|
83
|
+
}
|
|
84
|
+
})
|
|
85
|
+
.png()
|
|
86
|
+
.toBuffer();
|
|
87
|
+
case "linear-gradient":
|
|
88
|
+
return await sharp(Buffer.from(buildLinearGradientSvg(options.width, options.height, options.background.angle, options.background.stops)))
|
|
89
|
+
.png()
|
|
90
|
+
.toBuffer();
|
|
91
|
+
case "image":
|
|
92
|
+
return await renderImageBackground({
|
|
93
|
+
sourcePath: path.resolve(options.configDir, resolveBackgroundSourcePath(options.background.src, {
|
|
94
|
+
locale: options.locale,
|
|
95
|
+
targetId: options.targetId,
|
|
96
|
+
frameName: options.frameName
|
|
97
|
+
})),
|
|
98
|
+
width: options.width,
|
|
99
|
+
height: options.height,
|
|
100
|
+
fit: options.background.fit,
|
|
101
|
+
position: options.background.position,
|
|
102
|
+
blur: options.background.blur,
|
|
103
|
+
overlay: options.background.overlay
|
|
104
|
+
});
|
|
105
|
+
case "raw-blur":
|
|
106
|
+
return await renderImageBackground({
|
|
107
|
+
sourcePath: options.rawPath,
|
|
108
|
+
width: options.width,
|
|
109
|
+
height: options.height,
|
|
110
|
+
fit: "cover",
|
|
111
|
+
position: "center",
|
|
112
|
+
blur: options.background.blur,
|
|
113
|
+
overlay: options.background.overlay
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async function createTransparentCanvas(width, height) {
|
|
118
|
+
return await sharp({
|
|
119
|
+
create: {
|
|
120
|
+
width,
|
|
121
|
+
height,
|
|
122
|
+
channels: 4,
|
|
123
|
+
background: { r: 0, g: 0, b: 0, alpha: 0 }
|
|
124
|
+
}
|
|
125
|
+
})
|
|
126
|
+
.png()
|
|
127
|
+
.toBuffer();
|
|
128
|
+
}
|
|
129
|
+
async function applyOpacity(buffer, width, height, opacity) {
|
|
130
|
+
if (opacity >= 1) {
|
|
131
|
+
return buffer;
|
|
132
|
+
}
|
|
133
|
+
return await sharp(buffer)
|
|
134
|
+
.composite([
|
|
135
|
+
{
|
|
136
|
+
input: Buffer.from(buildOpacityMaskSvg(width, height, opacity)),
|
|
137
|
+
blend: "dest-in",
|
|
138
|
+
top: 0,
|
|
139
|
+
left: 0
|
|
140
|
+
}
|
|
141
|
+
])
|
|
142
|
+
.png()
|
|
143
|
+
.toBuffer();
|
|
144
|
+
}
|
|
145
|
+
async function renderImageBackground(options) {
|
|
146
|
+
let pipeline = sharp(options.sourcePath).resize(options.width, options.height, {
|
|
147
|
+
fit: options.fit,
|
|
148
|
+
position: toSharpPosition(options.position),
|
|
149
|
+
background: "#F5F7FA"
|
|
150
|
+
});
|
|
151
|
+
if (options.blur > 0) {
|
|
152
|
+
pipeline = pipeline.blur(options.blur);
|
|
153
|
+
}
|
|
154
|
+
const base = await pipeline.png().toBuffer();
|
|
155
|
+
if (!options.overlay) {
|
|
156
|
+
return base;
|
|
157
|
+
}
|
|
158
|
+
return await sharp(base)
|
|
159
|
+
.composite([
|
|
160
|
+
{
|
|
161
|
+
input: Buffer.from(buildOverlaySvg(options.width, options.height, options.overlay.color, options.overlay.opacity)),
|
|
162
|
+
top: 0,
|
|
163
|
+
left: 0
|
|
164
|
+
}
|
|
165
|
+
])
|
|
166
|
+
.png()
|
|
167
|
+
.toBuffer();
|
|
168
|
+
}
|
|
169
|
+
function buildLinearGradientSvg(width, height, angle, stops) {
|
|
170
|
+
const radians = (angle * Math.PI) / 180;
|
|
171
|
+
const dx = Math.sin(radians);
|
|
172
|
+
const dy = -Math.cos(radians);
|
|
173
|
+
const x1 = (0.5 - dx / 2) * 100;
|
|
174
|
+
const y1 = (0.5 - dy / 2) * 100;
|
|
175
|
+
const x2 = (0.5 + dx / 2) * 100;
|
|
176
|
+
const y2 = (0.5 + dy / 2) * 100;
|
|
177
|
+
const stopMarkup = stops
|
|
178
|
+
.map((stop) => `<stop offset="${Math.round(stop.offset * 10000) / 100}%" stop-color="${escapeXml(stop.color)}"/>`)
|
|
179
|
+
.join("");
|
|
180
|
+
return `<svg width="${width}" height="${height}" viewBox="0 0 ${width} ${height}">
|
|
181
|
+
<defs>
|
|
182
|
+
<linearGradient id="background-gradient" x1="${x1}%" y1="${y1}%" x2="${x2}%" y2="${y2}%">
|
|
183
|
+
${stopMarkup}
|
|
184
|
+
</linearGradient>
|
|
185
|
+
</defs>
|
|
186
|
+
<rect width="${width}" height="${height}" fill="url(#background-gradient)"/>
|
|
187
|
+
</svg>`;
|
|
188
|
+
}
|
|
189
|
+
function buildOverlaySvg(width, height, color, opacity) {
|
|
190
|
+
return `<svg width="${width}" height="${height}" viewBox="0 0 ${width} ${height}">
|
|
191
|
+
<rect width="${width}" height="${height}" fill="${escapeXml(color)}" fill-opacity="${opacity}"/>
|
|
192
|
+
</svg>`;
|
|
193
|
+
}
|
|
194
|
+
function buildOpacityMaskSvg(width, height, opacity) {
|
|
195
|
+
return `<svg width="${width}" height="${height}" viewBox="0 0 ${width} ${height}">
|
|
196
|
+
<rect width="${width}" height="${height}" fill="#fff" fill-opacity="${opacity}"/>
|
|
197
|
+
</svg>`;
|
|
198
|
+
}
|
|
199
|
+
function resolveBackgroundSourcePath(value, options) {
|
|
200
|
+
return value
|
|
201
|
+
.replaceAll("{locale}", options.locale)
|
|
202
|
+
.replaceAll("{target}", options.targetId)
|
|
203
|
+
.replaceAll("{frame}", options.frameName);
|
|
204
|
+
}
|
|
205
|
+
function toSharpPosition(position) {
|
|
206
|
+
if (position === "top") {
|
|
207
|
+
return "north";
|
|
208
|
+
}
|
|
209
|
+
if (position === "bottom") {
|
|
210
|
+
return "south";
|
|
211
|
+
}
|
|
212
|
+
if (position === "left") {
|
|
213
|
+
return "west";
|
|
214
|
+
}
|
|
215
|
+
if (position === "right") {
|
|
216
|
+
return "east";
|
|
217
|
+
}
|
|
218
|
+
return "centre";
|
|
219
|
+
}
|
|
220
|
+
function escapeXml(value) {
|
|
221
|
+
return value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """);
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=background.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background.js","sourceRoot":"","sources":["../../../../src/core/screenshots/background.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
import type { ScreenshotRenderConfig } from "../../models/screenshots.js";
|
|
2
2
|
export declare const DEFAULT_SCREENSHOT_RENDER_CONFIG_FILE = "screenshot.config.json";
|
|
3
|
+
export declare const DEFAULT_SCREENSHOT_WORKSPACE_README_FILE = "README.screenshots.md";
|
|
3
4
|
export declare function createDefaultScreenshotRenderConfig(): ScreenshotRenderConfig;
|
|
5
|
+
export declare function createScreenshotWorkspaceReadme(configPath: string, config: ScreenshotRenderConfig): string;
|