diff --git a/.prettierrc b/.prettierrc index 7225824f5..649bc5a16 100644 --- a/.prettierrc +++ b/.prettierrc @@ -4,5 +4,9 @@ "singleQuote": true, "printWidth": 80, "tabWidth": 2, - "useTabs": false + "useTabs": false, + "importOrder": ["", "^\\."], + "importOrderSortSpecifiers": true, + "importOrderSeparation": true, + "plugins": ["@trivago/prettier-plugin-sort-imports"] } diff --git a/bun.lock b/bun.lock index 455fa46e8..d719b76c2 100644 --- a/bun.lock +++ b/bun.lock @@ -25,6 +25,7 @@ "shiki": "catalog:", }, "devDependencies": { + "@trivago/prettier-plugin-sort-imports": "catalog:", "@types/react": "catalog:", "@types/react-dom": "catalog:", "@vitejs/plugin-react": "catalog:", @@ -42,6 +43,7 @@ "shiki": "catalog:", }, "devDependencies": { + "@trivago/prettier-plugin-sort-imports": "catalog:", "@types/hast": "catalog:", "typescript": "catalog:", }, @@ -76,6 +78,7 @@ "@shikijs/core": "catalog:", }, "devDependencies": { + "@trivago/prettier-plugin-sort-imports": "catalog:", "typescript": "catalog:", }, }, @@ -85,6 +88,7 @@ "@eslint/js": "9.36.0", "@shikijs/core": "3.13.0", "@tailwindcss/postcss": "4.1.13", + "@trivago/prettier-plugin-sort-imports": "5.2.2", "@types/bun": "1.2.22", "@types/hast": "^3.0.4", "@types/mdx": "2.0.13", @@ -502,6 +506,8 @@ "@tailwindcss/postcss": ["@tailwindcss/postcss@4.1.13", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.1.13", "@tailwindcss/oxide": "4.1.13", "postcss": "^8.4.41", "tailwindcss": "4.1.13" } }, "sha512-HLgx6YSFKJT7rJqh9oJs/TkBFhxuMOfUKSBEPYwV+t78POOBsdQ7crhZLzwcH3T0UyUuOzU/GK5pk5eKr3wCiQ=="], + "@trivago/prettier-plugin-sort-imports": ["@trivago/prettier-plugin-sort-imports@5.2.2", "", { "dependencies": { "@babel/generator": "^7.26.5", "@babel/parser": "^7.26.7", "@babel/traverse": "^7.26.7", "@babel/types": "^7.26.7", "javascript-natural-sort": "^0.7.1", "lodash": "^4.17.21" }, "peerDependencies": { "@vue/compiler-sfc": "3.x", "prettier": "2.x - 3.x", "prettier-plugin-svelte": "3.x", "svelte": "4.x || 5.x" }, "optionalPeers": ["@vue/compiler-sfc", "prettier-plugin-svelte", "svelte"] }, "sha512-fYDQA9e6yTNmA13TLVSA+WMQRc5Bn/c0EUBditUHNfMMxN7M82c38b1kEggVE3pLpZ0FwkwJkUEKMiOi52JXFA=="], + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], @@ -732,7 +738,7 @@ "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], - "detect-libc": ["detect-libc@2.1.0", "", {}, "sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg=="], + "detect-libc": ["detect-libc@2.1.1", "", {}, "sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw=="], "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], @@ -994,6 +1000,8 @@ "iterator.prototype": ["iterator.prototype@1.1.5", "", { "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" } }, "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g=="], + "javascript-natural-sort": ["javascript-natural-sort@0.7.1", "", {}, "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw=="], + "jiti": ["jiti@2.6.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-VXe6RjJkBPj0ohtqaO8vSWP3ZhAKo66fKrFNCll4BTcwljPLz03pCbaNKfzGP5MbrCYcbJ7v0nOYYwUzTEIdXQ=="], "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], @@ -1044,6 +1052,8 @@ "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], @@ -1506,8 +1516,6 @@ "@unrs/resolver-binding-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" } }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="], - "bun-types/@types/node": ["@types/node@24.5.2", "", { "dependencies": { "undici-types": "~7.12.0" } }, "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ=="], - "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1539,7 +1547,5 @@ "@typescript-eslint/typescript-estree/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - - "bun-types/@types/node/undici-types": ["undici-types@7.12.0", "", {}, "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ=="], } } diff --git a/package.json b/package.json index 7042d73b4..1d7445e0d 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "@eslint/js": "9.36.0", "@shikijs/core": "3.13.0", "@tailwindcss/postcss": "4.1.13", + "@trivago/prettier-plugin-sort-imports": "5.2.2", "@types/bun": "1.2.22", "@types/hast": "^3.0.4", "@types/mdx": "2.0.13", diff --git a/packages/demo-app/package.json b/packages/demo-app/package.json index c76876418..cf7fac2fc 100644 --- a/packages/demo-app/package.json +++ b/packages/demo-app/package.json @@ -11,6 +11,7 @@ "preview": "vite preview" }, "devDependencies": { + "@trivago/prettier-plugin-sort-imports": "catalog:", "@types/react": "catalog:", "@types/react-dom": "catalog:", "@vitejs/plugin-react": "catalog:", diff --git a/packages/demo-app/src/components/App.tsx b/packages/demo-app/src/components/App.tsx index 2c4207906..12f01a462 100644 --- a/packages/demo-app/src/components/App.tsx +++ b/packages/demo-app/src/components/App.tsx @@ -2,6 +2,7 @@ import { isHighlighterNull, preloadHighlighter } from '@pierre/diff-ui'; import * as React from 'react'; import { useCallback, useState } from 'react'; import type { BundledLanguage, BundledTheme } from 'shiki'; + import { CodeConfigs, toggleTheme } from '../mocks/'; import '../style.css'; import { createFakeContentStream } from '../utils/createFakeContentStream'; diff --git a/packages/demo-app/src/main.ts b/packages/demo-app/src/main.ts index e268de959..347fe756b 100644 --- a/packages/demo-app/src/main.ts +++ b/packages/demo-app/src/main.ts @@ -1,13 +1,14 @@ import { CodeRenderer, DiffRenderer, + type FileMetadata, + type ParsedPatch, isHighlighterNull, parsePatchContent, preloadHighlighter, - type FileMetadata, - type ParsedPatch, } from '@pierre/diff-ui'; import type { BundledLanguage, BundledTheme } from 'shiki'; + import { CodeConfigs, DIFF_CONTENT, diff --git a/packages/demo-app/src/main.tsx b/packages/demo-app/src/main.tsx index 2ddcb8eb6..2e006674d 100644 --- a/packages/demo-app/src/main.tsx +++ b/packages/demo-app/src/main.tsx @@ -1,5 +1,6 @@ import * as React from 'react'; import * as ReactDOM from 'react-dom/client'; + import { App } from './components/App'; import './style.css'; diff --git a/packages/demo-app/src/mocks/index.ts b/packages/demo-app/src/mocks/index.ts index 7af4fb03e..e84fe8e9b 100644 --- a/packages/demo-app/src/mocks/index.ts +++ b/packages/demo-app/src/mocks/index.ts @@ -1,11 +1,12 @@ +import type { DiffDecorationItem, FileMetadata } from '@pierre/diff-ui'; +import type { BundledLanguage } from 'shiki'; + +import { createHighlighterCleanup } from '../utils/createHighlighterCleanup'; import { createScrollFixer } from '../utils/createScrollFixer'; +import diffContent2 from './diff2.patch?raw'; +import diffContent from './diff.patch?raw'; import mdContent from './example_md.txt?raw'; import tsContent from './example_ts.txt?raw'; -import diffContent from './diff.patch?raw'; -import diffContent2 from './diff2.patch?raw'; -import { createHighlighterCleanup } from '../utils/createHighlighterCleanup'; -import type { BundledLanguage } from 'shiki'; -import type { DiffDecorationItem, FileMetadata } from '@pierre/diff-ui'; export { mdContent, tsContent }; diff --git a/packages/demo-app/vite.config.ts b/packages/demo-app/vite.config.ts index ff38bc080..a84df1188 100644 --- a/packages/demo-app/vite.config.ts +++ b/packages/demo-app/vite.config.ts @@ -1,9 +1,9 @@ -import { defineConfig } from 'vite'; -import type { ViteDevServer, PreviewServer, Plugin } from 'vite'; import react from '@vitejs/plugin-react'; -import path, { resolve } from 'path'; import fs from 'fs'; import type { IncomingMessage, ServerResponse } from 'http'; +import path, { resolve } from 'path'; +import { defineConfig } from 'vite'; +import type { Plugin, PreviewServer, ViteDevServer } from 'vite'; export default defineConfig(() => { const htmlPlugin = (): Plugin => ({ diff --git a/packages/diff-ui/package.json b/packages/diff-ui/package.json index a2c8ebf56..b61981df7 100644 --- a/packages/diff-ui/package.json +++ b/packages/diff-ui/package.json @@ -14,8 +14,9 @@ } }, "devDependencies": { - "typescript": "catalog:", - "@types/hast": "catalog:" + "@trivago/prettier-plugin-sort-imports": "catalog:", + "@types/hast": "catalog:", + "typescript": "catalog:" }, "dependencies": { "@pierre/shiki-stream": "workspace:*", diff --git a/packages/diff-ui/src/CodeRenderer.ts b/packages/diff-ui/src/CodeRenderer.ts index 49c1ada87..ead351db6 100644 --- a/packages/diff-ui/src/CodeRenderer.ts +++ b/packages/diff-ui/src/CodeRenderer.ts @@ -8,6 +8,7 @@ import type { ThemedToken, } from '@shikijs/core'; import type { BundledLanguage, BundledTheme } from 'shiki'; + import { getSharedHighlighter } from './SharedHighlighter'; import { queueRender } from './UnversialRenderer'; import { diff --git a/packages/diff-ui/src/DiffRenderer.ts b/packages/diff-ui/src/DiffRenderer.ts index aeecfdb6f..b151e3a2d 100644 --- a/packages/diff-ui/src/DiffRenderer.ts +++ b/packages/diff-ui/src/DiffRenderer.ts @@ -8,9 +8,10 @@ import type { import type { Element, ElementContent, Root, RootContent } from 'hast'; import { toHtml } from 'hast-util-to-html'; import type { BundledLanguage, BundledTheme } from 'shiki'; -import { SPLIT_WITH_NEWLINES } from './constants'; + import { getSharedHighlighter } from './SharedHighlighter'; -import type { FileMetadata, Hunk, HUNK_LINE_TYPE } from './types'; +import { SPLIT_WITH_NEWLINES } from './constants'; +import type { FileMetadata, HUNK_LINE_TYPE, Hunk } from './types'; import { createCodeNode, createHunkSeparator, diff --git a/packages/diff-ui/src/SharedHighlighter.ts b/packages/diff-ui/src/SharedHighlighter.ts index 388476534..f31391d1c 100644 --- a/packages/diff-ui/src/SharedHighlighter.ts +++ b/packages/diff-ui/src/SharedHighlighter.ts @@ -1,10 +1,10 @@ import { type BundledLanguage, type BundledTheme, + type HighlighterGeneric, createHighlighter, - createOnigurumaEngine, createJavaScriptRegexEngine, - type HighlighterGeneric, + createOnigurumaEngine, loadWasm, } from 'shiki'; diff --git a/packages/diff-ui/src/createStreamingHighlighter.ts b/packages/diff-ui/src/createStreamingHighlighter.ts index 90f7e52ff..958853de1 100644 --- a/packages/diff-ui/src/createStreamingHighlighter.ts +++ b/packages/diff-ui/src/createStreamingHighlighter.ts @@ -1,11 +1,11 @@ +import type { BundledHighlighterOptions } from '@shikijs/core'; import { + type BundledLanguage, + type BundledTheme, createHighlighter, createOnigurumaEngine, loadWasm, - type BundledLanguage, - type BundledTheme, } from 'shiki'; -import type { BundledHighlighterOptions } from '@shikijs/core'; export async function createStreamingHighlighter( options: Omit< diff --git a/packages/diff-ui/src/index.ts b/packages/diff-ui/src/index.ts index eef6c0b0a..1d826b020 100644 --- a/packages/diff-ui/src/index.ts +++ b/packages/diff-ui/src/index.ts @@ -1,4 +1,5 @@ import './style.css'; + export * from './CodeRenderer'; export * from './DiffRenderer'; export * from './SharedHighlighter'; diff --git a/packages/diff-ui/src/utils/html_render_utils.ts b/packages/diff-ui/src/utils/html_render_utils.ts index 8d96427a7..3c44ff4f4 100644 --- a/packages/diff-ui/src/utils/html_render_utils.ts +++ b/packages/diff-ui/src/utils/html_render_utils.ts @@ -1,13 +1,14 @@ -import type { ThemesType } from '../types'; import { - getTokenStyleObject, - stringifyTokenStyle, - type ThemedToken, type BundledLanguage, type BundledTheme, type HighlighterGeneric, + type ThemedToken, + getTokenStyleObject, + stringifyTokenStyle, } from 'shiki'; +import type { ThemesType } from '../types'; + interface ThemeVariant { themes?: never; theme: BundledTheme; diff --git a/packages/docs/app/layout.tsx b/packages/docs/app/layout.tsx index 2e79b4a60..0c1bdeace 100644 --- a/packages/docs/app/layout.tsx +++ b/packages/docs/app/layout.tsx @@ -1,6 +1,7 @@ import { RootProvider } from 'fumadocs-ui/provider'; import type { Metadata } from 'next'; import { Geist, Geist_Mono } from 'next/font/google'; + import './globals.css'; const geistSans = Geist({ diff --git a/packages/shiki-stream/package.json b/packages/shiki-stream/package.json index 88c20d8df..e1fd67ab7 100644 --- a/packages/shiki-stream/package.json +++ b/packages/shiki-stream/package.json @@ -14,6 +14,7 @@ } }, "devDependencies": { + "@trivago/prettier-plugin-sort-imports": "catalog:", "typescript": "catalog:" }, "dependencies": { diff --git a/packages/shiki-stream/src/stream.ts b/packages/shiki-stream/src/stream.ts index 9815fb86f..d36f22f62 100644 --- a/packages/shiki-stream/src/stream.ts +++ b/packages/shiki-stream/src/stream.ts @@ -1,6 +1,7 @@ import type { ThemedToken } from '@shikijs/core'; -import type { CodeToTokenTransformStreamOptions, RecallToken } from './types'; + import { ShikiStreamTokenizer } from './tokenizer'; +import type { CodeToTokenTransformStreamOptions, RecallToken } from './types'; /** * Create a transform stream that takes code chunks and emits themed tokens. diff --git a/packages/shiki-stream/src/tokenizer.ts b/packages/shiki-stream/src/tokenizer.ts index 08013ca66..c101c20da 100644 --- a/packages/shiki-stream/src/tokenizer.ts +++ b/packages/shiki-stream/src/tokenizer.ts @@ -1,4 +1,5 @@ import type { GrammarState, ThemedToken } from '@shikijs/core'; + import type { ShikiStreamTokenizerEnqueueResult, ShikiStreamTokenizerOptions,