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 01/12] 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 02/12] 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 03/12] 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 ( -
DiffView
; } \ No newline at end of file diff --git a/packages/solid/src/components/tool.ts b/packages/solid/src/components/tool.ts new file mode 100644 index 0000000..e69de29 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7b50ee4..64c26be 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -486,6 +486,25 @@ importers: specifier: ^5.0.1 version: 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)) + ui/solid-example: + dependencies: + solid-js: + specifier: ^1.9.3 + version: 1.9.3 + devDependencies: + typescript: + specifier: 5.3.3 + version: 5.3.3 + vite: + specifier: ^5.4.10 + version: 5.4.10(@types/node@22.10.1)(sugarss@4.0.1(postcss@8.4.49))(terser@5.27.0) + vite-plugin-inspect: + specifier: ^0.8.9 + version: 0.8.9(rollup@4.24.3)(vite@5.4.10(@types/node@22.10.1)(sugarss@4.0.1(postcss@8.4.49))(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.49))(terser@5.27.0)) + ui/vue-example: dependencies: '@git-diff-view/vue': @@ -571,6 +590,9 @@ packages: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} + '@antfu/utils@0.7.10': + resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + '@babel/code-frame@7.24.7': resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} @@ -1448,6 +1470,15 @@ packages: rollup: optional: true + '@rollup/pluginutils@5.1.4': + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/rollup-android-arm-eabi@4.21.2': resolution: {integrity: sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==} cpu: [arm] @@ -2260,6 +2291,10 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -2580,10 +2615,22 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -2719,6 +2766,9 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-stack-parser-es@0.1.5: + resolution: {integrity: sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==} + es-abstract@1.23.3: resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} engines: {node: '>= 0.4'} @@ -3403,6 +3453,11 @@ packages: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -3426,6 +3481,11 @@ packages: resolution: {integrity: sha512-S+OpgB5i7wzIue/YSE5hg0e5ZYfG3hhpNh9KGl6ayJ38p7ED6wxQLd1TV91xHpcTvw90KMJ9EwN3F/iNflHBVg==} engines: {node: '>=8'} + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + is-map@2.0.2: resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} @@ -3494,6 +3554,10 @@ packages: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -3915,6 +3979,10 @@ packages: oniguruma-to-es@0.7.0: resolution: {integrity: sha512-HRaRh09cE0gRS3+wi2zxekB+I5L8C/gN60S+vb11eADHUaB/q4u8wGGOX3GvwvitG8ixaeycZfeoyruKQzUgNg==} + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -3997,6 +4065,9 @@ packages: resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} engines: {node: '>=12'} + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -4690,6 +4761,10 @@ packages: resolution: {integrity: sha512-dIM5zVoG8xhC6rnSN8uoAgFARwTE7BQs8YwHEvK0VCmfxQXMaOuA1uiR1IPwsW7JyK5iTt7Od/TC9StasS2NPQ==} engines: {node: '>= 0.10'} + run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -5352,6 +5427,16 @@ packages: vite: optional: true + vite-plugin-inspect@0.8.9: + resolution: {integrity: sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': '*' + vite: ^3.1.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.1 + peerDependenciesMeta: + '@nuxt/kit': + optional: true + vite-plugin-solid@2.11.0: resolution: {integrity: sha512-G+NiwDj4EAeUE0wt3Ur9f+Lt9oMUuLd0FIxYuqwJSqRacKQRteCwUFzNy8zMEt88xWokngQhiFjfJMhjc1fDXw==} peerDependencies: @@ -5521,6 +5606,8 @@ snapshots: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.22 + '@antfu/utils@0.7.10': {} + '@babel/code-frame@7.24.7': dependencies: '@babel/highlight': 7.24.7 @@ -6476,6 +6563,14 @@ snapshots: optionalDependencies: rollup: 4.24.3 + '@rollup/pluginutils@5.1.4(rollup@4.24.3)': + dependencies: + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.24.3 + '@rollup/rollup-android-arm-eabi@4.21.2': optional: true @@ -7396,6 +7491,10 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + bundle-name@4.1.0: + dependencies: + run-applescript: 7.0.0 + busboy@1.6.0: dependencies: streamsearch: 1.1.0 @@ -7719,12 +7818,21 @@ snapshots: deepmerge@4.3.1: {} + default-browser-id@5.0.0: {} + + default-browser@5.2.1: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 + define-lazy-prop@3.0.0: {} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 @@ -7834,6 +7942,8 @@ snapshots: dependencies: is-arrayish: 0.2.1 + error-stack-parser-es@0.1.5: {} + es-abstract@1.23.3: dependencies: array-buffer-byte-length: 1.0.1 @@ -8783,6 +8893,8 @@ snapshots: dependencies: has-tostringtag: 1.0.2 + is-docker@3.0.0: {} + is-extglob@2.1.1: {} is-finalizationregistry@1.0.2: @@ -8803,6 +8915,10 @@ snapshots: dependencies: html-tags: 3.3.1 + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + is-map@2.0.2: {} is-module@1.0.0: {} @@ -8861,6 +8977,10 @@ snapshots: is-what@4.1.16: {} + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + isarray@2.0.5: {} isexe@2.0.0: {} @@ -9235,6 +9355,13 @@ snapshots: regex: 5.0.2 regex-recursion: 4.3.0 + open@10.1.0: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 @@ -9307,6 +9434,8 @@ snapshots: path-type@5.0.0: {} + perfect-debounce@1.0.0: {} + picocolors@1.0.0: {} picocolors@1.0.1: {} @@ -10054,6 +10183,8 @@ snapshots: setprototypeof: 1.2.0 utils-merge: 1.0.1 + run-applescript@7.0.0: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -10983,6 +11114,22 @@ snapshots: - rollup - supports-color + vite-plugin-inspect@0.8.9(rollup@4.24.3)(vite@5.4.10(@types/node@22.10.1)(sugarss@4.0.1(postcss@8.4.49))(terser@5.27.0)): + dependencies: + '@antfu/utils': 0.7.10 + '@rollup/pluginutils': 5.1.4(rollup@4.24.3) + debug: 4.3.7 + error-stack-parser-es: 0.1.5 + fs-extra: 11.2.0 + open: 10.1.0 + perfect-debounce: 1.0.0 + picocolors: 1.1.1 + sirv: 3.0.0 + vite: 5.4.10(@types/node@22.10.1)(sugarss@4.0.1(postcss@8.4.49))(terser@5.27.0) + transitivePeerDependencies: + - 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 @@ -10996,6 +11143,19 @@ snapshots: transitivePeerDependencies: - 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.49))(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.49))(terser@5.27.0) + vitefu: 1.0.4(vite@5.4.10(@types/node@22.10.1)(sugarss@4.0.1(postcss@8.4.49))(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 @@ -11033,6 +11193,10 @@ snapshots: optionalDependencies: 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.49))(terser@5.27.0)): + optionalDependencies: + vite: 5.4.10(@types/node@22.10.1)(sugarss@4.0.1(postcss@8.4.49))(terser@5.27.0) + vue-template-compiler@2.7.16: dependencies: de-indent: 1.0.2 diff --git a/ui/solid-example/.gitignore b/ui/solid-example/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/ui/solid-example/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/ui/solid-example/README.md b/ui/solid-example/README.md new file mode 100644 index 0000000..167c567 --- /dev/null +++ b/ui/solid-example/README.md @@ -0,0 +1,28 @@ +## Usage + +```bash +$ npm install # or pnpm install or yarn install +``` + +### Learn more on the [Solid Website](https://solidjs.com) and come chat with us on our [Discord](https://discord.com/invite/solidjs) + +## Available Scripts + +In the project directory, you can run: + +### `npm run dev` + +Runs the app in the development mode.
+Open [http://localhost:5173](http://localhost:5173) to view it in the browser. + +### `npm run build` + +Builds the app for production to the `dist` folder.
+It correctly bundles Solid in production mode and optimizes the build for the best performance. + +The build is minified and the filenames include the hashes.
+Your app is ready to be deployed! + +## Deployment + +Learn more about deploying your application with the [documentations](https://vite.dev/guide/static-deploy.html) diff --git a/ui/solid-example/index.html b/ui/solid-example/index.html new file mode 100644 index 0000000..7021737 --- /dev/null +++ b/ui/solid-example/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + Solid + TS + + +
+ + + diff --git a/ui/solid-example/package.json b/ui/solid-example/package.json new file mode 100644 index 0000000..a139a17 --- /dev/null +++ b/ui/solid-example/package.json @@ -0,0 +1,20 @@ +{ + "name": "solid-example", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "preview": "vite preview" + }, + "dependencies": { + "solid-js": "^1.9.3" + }, + "devDependencies": { + "typescript": "5.3.3", + "vite": "^5.4.10", + "vite-plugin-inspect": "^0.8.9", + "vite-plugin-solid": "^2.11.0" + } +} diff --git a/ui/solid-example/public/vite.svg b/ui/solid-example/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/ui/solid-example/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ui/solid-example/src/App.css b/ui/solid-example/src/App.css new file mode 100644 index 0000000..613607d --- /dev/null +++ b/ui/solid-example/src/App.css @@ -0,0 +1,27 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.solid:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/ui/solid-example/src/App.tsx b/ui/solid-example/src/App.tsx new file mode 100644 index 0000000..1f906bf --- /dev/null +++ b/ui/solid-example/src/App.tsx @@ -0,0 +1,38 @@ +import { createSignal } from 'solid-js' + +import solidLogo from './assets/solid.svg' + +// eslint-disable-next-line import/no-unresolved +import viteLogo from '/vite.svg' +import './App.css' + +function App() { + const [count, setCount] = createSignal(0) + + return ( + <> +
+ + + + + + +
+

Vite + Solid

+
+ +

+ Edit src/App.tsx and save to test HMR +

+
+

+ Click on the Vite and Solid logos to learn more +

