Giter Club home page Giter Club logo

git-diff-view's Introduction

Git Diff Component

a React/Vue component to show the git diff/file diff result, just like Github code review page.

Deploy

Demo ---- git-diff / file-diff

git-mode

git mode

file-mode

file mode

GitHub compare

GitHub compare

Packages

Package Version
@git-diff-view/core npm (scoped)
@git-diff-view/file npm (scoped)
@git-diff-view/react npm (scoped)
@git-diff-view/vue npm (scoped)

syntax highlighter

Package Version
@git-diff-view/lowlight build in npm (scoped)
@git-diff-view/shiki npm (scoped)

Screen Shot

Screenshot Screenshot Screenshot

Features

  • Show the git diff result
  • Support Split View and Unified View
  • Support Syntax Highlight
  • Support Extend Data to show in the Diff View
  • Support Widget to show in the Diff View
  • Support Web Worker to improve performance
  • Support React and Vue component
  • Support compare by @git-diff-view/core(git diff) or @git-diff-view/file(file content)
  • Support Virtual Scroll to improve performance
  • Support Diff Match Patch to improve line diff

Install

# In React Project
pnpm add @git-diff-view/react
# full type need install
pnpm add -D @git-diff-view/core

# In Vue Project
pnpm add @git-diff-view/vue
# full type need install
pnpm add -D @git-diff-view/core

Use in React

There are two ways to use this component:

1. Use the DiffView component directly.

import { DiffView, DiffModeEnum } from "@git-diff-view/react";
import "@git-diff-view/react/styles/diff-view.css";

<DiffView<string>
  // use data
  data={{
    oldFile?: { fileName?: string | null; fileLang?: string | null; content?: string | null };
    newFile?: { fileName?: string | null; fileLang?: string | null; content?: string | null };
    hunks: string[];
  }}
  extendData={{oldFile: {10: {data: 'foo'}}, newFile: {20: {data: 'bar'}}}}
  renderExtendLine={({ data }) => ReactNode}
  diffViewFontSize={number}
  diffViewHighlight={boolean}
  diffViewMode={DiffModeEnum.Split | DiffModeEnum.Unified}
  diffViewWrap={boolean}
  diffViewAddWidget
  onAddWidgetClick={({ side, lineNumber }) => void}
  renderWidgetLine={({ onClose, side, lineNumber }) => ReactNode}
/>

2. Use the DiffView component with @git-diff-view/core/@git-diff-view/file

// with @git-diff-view/file
import { DiffFile, generateDiffFile } from "@git-diff-view/file";
const file = generateDiffFile(
  data?.oldFile?.fileName || "",
  data?.oldFile?.content || "",
  data?.newFile?.fileName || "",
  data?.newFile?.content || "",
  data?.oldFile?.fileLang || "",
  data?.newFile?.fileLang || ""
);
file.init();
file.buildSplitDiffLines();
file.buildUnifiedDiffLines();

// with @git-diff-view/core
import { DiffFile } from "@git-diff-view/core";
const file = new DiffFile(
  data?.oldFile?.fileName || "",
  data?.oldFile?.content || "",
  data?.newFile?.fileName || "",
  data?.newFile?.content || "",
  data?.hunks || [],
  data?.oldFile?.fileLang || "",
  data?.newFile?.fileLang || ""
);
file.init();
file.buildSplitDiffLines();
file.buildUnifiedDiffLines();

// use current data to render
<DiffView diffFile={file} {...props} />;
// or use the bundle data to render, eg: postMessage/httpRequest
const bundle = file.getBundle();
const diffFile = DiffFile.createInstance(data || {}, bundle);
<DiffView diffFile={diffFile} {...props} />;

Props

Props Description
data The diff data need to show, type: { oldFile: {fileName?: string, content?: string}, newFile: {fileName?: string, content?: string}, hunks: string[] }, you can only pass hunks data, and the component will generate the oldFile and newFile data automatically
diffFile the target data to render
renderWidgetLine return a valid react element to show the widget, this element will render when you click the addWidget button in the diff view
renderExtendLine return a valid react element to show the extend data
extendData a list to store the extend data to show in the Diff View, type: {oldFile: {lineNumber: {data: any}}, newFile: {lineNumber: {data: any}}}
diffViewFontSize the fontSize for the DiffView component, type: number
diffViewHighlight enable syntax highlight, type: boolean
diffViewMode the mode for the DiffView component, type: DiffModeEnum.Split or DiffModeEnum.Unified
diffViewWrap enable code line auto wrap, type: boolean
diffViewAddWidget enable addWidget button, type: boolean
onAddWidgetClick when the addWidget button clicked, type: `({ side: "old"

Use in Vue

Same with the React, see detail

Development

# clone this project

# pnpm install

# pnpm run build:packages

# pnpm run dev:react / pnpm run dev:vue

git-diff-view's People

Contributors

mrwangjusttodo avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.