History

Fix editable file focus and live syntax highlighting (#3979)

Jake Leventhal committed 3 months ago

Commit fc28abf1 parent 85a89866 files · +131 −56Browse files

Unified · Split

6 files
  1. apps/web/src/components/files/FilePreviewPanel.tsx +13 −5
  2. apps/web/src/components/files/fileContentRevision.test.ts +28 −1
  3. apps/web/src/components/files/fileContentRevision.ts +18 −0
  4. patches/@pierre%2Fdiffs@1.3.0-beta.10.patch +38 −22
  5. pnpm-lock.yaml +32 −26
  6. pnpm-workspace.yaml +2 −2
apps/web/src/components/files/FilePreviewPanel.tsx+13−5
@@ -7,7 +7,7 @@ import type { · 6 unmodified lines
7import { isWorkspaceImagePreviewPath } from "@t3tools/shared/filePreview";7import { isWorkspaceImagePreviewPath } from "@t3tools/shared/filePreview";
8import { VirtualizedFile, type SelectedLineRange } from "@pierre/diffs";8import { VirtualizedFile, type SelectedLineRange } from "@pierre/diffs";
9import { Editor } from "@pierre/diffs/editor";9import { Editor } from "@pierre/diffs/editor";
10import { EditorProvider, File, type FileOptions, Virtualizer } from "@pierre/diffs/react";10import { EditProvider, File, type FileOptions, Virtualizer } from "@pierre/diffs/react";
11import {11import {
12 isAtomCommandInterrupted,12 isAtomCommandInterrupted,
13 squashAtomCommandFailure,13 squashAtomCommandFailure,
@@ -52,7 +52,7 @@ import { · 38 unmodified lines
52} from "./fileCommentAnnotations";52} from "./fileCommentAnnotations";
53import { installFileEditorDismissal } from "./fileEditorDismissal";53import { installFileEditorDismissal } from "./fileEditorDismissal";
54import { LocalCommentAnnotation } from "./LocalCommentAnnotation";54import { LocalCommentAnnotation } from "./LocalCommentAnnotation";
55import { projectFileCacheKey } from "./fileContentRevision";55import { projectFileCacheKey, projectFileEditorCacheKey } from "./fileContentRevision";
56import { fileBreadcrumbs } from "./filePath";56import { fileBreadcrumbs } from "./filePath";
57import { isMarkdownPreviewFile, setMarkdownTaskChecked } from "./filePreviewMode";57import { isMarkdownPreviewFile, setMarkdownTaskChecked } from "./filePreviewMode";
58import { FileSaveCoordinator } from "./fileSaveCoordinator";58import { FileSaveCoordinator } from "./fileSaveCoordinator";
@@ -364,6 +364,8 @@ function EditableFileSurface({ · 305 unmodified lines
364 const editor = useMemo(364 const editor = useMemo(
365 () =>365 () =>
366 new Editor<FileCommentAnnotationGroup>({366 new Editor<FileCommentAnnotationGroup>({
367 persistState: true,
368 persistStateStorage: "inMemory",
367 onChange: (file, nextLineAnnotations) => {369 onChange: (file, nextLineAnnotations) => {
368 setProjectFileQueryData(environmentId, cwd, relativePath, file.contents);370 setProjectFileQueryData(environmentId, cwd, relativePath, file.contents);
369 saveCoordinator.change(file.contents);371 saveCoordinator.change(file.contents);
@@ -536,7 +538,7 @@ function EditableFileSurface({ · 166 unmodified lines
536 );538 );
537 539
538 return (540 return (
539 <EditorProvider editor={editor}>541 <EditProvider editor={editor}>
540 <div ref={surfaceRef} className="flex min-h-0 flex-1">542 <div ref={surfaceRef} className="flex min-h-0 flex-1">
541 <Virtualizer543 <Virtualizer
542 className="file-preview-virtualizer min-h-0 flex-1 overflow-auto"544 className="file-preview-virtualizer min-h-0 flex-1 overflow-auto"
@@ -549,7 +551,13 @@ function EditableFileSurface({ · 6 unmodified lines
549 file={{551 file={{
550 name: relativePath,552 name: relativePath,
551 contents,553 contents,
552 cacheKey: projectFileCacheKey(cwd, relativePath, contents),554 cacheKey: projectFileEditorCacheKey(
555 environmentId,
556 cwd,
557 relativePath,
558 contents,
559 editor.getFile(),
560 ),
553 }}561 }}
554 options={{562 options={{
555 disableFileHeader: true,563 disableFileHeader: true,
@@ -586,7 +594,7 @@ function EditableFileSurface({ · 30 unmodified lines
586 />594 />
587 </Virtualizer>595 </Virtualizer>
588 </div>596 </div>
589 </EditorProvider>597 </EditProvider>
590 );598 );
591}599}
592 600
apps/web/src/components/files/fileContentRevision.test.ts+28−1
@@ -1,6 +1,10 @@
1import { describe, expect, it } from "vite-plus/test";1import { describe, expect, it } from "vite-plus/test";
2 2
3import { fileContentRevision, projectFileCacheKey } from "./fileContentRevision";3import {
4 fileContentRevision,
5 projectFileCacheKey,
6 projectFileEditorCacheKey,
7} from "./fileContentRevision";
4 8
5describe("fileContentRevision", () => {9describe("fileContentRevision", () => {
6 it("changes for same-length edits", () => {10 it("changes for same-length edits", () => {
@@ -12,4 +16,27 @@ describe("fileContentRevision", () => { · 5 unmodified lines
12 projectFileCacheKey("/repo", "file.json", "contents"),16 projectFileCacheKey("/repo", "file.json", "contents"),
13 );17 );
14 });18 });
19
20 it("keeps editor identity stable for locally edited contents", () => {
21 const cacheKey = projectFileEditorCacheKey("local", "/repo", "file.json", "after", undefined);
22
23 expect(
24 projectFileEditorCacheKey("local", "/repo", "file.json", "after edit", {
25 cacheKey,
26 contents: "after edit",
27 }),
28 ).toBe(cacheKey);
29 });
30
31 it("rotates editor identity for external contents and environments", () => {
32 const cacheKey = projectFileEditorCacheKey("local", "/repo", "file.json", "before", undefined);
33 const editorFile = { cacheKey, contents: "before" };
34
35 expect(
36 projectFileEditorCacheKey("local", "/repo", "file.json", "external edit", editorFile),
37 ).not.toBe(cacheKey);
38 expect(projectFileEditorCacheKey("remote", "/repo", "file.json", "before", undefined)).not.toBe(
39 cacheKey,
40 );
41 });
15});42});
apps/web/src/components/files/fileContentRevision.ts+18−0
@@ -10,3 +10,21 @@ export function fileContentRevision(contents: string): string { · 9 unmodified lines
10export function projectFileCacheKey(cwd: string, relativePath: string, contents: string): string {10export function projectFileCacheKey(cwd: string, relativePath: string, contents: string): string {
11 return `${cwd}:${relativePath}:${fileContentRevision(contents)}`;11 return `${cwd}:${relativePath}:${fileContentRevision(contents)}`;
12}12}
13
14interface EditorFileIdentity {
15 readonly cacheKey?: string;
16 readonly contents: string;
17}
18
19export function projectFileEditorCacheKey(
20 environmentId: string,
21 cwd: string,
22 relativePath: string,
23 contents: string,
24 editorFile: EditorFileIdentity | undefined,
25): string {
26 if (editorFile?.contents === contents && editorFile.cacheKey) {
27 return editorFile.cacheKey;
28 }
29 return `editor:${environmentId}:${projectFileCacheKey(cwd, relativePath, contents)}`;
30}
patches/@pierre%2Fdiffs@1.3.0-beta.10.patchrenamed from patches/@pierre%2Fdiffs@1.3.0-beta.5.patch+38−22
@@ -1,38 +1,54 @@
1diff --git a/dist/editor/editor.js b/dist/editor/editor.js1diff --git a/dist/editor/editor.js b/dist/editor/editor.js
2index e8013fc6eb6f243a6c912facf3fc0319ac66a8d0..80c82df4cdeb828bd331f5ec2f443d216bedc304 1006442index ff78e2a..f9df318 100644
3--- a/dist/editor/editor.js3--- a/dist/editor/editor.js
4+++ b/dist/editor/editor.js4+++ b/dist/editor/editor.js
5@@ -77,15 +77,12 @@ var Editor = class {5@@ -146,14 +146,11 @@ var Editor = class {
6 this.#options = options;6 const file = fileInstance.__getCurrentFile?.();
7 }7 if (file !== void 0) requirePersistedCacheKey(file);
8 edit(component) {8 }
9- const { useTokenTransformer, enableGutterUtility, enableLineSelection, expandUnchanged, diffStyle, lineHoverHighlight,...rest } = component.options;9- const { useTokenTransformer, enableGutterUtility, enableLineSelection, lineHoverHighlight = "disabled", ...rest } = fileInstance.options;
10+ const { useTokenTransformer, expandUnchanged, diffStyle,...rest } = component.options;10- if (useTokenTransformer !== true || enableGutterUtility === true || enableLineSelection === true || lineHoverHighlight !== "disabled") {
11 const isDiff = component.type === "file-diff";11+ const { useTokenTransformer, ...rest } = fileInstance.options;
12- if (useTokenTransformer !== true || enableGutterUtility === true || enableLineSelection === true || lineHoverHighlight !== "disabled" || expandUnchanged !== true && isDiff || diffStyle === "unified" && isDiff) {12+ if (useTokenTransformer !== true) {
13+ if (useTokenTransformer !== true || expandUnchanged !== true && isDiff || diffStyle === "unified" && isDiff) {13 fileInstance.setOptions({
14 component.setOptions({
15 ...rest,14 ...rest,
16 useTokenTransformer: true,15- useTokenTransformer: true,
17- enableGutterUtility: false,16- enableGutterUtility: false,
18- enableLineSelection: false,17- enableLineSelection: false,
19- lineHoverHighlight: "disabled",18- lineHoverHighlight: "disabled"
20 expandUnchanged: true,19+ useTokenTransformer: true
21 diffStyle: "split"
22 });20 });
23@@ -511,6 +508,7 @@ var Editor = class {21 fileInstance.rerender();
22 }
23@@ -908,6 +905,7 @@ var Editor = class {
24 return lineNumber - 1;24 return lineNumber - 1;
25 };25 };
26 this.#editorEventDisposes.push(addEventListener(gutterEl, "pointerdown", (e) => {26 this.#editorEventDisposes.push(addEventListener(gutterEl, "pointerdown", (e) => {
27+ if (this.#fileInstance?.options.enableLineSelection === true) return;27+ if (this.#fileInstance?.options.enableLineSelection === true) return;
28 const textDocument = this.#textDocument;28 const gutterRow = resolveGutterTarget(e.composedPath()[0]);
29 const lineIndex = resolveEditableLine(resolveGutterTarget(e.composedPath()[0]));29 if (gutterRow?.dataset.lineType === "change-deletion") {
30 if (lineIndex === void 0 || textDocument === void 0) return;30 const code = gutterRow.closest("[data-code]");
31@@ -1522,6 +1520,7 @@ var Editor = class {
32 if (gutterEl !== void 0) gutterEl.style.gridRow = "span " + gridRow;
33 }
34 fileInstance.updateRenderCache(dirtyLines, tokenizer.themeType, !didLineCountChange, didLineCountChange);
35+ if (fileInstance.file !== void 0) fileInstance.file.contents = textDocument.getText();
36 if (didLineCountChange) fileInstance.applyDocumentChange(textDocument, newLineAnnotations, shouldUpdateBuffer);
37 if (this.#isDiff && (this.#diffSyle === "unified" || didLineCountChange)) this.#resetCache();
38 if (newLineAnnotations !== void 0) {
39@@ -1788,6 +1787,7 @@ var Editor = class {
40 }
41 }
42 #setSelectedLinesSafe(range, lineNumberOnly = false) {
43+ if (this.#fileInstance?.options.controlledSelection === true) return;
44 try {
45 this.#fileInstance?.setSelectedLines(range, {
46 notify: false,
31diff --git a/dist/react/utils/useFileInstance.js b/dist/react/utils/useFileInstance.js47diff --git a/dist/react/utils/useFileInstance.js b/dist/react/utils/useFileInstance.js
32index cb8e2026fb5d7a19f489c0a2402efbcb7dff3322..510fad6364d4a2214c7dd65fe2b114f1cce0c815 10064448index e9f62f5..af82a46 100644
33--- a/dist/react/utils/useFileInstance.js49--- a/dist/react/utils/useFileInstance.js
34+++ b/dist/react/utils/useFileInstance.js50+++ b/dist/react/utils/useFileInstance.js
35@@ -92,10 +92,7 @@ function mergeFileOptions({ options, controlledSelection, contentEditable, hasCu51@@ -91,10 +91,7 @@ function mergeFileOptions({ options, controlledSelection, contentEditable, hasCu
36 };52 };
37 if (needsEditorOptions) merged = {53 if (needsEditorOptions) merged = {
38 ...merged,54 ...merged,
@@ -45,7 +61,7 @@ index cb8e2026fb5d7a19f489c0a2402efbcb7dff3322..510fad6364d4a2214c7dd65fe2b114f1 · 6 unmodified lines
45 return merged;61 return merged;
46 }62 }
47diff --git a/package.json b/package.json63diff --git a/package.json b/package.json
48index d1558633de87044b7aa96cff09443db11f163cec..c0b16f0a0bec6fba2026f24f38b2c0a8fa06af7c 10064464index ff61c90..1e170e5 100644
49--- a/package.json65--- a/package.json
50+++ b/package.json66+++ b/package.json
51@@ -55,6 +55,18 @@67@@ -55,6 +55,18 @@
pnpm-lock.yaml+32−26
@@ -19,8 +19,8 @@ catalogs: · 18 unmodified lines
19 specifier: 1.8.019 specifier: 1.8.0
20 version: 1.8.020 version: 1.8.0
21 '@pierre/diffs':21 '@pierre/diffs':
22 specifier: 1.3.0-beta.522 specifier: 1.3.0-beta.10
23 version: 1.3.0-beta.523 version: 1.3.0-beta.10
24 '@typescript/native-preview':24 '@typescript/native-preview':
25 specifier: 7.0.0-dev.20260604.125 specifier: 7.0.0-dev.20260604.1
26 version: 7.0.0-dev.20260604.126 version: 7.0.0-dev.20260604.1
@@ -75,7 +75,7 @@ patchedDependencies: · 48 unmodified lines
75 '@expo/metro-config@56.0.14': 8cb08b5bb7051ed9d2dbe46a2c293c5a1e17f1bd6ddf30de27909e18c921ff4675 '@expo/metro-config@56.0.14': 8cb08b5bb7051ed9d2dbe46a2c293c5a1e17f1bd6ddf30de27909e18c921ff46
76 '@ff-labs/fff-node@0.9.4': 2b16019ce7ab61aec6478dd02f79ef468cc1d5c51e9d00764f7d2ab8167210c876 '@ff-labs/fff-node@0.9.4': 2b16019ce7ab61aec6478dd02f79ef468cc1d5c51e9d00764f7d2ab8167210c8
77 '@legendapp/list@3.2.0': 9203ec3db86574a31e157a265cefd8997b259cc420a0c4c61c580c80ed8cf78d77 '@legendapp/list@3.2.0': 9203ec3db86574a31e157a265cefd8997b259cc420a0c4c61c580c80ed8cf78d
78 '@pierre/diffs@1.3.0-beta.5': 7cb6da88544119adda056b2f46f43956f99326227732da0b345081e285a6c53a78 '@pierre/diffs@1.3.0-beta.10': 7ef7cb0cbabb17c15cdb137554068b36f15f6f5265e73fb51452aa3380db91aa
79 '@react-native-menu/menu@2.0.0': 5ea3ae4bf1d9baf5443b65c269bb09621c27a68d556f713778f37b1e8d46aaae79 '@react-native-menu/menu@2.0.0': 5ea3ae4bf1d9baf5443b65c269bb09621c27a68d556f713778f37b1e8d46aaae
80 '@react-navigation/native-stack@7.17.6': c7fc101b78d434904425e5a24c22fb0042298dec6f807250486e784f3c71727380 '@react-navigation/native-stack@7.17.6': c7fc101b78d434904425e5a24c22fb0042298dec6f807250486e784f3c717273
81 effect@4.0.0-beta.102: 71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d48881 effect@4.0.0-beta.102: 71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488
@@ -222,7 +222,7 @@ importers: · 140 unmodified lines
222 version: 1.8.0222 version: 1.8.0
223 '@pierre/diffs':223 '@pierre/diffs':
224 specifier: 'catalog:'224 specifier: 'catalog:'
225 version: 1.3.0-beta.5(patch_hash=7cb6da88544119adda056b2f46f43956f99326227732da0b345081e285a6c53a)(@shikijs/themes@4.2.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)225 version: 1.3.0-beta.10(patch_hash=7ef7cb0cbabb17c15cdb137554068b36f15f6f5265e73fb51452aa3380db91aa)(@shikijs/themes@4.2.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
226 '@react-native-menu/menu':226 '@react-native-menu/menu':
227 specifier: ^2.0.0227 specifier: ^2.0.0
228 version: 2.0.0(patch_hash=5ea3ae4bf1d9baf5443b65c269bb09621c27a68d556f713778f37b1e8d46aaae)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)228 version: 2.0.0(patch_hash=5ea3ae4bf1d9baf5443b65c269bb09621c27a68d556f713778f37b1e8d46aaae)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
@@ -466,7 +466,7 @@ importers: · 237 unmodified lines
466 version: 1.15.13466 version: 1.15.13
467 '@pierre/diffs':467 '@pierre/diffs':
468 specifier: 'catalog:'468 specifier: 'catalog:'
469 version: 1.3.0-beta.5(patch_hash=7cb6da88544119adda056b2f46f43956f99326227732da0b345081e285a6c53a)(@shikijs/themes@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)469 version: 1.3.0-beta.10(patch_hash=7ef7cb0cbabb17c15cdb137554068b36f15f6f5265e73fb51452aa3380db91aa)(@shikijs/themes@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
470 effect:470 effect:
471 specifier: 4.0.0-beta.102471 specifier: 4.0.0-beta.102
472 version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)472 version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)
@@ -551,7 +551,7 @@ importers: · 78 unmodified lines
551 version: 0.41.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(yjs@13.6.31)551 version: 0.41.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(yjs@13.6.31)
552 '@pierre/diffs':552 '@pierre/diffs':
553 specifier: 'catalog:'553 specifier: 'catalog:'
554 version: 1.3.0-beta.5(patch_hash=7cb6da88544119adda056b2f46f43956f99326227732da0b345081e285a6c53a)(@shikijs/themes@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)554 version: 1.3.0-beta.10(patch_hash=7ef7cb0cbabb17c15cdb137554068b36f15f6f5265e73fb51452aa3380db91aa)(@shikijs/themes@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
555 '@pierre/trees':555 '@pierre/trees':
556 specifier: 1.0.0-beta.4556 specifier: 1.0.0-beta.4
557 version: 1.0.0-beta.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6)557 version: 1.0.0-beta.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
@@ -3584,20 +3584,20 @@ packages: · 3026 unmodified lines
3584 resolution: {integrity: sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ==}3584 resolution: {integrity: sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ==}
3585 engines: {node: '>=14.18.0'}3585 engines: {node: '>=14.18.0'}
3586 3586
3587 '@pierre/diffs@1.3.0-beta.5':3587 '@pierre/diffs@1.3.0-beta.10':
3588 resolution: {integrity: sha512-d7449IY6Phcg9LCRLbPxhsxn6Bv4KoaP/vPyZtGu2uR1SFsSJPQcRoPf8lzyobNGKD0GZGuhgHW5LrOlilFo7w==}3588 resolution: {integrity: sha512-efyFM9GRfI6WkmHJP0CnZBopuM8yCwGqIKbZHoe1D5PV15VDkr7Vpi8EZt40AYrN1km//utQtYhHDSwt2KwjSg==}
3589 peerDependencies:3589 peerDependencies:
3590 react: ^18.3.1 || ^19.0.03590 react: ^18.3.1 || ^19.0.0
3591 react-dom: ^18.3.1 || ^19.0.03591 react-dom: ^18.3.1 || ^19.0.0
3592 3592
3593 '@pierre/theme@1.0.3':3593 '@pierre/theme@1.1.0':
3594 resolution: {integrity: sha512-sWHv11TMoqKxKDgTIk5VbhQjdPhs8DCcBxbjh3mRlS3YOM/OcrWoGX6MM8eBGn9cUu3M46Py0JnxsG2nJaFTuA==}3594 resolution: {integrity: sha512-GC2OWTAfTIIWWYhPCygwG8t2EtePQkRfON4MI2rwIkJylmiyqIttJID2dCL8sUD8cNdEvYkEyfEHHKMeCiDLoQ==}
3595 engines: {vscode: ^1.0.0}3595 engines: {vscode: ^1.0.0}
3596 3596
3597 '@pierre/theming@0.0.1':3597 '@pierre/theming@0.0.2':
3598 resolution: {integrity: sha512-1thlEtJbqdyLzc1ZS2KQa1q7FzDGHT4dTEdKHoyQjOMeWWOmbVG5/ndEfOKfAb5Fzkz8cNJrOjFLiZoDH/A03A==}3598 resolution: {integrity: sha512-QM1M4stXfnzfaE8I8YbjXSApV8c+2dBsXJj8eYg9WTpBR/cTmCZIcfGnN4p13iRrYu2Br/R/OJfEL7uR8Qjctw==}
3599 peerDependencies:3599 peerDependencies:
3600 '@pierre/theme': ^1.0.03600 '@pierre/theme': ^1.1.0
3601 '@shikijs/themes': ^3.0.0 || ^4.0.03601 '@shikijs/themes': ^3.0.0 || ^4.0.0
3602 react: ^18.3.1 || ^19.0.03602 react: ^18.3.1 || ^19.0.0
3603 react-dom: ^18.3.1 || ^19.0.03603 react-dom: ^18.3.1 || ^19.0.0
@@ -6104,6 +6104,10 @@ packages: · 2500 unmodified lines
6104 resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==}6104 resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==}
6105 engines: {node: '>=0.3.1'}6105 engines: {node: '>=0.3.1'}
6106 6106
6107 diff@9.0.0:
6108 resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==}
6109 engines: {node: '>=0.3.1'}
6110
6107 dir-compare@4.2.0:6111 dir-compare@4.2.0:
6108 resolution: {integrity: sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==}6112 resolution: {integrity: sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==}
6109 6113
@@ -13569,12 +13573,12 @@ snapshots: · 7459 unmodified lines
13569 tslib: 2.8.113573 tslib: 2.8.1
13570 webcrypto-core: 1.9.213574 webcrypto-core: 1.9.2
13571 13575
13572 '@pierre/diffs@1.3.0-beta.5(patch_hash=7cb6da88544119adda056b2f46f43956f99326227732da0b345081e285a6c53a)(@shikijs/themes@4.2.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':13576 '@pierre/diffs@1.3.0-beta.10(patch_hash=7ef7cb0cbabb17c15cdb137554068b36f15f6f5265e73fb51452aa3380db91aa)(@shikijs/themes@4.2.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
13573 dependencies:13577 dependencies:
13574 '@pierre/theme': 1.0.313578 '@pierre/theme': 1.1.0
13575 '@pierre/theming': 0.0.1(@pierre/theme@1.0.3)(@shikijs/themes@4.2.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(shiki@4.2.0)13579 '@pierre/theming': 0.0.2(@pierre/theme@1.1.0)(@shikijs/themes@4.2.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(shiki@4.2.0)
13576 '@shikijs/transformers': 4.2.013580 '@shikijs/transformers': 4.2.0
13577 diff: 8.0.313581 diff: 9.0.0
13578 hast-util-to-html: 9.0.513582 hast-util-to-html: 9.0.5
13579 lru_map: 0.4.113583 lru_map: 0.4.1
13580 react: 19.2.313584 react: 19.2.3
@@ -13583,12 +13587,12 @@ snapshots: · 2 unmodified lines
13583 transitivePeerDependencies:13587 transitivePeerDependencies:
13584 - '@shikijs/themes'13588 - '@shikijs/themes'
13585 13589
13586 '@pierre/diffs@1.3.0-beta.5(patch_hash=7cb6da88544119adda056b2f46f43956f99326227732da0b345081e285a6c53a)(@shikijs/themes@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':13590 '@pierre/diffs@1.3.0-beta.10(patch_hash=7ef7cb0cbabb17c15cdb137554068b36f15f6f5265e73fb51452aa3380db91aa)(@shikijs/themes@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
13587 dependencies:13591 dependencies:
13588 '@pierre/theme': 1.0.313592 '@pierre/theme': 1.1.0
13589 '@pierre/theming': 0.0.1(@pierre/theme@1.0.3)(@shikijs/themes@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(shiki@4.2.0)13593 '@pierre/theming': 0.0.2(@pierre/theme@1.1.0)(@shikijs/themes@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(shiki@4.2.0)
13590 '@shikijs/transformers': 4.2.013594 '@shikijs/transformers': 4.2.0
13591 diff: 8.0.313595 diff: 9.0.0
13592 hast-util-to-html: 9.0.513596 hast-util-to-html: 9.0.5
13593 lru_map: 0.4.113597 lru_map: 0.4.1
13594 react: 19.2.613598 react: 19.2.6
@@ -13597,19 +13601,19 @@ snapshots: · 2 unmodified lines
13597 transitivePeerDependencies:13601 transitivePeerDependencies:
13598 - '@shikijs/themes'13602 - '@shikijs/themes'
13599 13603
13600 '@pierre/theme@1.0.3': {}13604 '@pierre/theme@1.1.0': {}
13601 13605
13602 '@pierre/theming@0.0.1(@pierre/theme@1.0.3)(@shikijs/themes@4.2.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(shiki@4.2.0)':13606 '@pierre/theming@0.0.2(@pierre/theme@1.1.0)(@shikijs/themes@4.2.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(shiki@4.2.0)':
13603 optionalDependencies:13607 optionalDependencies:
13604 '@pierre/theme': 1.0.313608 '@pierre/theme': 1.1.0
13605 '@shikijs/themes': 4.2.013609 '@shikijs/themes': 4.2.0
13606 react: 19.2.313610 react: 19.2.3
13607 react-dom: 19.2.3(react@19.2.3)13611 react-dom: 19.2.3(react@19.2.3)
13608 shiki: 4.2.013612 shiki: 4.2.0
13609 13613
13610 '@pierre/theming@0.0.1(@pierre/theme@1.0.3)(@shikijs/themes@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(shiki@4.2.0)':13614 '@pierre/theming@0.0.2(@pierre/theme@1.1.0)(@shikijs/themes@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(shiki@4.2.0)':
13611 optionalDependencies:13615 optionalDependencies:
13612 '@pierre/theme': 1.0.313616 '@pierre/theme': 1.1.0
13613 '@shikijs/themes': 4.3.013617 '@shikijs/themes': 4.3.0
13614 react: 19.2.613618 react: 19.2.6
13615 react-dom: 19.2.6(react@19.2.6)13619 react-dom: 19.2.6(react@19.2.6)
@@ -16379,6 +16383,8 @@ snapshots: · 2763 unmodified lines
16379 16383
16380 diff@8.0.3: {}16384 diff@8.0.3: {}
16381 16385
16386 diff@9.0.0: {}
16387
16382 dir-compare@4.2.0:16388 dir-compare@4.2.0:
16383 dependencies:16389 dependencies:
16384 minimatch: 3.1.516390 minimatch: 3.1.5
pnpm-workspace.yaml+2−2
@@ -41,7 +41,7 @@ catalog: · 40 unmodified lines
41 "@effect/vitest": 4.0.0-beta.10241 "@effect/vitest": 4.0.0-beta.102
42 "@noble/curves": 1.9.142 "@noble/curves": 1.9.1
43 "@noble/hashes": 1.8.043 "@noble/hashes": 1.8.0
44 "@pierre/diffs": 1.3.0-beta.544 "@pierre/diffs": 1.3.0-beta.10
45 "@types/node": 24.12.445 "@types/node": 24.12.4
46 "@typescript/native-preview": 7.0.0-dev.20260604.146 "@typescript/native-preview": 7.0.0-dev.20260604.1
47 effect: 4.0.0-beta.10247 effect: 4.0.0-beta.102
@@ -128,7 +128,7 @@ patchedDependencies: · 80 unmodified lines
128 "@expo/metro-config@56.0.14": patches/@expo%2Fmetro-config@56.0.14.patch128 "@expo/metro-config@56.0.14": patches/@expo%2Fmetro-config@56.0.14.patch
129 "@ff-labs/fff-node@0.9.4": patches/@ff-labs__fff-node@0.9.4.patch129 "@ff-labs/fff-node@0.9.4": patches/@ff-labs__fff-node@0.9.4.patch
130 "@legendapp/list@3.2.0": patches/@legendapp__list@3.2.0.patch130 "@legendapp/list@3.2.0": patches/@legendapp__list@3.2.0.patch
131 "@pierre/diffs@1.3.0-beta.5": patches/@pierre%2Fdiffs@1.3.0-beta.5.patch131 "@pierre/diffs@1.3.0-beta.10": patches/@pierre%2Fdiffs@1.3.0-beta.10.patch
132 "@react-native-menu/menu@2.0.0": patches/@react-native-menu__menu@2.0.0.patch132 "@react-native-menu/menu@2.0.0": patches/@react-native-menu__menu@2.0.0.patch
133 "@react-navigation/native-stack@7.17.6": patches/@react-navigation%2Fnative-stack@7.17.6.patch133 "@react-navigation/native-stack@7.17.6": patches/@react-navigation%2Fnative-stack@7.17.6.patch
134 effect@4.0.0-beta.102: patches/effect@4.0.0-beta.102.patch134 effect@4.0.0-beta.102: patches/effect@4.0.0-beta.102.patch