+ + ) +} + +export default App diff --git a/ui/solid-example/src/assets/solid.svg b/ui/solid-example/src/assets/solid.svg new file mode 100644 index 0000000..025aa30 --- /dev/null +++ b/ui/solid-example/src/assets/solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ui/solid-example/src/index.css b/ui/solid-example/src/index.css new file mode 100644 index 0000000..6119ad9 --- /dev/null +++ b/ui/solid-example/src/index.css @@ -0,0 +1,68 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/ui/solid-example/src/index.tsx b/ui/solid-example/src/index.tsx new file mode 100644 index 0000000..0e0597e --- /dev/null +++ b/ui/solid-example/src/index.tsx @@ -0,0 +1,9 @@ +/* @refresh reload */ +import { render } from 'solid-js/web' + +import './index.css' +import App from './App.tsx' + +const root = document.getElementById('root') + +render(() => , root!) diff --git a/ui/solid-example/src/vite-env.d.ts b/ui/solid-example/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/ui/solid-example/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/ui/solid-example/tsconfig.app.json b/ui/solid-example/tsconfig.app.json new file mode 100644 index 0000000..542583a --- /dev/null +++ b/ui/solid-example/tsconfig.app.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "preserve", + "jsxImportSource": "solid-js", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/ui/solid-example/tsconfig.json b/ui/solid-example/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/ui/solid-example/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/ui/solid-example/tsconfig.node.json b/ui/solid-example/tsconfig.node.json new file mode 100644 index 0000000..db0becc --- /dev/null +++ b/ui/solid-example/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/ui/solid-example/vite.config.ts b/ui/solid-example/vite.config.ts new file mode 100644 index 0000000..5f1ca99 --- /dev/null +++ b/ui/solid-example/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vite"; +import inspect from "vite-plugin-inspect"; +import solid from "vite-plugin-solid"; + +export default defineConfig({ + plugins: [solid(), inspect()], +}); From a9e308721dbfdf5772e3ec4a262f016d6d0f7b64 Mon Sep 17 00:00:00 2001 From: MrWangJustToDo <2711470541@qq.com> Date: Mon, 23 Dec 2024 22:24:00 +0800 Subject: [PATCH 05/12] update --- packages/core/package.json | 4 ++-- packages/file/package.json | 4 ++-- packages/lowlight/package.json | 2 +- packages/react/package.json | 4 ++-- packages/shiki/package.json | 2 +- packages/solid/package.json | 5 ++--- packages/utils/package.json | 4 ++-- packages/vue/package.json | 4 ++-- pnpm-lock.yaml | 15 ++++++--------- 9 files changed, 20 insertions(+), 24 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index 8b182b7..a2db078 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -3,7 +3,7 @@ "description": "@git-diff-view/core", "author": "MrWangJustToDo", "license": "MIT", - "version": "0.0.24", + "version": "0.0.25", "main": "index.js", "types": "index.d.ts", "files": [ @@ -52,7 +52,7 @@ "diff parse" ], "dependencies": { - "@git-diff-view/lowlight": "^0.0.24", + "@git-diff-view/lowlight": "^0.0.25", "highlight.js": "^11.11.0", "lowlight": "^3.3.0", "fast-diff": "^1.3.0" diff --git a/packages/file/package.json b/packages/file/package.json index 53c24a8..04d79da 100644 --- a/packages/file/package.json +++ b/packages/file/package.json @@ -3,7 +3,7 @@ "description": "@git-diff-view/file", "author": "MrWangJustToDo", "license": "MIT", - "version": "0.0.24", + "version": "0.0.25", "main": "index.js", "types": "index.d.ts", "files": [ @@ -52,7 +52,7 @@ "diff parse" ], "dependencies": { - "@git-diff-view/core": "^0.0.24", + "@git-diff-view/core": "^0.0.25", "diff": "^7.0.0", "highlight.js": "^11.11.0", "lowlight": "^3.3.0", diff --git a/packages/lowlight/package.json b/packages/lowlight/package.json index c1bcf37..c5daace 100644 --- a/packages/lowlight/package.json +++ b/packages/lowlight/package.json @@ -3,7 +3,7 @@ "description": "@git-diff-view/lowlight", "author": "MrWangJustToDo", "license": "MIT", - "version": "0.0.24", + "version": "0.0.25", "main": "index.js", "types": "index.d.ts", "files": [ diff --git a/packages/react/package.json b/packages/react/package.json index 059ba48..71fe85c 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -3,7 +3,7 @@ "description": "@git-diff-view/react", "author": "MrWangJustToDo", "license": "MIT", - "version": "0.0.24", + "version": "0.0.25", "main": "index.js", "types": "index.d.ts", "files": [ @@ -63,7 +63,7 @@ "react diff component" ], "dependencies": { - "@git-diff-view/core": "^0.0.24", + "@git-diff-view/core": "^0.0.25", "@types/hast": "^3.0.0", "fast-diff": "^1.3.0", "highlight.js": "^11.11.0", diff --git a/packages/shiki/package.json b/packages/shiki/package.json index 7cae8e5..bf289a0 100644 --- a/packages/shiki/package.json +++ b/packages/shiki/package.json @@ -3,7 +3,7 @@ "description": "@git-diff-view/shiki", "author": "MrWangJustToDo", "license": "MIT", - "version": "0.0.24", + "version": "0.0.25", "types": "index.d.ts", "type": "module", "files": [ diff --git a/packages/solid/package.json b/packages/solid/package.json index 61942de..192a3fa 100644 --- a/packages/solid/package.json +++ b/packages/solid/package.json @@ -3,7 +3,7 @@ "description": "@git-diff-view/solid", "author": "MrWangJustToDo", "license": "MIT", - "version": "0.0.23", + "version": "0.0.25", "main": "index.js", "type": "module", "types": "index.d.ts", @@ -36,8 +36,7 @@ "solid diff component" ], "dependencies": { - "@git-diff-view/utils": "^0.0.23", - "@git-diff-view/core": "^0.0.23", + "@git-diff-view/core": "^0.0.25", "@types/hast": "^3.0.0", "highlight.js": "^11.11.0", "lowlight": "^3.3.0", diff --git a/packages/utils/package.json b/packages/utils/package.json index 4d09476..ea724f4 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -3,7 +3,7 @@ "description": "@git-diff-view/utils", "author": "MrWangJustToDo", "license": "MIT", - "version": "0.0.24", + "version": "0.0.25", "types": "index.d.ts", "type": "module", "files": [ @@ -40,6 +40,6 @@ ] }, "dependencies": { - "@git-diff-view/core": "^0.0.24" + "@git-diff-view/core": "^0.0.25" } } diff --git a/packages/vue/package.json b/packages/vue/package.json index b2bb513..16cc3e5 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -3,7 +3,7 @@ "description": "@git-diff-view/vue", "author": "MrWangJustToDo", "license": "MIT", - "version": "0.0.24", + "version": "0.0.25", "main": "index.js", "type": "module", "types": "index.d.ts", @@ -49,7 +49,7 @@ "vue diff component" ], "dependencies": { - "@git-diff-view/core": "^0.0.24", + "@git-diff-view/core": "^0.0.25", "@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 ad71e97..6515b05 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -83,7 +83,7 @@ importers: packages/core: dependencies: '@git-diff-view/lowlight': - specifier: ^0.0.24 + specifier: ^0.0.25 version: link:../lowlight fast-diff: specifier: ^1.3.0 @@ -102,7 +102,7 @@ importers: packages/file: dependencies: '@git-diff-view/core': - specifier: ^0.0.24 + specifier: ^0.0.25 version: link:../core diff: specifier: ^7.0.0 @@ -139,7 +139,7 @@ importers: packages/react: dependencies: '@git-diff-view/core': - specifier: ^0.0.24 + specifier: ^0.0.25 version: link:../core '@types/hast': specifier: ^3.0.0 @@ -194,11 +194,8 @@ importers: packages/solid: dependencies: '@git-diff-view/core': - specifier: ^0.0.23 + specifier: ^0.0.25 version: link:../core - '@git-diff-view/utils': - specifier: ^0.0.23 - version: link:../utils '@types/hast': specifier: ^3.0.0 version: 3.0.4 @@ -245,13 +242,13 @@ importers: packages/utils: dependencies: '@git-diff-view/core': - specifier: ^0.0.24 + specifier: ^0.0.25 version: link:../core packages/vue: dependencies: '@git-diff-view/core': - specifier: ^0.0.24 + specifier: ^0.0.25 version: link:../core '@types/hast': specifier: ^3.0.0 From b4b92c2550f4795a3051f7031ef3e8a31086b495 Mon Sep 17 00:00:00 2001 From: MrWangJustToDo <2711470541@qq.com> Date: Thu, 19 Jun 2025 13:33:55 +0800 Subject: [PATCH 06/12] wip --- packages/react/src/components/DiffContent.tsx | 10 +- packages/solid/package.json | 16 +- packages/solid/src/_base.css | 3 + packages/solid/src/_base_pure.css | 2 + packages/solid/src/_com.css | 172 +++++ packages/solid/src/_theme.css | 2 + .../solid/src/components/DiffAddWidget.tsx | 3 +- packages/solid/src/components/DiffContent.tsx | 380 ++++++++---- packages/solid/src/components/DiffView.tsx | 11 +- packages/solid/src/index copy.ts | 3 + packages/solid/src/tailwind.css | 127 +--- packages/solid/src/tailwind_pure.css | 3 + packages/solid/vite.config.ts | 9 +- packages/vue/package.json | 2 +- packages/vue/src/components/DiffContent.tsx | 10 +- pnpm-lock.yaml | 587 +++--------------- ui/react-example/package.json | 2 +- ui/solid-example/package.json | 5 +- ui/solid-example/vite.config.ts | 3 +- ui/vue-example/package.json | 2 +- ui/vue-ssr-example/package.json | 2 +- 21 files changed, 590 insertions(+), 764 deletions(-) create mode 100644 packages/solid/src/_base.css create mode 100644 packages/solid/src/_base_pure.css create mode 100644 packages/solid/src/_com.css create mode 100644 packages/solid/src/_theme.css create mode 100644 packages/solid/src/index copy.ts create mode 100644 packages/solid/src/tailwind_pure.css diff --git a/packages/react/src/components/DiffContent.tsx b/packages/react/src/components/DiffContent.tsx index 1fbc201..ac523a0 100644 --- a/packages/react/src/components/DiffContent.tsx +++ b/packages/react/src/components/DiffContent.tsx @@ -169,7 +169,15 @@ const DiffSyntax = ({ enableTemplate?: boolean; }) => { if (!syntaxLine) { - return ; + return ( + + ); } const changes = diffLine?.changes; diff --git a/packages/solid/package.json b/packages/solid/package.json index 192a3fa..b8001b8 100644 --- a/packages/solid/package.json +++ b/packages/solid/package.json @@ -19,7 +19,10 @@ }, "scripts": { "build": "vite build", - "gen:type": "dts-bundle-generator -o index.d.ts dist/index.d.ts" + "gen:type": "dts-bundle-generator -o index.d.ts dist/index.d.ts", + "gen:css1": "postcss src/tailwind.css -o dist/css/diff-view.css", + "gen:css2": "postcss src/tailwind_pure.css -o dist/css/diff-view-pure.css", + "gen:css": "npm run gen:css1 && npm run gen:css2" }, "homepage": "https://mrwangjusttodo.github.io/git-diff-view", "exports": { @@ -36,22 +39,21 @@ "solid diff component" ], "dependencies": { - "@git-diff-view/core": "^0.0.25", + "@git-diff-view/core": "^0.0.29", "@types/hast": "^3.0.0", "highlight.js": "^11.11.0", "lowlight": "^3.3.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", "eslint-plugin-solid": "^0.14.5", - "postcss": "^8.4.47", - "tailwindcss": "^3.4.14", - "vite": "^5.4.10", - "vite-plugin-dts": "^3.9.1" + "postcss": "^8.5.1", + "tailwindcss": "^3.4.17", + "vite": "^5.4.19", + "vite-plugin-dts": "^4.5.0" }, "peerDependencies": { "solid-js": "^1.9.0" diff --git a/packages/solid/src/_base.css b/packages/solid/src/_base.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/packages/solid/src/_base.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/packages/solid/src/_base_pure.css b/packages/solid/src/_base_pure.css new file mode 100644 index 0000000..7c05d4d --- /dev/null +++ b/packages/solid/src/_base_pure.css @@ -0,0 +1,2 @@ +@tailwind components; +@tailwind utilities; diff --git a/packages/solid/src/_com.css b/packages/solid/src/_com.css new file mode 100644 index 0000000..aaed963 --- /dev/null +++ b/packages/solid/src/_com.css @@ -0,0 +1,172 @@ +* { + box-sizing: border-box; +} + +[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-expand-lineNumber--: #fafafa; + --diff-plain-lineNumber-color--: #555555; + --diff-expand-lineNumber-color--: #555555; + --diff-hunk-content--: #ddf4ff; + --diff-hunk-lineNumber--: #c7ecff; + --diff-hunk-lineNumber-hover--: #0969da; + --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-expand-lineNumber--: #161b22; + --diff-plain-lineNumber-color--: #a0aaab; + --diff-expand-lineNumber-color--: #a0aaab; + --diff-hunk-content--: #131d2e; + --diff-hunk-lineNumber--: #204274; + --diff-hunk-lineNumber-hover--: #1f6feb; + --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; + text-align: left; +} + +.diff-line-old-num, +.diff-line-new-num, +.diff-line-num { + text-align: right; +} + +.diff-style-root tr { + content-visibility: auto; +} + +.diff-add-widget-wrapper { + transform-origin: center; + transform: translateX(-50%) !important; +} + +.diff-line-old-content .diff-add-widget-wrapper, +.diff-line-new-content .diff-add-widget-wrapper { + transform: translateX(50%) !important; +} + +.diff-add-widget-wrapper:hover { + transform: translateX(-50%) scale(1.1) !important; +} + +.diff-line-old-content .diff-add-widget-wrapper:hover, +.diff-line-new-content .diff-add-widget-wrapper:hover { + transform: translateX(50%) scale(1.1) !important; +} + +.diff-widget-tooltip { + position: relative; +} + +.diff-add-widget, +.diff-widget-tooltip { + font-family: inherit; + font-feature-settings: inherit; + font-variation-settings: inherit; + font-size: 100%; + font-weight: inherit; + line-height: inherit; + letter-spacing: inherit; + color: inherit; + margin: 0; + text-transform: none; + border-width: 0px; + background-color: transparent; + background-image: none; +} + +.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--); + color: white; +} + +.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/src/_theme.css b/packages/solid/src/_theme.css new file mode 100644 index 0000000..3302cba --- /dev/null +++ b/packages/solid/src/_theme.css @@ -0,0 +1,2 @@ +@import url(highlight.js/styles/github.css); +@import url(highlight.js/styles/github-dark.css); diff --git a/packages/solid/src/components/DiffAddWidget.tsx b/packages/solid/src/components/DiffAddWidget.tsx index c23bb16..1c4cd3e 100644 --- a/packages/solid/src/components/DiffAddWidget.tsx +++ b/packages/solid/src/components/DiffAddWidget.tsx @@ -1,7 +1,6 @@ import { diffFontSizeName, addWidgetColorName, addWidgetBGName } from "@git-diff-view/utils"; -import type { SplitSide } from "./DiffView"; -import type { DiffFile } from "@git-diff-view/core"; +import type { DiffFile, SplitSide } from "@git-diff-view/core"; export const DiffSplitAddWidget = (props: { index: number; diff --git a/packages/solid/src/components/DiffContent.tsx b/packages/solid/src/components/DiffContent.tsx index 973ff18..9d2c72a 100644 --- a/packages/solid/src/components/DiffContent.tsx +++ b/packages/solid/src/components/DiffContent.tsx @@ -1,11 +1,21 @@ -import { DiffLineType, NewLineSymbol, type DiffFile, type DiffLine, type SyntaxLine } from "@git-diff-view/core"; +import { + DiffLineType, + getSyntaxDiffTemplate, + type File, + type DiffFile, + type DiffLine, + getSyntaxLineTemplate, + getPlainDiffTemplate, + getPlainLineTemplate, +} from "@git-diff-view/core"; import { addContentHighlightBGName, delContentHighlightBGName, diffFontSizeName, getSymbol, + NewLineSymbol, } from "@git-diff-view/utils"; -import { For, Show } from "solid-js"; +import { createEffect, For, Show } from "solid-js"; import { DiffNoNewLine } from "./DiffNoNewLine"; @@ -13,7 +23,9 @@ const DiffString = (props: { rawLine: string; diffLine?: DiffLine; operator?: "add" | "del"; + plainLine?: File["plainFile"][number]; enableWrap?: boolean; + enableTemplate?: boolean; }) => { const getRange = () => props.diffLine?.changes?.range; @@ -30,42 +42,104 @@ const DiffString = (props: { const getIsNewLineSymbolChanged = () => (getStr3() === "" ? props.diffLine?.changes?.newLineSymbol : null); + const initTemplateIfNeed = () => { + if ( + props.enableTemplate && + props.operator && + props.diffLine && + !props.diffLine?.plainTemplate && + typeof getPlainDiffTemplate === "function" + ) { + getPlainDiffTemplate({ diffLine: props.diffLine, rawLine: props.rawLine, operator: props.operator }); + } + + if (props.enableTemplate && props.plainLine && !props.plainLine.template) { + props.plainLine.template = getPlainLineTemplate(props.plainLine.value); + } + }; + + // eslint-disable-next-line solid/reactivity + initTemplateIfNeed(); + + createEffect(initTemplateIfNeed); + return ( {props.rawLine}} - > - - {props.rawLine}} > - {getStr1()} - - {getIsLast() ? `${get_Str2()}${getSymbol(getIsNewLineSymbolChanged())}` : getStr2()} + + {/* eslint-disable-next-line solid/no-innerhtml */} + - {getStr3()} - - {getIsNewLineSymbolChanged() === NewLineSymbol.NEWLINE && ( - - + + } + > + + + {getStr1()} + + {getIsLast() ? ( + <> + {get_Str2()} + {getSymbol(getIsNewLineSymbolChanged())} + + ) : ( + getStr2() + )} + + {getStr3()} + + {getIsNewLineSymbolChanged() === NewLineSymbol.NEWLINE && ( + + + + )} - )} - + } + > + + {/* eslint-disable-next-line solid/no-innerhtml */} + + {getIsNewLineSymbolChanged() === NewLineSymbol.NEWLINE && ( + + + + )} + + ); }; @@ -73,50 +147,59 @@ const DiffString = (props: { const DiffSyntax = (props: { rawLine: string; diffLine?: DiffLine; - syntaxLine?: SyntaxLine; + syntaxLine?: File["syntaxFile"][number]; operator?: "add" | "del"; enableWrap?: boolean; + enableTemplate?: boolean; }) => { const getRange = () => props.diffLine?.changes?.range; const getIsNewLineSymbolChanged = () => props.diffLine?.changes?.newLineSymbol; + const initTemplateIfNeed = () => { + if ( + props.enableTemplate && + props.diffLine && + props.syntaxLine && + props.operator && + !props.diffLine?.syntaxTemplate && + typeof getSyntaxDiffTemplate === "function" + ) { + getSyntaxDiffTemplate({ diffLine: props.diffLine, syntaxLine: props.syntaxLine, operator: props.operator }); + } + + if (props.enableTemplate && props.syntaxLine && !props.syntaxLine?.template) { + props.syntaxLine.template = getSyntaxLineTemplate(props.syntaxLine); + } + }; + + // eslint-disable-next-line solid/reactivity + initTemplateIfNeed(); + + createEffect(initTemplateIfNeed); + return ( } + fallback={ + + } > - - {({ node, wrapper }) => ( - - {node.value} - - )} - - - } - > - - - - {({ node, wrapper }) => { - if ( - node.endIndex < getRange()!.location || - getRange()!.location + getRange()!.length < node.startIndex - ) { - return ( + + + {({ node, wrapper }) => ( {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 && ( - - + )} + + + } + > + + {/* eslint-disable-next-line solid/no-innerhtml */} + - )} - + + } + > + + + + {({ 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 && ( + + + + )} + + } + > + + {/* eslint-disable-next-line solid/no-innerhtml */} + + {getIsNewLineSymbolChanged() === NewLineSymbol.NEWLINE && ( + + + + )} + + ); @@ -186,7 +330,7 @@ const DiffSyntax = (props: { export const DiffContent = (props: { rawLine: string; - syntaxLine?: SyntaxLine; + syntaxLine?: File["syntaxFile"][number]; diffLine?: DiffLine; diffFile: DiffFile; enableWrap: boolean; @@ -199,6 +343,8 @@ export const DiffContent = (props: { const getIsMaxLineLengthToIgnoreSyntax = () => props.syntaxLine?.nodeList ? props.syntaxLine?.nodeList?.length > 150 : false; + const getIsEnableTemplate = () => props.diffFile.getIsEnableTemplate?.() ?? true; + return (
) : ( )}
diff --git a/packages/solid/src/components/DiffView.tsx b/packages/solid/src/components/DiffView.tsx index e14a4e8..32cbf74 100644 --- a/packages/solid/src/components/DiffView.tsx +++ b/packages/solid/src/components/DiffView.tsx @@ -1,13 +1,8 @@ -import { DiffFile} from "@git-diff-view/core"; +import { DiffFile } from "@git-diff-view/core"; import { type JSXElement, type JSX, createSignal, createRenderEffect } from "solid-js"; import type { DiffHighlighter, DiffHighlighterLang } from "@git-diff-view/core"; -export enum SplitSide { - old = 1, - new = 2, -} - export enum DiffModeEnum { // github like SplitGitHub = 1, @@ -87,7 +82,7 @@ export const DiffView = (props: DiffViewProps) => { diffFile()?.clear(); setDiffFile(getInstance()); - }) + }); return
DiffView
; -} \ No newline at end of file +}; diff --git a/packages/solid/src/index copy.ts b/packages/solid/src/index copy.ts new file mode 100644 index 0000000..77008b3 --- /dev/null +++ b/packages/solid/src/index copy.ts @@ -0,0 +1,3 @@ +export * from "./components/DiffView"; + +export * from "@git-diff-view/core"; diff --git a/packages/solid/src/tailwind.css b/packages/solid/src/tailwind.css index 2db0027..60012bc 100644 --- a/packages/solid/src/tailwind.css +++ b/packages/solid/src/tailwind.css @@ -1,124 +1,3 @@ -@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; -} +@import url(./_base.css); +@import url(./_com.css); +@import url(./_theme.css); diff --git a/packages/solid/src/tailwind_pure.css b/packages/solid/src/tailwind_pure.css new file mode 100644 index 0000000..623edfa --- /dev/null +++ b/packages/solid/src/tailwind_pure.css @@ -0,0 +1,3 @@ +@import url(./_base_pure.css); +@import url(./_com.css); +@import url(./_theme.css); diff --git a/packages/solid/vite.config.ts b/packages/solid/vite.config.ts index 753cf0d..2967e3e 100644 --- a/packages/solid/vite.config.ts +++ b/packages/solid/vite.config.ts @@ -1,4 +1,3 @@ -import typescript from "@rollup/plugin-typescript"; import * as path from "path"; import { defineConfig } from "vite"; import dts from "vite-plugin-dts"; @@ -7,13 +6,7 @@ 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(), - ], + plugins: [solidPlugin(), dts()], server: { port: 3000, }, diff --git a/packages/vue/package.json b/packages/vue/package.json index 66c6ea6..ac2675b 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -53,7 +53,7 @@ "autoprefixer": "^10.4.20", "postcss": "^8.5.1", "tailwindcss": "^3.4.17", - "vite": "^5.4.14", + "vite": "^5.4.19", "vite-plugin-dts": "^4.5.0", "vue": "^3.5.13", "vue-tsc": "^2.2.0" diff --git a/packages/vue/src/components/DiffContent.tsx b/packages/vue/src/components/DiffContent.tsx index a358a6c..d4ed4f8 100644 --- a/packages/vue/src/components/DiffContent.tsx +++ b/packages/vue/src/components/DiffContent.tsx @@ -138,7 +138,15 @@ const DiffSyntax = ({ enableTemplate?: boolean; }) => { if (!syntaxLine) { - return ; + return ( + + ); } const changes = diffLine?.changes; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c534262..6f73229 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -105,6 +105,8 @@ importers: specifier: ^3.0.0 version: 3.0.4 + packages/dom: {} + packages/file: dependencies: '@git-diff-view/core': @@ -194,8 +196,8 @@ importers: packages/solid: dependencies: '@git-diff-view/core': - specifier: ^0.0.25 - version: 0.0.25 + specifier: ^0.0.29 + version: link:../core '@types/hast': specifier: ^3.0.0 version: 3.0.4 @@ -209,9 +211,6 @@ importers: specifier: ^3.3.0 version: 3.3.0 devDependencies: - '@rollup/plugin-typescript': - specifier: ^11.1.6 - version: 11.1.6(rollup@4.34.6)(tslib@2.8.1)(typescript@5.7.2) autoprefixer: specifier: ^10.4.20 version: 10.4.20(postcss@8.5.1) @@ -219,23 +218,23 @@ importers: specifier: ^0.14.5 version: 0.14.5(eslint@8.57.1)(typescript@5.7.2) postcss: - specifier: ^8.4.47 + specifier: ^8.5.1 version: 8.5.1 solid-js: specifier: ^1.9.0 version: 1.9.5 tailwindcss: - specifier: ^3.4.14 + specifier: ^3.4.17 version: 3.4.17(ts-node@10.9.2(@swc/core@1.10.15(@swc/helpers@0.5.15))(@types/node@22.13.1)(typescript@5.7.2)) vite: - specifier: ^5.4.10 - version: 5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) + specifier: ^5.4.19 + version: 5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) vite-plugin-dts: - specifier: ^3.9.1 - version: 3.9.1(@types/node@22.13.1)(rollup@4.34.6)(typescript@5.7.2)(vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)) + specifier: ^4.5.0 + version: 4.5.0(@types/node@22.13.1)(rollup@4.34.6)(typescript@5.7.2)(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)) vite-plugin-solid: specifier: ^2.11.0 - version: 2.11.6(solid-js@1.9.5)(vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)) + version: 2.11.6(solid-js@1.9.5)(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)) packages/svelte: {} @@ -265,10 +264,10 @@ importers: devDependencies: '@vitejs/plugin-vue': specifier: ^5.2.1 - version: 5.2.1(vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1))(vue@3.5.13(typescript@5.7.2)) + version: 5.2.1(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1))(vue@3.5.13(typescript@5.7.2)) '@vitejs/plugin-vue-jsx': specifier: ^4.1.1 - version: 4.1.1(vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1))(vue@3.5.13(typescript@5.7.2)) + version: 4.1.1(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1))(vue@3.5.13(typescript@5.7.2)) autoprefixer: specifier: ^10.4.20 version: 10.4.20(postcss@8.5.1) @@ -279,11 +278,11 @@ importers: specifier: ^3.4.17 version: 3.4.17(ts-node@10.9.2(@swc/core@1.10.15(@swc/helpers@0.5.15))(@types/node@22.13.1)(typescript@5.7.2)) vite: - specifier: ^5.4.14 - version: 5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) + specifier: ^5.4.19 + version: 5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) vite-plugin-dts: specifier: ^4.5.0 - version: 4.5.0(@types/node@22.13.1)(rollup@4.34.6)(typescript@5.7.2)(vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)) + version: 4.5.0(@types/node@22.13.1)(rollup@4.34.6)(typescript@5.7.2)(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)) vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.7.2) @@ -427,7 +426,7 @@ importers: version: 0.3.13(@my-react/react@0.3.13) '@my-react/react-vite': specifier: ^0.0.17 - version: 0.0.17(@my-react/react-refresh@0.3.13(@my-react/react@0.3.13))(vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)) + version: 0.0.17(@my-react/react-refresh@0.3.13(@my-react/react@0.3.13))(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)) '@types/lodash': specifier: ^4.17.15 version: 4.17.15 @@ -445,7 +444,7 @@ importers: version: 8.23.0(eslint@8.57.1)(typescript@5.3.3) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)) + version: 4.3.4(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)) autoprefixer: specifier: ^10.4.20 version: 10.4.20(postcss@8.5.1) @@ -471,30 +470,27 @@ importers: specifier: 5.3.3 version: 5.3.3 vite: - specifier: ^5.4.14 - version: 5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) + specifier: ^5.4.19 + version: 5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.3.3)(vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)) + version: 5.1.4(typescript@5.3.3)(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)) ui/solid-example: dependencies: solid-js: - specifier: ^1.9.3 - version: 1.9.5 + specifier: ^1.9.7 + version: 1.9.7 devDependencies: typescript: specifier: 5.3.3 version: 5.3.3 vite: - specifier: ^5.4.10 - version: 5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) - vite-plugin-inspect: - specifier: ^0.8.9 - version: 0.8.9(rollup@4.34.6)(vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)) + specifier: ^5.4.19 + version: 5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) vite-plugin-solid: specifier: ^2.11.0 - version: 2.11.6(solid-js@1.9.5)(vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)) + version: 2.11.6(solid-js@1.9.7)(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)) ui/vue-example: dependencies: @@ -507,7 +503,7 @@ importers: devDependencies: '@vitejs/plugin-vue': specifier: ^5.2.1 - version: 5.2.1(vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1))(vue@3.5.13(typescript@5.3.3)) + version: 5.2.1(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1))(vue@3.5.13(typescript@5.3.3)) autoprefixer: specifier: ^10.4.20 version: 10.4.20(postcss@8.5.1) @@ -521,8 +517,8 @@ importers: specifier: 5.3.3 version: 5.3.3 vite: - specifier: ^5.4.14 - version: 5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) + specifier: ^5.4.19 + version: 5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) vue-tsc: specifier: ^2.2.0 version: 2.2.0(typescript@5.3.3) @@ -553,7 +549,7 @@ importers: version: 22.13.1 '@vitejs/plugin-vue': specifier: ^5.2.1 - version: 5.2.1(vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1))(vue@3.5.13(typescript@5.3.3)) + version: 5.2.1(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1))(vue@3.5.13(typescript@5.3.3)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -561,8 +557,8 @@ importers: specifier: 5.3.3 version: 5.3.3 vite: - specifier: ^5.4.14 - version: 5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) + specifier: ^5.4.19 + version: 5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) vue-tsc: specifier: ^2.2.0 version: 2.2.0(typescript@5.3.3) @@ -577,9 +573,6 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@antfu/utils@0.7.10': - resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} - '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} @@ -962,12 +955,6 @@ packages: '@floating-ui/utils@0.2.9': resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} - '@git-diff-view/core@0.0.25': - resolution: {integrity: sha512-ghsa3m0zbNgty5bCJDZs8eNjSAobdewaE5UghhRfhzwWcYZhddeAJNXV0byobc4jpzphEK/7OpA7/vERyTQm2w==} - - '@git-diff-view/lowlight@0.0.25': - resolution: {integrity: sha512-pLjvg79jUJP0QJG6VLEzDdcJMvpaVJhrZ+kbGZmKgWky9adml8fxsjmSNtoDB3IbjTvGhFwHaDC760BdirgwZQ==} - '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -1161,29 +1148,16 @@ packages: '@marijn/find-cluster-break@1.0.2': resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} - '@microsoft/api-extractor-model@7.28.13': - resolution: {integrity: sha512-39v/JyldX4MS9uzHcdfmjjfS6cYGAoXV+io8B5a338pkHiSt+gy2eXQ0Q7cGFJ7quSa1VqqlMdlPrB6sLR/cAw==} - '@microsoft/api-extractor-model@7.30.3': resolution: {integrity: sha512-yEAvq0F78MmStXdqz9TTT4PZ05Xu5R8nqgwI5xmUmQjWBQ9E6R2n8HB/iZMRciG4rf9iwI2mtuQwIzDXBvHn1w==} - '@microsoft/api-extractor@7.43.0': - resolution: {integrity: sha512-GFhTcJpB+MI6FhvXEI9b2K0snulNLWHqC/BbcJtyNYcKUiw7l3Lgis5ApsYncJ0leALX7/of4XfmXk+maT111w==} - hasBin: true - '@microsoft/api-extractor@7.49.2': resolution: {integrity: sha512-DI/WnvhbkHcucxxc4ys00ejCiViFls5EKPrEfe4NV3GGpVkoM5ZXF61HZNSGA8IG0oEV4KfTqIa59Rc3wdMopw==} hasBin: true - '@microsoft/tsdoc-config@0.16.2': - resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} - '@microsoft/tsdoc-config@0.17.1': resolution: {integrity: sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==} - '@microsoft/tsdoc@0.14.2': - resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} - '@microsoft/tsdoc@0.15.1': resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} @@ -1350,19 +1324,6 @@ packages: rollup: optional: true - '@rollup/plugin-typescript@11.1.6': - resolution: {integrity: sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.14.0||^3.0.0||^4.0.0 - tslib: '*' - typescript: '>=3.7.0' - peerDependenciesMeta: - rollup: - optional: true - tslib: - optional: true - '@rollup/plugin-typescript@12.1.2': resolution: {integrity: sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg==} engines: {node: '>=14.0.0'} @@ -1486,14 +1447,6 @@ packages: '@rushstack/eslint-patch@1.10.5': resolution: {integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==} - '@rushstack/node-core-library@4.0.2': - resolution: {integrity: sha512-hyES82QVpkfQMeBMteQUnrhASL/KHPhd7iJ8euduwNJG4mu2GSOKybf0rOEjOm1Wz7CwJEUm9y0yD7jg2C1bfg==} - peerDependencies: - '@types/node': '*' - peerDependenciesMeta: - '@types/node': - optional: true - '@rushstack/node-core-library@5.11.0': resolution: {integrity: sha512-I8+VzG9A0F3nH2rLpPd7hF8F7l5Xb7D+ldrWVZYegXM6CsKkvWc670RlgK3WX8/AseZfXA/vVrh0bpXe2Y2UDQ==} peerDependencies: @@ -1502,20 +1455,9 @@ packages: '@types/node': optional: true - '@rushstack/rig-package@0.5.2': - resolution: {integrity: sha512-mUDecIJeH3yYGZs2a48k+pbhM6JYwWlgjs2Ca5f2n1G2/kgdgP9D/07oglEGf6mRyXEnazhEENeYTSNDRCwdqA==} - '@rushstack/rig-package@0.5.3': resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} - '@rushstack/terminal@0.10.0': - resolution: {integrity: sha512-UbELbXnUdc7EKwfH2sb8ChqNgapUOdqcCIdQP4NGxBpTZV2sQyeekuK3zmfQSa/MN+/7b4kBogl2wq0vpkpYGw==} - peerDependencies: - '@types/node': '*' - peerDependenciesMeta: - '@types/node': - optional: true - '@rushstack/terminal@0.14.6': resolution: {integrity: sha512-4nMUy4h0u5PGXVG71kEA9uYI3l8GjVqewoHOFONiM6fuqS51ORdaJZ5ZXB2VZEGUyfg1TOTSy88MF2cdAy+lqA==} peerDependencies: @@ -1524,9 +1466,6 @@ packages: '@types/node': optional: true - '@rushstack/ts-command-line@4.19.1': - resolution: {integrity: sha512-J7H768dgcpG60d7skZ5uSSwyCZs/S2HrWP1Ds8d1qYAyaaeJmpmmLr9BVw97RjFzmQPOYnoXcKA4GkqDCkduQg==} - '@rushstack/ts-command-line@4.23.4': resolution: {integrity: sha512-pqmzDJCm0TS8VyeqnzcJ7ncwXgiLDQ6LVmXXfqv2nPL6VIz+UpyTpNVfZRJpyyJ+UDxqob1vIj2liaUfBjv8/A==} @@ -1830,21 +1769,12 @@ packages: vite: ^5.0.0 || ^6.0.0 vue: ^3.2.25 - '@volar/language-core@1.11.1': - resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} - '@volar/language-core@2.4.11': resolution: {integrity: sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==} - '@volar/source-map@1.11.1': - resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} - '@volar/source-map@2.4.11': resolution: {integrity: sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==} - '@volar/typescript@1.11.1': - resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} - '@volar/typescript@2.4.11': resolution: {integrity: sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==} @@ -1879,14 +1809,6 @@ packages: '@vue/compiler-vue2@2.7.16': resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} - '@vue/language-core@1.8.27': - resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@vue/language-core@2.2.0': resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==} peerDependencies: @@ -2139,10 +2061,6 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - bundle-name@4.1.0: - resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} - engines: {node: '>=18'} - busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -2249,10 +2167,6 @@ packages: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} - commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -2267,9 +2181,6 @@ packages: resolution: {integrity: sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==} engines: {node: '>= 0.8.0'} - computeds@0.0.1: - resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -2451,22 +2362,10 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} - default-browser-id@5.0.0: - resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} - engines: {node: '>=18'} - - default-browser@5.2.1: - resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} - engines: {node: '>=18'} - define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} - define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -2600,9 +2499,6 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - error-stack-parser-es@0.1.5: - resolution: {integrity: sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==} - es-abstract@1.23.9: resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} engines: {node: '>= 0.4'} @@ -2952,10 +2848,6 @@ packages: resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} engines: {node: '>=14.14'} - fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -3251,11 +3143,6 @@ packages: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} - is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -3280,11 +3167,6 @@ packages: resolution: {integrity: sha512-S+OpgB5i7wzIue/YSE5hg0e5ZYfG3hhpNh9KGl6ayJ38p7ED6wxQLd1TV91xHpcTvw90KMJ9EwN3F/iNflHBVg==} engines: {node: '>=8'} - is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -3354,10 +3236,6 @@ packages: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} - is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} - engines: {node: '>=16'} - isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -3418,9 +3296,6 @@ packages: engines: {node: '>=6'} hasBin: true - jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} @@ -3487,14 +3362,6 @@ packages: lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. - - lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. - lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} @@ -3652,9 +3519,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - muggle-string@0.3.1: - resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} - muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} @@ -3773,10 +3637,6 @@ packages: oniguruma-to-es@2.3.0: resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==} - open@10.1.1: - resolution: {integrity: sha512-zy1wx4+P3PfhXSEPJNtZmJXfhkkIaxU1VauWIrDZw1O7uJRDRJtKr9n3Ic4NgbA16KyOxOXO2ng9gYwCdXuSXA==} - engines: {node: '>=18'} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -3866,9 +3726,6 @@ packages: pathe@2.0.2: resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} - perfect-debounce@1.0.0: - resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -4498,9 +4355,6 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.19.0: - resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} - resolve@1.22.10: resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} @@ -4537,10 +4391,6 @@ packages: resolution: {integrity: sha512-dIM5zVoG8xhC6rnSN8uoAgFARwTE7BQs8YwHEvK0VCmfxQXMaOuA1uiR1IPwsW7JyK5iTt7Od/TC9StasS2NPQ==} engines: {node: '>= 0.10'} - run-applescript@7.0.0: - resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} - engines: {node: '>=18'} - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -4610,10 +4460,20 @@ packages: peerDependencies: seroval: ^1.0 + seroval-plugins@1.3.2: + resolution: {integrity: sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + seroval@1.2.1: resolution: {integrity: sha512-yBxFFs3zmkvKNmR0pFSU//rIsYjuX418TnlDmc2weaq5XFDqDIV/NOMPBoLrbxjLH42p4UzRuXHryXh9dYcKcw==} engines: {node: '>=10'} + seroval@1.3.2: + resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} + engines: {node: '>=10'} + serve-static@2.1.0: resolution: {integrity: sha512-A3We5UfEjG8Z7VkDv6uItWw6HY2bBSBJT1KtVESn6EOoOr2jAxNhxWCLY3jDE2WcuHXByWju74ck3ZgLwL8xmA==} engines: {node: '>= 18'} @@ -4693,6 +4553,9 @@ packages: solid-js@1.9.5: resolution: {integrity: sha512-ogI3DaFcyn6UhYhrgcyRAMbu/buBJitYQASZz5WzfQVPP10RD2AbCoRZ517psnezrasyCbWzIxZ6kVqet768xw==} + solid-js@1.9.7: + resolution: {integrity: sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw==} + solid-refresh@0.6.3: resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} peerDependencies: @@ -5069,11 +4932,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@5.4.2: - resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} - engines: {node: '>=14.17'} - hasBin: true - typescript@5.7.2: resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} engines: {node: '>=14.17'} @@ -5111,10 +4969,6 @@ packages: unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -5202,10 +5056,6 @@ packages: validate-html-nesting@1.2.2: resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} - validator@13.15.0: - resolution: {integrity: sha512-36B2ryl4+oL5QxZ3AzD0t5SsMNGvTtQHpjgFO5tbNxfXbMFkY822ktCDe1MnlqV3301QQI9SLHDNJokDI+Z9pA==} - engines: {node: '>= 0.10'} - vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -5216,16 +5066,6 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-plugin-dts@3.9.1: - resolution: {integrity: sha512-rVp2KM9Ue22NGWB8dNtWEr+KekN3rIgz1tWD050QnRGlriUCmaDwa7qA5zDEjbXg5lAXhYMSBJtx3q3hQIJZSg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - typescript: '*' - vite: '*' - peerDependenciesMeta: - vite: - optional: true - vite-plugin-dts@4.5.0: resolution: {integrity: sha512-M1lrPTdi7gilLYRZoLmGYnl4fbPryVYsehPN9JgaxjJKTs8/f7tuAlvCCvOLB5gRDQTTKnptBcB0ACsaw2wNLw==} peerDependencies: @@ -5235,16 +5075,6 @@ packages: vite: optional: true - vite-plugin-inspect@0.8.9: - resolution: {integrity: sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==} - engines: {node: '>=14'} - peerDependencies: - '@nuxt/kit': '*' - vite: ^3.1.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.1 - peerDependenciesMeta: - '@nuxt/kit': - optional: true - vite-plugin-solid@2.11.6: resolution: {integrity: sha512-Sl5CTqJTGyEeOsmdH6BOgalIZlwH3t4/y0RQuFLMGnvWMBvxb4+lq7x3BSiAw6etf0QexfNJW7HSOO/Qf7pigg==} peerDependencies: @@ -5263,8 +5093,8 @@ packages: vite: optional: true - vite@5.4.14: - resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==} + vite@5.4.19: + resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -5305,15 +5135,6 @@ packages: vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} - vue-template-compiler@2.7.16: - resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} - - vue-tsc@1.8.27: - resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} - hasBin: true - peerDependencies: - typescript: '*' - vue-tsc@2.2.0: resolution: {integrity: sha512-gtmM1sUuJ8aSb0KoAFmK9yMxb8TxjewmxqTJ1aKphD5Cbu0rULFY6+UQT51zW7SpUcenfPUuflKyVwyx9Qdnxg==} hasBin: true @@ -5410,11 +5231,6 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - z-schema@5.0.5: - resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} - engines: {node: '>=8.0.0'} - hasBin: true - zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -5427,8 +5243,6 @@ snapshots: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - '@antfu/utils@0.7.10': {} - '@babel/code-frame@7.26.2': dependencies: '@babel/helper-validator-identifier': 7.25.9 @@ -5863,19 +5677,6 @@ snapshots: '@floating-ui/utils@0.2.9': {} - '@git-diff-view/core@0.0.25': - dependencies: - '@git-diff-view/lowlight': 0.0.25 - fast-diff: 1.3.0 - highlight.js: 11.11.1 - lowlight: 3.3.0 - - '@git-diff-view/lowlight@0.0.25': - dependencies: - '@types/hast': 3.0.4 - highlight.js: 11.11.1 - lowlight: 3.3.0 - '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -6057,14 +5858,6 @@ snapshots: '@marijn/find-cluster-break@1.0.2': {} - '@microsoft/api-extractor-model@7.28.13(@types/node@22.13.1)': - dependencies: - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@22.13.1) - transitivePeerDependencies: - - '@types/node' - '@microsoft/api-extractor-model@7.30.3(@types/node@22.13.1)': dependencies: '@microsoft/tsdoc': 0.15.1 @@ -6073,24 +5866,6 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.43.0(@types/node@22.13.1)': - dependencies: - '@microsoft/api-extractor-model': 7.28.13(@types/node@22.13.1) - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@22.13.1) - '@rushstack/rig-package': 0.5.2 - '@rushstack/terminal': 0.10.0(@types/node@22.13.1) - '@rushstack/ts-command-line': 4.19.1(@types/node@22.13.1) - lodash: 4.17.21 - minimatch: 3.0.8 - resolve: 1.22.10 - semver: 7.5.4 - source-map: 0.6.1 - typescript: 5.4.2 - transitivePeerDependencies: - - '@types/node' - '@microsoft/api-extractor@7.49.2(@types/node@22.13.1)': dependencies: '@microsoft/api-extractor-model': 7.30.3(@types/node@22.13.1) @@ -6109,13 +5884,6 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@microsoft/tsdoc-config@0.16.2': - dependencies: - '@microsoft/tsdoc': 0.14.2 - ajv: 6.12.6 - jju: 1.4.0 - resolve: 1.19.0 - '@microsoft/tsdoc-config@0.17.1': dependencies: '@microsoft/tsdoc': 0.15.1 @@ -6123,8 +5891,6 @@ snapshots: jju: 1.4.0 resolve: 1.22.10 - '@microsoft/tsdoc@0.14.2': {} - '@microsoft/tsdoc@0.15.1': {} '@my-react/react-dom@0.3.13(@my-react/react@0.3.13)': @@ -6139,13 +5905,13 @@ snapshots: dependencies: '@my-react/react': 0.3.13 - '@my-react/react-vite@0.0.17(@my-react/react-refresh@0.3.13(@my-react/react@0.3.13))(vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1))': + '@my-react/react-vite@0.0.17(@my-react/react-refresh@0.3.13(@my-react/react@0.3.13))(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1))': dependencies: '@babel/core': 7.26.8 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.8) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.8) '@my-react/react-refresh': 0.3.13(@my-react/react@0.3.13) - vite: 5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) + vite: 5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) transitivePeerDependencies: - supports-color @@ -6259,15 +6025,6 @@ snapshots: optionalDependencies: rollup: 4.34.6 - '@rollup/plugin-typescript@11.1.6(rollup@4.34.6)(tslib@2.8.1)(typescript@5.7.2)': - dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.34.6) - resolve: 1.22.10 - typescript: 5.7.2 - optionalDependencies: - rollup: 4.34.6 - tslib: 2.8.1 - '@rollup/plugin-typescript@12.1.2(rollup@4.34.6)(tslib@2.8.1)(typescript@5.3.3)': dependencies: '@rollup/pluginutils': 5.1.4(rollup@4.34.6) @@ -6346,17 +6103,6 @@ snapshots: '@rushstack/eslint-patch@1.10.5': {} - '@rushstack/node-core-library@4.0.2(@types/node@22.13.1)': - dependencies: - fs-extra: 7.0.1 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.22.10 - semver: 7.5.4 - z-schema: 5.0.5 - optionalDependencies: - '@types/node': 22.13.1 - '@rushstack/node-core-library@5.11.0(@types/node@22.13.1)': dependencies: ajv: 8.13.0 @@ -6370,23 +6116,11 @@ snapshots: optionalDependencies: '@types/node': 22.13.1 - '@rushstack/rig-package@0.5.2': - dependencies: - resolve: 1.22.10 - strip-json-comments: 3.1.1 - '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.10 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.10.0(@types/node@22.13.1)': - dependencies: - '@rushstack/node-core-library': 4.0.2(@types/node@22.13.1) - supports-color: 8.1.1 - optionalDependencies: - '@types/node': 22.13.1 - '@rushstack/terminal@0.14.6(@types/node@22.13.1)': dependencies: '@rushstack/node-core-library': 5.11.0(@types/node@22.13.1) @@ -6394,15 +6128,6 @@ snapshots: optionalDependencies: '@types/node': 22.13.1 - '@rushstack/ts-command-line@4.19.1(@types/node@22.13.1)': - dependencies: - '@rushstack/terminal': 0.10.0(@types/node@22.13.1) - '@types/argparse': 1.0.38 - argparse: 1.0.10 - string-argv: 0.3.2 - transitivePeerDependencies: - - '@types/node' - '@rushstack/ts-command-line@4.23.4(@types/node@22.13.1)': dependencies: '@rushstack/terminal': 0.14.6(@types/node@22.13.1) @@ -6745,56 +6470,43 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react@4.3.4(vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1))': + '@vitejs/plugin-react@4.3.4(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1))': dependencies: '@babel/core': 7.26.8 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.8) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.8) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) + vite: 5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue-jsx@4.1.1(vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1))(vue@3.5.13(typescript@5.7.2))': + '@vitejs/plugin-vue-jsx@4.1.1(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1))(vue@3.5.13(typescript@5.7.2))': dependencies: '@babel/core': 7.26.8 '@babel/plugin-transform-typescript': 7.26.8(@babel/core@7.26.8) '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.8) - vite: 5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) + vite: 5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) vue: 3.5.13(typescript@5.7.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.1(vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1))(vue@3.5.13(typescript@5.3.3))': + '@vitejs/plugin-vue@5.2.1(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1))(vue@3.5.13(typescript@5.3.3))': dependencies: - vite: 5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) + vite: 5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) vue: 3.5.13(typescript@5.3.3) - '@vitejs/plugin-vue@5.2.1(vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1))(vue@3.5.13(typescript@5.7.2))': + '@vitejs/plugin-vue@5.2.1(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1))(vue@3.5.13(typescript@5.7.2))': dependencies: - vite: 5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) + vite: 5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) vue: 3.5.13(typescript@5.7.2) - '@volar/language-core@1.11.1': - dependencies: - '@volar/source-map': 1.11.1 - '@volar/language-core@2.4.11': dependencies: '@volar/source-map': 2.4.11 - '@volar/source-map@1.11.1': - dependencies: - muggle-string: 0.3.1 - '@volar/source-map@2.4.11': {} - '@volar/typescript@1.11.1': - dependencies: - '@volar/language-core': 1.11.1 - path-browserify: 1.0.1 - '@volar/typescript@2.4.11': dependencies: '@volar/language-core': 2.4.11 @@ -6866,20 +6578,6 @@ snapshots: de-indent: 1.0.2 he: 1.2.0 - '@vue/language-core@1.8.27(typescript@5.7.2)': - dependencies: - '@volar/language-core': 1.11.1 - '@volar/source-map': 1.11.1 - '@vue/compiler-dom': 3.5.13 - '@vue/shared': 3.5.13 - computeds: 0.0.1 - minimatch: 9.0.5 - muggle-string: 0.3.1 - path-browserify: 1.0.1 - vue-template-compiler: 2.7.16 - optionalDependencies: - typescript: 5.7.2 - '@vue/language-core@2.2.0(typescript@5.3.3)': dependencies: '@volar/language-core': 2.4.11 @@ -7197,10 +6895,6 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bundle-name@4.1.0: - dependencies: - run-applescript: 7.0.0 - busboy@1.6.0: dependencies: streamsearch: 1.1.0 @@ -7311,9 +7005,6 @@ snapshots: commander@7.2.0: {} - commander@9.5.0: - optional: true - commondir@1.0.1: {} compare-versions@6.1.1: {} @@ -7334,8 +7025,6 @@ snapshots: transitivePeerDependencies: - supports-color - computeds@0.0.1: {} - concat-map@0.0.1: {} concat-with-sourcemaps@1.1.0: @@ -7510,21 +7199,12 @@ snapshots: deepmerge@4.3.1: {} - default-browser-id@5.0.0: {} - - default-browser@5.2.1: - dependencies: - bundle-name: 4.1.0 - default-browser-id: 5.0.0 - define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 es-errors: 1.3.0 gopd: 1.2.0 - define-lazy-prop@3.0.0: {} - define-properties@1.2.1: dependencies: define-data-property: 1.1.4 @@ -7636,8 +7316,6 @@ snapshots: dependencies: is-arrayish: 0.2.1 - error-stack-parser-es@0.1.5: {} - es-abstract@1.23.9: dependencies: array-buffer-byte-length: 1.0.2 @@ -8194,12 +7872,6 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 - fs-extra@7.0.1: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -8508,8 +8180,6 @@ snapshots: call-bound: 1.0.3 has-tostringtag: 1.0.2 - is-docker@3.0.0: {} - is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -8533,10 +8203,6 @@ snapshots: dependencies: html-tags: 3.3.1 - is-inside-container@1.0.0: - dependencies: - is-docker: 3.0.0 - is-map@2.0.3: {} is-module@1.0.0: {} @@ -8599,10 +8265,6 @@ snapshots: is-what@4.1.16: {} - is-wsl@3.1.0: - dependencies: - is-inside-container: 1.0.0 - isarray@2.0.5: {} isexe@2.0.0: {} @@ -8652,10 +8314,6 @@ snapshots: json5@2.2.3: {} - jsonfile@4.0.0: - optionalDependencies: - graceful-fs: 4.2.11 - jsonfile@6.1.0: dependencies: universalify: 2.0.1 @@ -8717,10 +8375,6 @@ snapshots: lodash.camelcase@4.3.0: {} - lodash.get@4.4.2: {} - - lodash.isequal@4.5.0: {} - lodash.memoize@4.1.2: {} lodash.merge@4.6.2: {} @@ -8862,8 +8516,6 @@ snapshots: ms@2.1.3: {} - muggle-string@0.3.1: {} - muggle-string@0.4.1: {} mz@2.7.0: @@ -8980,13 +8632,6 @@ snapshots: regex: 5.1.1 regex-recursion: 5.1.1 - open@10.1.1: - dependencies: - default-browser: 5.2.1 - define-lazy-prop: 3.0.0 - is-inside-container: 1.0.0 - is-wsl: 3.1.0 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -9067,8 +8712,6 @@ snapshots: pathe@2.0.2: {} - perfect-debounce@1.0.0: {} - picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -9691,11 +9334,6 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve@1.19.0: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - resolve@1.22.10: dependencies: is-core-module: 2.16.1 @@ -9772,8 +9410,6 @@ snapshots: setprototypeof: 1.2.0 utils-merge: 1.0.1 - run-applescript@7.0.0: {} - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -9849,8 +9485,14 @@ snapshots: dependencies: seroval: 1.2.1 + seroval-plugins@1.3.2(seroval@1.3.2): + dependencies: + seroval: 1.3.2 + seroval@1.2.1: {} + seroval@1.3.2: {} + serve-static@2.1.0: dependencies: encodeurl: 2.0.0 @@ -9989,6 +9631,12 @@ snapshots: seroval: 1.2.1 seroval-plugins: 1.2.1(seroval@1.2.1) + solid-js@1.9.7: + dependencies: + csstype: 3.1.3 + seroval: 1.3.2 + seroval-plugins: 1.3.2(seroval@1.3.2) + solid-refresh@0.6.3(solid-js@1.9.5): dependencies: '@babel/generator': 7.26.8 @@ -9998,6 +9646,15 @@ snapshots: transitivePeerDependencies: - supports-color + solid-refresh@0.6.3(solid-js@1.9.7): + dependencies: + '@babel/generator': 7.26.8 + '@babel/helper-module-imports': 7.25.9 + '@babel/types': 7.26.8 + solid-js: 1.9.7 + transitivePeerDependencies: + - supports-color + sonic-boom@4.2.0: dependencies: atomic-sleep: 1.0.0 @@ -10552,8 +10209,6 @@ snapshots: typescript@5.3.3: {} - typescript@5.4.2: {} - typescript@5.7.2: {} ufo@1.5.4: {} @@ -10594,8 +10249,6 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - universalify@0.1.2: {} - universalify@2.0.1: {} unpipe@1.0.0: {} @@ -10660,8 +10313,6 @@ snapshots: validate-html-nesting@1.2.2: {} - validator@13.15.0: {} - vary@1.1.2: {} vfile-message@4.0.2: @@ -10674,24 +10325,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-plugin-dts@3.9.1(@types/node@22.13.1)(rollup@4.34.6)(typescript@5.7.2)(vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)): - dependencies: - '@microsoft/api-extractor': 7.43.0(@types/node@22.13.1) - '@rollup/pluginutils': 5.1.4(rollup@4.34.6) - '@vue/language-core': 1.8.27(typescript@5.7.2) - debug: 4.4.0 - kolorist: 1.8.0 - magic-string: 0.30.17 - typescript: 5.7.2 - vue-tsc: 1.8.27(typescript@5.7.2) - optionalDependencies: - vite: 5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) - transitivePeerDependencies: - - '@types/node' - - rollup - - supports-color - - vite-plugin-dts@4.5.0(@types/node@22.13.1)(rollup@4.34.6)(typescript@5.7.2)(vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)): + vite-plugin-dts@4.5.0(@types/node@22.13.1)(rollup@4.34.6)(typescript@5.7.2)(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)): dependencies: '@microsoft/api-extractor': 7.49.2(@types/node@22.13.1) '@rollup/pluginutils': 5.1.4(rollup@4.34.6) @@ -10704,53 +10338,50 @@ snapshots: magic-string: 0.30.17 typescript: 5.7.2 optionalDependencies: - vite: 5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) + vite: 5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-inspect@0.8.9(rollup@4.34.6)(vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)): + vite-plugin-solid@2.11.6(solid-js@1.9.5)(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)): dependencies: - '@antfu/utils': 0.7.10 - '@rollup/pluginutils': 5.1.4(rollup@4.34.6) - debug: 4.4.0 - error-stack-parser-es: 0.1.5 - fs-extra: 11.3.0 - open: 10.1.1 - perfect-debounce: 1.0.0 - picocolors: 1.1.1 - sirv: 3.0.0 - vite: 5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) + '@babel/core': 7.26.8 + '@types/babel__core': 7.20.5 + babel-preset-solid: 1.9.5(@babel/core@7.26.8) + merge-anything: 5.1.7 + solid-js: 1.9.5 + solid-refresh: 0.6.3(solid-js@1.9.5) + vite: 5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) + vitefu: 1.0.6(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)) transitivePeerDependencies: - - rollup - supports-color - vite-plugin-solid@2.11.6(solid-js@1.9.5)(vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)): + vite-plugin-solid@2.11.6(solid-js@1.9.7)(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)): dependencies: '@babel/core': 7.26.8 '@types/babel__core': 7.20.5 babel-preset-solid: 1.9.5(@babel/core@7.26.8) merge-anything: 5.1.7 - solid-js: 1.9.5 - solid-refresh: 0.6.3(solid-js@1.9.5) - vite: 5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) - vitefu: 1.0.6(vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)) + solid-js: 1.9.7 + solid-refresh: 0.6.3(solid-js@1.9.7) + vite: 5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) + vitefu: 1.0.6(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)) transitivePeerDependencies: - supports-color - vite-tsconfig-paths@5.1.4(typescript@5.3.3)(vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)): + vite-tsconfig-paths@5.1.4(typescript@5.3.3)(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)): dependencies: debug: 4.4.0 globrex: 0.1.2 tsconfck: 3.1.5(typescript@5.3.3) optionalDependencies: - vite: 5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) + vite: 5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) transitivePeerDependencies: - supports-color - typescript - vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1): + vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1): dependencies: esbuild: 0.21.5 postcss: 8.5.1 @@ -10761,24 +10392,12 @@ snapshots: sugarss: 4.0.1(postcss@8.5.1) terser: 5.38.1 - vitefu@1.0.6(vite@5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)): + vitefu@1.0.6(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)): optionalDependencies: - vite: 5.4.14(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) + vite: 5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) vscode-uri@3.1.0: {} - vue-template-compiler@2.7.16: - dependencies: - de-indent: 1.0.2 - he: 1.2.0 - - vue-tsc@1.8.27(typescript@5.7.2): - dependencies: - '@volar/typescript': 1.11.1 - '@vue/language-core': 1.8.27(typescript@5.7.2) - semver: 7.7.1 - typescript: 5.7.2 - vue-tsc@2.2.0(typescript@5.3.3): dependencies: '@volar/typescript': 2.4.11 @@ -10908,12 +10527,4 @@ snapshots: yocto-queue@0.1.0: {} - z-schema@5.0.5: - dependencies: - lodash.get: 4.4.2 - lodash.isequal: 4.5.0 - validator: 13.15.0 - optionalDependencies: - commander: 9.5.0 - zwitch@2.0.4: {} diff --git a/ui/react-example/package.json b/ui/react-example/package.json index 02fb731..1522e25 100644 --- a/ui/react-example/package.json +++ b/ui/react-example/package.json @@ -43,7 +43,7 @@ "postcss-preset-mantine": "^1.17.0", "tailwindcss": "^3.4.17", "typescript": "5.3.3", - "vite": "^5.4.14", + "vite": "^5.4.19", "vite-tsconfig-paths": "^5.1.4" } } diff --git a/ui/solid-example/package.json b/ui/solid-example/package.json index a139a17..0e83e7e 100644 --- a/ui/solid-example/package.json +++ b/ui/solid-example/package.json @@ -9,12 +9,11 @@ "preview": "vite preview" }, "dependencies": { - "solid-js": "^1.9.3" + "solid-js": "^1.9.7" }, "devDependencies": { "typescript": "5.3.3", - "vite": "^5.4.10", - "vite-plugin-inspect": "^0.8.9", + "vite": "^5.4.19", "vite-plugin-solid": "^2.11.0" } } diff --git a/ui/solid-example/vite.config.ts b/ui/solid-example/vite.config.ts index 5f1ca99..4a303c3 100644 --- a/ui/solid-example/vite.config.ts +++ b/ui/solid-example/vite.config.ts @@ -1,7 +1,6 @@ import { defineConfig } from "vite"; -import inspect from "vite-plugin-inspect"; import solid from "vite-plugin-solid"; export default defineConfig({ - plugins: [solid(), inspect()], + plugins: [solid()], }); diff --git a/ui/vue-example/package.json b/ui/vue-example/package.json index 87024dc..594bbbc 100644 --- a/ui/vue-example/package.json +++ b/ui/vue-example/package.json @@ -18,7 +18,7 @@ "postcss": "^8.5.1", "tailwindcss": "^3.4.17", "typescript": "5.3.3", - "vite": "^5.4.14", + "vite": "^5.4.19", "vue-tsc": "^2.2.0" } } diff --git a/ui/vue-ssr-example/package.json b/ui/vue-ssr-example/package.json index 90ab7ec..301dc65 100644 --- a/ui/vue-ssr-example/package.json +++ b/ui/vue-ssr-example/package.json @@ -23,7 +23,7 @@ "@vitejs/plugin-vue": "^5.2.1", "cross-env": "^7.0.3", "typescript": "5.3.3", - "vite": "^5.4.14", + "vite": "^5.4.19", "vue-tsc": "^2.2.0" } } \ No newline at end of file From 981a91669b70126ca4a6a2d15a483273da5c0726 Mon Sep 17 00:00:00 2001 From: MrWangJustToDo <2711470541@qq.com> Date: Thu, 19 Jun 2025 20:21:52 +0800 Subject: [PATCH 07/12] wip --- packages/core/src/diff-file.ts | 3 +- packages/core/src/parse/change-range.ts | 2 +- packages/react/src/components/DiffView.tsx | 13 +- packages/solid/package.json | 3 +- packages/solid/src/components/DiffContent.tsx | 10 +- .../solid/src/components/DiffSplitView.tsx | 18 ++ .../src/components/DiffSplitViewNormal.tsx | 5 + .../src/components/DiffSplitViewWrap.tsx | 12 + .../{tool.ts => DiffUnifiedView.tsx} | 0 packages/solid/src/components/DiffView.tsx | 211 ++++++++++++++++-- .../solid/src/components/DiffViewContext.ts | 7 + .../solid/src/components/DiffWidgetContext.ts | 8 + packages/solid/src/components/tools.ts | 124 ++++++++++ packages/solid/src/hooks/index.ts | 1 + packages/solid/src/hooks/useEnableWrap.ts | 22 ++ packages/utils/index.d.ts | 6 + packages/utils/src/symbol.ts | 9 + packages/vue/src/components/DiffView.tsx | 15 +- pnpm-lock.yaml | 14 ++ scripts/build.ts | 5 + 20 files changed, 431 insertions(+), 57 deletions(-) create mode 100644 packages/solid/src/components/DiffSplitView.tsx create mode 100644 packages/solid/src/components/DiffSplitViewNormal.tsx create mode 100644 packages/solid/src/components/DiffSplitViewWrap.tsx rename packages/solid/src/components/{tool.ts => DiffUnifiedView.tsx} (100%) create mode 100644 packages/solid/src/components/DiffViewContext.ts create mode 100644 packages/solid/src/components/DiffWidgetContext.ts create mode 100644 packages/solid/src/components/tools.ts create mode 100644 packages/solid/src/hooks/index.ts create mode 100644 packages/solid/src/hooks/useEnableWrap.ts diff --git a/packages/core/src/diff-file.ts b/packages/core/src/diff-file.ts index e8e2310..7bede5b 100644 --- a/packages/core/src/diff-file.ts +++ b/packages/core/src/diff-file.ts @@ -1411,6 +1411,7 @@ export class DiffFile { return this.#newFileSyntaxLines?.[lineNumber]; }; + // TODO improve subscribe = (listener: (() => void) & { isSyncExternal?: boolean }) => { this.#listeners.push(listener); @@ -1578,7 +1579,7 @@ export class DiffFile { } }; - _getHighlighterName = () => this.#highlighterName; + _getHighlighterName = () => this.#highlighterName || ''; _getIsPureDiffRender = () => this.#composeByDiff; diff --git a/packages/core/src/parse/change-range.ts b/packages/core/src/parse/change-range.ts index 76ca54d..3446b0e 100644 --- a/packages/core/src/parse/change-range.ts +++ b/packages/core/src/parse/change-range.ts @@ -93,7 +93,7 @@ function checkNewLineSymbolChange( const hasNewLineChanged = addition.noTrailingNewLine !== deletion.noTrailingNewLine; - if (aSymbol === bSymbol) { + if (aSymbol === bSymbol && !hasNewLineChanged) { return { addSymbol: undefined, addString: stringA, delSymbol: undefined, delString: stringB }; } diff --git a/packages/react/src/components/DiffView.tsx b/packages/react/src/components/DiffView.tsx index 270f729..25a23be 100644 --- a/packages/react/src/components/DiffView.tsx +++ b/packages/react/src/components/DiffView.tsx @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-unnecessary-type-constraint */ /* eslint-disable @typescript-eslint/ban-ts-comment */ import { DiffFile, _cacheMap, SplitSide } from "@git-diff-view/core"; -import { diffFontSizeName } from "@git-diff-view/utils"; +import { diffFontSizeName, DiffModeEnum } from "@git-diff-view/utils"; import { memo, useEffect, useMemo, forwardRef, useImperativeHandle, useRef } from "react"; import * as React from "react"; @@ -20,16 +20,7 @@ import type { CSSProperties, ForwardedRef, ReactNode } from "react"; _cacheMap.name = "@git-diff-view/react"; -export { SplitSide }; - -export enum DiffModeEnum { - // github like - SplitGitHub = 1, - // gitlab like - SplitGitLab = 2, - Split = 1 | 2, - Unified = 4, -} +export { SplitSide, DiffModeEnum }; export type DiffViewProps = { data?: { diff --git a/packages/solid/package.json b/packages/solid/package.json index b8001b8..6a20886 100644 --- a/packages/solid/package.json +++ b/packages/solid/package.json @@ -43,7 +43,8 @@ "@types/hast": "^3.0.0", "highlight.js": "^11.11.0", "lowlight": "^3.3.0", - "fast-diff": "^1.3.0" + "fast-diff": "^1.3.0", + "reactivity-store": "^0.3.11" }, "devDependencies": { "solid-js": "^1.9.0", diff --git a/packages/solid/src/components/DiffContent.tsx b/packages/solid/src/components/DiffContent.tsx index 9d2c72a..f525a24 100644 --- a/packages/solid/src/components/DiffContent.tsx +++ b/packages/solid/src/components/DiffContent.tsx @@ -15,7 +15,7 @@ import { getSymbol, NewLineSymbol, } from "@git-diff-view/utils"; -import { createEffect, For, Show } from "solid-js"; +import { createMemo, For, Show } from "solid-js"; import { DiffNoNewLine } from "./DiffNoNewLine"; @@ -59,9 +59,7 @@ const DiffString = (props: { }; // eslint-disable-next-line solid/reactivity - initTemplateIfNeed(); - - createEffect(initTemplateIfNeed); + createMemo(initTemplateIfNeed); return ( { + const enableWrap = useEnableWrap(); + + return ( + }> + + + ); +}; diff --git a/packages/solid/src/components/DiffSplitViewNormal.tsx b/packages/solid/src/components/DiffSplitViewNormal.tsx new file mode 100644 index 0000000..6261570 --- /dev/null +++ b/packages/solid/src/components/DiffSplitViewNormal.tsx @@ -0,0 +1,5 @@ +import type { DiffFile } from "@git-diff-view/core"; + +export const DiffSplitViewNormal = (props: { diffFile: DiffFile }) => { + return
12
; +}; diff --git a/packages/solid/src/components/DiffSplitViewWrap.tsx b/packages/solid/src/components/DiffSplitViewWrap.tsx new file mode 100644 index 0000000..38655c2 --- /dev/null +++ b/packages/solid/src/components/DiffSplitViewWrap.tsx @@ -0,0 +1,12 @@ +import { getSplitContentLines, type DiffFile } from "@git-diff-view/core"; +import { createSignal } from "solid-js"; + +export const DiffSplitViewWrap = (props: { diffFile: DiffFile }) => { + const [] = createSignal(getSplitContentLines(props.diffFile)); + + const [] = createSignal(props.diffFile.splitLineLength.toString()); + + + + return
12
; +}; diff --git a/packages/solid/src/components/tool.ts b/packages/solid/src/components/DiffUnifiedView.tsx similarity index 100% rename from packages/solid/src/components/tool.ts rename to packages/solid/src/components/DiffUnifiedView.tsx diff --git a/packages/solid/src/components/DiffView.tsx b/packages/solid/src/components/DiffView.tsx index 32cbf74..3b3b50f 100644 --- a/packages/solid/src/components/DiffView.tsx +++ b/packages/solid/src/components/DiffView.tsx @@ -1,16 +1,17 @@ -import { DiffFile } from "@git-diff-view/core"; -import { type JSXElement, type JSX, createSignal, createRenderEffect } from "solid-js"; +/* eslint-disable @typescript-eslint/no-unnecessary-type-constraint */ +import { _cacheMap, DiffFile, SplitSide } from "@git-diff-view/core"; +import { diffFontSizeName, DiffModeEnum } from "@git-diff-view/utils"; +import { type JSXElement, type JSX, createSignal, createEffect, createMemo, onCleanup } from "solid-js"; + +import { DiffViewContext } from "./DiffViewContext"; +import { DiffWidgetContext } from "./DiffWidgetContext"; +import { createDiffConfigStore } from "./tools"; import type { DiffHighlighter, DiffHighlighterLang } from "@git-diff-view/core"; -export enum DiffModeEnum { - // github like - SplitGitHub = 1, - // gitlab like - SplitGitLab = 2, - Split = 1 | 2, - Unified = 4, -} +_cacheMap.name = "@git-diff-view/solid"; + +export { SplitSide, DiffModeEnum }; export type DiffViewProps = { data?: { @@ -18,7 +19,8 @@ export type DiffViewProps = { newFile?: { fileName?: string | null; fileLang?: DiffHighlighterLang | string | null; content?: string | null }; hunks: string[]; }; - extendData?: { oldFile?: Record; newFile?: Record }; + extendData?: { oldFile?: Record; newFile?: Record }; + initialWidgetState?: { side: SplitSide; lineNumber: number }; diffFile?: DiffFile; class?: string; style?: JSX.CSSProperties; @@ -56,15 +58,30 @@ export type DiffViewProps = { onAddWidgetClick?: (lineNumber: number, side: SplitSide) => void; }; -export const DiffView = (props: DiffViewProps) => { +type DiffViewProps_1 = Omit, "data"> & { + data?: { + oldFile?: { fileName?: string | null; fileLang?: DiffHighlighterLang | null; content?: string | null }; + newFile?: { fileName?: string | null; fileLang?: DiffHighlighterLang | null; content?: string | null }; + hunks: string[]; + }; +}; + +type DiffViewProps_2 = Omit, "data"> & { + data?: { + oldFile?: { fileName?: string | null; fileLang?: string | null; content?: string | null }; + newFile?: { fileName?: string | null; fileLang?: string | null; content?: string | null }; + hunks: string[]; + }; +}; + +const InternalDiffView = (props: DiffViewProps) => { const getInstance = () => { + let diffFile: DiffFile | null = null; if (props.diffFile) { - const diffFile = DiffFile.createInstance({}); + diffFile = DiffFile.createInstance({}); diffFile._mergeFullBundle(props.diffFile._getFullBundle()); - return diffFile; - } - if (props.data) - return new DiffFile( + } else if (props.data) { + diffFile = new DiffFile( props.data.oldFile?.fileName || "", props.data.oldFile?.content || "", props.data.newFile?.fileName || "", @@ -73,16 +90,164 @@ export const DiffView = (props: DiffViewProps) => { props.data.oldFile?.fileLang || "", props.data.newFile?.fileLang || "" ); - return null; + } + + onCleanup(() => diffFile?.clear?.()); + + return diffFile; }; - const [diffFile, setDiffFile] = createSignal(getInstance()); + let wrapperRef: HTMLDivElement | undefined; + + const diffFile = createMemo(getInstance); + + const [isMounted, setIsMounted] = createSignal(false); + + createEffect(() => { + setIsMounted(true); + }); + + const [widgetState, setWidgetState] = createSignal<{ side?: SplitSide; lineNumber?: number }>({ + side: props.initialWidgetState?.side, + lineNumber: props.initialWidgetState?.lineNumber, + }); + + const reactiveHook = createDiffConfigStore(props, diffFile()?.getId() || ""); + + createEffect(() => { + const { + setId, + setEnableAddWidget, + setEnableHighlight, + setEnableWrap, + setExtendData, + setFontSize, + setIsIsMounted, + setMode, + setOnAddWidgetClick, + setRenderExtendLine, + setRenderWidgetLine, + } = reactiveHook.getReadonlyState(); + const currentDiffFile = diffFile(); + + setId(currentDiffFile?.getId() || ""); + + setEnableAddWidget(!!props.diffViewAddWidget); + + setEnableHighlight(!!props.diffViewHighlight); + + setEnableWrap(!!props.diffViewWrap); - createRenderEffect(() => { - diffFile()?.clear(); + setFontSize(props.diffViewFontSize || 14); - setDiffFile(getInstance()); + setIsIsMounted(isMounted()); + + setMode(props.diffViewMode || DiffModeEnum.Split); + + setOnAddWidgetClick({ current: props.onAddWidgetClick }); + + setRenderExtendLine(props.renderExtendLine); + + setRenderWidgetLine(props.renderWidgetLine); + + setExtendData(props.extendData); + }); + + createEffect(() => { + if (props.initialWidgetState) { + setWidgetState({ + side: props.initialWidgetState.side, + lineNumber: props.initialWidgetState.lineNumber, + }); + } }); - return
DiffView
; + const initSubscribe = () => { + const mounted = isMounted(); + const currentDiffFile = diffFile(); + if (mounted && props.diffFile && currentDiffFile) { + props.diffFile._addClonedInstance(currentDiffFile); + onCleanup(() => props.diffFile?._delClonedInstance(currentDiffFile)); + } + }; + + const initDiff = () => { + const mounted = isMounted(); + const currentDiffFile = diffFile(); + if (mounted && currentDiffFile) { + currentDiffFile.initTheme(props.diffViewTheme); + currentDiffFile.initRaw(); + currentDiffFile.buildSplitDiffLines(); + currentDiffFile.buildUnifiedDiffLines(); + } + }; + + const initSyntax = () => { + const mounted = isMounted(); + const currentDiffFile = diffFile(); + if (mounted && currentDiffFile && props.diffViewHighlight) { + currentDiffFile.initSyntax({ registerHighlighter: props.registerHighlighter }); + currentDiffFile.notifyAll(); + } + }; + + const initAttribute = () => { + const mounted = isMounted(); + const currentDiffFile = diffFile(); + if (mounted && currentDiffFile && wrapperRef) { + const cb = currentDiffFile.subscribe(() => { + wrapperRef?.setAttribute("data-theme", currentDiffFile._getTheme() || "light"); + wrapperRef?.setAttribute("data-highlighter", currentDiffFile._getHighlighterName()); + }); + + onCleanup(() => cb()); + } + }; + + createEffect(initSubscribe); + + createEffect(initDiff); + + createEffect(initSyntax); + + createEffect(initAttribute); + + onCleanup(() => reactiveHook.clear()); + + return ( +
+ + +
+
+ {/* {!props.diffViewMode || props.diffViewMode & DiffModeEnum.Split ? ( + + ) : ( + + )} */} +
+
+
+
+
+ ); }; + +function SolidDiffView(props: DiffViewProps_1): JSXElement; +function SolidDiffView(props: DiffViewProps_2): JSXElement; +function SolidDiffView(props: DiffViewProps): JSXElement { + return ; +} + +export const DiffView = SolidDiffView; diff --git a/packages/solid/src/components/DiffViewContext.ts b/packages/solid/src/components/DiffViewContext.ts new file mode 100644 index 0000000..96e388a --- /dev/null +++ b/packages/solid/src/components/DiffViewContext.ts @@ -0,0 +1,7 @@ +import { createContext, useContext } from "solid-js"; + +import type { createDiffConfigStore } from "./tools"; + +export const DiffViewContext = createContext>(); + +export const useDiffViewContext = () => useContext(DiffViewContext); diff --git a/packages/solid/src/components/DiffWidgetContext.ts b/packages/solid/src/components/DiffWidgetContext.ts new file mode 100644 index 0000000..38a9ff1 --- /dev/null +++ b/packages/solid/src/components/DiffWidgetContext.ts @@ -0,0 +1,8 @@ +import { createContext, useContext } from "solid-js"; + +import type { SplitSide } from ".."; +import type { Accessor} from "solid-js"; + +export const DiffWidgetContext = createContext>(); + +export const useDiffWidgetContext = () => useContext(DiffWidgetContext); diff --git a/packages/solid/src/components/tools.ts b/packages/solid/src/components/tools.ts new file mode 100644 index 0000000..f395387 --- /dev/null +++ b/packages/solid/src/components/tools.ts @@ -0,0 +1,124 @@ +import { createStore, ref } from "reactivity-store"; + +import type { DiffModeEnum, DiffViewProps, SplitSide } from "./DiffView"; + +export const createDiffConfigStore = (props: DiffViewProps, diffFileId: string) => { + return createStore(() => { + const id = ref(diffFileId); + + const setId = (_id: string) => (id.value = _id); + + const mode = ref(props.diffViewMode); + + const setMode = (_mode: DiffModeEnum) => (mode.value = _mode); + + const isMounted = ref(false); + + const setIsIsMounted = (_isMounted: boolean) => (isMounted.value = _isMounted); + + const enableWrap = ref(props.diffViewWrap); + + const setEnableWrap = (_enableWrap: boolean) => (enableWrap.value = _enableWrap); + + const enableAddWidget = ref(props.diffViewAddWidget); + + const setEnableAddWidget = (_enableAddWidget: boolean) => (enableAddWidget.value = _enableAddWidget); + + const enableHighlight = ref(props.diffViewHighlight); + + const setEnableHighlight = (_enableHighlight: boolean) => (enableHighlight.value = _enableHighlight); + + const fontSize = ref(props.diffViewFontSize); + + const setFontSize = (_fontSize: number) => (fontSize.value = _fontSize); + + const extendData = ref({ + oldFile: { ...props.extendData?.oldFile }, + newFile: { ...props.extendData?.newFile }, + }); + + const setExtendData = (_extendData: DiffViewProps["extendData"]) => { + const existOldKeys = Object.keys(extendData.value.oldFile || {}); + const inComingOldKeys = Object.keys(_extendData?.oldFile || {}); + for (const key of existOldKeys) { + if (!inComingOldKeys.includes(key)) { + delete extendData.value.oldFile[key]; + } + } + for (const key of inComingOldKeys) { + extendData.value.oldFile[key] = _extendData?.oldFile?.[key]; + } + const existNewKeys = Object.keys(extendData.value.newFile || {}); + const inComingNewKeys = Object.keys(_extendData?.newFile || {}); + for (const key of existNewKeys) { + if (!inComingNewKeys.includes(key)) { + delete extendData.value.newFile[key]; + } + } + for (const key of inComingNewKeys) { + extendData.value.newFile[key] = _extendData?.newFile?.[key]; + } + }; + + const renderWidgetLine = ref(props.renderWidgetLine); + + const setRenderWidgetLine = (_renderWidgetLine: typeof renderWidgetLine.value) => + (renderWidgetLine.value = _renderWidgetLine); + + const renderExtendLine = ref(props.renderExtendLine); + + const setRenderExtendLine = (_renderExtendLine: typeof renderExtendLine.value) => + (renderExtendLine.value = _renderExtendLine); + + // 避免无意义的订阅 + const onAddWidgetClick = { current: props.onAddWidgetClick }; + + const setOnAddWidgetClick = (_onAddWidgetClick: typeof onAddWidgetClick) => + (onAddWidgetClick.current = _onAddWidgetClick.current); + + return { + id, + setId, + mode, + setMode, + isMounted, + setIsIsMounted, + enableWrap, + setEnableWrap, + enableAddWidget, + setEnableAddWidget, + enableHighlight, + setEnableHighlight, + fontSize, + setFontSize, + extendData, + setExtendData, + renderWidgetLine, + setRenderWidgetLine, + renderExtendLine, + setRenderExtendLine, + onAddWidgetClick, + setOnAddWidgetClick, + }; + }); +}; + +export const createDiffWidgetStore = (useDiffContextRef: ReturnType) => { + return createStore(() => { + const widgetSide = ref(); + + const widgetLineNumber = ref(); + + const setWidget = ({ side, lineNumber }: { side?: SplitSide; lineNumber?: number }) => { + const { renderWidgetLine } = useDiffContextRef?.getReadonlyState?.() || {}; + + if (typeof renderWidgetLine !== "function") return; + + widgetSide.value = side; + + widgetLineNumber.value = lineNumber; + }; + + return { widgetSide, widgetLineNumber, setWidget }; + }); +}; diff --git a/packages/solid/src/hooks/index.ts b/packages/solid/src/hooks/index.ts new file mode 100644 index 0000000..6ffff22 --- /dev/null +++ b/packages/solid/src/hooks/index.ts @@ -0,0 +1 @@ +export * from "./useEnableWrap"; diff --git a/packages/solid/src/hooks/useEnableWrap.ts b/packages/solid/src/hooks/useEnableWrap.ts new file mode 100644 index 0000000..778f145 --- /dev/null +++ b/packages/solid/src/hooks/useEnableWrap.ts @@ -0,0 +1,22 @@ +import { createEffect, createSignal, onCleanup, useContext } from "solid-js"; + +import { DiffViewContext } from "../components/DiffViewContext"; + +export const useEnableWrap = () => { + const reactiveHook = useContext(DiffViewContext); + + const [enableWrap, setEnableWrap] = createSignal(reactiveHook?.getReadonlyState().enableWrap); + + createEffect(() => { + const unsubscribe = reactiveHook?.subscribe( + (s) => s.enableWrap, + () => { + setEnableWrap(reactiveHook.getReadonlyState().enableWrap); + } + ); + + onCleanup(() => unsubscribe?.()); + }); + + return enableWrap; +}; diff --git a/packages/utils/index.d.ts b/packages/utils/index.d.ts index 99475c0..7cffed0 100644 --- a/packages/utils/index.d.ts +++ b/packages/utils/index.d.ts @@ -45,5 +45,11 @@ export declare enum NewLineSymbol { NULL = 6 } export declare const getSymbol: (symbol: NewLineSymbol | string | null | undefined) => "" | "\u240A" | "\u240D" | "\u240D\u240A"; +export declare enum DiffModeEnum { + SplitGitHub = 1, + SplitGitLab = 2, + Split = 3, + Unified = 4 +} export {}; diff --git a/packages/utils/src/symbol.ts b/packages/utils/src/symbol.ts index 9ba3dd4..78f0930 100644 --- a/packages/utils/src/symbol.ts +++ b/packages/utils/src/symbol.ts @@ -19,3 +19,12 @@ export const getSymbol = (symbol: NewLineSymbol | string | null | undefined) => return ""; } }; + +export enum DiffModeEnum { + // github like + SplitGitHub = 1, + // gitlab like + SplitGitLab = 2, + Split = 1 | 2, + Unified = 4, +} diff --git a/packages/vue/src/components/DiffView.tsx b/packages/vue/src/components/DiffView.tsx index 5463dc4..d03a5ad 100644 --- a/packages/vue/src/components/DiffView.tsx +++ b/packages/vue/src/components/DiffView.tsx @@ -1,5 +1,5 @@ import { DiffFile, _cacheMap, SplitSide } from "@git-diff-view/core"; -import { diffFontSizeName } from "@git-diff-view/utils"; +import { diffFontSizeName, DiffModeEnum } from "@git-diff-view/utils"; import { defineComponent, provide, ref, watch, watchEffect, computed, onUnmounted } from "vue"; import { @@ -27,16 +27,7 @@ import type { CSSProperties, SlotsType } from "vue"; _cacheMap.name = "@git-diff-view/vue"; -export enum DiffModeEnum { - // github like - SplitGitHub = 1, - // gitlab like - SplitGitLab = 2, - Split = 1 | 2, - Unified = 4, -} - -export { SplitSide }; +export { SplitSide, DiffModeEnum }; export type DiffViewProps = { data?: { @@ -125,8 +116,6 @@ export const DiffView = defineComponent< side: props.initialWidgetState.side, lineNumber: props.initialWidgetState.lineNumber, }; - } else { - widgetState.value = {}; } }, { immediate: true, deep: true } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6f73229..8734ae4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -210,6 +210,9 @@ importers: lowlight: specifier: ^3.3.0 version: 3.3.0 + reactivity-store: + specifier: ^0.3.11 + version: 0.3.11(react@19.0.0) devDependencies: autoprefixer: specifier: ^10.4.20 @@ -9281,6 +9284,13 @@ snapshots: react: 18.3.1 use-sync-external-store: 1.5.0(react@18.3.1) + reactivity-store@0.3.11(react@19.0.0): + dependencies: + '@vue/reactivity': 3.5.16 + '@vue/shared': 3.5.16 + react: 19.0.0 + use-sync-external-store: 1.5.0(react@19.0.0) + read-cache@1.0.0: dependencies: pify: 2.3.0 @@ -10305,6 +10315,10 @@ snapshots: dependencies: react: 18.3.1 + use-sync-external-store@1.5.0(react@19.0.0): + dependencies: + react: 19.0.0 + util-deprecate@1.0.2: {} utils-merge@1.0.1: {} diff --git a/scripts/build.ts b/scripts/build.ts index 0b6eb0c..45bbe65 100644 --- a/scripts/build.ts +++ b/scripts/build.ts @@ -109,6 +109,11 @@ const start = async () => { start(); +// (async () => { +// await rollupBuild({ packageName: "utils", packageScope: "packages", external: externalCorePackage }); +// await buildType("utils"); +// })(); + // (async () => { // await buildCss('react'); // await buildCss('vue'); From 24ebb0da2d2113da87d2875819cb58d74a2d23b4 Mon Sep 17 00:00:00 2001 From: MrWangJustToDo <2711470541@qq.com> Date: Fri, 20 Jun 2025 00:07:12 +0800 Subject: [PATCH 08/12] wip --- .../src/components/DiffSplitViewWrap.tsx | 18 ++++++++--- packages/solid/src/hooks/generate.ts | 32 +++++++++++++++++++ packages/solid/src/hooks/index.ts | 1 + packages/solid/src/hooks/useEnableWrap.ts | 23 ++----------- packages/solid/src/hooks/useFontSize.ts | 3 ++ 5 files changed, 51 insertions(+), 26 deletions(-) create mode 100644 packages/solid/src/hooks/generate.ts create mode 100644 packages/solid/src/hooks/useFontSize.ts diff --git a/packages/solid/src/components/DiffSplitViewWrap.tsx b/packages/solid/src/components/DiffSplitViewWrap.tsx index 38655c2..3d63081 100644 --- a/packages/solid/src/components/DiffSplitViewWrap.tsx +++ b/packages/solid/src/components/DiffSplitViewWrap.tsx @@ -1,12 +1,20 @@ -import { getSplitContentLines, type DiffFile } from "@git-diff-view/core"; -import { createSignal } from "solid-js"; +import { getSplitContentLines } from "@git-diff-view/core"; +import { createMemo, createSignal } from "solid-js"; + +import { useFontSize } from "../hooks"; + +import type { DiffFile, SplitSide } from "@git-diff-view/core"; export const DiffSplitViewWrap = (props: { diffFile: DiffFile }) => { - const [] = createSignal(getSplitContentLines(props.diffFile)); + const [lines, setLines] = createSignal(getSplitContentLines(props.diffFile)); + + const [maxText, setMaxText] = createSignal(props.diffFile.splitLineLength.toString()); + + const [splitSideInfo, setSplitInfo] = createSignal<{ side?: SplitSide }>({ side: undefined }); - const [] = createSignal(props.diffFile.splitLineLength.toString()); + const fontSize = useFontSize(); - + const font = createMemo(() => ({ fontSize: `${fontSize() || 14}px`, fontFamily: "Menlo, Consolas, monospace" })); return
12
; }; diff --git a/packages/solid/src/hooks/generate.ts b/packages/solid/src/hooks/generate.ts new file mode 100644 index 0000000..8c0fb39 --- /dev/null +++ b/packages/solid/src/hooks/generate.ts @@ -0,0 +1,32 @@ +import { createEffect, createSignal, onCleanup, useContext } from "solid-js"; + +import { DiffViewContext } from "../components/DiffViewContext"; + +import type { createDiffConfigStore } from "../components/tools"; + +type AllKey = keyof ReturnType["getReadonlyState"]>; + +type Data = ReturnType["getReadonlyState"]>; + +export const generateHook = (key: T) => { + return () => { + const reactiveHook = useContext(DiffViewContext); + + const [state, setState] = createSignal(reactiveHook?.getReadonlyState()[key] as K); + + createEffect(() => { + const unsubscribe = reactiveHook?.subscribe( + (s) => s[key], + () => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + setState(reactiveHook?.getReadonlyState()[key]); + } + ); + + onCleanup(() => unsubscribe?.()); + }); + + return state; + }; +}; diff --git a/packages/solid/src/hooks/index.ts b/packages/solid/src/hooks/index.ts index 6ffff22..49d346c 100644 --- a/packages/solid/src/hooks/index.ts +++ b/packages/solid/src/hooks/index.ts @@ -1 +1,2 @@ export * from "./useEnableWrap"; +export * from "./useFontSize"; diff --git a/packages/solid/src/hooks/useEnableWrap.ts b/packages/solid/src/hooks/useEnableWrap.ts index 778f145..ddbba53 100644 --- a/packages/solid/src/hooks/useEnableWrap.ts +++ b/packages/solid/src/hooks/useEnableWrap.ts @@ -1,22 +1,3 @@ -import { createEffect, createSignal, onCleanup, useContext } from "solid-js"; +import { generateHook } from "./generate"; -import { DiffViewContext } from "../components/DiffViewContext"; - -export const useEnableWrap = () => { - const reactiveHook = useContext(DiffViewContext); - - const [enableWrap, setEnableWrap] = createSignal(reactiveHook?.getReadonlyState().enableWrap); - - createEffect(() => { - const unsubscribe = reactiveHook?.subscribe( - (s) => s.enableWrap, - () => { - setEnableWrap(reactiveHook.getReadonlyState().enableWrap); - } - ); - - onCleanup(() => unsubscribe?.()); - }); - - return enableWrap; -}; +export const useEnableWrap = generateHook("enableWrap"); diff --git a/packages/solid/src/hooks/useFontSize.ts b/packages/solid/src/hooks/useFontSize.ts new file mode 100644 index 0000000..cff5f70 --- /dev/null +++ b/packages/solid/src/hooks/useFontSize.ts @@ -0,0 +1,3 @@ +import { generateHook } from "./generate"; + +export const useFontSize = generateHook("fontSize"); From 5ca2e5faf13f817d9fe62e8aed76879d5c6ddf5c Mon Sep 17 00:00:00 2001 From: MrWangJustToDo <2711470541@qq.com> Date: Fri, 20 Jun 2025 20:22:56 +0800 Subject: [PATCH 09/12] fix --- .../solid/src/components/DiffAddWidget.tsx | 4 +- packages/solid/src/components/DiffContent.tsx | 2 + packages/solid/src/components/DiffExpand.tsx | 12 +- .../components/DiffSplitContentLineWrap.tsx | 208 ++++++++++ .../components/DiffSplitExtendLineWrap.tsx | 108 +++++ .../src/components/DiffSplitHunkLineWrap.tsx | 370 ++++++++++++++++++ .../src/components/DiffSplitViewWrap.tsx | 118 +++++- .../components/DiffSplitWidgetLineWrap.tsx | 39 ++ packages/solid/src/components/DiffView.tsx | 2 +- .../solid/src/components/DiffWidgetContext.ts | 7 +- packages/solid/src/hooks/generate.ts | 6 +- packages/solid/src/hooks/index.ts | 9 + .../solid/src/hooks/useEnableAddWidget.ts | 3 + .../solid/src/hooks/useEnableHighlight.ts | 3 + packages/solid/src/hooks/useExtendData.ts | 3 + packages/solid/src/hooks/useIsMounted.ts | 3 + packages/solid/src/hooks/useMode.ts | 3 + .../solid/src/hooks/useOnAddWidgetClick.ts | 3 + packages/solid/src/hooks/useRenderExtend.ts | 3 + packages/solid/src/hooks/useRenderWidget.ts | 3 + packages/solid/src/hooks/useTextWidth.ts | 32 ++ .../components/DiffSplitWidgetLineWrap.tsx | 1 + 22 files changed, 923 insertions(+), 19 deletions(-) create mode 100644 packages/solid/src/components/DiffSplitContentLineWrap.tsx create mode 100644 packages/solid/src/components/DiffSplitExtendLineWrap.tsx create mode 100644 packages/solid/src/components/DiffSplitHunkLineWrap.tsx create mode 100644 packages/solid/src/components/DiffSplitWidgetLineWrap.tsx create mode 100644 packages/solid/src/hooks/useEnableAddWidget.ts create mode 100644 packages/solid/src/hooks/useEnableHighlight.ts create mode 100644 packages/solid/src/hooks/useExtendData.ts create mode 100644 packages/solid/src/hooks/useIsMounted.ts create mode 100644 packages/solid/src/hooks/useMode.ts create mode 100644 packages/solid/src/hooks/useOnAddWidgetClick.ts create mode 100644 packages/solid/src/hooks/useRenderExtend.ts create mode 100644 packages/solid/src/hooks/useRenderWidget.ts create mode 100644 packages/solid/src/hooks/useTextWidth.ts diff --git a/packages/solid/src/components/DiffAddWidget.tsx b/packages/solid/src/components/DiffAddWidget.tsx index 1c4cd3e..c1f5f86 100644 --- a/packages/solid/src/components/DiffAddWidget.tsx +++ b/packages/solid/src/components/DiffAddWidget.tsx @@ -4,7 +4,7 @@ import type { DiffFile, SplitSide } from "@git-diff-view/core"; export const DiffSplitAddWidget = (props: { index: number; - className?: string; + class?: string; lineNumber: number; diffFile: DiffFile; side: SplitSide; @@ -15,7 +15,7 @@ export const DiffSplitAddWidget = (props: {
diff --git a/packages/solid/src/components/DiffExpand.tsx b/packages/solid/src/components/DiffExpand.tsx index b480b9a..b2576d7 100644 --- a/packages/solid/src/components/DiffExpand.tsx +++ b/packages/solid/src/components/DiffExpand.tsx @@ -1,22 +1,22 @@ -export const ExpandDown = (props: { className: string }) => { +export const ExpandDown = (props: { class: string }) => { return ( - + {oldLine().lineNumber} + + + + {hasDiff() && enableAddWidget() && ( + + )} + + + + ) : ( + + + + )} + {newLine().lineNumber ? ( + <> + + {hasDiff() && enableAddWidget() && ( + + )} + + {newLine().lineNumber} + + + + {hasDiff() && enableAddWidget() && ( + + )} + + + + ) : ( + + + + )} + + + ); +}; diff --git a/packages/solid/src/components/DiffSplitExtendLineWrap.tsx b/packages/solid/src/components/DiffSplitExtendLineWrap.tsx new file mode 100644 index 0000000..1d41c3e --- /dev/null +++ b/packages/solid/src/components/DiffSplitExtendLineWrap.tsx @@ -0,0 +1,108 @@ +import { SplitSide, type DiffFile } from "@git-diff-view/core"; +import { borderColorName, emptyBGName } from "@git-diff-view/utils"; +import { createEffect, createSignal, onCleanup, Show } from "solid-js"; + +import { useExtendData, useRenderExtend } from "../hooks"; + +export const DiffSplitExtendLine = (props: { index: number; diffFile: DiffFile; lineNumber: number }) => { + const extendData = useExtendData(); + + const renderExtend = useRenderExtend(); + + const [oldLine, setOldLine] = createSignal(props.diffFile.getSplitLeftLine(props.index)); + + const [newLine, setNewLine] = createSignal(props.diffFile.getSplitRightLine(props.index)); + + const [enableExpand, setEnableExpand] = createSignal(props.diffFile.getExpandEnabled()); + + const [oldLineExtend, setOldLineExtend] = createSignal(extendData()?.oldFile?.[oldLine()?.lineNumber || ""]); + + const [newLineExtend, setNewLineExtend] = createSignal(extendData()?.newFile?.[newLine()?.lineNumber || ""]); + + const checkIsShow = () => { + const oldExtend = oldLineExtend(); + const newExtend = newLineExtend(); + const oldLineData = oldLine(); + const newLineData = newLine(); + const enableExpandValue = enableExpand(); + const renderExtendValue = renderExtend(); + + return ( + (oldExtend || newExtend) && + ((!oldLineData?.isHidden && !newLineData?.isHidden) || enableExpandValue) && + renderExtendValue + ); + }; + + const [currentIsShow, setCurrentIsShow] = createSignal(!!checkIsShow()); + + createEffect(() => { + const init = () => { + setOldLine(props.diffFile.getSplitLeftLine(props.index)); + setNewLine(props.diffFile.getSplitRightLine(props.index)); + setEnableExpand(props.diffFile.getExpandEnabled()); + setOldLineExtend(extendData()?.oldFile?.[oldLine()?.lineNumber || ""]); + setNewLineExtend(extendData()?.newFile?.[newLine()?.lineNumber || ""]); + setCurrentIsShow(!!checkIsShow()); + }; + + init(); + + const cb = props.diffFile.subscribe(init); + + onCleanup(cb); + }); + + return ( + + + {renderExtend() ? ( + +
+ {renderExtend()?.({ + diffFile: props.diffFile, + side: SplitSide.old, + lineNumber: oldLine()?.lineNumber || 0, + data: oldLineExtend()?.data, + onUpdate: props.diffFile.notifyAll, + })} +
+ + ) : ( + + )} + {renderExtend() ? ( + +
+ {renderExtend()?.({ + diffFile: props.diffFile, + side: SplitSide.new, + lineNumber: newLine()?.lineNumber || 0, + data: newLineExtend()?.data, + onUpdate: props.diffFile.notifyAll, + })} +
+ + ) : ( + + )} + +
+ ); +}; diff --git a/packages/solid/src/components/DiffSplitHunkLineWrap.tsx b/packages/solid/src/components/DiffSplitHunkLineWrap.tsx new file mode 100644 index 0000000..96de9d8 --- /dev/null +++ b/packages/solid/src/components/DiffSplitHunkLineWrap.tsx @@ -0,0 +1,370 @@ +import { composeLen, type DiffFile } from "@git-diff-view/core"; +import { + borderColorName, + DiffModeEnum, + hunkContentBGName, + hunkContentColorName, + hunkLineNumberBGName, + plainLineNumberColorName, +} from "@git-diff-view/utils"; +import { createEffect, createMemo, createSignal, Show } from "solid-js"; + +import { useMode } from "../hooks"; + +import { ExpandAll, ExpandDown, ExpandUp } from "./DiffExpand"; + +const DiffSplitHunkLineGitHub = (props: { index: number; diffFile: DiffFile; lineNumber: number }) => { + const [currentHunk, setCurrentHunk] = createSignal(props.diffFile.getSplitHunkLine(props.index)); + + const [enableExpand, setEnableExpand] = createSignal(props.diffFile.getExpandEnabled()); + + const [couldExpand, setCouldExpand] = createSignal(enableExpand() && currentHunk()?.splitInfo); + + const checkCurrentShowExpandAll = () => { + const hunk = currentHunk(); + return hunk && hunk.splitInfo && hunk.splitInfo.endHiddenIndex - hunk.splitInfo.startHiddenIndex >= composeLen; + }; + + const [currentShowExpandAll, setCurrentShowExpandAll] = createSignal(checkCurrentShowExpandAll()); + + const checkCurrentIsShow = () => { + const hunk = currentHunk(); + return hunk && hunk.splitInfo && hunk.splitInfo.startHiddenIndex < hunk.splitInfo.endHiddenIndex; + }; + + const [currentIsShow, setCurrentIsShow] = createSignal(checkCurrentIsShow()); + + const currentIsFirstLine = createMemo(() => { + const hunk = currentHunk(); + return hunk && hunk.isFirst; + }); + + const currentIsPureHunk = createMemo(() => { + const hunk = currentHunk(); + return hunk && !hunk.splitInfo; + }); + + const currentIsLastLine = createMemo(() => { + const hunk = currentHunk(); + return hunk && hunk.isLast; + }); + + createEffect(() => { + const init = () => { + setCurrentHunk(props.diffFile.getSplitHunkLine(props.index)); + setEnableExpand(props.diffFile.getExpandEnabled()); + setCouldExpand(enableExpand() && currentHunk()?.splitInfo); + setCurrentShowExpandAll(checkCurrentShowExpandAll()); + setCurrentIsShow(checkCurrentIsShow()); + }; + + init(); + + const cb = props.diffFile.subscribe(init); + + return () => { + cb(); + }; + }); + + return ( + + + + {couldExpand() ? ( + currentIsFirstLine() ? ( + + ) : currentIsLastLine() ? ( + + ) : currentShowExpandAll() ? ( + + ) : ( + <> + + + + ) + ) : ( +
+ )} + + +
+ {currentHunk().splitInfo?.plainText || currentHunk().text} +
+ + +
+ ); +}; + +const DiffSplitHunkLineGitLab = (props: { index: number; diffFile: DiffFile; lineNumber: number }) => { + const [currentHunk, setCurrentHunk] = createSignal(props.diffFile.getSplitHunkLine(props.index)); + + const [enableExpand, setEnableExpand] = createSignal(props.diffFile.getExpandEnabled()); + + const [couldExpand, setCouldExpand] = createSignal(enableExpand() && currentHunk()?.splitInfo); + + const checkCurrentShowExpandAll = () => { + const hunk = currentHunk(); + return hunk && hunk.splitInfo && hunk.splitInfo.endHiddenIndex - hunk.splitInfo.startHiddenIndex >= composeLen; + }; + + const [currentShowExpandAll, setCurrentShowExpandAll] = createSignal(checkCurrentShowExpandAll()); + + const checkCurrentIsShow = () => { + const hunk = currentHunk(); + return hunk && hunk.splitInfo && hunk.splitInfo.startHiddenIndex < hunk.splitInfo.endHiddenIndex; + }; + + const [currentIsShow, setCurrentIsShow] = createSignal(checkCurrentIsShow()); + + const currentIsFirstLine = createMemo(() => { + const hunk = currentHunk(); + return hunk && hunk.isFirst; + }); + + const currentIsPureHunk = createMemo(() => { + const hunk = currentHunk(); + return hunk && !hunk.splitInfo; + }); + + const currentIsLastLine = createMemo(() => { + const hunk = currentHunk(); + return hunk && hunk.isLast; + }); + + createEffect(() => { + const init = () => { + setCurrentHunk(props.diffFile.getSplitHunkLine(props.index)); + setEnableExpand(props.diffFile.getExpandEnabled()); + setCouldExpand(enableExpand() && currentHunk()?.splitInfo); + setCurrentShowExpandAll(checkCurrentShowExpandAll()); + setCurrentIsShow(checkCurrentIsShow()); + }; + + init(); + + const cb = props.diffFile.subscribe(init); + + return () => { + cb(); + }; + }); + + return ( + + + + {couldExpand() ? ( + currentIsFirstLine() ? ( + + ) : currentIsLastLine() ? ( + + ) : currentShowExpandAll() ? ( + + ) : ( + <> + + + + ) + ) : ( +
+ )} + + +
+ {currentHunk().splitInfo?.plainText || currentHunk().text} +
+ + + {couldExpand() ? ( + currentIsFirstLine() ? ( + + ) : currentIsLastLine() ? ( + + ) : currentShowExpandAll() ? ( + + ) : ( + <> + + + + ) + ) : ( +
+ )} + + +
+ {currentHunk().splitInfo?.plainText || currentHunk().text} +
+ + +
+ ); +}; + +export const DiffSplitHunkLine = (props: { index: number; diffFile: DiffFile; lineNumber: number }) => { + const mode = useMode(); + + return ( + } + > + + + ); +}; diff --git a/packages/solid/src/components/DiffSplitViewWrap.tsx b/packages/solid/src/components/DiffSplitViewWrap.tsx index 3d63081..bd9d411 100644 --- a/packages/solid/src/components/DiffSplitViewWrap.tsx +++ b/packages/solid/src/components/DiffSplitViewWrap.tsx @@ -1,9 +1,22 @@ -import { getSplitContentLines } from "@git-diff-view/core"; -import { createMemo, createSignal } from "solid-js"; +import { getSplitContentLines, SplitSide } from "@git-diff-view/core"; +import { diffAsideWidthName, diffFontSizeName, removeAllSelection } from "@git-diff-view/utils"; +import { createEffect, createMemo, createSignal, onCleanup, For } from "solid-js"; -import { useFontSize } from "../hooks"; +import { useFontSize, useTextWidth } from "../hooks"; -import type { DiffFile, SplitSide } from "@git-diff-view/core"; +import type { DiffFile } from "@git-diff-view/core"; + +const Style = (props: { splitSideInfo: { side?: SplitSide }; id: string }) => { + return ( + + ); +}; export const DiffSplitViewWrap = (props: { diffFile: DiffFile }) => { const [lines, setLines] = createSignal(getSplitContentLines(props.diffFile)); @@ -16,5 +29,100 @@ export const DiffSplitViewWrap = (props: { diffFile: DiffFile }) => { const font = createMemo(() => ({ fontSize: `${fontSize() || 14}px`, fontFamily: "Menlo, Consolas, monospace" })); - return
12
; + createEffect(() => { + const init = () => { + setLines(getSplitContentLines(props.diffFile)); + setMaxText(props.diffFile.splitLineLength.toString()); + }; + + init(); + + const cb = props.diffFile.subscribe(init); + + onCleanup(cb); + }); + + const onMouseDown = (e: MouseEvent) => { + let ele = e.target; + + // need remove all the selection + if (ele && ele instanceof HTMLElement && ele.nodeName === "BUTTON") { + removeAllSelection(); + return; + } + + while (ele && ele instanceof HTMLElement) { + const state = ele.getAttribute("data-state"); + const side = ele.getAttribute("data-side"); + if (side) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + setSplitInfo({ side: SplitSide[side] }); + removeAllSelection(); + } + if (state) { + if (state === "extend" || state === "hunk" || state === "widget") { + setSplitInfo({ side: undefined }); + removeAllSelection(); + return; + } else { + return; + } + } + + ele = ele.parentElement; + } + }; + + const width = useTextWidth({ text: maxText, font }); + + const memoWidth = createMemo(() => Math.max(40, width() + 25)); + + return ( +
+
+ +
(ref1 = l)} + style={{ + [diffAsideWidthName]: `${Math.round(computedWidth())}px`, + "overscroll-behavior-x": "none", + "font-family": "Menlo, Consolas, monospace", + "font-size": `var(${diffFontSizeName})`, + }} + > + setSide(s)} /> +
+
+
(ref2 = l)} + style={{ + [diffAsideWidthName]: `${Math.round(computedWidth())}px`, + "overscroll-behavior-x": "none", + "font-family": "Menlo, Consolas, monospace", + "font-size": `var(${diffFontSizeName})`, + }} + > + setSide(s)} /> +
+
+ ); }; diff --git a/packages/solid/src/components/DiffSplitViewWrap.tsx b/packages/solid/src/components/DiffSplitViewWrap.tsx index bd9d411..2b3280f 100644 --- a/packages/solid/src/components/DiffSplitViewWrap.tsx +++ b/packages/solid/src/components/DiffSplitViewWrap.tsx @@ -4,6 +4,11 @@ import { createEffect, createMemo, createSignal, onCleanup, For } from "solid-js import { useFontSize, useTextWidth } from "../hooks"; +import { DiffSplitContentLine } from "./DiffSplitContentLineWrap"; +import { DiffSplitExtendLine } from "./DiffSplitExtendLineWrap"; +import { DiffSplitHunkLine } from "./DiffSplitHunkLineWrap"; +import { DiffSplitWidgetLine } from "./DiffSplitWidgetLineWrap"; + import type { DiffFile } from "@git-diff-view/core"; const Style = (props: { splitSideInfo: { side?: SplitSide }; id: string }) => { diff --git a/packages/solid/src/components/DiffSplitWidgetLineNormal.tsx b/packages/solid/src/components/DiffSplitWidgetLineNormal.tsx new file mode 100644 index 0000000..f92ce81 --- /dev/null +++ b/packages/solid/src/components/DiffSplitWidgetLineNormal.tsx @@ -0,0 +1,120 @@ +import { SplitSide, type DiffFile } from "@git-diff-view/core"; +import { emptyBGName } from "@git-diff-view/utils"; +import { createEffect, createMemo, createSignal, onCleanup, Show } from "solid-js"; + +import { useDomWidth, useRenderWidget, useSyncHeight } from "../hooks"; + +import { useDiffWidgetContext } from "./DiffWidgetContext"; + +export const DiffSplitWidgetLine = (props: { + index: number; + side: SplitSide; + diffFile: DiffFile; + lineNumber: number; +}) => { + const renderWidget = useRenderWidget(); + + const [widget, setWidget] = useDiffWidgetContext() || []; + + const [oldLine, setOldLine] = createSignal(props.diffFile.getSplitLeftLine(props.index)); + + const [newLine, setNewLine] = createSignal(props.diffFile.getSplitRightLine(props.index)); + + const oldLineWidget = createMemo( + () => + !!oldLine()?.lineNumber && widget?.()?.side === SplitSide.old && widget?.()?.lineNumber === oldLine()?.lineNumber + ); + + const newLineWidget = createMemo( + () => + !!newLine()?.lineNumber && widget?.()?.side === SplitSide.new && widget?.()?.lineNumber === newLine()?.lineNumber + ); + + const currentLine = createMemo(() => (props.side === SplitSide.old ? oldLine() : newLine())); + + const [currentIsHidden, setCurrentIsHidden] = createSignal(currentLine()?.isHidden); + + createEffect(() => { + const init = () => { + setOldLine(props.diffFile.getSplitLeftLine(props.index)); + setNewLine(props.diffFile.getSplitRightLine(props.index)); + setCurrentIsHidden(currentLine()?.isHidden); + }; + + init(); + + const cb = props.diffFile.subscribe(init); + + onCleanup(cb); + }); + + const lineSelector = createMemo(() => `div[data-line="${props.lineNumber}-widget-content"]`); + + const lineWrapperSelector = createMemo(() => `tr[data-line="${props.lineNumber}-widget"]`); + + const wrapperSelector = createMemo(() => + props.side === SplitSide.old ? ".old-diff-table-wrapper" : ".new-diff-table-wrapper" + ); + + const observeSide = createMemo(() => SplitSide[props.side]); + + const currentIsShow = createMemo( + () => (!!oldLineWidget() || !!newLineWidget()) && !currentIsHidden() && !newLine()?.isHidden && !!renderWidget + ); + + const currentWidget = createMemo( + () => (props.side === SplitSide.old ? oldLineWidget() : newLineWidget()) && !!currentIsShow() + ); + + const onCloseWidget = () => setWidget?.({}); + + useSyncHeight({ + selector: lineSelector, + wrapper: lineWrapperSelector, + side: observeSide, + enable: currentIsShow, + }); + + const width = useDomWidth({ + selector: wrapperSelector, + enable: currentWidget, + }); + + return ( + + + {currentWidget() ? ( + +
+ {width() > 0 && + renderWidget()?.({ + diffFile: props.diffFile, + side: props.side, + lineNumber: currentLine()?.lineNumber || 0, + onClose: onCloseWidget, + })} +
+ + ) : ( + +
+ + )} + + + ); +}; diff --git a/packages/solid/src/components/DiffSplitWidgetLineWrap.tsx b/packages/solid/src/components/DiffSplitWidgetLineWrap.tsx index 498795f..4f54c61 100644 --- a/packages/solid/src/components/DiffSplitWidgetLineWrap.tsx +++ b/packages/solid/src/components/DiffSplitWidgetLineWrap.tsx @@ -1,5 +1,6 @@ import { SplitSide, type DiffFile } from "@git-diff-view/core"; -import { createEffect, createMemo, createSignal, onCleanup } from "solid-js"; +import { borderColorName, emptyBGName } from "@git-diff-view/utils"; +import { createEffect, createMemo, createSignal, onCleanup, Show } from "solid-js"; import { useRenderWidget } from "../hooks"; @@ -15,11 +16,11 @@ export const DiffSplitWidgetLine = (props: { index: number; diffFile: DiffFile; const [newLine, setNewLine] = createSignal(props.diffFile.getSplitRightLine(props.index)); const oldLineWidget = createMemo( - () => oldLine().lineNumber && widget?.()?.side === SplitSide.old && widget?.()?.lineNumber === oldLine().lineNumber + () => oldLine()?.lineNumber && widget?.()?.side === SplitSide.old && widget?.()?.lineNumber === oldLine()?.lineNumber ); const newLineWidget = createMemo( - () => newLine().lineNumber && widget?.()?.side === SplitSide.new && widget?.()?.lineNumber === newLine().lineNumber + () => newLine()?.lineNumber && widget?.()?.side === SplitSide.new && widget?.()?.lineNumber === newLine()?.lineNumber ); createEffect(() => { @@ -35,5 +36,61 @@ export const DiffSplitWidgetLine = (props: { index: number; diffFile: DiffFile; onCleanup(cb); }); + // TODO improve + const currentIsShow = createMemo( + () => (!!oldLineWidget() || !!newLineWidget()) && !oldLine()?.isHidden && !newLine()?.isHidden && !!renderWidget + ); + const onCloseWidget = () => setWidget?.({}); + + return ( + + + {oldLineWidget() && renderWidget() ? ( + +
+ {renderWidget?.()?.({ + diffFile: props.diffFile, + side: SplitSide.old, + lineNumber: oldLine()?.lineNumber || 0, + onClose: onCloseWidget, + })} +
+ + ) : ( + + )} + {newLineWidget() && renderWidget() ? ( + +
+ {renderWidget?.()?.({ + diffFile: props.diffFile, + side: SplitSide.new, + lineNumber: newLine()?.lineNumber || 0, + onClose: onCloseWidget, + })} +
+ + ) : ( + + )} + +
+ ); }; diff --git a/packages/solid/src/components/DiffUnifiedView.tsx b/packages/solid/src/components/DiffUnifiedView.tsx index e69de29..8427599 100644 --- a/packages/solid/src/components/DiffUnifiedView.tsx +++ b/packages/solid/src/components/DiffUnifiedView.tsx @@ -0,0 +1,10 @@ +import type { DiffFile } from "@git-diff-view/core"; + +export const DiffUnifiedView = (props: { diffFile: DiffFile }) => { + return ( +
+

Unified Diff View

+

This is a placeholder for the unified diff view component.

+
+ ); +}; diff --git a/packages/solid/src/components/DiffView.tsx b/packages/solid/src/components/DiffView.tsx index ea42aaa..565c117 100644 --- a/packages/solid/src/components/DiffView.tsx +++ b/packages/solid/src/components/DiffView.tsx @@ -1,8 +1,10 @@ /* eslint-disable @typescript-eslint/no-unnecessary-type-constraint */ import { _cacheMap, DiffFile, SplitSide } from "@git-diff-view/core"; import { diffFontSizeName, DiffModeEnum } from "@git-diff-view/utils"; -import { type JSXElement, type JSX, createSignal, createEffect, createMemo, onCleanup } from "solid-js"; +import { type JSXElement, type JSX, createSignal, createEffect, createMemo, onCleanup, Show } from "solid-js"; +import { DiffSplitView } from "./DiffSplitView"; +import { DiffUnifiedView } from "./DiffUnifiedView"; import { DiffViewContext } from "./DiffViewContext"; import { DiffWidgetContext } from "./DiffWidgetContext"; import { createDiffConfigStore } from "./tools"; @@ -215,32 +217,34 @@ const InternalDiffView = (props: DiffViewProps) => { onCleanup(() => reactiveHook.clear()); return ( -
- - -
-
- {/* {!props.diffViewMode || props.diffViewMode & DiffModeEnum.Split ? ( - - ) : ( - - )} */} + +
+ + +
+
+ {!props.diffViewMode || props.diffViewMode & DiffModeEnum.Split ? ( + + ) : ( + + )} +
-
- - -
+ + +
+ ); }; diff --git a/packages/solid/src/hooks/generate.ts b/packages/solid/src/hooks/generate.ts index a4a4a57..f347c7d 100644 --- a/packages/solid/src/hooks/generate.ts +++ b/packages/solid/src/hooks/generate.ts @@ -15,13 +15,15 @@ export const generateHook = (key: const [state, setState] = createSignal(reactiveHook?.getReadonlyState()[key] as K); createEffect(() => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + const init = () => setState(reactiveHook?.getReadonlyState()[key] as K); + + init(); + const unsubscribe = reactiveHook?.subscribe( (s) => s[key], - () => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - setState(reactiveHook?.getReadonlyState()[key]); - } + () => init() ); onCleanup(() => unsubscribe?.()); diff --git a/packages/solid/src/hooks/index.ts b/packages/solid/src/hooks/index.ts index e5815fd..6fe2fda 100644 --- a/packages/solid/src/hooks/index.ts +++ b/packages/solid/src/hooks/index.ts @@ -3,6 +3,9 @@ export * from "./useFontSize"; export * from "./useIsMounted"; export * from "./useTextWidth"; export * from "./useMode"; +export * from "./useId"; +export * from "./useDomWidth"; +export * from "./useSyncHeight"; export * from "./useExtendData"; export * from "./useRenderExtend"; export * from "./useRenderWidget"; diff --git a/packages/solid/src/hooks/useDomWidth.ts b/packages/solid/src/hooks/useDomWidth.ts new file mode 100644 index 0000000..38cd518 --- /dev/null +++ b/packages/solid/src/hooks/useDomWidth.ts @@ -0,0 +1,74 @@ +import { createEffect, createSignal, onCleanup, type Accessor } from "solid-js"; + +import { useId } from "./useId"; +import { useIsMounted } from "./useIsMounted"; + +type ObserveElement = HTMLElement & { + __observeCallback?: Set<() => void>; + __observeInstance?: ResizeObserver; +}; + +export const useDomWidth = ({ selector, enable }: { selector: Accessor; enable: Accessor }) => { + const id = useId(); + + const mounted = useIsMounted(); + + const [width, setWidth] = createSignal(0); + + const observeWidth = () => { + if (!mounted()) return; + + if (enable()) { + const container = document.querySelector(`#diff-root${id()}`); + + const wrapper = container?.querySelector(selector()); + + if (!wrapper) return; + + const typedWrapper = wrapper as ObserveElement; + + const cb = () => { + const rect = wrapper?.getBoundingClientRect(); + setWidth(rect?.width ?? 0); + }; + + cb(); + + const cleanCb = () => { + typedWrapper?.__observeCallback?.delete(cb); + if (typedWrapper?.__observeCallback?.size === 0) { + typedWrapper.__observeInstance?.disconnect(); + typedWrapper.removeAttribute("data-observe"); + delete typedWrapper.__observeCallback; + delete typedWrapper.__observeInstance; + } + }; + + if (typedWrapper.__observeCallback) { + typedWrapper.__observeCallback.add(cb); + + onCleanup(() => cleanCb()); + + return; + } + + typedWrapper.__observeCallback = new Set(); + + typedWrapper.__observeCallback.add(cb); + + const observer = new ResizeObserver(() => typedWrapper?.__observeCallback?.forEach?.((cb) => cb())); + + typedWrapper.__observeInstance = observer; + + observer.observe(typedWrapper); + + typedWrapper.setAttribute("data-observe", "height"); + + onCleanup(() => cleanCb()); + } + }; + + createEffect(observeWidth) + + return width; +}; diff --git a/packages/solid/src/hooks/useId.ts b/packages/solid/src/hooks/useId.ts new file mode 100644 index 0000000..960dc18 --- /dev/null +++ b/packages/solid/src/hooks/useId.ts @@ -0,0 +1,3 @@ +import { generateHook } from "./generate"; + +export const useId = generateHook("id"); diff --git a/packages/solid/src/hooks/useSyncHeight.ts b/packages/solid/src/hooks/useSyncHeight.ts new file mode 100644 index 0000000..5ee23c0 --- /dev/null +++ b/packages/solid/src/hooks/useSyncHeight.ts @@ -0,0 +1,78 @@ +import { createEffect, onCleanup, type Accessor } from "solid-js"; + +import { useId } from "./useId"; +import { useIsMounted } from "./useIsMounted"; + +export const useSyncHeight = ({ + selector, + wrapper, + side, + enable, +}: { + selector: Accessor; + wrapper: Accessor; + side: Accessor; + enable: Accessor; +}) => { + const id = useId(); + + const isMounted = useIsMounted(); + + const observeHeight = () => { + if (!isMounted()) return; + + if (enable()) { + let clean = () => {}; + + const timer = setTimeout(() => { + const container = document.querySelector(`#diff-root${id()}`); + + const elements = Array.from(container?.querySelectorAll(selector()) || []); + + const wrappers = Array.from(container?.querySelectorAll(wrapper()) || []); + + if (elements.length === 2 && wrappers.length === 2) { + const ele1 = elements[0] as HTMLElement; + const ele2 = elements[1] as HTMLElement; + + const wrapper1 = wrappers[0] as HTMLElement; + const wrapper2 = wrappers[1] as HTMLElement; + + const target = ele1.getAttribute("data-side") === side() ? ele1 : ele2; + + const cb = () => { + ele1.style.height = "auto"; + ele2.style.height = "auto"; + const rect1 = ele1.getBoundingClientRect(); + const rect2 = ele2.getBoundingClientRect(); + const maxHeight = Math.max(rect1.height, rect2.height); + wrapper1.style.height = maxHeight + "px"; + wrapper2.style.height = maxHeight + "px"; + wrapper1.setAttribute("data-sync-height", String(maxHeight)); + wrapper2.setAttribute("data-sync-height", String(maxHeight)); + }; + + cb(); + + const observer = new ResizeObserver(cb); + + observer.observe(target); + + target.setAttribute("data-observe", "height"); + + clean = () => { + observer.disconnect(); + target?.removeAttribute("data-observe"); + }; + } + }); + + onCleanup(() => { + clean(); + clearTimeout(timer); + }); + } + }; + + createEffect(observeHeight); +}; diff --git a/packages/solid/src/index copy.ts b/packages/solid/src/index copy.ts deleted file mode 100644 index 77008b3..0000000 --- a/packages/solid/src/index copy.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./components/DiffView"; - -export * from "@git-diff-view/core"; diff --git a/packages/solid/src/index.ts b/packages/solid/src/index.ts index 37d8547..77008b3 100644 --- a/packages/solid/src/index.ts +++ b/packages/solid/src/index.ts @@ -1,7 +1,3 @@ -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 +export * from "@git-diff-view/core"; diff --git a/packages/solid/vite.config.ts b/packages/solid/vite.config.ts index 2967e3e..b576c45 100644 --- a/packages/solid/vite.config.ts +++ b/packages/solid/vite.config.ts @@ -6,13 +6,10 @@ import solidPlugin from "vite-plugin-solid"; import pkg from "./package.json"; export default defineConfig({ - plugins: [solidPlugin(), dts()], - server: { - port: 3000, - }, + plugins: [solidPlugin(), dts({ outDir: "dist/types" })], build: { lib: { - entry: path.resolve(__dirname, "src/index.withStyle.ts"), + entry: path.resolve(__dirname, "src/index.ts"), name: "GitDiffView", formats: ["es", "cjs"], fileName: (format) => @@ -23,11 +20,9 @@ export default defineConfig({ : `solid-git-diff-view.js`, }, sourcemap: true, + minify: false, rollupOptions: { external: ["solid-js", "@git-diff-view/core"], - output: { - assetFileNames: "css/diff-view.css", - }, }, }, define: { diff --git a/packages/vue/src/components/DiffSplitExtendLineNormal.tsx b/packages/vue/src/components/DiffSplitExtendLineNormal.tsx index b68f64d..2bf37f7 100644 --- a/packages/vue/src/components/DiffSplitExtendLineNormal.tsx +++ b/packages/vue/src/components/DiffSplitExtendLineNormal.tsx @@ -38,6 +38,8 @@ export const DiffSplitExtendLine = defineComponent( const currentItem = computed(() => (props.side === SplitSide.old ? oldLine.value : newLine.value)); + const currentIsHidden = ref(currentItem.value.isHidden); + useSubscribeDiffFile(props, (diffFile) => { oldLine.value = diffFile.getSplitLeftLine(props.index); @@ -48,6 +50,8 @@ export const DiffSplitExtendLine = defineComponent( newLineExtend.value = extendData.value?.newFile?.[newLine.value.lineNumber]; enableExpand.value = diffFile.getExpandEnabled(); + + currentIsHidden.value = currentItem.value.isHidden; }); const currentExtend = computed(() => (props.side === SplitSide.old ? oldLineExtend.value : newLineExtend.value)); @@ -58,9 +62,7 @@ export const DiffSplitExtendLine = defineComponent( const currentIsShow = computed(() => Boolean( - (oldLineExtend.value || newLineExtend.value) && - (!currentItem.value.isHidden || enableExpand.value) && - slots.extend + (oldLineExtend.value || newLineExtend.value) && (!currentIsHidden.value || enableExpand.value) && slots.extend ) ); diff --git a/packages/vue/src/components/DiffSplitExtendLineWrap.tsx b/packages/vue/src/components/DiffSplitExtendLineWrap.tsx index 261aa18..b70eeff 100644 --- a/packages/vue/src/components/DiffSplitExtendLineWrap.tsx +++ b/packages/vue/src/components/DiffSplitExtendLineWrap.tsx @@ -24,6 +24,8 @@ export const DiffSplitExtendLine = defineComponent( const newLineExtend = ref(extendData.value?.newFile?.[newLine.value.lineNumber]); + const hasHidden = ref(oldLine.value.isHidden && newLine.value.isHidden); + useSubscribeDiffFile(props, (diffFile) => { oldLine.value = diffFile.getSplitLeftLine(props.index); @@ -34,14 +36,12 @@ export const DiffSplitExtendLine = defineComponent( newLineExtend.value = extendData.value?.newFile?.[newLine.value.lineNumber]; enableExpand.value = diffFile.getExpandEnabled(); + + hasHidden.value = oldLine.value.isHidden && newLine.value.isHidden; }); const currentIsShow = computed(() => - Boolean( - (oldLineExtend.value || newLineExtend.value) && - ((!oldLine.value?.isHidden && !newLine.value?.isHidden) || enableExpand.value) && - slots.extend - ) + Boolean((oldLineExtend.value || newLineExtend.value) && (!hasHidden.value || enableExpand.value) && slots.extend) ); return () => { diff --git a/packages/vue/src/components/DiffSplitWidgetLineNormal.tsx b/packages/vue/src/components/DiffSplitWidgetLineNormal.tsx index 8463533..f67ec90 100644 --- a/packages/vue/src/components/DiffSplitWidgetLineNormal.tsx +++ b/packages/vue/src/components/DiffSplitWidgetLineNormal.tsx @@ -36,13 +36,17 @@ export const DiffSplitWidgetLine = defineComponent( widget.value.lineNumber === newLine.value.lineNumber ); + const currentLine = computed(() => (props.side === SplitSide.old ? oldLine.value : newLine.value)); + + const currentIsHidden = ref(currentLine.value.isHidden); + useSubscribeDiffFile(props, (diffFile) => { oldLine.value = diffFile.getSplitLeftLine(props.index); newLine.value = diffFile.getSplitRightLine(props.index); - }); - const currentLine = computed(() => (props.side === SplitSide.old ? oldLine.value : newLine.value)); + currentIsHidden.value = currentLine.value.isHidden; + }); const lineSelector = computed(() => `div[data-line="${props.lineNumber}-widget-content"]`); @@ -55,7 +59,7 @@ export const DiffSplitWidgetLine = defineComponent( const observeSide = computed(() => SplitSide[props.side]); const currentIsShow = computed( - () => (!!oldLineWidget.value || !!newLineWidget.value) && !currentLine.value.isHidden && !!slots.widget + () => (!!oldLineWidget.value || !!newLineWidget.value) && !currentIsHidden.value && !!slots.widget ); const currentWidget = computed( diff --git a/packages/vue/src/components/DiffSplitWidgetLineWrap.tsx b/packages/vue/src/components/DiffSplitWidgetLineWrap.tsx index 00e0ef3..fc15c19 100644 --- a/packages/vue/src/components/DiffSplitWidgetLineWrap.tsx +++ b/packages/vue/src/components/DiffSplitWidgetLineWrap.tsx @@ -34,19 +34,18 @@ export const DiffSplitWidgetLine = defineComponent( widget.value.lineNumber === newLine.value.lineNumber ); + const hasHidden = ref(oldLine.value.isHidden && newLine.value.isHidden); + useSubscribeDiffFile(props, (diffFile) => { oldLine.value = diffFile.getSplitLeftLine(props.index); newLine.value = diffFile.getSplitRightLine(props.index); + + hasHidden.value = oldLine.value.isHidden && newLine.value.isHidden; }); - // TODO improve const currentIsShow = computed( - () => - (!!oldLineWidget.value || !!newLineWidget.value) && - !oldLine.value.isHidden && - !newLine.value.isHidden && - !!slots.widget + () => (!!oldLineWidget.value || !!newLineWidget.value) && !hasHidden.value && !!slots.widget ); const onCloseWidget = () => setWidget({}); diff --git a/packages/vue/src/components/DiffUnifiedExtendLine.tsx b/packages/vue/src/components/DiffUnifiedExtendLine.tsx index cf7615c..8422061 100644 --- a/packages/vue/src/components/DiffUnifiedExtendLine.tsx +++ b/packages/vue/src/components/DiffUnifiedExtendLine.tsx @@ -19,16 +19,20 @@ export const DiffUnifiedExtendLine = defineComponent( const newExtend = ref(extendData.value?.newFile?.[unifiedItem.value.newLineNumber]); + const currentIsHidden = ref(unifiedItem.value.isHidden); + useSubscribeDiffFile(props, (diffFile) => { unifiedItem.value = diffFile.getUnifiedLine(props.index); oldExtend.value = extendData.value?.oldFile?.[unifiedItem.value.oldLineNumber]; newExtend.value = extendData.value?.newFile?.[unifiedItem.value.newLineNumber]; + + currentIsHidden.value = unifiedItem.value.isHidden; }); const currentIsShow = computed(() => - Boolean((oldExtend.value || newExtend.value) && !unifiedItem.value.isHidden && slots.extend) + Boolean((oldExtend.value || newExtend.value) && !currentIsHidden.value && slots.extend) ); const width = useDomWidth({ diff --git a/packages/vue/src/components/DiffUnifiedWidgetLine.tsx b/packages/vue/src/components/DiffUnifiedWidgetLine.tsx index 390ea06..d510892 100644 --- a/packages/vue/src/components/DiffUnifiedWidgetLine.tsx +++ b/packages/vue/src/components/DiffUnifiedWidgetLine.tsx @@ -31,10 +31,16 @@ export const DiffUnifiedWidgetLine = defineComponent( widget.value.lineNumber === unifiedItem.value.newLineNumber ); - useSubscribeDiffFile(props, (diffFile) => (unifiedItem.value = diffFile.getUnifiedLine(props.index))); + const currentIsHidden = ref(unifiedItem.value.isHidden); + + useSubscribeDiffFile(props, (diffFile) => { + unifiedItem.value = diffFile.getUnifiedLine(props.index); + + currentIsHidden.value = unifiedItem.value.isHidden; + }); const currentIsShow = computed( - () => (oldWidget.value || newWidget.value) && !unifiedItem.value.isHidden && !!slots.widget + () => (oldWidget.value || newWidget.value) && !currentIsHidden.value && !!slots.widget ); const onCloseWidget = () => setWidget({}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8734ae4..8521f16 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ importers: '@git-diff-view/react': specifier: workspace:* version: link:packages/react + '@git-diff-view/solid': + specifier: workspace:* + version: link:packages/solid '@git-diff-view/utils': specifier: workspace:* version: link:packages/utils @@ -485,6 +488,18 @@ importers: specifier: ^1.9.7 version: 1.9.7 devDependencies: + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.5.1) + postcss: + specifier: ^8.5.1 + version: 8.5.1 + solid-devtools: + specifier: ^0.34.2 + version: 0.34.2(solid-js@1.9.7)(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)) + tailwindcss: + specifier: ^3.4.17 + version: 3.4.17(ts-node@10.9.2(@swc/core@1.10.15(@swc/helpers@0.5.15))(@types/node@22.13.1)(typescript@5.3.3)) typescript: specifier: 5.3.3 version: 5.3.3 @@ -580,18 +595,34 @@ packages: resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.26.8': resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.27.5': + resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} + engines: {node: '>=6.9.0'} + '@babel/core@7.26.8': resolution: {integrity: sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ==} engines: {node: '>=6.9.0'} + '@babel/core@7.27.4': + resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} + engines: {node: '>=6.9.0'} + '@babel/generator@7.26.8': resolution: {integrity: sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==} engines: {node: '>=6.9.0'} + '@babel/generator@7.27.5': + resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} + engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.25.9': resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} @@ -600,6 +631,10 @@ packages: resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-create-class-features-plugin@7.25.9': resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} engines: {node: '>=6.9.0'} @@ -618,12 +653,22 @@ packages: resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.26.0': resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.27.3': + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-optimise-call-expression@7.25.9': resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} engines: {node: '>=6.9.0'} @@ -632,6 +677,10 @@ packages: resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + '@babel/helper-replace-supers@7.26.5': resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} engines: {node: '>=6.9.0'} @@ -646,23 +695,44 @@ packages: resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.9': resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.25.9': resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + '@babel/helpers@7.26.7': resolution: {integrity: sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==} engines: {node: '>=6.9.0'} + '@babel/helpers@7.27.6': + resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} + engines: {node: '>=6.9.0'} + '@babel/parser@7.26.8': resolution: {integrity: sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==} engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.27.5': + resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-syntax-jsx@7.25.9': resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} engines: {node: '>=6.9.0'} @@ -675,6 +745,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-self@7.25.9': resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} engines: {node: '>=6.9.0'} @@ -701,14 +777,26 @@ packages: resolution: {integrity: sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q==} engines: {node: '>=6.9.0'} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.26.8': resolution: {integrity: sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.27.4': + resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} + engines: {node: '>=6.9.0'} + '@babel/types@7.26.8': resolution: {integrity: sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==} engines: {node: '>=6.9.0'} + '@babel/types@7.27.6': + resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} + engines: {node: '>=6.9.0'} + '@codemirror/autocomplete@6.18.4': resolution: {integrity: sha512-sFAphGQIqyQZfP2ZBsSHV7xQvo9Py0rV0dW7W3IMRdS+zDuNb2l3no78CvUaWKGfzFjI4FTrLdUSj86IGb2hRA==} @@ -1258,6 +1346,9 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} + '@nothing-but/utils@0.17.0': + resolution: {integrity: sha512-TuCHcHLOqDL0SnaAxACfuRHBNRgNJcNn9X0GiH5H3YSDBVquCr3qEIG3FOQAuMyZCbu9w8nk2CHhOsn7IvhIwQ==} + '@open-draft/deferred-promise@2.2.0': resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} @@ -1497,6 +1588,71 @@ packages: resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} + '@solid-devtools/debugger@0.28.0': + resolution: {integrity: sha512-HBtcU3rSt1u+IrOtEcDBzkjSdyOpgdnc1aQCpwUPPl1CMdNWU/qku0GNrNrb50H8z+iqxc+ZZmvDV7Vl3a2/CQ==} + peerDependencies: + solid-js: ^1.9.0 + + '@solid-devtools/shared@0.20.0': + resolution: {integrity: sha512-o5TACmUOQsxpzpOKCjbQqGk8wL8PMi+frXG9WNu4Lh3PQVUB6hs95Kl/S8xc++zwcMguUKZJn8h5URUiMOca6Q==} + peerDependencies: + solid-js: ^1.9.0 + + '@solid-primitives/bounds@0.1.1': + resolution: {integrity: sha512-b4s8JClkRq2RQlU3K4qeCVASdtct5gfg3HNfWGeD7oPjWlSkp2RyDHJwt9ZtPaXOEOIHhNBbLgjtLax/4B6VUQ==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/event-listener@2.4.1': + resolution: {integrity: sha512-Xc/lBCeuh9LwzR4lYbMDtopwWK7N9b4o+FmI4uoI8DOtVGYi0Ip20DG8PtwHk+g31lHgvwtFFVKfnUx2UaqZJg==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/keyboard@1.3.1': + resolution: {integrity: sha512-ib4xPC5ioOGj2A/5PqFTJvWbgGVx/5okFEoU0qXhCrehVB84gPBhKFNRqTlpiYzCbVHPIUZCTO2ZMkqzJdIA2w==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/media@2.3.1': + resolution: {integrity: sha512-UTX8LAaQS7k3rvekme8y5ihOrt5SJpgkw7xyUySlPhIapD7JxlhYncQoSFsys5D1XPCgI/3snobpvbanRcrTAw==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/refs@1.1.1': + resolution: {integrity: sha512-MIQ7Bh59IiT9NDQPf6iWRnPe0RgKggEjF0H+iMoIi1KBCcp4Mfss2IkUWYPr9wqQg963ZQFbcg5D6oN9Up6Mww==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/resize-observer@2.1.1': + resolution: {integrity: sha512-vb/VS9+YdUdVZ2V92JimFmFuaJ2MSyKOGnUay/mQvoQ0R+mtdT7FSylfQlVslCzm0ecx8Jkvsm1Sk2lopvMAdg==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/rootless@1.5.1': + resolution: {integrity: sha512-G4eNC6F3ufRT2Mjbodl7rSOH7uq/Emqs3S7/BIBWgh+V/IFUtvu6WELeqSrk4FJX3T/kKKvC+T8gXhepExSWyg==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/scheduled@1.5.1': + resolution: {integrity: sha512-WKg/zvAyDIgQ/Xo48YaUY7ISaPyWTZNDzIVWP2R84CuLH+nZN/2O0aFn/gQlWY6y/Bfi/LdDt6Og2/PRzPY7mA==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/static-store@0.1.1': + resolution: {integrity: sha512-daXWvpLjd+4hbYdGaaEJ2kKFuFhshvfIBFLveW7mfk2BWHl9lGQVwUuExp3qllkK9ONA9p+5D2cpwBQosv8odQ==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/styles@0.1.1': + resolution: {integrity: sha512-eOf3GQjxEcYWxUU62CSpTIXOOzF5FBMdiJl/yBb20Dq6h/VVWCABHDPsh1KJ3SKc4AUAimSMbclDG+Co0EBpvQ==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/utils@6.3.1': + resolution: {integrity: sha512-4/Z59nnwu4MPR//zWZmZm2yftx24jMqQ8CSd/JobL26TPfbn4Ph8GKNVJfGJWShg1QB98qObJSskqizbTvcLLA==} + peerDependencies: + solid-js: ^1.6.12 + '@stitches/core@1.2.8': resolution: {integrity: sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg==} @@ -4553,6 +4709,15 @@ packages: smob@1.5.0: resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + solid-devtools@0.34.2: + resolution: {integrity: sha512-9iqQxeAo79ihGIlQ0POhiBnpDgajqNfxE3n58OVHzT9LaXgQ7I6wpA2Ed91uHsPk6OkUNs8B0Ld7+PlaZHrJcw==} + peerDependencies: + solid-js: ^1.9.0 + vite: ^2.2.3 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + vite: + optional: true + solid-js@1.9.5: resolution: {integrity: sha512-ogI3DaFcyn6UhYhrgcyRAMbu/buBJitYQASZz5WzfQVPP10RD2AbCoRZ517psnezrasyCbWzIxZ6kVqet768xw==} @@ -5252,8 +5417,16 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/compat-data@7.26.8': {} + '@babel/compat-data@7.27.5': {} + '@babel/core@7.26.8': dependencies: '@ampproject/remapping': 2.3.0 @@ -5275,6 +5448,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/core@7.27.4': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helpers': 7.27.6 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/generator@7.26.8': dependencies: '@babel/parser': 7.26.8 @@ -5283,6 +5476,14 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 + '@babel/generator@7.27.5': + dependencies: + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + '@babel/helper-annotate-as-pure@7.25.9': dependencies: '@babel/types': 7.26.8 @@ -5295,6 +5496,14 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.27.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.8)': dependencies: '@babel/core': 7.26.8 @@ -5326,6 +5535,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.8)': dependencies: '@babel/core': 7.26.8 @@ -5335,12 +5551,23 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.4 + transitivePeerDependencies: + - supports-color + '@babel/helper-optimise-call-expression@7.25.9': dependencies: '@babel/types': 7.26.8 '@babel/helper-plugin-utils@7.26.5': {} + '@babel/helper-plugin-utils@7.27.1': {} + '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.8)': dependencies: '@babel/core': 7.26.8 @@ -5359,19 +5586,34 @@ snapshots: '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-option@7.25.9': {} + '@babel/helper-validator-option@7.27.1': {} + '@babel/helpers@7.26.7': dependencies: '@babel/template': 7.26.8 '@babel/types': 7.26.8 + '@babel/helpers@7.27.6': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 + '@babel/parser@7.26.8': dependencies: '@babel/types': 7.26.8 + '@babel/parser@7.27.5': + dependencies: + '@babel/types': 7.27.6 + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.8)': dependencies: '@babel/core': 7.26.8 @@ -5382,6 +5624,11 @@ snapshots: '@babel/core': 7.26.8 '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.8)': dependencies: '@babel/core': 7.26.8 @@ -5413,6 +5660,12 @@ snapshots: '@babel/parser': 7.26.8 '@babel/types': 7.26.8 + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 + '@babel/traverse@7.26.8': dependencies: '@babel/code-frame': 7.26.2 @@ -5425,11 +5678,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.27.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + '@babel/types@7.26.8': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@babel/types@7.27.6': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@codemirror/autocomplete@6.18.4': dependencies: '@codemirror/language': 6.10.8 @@ -5966,6 +6236,8 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} + '@nothing-but/utils@0.17.0': {} + '@open-draft/deferred-promise@2.2.0': {} '@pkgjs/parseargs@0.11.0': @@ -6177,6 +6449,97 @@ snapshots: '@sindresorhus/merge-streams@2.3.0': {} + '@solid-devtools/debugger@0.28.0(solid-js@1.9.7)': + dependencies: + '@nothing-but/utils': 0.17.0 + '@solid-devtools/shared': 0.20.0(solid-js@1.9.7) + '@solid-primitives/bounds': 0.1.1(solid-js@1.9.7) + '@solid-primitives/event-listener': 2.4.1(solid-js@1.9.7) + '@solid-primitives/keyboard': 1.3.1(solid-js@1.9.7) + '@solid-primitives/rootless': 1.5.1(solid-js@1.9.7) + '@solid-primitives/scheduled': 1.5.1(solid-js@1.9.7) + '@solid-primitives/static-store': 0.1.1(solid-js@1.9.7) + '@solid-primitives/utils': 6.3.1(solid-js@1.9.7) + solid-js: 1.9.7 + + '@solid-devtools/shared@0.20.0(solid-js@1.9.7)': + dependencies: + '@nothing-but/utils': 0.17.0 + '@solid-primitives/event-listener': 2.4.1(solid-js@1.9.7) + '@solid-primitives/media': 2.3.1(solid-js@1.9.7) + '@solid-primitives/refs': 1.1.1(solid-js@1.9.7) + '@solid-primitives/rootless': 1.5.1(solid-js@1.9.7) + '@solid-primitives/scheduled': 1.5.1(solid-js@1.9.7) + '@solid-primitives/static-store': 0.1.1(solid-js@1.9.7) + '@solid-primitives/styles': 0.1.1(solid-js@1.9.7) + '@solid-primitives/utils': 6.3.1(solid-js@1.9.7) + solid-js: 1.9.7 + + '@solid-primitives/bounds@0.1.1(solid-js@1.9.7)': + dependencies: + '@solid-primitives/event-listener': 2.4.1(solid-js@1.9.7) + '@solid-primitives/resize-observer': 2.1.1(solid-js@1.9.7) + '@solid-primitives/static-store': 0.1.1(solid-js@1.9.7) + '@solid-primitives/utils': 6.3.1(solid-js@1.9.7) + solid-js: 1.9.7 + + '@solid-primitives/event-listener@2.4.1(solid-js@1.9.7)': + dependencies: + '@solid-primitives/utils': 6.3.1(solid-js@1.9.7) + solid-js: 1.9.7 + + '@solid-primitives/keyboard@1.3.1(solid-js@1.9.7)': + dependencies: + '@solid-primitives/event-listener': 2.4.1(solid-js@1.9.7) + '@solid-primitives/rootless': 1.5.1(solid-js@1.9.7) + '@solid-primitives/utils': 6.3.1(solid-js@1.9.7) + solid-js: 1.9.7 + + '@solid-primitives/media@2.3.1(solid-js@1.9.7)': + dependencies: + '@solid-primitives/event-listener': 2.4.1(solid-js@1.9.7) + '@solid-primitives/rootless': 1.5.1(solid-js@1.9.7) + '@solid-primitives/static-store': 0.1.1(solid-js@1.9.7) + '@solid-primitives/utils': 6.3.1(solid-js@1.9.7) + solid-js: 1.9.7 + + '@solid-primitives/refs@1.1.1(solid-js@1.9.7)': + dependencies: + '@solid-primitives/utils': 6.3.1(solid-js@1.9.7) + solid-js: 1.9.7 + + '@solid-primitives/resize-observer@2.1.1(solid-js@1.9.7)': + dependencies: + '@solid-primitives/event-listener': 2.4.1(solid-js@1.9.7) + '@solid-primitives/rootless': 1.5.1(solid-js@1.9.7) + '@solid-primitives/static-store': 0.1.1(solid-js@1.9.7) + '@solid-primitives/utils': 6.3.1(solid-js@1.9.7) + solid-js: 1.9.7 + + '@solid-primitives/rootless@1.5.1(solid-js@1.9.7)': + dependencies: + '@solid-primitives/utils': 6.3.1(solid-js@1.9.7) + solid-js: 1.9.7 + + '@solid-primitives/scheduled@1.5.1(solid-js@1.9.7)': + dependencies: + solid-js: 1.9.7 + + '@solid-primitives/static-store@0.1.1(solid-js@1.9.7)': + dependencies: + '@solid-primitives/utils': 6.3.1(solid-js@1.9.7) + solid-js: 1.9.7 + + '@solid-primitives/styles@0.1.1(solid-js@1.9.7)': + dependencies: + '@solid-primitives/rootless': 1.5.1(solid-js@1.9.7) + '@solid-primitives/utils': 6.3.1(solid-js@1.9.7) + solid-js: 1.9.7 + + '@solid-primitives/utils@6.3.1(solid-js@1.9.7)': + dependencies: + solid-js: 1.9.7 + '@stitches/core@1.2.8': {} '@swc/core-darwin-arm64@1.10.15': @@ -9635,6 +9998,19 @@ snapshots: smob@1.5.0: {} + solid-devtools@0.34.2(solid-js@1.9.7)(vite@5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1)): + dependencies: + '@babel/core': 7.27.4 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) + '@babel/types': 7.27.6 + '@solid-devtools/debugger': 0.28.0(solid-js@1.9.7) + '@solid-devtools/shared': 0.20.0(solid-js@1.9.7) + solid-js: 1.9.7 + optionalDependencies: + vite: 5.4.19(@types/node@22.13.1)(sugarss@4.0.1(postcss@8.5.1))(terser@5.38.1) + transitivePeerDependencies: + - supports-color + solid-js@1.9.5: dependencies: csstype: 3.1.3 diff --git a/scripts/build.ts b/scripts/build.ts index 45bbe65..8b7f2a4 100644 --- a/scripts/build.ts +++ b/scripts/build.ts @@ -92,6 +92,15 @@ const start = async () => { await buildType("react"); await copyCss("react", "diff-view.css"); await copyCss("react", "diff-view-pure.css"); + await new Promise((r, j) => { + const ls = spawn(`cd packages/solid && pnpm run build`, { shell: true, stdio: "inherit" }); + ls.on("close", () => r()); + ls.on("error", (e) => j(e)); + }); + await buildCss("solid"); + await buildType("solid"); + await copyCss("solid", "diff-view.css"); + await copyCss("solid", "diff-view-pure.css"); // 对于 "jsx": "preserve" 最新的rollup已经不支持解析,因此使用vite来进行打包 // https://github.com/rollup/plugins/issues/72 // https://rollupjs.org/migration/#configuration-changes diff --git a/ui/solid-example/package.json b/ui/solid-example/package.json index 0e83e7e..ad42124 100644 --- a/ui/solid-example/package.json +++ b/ui/solid-example/package.json @@ -4,7 +4,7 @@ "version": "0.0.0", "type": "module", "scripts": { - "dev": "vite", + "dev": "vite --force", "build": "tsc -b && vite build", "preview": "vite preview" }, @@ -12,6 +12,10 @@ "solid-js": "^1.9.7" }, "devDependencies": { + "autoprefixer": "^10.4.20", + "postcss": "^8.5.1", + "solid-devtools": "^0.34.2", + "tailwindcss": "^3.4.17", "typescript": "5.3.3", "vite": "^5.4.19", "vite-plugin-solid": "^2.11.0" diff --git a/ui/solid-example/postcss.config.js b/ui/solid-example/postcss.config.js new file mode 100644 index 0000000..2aa7205 --- /dev/null +++ b/ui/solid-example/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/ui/solid-example/src/App.css b/ui/solid-example/src/App.css deleted file mode 100644 index 613607d..0000000 --- a/ui/solid-example/src/App.css +++ /dev/null @@ -1,27 +0,0 @@ -#root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.solid:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} diff --git a/ui/solid-example/src/App.tsx b/ui/solid-example/src/App.tsx index 1f906bf..12da1b5 100644 --- a/ui/solid-example/src/App.tsx +++ b/ui/solid-example/src/App.tsx @@ -1,38 +1,57 @@ -import { createSignal } from 'solid-js' +import { DiffFile, DiffView } from "@git-diff-view/solid"; +import { createEffect, createSignal, Show } from "solid-js"; -import solidLogo from './assets/solid.svg' +import * as data from "./data"; -// eslint-disable-next-line import/no-unresolved -import viteLogo from '/vite.svg' -import './App.css' +import type { MessageData } from "./worker"; + +const worker = new Worker(new URL("./worker.ts", import.meta.url), { type: "module" }); + +type Key = "a" | "b" | "c" | "d" | "e"; function App() { - const [count, setCount] = createSignal(0) + const [key, setKey] = createSignal("a"); + + const [diffFile, setDiffFile] = createSignal(); + + worker.addEventListener("message", (e: MessageEvent) => { + const { data, bundle } = e.data; + const instance = DiffFile.createInstance(data || {}, bundle); + setDiffFile(instance); + }); + + createEffect(() => { + const currentKey = key(); + worker.postMessage({ + key: currentKey, + // eslint-disable-next-line import/namespace + data: data[currentKey], + }); + }); return ( <> - -

Vite + Solid

-
- +
+

A Solid component to show the file diff

+

- Edit src/App.tsx and save to test HMR + Select a file to show the diff:   +

-

- Click on the Vite and Solid logos to learn more -

+
+ + + +
- ) + ); } -export default App +export default App; diff --git a/ui/solid-example/src/data.ts b/ui/solid-example/src/data.ts new file mode 100644 index 0000000..e7339a0 --- /dev/null +++ b/ui/solid-example/src/data.ts @@ -0,0 +1,84 @@ +export const a = { + oldFile: { + fileName: null, + content: "", + }, + newFile: { + fileName: "src/components/MultiLevelReview/AddReviewConfigModal.tsx", + content: + "import type { DepoCatalogueReviewers, UpdateCatalogueReviewersParams } from '@/apis/modules/catalogue/module';\nimport { DepoCatalogueReviewEnum } from '@/apis/modules/catalogue/module';\nimport { gsModalSize } from '@/utils/commonVariable';\nimport { Button, Form, Modal, Radio, message } from 'antd';\nimport { useEffect, useMemo, useState } from 'react';\nimport { UserSelect } from '../UserSelect';\nimport { useCatalogueTree } from '@/hooks/useCatalogueTree';\nimport type { IUserInfo } from '@/apis/modules/user/module';\nimport { updateCatalogueReviewers } from '@/apis/modules/catalogue';\n\nexport const AddReviewConfig = ({ currentReviewList }: { currentReviewList: DepoCatalogueReviewers }) => {\n const [isOpen, setIsOpen] = useState(false);\n\n const [loading, setLoading] = useState(false);\n\n const [userList, setUserList] = useState([]);\n\n const { computedSelectItem, reloadCatalogueItemReviewers } = useCatalogueTree.useShallowSelector((s) => ({\n computedSelectItem: s.computedSelectItem,\n reloadCatalogueItemReviewers: s.getCatalogueItemReviewers,\n }));\n\n const [form] = Form.useForm<{ reviewers: number[]; type: DepoCatalogueReviewEnum }>();\n\n const selectedList = useMemo(() => currentReviewList.map(i => i.reviewers || []).reduce((p, c) => p.concat(c), []), [currentReviewList])\n\n useEffect(() => {\n return () => form.resetFields();\n }, [form, isOpen]);\n\n const onSubmit = async () => {\n if (loading) return;\n try {\n setLoading(true);\n const formValue = await form.validateFields();\n if (!computedSelectItem) {\n message.error('意料之外的错误,请刷新重试');\n return;\n }\n const params: UpdateCatalogueReviewersParams = {\n dirId: computedSelectItem.id,\n updateCatalogueReviewLevels: [\n {\n level: currentReviewList.length + 1,\n type: formValue.type,\n reviewers: userList\n .filter((i) => formValue.reviewers.includes(i.id))\n .map((i) => ({ id: i.id, username: i.username, nickname: i.nickname })),\n },\n ],\n };\n const response = await updateCatalogueReviewers(params);\n if (response.success) {\n await reloadCatalogueItemReviewers();\n setIsOpen(false);\n }\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <>\n \n setIsOpen(false)}\n >\n
\n \n setUserList(list)}\n disableItems={selectedList}\n filterOption={(input, option) => !!option?.label?.toString().toLowerCase().includes(input?.toLowerCase())}\n />\n \n \n \n 会签\n 或签\n \n \n
\n \n \n );\n};", + }, + hunks: [ + "--- /dev/null\n+++ src/components/MultiLevelReview/AddReviewConfigModal.tsx\n@@ -0,0 +1,93 @@\n+import type { DepoCatalogueReviewers, UpdateCatalogueReviewersParams } from '@/apis/modules/catalogue/module';\n+import { DepoCatalogueReviewEnum } from '@/apis/modules/catalogue/module';\n+import { gsModalSize } from '@/utils/commonVariable';\n+import { Button, Form, Modal, Radio, message } from 'antd';\n+import { useEffect, useMemo, useState } from 'react';\n+import { UserSelect } from '../UserSelect';\n+import { useCatalogueTree } from '@/hooks/useCatalogueTree';\n+import type { IUserInfo } from '@/apis/modules/user/module';\n+import { updateCatalogueReviewers } from '@/apis/modules/catalogue';\n+\n+export const AddReviewConfig = ({ currentReviewList }: { currentReviewList: DepoCatalogueReviewers }) => {\n+ const [isOpen, setIsOpen] = useState(false);\n+\n+ const [loading, setLoading] = useState(false);\n+\n+ const [userList, setUserList] = useState([]);\n+\n+ const { computedSelectItem, reloadCatalogueItemReviewers } = useCatalogueTree.useShallowSelector((s) => ({\n+ computedSelectItem: s.computedSelectItem,\n+ reloadCatalogueItemReviewers: s.getCatalogueItemReviewers,\n+ }));\n+\n+ const [form] = Form.useForm<{ reviewers: number[]; type: DepoCatalogueReviewEnum }>();\n+\n+ const selectedList = useMemo(() => currentReviewList.map(i => i.reviewers || []).reduce((p, c) => p.concat(c), []), [currentReviewList])\n+\n+ useEffect(() => {\n+ return () => form.resetFields();\n+ }, [form, isOpen]);\n+\n+ const onSubmit = async () => {\n+ if (loading) return;\n+ try {\n+ setLoading(true);\n+ const formValue = await form.validateFields();\n+ if (!computedSelectItem) {\n+ message.error('意料之外的错误,请刷新重试');\n+ return;\n+ }\n+ const params: UpdateCatalogueReviewersParams = {\n+ dirId: computedSelectItem.id,\n+ updateCatalogueReviewLevels: [\n+ {\n+ level: currentReviewList.length + 1,\n+ type: formValue.type,\n+ reviewers: userList\n+ .filter((i) => formValue.reviewers.includes(i.id))\n+ .map((i) => ({ id: i.id, username: i.username, nickname: i.nickname })),\n+ },\n+ ],\n+ };\n+ const response = await updateCatalogueReviewers(params);\n+ if (response.success) {\n+ await reloadCatalogueItemReviewers();\n+ setIsOpen(false);\n+ }\n+ } finally {\n+ setLoading(false);\n+ }\n+ };\n+\n+ return (\n+ <>\n+ \n+ setIsOpen(false)}\n+ >\n+
\n+ \n+ setUserList(list)}\n+ disableItems={selectedList}\n+ filterOption={(input, option) => !!option?.label?.toString().toLowerCase().includes(input?.toLowerCase())}\n+ />\n+ \n+ \n+ \n+ 会签\n+ 或签\n+ \n+ \n+
\n+ \n+ \n+ );\n+};\n", + ], +}; + +export const b = { + newFile: { + fileName: "a/packages/myreact-reactivity/src/reactive/feature.ts", + content: + 'import { Component, createElement, useState, useCallback, useMemo } from "@my-react/react";\n\nimport { proxyRefs, ReactiveEffect } from "../api";\n\nimport type { UnwrapRef } from "../api";\nimport type { LikeReactNode } from "@my-react/react";\n\ntype LifeCycle = {\n onBeforeMount: Array<() => void>;\n\n onMounted: Array<() => void>;\n\n onBeforeUpdate: Array<() => void>;\n\n onUpdated: Array<() => void>;\n\n onBeforeUnmount: Array<() => void>;\n\n onUnmounted: Array<() => void>;\n\n hasHookInstalled: boolean;\n\n canUpdateComponent: boolean;\n};\n\n/**\n * @internal\n */\nexport let globalInstance: LifeCycle | null = null;\n\nexport function createReactive

