From ae583aa9845be75580bbd51d9e185ca427e0dfe5 Mon Sep 17 00:00:00 2001
From: MrWangJustToDo <2711470541@qq.com>
Date: Thu, 12 Dec 2024 15:45:41 +0800
Subject: [PATCH 1/5] init
---
packages/angular/package.json | 3 +++
packages/solid/package.json | 3 +++
packages/svelte/package.json | 3 +++
3 files changed, 9 insertions(+)
create mode 100644 packages/angular/package.json
create mode 100644 packages/solid/package.json
create mode 100644 packages/svelte/package.json
diff --git a/packages/angular/package.json b/packages/angular/package.json
new file mode 100644
index 0000000..4f03a06
--- /dev/null
+++ b/packages/angular/package.json
@@ -0,0 +1,3 @@
+{
+ "name": "@git-diff-view/angular"
+}
\ No newline at end of file
diff --git a/packages/solid/package.json b/packages/solid/package.json
new file mode 100644
index 0000000..e004363
--- /dev/null
+++ b/packages/solid/package.json
@@ -0,0 +1,3 @@
+{
+ "name": "@git-diff-view/solid"
+}
\ No newline at end of file
diff --git a/packages/svelte/package.json b/packages/svelte/package.json
new file mode 100644
index 0000000..2b07d19
--- /dev/null
+++ b/packages/svelte/package.json
@@ -0,0 +1,3 @@
+{
+ "name": "@git-diff-view/svelte"
+}
\ No newline at end of file
From 62dda359fbfb2eb113d5276c86da674585c48406 Mon Sep 17 00:00:00 2001
From: MrWangJustToDo <2711470541@qq.com>
Date: Mon, 16 Dec 2024 19:27:08 +0800
Subject: [PATCH 2/5] wip solid
---
packages/solid/package.json | 58 +++++-
packages/solid/postcss.config.js | 32 +++
.../solid/src/components/DiffAddWidget.tsx | 86 ++++++++
packages/solid/src/components/DiffExpand.tsx | 23 +++
packages/solid/src/components/DiffView.tsx | 4 +
packages/solid/src/global.d.ts | 11 +
packages/solid/src/index.ts | 7 +
packages/solid/src/tailwind.css | 124 +++++++++++
packages/solid/tailwind.config.js | 8 +
packages/solid/tsconfig.json | 14 ++
packages/solid/vite.config.ts | 43 ++++
pnpm-lock.yaml | 193 ++++++++++++++++++
12 files changed, 602 insertions(+), 1 deletion(-)
create mode 100644 packages/solid/postcss.config.js
create mode 100644 packages/solid/src/components/DiffAddWidget.tsx
create mode 100644 packages/solid/src/components/DiffExpand.tsx
create mode 100644 packages/solid/src/components/DiffView.tsx
create mode 100644 packages/solid/src/global.d.ts
create mode 100644 packages/solid/src/index.ts
create mode 100644 packages/solid/src/tailwind.css
create mode 100644 packages/solid/tailwind.config.js
create mode 100644 packages/solid/tsconfig.json
create mode 100644 packages/solid/vite.config.ts
diff --git a/packages/solid/package.json b/packages/solid/package.json
index e004363..7ee033e 100644
--- a/packages/solid/package.json
+++ b/packages/solid/package.json
@@ -1,3 +1,59 @@
{
- "name": "@git-diff-view/solid"
+ "name": "@git-diff-view/solid",
+ "description": "@git-diff-view/solid",
+ "author": "MrWangJustToDo",
+ "license": "MIT",
+ "version": "0.0.23",
+ "main": "index.js",
+ "type": "module",
+ "types": "index.d.ts",
+ "files": [
+ "dist",
+ "index.cjs",
+ "index.d.ts"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/MrWangJustToDo/git-diff-view.git",
+ "directory": "packages/solid"
+ },
+ "scripts": {
+ "build": "vite build",
+ "gen:type": "dts-bundle-generator -o index.d.ts dist/index.d.ts"
+ },
+ "homepage": "https://mrwangjusttodo.github.io/git-diff-view",
+ "exports": {
+ ".": {
+ "require": "./index.cjs",
+ "types": "./index.d.ts",
+ "import": "./dist/vue-git-diff-view.mjs"
+ },
+ "./styles/*": "./dist/css/*",
+ "./package.json": "./package.json"
+ },
+ "keywords": [
+ "diff component",
+ "solid diff component"
+ ],
+ "dependencies": {
+ "@git-diff-view/utils": "^0.0.23",
+ "@git-diff-view/core": "^0.0.23",
+ "@types/hast": "^3.0.0",
+ "highlight.js": "^11.10.0",
+ "lowlight": "^3.2.0",
+ "fast-diff": "^1.3.0"
+ },
+ "devDependencies": {
+ "@rollup/plugin-typescript": "^11.1.6",
+ "solid-js": "^1.9.0",
+ "vite-plugin-solid": "^2.11.0",
+ "autoprefixer": "^10.4.20",
+ "postcss": "^8.4.47",
+ "tailwindcss": "^3.4.14",
+ "vite": "^5.4.10",
+ "vite-plugin-dts": "^3.9.1"
+ },
+ "peerDependencies": {
+ "solid-js": "^1.9.0"
+ }
}
\ No newline at end of file
diff --git a/packages/solid/postcss.config.js b/packages/solid/postcss.config.js
new file mode 100644
index 0000000..c917e1b
--- /dev/null
+++ b/packages/solid/postcss.config.js
@@ -0,0 +1,32 @@
+export default {
+ plugins: {
+ tailwindcss: { config: "./tailwind.config.js" },
+ "postcss-prefix-selector": {
+ prefix: ".diff-tailwindcss-wrapper",
+ transform: function (prefix, selector, prefixedSelector, _filePath, rule) {
+ const filePath = rule.source?.input?.file;
+ // ignore base css
+ // TODO next release update
+ if (rule.source?.start?.line === 1 && rule.source?.start?.column === 1) {
+ return selector;
+ }
+ if (selector.includes("diff-line-extend-wrapper") || selector.includes("diff-line-widget-wrapper")) {
+ return selector;
+ }
+ if (selector.includes("[data-theme")) {
+ return prefix + selector;
+ }
+ if (filePath.includes("node_modules")) {
+ if (filePath.includes("dark.css")) {
+ return `${prefix}[data-theme="dark"] .diff-line-syntax-raw ${selector}`;
+ } else {
+ return `${prefix}[data-theme="light"] .diff-line-syntax-raw ${selector}`;
+ }
+ } else {
+ return prefixedSelector;
+ }
+ },
+ },
+ autoprefixer: {},
+ },
+};
diff --git a/packages/solid/src/components/DiffAddWidget.tsx b/packages/solid/src/components/DiffAddWidget.tsx
new file mode 100644
index 0000000..fd7a428
--- /dev/null
+++ b/packages/solid/src/components/DiffAddWidget.tsx
@@ -0,0 +1,86 @@
+import { diffFontSizeName, addWidgetColorName, addWidgetBGName } from "@git-diff-view/utils";
+
+import { type SplitSide } from "./DiffView";
+
+import type { DiffFile } from "@git-diff-view/core";
+
+export const DiffSplitAddWidget = ({
+ side,
+ className,
+ lineNumber,
+ onWidgetClick,
+ onOpenAddWidget,
+}: {
+ index: number;
+ className?: string;
+ lineNumber: number;
+ diffFile: DiffFile;
+ side: SplitSide;
+ onOpenAddWidget: (lineNumber: number, side: SplitSide) => void;
+ onWidgetClick?: (event: "onAddWidgetClick", lineNumber: number, side: SplitSide) => void;
+}) => {
+ return (
+
+
+
+ );
+};
+
+export const DiffUnifiedAddWidget = ({
+ lineNumber,
+ side,
+ onWidgetClick,
+ onOpenAddWidget,
+}: {
+ index: number;
+ diffFile: DiffFile;
+ lineNumber: number;
+ side: SplitSide;
+ onOpenAddWidget: (lineNumber: number, side: SplitSide) => void;
+ onWidgetClick?: (event: "onAddWidgetClick", lineNumber: number, side: SplitSide) => void;
+}) => {
+ return (
+
+
+
+ );
+};
diff --git a/packages/solid/src/components/DiffExpand.tsx b/packages/solid/src/components/DiffExpand.tsx
new file mode 100644
index 0000000..87aa105
--- /dev/null
+++ b/packages/solid/src/components/DiffExpand.tsx
@@ -0,0 +1,23 @@
+export const ExpandDown = ({ className }: { className: string }) => {
+ return (
+
+ );
+};
+
+export const ExpandUp = ({ className }: { className?: string }) => {
+ return (
+
+ );
+};
+
+export const ExpandAll = ({ className }: { className?: string }) => {
+ return (
+
+ );
+};
diff --git a/packages/solid/src/components/DiffView.tsx b/packages/solid/src/components/DiffView.tsx
new file mode 100644
index 0000000..4b44f0d
--- /dev/null
+++ b/packages/solid/src/components/DiffView.tsx
@@ -0,0 +1,4 @@
+export enum SplitSide {
+ old = 1,
+ new = 2,
+}
\ No newline at end of file
diff --git a/packages/solid/src/global.d.ts b/packages/solid/src/global.d.ts
new file mode 100644
index 0000000..1de7eae
--- /dev/null
+++ b/packages/solid/src/global.d.ts
@@ -0,0 +1,11 @@
+declare global {
+ const __VERSION__: string;
+
+ namespace NodeJS {
+ interface ProcessEnv {
+ NODE_ENV: "development" | "production" | "test";
+ }
+ }
+}
+
+export {};
diff --git a/packages/solid/src/index.ts b/packages/solid/src/index.ts
new file mode 100644
index 0000000..37d8547
--- /dev/null
+++ b/packages/solid/src/index.ts
@@ -0,0 +1,7 @@
+import "highlight.js/styles/github.css";
+import "highlight.js/styles/github-dark.css";
+import "./tailwind.css";
+
+export * from "./components/DiffView";
+
+export * from "@git-diff-view/core";
\ No newline at end of file
diff --git a/packages/solid/src/tailwind.css b/packages/solid/src/tailwind.css
new file mode 100644
index 0000000..2db0027
--- /dev/null
+++ b/packages/solid/src/tailwind.css
@@ -0,0 +1,124 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+[data-theme="light"] .diff-style-root {
+ --diff-border--: #dedede;
+ --diff-add-content--: #e6ffec;
+ --diff-del-content--: #ffebe9;
+ --diff-add-lineNumber--: #ccffd8;
+ --diff-del-lineNumber--: #ffd7d5;
+ --diff-plain-content--: #ffffff;
+ --diff-expand-content--: #fafafa;
+ --diff-plain-lineNumber--: #fafafa;
+ --diff-plain-lineNumber-color--: #555555;
+ --diff-hunk-content--: #ddf4ff;
+ --diff-hunk-lineNumber--: #c7ecff;
+ --diff-hunk-lineNumber-hover--: #9dc4f8;
+ --diff-add-content-highlight--: #abf2bc;
+ --diff-del-content-highlight--: #ffb3ad;
+ --diff-add-widget--: #0969d2;
+ --diff-add-widget-color--: #ffffff;
+ --diff-empty-content--: #fafafa;
+ --diff-hunk-content-color--: #777777;
+
+ color: black;
+}
+
+.diff-style-root .diff-line-syntax-raw *,
+[data-theme="light"] .diff-line-syntax-raw * {
+ color: var(--diff-view-light, inherit);
+ font-weight: var(--diff-view-light-font-weight, inherit);
+}
+
+[data-theme="dark"] .diff-style-root {
+ --diff-border--: #3d444d;
+ --diff-add-content--: #14261f;
+ --diff-del-content--: #311b1f;
+ --diff-add-lineNumber--: #1f4429;
+ --diff-del-lineNumber--: #552527;
+ --diff-plain-content--: #0d1117;
+ --diff-expand-content--: #161b22;
+ --diff-plain-lineNumber--: #161b22;
+ --diff-plain-lineNumber-color--: #a0aaab;
+ --diff-hunk-content--: #131d2e;
+ --diff-hunk-lineNumber--: #204274;
+ --diff-hunk-lineNumber-hover--: #386de3;
+ --diff-add-content-highlight--: #1f572d;
+ --diff-del-content-highlight--: #80312f;
+ --diff-add-widget--: #0969d2;
+ --diff-add-widget-color--: #ffffff;
+ --diff-empty-content--: #161b22;
+ --diff-hunk-content-color--: #9298a0;
+
+ color: white;
+}
+
+[data-theme="dark"] .diff-line-syntax-raw * {
+ color: var(--diff-view-dark, inherit);
+ font-weight: var(--diff-view-dark-font-weight, inherit);
+}
+
+table,
+tr,
+td {
+ border-color: transparent;
+ border-width: 0px;
+}
+
+.diff-style-root tr {
+ content-visibility: auto;
+}
+
+.diff-widget-tooltip {
+ position: relative;
+}
+
+.diff-widget-tooltip::after {
+ display: none;
+ box-sizing: border-box;
+ background-color: #555555;
+ position: absolute;
+ content: attr(data-title);
+ font-size: 11px;
+ padding: 1px 2px;
+ border-radius: 4px;
+ overflow: hidden;
+ top: 50%;
+ white-space: nowrap;
+ transform: translateY(-50%);
+ left: calc(100% + 8px);
+ color: #ffffff;
+}
+
+.diff-widget-tooltip::before {
+ display: none;
+ box-sizing: border-box;
+ content: "";
+ position: absolute;
+ top: 50%;
+ left: calc(100% - 2px);
+ transform: translateY(-50%);
+ border: 6px solid transparent;
+ border-right-color: #555555;
+}
+
+.diff-widget-tooltip:hover {
+ background-color: var(--diff-hunk-lineNumber-hover--);
+}
+
+.diff-widget-tooltip:hover::before {
+ display: block;
+}
+
+.diff-widget-tooltip:hover::after {
+ display: block;
+}
+
+.diff-line-extend-wrapper * {
+ color: initial;
+}
+
+.diff-line-widget-wrapper * {
+ color: initial;
+}
diff --git a/packages/solid/tailwind.config.js b/packages/solid/tailwind.config.js
new file mode 100644
index 0000000..614c86b
--- /dev/null
+++ b/packages/solid/tailwind.config.js
@@ -0,0 +1,8 @@
+/** @type {import('tailwindcss').Config} */
+export default {
+ content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"],
+ theme: {
+ extend: {},
+ },
+ plugins: [],
+};
diff --git a/packages/solid/tsconfig.json b/packages/solid/tsconfig.json
new file mode 100644
index 0000000..7fafd44
--- /dev/null
+++ b/packages/solid/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "compilerOptions": {
+ "strict": true,
+ "rootDir": "src",
+ "target": "ESNext",
+ "module": "ESNext",
+ "moduleResolution": "Bundler",
+ "allowSyntheticDefaultImports": true,
+ "jsx": "preserve",
+ "jsxImportSource": "solid-js",
+ },
+ "include": ["./src"],
+ "exclude": ["node_modules"]
+}
diff --git a/packages/solid/vite.config.ts b/packages/solid/vite.config.ts
new file mode 100644
index 0000000..753cf0d
--- /dev/null
+++ b/packages/solid/vite.config.ts
@@ -0,0 +1,43 @@
+import typescript from "@rollup/plugin-typescript";
+import * as path from "path";
+import { defineConfig } from "vite";
+import dts from "vite-plugin-dts";
+import solidPlugin from "vite-plugin-solid";
+
+import pkg from "./package.json";
+
+export default defineConfig({
+ plugins: [
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ // @ts-ignore
+ typescript({ tsconfig: "./tsconfig.json" }),
+ solidPlugin(),
+ dts(),
+ ],
+ server: {
+ port: 3000,
+ },
+ build: {
+ lib: {
+ entry: path.resolve(__dirname, "src/index.withStyle.ts"),
+ name: "GitDiffView",
+ formats: ["es", "cjs"],
+ fileName: (format) =>
+ format === "cjs"
+ ? `solid-git-diff-view.cjs`
+ : format === "es"
+ ? `solid-git-diff-view.mjs`
+ : `solid-git-diff-view.js`,
+ },
+ sourcemap: true,
+ rollupOptions: {
+ external: ["solid-js", "@git-diff-view/core"],
+ output: {
+ assetFileNames: "css/diff-view.css",
+ },
+ },
+ },
+ define: {
+ __VERSION__: JSON.stringify(pkg.version),
+ },
+});
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 6748483..008685c 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -75,6 +75,8 @@ importers:
specifier: 5.3.3
version: 5.3.3
+ packages/angular: {}
+
packages/core:
dependencies:
'@git-diff-view/lowlight':
@@ -189,6 +191,54 @@ importers:
specifier: ^1.24.0
version: 1.24.0
+ packages/solid:
+ dependencies:
+ '@git-diff-view/core':
+ specifier: ^0.0.23
+ version: link:../core
+ '@git-diff-view/utils':
+ specifier: ^0.0.23
+ version: link:../utils
+ '@types/hast':
+ specifier: ^3.0.0
+ version: 3.0.4
+ fast-diff:
+ specifier: ^1.3.0
+ version: 1.3.0
+ highlight.js:
+ specifier: ^11.10.0
+ version: 11.10.0
+ lowlight:
+ specifier: ^3.2.0
+ version: 3.2.0
+ devDependencies:
+ '@rollup/plugin-typescript':
+ specifier: ^11.1.6
+ version: 11.1.6(rollup@4.24.3)(tslib@2.8.0)(typescript@5.4.2)
+ autoprefixer:
+ specifier: ^10.4.20
+ version: 10.4.20(postcss@8.4.47)
+ postcss:
+ specifier: ^8.4.47
+ version: 8.4.47
+ solid-js:
+ specifier: ^1.9.0
+ version: 1.9.3
+ tailwindcss:
+ specifier: ^3.4.14
+ version: 3.4.14(ts-node@10.9.2(@swc/core@1.7.42(@swc/helpers@0.5.13))(@types/node@22.10.1)(typescript@5.4.2))
+ vite:
+ specifier: ^5.4.10
+ version: 5.4.10(@types/node@22.10.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.27.0)
+ vite-plugin-dts:
+ specifier: ^3.9.1
+ version: 3.9.1(@types/node@22.10.1)(rollup@4.24.3)(typescript@5.4.2)(vite@5.4.10(@types/node@22.10.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.27.0))
+ vite-plugin-solid:
+ specifier: ^2.11.0
+ version: 2.11.0(solid-js@1.9.3)(vite@5.4.10(@types/node@22.10.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.27.0))
+
+ packages/svelte: {}
+
packages/utils: {}
packages/vue:
@@ -583,6 +633,10 @@ packages:
resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-module-imports@7.18.6':
+ resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-module-imports@7.22.15':
resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==}
engines: {node: '>=6.9.0'}
@@ -2116,6 +2170,16 @@ packages:
resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
engines: {node: '>= 0.4'}
+ babel-plugin-jsx-dom-expressions@0.39.3:
+ resolution: {integrity: sha512-6RzmSu21zYPlV2gNwzjGG9FgODtt9hIWnx7L//OIioIEuRcnpDZoY8Tr+I81Cy1SrH4qoDyKpwHHo6uAMAeyPA==}
+ peerDependencies:
+ '@babel/core': ^7.20.12
+
+ babel-preset-solid@1.9.3:
+ resolution: {integrity: sha512-jvlx5wDp8s+bEF9sGFw/84SInXOA51ttkUEroQziKMbxplXThVKt83qB6bDTa1HuLNatdU9FHpFOiQWs1tLQIg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
@@ -3152,6 +3216,9 @@ packages:
resolution: {integrity: sha512-SYVnVFswQER+zu1laSya563s+F8VDGt7o35d4utbamowvUNLLMovFqwCLSocpZTz3MgaSRA1IbqRWZv97dtErQ==}
engines: {node: '>=12.0.0'}
+ html-entities@2.3.3:
+ resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==}
+
html-tags@3.3.1:
resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
engines: {node: '>=8'}
@@ -3373,6 +3440,10 @@ packages:
is-weakset@2.0.2:
resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==}
+ is-what@4.1.16:
+ resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==}
+ engines: {node: '>=12.13'}
+
isarray@2.0.5:
resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
@@ -3572,6 +3643,10 @@ packages:
resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==}
engines: {node: '>=18'}
+ merge-anything@5.1.7:
+ resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==}
+ engines: {node: '>=12.13'}
+
merge-descriptors@2.0.0:
resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==}
engines: {node: '>=18'}
@@ -3818,6 +3893,9 @@ packages:
resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
engines: {node: '>=8'}
+ parse5@7.2.1:
+ resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==}
+
parseurl@1.3.3:
resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
engines: {node: '>= 0.8'}
@@ -4597,6 +4675,16 @@ packages:
serialize-javascript@6.0.2:
resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
+ seroval-plugins@1.1.1:
+ resolution: {integrity: sha512-qNSy1+nUj7hsCOon7AO4wdAIo9P0jrzAMp18XhiOzA6/uO5TKtP7ScozVJ8T293oRIvi5wyCHSM4TrJo/c/GJA==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ seroval: ^1.0
+
+ seroval@1.1.1:
+ resolution: {integrity: sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==}
+ engines: {node: '>=10'}
+
serve-static@2.1.0:
resolution: {integrity: sha512-A3We5UfEjG8Z7VkDv6uItWw6HY2bBSBJT1KtVESn6EOoOr2jAxNhxWCLY3jDE2WcuHXByWju74ck3ZgLwL8xmA==}
engines: {node: '>= 18'}
@@ -4657,6 +4745,14 @@ packages:
smob@1.4.1:
resolution: {integrity: sha512-9LK+E7Hv5R9u4g4C3p+jjLstaLe11MDsL21UpYaCNmapvMkYhqCV4A/f/3gyH8QjMyh6l68q9xC85vihY9ahMQ==}
+ solid-js@1.9.3:
+ resolution: {integrity: sha512-5ba3taPoZGt9GY3YlsCB24kCg0Lv/rie/HTD4kG6h4daZZz7+yK02xn8Vx8dLYBc9i6Ps5JwAbEiqjmKaLB3Ag==}
+
+ solid-refresh@0.6.3:
+ resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==}
+ peerDependencies:
+ solid-js: ^1.3
+
sonic-boom@4.0.1:
resolution: {integrity: sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==}
@@ -5149,6 +5245,9 @@ packages:
v8-compile-cache-lib@3.0.1:
resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
+ validate-html-nesting@1.2.2:
+ resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==}
+
validator@13.11.0:
resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==}
engines: {node: '>= 0.10'}
@@ -5173,6 +5272,16 @@ packages:
vite:
optional: true
+ vite-plugin-solid@2.11.0:
+ resolution: {integrity: sha512-G+NiwDj4EAeUE0wt3Ur9f+Lt9oMUuLd0FIxYuqwJSqRacKQRteCwUFzNy8zMEt88xWokngQhiFjfJMhjc1fDXw==}
+ peerDependencies:
+ '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.*
+ solid-js: ^1.7.2
+ vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0
+ peerDependenciesMeta:
+ '@testing-library/jest-dom':
+ optional: true
+
vite-tsconfig-paths@5.0.1:
resolution: {integrity: sha512-yqwv+LstU7NwPeNqajZzLEBVpUFU6Dugtb2P84FXuvaoYA+/70l9MHE+GYfYAycVyPSDYZ7mjOFuYBRqlEpTig==}
peerDependencies:
@@ -5212,6 +5321,14 @@ packages:
terser:
optional: true
+ vitefu@1.0.4:
+ resolution: {integrity: sha512-y6zEE3PQf6uu/Mt6DTJ9ih+kyJLr4XcSgHR2zUkM8SWDhuixEJxfJ6CZGMHh1Ec3vPLoEA0IHU5oWzVqw8ulow==}
+ peerDependencies:
+ vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0
+ peerDependenciesMeta:
+ vite:
+ optional: true
+
vue-template-compiler@2.7.16:
resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==}
@@ -5440,6 +5557,10 @@ snapshots:
dependencies:
'@babel/types': 7.23.9
+ '@babel/helper-module-imports@7.18.6':
+ dependencies:
+ '@babel/types': 7.25.6
+
'@babel/helper-module-imports@7.22.15':
dependencies:
'@babel/types': 7.23.9
@@ -5555,6 +5676,11 @@ snapshots:
'@babel/core': 7.23.9
'@babel/helper-plugin-utils': 7.22.5
+ '@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.25.2)':
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.22.5
+
'@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.9)':
dependencies:
'@babel/core': 7.23.9
@@ -7075,6 +7201,21 @@ snapshots:
axobject-query@4.1.0: {}
+ babel-plugin-jsx-dom-expressions@0.39.3(@babel/core@7.25.2):
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-module-imports': 7.18.6
+ '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.25.2)
+ '@babel/types': 7.25.6
+ html-entities: 2.3.3
+ parse5: 7.2.1
+ validate-html-nesting: 1.2.2
+
+ babel-preset-solid@1.9.3(@babel/core@7.25.2):
+ dependencies:
+ '@babel/core': 7.25.2
+ babel-plugin-jsx-dom-expressions: 0.39.3(@babel/core@7.25.2)
+
balanced-match@1.0.2: {}
balanced-match@2.0.0: {}
@@ -8379,6 +8520,8 @@ snapshots:
highlight.js@11.10.0: {}
+ html-entities@2.3.3: {}
+
html-tags@3.3.1: {}
html-void-elements@3.0.0: {}
@@ -8576,6 +8719,8 @@ snapshots:
call-bind: 1.0.7
get-intrinsic: 1.2.4
+ is-what@4.1.16: {}
+
isarray@2.0.5: {}
isexe@2.0.0: {}
@@ -8750,6 +8895,10 @@ snapshots:
meow@13.2.0: {}
+ merge-anything@5.1.7:
+ dependencies:
+ is-what: 4.1.16
+
merge-descriptors@2.0.0: {}
merge2@1.4.1: {}
@@ -8983,6 +9132,10 @@ snapshots:
json-parse-even-better-errors: 2.3.1
lines-and-columns: 1.2.4
+ parse5@7.2.1:
+ dependencies:
+ entities: 4.5.0
+
parseurl@1.3.3: {}
path-browserify@1.0.1: {}
@@ -9808,6 +9961,12 @@ snapshots:
dependencies:
randombytes: 2.1.0
+ seroval-plugins@1.1.1(seroval@1.1.1):
+ dependencies:
+ seroval: 1.1.1
+
+ seroval@1.1.1: {}
+
serve-static@2.1.0:
dependencies:
encodeurl: 2.0.0
@@ -9909,6 +10068,21 @@ snapshots:
smob@1.4.1: {}
+ solid-js@1.9.3:
+ dependencies:
+ csstype: 3.1.3
+ seroval: 1.1.1
+ seroval-plugins: 1.1.1(seroval@1.1.1)
+
+ solid-refresh@0.6.3(solid-js@1.9.3):
+ dependencies:
+ '@babel/generator': 7.25.6
+ '@babel/helper-module-imports': 7.24.7
+ '@babel/types': 7.25.6
+ solid-js: 1.9.3
+ transitivePeerDependencies:
+ - supports-color
+
sonic-boom@4.0.1:
dependencies:
atomic-sleep: 1.0.0
@@ -10604,6 +10778,8 @@ snapshots:
v8-compile-cache-lib@3.0.1: {}
+ validate-html-nesting@1.2.2: {}
+
validator@13.11.0: {}
vary@1.1.2: {}
@@ -10635,6 +10811,19 @@ snapshots:
- rollup
- supports-color
+ vite-plugin-solid@2.11.0(solid-js@1.9.3)(vite@5.4.10(@types/node@22.10.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.27.0)):
+ dependencies:
+ '@babel/core': 7.25.2
+ '@types/babel__core': 7.20.5
+ babel-preset-solid: 1.9.3(@babel/core@7.25.2)
+ merge-anything: 5.1.7
+ solid-js: 1.9.3
+ solid-refresh: 0.6.3(solid-js@1.9.3)
+ vite: 5.4.10(@types/node@22.10.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.27.0)
+ vitefu: 1.0.4(vite@5.4.10(@types/node@22.10.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.27.0))
+ transitivePeerDependencies:
+ - supports-color
+
vite-tsconfig-paths@5.0.1(typescript@5.3.3)(vite@5.4.10(@types/node@22.10.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.27.0)):
dependencies:
debug: 4.3.6
@@ -10657,6 +10846,10 @@ snapshots:
sugarss: 4.0.1(postcss@8.4.47)
terser: 5.27.0
+ vitefu@1.0.4(vite@5.4.10(@types/node@22.10.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.27.0)):
+ optionalDependencies:
+ vite: 5.4.10(@types/node@22.10.1)(sugarss@4.0.1(postcss@8.4.47))(terser@5.27.0)
+
vue-template-compiler@2.7.16:
dependencies:
de-indent: 1.0.2
From 68d9f982cffad009be31f0834a93af858605e3ca Mon Sep 17 00:00:00 2001
From: MrWangJustToDo <2711470541@qq.com>
Date: Tue, 17 Dec 2024 19:58:55 +0800
Subject: [PATCH 3/5] wip.
---
.eslintrc.cjs | 2 +-
packages/solid/.eslintrc.cjs | 5 +
packages/solid/package.json | 1 +
.../solid/src/components/DiffAddWidget.tsx | 28 +--
packages/solid/src/components/DiffContent.tsx | 234 ++++++++++++++++++
packages/solid/src/components/DiffExpand.tsx | 18 +-
.../solid/src/components/DiffNoNewLine.tsx | 8 +
packages/utils/index.d.ts | 2 +-
packages/utils/src/symbol.ts | 2 +-
pnpm-lock.yaml | 131 ++++++++++
scripts/build.ts | 10 +-
11 files changed, 404 insertions(+), 37 deletions(-)
create mode 100644 packages/solid/.eslintrc.cjs
create mode 100644 packages/solid/src/components/DiffContent.tsx
create mode 100644 packages/solid/src/components/DiffNoNewLine.tsx
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
index 1fd5869..d72e069 100644
--- a/.eslintrc.cjs
+++ b/.eslintrc.cjs
@@ -5,5 +5,5 @@ module.exports = {
},
// eslint will auto add `eslint-config` for a no scope package(which not start with '@' chart), so here use absolute file path
extends: [require.resolve("project-tool/baseLint")],
- ignorePatterns: ["dist", "dev", "scripts", "node_modules", "next-app-example", "next-page-example"],
+ ignorePatterns: ["dist", "dev", "scripts", "node_modules", "next-app-example", "next-page-example", "packages/solid"],
};
diff --git a/packages/solid/.eslintrc.cjs b/packages/solid/.eslintrc.cjs
new file mode 100644
index 0000000..e256508
--- /dev/null
+++ b/packages/solid/.eslintrc.cjs
@@ -0,0 +1,5 @@
+module.exports = {
+ plugins: ["solid"],
+ extends: ["../../.eslintrc.cjs", "plugin:solid/typescript"],
+ ignorePatterns: ["dist", "dev", "node_modules"],
+};
diff --git a/packages/solid/package.json b/packages/solid/package.json
index 7ee033e..2c56fd5 100644
--- a/packages/solid/package.json
+++ b/packages/solid/package.json
@@ -48,6 +48,7 @@
"solid-js": "^1.9.0",
"vite-plugin-solid": "^2.11.0",
"autoprefixer": "^10.4.20",
+ "eslint-plugin-solid": "^0.14.5",
"postcss": "^8.4.47",
"tailwindcss": "^3.4.14",
"vite": "^5.4.10",
diff --git a/packages/solid/src/components/DiffAddWidget.tsx b/packages/solid/src/components/DiffAddWidget.tsx
index fd7a428..c23bb16 100644
--- a/packages/solid/src/components/DiffAddWidget.tsx
+++ b/packages/solid/src/components/DiffAddWidget.tsx
@@ -1,16 +1,9 @@
import { diffFontSizeName, addWidgetColorName, addWidgetBGName } from "@git-diff-view/utils";
-import { type SplitSide } from "./DiffView";
-
+import type { SplitSide } from "./DiffView";
import type { DiffFile } from "@git-diff-view/core";
-export const DiffSplitAddWidget = ({
- side,
- className,
- lineNumber,
- onWidgetClick,
- onOpenAddWidget,
-}: {
+export const DiffSplitAddWidget = (props: {
index: number;
className?: string;
lineNumber: number;
@@ -23,7 +16,7 @@ export const DiffSplitAddWidget = ({
{
- onOpenAddWidget(lineNumber, side);
- onWidgetClick?.("onAddWidgetClick", lineNumber, side);
+ props.onOpenAddWidget(props.lineNumber, props.side);
+ props.onWidgetClick?.("onAddWidgetClick", props.lineNumber, props.side);
}}
>
+
@@ -47,12 +40,7 @@ export const DiffSplitAddWidget = ({
);
};
-export const DiffUnifiedAddWidget = ({
- lineNumber,
- side,
- onWidgetClick,
- onOpenAddWidget,
-}: {
+export const DiffUnifiedAddWidget = (props: {
index: number;
diffFile: DiffFile;
lineNumber: number;
@@ -75,8 +63,8 @@ export const DiffUnifiedAddWidget = ({
"background-color": `var(${addWidgetBGName})`,
}}
onClick={() => {
- onOpenAddWidget(lineNumber, side);
- onWidgetClick?.("onAddWidgetClick", lineNumber, side);
+ props.onOpenAddWidget(props.lineNumber, props.side);
+ props.onWidgetClick?.("onAddWidgetClick", props.lineNumber, props.side);
}}
>
+
diff --git a/packages/solid/src/components/DiffContent.tsx b/packages/solid/src/components/DiffContent.tsx
new file mode 100644
index 0000000..973ff18
--- /dev/null
+++ b/packages/solid/src/components/DiffContent.tsx
@@ -0,0 +1,234 @@
+import { DiffLineType, NewLineSymbol, type DiffFile, type DiffLine, type SyntaxLine } from "@git-diff-view/core";
+import {
+ addContentHighlightBGName,
+ delContentHighlightBGName,
+ diffFontSizeName,
+ getSymbol,
+} from "@git-diff-view/utils";
+import { For, Show } from "solid-js";
+
+import { DiffNoNewLine } from "./DiffNoNewLine";
+
+const DiffString = (props: {
+ rawLine: string;
+ diffLine?: DiffLine;
+ operator?: "add" | "del";
+ enableWrap?: boolean;
+}) => {
+ const getRange = () => props.diffLine?.changes?.range;
+
+ const getStr1 = () => props.rawLine.slice(0, getRange?.()?.location);
+
+ const getStr2 = () =>
+ props.rawLine.slice(getRange?.()?.location, (getRange?.()?.location || 0) + (getRange?.()?.length || 0));
+
+ const getStr3 = () => props.rawLine.slice((getRange?.()?.location || 0) + (getRange?.()?.length || 0));
+
+ const getIsLast = () => getStr2().includes("\n");
+
+ const get_Str2 = () => (getIsLast() ? getStr2().replace("\n", "").replace("\r", "") : getStr2());
+
+ const getIsNewLineSymbolChanged = () => (getStr3() === "" ? props.diffLine?.changes?.newLineSymbol : null);
+
+ return (
+
{props.rawLine}}
+ >
+
+
+ {getStr1()}
+
+ {getIsLast() ? `${get_Str2()}${getSymbol(getIsNewLineSymbolChanged())}` : getStr2()}
+
+ {getStr3()}
+
+ {getIsNewLineSymbolChanged() === NewLineSymbol.NEWLINE && (
+
+
+
+ )}
+
+
+ );
+};
+
+const DiffSyntax = (props: {
+ rawLine: string;
+ diffLine?: DiffLine;
+ syntaxLine?: SyntaxLine;
+ operator?: "add" | "del";
+ enableWrap?: boolean;
+}) => {
+ const getRange = () => props.diffLine?.changes?.range;
+
+ const getIsNewLineSymbolChanged = () => props.diffLine?.changes?.newLineSymbol;
+
+ return (
+
}
+ >
+
+
+ {({ node, wrapper }) => (
+
+ {node.value}
+
+ )}
+
+
+ }
+ >
+
+
+
+ {({ node, wrapper }) => {
+ if (
+ node.endIndex < getRange()!.location ||
+ getRange()!.location + getRange()!.length < node.startIndex
+ ) {
+ return (
+
+ {node.value}
+
+ );
+ } else {
+ const index1 = getRange()!.location - node.startIndex;
+ const index2 = index1 < 0 ? 0 : index1;
+ const str1 = node.value.slice(0, index2);
+ const str2 = node.value.slice(index2, index1 + getRange()!.length);
+ const str3 = node.value.slice(index1 + getRange()!.length);
+ const isStart = str1.length || getRange()!.location === node.startIndex;
+ const isEnd = str3.length || node.endIndex === getRange()!.location + getRange()!.length - 1;
+ const isLast = str2.includes("\n");
+ const _str2 = isLast ? str2.replace("\n", "").replace("\r", "") : str2;
+ return (
+
+ {str1}
+
+ {isLast ? `${_str2}${getSymbol(getIsNewLineSymbolChanged())}` : str2}
+
+ {str3}
+
+ );
+ }
+ }}
+
+
+ {getIsNewLineSymbolChanged() === NewLineSymbol.NEWLINE && (
+
+
+
+ )}
+
+
+
+ );
+};
+
+export const DiffContent = (props: {
+ rawLine: string;
+ syntaxLine?: SyntaxLine;
+ diffLine?: DiffLine;
+ diffFile: DiffFile;
+ enableWrap: boolean;
+ enableHighlight: boolean;
+}) => {
+ const getIsAdded = () => props.diffLine?.type === DiffLineType.Add;
+
+ const getIsDelete = () => props.diffLine?.type === DiffLineType.Delete;
+
+ const getIsMaxLineLengthToIgnoreSyntax = () =>
+ props.syntaxLine?.nodeList ? props.syntaxLine?.nodeList?.length > 150 : false;
+
+ return (
+
+
+ {getIsAdded() ? "+" : getIsDelete() ? "-" : " "}
+
+ {props.enableHighlight && props.syntaxLine && !getIsMaxLineLengthToIgnoreSyntax() ? (
+
+ ) : (
+
+ )}
+
+ );
+};
diff --git a/packages/solid/src/components/DiffExpand.tsx b/packages/solid/src/components/DiffExpand.tsx
index 87aa105..b480b9a 100644
--- a/packages/solid/src/components/DiffExpand.tsx
+++ b/packages/solid/src/components/DiffExpand.tsx
@@ -1,23 +1,23 @@
-export const ExpandDown = ({ className }: { className: string }) => {
+export const ExpandDown = (props: { className: string }) => {
return (
-