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.
Files changed (46) hide show
  1. package/README.md +67 -19
  2. package/dist/action/changed-files.d.ts +14 -0
  3. package/dist/action/changed-files.js +35 -0
  4. package/dist/action/changed-files.js.map +1 -0
  5. package/dist/action/comment.d.ts +28 -0
  6. package/dist/action/comment.js +70 -0
  7. package/dist/action/comment.js.map +1 -0
  8. package/dist/action/github.d.ts +15 -0
  9. package/dist/action/github.js +62 -0
  10. package/dist/action/github.js.map +1 -0
  11. package/dist/action/glob.d.ts +10 -0
  12. package/dist/action/glob.js +45 -0
  13. package/dist/action/glob.js.map +1 -0
  14. package/dist/action/main.d.ts +20 -0
  15. package/dist/action/main.js +111 -0
  16. package/dist/action/main.js.map +1 -0
  17. package/dist/action.d.ts +2 -0
  18. package/dist/action.js +7 -0
  19. package/dist/action.js.map +1 -0
  20. package/dist/cli.js +16 -2
  21. package/dist/cli.js.map +1 -1
  22. package/dist/git.d.ts +12 -0
  23. package/dist/git.js +32 -0
  24. package/dist/git.js.map +1 -0
  25. package/dist/html.d.ts +25 -0
  26. package/dist/html.js +205 -0
  27. package/dist/html.js.map +1 -0
  28. package/dist/index.d.ts +12 -0
  29. package/dist/index.js +6 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/render/compare.d.ts +19 -0
  32. package/dist/render/compare.js +61 -0
  33. package/dist/render/compare.js.map +1 -0
  34. package/dist/render/figcraft-cli.d.ts +21 -0
  35. package/dist/render/figcraft-cli.js +63 -0
  36. package/dist/render/figcraft-cli.js.map +1 -0
  37. package/dist/render/frames.d.ts +19 -0
  38. package/dist/render/frames.js +53 -0
  39. package/dist/render/frames.js.map +1 -0
  40. package/dist/render/png.d.ts +14 -0
  41. package/dist/render/png.js +185 -0
  42. package/dist/render/png.js.map +1 -0
  43. package/dist/run.d.ts +18 -3
  44. package/dist/run.js +117 -17
  45. package/dist/run.js.map +1 -1
  46. 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
- export declare const USAGE = "figdiff (pre-alpha)\n\nUsage:\n figdiff <before.figcraft> <after.figcraft> [options]\n\nOptions:\n --json Print summary and changes as JSON\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";
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. Pure with respect to process state, so it can be tested. */
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
- --json Print summary and changes as JSON
12
- --exit-code Exit with 1 when the files differ (0 when identical)
13
- --help Show this help
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 KNOWN_FLAGS = new Set(["--json", "--exit-code", "--help"]);
18
- /** Run the CLI. Pure with respect to process state, so it can be tested. */
19
- export function run(argv) {
20
- const files = argv.filter((a) => !a.startsWith("--"));
21
- const flags = new Set(argv.filter((a) => a.startsWith("--")));
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 unknown = [...flags].filter((f) => !KNOWN_FLAGS.has(f));
25
- if (unknown.length > 0) {
26
- return { code: 2, stdout: "", stderr: `figdiff: unknown option ${unknown.join(", ")}\n\n${USAGE}` };
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 { code: 2, stdout: "", stderr: `figdiff: expected two files\n\n${USAGE}` };
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
- const [beforePath, afterPath] = files;
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 { code: 2, stdout: "", stderr: `figdiff: ${err instanceof Error ? err.message : String(err)}\n` };
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;AAEzC,MAAM,CAAC,MAAM,KAAK,GAAG;;;;;;;;;;;CAWpB,CAAC;AAQF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEjE,4EAA4E;AAC5E,MAAM,UAAU,GAAG,CAAC,IAAc;IAChC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE9D,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAEvE,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,2BAA2B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,EAAE,EAAE,CAAC;IACtG,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,kCAAkC,KAAK,EAAE,EAAE,CAAC;IACpF,CAAC;IAED,IAAI,CAAC;QACH,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,KAAyB,CAAC;QAC1D,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;QACxB,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,EAAE,EAAE,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3G,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "figdiff",
3
- "version": "0.1.0-alpha.0",
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",