, S extends Record>(props?: {\n setup: () => S;\n render?: (props: UnwrapRef & P) => LikeReactNode;\n}) {\n const setup = typeof props === "function" ? props : props.setup;\n\n const render = typeof props === "function" ? null : props.render;\n\n class ForBeforeUnmount extends Component<{ ["$$__instance__$$"]: LifeCycle; children: LikeReactNode }> {\n componentWillUnmount(): void {\n this.props.$$__instance__$$.onBeforeUnmount.forEach((f) => f());\n }\n\n render() {\n return this.props.children;\n }\n }\n\n class ForBeforeMount extends Component<{ ["$$__instance__$$"]: LifeCycle; children: LikeReactNode }> {\n componentDidMount(): void {\n this.props.$$__instance__$$.onBeforeMount.forEach((f) => f());\n }\n\n render() {\n return this.props.children;\n }\n }\n\n class RenderWithLifeCycle extends Component<\n {\n ["$$__trigger__$$"]: () => void;\n ["$$__instance__$$"]: LifeCycle;\n ["$$__reactiveState__$$"]: UnwrapRef;\n children?: (props: UnwrapRef & P) => LikeReactNode;\n } & P\n > {\n componentDidMount(): void {\n this.props.$$__instance__$$.onMounted.forEach((f) => f());\n }\n\n componentDidUpdate(): void {\n this.props.$$__instance__$$.onUpdated.forEach((f) => f());\n }\n\n componentWillUnmount(): void {\n this.props.$$__instance__$$.onUnmounted.forEach((f) => f());\n this.reactiveEffect.stop();\n }\n\n shouldComponentUpdate(): boolean {\n this.props.$$__instance__$$.canUpdateComponent = false;\n this.props.$$__instance__$$.onBeforeUpdate.forEach((f) => f());\n this.props.$$__instance__$$.canUpdateComponent = true;\n return true;\n }\n\n reactiveEffect = new ReactiveEffect(() => {\n const { children, $$__trigger__$$, $$__reactiveState__$$, $$__instance__$$, ...last } = this.props;\n const targetRender = (render || children) as (props: UnwrapRef & P) => LikeReactNode;\n const element = targetRender?.({ ...last, ...$$__reactiveState__$$ } as UnwrapRef & P) || null;\n return element;\n }, this.props.$$__trigger__$$);\n\n render() {\n return createElement(ForBeforeMount, { ["$$__instance__$$"]: this.props.$$__instance__$$, children: this.reactiveEffect.run() });\n }\n }\n\n class Render extends Component<\n {\n ["$$__trigger__$$"]: () => void;\n ["$$__reactiveState__$$"]: UnwrapRef;\n children?: (props: UnwrapRef & P) => LikeReactNode;\n } & P\n > {\n componentWillUnmount(): void {\n this.reactiveEffect.stop();\n }\n\n reactiveEffect = new ReactiveEffect(() => {\n const { children, $$__trigger__$$, $$__reactiveState__$$, $$__instance__$$, ...last } = this.props;\n const targetRender = (render || children) as (props: UnwrapRef & P) => LikeReactNode;\n const element = targetRender?.({ ...last, ...$$__reactiveState__$$ } as UnwrapRef & P) || null;\n return element;\n }, this.props.$$__trigger__$$);\n\n render() {\n return this.reactiveEffect.run();\n }\n }\n\n const MyReactReactiveComponent = (props: P & { children?: (props: UnwrapRef & P) => LikeReactNode }) => {\n const [instance] = useState(() => ({\n onBeforeMount: [],\n onBeforeUpdate: [],\n onBeforeUnmount: [],\n onMounted: [],\n onUpdated: [],\n onUnmounted: [],\n hasHookInstalled: false,\n canUpdateComponent: true,\n }));\n\n const state = useMemo(() => {\n globalInstance = instance;\n\n const state = proxyRefs(setup());\n\n globalInstance = null;\n\n return state;\n }, []);\n\n if (__DEV__) {\n for (const key in props) {\n if (key in state) {\n console.warn(`duplicate key ${key} in Component props and reactive state, please fix this usage`);\n }\n }\n if (props["children"] && typeof props["children"] !== "function") {\n throw new Error("the component which return from createReactive() expect a function children");\n }\n }\n\n const [, setState] = useState(() => 0);\n\n const updateCallback = useCallback(() => {\n if (instance.canUpdateComponent) {\n setState((i) => i + 1);\n }\n }, []);\n\n if (instance.hasHookInstalled) {\n return createElement(ForBeforeUnmount, {\n ["$$__instance__$$"]: instance,\n children: createElement(RenderWithLifeCycle, {\n ...props,\n ["$$__trigger__$$"]: updateCallback,\n ["$$__reactiveState__$$"]: state,\n ["$$__instance__$$"]: instance,\n }),\n }) as LikeReactNode;\n } else {\n return createElement(Render, { ...props, ["$$__trigger__$$"]: updateCallback, ["$$__reactiveState__$$"]: state }) as LikeReactNode;\n }\n };\n\n return MyReactReactiveComponent;\n}\n', + }, + hunks: [ + 'diff --git a/packages/myreact-reactivity/src/reactive/feature.ts b/packages/myreact-reactivity/src/reactive/feature.ts\nindex 5b301628..15aac42f 100644\n--- a/packages/myreact-reactivity/src/reactive/feature.ts\n+++ b/packages/myreact-reactivity/src/reactive/feature.ts\n@@ -74,7 +74,7 @@ export function createReactive

