From 01ed74c026e6fda4ea28a0d9dc9184adffc1a1fe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Oct 2026 01:48:08 +0000 Subject: [PATCH 1/2] chore(deps): bump @pierre/diffs from 1.5.1 to 1.6.1 Bumps @pierre/diffs from 1.5.1 to 1.6.1. --- updated-dependencies: - dependency-name: "@pierre/diffs" dependency-version: 1.6.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- bun.lock | 32 +++++--------------------------- web/package.json | 2 +- 2 files changed, 6 insertions(+), 28 deletions(-) diff --git a/bun.lock b/bun.lock index c900d299..1e924279 100644 --- a/bun.lock +++ b/bun.lock @@ -59,7 +59,7 @@ "@codemirror/view": "^6.43.15", "@lezer/highlight": "^1.2.5", "@lobehub/icons-static-svg": "^1.98.0", - "@pierre/diffs": "^1.5.1", + "@pierre/diffs": "^1.6.1", "@radix-ui/react-popover": "^1.3.1", "@shikijs/core": "^4.5.0", "@shikijs/langs": "^4.5.0", @@ -334,11 +334,13 @@ "@oxlint/binding-win32-x64-msvc": ["@oxlint/binding-win32-x64-msvc@1.89.0", "", { "os": "win32", "cpu": "x64" }, "sha512-hLFJ/o0f/dTJh/EW0vmcbREYSQO9tYgfiAAlsOkiLFiJuRRWvYtFELUXN5o2ijpSo/tlO1n+YlWN58tZwPG18A=="], - "@pierre/diffs": ["@pierre/diffs@1.5.1", "", { "dependencies": { "@pierre/theme": "2.0.0", "@pierre/theming": "1.0.1", "@shikijs/transformers": "^3.0.0 || ^4.0.0", "diff": "9.0.0", "hast-util-to-html": "9.0.5", "lru_map": "0.4.1", "shiki": "^3.0.0 || ^4.0.0" }, "peerDependencies": { "react": "^18.3.1 || ^19.0.0", "react-dom": "^18.3.1 || ^19.0.0" }, "optionalPeers": ["react", "react-dom"] }, "sha512-+EXNfz4ZXI6FHr7P6ToWEORwyYiPVfAmzhA70xF+0y/oNvj7gbNTLJJ6jNzkBjuMbRlu564TAmgYZLc5OyHURA=="], + "@pierre/diffs": ["@pierre/diffs@1.6.1", "", { "dependencies": { "@pierre/highlights": "0.2.0", "@pierre/theme": "2.0.0", "@pierre/theming": "1.0.2", "diff": "9.0.0", "hast-util-to-html": "9.0.5", "lru_map": "0.4.1", "shiki": "^3.0.0 || ^4.0.0" }, "peerDependencies": { "react": "^18.3.1 || ^19.0.0", "react-dom": "^18.3.1 || ^19.0.0" }, "optionalPeers": ["react", "react-dom"] }, "sha512-XTfLW4bFETyosZfFNUoyRh1zPE4tmAijOoxdHx4X805tlaq/7/fuQXIiJSm21+jLkDo8vn5elQ+2O4YtMTKM0Q=="], + + "@pierre/highlights": ["@pierre/highlights@0.2.0", "", {}, "sha512-hTpcOU1EzDAP4bYtEhxmMu2jwMvtkUydRUBUpWMSHTs3dw0IaC3Ld5ansMy18L0GE3b6Vfl2OGkLK+pWWpnBmw=="], "@pierre/theme": ["@pierre/theme@2.0.0", "", {}, "sha512-yNDd9GYLQl1mEUJR8AneJ5e4ohLIHQd/wZLWr4fagt78vS2RwwZNW530vVgHqXFAyFVcFlRmGUD5ramXH46OXw=="], - "@pierre/theming": ["@pierre/theming@1.0.1", "", { "peerDependencies": { "@pierre/theme": "^1.1.0 || ^2.0.0", "@shikijs/themes": "^3.0.0 || ^4.0.0", "react": "^18.3.1 || ^19.0.0", "react-dom": "^18.3.1 || ^19.0.0", "shiki": "^3.0.0 || ^4.0.0" }, "optionalPeers": ["@pierre/theme", "@shikijs/themes", "react", "react-dom", "shiki"] }, "sha512-WCI5Qd7iprDpISL9fBYOLe8RV53+b7mFNA3bPzl60/2CKCSrsKN8zEcep6Y3BAzvARlmca50zGjDodqPGiTUKA=="], + "@pierre/theming": ["@pierre/theming@1.0.2", "", { "peerDependencies": { "@pierre/theme": "^1.1.0 || ^2.0.0", "@shikijs/themes": "^3.0.0 || ^4.0.0", "react": "^18.3.1 || ^19.0.0", "react-dom": "^18.3.1 || ^19.0.0", "shiki": "^3.0.0 || ^4.0.0" }, "optionalPeers": ["@pierre/theme", "@shikijs/themes", "react", "react-dom", "shiki"] }, "sha512-RmXLLqtx31UGcR8kZyO5hGAQ1EXz6loT1Cu0BFAGsbnBboIxp2BlomkLfWyvdT4WZXnBGyu25onL1gKpFQuSUw=="], "@profoundlogic/hogan": ["@profoundlogic/hogan@3.0.4", "", { "dependencies": { "nopt": "1.0.10" }, "bin": { "hulk": "bin/hulk" } }, "sha512-pmNVGuooS30Mm7YbZd5T7E5zYVO6D5Ct91sn4T39mUvMUc3sCGridcnhAufL1/Bz2QzAtzEn0agNrdk3+5yWzw=="], @@ -448,8 +450,6 @@ "@shikijs/themes": ["@shikijs/themes@4.5.0", "", { "dependencies": { "@shikijs/types": "4.5.0" } }, "sha512-zGb87H3UBbpuI4yoh5UguB1XbU+2BDU3kflM7UfZ+Cy2hWo9lBtqjSVK20gmLY6ukYl040hAypGXMgud9vul8Q=="], - "@shikijs/transformers": ["@shikijs/transformers@4.4.3", "", { "dependencies": { "@shikijs/core": "4.4.3", "@shikijs/types": "4.4.3" } }, "sha512-oJSARV6NaWd+rnNJbtnpAdj3Zg0ZVyzsnMgb3vi3HA+35y8lBWUCpOnWsmyiXZIikY+x1BDqrQUgmxfzWh7Jvw=="], - "@shikijs/types": ["@shikijs/types@4.5.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-drtPrtD8N0DENyD2cyt6Ajy+IWsiCLgMxODwLTpvH1UsN6a9jf90tNTPjqwHvA+0Lzu9e0txk8DjfqH1p9UJRw=="], "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], @@ -944,12 +944,6 @@ "@pierre/diffs/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], - "@pierre/diffs/shiki": ["shiki@4.4.3", "", { "dependencies": { "@shikijs/core": "4.4.3", "@shikijs/engine-javascript": "4.4.3", "@shikijs/engine-oniguruma": "4.4.3", "@shikijs/langs": "4.4.3", "@shikijs/themes": "4.4.3", "@shikijs/types": "4.4.3", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g=="], - - "@shikijs/transformers/@shikijs/core": ["@shikijs/core@4.4.3", "", { "dependencies": { "@shikijs/primitive": "4.4.3", "@shikijs/types": "4.4.3", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5", "hast-util-to-html": "^9.0.5" } }, "sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg=="], - - "@shikijs/transformers/@shikijs/types": ["@shikijs/types@4.4.3", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g=="], - "@types/node/undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], "cmdk/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.10", "", { "dependencies": { "@radix-ui/react-slot": "1.3.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg=="], @@ -966,26 +960,10 @@ "web-push/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], - "@pierre/diffs/shiki/@shikijs/core": ["@shikijs/core@4.4.3", "", { "dependencies": { "@shikijs/primitive": "4.4.3", "@shikijs/types": "4.4.3", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5", "hast-util-to-html": "^9.0.5" } }, "sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg=="], - - "@pierre/diffs/shiki/@shikijs/engine-javascript": ["@shikijs/engine-javascript@4.4.3", "", { "dependencies": { "@shikijs/types": "4.4.3", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.6" } }, "sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ=="], - - "@pierre/diffs/shiki/@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@4.4.3", "", { "dependencies": { "@shikijs/types": "4.4.3", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w=="], - - "@pierre/diffs/shiki/@shikijs/langs": ["@shikijs/langs@4.4.3", "", { "dependencies": { "@shikijs/types": "4.4.3" } }, "sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A=="], - - "@pierre/diffs/shiki/@shikijs/themes": ["@shikijs/themes@4.4.3", "", { "dependencies": { "@shikijs/types": "4.4.3" } }, "sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw=="], - - "@pierre/diffs/shiki/@shikijs/types": ["@shikijs/types@4.4.3", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g=="], - - "@shikijs/transformers/@shikijs/core/@shikijs/primitive": ["@shikijs/primitive@4.4.3", "", { "dependencies": { "@shikijs/types": "4.4.3", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ=="], - "cmdk/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.3.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.5" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q=="], "gaxios/https-proxy-agent/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], "web-push/https-proxy-agent/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], - - "@pierre/diffs/shiki/@shikijs/core/@shikijs/primitive": ["@shikijs/primitive@4.4.3", "", { "dependencies": { "@shikijs/types": "4.4.3", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.5" } }, "sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ=="], } } diff --git a/web/package.json b/web/package.json index 1cc00937..5702b806 100644 --- a/web/package.json +++ b/web/package.json @@ -36,7 +36,7 @@ "@codemirror/view": "^6.43.15", "@lezer/highlight": "^1.2.5", "@lobehub/icons-static-svg": "^1.98.0", - "@pierre/diffs": "^1.5.1", + "@pierre/diffs": "^1.6.1", "@radix-ui/react-popover": "^1.3.1", "@shikijs/core": "^4.5.0", "@shikijs/langs": "^4.5.0", From 136f7372a534623399786a4da859f4c7819ca039 Mon Sep 17 00:00:00 2001 From: Arthur Date: Tue, 27 Oct 2026 09:53:31 +0800 Subject: [PATCH 2/2] fix(deps): keep diff grammar and theme bundles curated --- bun.lock | 2 ++ web/package.json | 2 ++ web/src/diffHighlightsThemes.ts | 5 ++++ web/src/diffThemes.test.ts | 43 +++++++++++++++++++++++++++++++++ web/src/diffThemes.ts | 12 +++++++++ web/vite.config.ts | 15 +++++++++++- 6 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 web/src/diffHighlightsThemes.ts create mode 100644 web/src/diffThemes.test.ts create mode 100644 web/src/diffThemes.ts diff --git a/bun.lock b/bun.lock index 1e924279..ec0443e7 100644 --- a/bun.lock +++ b/bun.lock @@ -60,6 +60,8 @@ "@lezer/highlight": "^1.2.5", "@lobehub/icons-static-svg": "^1.98.0", "@pierre/diffs": "^1.6.1", + "@pierre/highlights": "0.2.0", + "@pierre/theme": "2.0.0", "@radix-ui/react-popover": "^1.3.1", "@shikijs/core": "^4.5.0", "@shikijs/langs": "^4.5.0", diff --git a/web/package.json b/web/package.json index 5702b806..975f2f27 100644 --- a/web/package.json +++ b/web/package.json @@ -37,6 +37,8 @@ "@lezer/highlight": "^1.2.5", "@lobehub/icons-static-svg": "^1.98.0", "@pierre/diffs": "^1.6.1", + "@pierre/highlights": "0.2.0", + "@pierre/theme": "2.0.0", "@radix-ui/react-popover": "^1.3.1", "@shikijs/core": "^4.5.0", "@shikijs/langs": "^4.5.0", diff --git a/web/src/diffHighlightsThemes.ts b/web/src/diffHighlightsThemes.ts new file mode 100644 index 00000000..a98fdb11 --- /dev/null +++ b/web/src/diffHighlightsThemes.ts @@ -0,0 +1,5 @@ +// Keep the optional Highlights backend aligned with the diff viewer's themes. +export const themes = { + "pierre-dark": () => import("@pierre/highlights/themes/pierre-dark"), + "pierre-light": () => import("@pierre/highlights/themes/pierre-light"), +}; diff --git a/web/src/diffThemes.test.ts b/web/src/diffThemes.test.ts new file mode 100644 index 00000000..2fda4ec0 --- /dev/null +++ b/web/src/diffThemes.test.ts @@ -0,0 +1,43 @@ +import { expect, test } from "bun:test"; +import { DEFAULT_THEMES } from "@pierre/diffs"; +import { themes as highlightsThemes } from "./diffHighlightsThemes"; +import { themes } from "./diffThemes"; +import config from "../vite.config"; + +test("diff bundles use curated language and theme catalogs", () => { + const aliases = config.resolve?.alias; + expect(Array.isArray(aliases)).toBe(true); + if (!Array.isArray(aliases)) + throw new Error("Expected explicit Vite aliases"); + const replacement = (specifier: string) => + aliases.find(({ find }) => + typeof find === "string" ? find === specifier : find.test(specifier), + )?.replacement; + expect(replacement("shiki")).toEndWith("/src/shiki.ts"); + expect(replacement("shiki/langs")).toBe(replacement("shiki")); + expect(replacement("shiki/core")).toBeUndefined(); + expect(replacement("shiki/wasm")).toBeUndefined(); + expect(replacement("@pierre/theming/themes")).toEndWith("/src/diffThemes.ts"); + expect(replacement("@pierre/highlights/themes/loader")).toEndWith( + "/src/diffHighlightsThemes.ts", + ); +}); + +test("curated diff catalogs load both default theme formats", async () => { + expect(Object.keys(highlightsThemes).sort()).toEqual( + Object.values(DEFAULT_THEMES).sort(), + ); + for (const name of Object.values(DEFAULT_THEMES)) { + const descriptor = themes.getTheme(name); + expect(descriptor).toBeDefined(); + const textmate = (await descriptor!.load()).default; + expect(textmate.name).toBe(name); + const zed = ( + await highlightsThemes[name as keyof typeof highlightsThemes]() + ).default; + expect(zed.appearance).toBe(textmate.type); + expect(zed.style).toBeDefined(); + } + expect(themes.getTheme("toString")).toBeUndefined(); + expect(themes.getTheme("github-dark")).toBeUndefined(); +}); diff --git a/web/src/diffThemes.ts b/web/src/diffThemes.ts new file mode 100644 index 00000000..6d933bec --- /dev/null +++ b/web/src/diffThemes.ts @@ -0,0 +1,12 @@ +// Keep the catalog limited to the two themes exposed by the diff viewer. +const loaders = { + "pierre-dark": () => import("@pierre/theme/pierre-dark"), + "pierre-light": () => import("@pierre/theme/pierre-light"), +}; + +export const themes = { + getTheme(name: string) { + if (!Object.prototype.hasOwnProperty.call(loaders, name)) return undefined; + return { load: loaders[name as keyof typeof loaders] }; + }, +}; diff --git a/web/vite.config.ts b/web/vite.config.ts index bbb98c71..951945c6 100644 --- a/web/vite.config.ts +++ b/web/vite.config.ts @@ -8,8 +8,21 @@ export default defineConfig({ plugins: [react()], resolve: { alias: [ + // Diff viewers expose only Pierre light/dark, not the full theme catalogs. { - find: /^shiki$/, + find: /^@pierre\/theming\/themes$/, + replacement: fileURLToPath( + new URL("./src/diffThemes.ts", import.meta.url), + ), + }, + { + find: /^@pierre\/highlights\/themes\/loader$/, + replacement: fileURLToPath( + new URL("./src/diffHighlightsThemes.ts", import.meta.url), + ), + }, + { + find: /^shiki(?:\/langs)?$/, replacement: fileURLToPath(new URL("./src/shiki.ts", import.meta.url)), }, ],