@pablocm90/visual-review 0.0.0-stage → 0.1.0
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/LICENSE +21 -0
- package/README.md +80 -2
- package/dist/api-paths.d.ts +18 -0
- package/dist/api-paths.js +22 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +95 -0
- package/dist/config.d.ts +85 -0
- package/dist/config.js +150 -0
- package/dist/config.schema.json +98 -0
- package/dist/crate-graph.d.ts +8 -0
- package/dist/crate-graph.js +51 -0
- package/dist/crate-modules.d.ts +8 -0
- package/dist/crate-modules.js +103 -0
- package/dist/diff-graphs.d.ts +31 -0
- package/dist/diff-graphs.js +72 -0
- package/dist/graph.d.ts +24 -0
- package/dist/graph.js +9 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +1 -0
- package/dist/linker.d.ts +32 -0
- package/dist/linker.js +1 -0
- package/dist/linkers/fetch-axum.d.ts +2 -0
- package/dist/linkers/fetch-axum.js +38 -0
- package/dist/notes.d.ts +37 -0
- package/dist/notes.js +82 -0
- package/dist/notes.schema.json +68 -0
- package/dist/on-path.d.ts +1 -0
- package/dist/on-path.js +16 -0
- package/dist/prune-reviews.d.ts +6 -0
- package/dist/prune-reviews.js +12 -0
- package/dist/pull-request.d.ts +17 -0
- package/dist/pull-request.js +41 -0
- package/dist/read-range.d.ts +29 -0
- package/dist/read-range.js +158 -0
- package/dist/reader.d.ts +30 -0
- package/dist/reader.js +1 -0
- package/dist/readers/rust.d.ts +2 -0
- package/dist/readers/rust.js +66 -0
- package/dist/readers/typescript.d.ts +2 -0
- package/dist/readers/typescript.js +124 -0
- package/dist/rust-syntax.d.ts +10 -0
- package/dist/rust-syntax.js +11 -0
- package/dist/rust-tests.d.ts +2 -0
- package/dist/rust-tests.js +24 -0
- package/dist/skipped.d.ts +7 -0
- package/dist/skipped.js +1 -0
- package/dist/sources-in.d.ts +5 -0
- package/dist/sources-in.js +7 -0
- package/dist/test-statements.d.ts +46 -0
- package/dist/test-statements.js +121 -0
- package/dist/viewer/review-data.d.ts +18 -0
- package/dist/viewer/review-data.js +1 -0
- package/dist/viewer/visible-diff.d.ts +16 -0
- package/dist/viewer/visible-diff.js +74 -0
- package/dist/viewer.html +52 -0
- package/dist/web-graph.d.ts +19 -0
- package/dist/web-graph.js +59 -0
- package/dist/working-tree.d.ts +1 -0
- package/dist/working-tree.js +19 -0
- package/package.json +68 -4
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { GraphDiff } from '../diff-graphs.ts';
|
|
2
|
+
import type { GraphEdge } from '../graph.ts';
|
|
3
|
+
import type { Note } from '../notes.ts';
|
|
4
|
+
export declare const edgeId: (edge: GraphEdge) => string;
|
|
5
|
+
type VisibleDiffOptions = {
|
|
6
|
+
readonly diff: GraphDiff;
|
|
7
|
+
readonly expanded: ReadonlySet<string>;
|
|
8
|
+
};
|
|
9
|
+
export declare const visibleNodeOf: ({ diff, expanded }: VisibleDiffOptions) => (id: string) => string;
|
|
10
|
+
export declare const visibleDiff: ({ diff, expanded }: VisibleDiffOptions) => GraphDiff;
|
|
11
|
+
export declare const nearChanges: (diff: GraphDiff) => GraphDiff;
|
|
12
|
+
type VisibleNotesOptions = VisibleDiffOptions & {
|
|
13
|
+
readonly notes: Readonly<Record<string, Note>>;
|
|
14
|
+
};
|
|
15
|
+
export declare const visibleNotes: ({ diff, expanded, notes, }: VisibleNotesOptions) => Readonly<Record<string, Note>>;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
export const edgeId = (edge) => `${edge.from} -> ${edge.to}`;
|
|
2
|
+
const sameEnds = (one, other) => one.from === other.from && one.to === other.to;
|
|
3
|
+
const mergedState = (edges) => {
|
|
4
|
+
if (edges.every(edge => edge.state === 'added'))
|
|
5
|
+
return 'added';
|
|
6
|
+
if (edges.every(edge => edge.state === 'removed'))
|
|
7
|
+
return 'removed';
|
|
8
|
+
return 'unchanged';
|
|
9
|
+
};
|
|
10
|
+
export const visibleNodeOf = ({ diff, expanded }) => {
|
|
11
|
+
const parentOf = new Map(diff.nodes.map(node => [node.id, node.parent]));
|
|
12
|
+
const stacks = new Set(diff.nodes.filter(node => node.kind === 'stack').map(node => node.id));
|
|
13
|
+
return (id) => {
|
|
14
|
+
const parent = parentOf.get(id);
|
|
15
|
+
return parent === undefined || stacks.has(parent) || expanded.has(parent) ? id : parent;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
export const visibleDiff = ({ diff, expanded }) => {
|
|
19
|
+
const visibleOf = visibleNodeOf({ diff, expanded });
|
|
20
|
+
const rerouted = diff.edges
|
|
21
|
+
.map(edge => ({ ...edge, from: visibleOf(edge.from), to: visibleOf(edge.to) }))
|
|
22
|
+
.filter(edge => edge.from !== edge.to);
|
|
23
|
+
return {
|
|
24
|
+
nodes: diff.nodes.filter(node => visibleOf(node.id) === node.id),
|
|
25
|
+
edges: rerouted
|
|
26
|
+
.filter((edge, index) => rerouted.findIndex(other => sameEnds(edge, other)) === index)
|
|
27
|
+
.map(edge => {
|
|
28
|
+
const merged = rerouted.filter(other => sameEnds(edge, other));
|
|
29
|
+
const via = [...new Set(merged.flatMap(other => other.via ?? []))];
|
|
30
|
+
return { ...edge, ...(via.length > 0 ? { via } : {}), state: mergedState(merged) };
|
|
31
|
+
}),
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
export const nearChanges = (diff) => {
|
|
35
|
+
const changed = new Set(diff.nodes.filter(node => node.state !== 'unchanged').map(node => node.id));
|
|
36
|
+
const near = [
|
|
37
|
+
...changed,
|
|
38
|
+
...diff.edges.flatMap(edge => edge.state !== 'unchanged' || changed.has(edge.from) || changed.has(edge.to)
|
|
39
|
+
? [edge.from, edge.to]
|
|
40
|
+
: []),
|
|
41
|
+
];
|
|
42
|
+
const parentOf = new Map(diff.nodes.map(node => [node.id, node.parent]));
|
|
43
|
+
const withAncestors = (id) => {
|
|
44
|
+
const parent = parentOf.get(id);
|
|
45
|
+
return parent === undefined ? [id] : [id, ...withAncestors(parent)];
|
|
46
|
+
};
|
|
47
|
+
const kept = new Set(near.flatMap(withAncestors));
|
|
48
|
+
return {
|
|
49
|
+
nodes: diff.nodes.filter(node => kept.has(node.id)),
|
|
50
|
+
edges: diff.edges.filter(edge => kept.has(edge.from) && kept.has(edge.to)),
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
const joined = (one, other) => {
|
|
54
|
+
const flags = [one.flag, other.flag].filter(flag => flag !== undefined);
|
|
55
|
+
return {
|
|
56
|
+
text: `${one.text} ${other.text}`,
|
|
57
|
+
...(flags.length > 0 ? { flag: flags.join(', ') } : {}),
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
export const visibleNotes = ({ diff, expanded, notes, }) => {
|
|
61
|
+
const visibleOf = visibleNodeOf({ diff, expanded });
|
|
62
|
+
const drawnIdOf = new Map(diff.edges.map(edge => [
|
|
63
|
+
edgeId(edge),
|
|
64
|
+
edgeId({ from: visibleOf(edge.from), to: visibleOf(edge.to) }),
|
|
65
|
+
]));
|
|
66
|
+
const placed = Object.entries(notes).map(([id, note]) => ({ id: drawnIdOf.get(id) ?? id, note }));
|
|
67
|
+
return Object.fromEntries([...new Set(placed.map(({ id }) => id))].map(id => [
|
|
68
|
+
id,
|
|
69
|
+
placed
|
|
70
|
+
.filter(other => other.id === id)
|
|
71
|
+
.map(({ note }) => note)
|
|
72
|
+
.reduce(joined),
|
|
73
|
+
]));
|
|
74
|
+
};
|