figdiff 0.1.0-alpha.0 → 0.1.0-alpha.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.
- package/README.md +67 -19
- package/dist/action/changed-files.d.ts +14 -0
- package/dist/action/changed-files.js +35 -0
- package/dist/action/changed-files.js.map +1 -0
- package/dist/action/comment.d.ts +28 -0
- package/dist/action/comment.js +70 -0
- package/dist/action/comment.js.map +1 -0
- package/dist/action/github.d.ts +15 -0
- package/dist/action/github.js +62 -0
- package/dist/action/github.js.map +1 -0
- package/dist/action/glob.d.ts +10 -0
- package/dist/action/glob.js +45 -0
- package/dist/action/glob.js.map +1 -0
- package/dist/action/main.d.ts +20 -0
- package/dist/action/main.js +111 -0
- package/dist/action/main.js.map +1 -0
- package/dist/action.d.ts +2 -0
- package/dist/action.js +7 -0
- package/dist/action.js.map +1 -0
- package/dist/cli.js +16 -2
- package/dist/cli.js.map +1 -1
- package/dist/git.d.ts +12 -0
- package/dist/git.js +32 -0
- package/dist/git.js.map +1 -0
- package/dist/html.d.ts +25 -0
- package/dist/html.js +205 -0
- package/dist/html.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/render/compare.d.ts +19 -0
- package/dist/render/compare.js +61 -0
- package/dist/render/compare.js.map +1 -0
- package/dist/render/figcraft-cli.d.ts +21 -0
- package/dist/render/figcraft-cli.js +63 -0
- package/dist/render/figcraft-cli.js.map +1 -0
- package/dist/render/frames.d.ts +19 -0
- package/dist/render/frames.js +53 -0
- package/dist/render/frames.js.map +1 -0
- package/dist/render/png.d.ts +14 -0
- package/dist/render/png.js +185 -0
- package/dist/render/png.js.map +1 -0
- package/dist/run.d.ts +18 -3
- package/dist/run.js +117 -17
- package/dist/run.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** An 8-bit RGBA image, row by row. */
|
|
2
|
+
export interface Image {
|
|
3
|
+
width: number;
|
|
4
|
+
height: number;
|
|
5
|
+
/** width * height * 4 bytes: R, G, B, A. */
|
|
6
|
+
data: Uint8Array;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Decode a PNG into RGBA. Supports 8 and 16 bit grayscale, RGB and RGBA (with or without
|
|
10
|
+
* alpha) and 8-bit palette images, without interlacing. Throws a clear error otherwise.
|
|
11
|
+
*/
|
|
12
|
+
export declare function decodePng(input: Uint8Array): Image;
|
|
13
|
+
/** Encode RGBA pixels as an 8-bit RGBA PNG. */
|
|
14
|
+
export declare function encodePng(image: Image): Buffer;
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { deflateSync, inflateSync } from "node:zlib";
|
|
2
|
+
const SIGNATURE = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]);
|
|
3
|
+
const CHANNELS = { 0: 1, 2: 3, 3: 1, 4: 2, 6: 4 };
|
|
4
|
+
/** Largest image figdiff will decode, to avoid running out of memory on a hostile file. */
|
|
5
|
+
const MAX_PIXELS = 50_000_000;
|
|
6
|
+
function paeth(a, b, c) {
|
|
7
|
+
const p = a + b - c;
|
|
8
|
+
const pa = Math.abs(p - a);
|
|
9
|
+
const pb = Math.abs(p - b);
|
|
10
|
+
const pc = Math.abs(p - c);
|
|
11
|
+
if (pa <= pb && pa <= pc)
|
|
12
|
+
return a;
|
|
13
|
+
return pb <= pc ? b : c;
|
|
14
|
+
}
|
|
15
|
+
/** Undo PNG scanline filtering in place; returns the unfiltered rows without the filter bytes. */
|
|
16
|
+
function unfilter(raw, height, stride, bpp) {
|
|
17
|
+
const out = Buffer.alloc(height * stride);
|
|
18
|
+
for (let y = 0; y < height; y++) {
|
|
19
|
+
const filter = raw[y * (stride + 1)];
|
|
20
|
+
const src = y * (stride + 1) + 1;
|
|
21
|
+
const dst = y * stride;
|
|
22
|
+
const up = dst - stride;
|
|
23
|
+
for (let x = 0; x < stride; x++) {
|
|
24
|
+
const cur = raw[src + x];
|
|
25
|
+
const left = x >= bpp ? out[dst + x - bpp] : 0;
|
|
26
|
+
const above = y > 0 ? out[up + x] : 0;
|
|
27
|
+
const upLeft = y > 0 && x >= bpp ? out[up + x - bpp] : 0;
|
|
28
|
+
let value;
|
|
29
|
+
switch (filter) {
|
|
30
|
+
case 0:
|
|
31
|
+
value = cur;
|
|
32
|
+
break;
|
|
33
|
+
case 1:
|
|
34
|
+
value = cur + left;
|
|
35
|
+
break;
|
|
36
|
+
case 2:
|
|
37
|
+
value = cur + above;
|
|
38
|
+
break;
|
|
39
|
+
case 3:
|
|
40
|
+
value = cur + ((left + above) >> 1);
|
|
41
|
+
break;
|
|
42
|
+
case 4:
|
|
43
|
+
value = cur + paeth(left, above, upLeft);
|
|
44
|
+
break;
|
|
45
|
+
default: throw new Error(`Invalid PNG filter type ${filter}`);
|
|
46
|
+
}
|
|
47
|
+
out[dst + x] = value & 0xff;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Decode a PNG into RGBA. Supports 8 and 16 bit grayscale, RGB and RGBA (with or without
|
|
54
|
+
* alpha) and 8-bit palette images, without interlacing. Throws a clear error otherwise.
|
|
55
|
+
*/
|
|
56
|
+
export function decodePng(input) {
|
|
57
|
+
const buf = Buffer.from(input.buffer, input.byteOffset, input.byteLength);
|
|
58
|
+
if (buf.length < 8 || !buf.subarray(0, 8).equals(SIGNATURE))
|
|
59
|
+
throw new Error("Not a PNG file");
|
|
60
|
+
let width = 0, height = 0, depth = 0, colorType = -1, interlace = 0;
|
|
61
|
+
let palette;
|
|
62
|
+
let transparency;
|
|
63
|
+
const idat = [];
|
|
64
|
+
for (let pos = 8; pos + 8 <= buf.length;) {
|
|
65
|
+
const length = buf.readUInt32BE(pos);
|
|
66
|
+
const type = buf.toString("latin1", pos + 4, pos + 8);
|
|
67
|
+
const data = buf.subarray(pos + 8, pos + 8 + length);
|
|
68
|
+
pos += 12 + length;
|
|
69
|
+
if (type === "IHDR") {
|
|
70
|
+
width = data.readUInt32BE(0);
|
|
71
|
+
height = data.readUInt32BE(4);
|
|
72
|
+
depth = data[8];
|
|
73
|
+
colorType = data[9];
|
|
74
|
+
interlace = data[12];
|
|
75
|
+
}
|
|
76
|
+
else if (type === "PLTE")
|
|
77
|
+
palette = data;
|
|
78
|
+
else if (type === "tRNS")
|
|
79
|
+
transparency = data;
|
|
80
|
+
else if (type === "IDAT")
|
|
81
|
+
idat.push(data);
|
|
82
|
+
else if (type === "IEND")
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
if (width === 0 || height === 0)
|
|
86
|
+
throw new Error("PNG has no valid header");
|
|
87
|
+
if (width * height > MAX_PIXELS)
|
|
88
|
+
throw new Error(`PNG is too large (${width}x${height})`);
|
|
89
|
+
if (interlace !== 0)
|
|
90
|
+
throw new Error("Interlaced PNG files are not supported");
|
|
91
|
+
const channels = CHANNELS[colorType];
|
|
92
|
+
if (channels === undefined)
|
|
93
|
+
throw new Error(`Unsupported PNG color type ${colorType}`);
|
|
94
|
+
const supported = colorType === 3 ? depth === 8 : depth === 8 || depth === 16;
|
|
95
|
+
if (!supported)
|
|
96
|
+
throw new Error(`Unsupported PNG bit depth ${depth} for color type ${colorType}`);
|
|
97
|
+
const bytesPerPixel = channels * (depth / 8);
|
|
98
|
+
const stride = width * bytesPerPixel;
|
|
99
|
+
const raw = inflateSync(Buffer.concat(idat));
|
|
100
|
+
if (raw.length < (stride + 1) * height)
|
|
101
|
+
throw new Error("PNG image data is truncated");
|
|
102
|
+
const rows = unfilter(raw, height, stride, Math.max(1, bytesPerPixel));
|
|
103
|
+
const out = new Uint8Array(width * height * 4);
|
|
104
|
+
const step = depth / 8; // bytes per sample
|
|
105
|
+
for (let i = 0; i < width * height; i++) {
|
|
106
|
+
const p = i * bytesPerPixel;
|
|
107
|
+
const sample = (c) => rows[p + c * step]; // high byte for 16-bit
|
|
108
|
+
let r, g, b, a = 255;
|
|
109
|
+
switch (colorType) {
|
|
110
|
+
case 0:
|
|
111
|
+
r = g = b = sample(0);
|
|
112
|
+
break;
|
|
113
|
+
case 2:
|
|
114
|
+
r = sample(0);
|
|
115
|
+
g = sample(1);
|
|
116
|
+
b = sample(2);
|
|
117
|
+
break;
|
|
118
|
+
case 3: {
|
|
119
|
+
const index = rows[p];
|
|
120
|
+
r = palette?.[index * 3] ?? 0;
|
|
121
|
+
g = palette?.[index * 3 + 1] ?? 0;
|
|
122
|
+
b = palette?.[index * 3 + 2] ?? 0;
|
|
123
|
+
a = transparency?.[index] ?? 255;
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
case 4:
|
|
127
|
+
r = g = b = sample(0);
|
|
128
|
+
a = sample(1);
|
|
129
|
+
break;
|
|
130
|
+
default:
|
|
131
|
+
r = sample(0);
|
|
132
|
+
g = sample(1);
|
|
133
|
+
b = sample(2);
|
|
134
|
+
a = sample(3);
|
|
135
|
+
}
|
|
136
|
+
out[i * 4] = r;
|
|
137
|
+
out[i * 4 + 1] = g;
|
|
138
|
+
out[i * 4 + 2] = b;
|
|
139
|
+
out[i * 4 + 3] = a;
|
|
140
|
+
}
|
|
141
|
+
return { width, height, data: out };
|
|
142
|
+
}
|
|
143
|
+
const CRC_TABLE = (() => {
|
|
144
|
+
const table = new Uint32Array(256);
|
|
145
|
+
for (let n = 0; n < 256; n++) {
|
|
146
|
+
let c = n;
|
|
147
|
+
for (let k = 0; k < 8; k++)
|
|
148
|
+
c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
|
|
149
|
+
table[n] = c >>> 0;
|
|
150
|
+
}
|
|
151
|
+
return table;
|
|
152
|
+
})();
|
|
153
|
+
function crc32(bytes) {
|
|
154
|
+
let c = 0xffffffff;
|
|
155
|
+
for (const byte of bytes)
|
|
156
|
+
c = CRC_TABLE[(c ^ byte) & 0xff] ^ (c >>> 8);
|
|
157
|
+
return (c ^ 0xffffffff) >>> 0;
|
|
158
|
+
}
|
|
159
|
+
function chunk(type, data) {
|
|
160
|
+
const head = Buffer.alloc(8);
|
|
161
|
+
head.writeUInt32BE(data.length, 0);
|
|
162
|
+
head.write(type, 4, "latin1");
|
|
163
|
+
const crc = Buffer.alloc(4);
|
|
164
|
+
crc.writeUInt32BE(crc32(Buffer.concat([head.subarray(4), data])), 0);
|
|
165
|
+
return Buffer.concat([head, data, crc]);
|
|
166
|
+
}
|
|
167
|
+
/** Encode RGBA pixels as an 8-bit RGBA PNG. */
|
|
168
|
+
export function encodePng(image) {
|
|
169
|
+
const { width, height, data } = image;
|
|
170
|
+
if (data.length !== width * height * 4)
|
|
171
|
+
throw new Error("Pixel data does not match the image size");
|
|
172
|
+
const header = Buffer.alloc(13);
|
|
173
|
+
header.writeUInt32BE(width, 0);
|
|
174
|
+
header.writeUInt32BE(height, 4);
|
|
175
|
+
header[8] = 8; // bit depth
|
|
176
|
+
header[9] = 6; // RGBA
|
|
177
|
+
const stride = width * 4;
|
|
178
|
+
const raw = Buffer.alloc((stride + 1) * height);
|
|
179
|
+
for (let y = 0; y < height; y++) {
|
|
180
|
+
raw[y * (stride + 1)] = 0; // filter: none
|
|
181
|
+
Buffer.from(data.buffer, data.byteOffset + y * stride, stride).copy(raw, y * (stride + 1) + 1);
|
|
182
|
+
}
|
|
183
|
+
return Buffer.concat([SIGNATURE, chunk("IHDR", header), chunk("IDAT", deflateSync(raw)), chunk("IEND", Buffer.alloc(0))]);
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=png.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"png.js","sourceRoot":"","sources":["../../src/render/png.ts"],"names":[],"mappings":"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"}
|
package/dist/run.d.ts
CHANGED
|
@@ -1,8 +1,23 @@
|
|
|
1
|
-
|
|
1
|
+
import type { Renderer } from "./render/figcraft-cli.js";
|
|
2
|
+
import type { GitCopy } from "./git.js";
|
|
3
|
+
export declare const USAGE = "figdiff (pre-alpha)\n\nUsage:\n figdiff <before.figcraft> <after.figcraft> [options]\n figdiff <file.figcraft> --against <git-revision> [options]\n\nOptions:\n --against <revision> Compare the file with its version at a git revision\n (a branch, tag or commit, for example main or HEAD~1)\n --html <file> Also write a self-contained HTML report to <file>\n --images Add rendered before/after images to the HTML report\n (needs --html and FigCraft's figcraft-cli)\n --figcraft-cli <path> Path to figcraft-cli (default: $FIGCRAFT_CLI, then PATH)\n --json Print summary and changes as JSON instead of text\n --exit-code Exit with 1 when the files differ (0 when identical)\n --help Show this help\n\nExit codes: 0 ok, 1 differences found (only with --exit-code), 2 error.\n";
|
|
4
|
+
export interface FileWrite {
|
|
5
|
+
path: string;
|
|
6
|
+
content: string;
|
|
7
|
+
}
|
|
2
8
|
export interface RunResult {
|
|
3
9
|
code: number;
|
|
4
10
|
stdout: string;
|
|
5
11
|
stderr: string;
|
|
12
|
+
/** Files the caller should write (the CLI entry point does this). */
|
|
13
|
+
writes: FileWrite[];
|
|
14
|
+
}
|
|
15
|
+
/** Things run() needs from the outside world; replaced in tests. */
|
|
16
|
+
export interface RunDeps {
|
|
17
|
+
/** Returns a renderer, or undefined when figcraft-cli cannot be found. */
|
|
18
|
+
createRenderer(explicitPath?: string): Renderer | undefined;
|
|
19
|
+
/** Saves the version of a file at a git revision to a temporary file. */
|
|
20
|
+
fromGit(ref: string, file: string): GitCopy;
|
|
6
21
|
}
|
|
7
|
-
/** Run the CLI.
|
|
8
|
-
export declare function run(argv: string[]): RunResult;
|
|
22
|
+
/** Run the CLI. Free of side effects on the file system and process, so it can be tested. */
|
|
23
|
+
export declare function run(argv: string[], overrides?: Partial<RunDeps>): RunResult;
|
package/dist/run.js
CHANGED
|
@@ -1,44 +1,144 @@
|
|
|
1
|
+
import { basename } from "node:path";
|
|
1
2
|
import { parseFigcraft } from "./parser/index.js";
|
|
2
3
|
import { diffTrees } from "./diff/diff.js";
|
|
3
4
|
import { summarize } from "./diff/summary.js";
|
|
4
5
|
import { formatText } from "./report.js";
|
|
6
|
+
import { formatHtml } from "./html.js";
|
|
7
|
+
import { createCliRenderer, findFigcraftCli, RendererUnavailableError } from "./render/figcraft-cli.js";
|
|
8
|
+
import { renderChangedFrames } from "./render/frames.js";
|
|
9
|
+
import { extractFromGit } from "./git.js";
|
|
5
10
|
export const USAGE = `figdiff (pre-alpha)
|
|
6
11
|
|
|
7
12
|
Usage:
|
|
8
13
|
figdiff <before.figcraft> <after.figcraft> [options]
|
|
14
|
+
figdiff <file.figcraft> --against <git-revision> [options]
|
|
9
15
|
|
|
10
16
|
Options:
|
|
11
|
-
--
|
|
12
|
-
|
|
13
|
-
--
|
|
17
|
+
--against <revision> Compare the file with its version at a git revision
|
|
18
|
+
(a branch, tag or commit, for example main or HEAD~1)
|
|
19
|
+
--html <file> Also write a self-contained HTML report to <file>
|
|
20
|
+
--images Add rendered before/after images to the HTML report
|
|
21
|
+
(needs --html and FigCraft's figcraft-cli)
|
|
22
|
+
--figcraft-cli <path> Path to figcraft-cli (default: $FIGCRAFT_CLI, then PATH)
|
|
23
|
+
--json Print summary and changes as JSON instead of text
|
|
24
|
+
--exit-code Exit with 1 when the files differ (0 when identical)
|
|
25
|
+
--help Show this help
|
|
14
26
|
|
|
15
27
|
Exit codes: 0 ok, 1 differences found (only with --exit-code), 2 error.
|
|
16
28
|
`;
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
29
|
+
const defaultDeps = {
|
|
30
|
+
createRenderer(explicitPath) {
|
|
31
|
+
const bin = findFigcraftCli(explicitPath);
|
|
32
|
+
return bin ? createCliRenderer(bin) : undefined;
|
|
33
|
+
},
|
|
34
|
+
fromGit: (ref, file) => extractFromGit(ref, file),
|
|
35
|
+
};
|
|
36
|
+
const BOOLEAN_FLAGS = new Set(["--json", "--exit-code", "--images", "--help"]);
|
|
37
|
+
const VALUE_FLAGS = new Set(["--html", "--figcraft-cli", "--against"]);
|
|
38
|
+
const MISSING_VALUE = {
|
|
39
|
+
"--html": "--html needs a file path",
|
|
40
|
+
"--figcraft-cli": "--figcraft-cli needs a file path",
|
|
41
|
+
"--against": "--against needs a git revision",
|
|
42
|
+
};
|
|
43
|
+
const fail = (message, withUsage = true) => ({
|
|
44
|
+
code: 2,
|
|
45
|
+
stdout: "",
|
|
46
|
+
stderr: `figdiff: ${message}\n${withUsage ? `\n${USAGE}` : ""}`,
|
|
47
|
+
writes: [],
|
|
48
|
+
});
|
|
49
|
+
/** Run the CLI. Free of side effects on the file system and process, so it can be tested. */
|
|
50
|
+
export function run(argv, overrides = {}) {
|
|
51
|
+
const deps = { ...defaultDeps, ...overrides };
|
|
52
|
+
const files = [];
|
|
53
|
+
const flags = new Set();
|
|
54
|
+
const values = new Map();
|
|
55
|
+
for (let i = 0; i < argv.length; i++) {
|
|
56
|
+
const arg = argv[i];
|
|
57
|
+
if (VALUE_FLAGS.has(arg)) {
|
|
58
|
+
const value = argv[++i];
|
|
59
|
+
if (value === undefined || value.startsWith("--"))
|
|
60
|
+
return fail(MISSING_VALUE[arg]);
|
|
61
|
+
values.set(arg, value);
|
|
62
|
+
}
|
|
63
|
+
else if (arg.startsWith("--")) {
|
|
64
|
+
if (!BOOLEAN_FLAGS.has(arg))
|
|
65
|
+
return fail(`unknown option ${arg}`);
|
|
66
|
+
flags.add(arg);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
files.push(arg);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
22
72
|
if (flags.has("--help"))
|
|
23
|
-
return { code: 0, stdout: USAGE, stderr: "" };
|
|
24
|
-
const
|
|
25
|
-
if (
|
|
26
|
-
|
|
73
|
+
return { code: 0, stdout: USAGE, stderr: "", writes: [] };
|
|
74
|
+
const against = values.get("--against");
|
|
75
|
+
if (against !== undefined) {
|
|
76
|
+
if (files.length !== 1)
|
|
77
|
+
return fail("expected one file with --against");
|
|
27
78
|
}
|
|
28
|
-
if (files.length !== 2) {
|
|
29
|
-
return
|
|
79
|
+
else if (files.length !== 2) {
|
|
80
|
+
return fail("expected two files");
|
|
30
81
|
}
|
|
82
|
+
const htmlPath = values.get("--html");
|
|
83
|
+
if (flags.has("--images") && !htmlPath)
|
|
84
|
+
return fail("--images needs --html");
|
|
85
|
+
if (values.has("--figcraft-cli") && !flags.has("--images"))
|
|
86
|
+
return fail("--figcraft-cli needs --images");
|
|
87
|
+
let copy;
|
|
31
88
|
try {
|
|
32
|
-
|
|
89
|
+
let beforePath;
|
|
90
|
+
let afterPath;
|
|
91
|
+
let beforeName;
|
|
92
|
+
if (against !== undefined) {
|
|
93
|
+
afterPath = files[0];
|
|
94
|
+
copy = deps.fromGit(against, afterPath);
|
|
95
|
+
beforePath = copy.path;
|
|
96
|
+
beforeName = `${basename(afterPath)} @ ${against}`;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
[beforePath, afterPath] = files;
|
|
100
|
+
beforeName = basename(beforePath);
|
|
101
|
+
}
|
|
33
102
|
const changes = diffTrees(parseFigcraft(beforePath), parseFigcraft(afterPath));
|
|
34
103
|
const stdout = flags.has("--json")
|
|
35
104
|
? JSON.stringify({ summary: summarize(changes), changes }, null, 2) + "\n"
|
|
36
105
|
: formatText(changes);
|
|
106
|
+
const notes = [];
|
|
107
|
+
const writes = [];
|
|
108
|
+
if (htmlPath) {
|
|
109
|
+
let images;
|
|
110
|
+
if (flags.has("--images")) {
|
|
111
|
+
const renderer = deps.createRenderer(values.get("--figcraft-cli"));
|
|
112
|
+
if (!renderer) {
|
|
113
|
+
notes.push("figcraft-cli not found; writing the report without images. Use --figcraft-cli <path> or set FIGCRAFT_CLI.");
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
try {
|
|
117
|
+
const rendered = renderChangedFrames(changes, beforePath, afterPath, renderer);
|
|
118
|
+
images = rendered.images;
|
|
119
|
+
notes.push(...rendered.warnings);
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
if (!(err instanceof RendererUnavailableError))
|
|
123
|
+
throw err;
|
|
124
|
+
notes.push(`${err.message}; writing the report without images.`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
writes.push({
|
|
129
|
+
path: htmlPath,
|
|
130
|
+
content: formatHtml(changes, { beforeName, afterName: basename(afterPath), images }),
|
|
131
|
+
});
|
|
132
|
+
notes.push(`wrote ${htmlPath}`);
|
|
133
|
+
}
|
|
37
134
|
const code = flags.has("--exit-code") && changes.length > 0 ? 1 : 0;
|
|
38
|
-
return { code, stdout, stderr: "" };
|
|
135
|
+
return { code, stdout, stderr: notes.map((n) => `figdiff: ${n}\n`).join(""), writes };
|
|
39
136
|
}
|
|
40
137
|
catch (err) {
|
|
41
|
-
return
|
|
138
|
+
return fail(err instanceof Error ? err.message : String(err), false);
|
|
139
|
+
}
|
|
140
|
+
finally {
|
|
141
|
+
copy?.cleanup();
|
|
42
142
|
}
|
|
43
143
|
}
|
|
44
144
|
//# sourceMappingURL=run.js.map
|
package/dist/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAExG,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG1C,MAAM,CAAC,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;CAkBpB,CAAC;AAuBF,MAAM,WAAW,GAAY;IAC3B,cAAc,CAAC,YAAY;QACzB,MAAM,GAAG,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;QAC1C,OAAO,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClD,CAAC;IACD,OAAO,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC;CAClD,CAAC;AAEF,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC/E,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC,CAAC;AACvE,MAAM,aAAa,GAA2B;IAC5C,QAAQ,EAAE,0BAA0B;IACpC,gBAAgB,EAAE,kCAAkC;IACpD,WAAW,EAAE,gCAAgC;CAC9C,CAAC;AAEF,MAAM,IAAI,GAAG,CAAC,OAAe,EAAE,SAAS,GAAG,IAAI,EAAa,EAAE,CAAC,CAAC;IAC9D,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,EAAE;IACV,MAAM,EAAE,YAAY,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;IAC/D,MAAM,EAAE,EAAE;CACX,CAAC,CAAC;AAEH,6FAA6F;AAC7F,MAAM,UAAU,GAAG,CAAC,IAAc,EAAE,YAA8B,EAAE;IAClE,MAAM,IAAI,GAAY,EAAE,GAAG,WAAW,EAAE,GAAG,SAAS,EAAE,CAAC;IACvD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAW,CAAC;QAC9B,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACxB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAW,CAAC,CAAC;YAC7F,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzB,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC;YAClE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACnF,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAC1E,CAAC;SAAM,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAC7E,IAAI,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAEzG,IAAI,IAAyB,CAAC;IAC9B,IAAI,CAAC;QACH,IAAI,UAAkB,CAAC;QACvB,IAAI,SAAiB,CAAC;QACtB,IAAI,UAAkB,CAAC;QACvB,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,SAAS,GAAG,KAAK,CAAC,CAAC,CAAW,CAAC;YAC/B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACxC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC;YACvB,UAAU,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,OAAO,EAAE,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,KAAyB,CAAC;YACpD,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,OAAO,GAAG,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;YAChC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI;YAC1E,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAExB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAgB,EAAE,CAAC;QAC/B,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,MAA+C,CAAC;YACpD,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBACnE,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,KAAK,CAAC,IAAI,CAAC,2GAA2G,CAAC,CAAC;gBAC1H,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC;wBACH,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;wBAC/E,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;wBACzB,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBACnC,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,IAAI,CAAC,CAAC,GAAG,YAAY,wBAAwB,CAAC;4BAAE,MAAM,GAAG,CAAC;wBAC1D,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,OAAO,sCAAsC,CAAC,CAAC;oBACnE,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;aACrF,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC;QAClC,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACxF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IACvE,CAAC;YAAS,CAAC;QACT,IAAI,EAAE,OAAO,EAAE,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "figdiff",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.1",
|
|
4
4
|
"description": "Review FigCraft design changes like code: semantic and visual diffs for .figcraft files.",
|
|
5
5
|
"author": "bintangyoga",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"bin": {
|
|
9
|
-
"figdiff": "dist/cli.js"
|
|
9
|
+
"figdiff": "dist/cli.js",
|
|
10
|
+
"figdiff-action": "dist/action.js"
|
|
10
11
|
},
|
|
11
12
|
"main": "dist/index.js",
|
|
12
13
|
"types": "dist/index.d.ts",
|