, S extends Reco\n \n componentWillUnmount(): void {\n this.props.$$__instance__$$.onUnmounted.forEach((f) => f());\n- this.effect.stop();\n+ this.reactiveEffect.stop();\n }\n \n shouldComponentUpdate(): boolean {\n@@ -84,7 +84,7 @@ export function createReactive

, S extends Reco\n return true;\n }\n \n- effect = new ReactiveEffect(() => {\n+ reactiveEffect = new ReactiveEffect(() => {\n const { children, $$__trigger__$$, $$__reactiveState__$$, $$__instance__$$, ...last } = this.props;\n const targetRender = (render || children) as (props: UnwrapRef & P) => LikeReactNode;\n const element = targetRender?.({ ...last, ...$$__reactiveState__$$ } as UnwrapRef & P) || null;\n@@ -92,7 +92,7 @@ export function createReactive

, S extends Reco\n }, this.props.$$__trigger__$$);\n \n render() {\n- return createElement(ForBeforeMount, { ["$$__instance__$$"]: this.props.$$__instance__$$, children: this.effect.run() });\n+ return createElement(ForBeforeMount, { ["$$__instance__$$"]: this.props.$$__instance__$$, children: this.reactiveEffect.run() });\n }\n }\n \n@@ -104,10 +104,10 @@ export function createReactive

, S extends Reco\n } & P\n > {\n componentWillUnmount(): void {\n- this.effect.stop();\n+ this.reactiveEffect.stop();\n }\n \n- effect = new ReactiveEffect(() => {\n+ reactiveEffect = new ReactiveEffect(() => {\n const { children, $$__trigger__$$, $$__reactiveState__$$, $$__instance__$$, ...last } = this.props;\n const targetRender = (render || children) as (props: UnwrapRef & P) => LikeReactNode;\n const element = targetRender?.({ ...last, ...$$__reactiveState__$$ } as UnwrapRef & P) || null;\n@@ -115,7 +115,7 @@ export function createReactive

, S extends Reco\n }, this.props.$$__trigger__$$);\n \n render() {\n- return this.effect.run();\n+ return this.reactiveEffect.run();\n }\n }\n', + ], +}; + +export const c = { + newFile: { + fileName: "a/packages/myreact-dom/src/client/tools/highlight.ts", + content: + 'import { STATE_TYPE, include } from "@my-react/react-shared";\n\nimport { enableHighlight } from "@my-react-dom-shared";\n\nimport type { MyReactFiberNode } from "@my-react/react-reconciler";\nimport type { ClientDomDispatch } from "@my-react-dom-client/renderDispatch";\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport const debounce = (callback: T, time?: number): T => {\n let id = null;\n return ((...args) => {\n clearTimeout(id);\n id = setTimeout(() => {\n callback.call(null, ...args);\n }, time || 40);\n }) as unknown as T;\n};\n\n/**\n * @internal\n */\nexport class HighLight {\n /**\n * @type HighLight\n */\n static instance: HighLight | undefined = undefined;\n\n /**\n *\n * @returns HighLight\n */\n static getHighLightInstance = () => {\n HighLight.instance = HighLight.instance || new HighLight();\n\n return HighLight.instance;\n };\n\n mask: HTMLCanvasElement | null = null;\n\n range = document.createRange();\n\n running = false;\n\n __pendingUpdate__: Set = new Set();\n\n __pendingAppend__: Set = new Set();\n\n __pendingSetRef__: Set = new Set();\n\n __pendingWarn__: Set = new Set();\n\n width = 0;\n\n height = 0;\n\n constructor() {\n this.mask = document.createElement("canvas");\n this.mask.setAttribute("data-highlight", "@my-react");\n this.mask.style.cssText = `\n position: fixed;\n z-index: 99999999;\n left: 0;\n top: 0;\n pointer-events: none;\n `;\n document.documentElement.prepend(this.mask);\n this.setSize();\n window.addEventListener("resize", this.setSize);\n }\n\n setSize = debounce(() => {\n this.width = window.innerWidth || document.documentElement.clientWidth;\n\n this.height = window.innerHeight || document.documentElement.clientHeight;\n\n this.mask.width = this.width;\n\n this.mask.height = this.height;\n });\n\n highLight = (fiber: MyReactFiberNode, type: "update" | "append" | "setRef" | "warn") => {\n if (fiber.nativeNode) {\n switch (type) {\n case "update":\n this.__pendingUpdate__.add(fiber);\n break;\n case "append":\n this.__pendingAppend__.add(fiber);\n break;\n case "setRef":\n this.__pendingSetRef__.add(fiber);\n break;\n case "warn":\n this.__pendingWarn__.add(fiber);\n }\n }\n\n if (!this.running) {\n this.running = true;\n requestAnimationFrame(this.flashPending);\n }\n };\n\n flashPending = () => {\n const context = this.mask.getContext("2d");\n\n const allPendingUpdate = new Set(this.__pendingUpdate__);\n\n this.__pendingUpdate__.clear();\n\n context.strokeStyle = "rgba(200,50,50,0.8)";\n\n allPendingUpdate.forEach((fiber) => {\n if (include(fiber.state, STATE_TYPE.__unmount__)) return;\n try {\n const node = fiber.nativeNode as HTMLElement;\n if (node.nodeType === Node.TEXT_NODE) {\n this.range.selectNodeContents(node);\n } else {\n this.range.selectNode(node);\n }\n const rect = this.range.getBoundingClientRect();\n if (\n (rect.width || rect.height) &&\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)\n ) {\n // do the highlight paint\n const left = rect.left - 0.5;\n const top = rect.top - 0.5;\n const width = rect.width + 1;\n const height = rect.height + 1;\n context.strokeRect(\n left < 0 ? 0 : left,\n top < 0 ? 0 : top,\n width > window.innerWidth ? window.innerWidth : width,\n height > window.innerHeight ? window.innerHeight : height\n );\n }\n } catch {\n void 0;\n }\n });\n\n const allPendingAppend = new Set(this.__pendingAppend__);\n\n this.__pendingAppend__.clear();\n\n allPendingAppend.forEach((fiber) => {\n if (include(fiber.state, STATE_TYPE.__unmount__)) return;\n try {\n const node = fiber.nativeNode as HTMLElement;\n if (node.nodeType === Node.TEXT_NODE) {\n this.range.selectNodeContents(node);\n } else {\n this.range.selectNode(node);\n }\n const rect = this.range.getBoundingClientRect();\n if (\n (rect.width || rect.height) &&\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)\n ) {\n // do the highlight paint\n const left = rect.left - 0.5;\n const top = rect.top - 0.5;\n const width = rect.width + 1;\n const height = rect.height + 1;\n context.strokeRect(\n left < 0 ? 0 : left,\n top < 0 ? 0 : top,\n width > window.innerWidth ? window.innerWidth : width,\n height > window.innerHeight ? window.innerHeight : height\n );\n }\n } catch {\n void 0;\n }\n });\n\n const allPendingSetRef = new Set(this.__pendingSetRef__);\n\n this.__pendingSetRef__.clear();\n\n allPendingSetRef.forEach((fiber) => {\n if (include(fiber.state, STATE_TYPE.__unmount__)) return;\n try {\n const node = fiber.nativeNode as HTMLElement;\n if (node.nodeType === Node.TEXT_NODE) {\n this.range.selectNodeContents(node);\n } else {\n this.range.selectNode(node);\n }\n const rect = this.range.getBoundingClientRect();\n if (\n (rect.width || rect.height) &&\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)\n ) {\n // do the highlight paint\n const left = rect.left - 0.5;\n const top = rect.top - 0.5;\n const width = rect.width + 1;\n const height = rect.height + 1;\n context.strokeRect(\n left < 0 ? 0 : left,\n top < 0 ? 0 : top,\n width > window.innerWidth ? window.innerWidth : width,\n height > window.innerHeight ? window.innerHeight : height\n );\n }\n } catch {\n void 0;\n }\n });\n\n context.strokeStyle = "rgba(230,150,40,0.8)";\n\n const allPendingWarn = new Set(this.__pendingWarn__);\n\n this.__pendingWarn__.clear();\n\n allPendingWarn.forEach((fiber) => {\n if (include(fiber.state, STATE_TYPE.__unmount__)) return;\n try {\n const node = fiber.nativeNode as HTMLElement;\n if (node.nodeType === Node.TEXT_NODE) {\n this.range.selectNodeContents(node);\n } else {\n this.range.selectNode(node);\n }\n const rect = this.range.getBoundingClientRect();\n if (\n (rect.width || rect.height) &&\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)\n ) {\n // do the highlight paint\n const left = rect.left - 0.5;\n const top = rect.top - 0.5;\n const width = rect.width + 1;\n const height = rect.height + 1;\n context.strokeRect(\n left < 0 ? 0 : left,\n top < 0 ? 0 : top,\n width > window.innerWidth ? window.innerWidth : width,\n height > window.innerHeight ? window.innerHeight : height\n );\n }\n } catch {\n void 0;\n }\n });\n\n setTimeout(() => {\n context.clearRect(0, 0, this.width, this.height);\n this.running = false;\n if (this.__pendingUpdate__.size || this.__pendingAppend__.size || this.__pendingSetRef__.size) {\n this.running = true;\n this.flashPending();\n }\n }, 100);\n };\n}\n\nexport const highlightUpdateFiber = function (this: ClientDomDispatch, fiber: MyReactFiberNode) {\n if (this.isAppMounted && !this.isHydrateRender && !this.isServerRender && (enableHighlight.current || window.__highlight__)) {\n HighLight.getHighLightInstance().highLight(fiber, "update");\n }\n};\n', + }, + hunks: [ + "diff --git a/packages/myreact-dom/src/client/tools/highlight.ts b/packages/myreact-dom/src/client/tools/highlight.ts\nindex 13cba7db..002becdc 100644\n--- a/packages/myreact-dom/src/client/tools/highlight.ts\n+++ b/packages/myreact-dom/src/client/tools/highlight.ts\n@@ -112,31 +112,35 @@ export class HighLight {\n \n allPendingUpdate.forEach((fiber) => {\n if (include(fiber.state, STATE_TYPE.__unmount__)) return;\n- const node = fiber.nativeNode as HTMLElement;\n- if (node.nodeType === Node.TEXT_NODE) {\n- this.range.selectNodeContents(node);\n- } else {\n- this.range.selectNode(node);\n- }\n- const rect = this.range.getBoundingClientRect();\n- if (\n- (rect.width || rect.height) &&\n- rect.top >= 0 &&\n- rect.left >= 0 &&\n- rect.right <= (window.innerWidth || document.documentElement.clientWidth) &&\n- rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)\n- ) {\n- // do the highlight paint\n- const left = rect.left - 0.5;\n- const top = rect.top - 0.5;\n- const width = rect.width + 1;\n- const height = rect.height + 1;\n- context.strokeRect(\n- left < 0 ? 0 : left,\n- top < 0 ? 0 : top,\n- width > window.innerWidth ? window.innerWidth : width,\n- height > window.innerHeight ? window.innerHeight : height\n- );\n+ try {\n+ const node = fiber.nativeNode as HTMLElement;\n+ if (node.nodeType === Node.TEXT_NODE) {\n+ this.range.selectNodeContents(node);\n+ } else {\n+ this.range.selectNode(node);\n+ }\n+ const rect = this.range.getBoundingClientRect();\n+ if (\n+ (rect.width || rect.height) &&\n+ rect.top >= 0 &&\n+ rect.left >= 0 &&\n+ rect.right <= (window.innerWidth || document.documentElement.clientWidth) &&\n+ rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)\n+ ) {\n+ // do the highlight paint\n+ const left = rect.left - 0.5;\n+ const top = rect.top - 0.5;\n+ const width = rect.width + 1;\n+ const height = rect.height + 1;\n+ context.strokeRect(\n+ left < 0 ? 0 : left,\n+ top < 0 ? 0 : top,\n+ width > window.innerWidth ? window.innerWidth : width,\n+ height > window.innerHeight ? window.innerHeight : height\n+ );\n+ }\n+ } catch {\n+ void 0;\n }\n });\n \n@@ -146,31 +150,35 @@ export class HighLight {\n \n allPendingAppend.forEach((fiber) => {\n if (include(fiber.state, STATE_TYPE.__unmount__)) return;\n- const node = fiber.nativeNode as HTMLElement;\n- if (node.nodeType === Node.TEXT_NODE) {\n- this.range.selectNodeContents(node);\n- } else {\n- this.range.selectNode(node);\n- }\n- const rect = this.range.getBoundingClientRect();\n- if (\n- (rect.width || rect.height) &&\n- rect.top >= 0 &&\n- rect.left >= 0 &&\n- rect.right <= (window.innerWidth || document.documentElement.clientWidth) &&\n- rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)\n- ) {\n- // do the highlight paint\n- const left = rect.left - 0.5;\n- const top = rect.top - 0.5;\n- const width = rect.width + 1;\n- const height = rect.height + 1;\n- context.strokeRect(\n- left < 0 ? 0 : left,\n- top < 0 ? 0 : top,\n- width > window.innerWidth ? window.innerWidth : width,\n- height > window.innerHeight ? window.innerHeight : height\n- );\n+ try {\n+ const node = fiber.nativeNode as HTMLElement;\n+ if (node.nodeType === Node.TEXT_NODE) {\n+ this.range.selectNodeContents(node);\n+ } else {\n+ this.range.selectNode(node);\n+ }\n+ const rect = this.range.getBoundingClientRect();\n+ if (\n+ (rect.width || rect.height) &&\n+ rect.top >= 0 &&\n+ rect.left >= 0 &&\n+ rect.right <= (window.innerWidth || document.documentElement.clientWidth) &&\n+ rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)\n+ ) {\n+ // do the highlight paint\n+ const left = rect.left - 0.5;\n+ const top = rect.top - 0.5;\n+ const width = rect.width + 1;\n+ const height = rect.height + 1;\n+ context.strokeRect(\n+ left < 0 ? 0 : left,\n+ top < 0 ? 0 : top,\n+ width > window.innerWidth ? window.innerWidth : width,\n+ height > window.innerHeight ? window.innerHeight : height\n+ );\n+ }\n+ } catch {\n+ void 0;\n }\n });\n \n@@ -180,31 +188,35 @@ export class HighLight {\n \n allPendingSetRef.forEach((fiber) => {\n if (include(fiber.state, STATE_TYPE.__unmount__)) return;\n- const node = fiber.nativeNode as HTMLElement;\n- if (node.nodeType === Node.TEXT_NODE) {\n- this.range.selectNodeContents(node);\n- } else {\n- this.range.selectNode(node);\n- }\n- const rect = this.range.getBoundingClientRect();\n- if (\n- (rect.width || rect.height) &&\n- rect.top >= 0 &&\n- rect.left >= 0 &&\n- rect.right <= (window.innerWidth || document.documentElement.clientWidth) &&\n- rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)\n- ) {\n- // do the highlight paint\n- const left = rect.left - 0.5;\n- const top = rect.top - 0.5;\n- const width = rect.width + 1;\n- const height = rect.height + 1;\n- context.strokeRect(\n- left < 0 ? 0 : left,\n- top < 0 ? 0 : top,\n- width > window.innerWidth ? window.innerWidth : width,\n- height > window.innerHeight ? window.innerHeight : height\n- );\n+ try {\n+ const node = fiber.nativeNode as HTMLElement;\n+ if (node.nodeType === Node.TEXT_NODE) {\n+ this.range.selectNodeContents(node);\n+ } else {\n+ this.range.selectNode(node);\n+ }\n+ const rect = this.range.getBoundingClientRect();\n+ if (\n+ (rect.width || rect.height) &&\n+ rect.top >= 0 &&\n+ rect.left >= 0 &&\n+ rect.right <= (window.innerWidth || document.documentElement.clientWidth) &&\n+ rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)\n+ ) {\n+ // do the highlight paint\n+ const left = rect.left - 0.5;\n+ const top = rect.top - 0.5;\n+ const width = rect.width + 1;\n+ const height = rect.height + 1;\n+ context.strokeRect(\n+ left < 0 ? 0 : left,\n+ top < 0 ? 0 : top,\n+ width > window.innerWidth ? window.innerWidth : width,\n+ height > window.innerHeight ? window.innerHeight : height\n+ );\n+ }\n+ } catch {\n+ void 0;\n }\n });\n \n@@ -216,31 +228,35 @@ export class HighLight {\n \n allPendingWarn.forEach((fiber) => {\n if (include(fiber.state, STATE_TYPE.__unmount__)) return;\n- const node = fiber.nativeNode as HTMLElement;\n- if (node.nodeType === Node.TEXT_NODE) {\n- this.range.selectNodeContents(node);\n- } else {\n- this.range.selectNode(node);\n- }\n- const rect = this.range.getBoundingClientRect();\n- if (\n- (rect.width || rect.height) &&\n- rect.top >= 0 &&\n- rect.left >= 0 &&\n- rect.right <= (window.innerWidth || document.documentElement.clientWidth) &&\n- rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)\n- ) {\n- // do the highlight paint\n- const left = rect.left - 0.5;\n- const top = rect.top - 0.5;\n- const width = rect.width + 1;\n- const height = rect.height + 1;\n- context.strokeRect(\n- left < 0 ? 0 : left,\n- top < 0 ? 0 : top,\n- width > window.innerWidth ? window.innerWidth : width,\n- height > window.innerHeight ? window.innerHeight : height\n- );\n+ try {\n+ const node = fiber.nativeNode as HTMLElement;\n+ if (node.nodeType === Node.TEXT_NODE) {\n+ this.range.selectNodeContents(node);\n+ } else {\n+ this.range.selectNode(node);\n+ }\n+ const rect = this.range.getBoundingClientRect();\n+ if (\n+ (rect.width || rect.height) &&\n+ rect.top >= 0 &&\n+ rect.left >= 0 &&\n+ rect.right <= (window.innerWidth || document.documentElement.clientWidth) &&\n+ rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)\n+ ) {\n+ // do the highlight paint\n+ const left = rect.left - 0.5;\n+ const top = rect.top - 0.5;\n+ const width = rect.width + 1;\n+ const height = rect.height + 1;\n+ context.strokeRect(\n+ left < 0 ? 0 : left,\n+ top < 0 ? 0 : top,\n+ width > window.innerWidth ? window.innerWidth : width,\n+ height > window.innerHeight ? window.innerHeight : height\n+ );\n+ }\n+ } catch {\n+ void 0;\n }\n });\n", + ], +}; + +export const d = { + oldFile: { + fileName: "src/views/test/result/singleResult/singleResultDetail/llm/components/result.vue", + content: + "\n\n\n", + }, + newFile: { + fileName: "src/views/test/result/singleResult/singleResultDetail/llm/components/result.vue", + content: + "\n\n\n", + }, + hunks: [ + '--- src/views/test/result/singleResult/singleResultDetail/llm/components/result.vue\n+++ src/views/test/result/singleResult/singleResultDetail/llm/components/result.vue\n@@ -6,10 +6,19 @@\n \n+ \n