diff --git a/packages/cli/package.json b/packages/cli/package.json index 4c748f4..724bddc 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -50,7 +50,7 @@ "cli diff component" ], "dependencies": { - "@git-diff-view/core": "^0.0.35", + "@git-diff-view/core": "^0.0.36", "@types/hast": "^3.0.0", "highlight.js": "^11.11.0", "lowlight": "^3.3.0", diff --git a/packages/core/index.d.ts b/packages/core/index.d.ts index 5295c5a..a290576 100644 --- a/packages/core/index.d.ts +++ b/packages/core/index.d.ts @@ -126,12 +126,12 @@ export declare class DiffFile { getSplitLineIndexByLineNumber: (lineNumber: number, side: SplitSide) => number; getSplitRightLine: (index: number) => SplitLineItem; getSplitHunkLine: (index: number) => DiffHunkItem; - onSplitHunkExpand: (dir: "up" | "down" | "all", index: number, needTrigger?: boolean) => void; + onSplitHunkExpand: (dir: "up" | "down" | "all" | "up-all" | "down-all", index: number, needTrigger?: boolean) => void; getUnifiedLine: (index: number) => UnifiedLineItem; getUnifiedLineByLineNumber: (lienNumber: number, side: SplitSide) => UnifiedLineItem; getUnifiedLineIndexByLineNumber: (lineNumber: number, side: SplitSide) => number; getUnifiedHunkLine: (index: number) => DiffHunkItem; - onUnifiedHunkExpand: (dir: "up" | "down" | "all", index: number, needTrigger?: boolean) => void; + onUnifiedHunkExpand: (dir: "up" | "down" | "all" | "up-all" | "down-all", index: number, needTrigger?: boolean) => void; onAllExpand: (mode: "split" | "unified") => void; get hasExpandSplitAll(): boolean; get hasExpandUnifiedAll(): boolean; diff --git a/packages/core/package.json b/packages/core/package.json index 18d6954..d3d538f 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -53,7 +53,7 @@ "diff parse" ], "dependencies": { - "@git-diff-view/lowlight": "^0.0.35", + "@git-diff-view/lowlight": "^0.0.36", "highlight.js": "^11.11.0", "lowlight": "^3.3.0", "fast-diff": "^1.3.0" diff --git a/packages/core/src/diff-file.ts b/packages/core/src/diff-file.ts index 054988c..2353f94 100644 --- a/packages/core/src/diff-file.ts +++ b/packages/core/src/diff-file.ts @@ -1159,7 +1159,7 @@ export class DiffFile { return this.#splitHunksLines?.[index]; }; - onSplitHunkExpand = (dir: "up" | "down" | "all", index: number, needTrigger = true) => { + onSplitHunkExpand = (dir: "up" | "down" | "all" | "up-all" | "down-all", index: number, needTrigger = true) => { const current = this.#splitHunksLines?.[index]; if (!current || !current.splitInfo) return; @@ -1197,7 +1197,19 @@ export class DiffFile { plainText: `@@ -${current.splitInfo.oldStartIndex},${current.splitInfo.oldLength} +${current.splitInfo.newStartIndex},${current.splitInfo.newLength}`, }; } - } else { + } else if (dir === "down-all") { + for (let i = current.splitInfo.startHiddenIndex; i < current.splitInfo.endHiddenIndex; i++) { + const leftLine = this.#splitLeftLines[i]; + const rightLine = this.#splitRightLines[i]; + if (leftLine?.isHidden) leftLine.isHidden = false; + if (rightLine?.isHidden) rightLine.isHidden = false; + } + current.splitInfo = { + ...current.splitInfo, + plainText: "", + startHiddenIndex: current.splitInfo.endHiddenIndex, + }; + } else if (dir === "up") { if (current.isLast) { if (__DEV__) { console.error("the last hunk can not expand up!"); @@ -1226,6 +1238,28 @@ export class DiffFile { delete this.#splitHunksLines?.[index]; + this.#splitHunksLines![current.splitInfo.endHiddenIndex] = current; + } else if (dir === "up-all") { + if (current.isLast) { + if (__DEV__) { + console.error("the last hunk can not expand up!"); + } + return; + } + for (let i = current.splitInfo.startHiddenIndex; i < current.splitInfo.endHiddenIndex; i++) { + const leftLine = this.#splitLeftLines[i]; + const rightLine = this.#splitRightLines[i]; + if (leftLine?.isHidden) leftLine.isHidden = false; + if (rightLine?.isHidden) rightLine.isHidden = false; + } + current.splitInfo = { + ...current.splitInfo, + plainText: "", + endHiddenIndex: current.splitInfo.startHiddenIndex, + }; + + delete this.#splitHunksLines?.[index]; + this.#splitHunksLines![current.splitInfo.endHiddenIndex] = current; } @@ -1259,7 +1293,7 @@ export class DiffFile { }; // TODO! support rollback? - onUnifiedHunkExpand = (dir: "up" | "down" | "all", index: number, needTrigger = true) => { + onUnifiedHunkExpand = (dir: "up" | "down" | "all" | "up-all" | "down-all", index: number, needTrigger = true) => { if (this.#composeByDiff) return; const current = this.#unifiedHunksLines?.[index]; @@ -1296,7 +1330,17 @@ export class DiffFile { plainText: `@@ -${current.unifiedInfo.oldStartIndex},${current.unifiedInfo.oldLength} +${current.unifiedInfo.newStartIndex},${current.unifiedInfo.newLength}`, }; } - } else { + } else if (dir === "down-all") { + for (let i = current.unifiedInfo.startHiddenIndex; i < current.unifiedInfo.endHiddenIndex; i++) { + const unifiedLine = this.#unifiedLines[i]; + if (unifiedLine?.isHidden) unifiedLine.isHidden = false; + } + current.unifiedInfo = { + ...current.unifiedInfo, + plainText: "", + startHiddenIndex: current.unifiedInfo.endHiddenIndex, + }; + } else if (dir === "up") { if (current.isLast) { if (__DEV__) { console.error("the last hunk can not expand up!"); @@ -1323,6 +1367,26 @@ export class DiffFile { delete this.#unifiedHunksLines?.[index]; + this.#unifiedHunksLines![current.unifiedInfo.endHiddenIndex] = current; + } else if (dir === "up-all") { + if (current.isLast) { + if (__DEV__) { + console.error("the last hunk can not expand up!"); + } + return; + } + for (let i = current.unifiedInfo.startHiddenIndex; i < current.unifiedInfo.endHiddenIndex; i++) { + const unifiedLine = this.#unifiedLines[i]; + if (unifiedLine?.isHidden) unifiedLine.isHidden = false; + } + current.unifiedInfo = { + ...current.unifiedInfo, + plainText: "", + endHiddenIndex: current.unifiedInfo.startHiddenIndex, + }; + + delete this.#unifiedHunksLines?.[index]; + this.#unifiedHunksLines![current.unifiedInfo.endHiddenIndex] = current; } diff --git a/packages/core/src/parse/diff-parse.ts b/packages/core/src/parse/diff-parse.ts index 9ef2351..5fbc1ac 100644 --- a/packages/core/src/parse/diff-parse.ts +++ b/packages/core/src/parse/diff-parse.ts @@ -336,7 +336,7 @@ export class DiffParser { while ((c = this.parseLinePrefix(this.peek()))) { const line = this.readLine(false); - if (!line) { + if (line === null) { throw new Error("Expected unified diff line but reached end of diff"); } diff --git a/packages/file/index.d.ts b/packages/file/index.d.ts index ac95b2c..fe11aaa 100644 --- a/packages/file/index.d.ts +++ b/packages/file/index.d.ts @@ -124,12 +124,12 @@ export declare class DiffFile { getSplitLineIndexByLineNumber: (lineNumber: number, side: SplitSide) => number; getSplitRightLine: (index: number) => SplitLineItem; getSplitHunkLine: (index: number) => DiffHunkItem; - onSplitHunkExpand: (dir: "up" | "down" | "all", index: number, needTrigger?: boolean) => void; + onSplitHunkExpand: (dir: "up" | "down" | "all" | "up-all" | "down-all", index: number, needTrigger?: boolean) => void; getUnifiedLine: (index: number) => UnifiedLineItem; getUnifiedLineByLineNumber: (lienNumber: number, side: SplitSide) => UnifiedLineItem; getUnifiedLineIndexByLineNumber: (lineNumber: number, side: SplitSide) => number; getUnifiedHunkLine: (index: number) => DiffHunkItem; - onUnifiedHunkExpand: (dir: "up" | "down" | "all", index: number, needTrigger?: boolean) => void; + onUnifiedHunkExpand: (dir: "up" | "down" | "all" | "up-all" | "down-all", index: number, needTrigger?: boolean) => void; onAllExpand: (mode: "split" | "unified") => void; get hasExpandSplitAll(): boolean; get hasExpandUnifiedAll(): boolean; diff --git a/packages/file/package.json b/packages/file/package.json index 3bd3e4f..1a982b6 100644 --- a/packages/file/package.json +++ b/packages/file/package.json @@ -53,7 +53,7 @@ "diff parse" ], "dependencies": { - "@git-diff-view/core": "^0.0.35", + "@git-diff-view/core": "^0.0.36", "diff": "^8.0.2", "highlight.js": "^11.11.0", "lowlight": "^3.3.0", diff --git a/packages/react/index.d.ts b/packages/react/index.d.ts index 21011ac..ab8b963 100644 --- a/packages/react/index.d.ts +++ b/packages/react/index.d.ts @@ -124,12 +124,12 @@ export declare class DiffFile { getSplitLineIndexByLineNumber: (lineNumber: number, side: SplitSide) => number; getSplitRightLine: (index: number) => SplitLineItem; getSplitHunkLine: (index: number) => DiffHunkItem; - onSplitHunkExpand: (dir: "up" | "down" | "all", index: number, needTrigger?: boolean) => void; + onSplitHunkExpand: (dir: "up" | "down" | "all" | "up-all" | "down-all", index: number, needTrigger?: boolean) => void; getUnifiedLine: (index: number) => UnifiedLineItem; getUnifiedLineByLineNumber: (lienNumber: number, side: SplitSide) => UnifiedLineItem; getUnifiedLineIndexByLineNumber: (lineNumber: number, side: SplitSide) => number; getUnifiedHunkLine: (index: number) => DiffHunkItem; - onUnifiedHunkExpand: (dir: "up" | "down" | "all", index: number, needTrigger?: boolean) => void; + onUnifiedHunkExpand: (dir: "up" | "down" | "all" | "up-all" | "down-all", index: number, needTrigger?: boolean) => void; onAllExpand: (mode: "split" | "unified") => void; get hasExpandSplitAll(): boolean; get hasExpandUnifiedAll(): boolean; diff --git a/packages/react/package.json b/packages/react/package.json index 14fa54f..662bec2 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -67,7 +67,7 @@ "react diff component" ], "dependencies": { - "@git-diff-view/core": "^0.0.35", + "@git-diff-view/core": "^0.0.36", "@types/hast": "^3.0.0", "fast-diff": "^1.3.0", "highlight.js": "^11.11.0", diff --git a/packages/solid/index.d.ts b/packages/solid/index.d.ts index 13a7de8..5136873 100644 --- a/packages/solid/index.d.ts +++ b/packages/solid/index.d.ts @@ -124,12 +124,12 @@ export declare class DiffFile { getSplitLineIndexByLineNumber: (lineNumber: number, side: SplitSide) => number; getSplitRightLine: (index: number) => SplitLineItem; getSplitHunkLine: (index: number) => DiffHunkItem; - onSplitHunkExpand: (dir: "up" | "down" | "all", index: number, needTrigger?: boolean) => void; + onSplitHunkExpand: (dir: "up" | "down" | "all" | "up-all" | "down-all", index: number, needTrigger?: boolean) => void; getUnifiedLine: (index: number) => UnifiedLineItem; getUnifiedLineByLineNumber: (lienNumber: number, side: SplitSide) => UnifiedLineItem; getUnifiedLineIndexByLineNumber: (lineNumber: number, side: SplitSide) => number; getUnifiedHunkLine: (index: number) => DiffHunkItem; - onUnifiedHunkExpand: (dir: "up" | "down" | "all", index: number, needTrigger?: boolean) => void; + onUnifiedHunkExpand: (dir: "up" | "down" | "all" | "up-all" | "down-all", index: number, needTrigger?: boolean) => void; onAllExpand: (mode: "split" | "unified") => void; get hasExpandSplitAll(): boolean; get hasExpandUnifiedAll(): boolean; diff --git a/packages/solid/package.json b/packages/solid/package.json index e2e8542..6fe689e 100644 --- a/packages/solid/package.json +++ b/packages/solid/package.json @@ -41,7 +41,7 @@ "solid diff component" ], "dependencies": { - "@git-diff-view/core": "^0.0.35", + "@git-diff-view/core": "^0.0.36", "@types/hast": "^3.0.0", "highlight.js": "^11.11.0", "lowlight": "^3.3.0", diff --git a/packages/svelte/package.json b/packages/svelte/package.json index dc965bc..a06b16d 100644 --- a/packages/svelte/package.json +++ b/packages/svelte/package.json @@ -35,7 +35,7 @@ "./package.json": "./package.json" }, "dependencies": { - "@git-diff-view/core": "^0.0.35", + "@git-diff-view/core": "^0.0.36", "@types/hast": "^3.0.0", "highlight.js": "^11.11.0", "lowlight": "^3.3.0", diff --git a/packages/vue/index.d.ts b/packages/vue/index.d.ts index 21daeb2..db1ab1a 100644 --- a/packages/vue/index.d.ts +++ b/packages/vue/index.d.ts @@ -124,12 +124,12 @@ export declare class DiffFile { getSplitLineIndexByLineNumber: (lineNumber: number, side: SplitSide) => number; getSplitRightLine: (index: number) => SplitLineItem; getSplitHunkLine: (index: number) => DiffHunkItem; - onSplitHunkExpand: (dir: "up" | "down" | "all", index: number, needTrigger?: boolean) => void; + onSplitHunkExpand: (dir: "up" | "down" | "all" | "up-all" | "down-all", index: number, needTrigger?: boolean) => void; getUnifiedLine: (index: number) => UnifiedLineItem; getUnifiedLineByLineNumber: (lienNumber: number, side: SplitSide) => UnifiedLineItem; getUnifiedLineIndexByLineNumber: (lineNumber: number, side: SplitSide) => number; getUnifiedHunkLine: (index: number) => DiffHunkItem; - onUnifiedHunkExpand: (dir: "up" | "down" | "all", index: number, needTrigger?: boolean) => void; + onUnifiedHunkExpand: (dir: "up" | "down" | "all" | "up-all" | "down-all", index: number, needTrigger?: boolean) => void; onAllExpand: (mode: "split" | "unified") => void; get hasExpandSplitAll(): boolean; get hasExpandUnifiedAll(): boolean; diff --git a/packages/vue/package.json b/packages/vue/package.json index b8a58b9..4310aae 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -41,7 +41,7 @@ "vue diff component" ], "dependencies": { - "@git-diff-view/core": "^0.0.35", + "@git-diff-view/core": "^0.0.36", "@types/hast": "^3.0.0", "highlight.js": "^11.11.0", "lowlight": "^3.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a82cef2..a5ff737 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -107,7 +107,7 @@ importers: packages/cli: dependencies: '@git-diff-view/core': - specifier: ^0.0.35 + specifier: ^0.0.36 version: link:../core '@types/hast': specifier: ^3.0.0 @@ -147,7 +147,7 @@ importers: packages/core: dependencies: '@git-diff-view/lowlight': - specifier: ^0.0.35 + specifier: ^0.0.36 version: link:../lowlight fast-diff: specifier: ^1.3.0 @@ -168,7 +168,7 @@ importers: packages/file: dependencies: '@git-diff-view/core': - specifier: ^0.0.35 + specifier: ^0.0.36 version: link:../core diff: specifier: ^8.0.2 @@ -205,7 +205,7 @@ importers: packages/react: dependencies: '@git-diff-view/core': - specifier: ^0.0.35 + specifier: ^0.0.36 version: link:../core '@types/hast': specifier: ^3.0.0 @@ -257,7 +257,7 @@ importers: packages/solid: dependencies: '@git-diff-view/core': - specifier: ^0.0.35 + specifier: ^0.0.36 version: link:../core '@types/hast': specifier: ^3.0.0 @@ -303,7 +303,7 @@ importers: packages/svelte: dependencies: '@git-diff-view/core': - specifier: ^0.0.35 + specifier: ^0.0.36 version: link:../core '@types/hast': specifier: ^3.0.0 @@ -391,7 +391,7 @@ importers: packages/vue: dependencies: '@git-diff-view/core': - specifier: ^0.0.35 + specifier: ^0.0.36 version: link:../core '@types/hast': specifier: ^3.0.0 diff --git a/ui/react-example/package.json b/ui/react-example/package.json index fe6e6e4..3b3ac68 100644 --- a/ui/react-example/package.json +++ b/ui/react-example/package.json @@ -4,7 +4,7 @@ "version": "0.0.0", "type": "module", "scripts": { - "dev": "vite", + "dev": "vite --force", "build": "tsc && vite build", "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "preview": "vite preview"