Radish alpha
r
rad:z4D5UCArafTzTQpDZNQRuqswh3ury
Radicle desktop app
Radicle
Git
Add eslint-plugin-simple-import-sort to sort and group imports
Sebastian Martinez committed 10 months ago
commit 2f801b9940eca81711c97204c6eeec0dcec6ac7b
parent f69c907
110 files changed +479 -429
modified eslint.config.js
@@ -2,6 +2,7 @@ import globals from "globals";
import js from "@eslint/js";
import prettier from "eslint-config-prettier";
import svelte from "eslint-plugin-svelte";
+
import simpleImportSort from "eslint-plugin-simple-import-sort";
import svelteParser from "svelte-eslint-parser";
import ts from "typescript-eslint";

@@ -11,6 +12,9 @@ export default [
    ...ts.configs.recommended,
    prettier,
    {
+
      plugins: {
+
        "simple-import-sort": simpleImportSort,
+
      },
      languageOptions: {
        parser: ts.parser,
        parserOptions: {
@@ -45,6 +49,27 @@ export default [
        // Require let or const instead of var.
        // https://eslint.org/docs/rules/no-var
        "no-var": "warn",
+
        "simple-import-sort/imports": [
+
          "warn",
+
          {
+
            groups: [
+
              // Type imports
+
              ["\\u0000$"],
+
              // Node.js built-in modules
+
              ["^node:"],
+
              // Everything not matched, aka third party packages
+
              ["^"],
+
              // Files under @app and @lib without an extension
+
              ["^(@app\/lib).*(\.svelte$|\.ts$|\.js$){0}"],
+
              // Files under @app and @lib ending in .svelte or svelte.ts
+
              ["^(@app\/lib).*(\.svelte$)"],
+
              // Svelte components imported through @app
+
              ["^(@app).*(\.svelte$)"],
+
              // Everything else imported through relative imports
+
              ["^\\."],
+
            ],
+
          },
+
        ],
        // Require `===` and `!==` comparisons.
        eqeqeq: "warn",
        "@typescript-eslint/no-floating-promises": "warn",
modified package-lock.json
@@ -42,6 +42,7 @@
        "dompurify": "^3.2.5",
        "eslint": "^9.26.0",
        "eslint-config-prettier": "^10.1.5",
+
        "eslint-plugin-simple-import-sort": "^12.1.1",
        "eslint-plugin-svelte": "^3.5.1",
        "execa": "^9.5.3",
        "fuzzysort": "^3.1.0",
@@ -2319,10 +2320,11 @@
      }
    },
    "node_modules/debug": {
-
      "version": "4.4.0",
-
      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
-
      "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+
      "version": "4.4.1",
+
      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
+
      "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
      "dev": true,
+
      "license": "MIT",
      "dependencies": {
        "ms": "^2.1.3"
      },
@@ -2601,6 +2603,16 @@
        "eslint": ">=7.0.0"
      }
    },
+
    "node_modules/eslint-plugin-simple-import-sort": {
+
      "version": "12.1.1",
+
      "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.1.tgz",
+
      "integrity": "sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==",
+
      "dev": true,
+
      "license": "MIT",
+
      "peerDependencies": {
+
        "eslint": ">=5.0.0"
+
      }
+
    },
    "node_modules/eslint-plugin-svelte": {
      "version": "3.5.1",
      "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-3.5.1.tgz",
@@ -5051,10 +5063,11 @@
      "dev": true
    },
    "node_modules/tinyglobby": {
-
      "version": "0.2.13",
-
      "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz",
-
      "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==",
+
      "version": "0.2.14",
+
      "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",
+
      "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==",
      "dev": true,
+
      "license": "MIT",
      "dependencies": {
        "fdir": "^6.4.4",
        "picomatch": "^4.0.2"
modified package.json
@@ -16,7 +16,7 @@
    "check-rs": "scripts/check-rs",
    "test:unit": "TZ='UTC' vitest run",
    "test:e2e": "TZ='UTC' playwright test",
-
    "format": "npx prettier '**/*.@(ts|js|svelte|json|css|html|yml)' --write",
+
    "format": "npx prettier '**/*.@(ts|js|svelte|json|css|html|yml)' '!crates/**/*' --write",
    "generate-types": "cargo test --manifest-path ./crates/radicle-types/Cargo.toml",
    "tauri": "npx tauri"
  },
@@ -57,6 +57,7 @@
    "dompurify": "^3.2.5",
    "eslint": "^9.26.0",
    "eslint-config-prettier": "^10.1.5",
+
    "eslint-plugin-simple-import-sort": "^12.1.1",
    "eslint-plugin-svelte": "^3.5.1",
    "execa": "^9.5.3",
    "fuzzysort": "^3.1.0",
modified playwright.config.ts
@@ -1,4 +1,5 @@
import type { PlaywrightTestConfig } from "@playwright/test";
+

import { devices } from "@playwright/test";

const config: PlaywrightTestConfig = {
modified src/App.svelte
@@ -1,42 +1,43 @@
<script lang="ts">
-
  import type { ErrorWrapper } from "@bindings/error/ErrorWrapper";
  import type { Config } from "@bindings/config/Config";
+
  import type { ErrorWrapper } from "@bindings/error/ErrorWrapper";

-
  import delay from "lodash/delay";
  import { listen } from "@tauri-apps/api/event";
+
  import delay from "lodash/delay";
  import { onDestroy, onMount } from "svelte";

-
  import * as router from "@app/lib/router";
-
  import { checkAuth, startup } from "@app/lib/auth.svelte";
-
  import { dynamicInterval } from "@app/lib/interval";
-
  import { invoke } from "@app/lib/invoke";
-
  import { nodeRunning } from "@app/lib/events";
  import {
-
    resetFontSize,
-
    increaseFontSize,
    decreaseFontSize,
    fontSettings,
+
    increaseFontSize,
+
    resetFontSize,
  } from "@app/lib/appearance.svelte";
+
  import { checkAuth, startup } from "@app/lib/auth.svelte";
+
  import { nodeRunning } from "@app/lib/events";
+
  import { dynamicInterval } from "@app/lib/interval";
+
  import { invoke } from "@app/lib/invoke";
+
  import * as router from "@app/lib/router";
  import {
    setUnlistenNodeEvents,
    unlistenNodeEvents,
  } from "@app/lib/startup.svelte";
-
  import { theme } from "@app/components/ThemeSwitch.svelte";
-
  import { unreachable, isMac } from "@app/lib/utils";
+
  import { isMac, unreachable } from "@app/lib/utils";

+
  import { theme } from "@app/components/ThemeSwitch.svelte";
  import Auth from "@app/views/booting/Auth.svelte";
  import CreateIdentity from "@app/views/booting/CreateIdentity.svelte";
+
  import Repos from "@app/views/home/Repos.svelte";
  import CreateIssue from "@app/views/repo/CreateIssue.svelte";
  import Issue from "@app/views/repo/Issue.svelte";
  import Issues from "@app/views/repo/Issues.svelte";
  import Patch from "@app/views/repo/Patch.svelte";
  import Patches from "@app/views/repo/Patches.svelte";
  import RepoHome from "@app/views/repo/RepoHome.svelte";
-
  import Repos from "@app/views/home/Repos.svelte";
-
  import Spinner from "./components/Spinner.svelte";
-
  import FullWindowError from "./components/FullWindowError.svelte";
-
  import ExternalLink from "./components/ExternalLink.svelte";
+

  import Command from "./components/Command.svelte";
+
  import ExternalLink from "./components/ExternalLink.svelte";
+
  import FullWindowError from "./components/FullWindowError.svelte";
+
  import Spinner from "./components/Spinner.svelte";

  const activeRouteStore = router.activeRouteStore;

modified src/components/AddRepoButton.svelte
@@ -7,21 +7,21 @@

  import { z } from "zod";

-
  import useLocalStorage from "@app/lib/useLocalStorage.svelte";
-
  import { announce } from "@app/components/AnnounceSwitch.svelte";
-
  import { closeFocused } from "./Popover.svelte";
-
  import { invoke } from "@app/lib/invoke";
  import { nodeRunning } from "@app/lib/events";
+
  import { invoke } from "@app/lib/invoke";
+
  import useLocalStorage from "@app/lib/useLocalStorage.svelte";
  import { parseRepositoryId, twemoji } from "@app/lib/utils";

-
  import Border from "./Border.svelte";
-
  import Button from "./Button.svelte";
-
  import Command from "./Command.svelte";
-
  import ExternalLink from "./ExternalLink.svelte";
-
  import Icon from "./Icon.svelte";
-
  import Popover from "./Popover.svelte";
-
  import Tab from "./Tab.svelte";
-
  import TextInput from "./TextInput.svelte";
+
  import { announce } from "@app/components/AnnounceSwitch.svelte";
+
  import Border from "@app/components/Border.svelte";
+
  import Button from "@app/components/Button.svelte";
+
  import Command from "@app/components/Command.svelte";
+
  import ExternalLink from "@app/components/ExternalLink.svelte";
+
  import Icon from "@app/components/Icon.svelte";
+
  import { closeFocused } from "@app/components/Popover.svelte";
+
  import Popover from "@app/components/Popover.svelte";
+
  import Tab from "@app/components/Tab.svelte";
+
  import TextInput from "@app/components/TextInput.svelte";

  interface Props {
    onOpen: () => void;
modified src/components/AnnounceSwitch.svelte
@@ -27,7 +27,8 @@

<script lang="ts">
  import { writable } from "svelte/store";
-
  import Button from "./Button.svelte";
+

+
  import Button from "@app/components/Button.svelte";
</script>

<style>
modified src/components/AssigneeInput.svelte
@@ -1,12 +1,12 @@
<script lang="ts">
  import type { Author } from "@bindings/cob/Author";

+
  import { invoke } from "@app/lib/invoke";
  import {
    authorForNodeId,
    parseNodeId,
    publicKeyFromDid,
  } from "@app/lib/utils";
-
  import { invoke } from "@app/lib/invoke";

  import Icon from "@app/components/Icon.svelte";
  import NodeId from "@app/components/NodeId.svelte";
modified src/components/Changes.svelte
@@ -1,15 +1,15 @@
<script lang="ts">
-
  import type { CodeComments } from "./Diff.svelte";
+
  import type { CodeComments } from "@app/components/Diff.svelte";
  import type { Revision } from "@bindings/cob/patch/Revision";

  import { cachedGetDiff, cachedListCommits } from "@app/lib/invoke";
  import { pluralize } from "@app/lib/utils";

  import Changeset from "@app/components/Changeset.svelte";
-
  import CobCommitTeaser from "./CobCommitTeaser.svelte";
+
  import CobCommitTeaser from "@app/components/CobCommitTeaser.svelte";
  import CommitsContainer from "@app/components/CommitsContainer.svelte";
  import Icon from "@app/components/Icon.svelte";
-
  import Id from "./Id.svelte";
+
  import Id from "@app/components/Id.svelte";
  import NakedButton from "@app/components/NakedButton.svelte";

  interface Props {
modified src/components/Changeset.svelte
@@ -1,8 +1,8 @@
<script lang="ts">
+
  import type { CodeComments } from "@app/components/Diff.svelte";
  import type { Diff } from "@bindings/diff/Diff";
-
  import type { CodeComments } from "./Diff.svelte";

-
  import FileDiffComponent from "./FileDiff.svelte";
+
  import FileDiffComponent from "@app/components/FileDiff.svelte";

  interface Props {
    codeComments?: CodeComments;
modified src/components/Clipboard.svelte
@@ -3,9 +3,10 @@
<script lang="ts">
  import debounce from "lodash/debounce";

-
  import Icon from "@app/components/Icon.svelte";
  import { writeToClipboard } from "@app/lib/invoke";

+
  import Icon from "@app/components/Icon.svelte";
+

  interface Props {
    text: string;
  }
modified src/components/Command.svelte
@@ -1,6 +1,6 @@
<script lang="ts">
+
  import Border from "@app/components/Border.svelte";
  import Clipboard from "@app/components/Clipboard.svelte";
-
  import Border from "./Border.svelte";

  interface Props {
    command: string;
modified src/components/Comment.svelte
@@ -1,13 +1,12 @@
<script lang="ts">
-
  import type { Snippet } from "svelte";
  import type { Author } from "@bindings/cob/Author";
  import type { Edit } from "@bindings/cob/patch/Edit";
  import type { Reaction } from "@bindings/cob/Reaction";
  import type { Embed } from "@bindings/cob/thread/Embed";
+
  import type { Snippet } from "svelte";

  import { tick } from "svelte";

-
  import { closeFocused } from "./Popover.svelte";
  import * as utils from "@app/lib/utils";

  import ExtendedTextarea from "@app/components/ExtendedTextarea.svelte";
@@ -15,8 +14,9 @@
  import Id from "@app/components/Id.svelte";
  import Markdown from "@app/components/Markdown.svelte";
  import NodeId from "@app/components/NodeId.svelte";
-
  import ReactionSelector from "@app/components/ReactionSelector.svelte";
+
  import { closeFocused } from "@app/components/Popover.svelte";
  import Reactions from "@app/components/Reactions.svelte";
+
  import ReactionSelector from "@app/components/ReactionSelector.svelte";

  interface Props {
    actions?: Snippet;
modified src/components/CommentToggleInput.svelte
@@ -1,8 +1,8 @@
<script lang="ts">
  import type { Embed } from "@bindings/cob/thread/Embed";

+
  import Border from "@app/components/Border.svelte";
  import ExtendedTextarea from "@app/components/ExtendedTextarea.svelte";
-
  import Border from "./Border.svelte";

  interface Props {
    rid: string;
modified src/components/CommitsContainer.svelte
@@ -1,9 +1,9 @@
<script lang="ts">
  import type { Snippet } from "svelte";

-
  import Border from "./Border.svelte";
-
  import Icon from "./Icon.svelte";
-
  import NakedButton from "./NakedButton.svelte";
+
  import Border from "@app/components/Border.svelte";
+
  import Icon from "@app/components/Icon.svelte";
+
  import NakedButton from "@app/components/NakedButton.svelte";

  interface Props {
    leftHeader: Snippet;
modified src/components/CompactCommitAuthorship.svelte
@@ -3,7 +3,8 @@
  import type { Snippet } from "svelte";

  import * as utils from "@app/lib/utils";
-
  import HoverPopover from "./HoverPopover.svelte";
+

+
  import HoverPopover from "@app/components/HoverPopover.svelte";

  interface Props {
    children: Snippet;
modified src/components/ConfirmClear.svelte
@@ -1,8 +1,8 @@
<script lang="ts">
-
  import Button from "./Button.svelte";
+
  import Button from "@app/components/Button.svelte";
  import Icon from "@app/components/Icon.svelte";
  import NakedButton from "@app/components/NakedButton.svelte";
-
  import OutlineButton from "./OutlineButton.svelte";
+
  import OutlineButton from "@app/components/OutlineButton.svelte";

  interface Props {
    clear: () => void;
modified src/components/CopyableId.svelte
@@ -1,7 +1,7 @@
<script lang="ts">
  import type { Snippet } from "svelte";

-
  import Clipboard from "./Clipboard.svelte";
+
  import Clipboard from "@app/components/Clipboard.svelte";

  const {
    inline = false,
modified src/components/Diff.svelte
@@ -48,18 +48,18 @@

  import type { Author } from "@bindings/cob/Author";
  import type { CodeLocation } from "@bindings/cob/thread/CodeLocation";
-
  import type { Config } from "@bindings/config/Config";
  import type { Embed } from "@bindings/cob/thread/Embed";
+
  import type { Thread } from "@bindings/cob/thread/Thread";
+
  import type { Config } from "@bindings/config/Config";
  import type { FileDiff } from "@bindings/diff/FileDiff";
  import type { Modification } from "@bindings/diff/Modification";
-
  import type { Thread } from "@bindings/cob/thread/Thread";
-

-
  import * as roles from "@app/lib/roles";

  import escape from "lodash/escape";
  import partial from "lodash/partial";

-
  import CommentToggleInput from "./CommentToggleInput.svelte";
+
  import * as roles from "@app/lib/roles";
+

+
  import CommentToggleInput from "@app/components/CommentToggleInput.svelte";
  import Icon from "@app/components/Icon.svelte";
  import ThreadComponent from "@app/components/Thread.svelte";

modified src/components/Discussion.svelte
@@ -1,8 +1,8 @@
<script lang="ts">
  import type { Author } from "@bindings/cob/Author";
-
  import type { Config } from "@bindings/config/Config";
  import type { Embed } from "@bindings/cob/thread/Embed";
  import type { Thread } from "@bindings/cob/thread/Thread";
+
  import type { Config } from "@bindings/config/Config";

  import partial from "lodash/partial";
  import sum from "lodash/sum";
@@ -13,7 +13,7 @@

  import CommentToggleInput from "@app/components/CommentToggleInput.svelte";
  import Icon from "@app/components/Icon.svelte";
-
  import NakedButton from "./NakedButton.svelte";
+
  import NakedButton from "@app/components/NakedButton.svelte";
  import ThreadComponent from "@app/components/Thread.svelte";

  interface Props {
modified src/components/ExtendedTextarea.svelte
@@ -1,22 +1,21 @@
<script lang="ts">
+
  import type { Embed } from "@bindings/cob/thread/Embed";
  import type { UnlistenFn } from "@tauri-apps/api/event";
  import type { ComponentProps } from "svelte";
-
  import type { Embed } from "@bindings/cob/thread/Embed";

+
  import { listen } from "@tauri-apps/api/event";
+
  import { open } from "@tauri-apps/plugin-dialog";
  import debounce from "lodash/debounce";
-

-
  import * as utils from "@app/lib/utils";
+
  import { onDestroy, onMount } from "svelte";

  import { invoke } from "@app/lib/invoke";
-
  import { listen } from "@tauri-apps/api/event";
-
  import { onDestroy, onMount } from "svelte";
-
  import { open } from "@tauri-apps/plugin-dialog";
+
  import * as utils from "@app/lib/utils";

-
  import Button from "./Button.svelte";
-
  import Icon from "./Icon.svelte";
-
  import Markdown from "./Markdown.svelte";
-
  import Textarea from "./Textarea.svelte";
-
  import OutlineButton from "./OutlineButton.svelte";
+
  import Button from "@app/components/Button.svelte";
+
  import Icon from "@app/components/Icon.svelte";
+
  import Markdown from "@app/components/Markdown.svelte";
+
  import OutlineButton from "@app/components/OutlineButton.svelte";
+
  import Textarea from "@app/components/Textarea.svelte";

  interface Props {
    textAreaSize?: ComponentProps<typeof Textarea>["size"];
modified src/components/ExternalLink.svelte
@@ -1,7 +1,7 @@
<script lang="ts">
  import type { Snippet } from "svelte";

-
  import Icon from "./Icon.svelte";
+
  import Icon from "@app/components/Icon.svelte";

  const { href, children }: { href: string; children?: Snippet } = $props();
</script>
modified src/components/File.svelte
@@ -3,8 +3,8 @@

  import { tick } from "svelte";

-
  import Icon from "./Icon.svelte";
-
  import NakedButton from "./NakedButton.svelte";
+
  import Icon from "@app/components/Icon.svelte";
+
  import NakedButton from "@app/components/NakedButton.svelte";

  interface Props {
    children: Snippet;
modified src/components/FileDiff.svelte
@@ -1,6 +1,6 @@
<script lang="ts">
+
  import type { CodeComments } from "@app/components/Diff.svelte";
  import type { FileDiff } from "@bindings/diff/FileDiff";
-
  import type { CodeComments } from "./Diff.svelte";

  import Diff from "@app/components/Diff.svelte";
  import File from "@app/components/File.svelte";
modified src/components/FontSizeSwitch.svelte
@@ -5,8 +5,8 @@
    increaseFontSize,
  } from "@app/lib/appearance.svelte";

-
  import Button from "./Button.svelte";
-
  import Icon from "./Icon.svelte";
+
  import Button from "@app/components/Button.svelte";
+
  import Icon from "@app/components/Icon.svelte";
</script>

<style>
modified src/components/FullWindowError.svelte
@@ -1,11 +1,11 @@
<script lang="ts">
-
  import type { Snippet } from "svelte";
  import type { ErrorWrapper } from "@bindings/error/ErrorWrapper";
+
  import type { Snippet } from "svelte";

-
  import ExternalLink from "./ExternalLink.svelte";
-
  import Border from "./Border.svelte";
-
  import Icon from "./Icon.svelte";
-
  import Command from "./Command.svelte";
+
  import Border from "@app/components/Border.svelte";
+
  import Command from "@app/components/Command.svelte";
+
  import ExternalLink from "@app/components/ExternalLink.svelte";
+
  import Icon from "@app/components/Icon.svelte";

  const {
    title = "An error occurred",
modified src/components/GuideButton.svelte
@@ -5,14 +5,13 @@
<script lang="ts">
  import type { Config } from "@bindings/config/Config";

-
  import { activeRouteStore, push } from "@app/lib/router";
-
  import { settingsPopoverToggleId } from "./Settings.svelte";
-
  import { addRepoPopoverToggleId } from "./AddRepoButton.svelte";
-
  import { didFromPublicKey, truncateDid } from "@app/lib/utils";
-
  import { nodeRunning } from "@app/lib/events";
  import { radicleInstalled } from "@app/lib/checkRadicleCLI.svelte";
+
  import { nodeRunning } from "@app/lib/events";
+
  import { activeRouteStore, push } from "@app/lib/router";
  import { sleep } from "@app/lib/sleep";
+
  import { didFromPublicKey, truncateDid } from "@app/lib/utils";

+
  import { addRepoPopoverToggleId } from "@app/components/AddRepoButton.svelte";
  import Border from "@app/components/Border.svelte";
  import Command from "@app/components/Command.svelte";
  import CopyableId from "@app/components/CopyableId.svelte";
@@ -20,6 +19,7 @@
  import NakedButton from "@app/components/NakedButton.svelte";
  import NodeId from "@app/components/NodeId.svelte";
  import Popover from "@app/components/Popover.svelte";
+
  import { settingsPopoverToggleId } from "@app/components/Settings.svelte";

  interface Props {
    config: Config;
modified src/components/Header.svelte
@@ -2,20 +2,19 @@
  import type { Config } from "@bindings/config/Config";
  import type { Snippet } from "svelte";

-
  import { boolean } from "zod";
  import { onMount } from "svelte";
-

-
  import useLocalStorage from "@app/lib/useLocalStorage.svelte";
+
  import { boolean } from "zod";

  import { checkRadicleCLI } from "@app/lib/checkRadicleCLI.svelte";
  import { dynamicInterval } from "@app/lib/interval";
  import { sleep } from "@app/lib/sleep";
+
  import useLocalStorage from "@app/lib/useLocalStorage.svelte";

-
  import Icon from "@app/components/Icon.svelte";
-
  import InboxButton from "@app/components/InboxButton.svelte";
  import GuideButton, {
    guidePopoverToggleId,
  } from "@app/components/GuideButton.svelte";
+
  import Icon from "@app/components/Icon.svelte";
+
  import InboxButton from "@app/components/InboxButton.svelte";
  import NakedButton from "@app/components/NakedButton.svelte";
  import NodeStatusButton from "@app/components/NodeStatusButton.svelte";

modified src/components/HomeSidebar.svelte
@@ -1,10 +1,10 @@
<script lang="ts">
-
  import type { RepoCount } from "@bindings/repo/RepoCount";
  import type { HomeReposTab } from "@app/views/home/router";
+
  import type { RepoCount } from "@bindings/repo/RepoCount";

  import * as router from "@app/lib/router";

-
  import Border from "./Border.svelte";
+
  import Border from "@app/components/Border.svelte";
  import Icon from "@app/components/Icon.svelte";
  import Settings from "@app/components/Settings.svelte";

modified src/components/Id.svelte
@@ -2,11 +2,11 @@
  import type { ComponentProps, Snippet } from "svelte";

  import debounce from "lodash/debounce";
-
  import { writeToClipboard } from "@app/lib/invoke";

+
  import { writeToClipboard } from "@app/lib/invoke";
  import { formatOid } from "@app/lib/utils";

-
  import Icon from "./Icon.svelte";
+
  import Icon from "@app/components/Icon.svelte";

  let icon: ComponentProps<typeof Icon>["name"] = $state("copy");
  const text = "Click to copy";
modified src/components/Inbox.svelte
@@ -3,8 +3,8 @@

  import ConfirmClear from "@app/components/ConfirmClear.svelte";
  import Icon from "@app/components/Icon.svelte";
-
  import NotificationsByRepoComponent from "@app/components/NotificationsByRepo.svelte";
  import NakedButton from "@app/components/NakedButton.svelte";
+
  import NotificationsByRepoComponent from "@app/components/NotificationsByRepo.svelte";

  interface Props {
    clearAll: () => Promise<void>;
modified src/components/InboxButton.svelte
@@ -2,18 +2,17 @@
  import type { NotificationsByRepo } from "@bindings/cob/inbox/NotificationsByRepo";

  import { getCurrentWindow } from "@tauri-apps/api/window";
-

-
  import { onMount } from "svelte";
  import { useOverlayScrollbars } from "overlayscrollbars-svelte";
+
  import { onMount } from "svelte";

  import { dynamicInterval } from "@app/lib/interval";
  import { invoke } from "@app/lib/invoke";

-
  import Border from "./Border.svelte";
-
  import Icon from "./Icon.svelte";
-
  import Inbox from "./Inbox.svelte";
-
  import OutlineButton from "./OutlineButton.svelte";
-
  import Popover from "./Popover.svelte";
+
  import Border from "@app/components/Border.svelte";
+
  import Icon from "@app/components/Icon.svelte";
+
  import Inbox from "@app/components/Inbox.svelte";
+
  import OutlineButton from "@app/components/OutlineButton.svelte";
+
  import Popover from "@app/components/Popover.svelte";

  interface Props {
    notificationCount: number;
modified src/components/IssueSecondColumn.svelte
@@ -1,6 +1,6 @@
<script lang="ts">
-
  import type { Issue } from "@bindings/cob/issue/Issue";
  import type { IssueStatus } from "@app/views/repo/router";
+
  import type { Issue } from "@bindings/cob/issue/Issue";
  import type { RepoInfo } from "@bindings/repo/RepoInfo";

  import fuzzysort from "fuzzysort";
@@ -8,13 +8,13 @@
  import * as router from "@app/lib/router";
  import { modifierKey } from "@app/lib/utils";

-
  import Border from "./Border.svelte";
-
  import Icon from "./Icon.svelte";
-
  import IssueStateFilterButton from "./IssueStateFilterButton.svelte";
+
  import Border from "@app/components/Border.svelte";
+
  import Icon from "@app/components/Icon.svelte";
+
  import IssueStateFilterButton from "@app/components/IssueStateFilterButton.svelte";
  import IssueTeaser from "@app/components/IssueTeaser.svelte";
-
  import NakedButton from "./NakedButton.svelte";
-
  import OutlineButton from "./OutlineButton.svelte";
-
  import TextInput from "./TextInput.svelte";
+
  import NakedButton from "@app/components/NakedButton.svelte";
+
  import OutlineButton from "@app/components/OutlineButton.svelte";
+
  import TextInput from "@app/components/TextInput.svelte";

  const activeRouteStore = router.activeRouteStore;

modified src/components/IssueStateButton.svelte
@@ -4,13 +4,13 @@
  import capitalize from "lodash/capitalize";
  import isEqual from "lodash/isEqual";

-
  import { closeFocused } from "@app/components/Popover.svelte";
  import { issueStatusBackgroundColor, issueStatusColor } from "@app/lib/utils";

  import Border from "@app/components/Border.svelte";
  import DropdownList from "@app/components/DropdownList.svelte";
  import DropdownListItem from "@app/components/DropdownListItem.svelte";
  import Icon from "@app/components/Icon.svelte";
+
  import { closeFocused } from "@app/components/Popover.svelte";
  import Popover from "@app/components/Popover.svelte";

  interface Props {
modified src/components/IssueStateFilterButton.svelte
@@ -2,17 +2,17 @@
  import type { IssueStatus } from "@app/views/repo/router";
  import type { ProjectPayloadMeta } from "@bindings/repo/ProjectPayloadMeta";

-
  import { closeFocused } from "./Popover.svelte";
-

  import capitalize from "lodash/capitalize";
+

  import { issueStatusColor } from "@app/lib/utils";

-
  import Border from "./Border.svelte";
-
  import DropdownList from "./DropdownList.svelte";
-
  import DropdownListItem from "./DropdownListItem.svelte";
-
  import Icon from "./Icon.svelte";
-
  import OutlineButton from "./OutlineButton.svelte";
-
  import Popover from "./Popover.svelte";
+
  import Border from "@app/components/Border.svelte";
+
  import DropdownList from "@app/components/DropdownList.svelte";
+
  import DropdownListItem from "@app/components/DropdownListItem.svelte";
+
  import Icon from "@app/components/Icon.svelte";
+
  import OutlineButton from "@app/components/OutlineButton.svelte";
+
  import { closeFocused } from "@app/components/Popover.svelte";
+
  import Popover from "@app/components/Popover.svelte";

  interface Props {
    changeFilter: (status: IssueStatus) => void;
modified src/components/IssueTeaser.svelte
@@ -1,21 +1,21 @@
<script lang="ts">
-
  import type { Issue } from "@bindings/cob/issue/Issue";
  import type { IssueStatus } from "@app/views/repo/router";
+
  import type { Issue } from "@bindings/cob/issue/Issue";

+
  import { push } from "@app/lib/router";
  import {
    authorForNodeId,
    formatTimestamp,
    issueStatusBackgroundColor,
    issueStatusColor,
  } from "@app/lib/utils";
-
  import { push } from "@app/lib/router";

-
  import Border from "./Border.svelte";
-
  import Icon from "./Icon.svelte";
-
  import Id from "./Id.svelte";
-
  import InlineTitle from "./InlineTitle.svelte";
-
  import Label from "./Label.svelte";
-
  import NodeId from "./NodeId.svelte";
+
  import Border from "@app/components/Border.svelte";
+
  import Icon from "@app/components/Icon.svelte";
+
  import Id from "@app/components/Id.svelte";
+
  import InlineTitle from "@app/components/InlineTitle.svelte";
+
  import Label from "@app/components/Label.svelte";
+
  import NodeId from "@app/components/NodeId.svelte";

  interface Props {
    compact?: boolean;
modified src/components/IssueTimeline.svelte
@@ -1,7 +1,7 @@
<script lang="ts">
+
  import type { Author } from "@bindings/cob/Author";
  import type { Action } from "@bindings/cob/issue/Action";
  import type { Operation } from "@bindings/cob/Operation";
-
  import type { Author } from "@bindings/cob/Author";

  type FlattenedOperation = Action & {
    id: string;
@@ -19,9 +19,10 @@
    issueStatusColor,
    pluralize,
  } from "@app/lib/utils";
-
  import Icon from "./Icon.svelte";
-
  import NodeId from "./NodeId.svelte";
-
  import Id from "./Id.svelte";
+

+
  import Icon from "@app/components/Icon.svelte";
+
  import Id from "@app/components/Id.svelte";
+
  import NodeId from "@app/components/NodeId.svelte";

  interface Props {
    activity: Operation<Action>[];
modified src/components/IssuesSecondColumn.svelte
@@ -2,11 +2,11 @@
  import type { IssueStatus } from "@app/views/repo/router";
  import type { RepoInfo } from "@bindings/repo/RepoInfo";

-
  import Border from "./Border.svelte";
-
  import Icon from "./Icon.svelte";
-
  import Link from "./Link.svelte";
-
  import RepoTeaser from "./RepoTeaser.svelte";
-
  import Settings from "./Settings.svelte";
+
  import Border from "@app/components/Border.svelte";
+
  import Icon from "@app/components/Icon.svelte";
+
  import Link from "@app/components/Link.svelte";
+
  import RepoTeaser from "@app/components/RepoTeaser.svelte";
+
  import Settings from "@app/components/Settings.svelte";

  interface Props {
    status: IssueStatus;
modified src/components/Link.svelte
@@ -1,8 +1,8 @@
<script lang="ts">
  import type { Snippet } from "svelte";
-
  import type { Route } from "@app/lib/router/definitions";

  import { push, routeToPath } from "@app/lib/router";
+
  import type { Route } from "@app/lib/router/definitions";

  interface Props {
    children: Snippet;
modified src/components/Markdown.svelte
@@ -1,15 +1,15 @@
<script lang="ts">
  import type { Embed } from "@bindings/cob/Embed";

-
  import dompurify from "dompurify";
  import matter from "@radicle/gray-matter";
+
  import dompurify from "dompurify";
  import { toDom } from "hast-util-to-dom";
+
  import { tick } from "svelte";

-
  import { Renderer, markdownWithExtensions } from "@app/lib/markdown";
-
  import { highlight } from "@app/lib/syntax";
-
  import { twemoji, scrollIntoView, isCommit } from "@app/lib/utils";
  import { invoke } from "@app/lib/invoke";
-
  import { tick } from "svelte";
+
  import { markdownWithExtensions, Renderer } from "@app/lib/markdown";
+
  import { highlight } from "@app/lib/syntax";
+
  import { isCommit, scrollIntoView, twemoji } from "@app/lib/utils";

  interface Props {
    rid?: string;
modified src/components/MoreBreadcrumbsButton.svelte
@@ -1,10 +1,10 @@
<script lang="ts">
  import type { Snippet } from "svelte";

-
  import Border from "./Border.svelte";
-
  import Icon from "./Icon.svelte";
-
  import NakedButton from "./NakedButton.svelte";
-
  import Popover from "./Popover.svelte";
+
  import Border from "@app/components/Border.svelte";
+
  import Icon from "@app/components/Icon.svelte";
+
  import NakedButton from "@app/components/NakedButton.svelte";
+
  import Popover from "@app/components/Popover.svelte";

  interface Props {
    children: Snippet;
modified src/components/NewPatchButton.svelte
@@ -1,10 +1,10 @@
<script lang="ts">
-
  import Border from "./Border.svelte";
-
  import Button from "./Button.svelte";
-
  import Command from "./Command.svelte";
-
  import Icon from "./Icon.svelte";
-
  import OutlineButton from "./OutlineButton.svelte";
-
  import Popover from "./Popover.svelte";
+
  import Border from "@app/components/Border.svelte";
+
  import Button from "@app/components/Button.svelte";
+
  import Command from "@app/components/Command.svelte";
+
  import Icon from "@app/components/Icon.svelte";
+
  import OutlineButton from "@app/components/OutlineButton.svelte";
+
  import Popover from "@app/components/Popover.svelte";

  interface Props {
    outline?: boolean;
modified src/components/NodeBreadcrumb.svelte
@@ -2,12 +2,11 @@
  import type { Config } from "@bindings/config/Config";

  import * as router from "@app/lib/router";
-

  import { didFromPublicKey, explorerUrl } from "@app/lib/utils";

-
  import BreadcrumbCopyButton from "@app/views/repo/BreadcrumbCopyButton.svelte";
  import Link from "@app/components/Link.svelte";
  import NodeId from "@app/components/NodeId.svelte";
+
  import BreadcrumbCopyButton from "@app/views/repo/BreadcrumbCopyButton.svelte";

  const activeRouteStore = router.activeRouteStore;

modified src/components/NodeId.svelte
@@ -1,7 +1,7 @@
<script lang="ts">
  import { truncateId } from "@app/lib/utils";

-
  import Avatar from "./Avatar.svelte";
+
  import Avatar from "@app/components/Avatar.svelte";

  interface Props {
    publicKey: string;
modified src/components/NotificationTeaser.svelte
@@ -1,12 +1,15 @@
<script lang="ts">
+
  import type { RepoRoute } from "@app/views/repo/router";
  import type { ActionWithAuthor } from "@bindings/cob/inbox/ActionWithAuthor";
+
  import type { NotificationItem } from "@bindings/cob/inbox/NotificationItem";
  import type { Action as IssueAction } from "@bindings/cob/issue/Action";
  import type { Action as PatchAction } from "@bindings/cob/patch/Action";
  import type { ComponentProps } from "svelte";
-
  import type { RepoRoute } from "@app/views/repo/router";
-
  import type { NotificationItem } from "@bindings/cob/inbox/NotificationItem";

  import uniqWith from "lodash/uniqWith";
+

+
  import { compressActions } from "@app/lib/notification";
+
  import { push } from "@app/lib/router";
  import {
    authorForNodeId,
    formatTimestamp,
@@ -15,14 +18,12 @@
    patchStatusBackgroundColor,
    patchStatusColor,
  } from "@app/lib/utils";
-
  import { closeFocused } from "./Popover.svelte";
-
  import { compressActions } from "@app/lib/notification";
-
  import { push } from "@app/lib/router";

-
  import Icon from "./Icon.svelte";
-
  import InlineTitle from "./InlineTitle.svelte";
-
  import NakedButton from "./NakedButton.svelte";
-
  import NodeId from "./NodeId.svelte";
+
  import Icon from "@app/components/Icon.svelte";
+
  import InlineTitle from "@app/components/InlineTitle.svelte";
+
  import NakedButton from "@app/components/NakedButton.svelte";
+
  import NodeId from "@app/components/NodeId.svelte";
+
  import { closeFocused } from "@app/components/Popover.svelte";

  interface Props {
    rid: string;
modified src/components/NotificationsByRepo.svelte
@@ -1,11 +1,11 @@
<script lang="ts">
  import type { NotificationsByRepo } from "@bindings/cob/inbox/NotificationsByRepo";

-
  import Button from "./Button.svelte";
-
  import ConfirmClear from "./ConfirmClear.svelte";
+
  import Button from "@app/components/Button.svelte";
+
  import ConfirmClear from "@app/components/ConfirmClear.svelte";
  import Icon from "@app/components/Icon.svelte";
-
  import NotificationTeaser from "./NotificationTeaser.svelte";
-
  import NakedButton from "./NakedButton.svelte";
+
  import NakedButton from "@app/components/NakedButton.svelte";
+
  import NotificationTeaser from "@app/components/NotificationTeaser.svelte";

  interface Props {
    clearByIds: (ids: string[]) => Promise<void>;
modified src/components/PatchMetadata.svelte
@@ -1,19 +1,19 @@
<script lang="ts">
  import type { Author } from "@bindings/cob/Author";
-
  import type { Config } from "@bindings/config/Config";
  import type { Patch } from "@bindings/cob/patch/Patch";
+
  import type { Config } from "@bindings/config/Config";
  import type { RepoInfo } from "@bindings/repo/RepoInfo";

-
  import * as roles from "@app/lib/roles";
-
  import { announce } from "@app/components/AnnounceSwitch.svelte";
-
  import { invoke } from "@app/lib/invoke";
  import { nodeRunning } from "@app/lib/events";
+
  import { invoke } from "@app/lib/invoke";
+
  import * as roles from "@app/lib/roles";
+
  import { authorForNodeId } from "@app/lib/utils";

+
  import { announce } from "@app/components/AnnounceSwitch.svelte";
  import AssigneeInput from "@app/components/AssigneeInput.svelte";
  import LabelInput from "@app/components/LabelInput.svelte";
-
  import NodeId from "./NodeId.svelte";
-
  import { authorForNodeId } from "@app/lib/utils";
-
  import PatchStateButton from "./PatchStateButton.svelte";
+
  import NodeId from "@app/components/NodeId.svelte";
+
  import PatchStateButton from "@app/components/PatchStateButton.svelte";

  interface Props {
    config: Config;
modified src/components/PatchStateButton.svelte
@@ -3,13 +3,13 @@

  import capitalize from "lodash/capitalize";

-
  import { closeFocused } from "@app/components/Popover.svelte";
  import { patchStatusBackgroundColor, patchStatusColor } from "@app/lib/utils";

  import Border from "@app/components/Border.svelte";
  import DropdownList from "@app/components/DropdownList.svelte";
  import DropdownListItem from "@app/components/DropdownListItem.svelte";
  import Icon from "@app/components/Icon.svelte";
+
  import { closeFocused } from "@app/components/Popover.svelte";
  import Popover from "@app/components/Popover.svelte";

  interface Props {
modified src/components/PatchStateButtonCompact.svelte
@@ -1,16 +1,16 @@
<script lang="ts">
-
  import type { ComponentProps } from "svelte";
  import type { State } from "@bindings/cob/patch/State";
+
  import type { ComponentProps } from "svelte";

  import capitalize from "lodash/capitalize";

-
  import { closeFocused } from "@app/components/Popover.svelte";
  import { patchStatusBackgroundColor, patchStatusColor } from "@app/lib/utils";

  import Border from "@app/components/Border.svelte";
  import DropdownList from "@app/components/DropdownList.svelte";
  import DropdownListItem from "@app/components/DropdownListItem.svelte";
  import Icon from "@app/components/Icon.svelte";
+
  import { closeFocused } from "@app/components/Popover.svelte";
  import Popover from "@app/components/Popover.svelte";

  interface Props {
modified src/components/PatchStateFilterButton.svelte
@@ -6,13 +6,12 @@

  import { patchStatusColor } from "@app/lib/utils";

-
  import { closeFocused } from "@app/components/Popover.svelte";
-

  import Border from "@app/components/Border.svelte";
  import DropdownList from "@app/components/DropdownList.svelte";
  import DropdownListItem from "@app/components/DropdownListItem.svelte";
  import Icon from "@app/components/Icon.svelte";
  import OutlineButton from "@app/components/OutlineButton.svelte";
+
  import { closeFocused } from "@app/components/Popover.svelte";
  import Popover from "@app/components/Popover.svelte";

  interface Props {
modified src/components/PatchTeaser.svelte
@@ -1,23 +1,23 @@
<script lang="ts">
-
  import type { Patch } from "@bindings/cob/patch/Patch";
  import type { PatchStatus } from "@app/views/repo/router";
+
  import type { Patch } from "@bindings/cob/patch/Patch";

+
  import { cachedDiffStats } from "@app/lib/invoke";
+
  import { push } from "@app/lib/router";
  import {
    authorForNodeId,
    formatTimestamp,
    patchStatusBackgroundColor,
    patchStatusColor,
  } from "@app/lib/utils";
-
  import { cachedDiffStats } from "@app/lib/invoke";
-
  import { push } from "@app/lib/router";

+
  import Border from "@app/components/Border.svelte";
  import DiffStatBadge from "@app/components/DiffStatBadge.svelte";
  import Icon from "@app/components/Icon.svelte";
  import Id from "@app/components/Id.svelte";
  import InlineTitle from "@app/components/InlineTitle.svelte";
  import Label from "@app/components/Label.svelte";
  import NodeId from "@app/components/NodeId.svelte";
-
  import Border from "./Border.svelte";

  interface Props {
    compact?: boolean;
modified src/components/PatchTimeline.svelte
@@ -1,7 +1,7 @@
<script lang="ts">
-
  import type { Action } from "@bindings/cob/patch/Action";
-
  import type { Operation } from "@bindings/cob/Operation";
  import type { Author } from "@bindings/cob/Author";
+
  import type { Operation } from "@bindings/cob/Operation";
+
  import type { Action } from "@bindings/cob/patch/Action";

  type FlattenedOperation = Action & {
    id: string;
@@ -19,9 +19,10 @@
    patchStatusColor,
    pluralize,
  } from "@app/lib/utils";
-
  import Icon from "./Icon.svelte";
-
  import Id from "./Id.svelte";
-
  import NodeId from "./NodeId.svelte";
+

+
  import Icon from "@app/components/Icon.svelte";
+
  import Id from "@app/components/Id.svelte";
+
  import NodeId from "@app/components/NodeId.svelte";

  interface Props {
    patchId: string;
modified src/components/PatchesSecondColumn.svelte
@@ -3,11 +3,11 @@
  import type { ProjectPayload } from "@bindings/repo/ProjectPayload";
  import type { RepoInfo } from "@bindings/repo/RepoInfo";

-
  import Border from "./Border.svelte";
-
  import Icon from "./Icon.svelte";
-
  import Link from "./Link.svelte";
-
  import RepoTeaser from "./RepoTeaser.svelte";
-
  import Settings from "./Settings.svelte";
+
  import Border from "@app/components/Border.svelte";
+
  import Icon from "@app/components/Icon.svelte";
+
  import Link from "@app/components/Link.svelte";
+
  import RepoTeaser from "@app/components/RepoTeaser.svelte";
+
  import Settings from "@app/components/Settings.svelte";

  interface Props {
    project: ProjectPayload;
modified src/components/ReactionSelector.svelte
@@ -1,11 +1,12 @@
<script lang="ts">
  import type { Reaction } from "@bindings/cob/Reaction";

-
  import Border from "./Border.svelte";
-
  import Icon from "./Icon.svelte";
-
  import Popover from "./Popover.svelte";
  import { twemoji } from "@app/lib/utils";

+
  import Border from "@app/components/Border.svelte";
+
  import Icon from "@app/components/Icon.svelte";
+
  import Popover from "@app/components/Popover.svelte";
+

  interface Props {
    reactions?: Reaction[];
    popoverPositionBottom?: string;
modified src/components/RepoCard.svelte
@@ -3,10 +3,10 @@

  import { formatRepositoryId, formatTimestamp } from "@app/lib/utils";

-
  import Border from "./Border.svelte";
-
  import Icon from "./Icon.svelte";
-
  import RepoHeader from "./RepoHeader.svelte";
-
  import Id from "./Id.svelte";
+
  import Border from "@app/components/Border.svelte";
+
  import Icon from "@app/components/Icon.svelte";
+
  import Id from "@app/components/Id.svelte";
+
  import RepoHeader from "@app/components/RepoHeader.svelte";

  interface Props {
    repo: RepoInfo;
modified src/components/RepoCardPlaceholder.svelte
@@ -1,14 +1,13 @@
<script lang="ts">
+
  import { nodeRunning } from "@app/lib/events";
+
  import { invoke } from "@app/lib/invoke";
  import { formatRepositoryId } from "@app/lib/utils";

-
  import { invoke } from "@app/lib/invoke";
-
  import { nodeRunning } from "@app/lib/events";
  import { announce } from "@app/components/AnnounceSwitch.svelte";
-

-
  import Border from "./Border.svelte";
-
  import Id from "./Id.svelte";
-
  import Icon from "./Icon.svelte";
-
  import NakedButton from "./NakedButton.svelte";
+
  import Border from "@app/components/Border.svelte";
+
  import Icon from "@app/components/Icon.svelte";
+
  import Id from "@app/components/Id.svelte";
+
  import NakedButton from "@app/components/NakedButton.svelte";

  interface Props {
    reload: () => Promise<void>;
modified src/components/RepoHeader.svelte
@@ -1,7 +1,7 @@
<script lang="ts">
  import type { RepoInfo } from "@bindings/repo/RepoInfo";

-
  import Icon from "./Icon.svelte";
+
  import Icon from "@app/components/Icon.svelte";

  interface Props {
    repo: RepoInfo;
modified src/components/RepoHomeSecondColumn.svelte
@@ -1,11 +1,11 @@
<script lang="ts">
  import type { RepoInfo } from "@bindings/repo/RepoInfo";

-
  import Border from "./Border.svelte";
-
  import Icon from "./Icon.svelte";
-
  import Link from "./Link.svelte";
-
  import RepoTeaser from "./RepoTeaser.svelte";
-
  import Settings from "./Settings.svelte";
+
  import Border from "@app/components/Border.svelte";
+
  import Icon from "@app/components/Icon.svelte";
+
  import Link from "@app/components/Link.svelte";
+
  import RepoTeaser from "@app/components/RepoTeaser.svelte";
+
  import Settings from "@app/components/Settings.svelte";

  interface Props {
    repo: RepoInfo;
modified src/components/RepoMetadata.svelte
@@ -6,10 +6,10 @@
  import { authorForNodeId } from "@app/lib/utils";

  import Border from "@app/components/Border.svelte";
+
  import Icon from "@app/components/Icon.svelte";
  import Id from "@app/components/Id.svelte";
  import NodeId from "@app/components/NodeId.svelte";
  import VisibilityBadge from "@app/components/VisibilityBadge.svelte";
-
  import Icon from "./Icon.svelte";

  interface Props {
    horizontal?: boolean;
modified src/components/Review.svelte
@@ -1,26 +1,27 @@
<script lang="ts">
  import type { Author } from "@bindings/cob/Author";
-
  import type { CodeLocation } from "@bindings/cob/thread/CodeLocation";
-
  import type { Config } from "@bindings/config/Config";
-
  import type { DraftReview } from "@app/lib/draftReviewStorage";
-
  import type { Embed } from "@bindings/cob/thread/Embed";
-
  import type { RepoInfo } from "@bindings/repo/RepoInfo";
  import type { Review } from "@bindings/cob/patch/Review";
  import type { Revision } from "@bindings/cob/patch/Revision";
+
  import type { CodeLocation } from "@bindings/cob/thread/CodeLocation";
+
  import type { Embed } from "@bindings/cob/thread/Embed";
  import type { Thread } from "@bindings/cob/thread/Thread";
+
  import type { Config } from "@bindings/config/Config";
+
  import type { RepoInfo } from "@bindings/repo/RepoInfo";

  import partial from "lodash/partial";
  import uniqBy from "lodash/uniqBy";

+
  import type { DraftReview } from "@app/lib/draftReviewStorage";
+
  import { draftReviewStorage } from "@app/lib/draftReviewStorage";
+
  import { nodeRunning } from "@app/lib/events";
+
  import { invoke } from "@app/lib/invoke";
  import * as roles from "@app/lib/roles";
-

-
  import { announce } from "@app/components/AnnounceSwitch.svelte";
+
  import { push } from "@app/lib/router";
  import { authorForNodeId, publicKeyFromDid } from "@app/lib/utils";
-
  import { invoke } from "@app/lib/invoke";
-
  import { nodeRunning } from "@app/lib/events";

+
  import { announce } from "@app/components/AnnounceSwitch.svelte";
  import Border from "@app/components/Border.svelte";
-
  import Button from "./Button.svelte";
+
  import Button from "@app/components/Button.svelte";
  import Changes from "@app/components/Changes.svelte";
  import CommentComponent from "@app/components/Comment.svelte";
  import Discussion from "@app/components/Discussion.svelte";
@@ -31,8 +32,6 @@
  import NodeId from "@app/components/NodeId.svelte";
  import VerdictBadge from "@app/components/VerdictBadge.svelte";
  import VerdictButton from "@app/components/VerdictButton.svelte";
-
  import { draftReviewStorage } from "@app/lib/draftReviewStorage";
-
  import { push } from "@app/lib/router";

  interface Props {
    config: Config;
modified src/components/Revision.svelte
@@ -1,18 +1,18 @@
<script lang="ts">
  import type { Author } from "@bindings/cob/Author";
-
  import type { Config } from "@bindings/config/Config";
-
  import type { Embed } from "@bindings/cob/thread/Embed";
  import type { Revision } from "@bindings/cob/patch/Revision";
+
  import type { Embed } from "@bindings/cob/thread/Embed";
  import type { Thread } from "@bindings/cob/thread/Thread";
+
  import type { Config } from "@bindings/config/Config";

  import partial from "lodash/partial";

-
  import * as roles from "@app/lib/roles";
-
  import { announce } from "@app/components/AnnounceSwitch.svelte";
-
  import { invoke } from "@app/lib/invoke";
  import { nodeRunning } from "@app/lib/events";
+
  import { invoke } from "@app/lib/invoke";
+
  import * as roles from "@app/lib/roles";
  import { publicKeyFromDid } from "@app/lib/utils";

+
  import { announce } from "@app/components/AnnounceSwitch.svelte";
  import Changes from "@app/components/Changes.svelte";
  import CommentComponent from "@app/components/Comment.svelte";
  import Discussion from "@app/components/Discussion.svelte";
modified src/components/RevisionReviews.svelte
@@ -1,23 +1,22 @@
<script lang="ts">
-
  import type { Config } from "@bindings/config/Config";
-
  import type { DraftReview } from "@app/lib/draftReviewStorage";
-
  import type { Patch } from "@bindings/cob/patch/Patch";
  import type { PatchStatus } from "@app/views/repo/router";
+
  import type { Patch } from "@bindings/cob/patch/Patch";
  import type { Review } from "@bindings/cob/patch/Review";
  import type { Revision } from "@bindings/cob/patch/Revision";
+
  import type { Config } from "@bindings/config/Config";

-
  import DropdownListItem from "./DropdownListItem.svelte";
-
  import Icon from "./Icon.svelte";
-
  import NodeId from "./NodeId.svelte";
-

+
  import type { DraftReview } from "@app/lib/draftReviewStorage";
+
  import { draftReviewStorage } from "@app/lib/draftReviewStorage";
+
  import { push } from "@app/lib/router";
  import {
    authorForNodeId,
    didFromPublicKey,
    verdictIcon,
  } from "@app/lib/utils";

-
  import { draftReviewStorage } from "@app/lib/draftReviewStorage";
-
  import { push } from "@app/lib/router";
+
  import DropdownListItem from "@app/components/DropdownListItem.svelte";
+
  import Icon from "@app/components/Icon.svelte";
+
  import NodeId from "@app/components/NodeId.svelte";

  interface Props {
    config: Config;
modified src/components/RevisionSelector.svelte
@@ -2,19 +2,19 @@
  import type { Patch } from "@bindings/cob/patch/Patch";
  import type { Revision } from "@bindings/cob/patch/Revision";

-
  import uniqBy from "lodash/uniqBy";
  import orderBy from "lodash/orderBy";
+
  import uniqBy from "lodash/uniqBy";

  import { authorForNodeId, formatOid } from "@app/lib/utils";

-
  import Border from "./Border.svelte";
-
  import DropdownList from "./DropdownList.svelte";
-
  import DropdownListItem from "./DropdownListItem.svelte";
-
  import Icon from "./Icon.svelte";
-
  import NakedButton from "./NakedButton.svelte";
-
  import NodeId from "./NodeId.svelte";
-
  import Popover, { closeFocused } from "./Popover.svelte";
-
  import RevisionBadges from "./RevisionBadges.svelte";
+
  import Border from "@app/components/Border.svelte";
+
  import DropdownList from "@app/components/DropdownList.svelte";
+
  import DropdownListItem from "@app/components/DropdownListItem.svelte";
+
  import Icon from "@app/components/Icon.svelte";
+
  import NakedButton from "@app/components/NakedButton.svelte";
+
  import NodeId from "@app/components/NodeId.svelte";
+
  import Popover, { closeFocused } from "@app/components/Popover.svelte";
+
  import RevisionBadges from "@app/components/RevisionBadges.svelte";

  interface Props {
    patch: Patch;
modified src/components/Revisions.svelte
@@ -1,19 +1,19 @@
<script lang="ts">
-
  import type { Config } from "@bindings/config/Config";
-
  import type { Patch } from "@bindings/cob/patch/Patch";
  import type { PatchStatus } from "@app/views/repo/router";
+
  import type { Patch } from "@bindings/cob/patch/Patch";
  import type { Revision } from "@bindings/cob/patch/Revision";
+
  import type { Config } from "@bindings/config/Config";

  import orderBy from "lodash/orderBy";
  import uniqBy from "lodash/uniqBy";

  import { authorForNodeId } from "@app/lib/utils";

-
  import DropdownListItem from "./DropdownListItem.svelte";
-
  import Icon from "./Icon.svelte";
-
  import NodeId from "./NodeId.svelte";
-
  import RevisionReviews from "./RevisionReviews.svelte";
-
  import RevisionBadges from "./RevisionBadges.svelte";
+
  import DropdownListItem from "@app/components/DropdownListItem.svelte";
+
  import Icon from "@app/components/Icon.svelte";
+
  import NodeId from "@app/components/NodeId.svelte";
+
  import RevisionBadges from "@app/components/RevisionBadges.svelte";
+
  import RevisionReviews from "@app/components/RevisionReviews.svelte";

  interface Props {
    config: Config;
modified src/components/Settings.svelte
@@ -7,17 +7,17 @@

  import { updateChecker } from "@app/lib/updateChecker.svelte";

-
  import AnnounceSwitch from "./AnnounceSwitch.svelte";
-
  import Border from "./Border.svelte";
-
  import CopyableId from "./CopyableId.svelte";
-
  import ExternalLink from "./ExternalLink.svelte";
-
  import FontSizeSwitch from "./FontSizeSwitch.svelte";
-
  import Icon from "./Icon.svelte";
-
  import NakedButton from "./NakedButton.svelte";
-
  import OutlineButton from "./OutlineButton.svelte";
-
  import Popover from "./Popover.svelte";
-
  import ThemeSwitch from "./ThemeSwitch.svelte";
-
  import UpdateSwitch from "./UpdateSwitch.svelte";
+
  import AnnounceSwitch from "@app/components/AnnounceSwitch.svelte";
+
  import Border from "@app/components/Border.svelte";
+
  import CopyableId from "@app/components/CopyableId.svelte";
+
  import ExternalLink from "@app/components/ExternalLink.svelte";
+
  import FontSizeSwitch from "@app/components/FontSizeSwitch.svelte";
+
  import Icon from "@app/components/Icon.svelte";
+
  import NakedButton from "@app/components/NakedButton.svelte";
+
  import OutlineButton from "@app/components/OutlineButton.svelte";
+
  import Popover from "@app/components/Popover.svelte";
+
  import ThemeSwitch from "@app/components/ThemeSwitch.svelte";
+
  import UpdateSwitch from "@app/components/UpdateSwitch.svelte";

  interface Props {
    compact?: boolean;
modified src/components/Sidebar.svelte
@@ -1,12 +1,11 @@
<script lang="ts">
  import * as router from "@app/lib/router";

-
  import { storeLayout, getLayout } from "@app/views/repo/Layout.svelte";
-

+
  import Border from "@app/components/Border.svelte";
  import Icon from "@app/components/Icon.svelte";
+
  import NakedButton from "@app/components/NakedButton.svelte";
  import Settings from "@app/components/Settings.svelte";
-
  import Border from "./Border.svelte";
-
  import NakedButton from "./NakedButton.svelte";
+
  import { getLayout, storeLayout } from "@app/views/repo/Layout.svelte";

  interface Props {
    activeTab: "issues" | "patches";
modified src/components/TextInput.svelte
@@ -1,10 +1,10 @@
<script lang="ts">
-
  import type { FormEventHandler } from "svelte/elements";
  import type { Snippet } from "svelte";
+
  import type { FormEventHandler } from "svelte/elements";

  import { onMount } from "svelte";

-
  import Border from "./Border.svelte";
+
  import Border from "@app/components/Border.svelte";

  interface Props {
    autofocus?: boolean;
modified src/components/Textarea.svelte
@@ -1,13 +1,15 @@
<script lang="ts">
+
  import type { ComponentProps } from "svelte";
  import type {
    ClipboardEventHandler,
    FormEventHandler,
  } from "svelte/elements";
-
  import type { ComponentProps } from "svelte";

  import { onMount, tick } from "svelte";
+

  import * as utils from "@app/lib/utils";
-
  import Border from "./Border.svelte";
+

+
  import Border from "@app/components/Border.svelte";

  interface Props {
    draggingOver?: boolean;
modified src/components/ThemeSwitch.svelte
@@ -29,8 +29,8 @@
<script lang="ts">
  import { writable } from "svelte/store";

-
  import Icon from "./Icon.svelte";
-
  import Button from "./Button.svelte";
+
  import Button from "@app/components/Button.svelte";
+
  import Icon from "@app/components/Icon.svelte";
</script>

<style>
modified src/components/Thread.svelte
@@ -4,14 +4,14 @@
  import type { Embed } from "@bindings/cob/thread/Embed";
  import type { Thread } from "@bindings/cob/thread/Thread";

-
  import { tick } from "svelte";
  import partial from "lodash/partial";
+
  import { tick } from "svelte";

  import { scrollIntoView } from "@app/lib/utils";

-
  import Border from "./Border.svelte";
+
  import Border from "@app/components/Border.svelte";
  import CommentComponent from "@app/components/Comment.svelte";
-
  import ExtendedTextarea from "./ExtendedTextarea.svelte";
+
  import ExtendedTextarea from "@app/components/ExtendedTextarea.svelte";
  import Icon from "@app/components/Icon.svelte";

  interface Props {
modified src/components/UpdateSwitch.svelte
@@ -1,5 +1,5 @@
<script lang="ts">
-
  import Button from "./Button.svelte";
+
  import Button from "@app/components/Button.svelte";

  interface Props {
    active: boolean;
modified src/components/VerdictBadge.svelte
@@ -3,6 +3,7 @@
  import type { Snippet } from "svelte";

  import capitalize from "lodash/capitalize.js";
+

  import { verdictIcon } from "@app/lib/utils";

  import Icon from "@app/components/Icon.svelte";
modified src/components/VerdictButton.svelte
@@ -3,7 +3,6 @@

  import capitalize from "lodash/capitalize.js";

-
  import { closeFocused } from "./Popover.svelte";
  import { verdictIcon } from "@app/lib/utils";

  import Border from "@app/components/Border.svelte";
@@ -11,6 +10,7 @@
  import DropdownListItem from "@app/components/DropdownListItem.svelte";
  import Icon from "@app/components/Icon.svelte";
  import Popover from "@app/components/Popover.svelte";
+
  import { closeFocused } from "@app/components/Popover.svelte";
  import VerdictBadge from "@app/components/VerdictBadge.svelte";

  interface Props {
modified src/lib/auth.svelte.ts
@@ -1,9 +1,10 @@
import type { ErrorWrapper } from "@bindings/error/ErrorWrapper";

-
import * as router from "@app/lib/router";
-
import { dynamicInterval } from "@app/lib/interval";
import { get } from "svelte/store";
+

+
import { dynamicInterval } from "@app/lib/interval";
import { invoke } from "@app/lib/invoke";
+
import * as router from "@app/lib/router";

export const startup = $state<{ error?: ErrorWrapper }>({ error: undefined });

modified src/lib/draftReviewStorage.ts
@@ -1,15 +1,16 @@
-
import { z } from "zod";
-

-
import type { Comment } from "@bindings/cob/thread/Comment";
import type { Author } from "@bindings/cob/Author";
-
import type { CodeLocation } from "@bindings/cob/thread/CodeLocation";
-
import type { CodeRange } from "@bindings/cob/thread/CodeRange";
import type { CreateReviewArgs } from "@bindings/cob/patch/CreateReviewArgs";
-
import type { Embed } from "@bindings/cob/thread/Embed";
import type { Patch } from "@bindings/cob/patch/Patch";
import type { Verdict } from "@bindings/cob/patch/Verdict";
+
import type { CodeLocation } from "@bindings/cob/thread/CodeLocation";
+
import type { CodeRange } from "@bindings/cob/thread/CodeRange";
+
import type { Comment } from "@bindings/cob/thread/Comment";
+
import type { Embed } from "@bindings/cob/thread/Embed";
+

+
import { z } from "zod";

import useLocalStorage from "@app/lib/useLocalStorage.svelte";
+

import { invoke } from "./invoke";

// This is different from the stored draft review to align it with a
modified src/lib/invoke.ts
@@ -1,9 +1,10 @@
-
import type { Commit } from "@bindings/repo/Commit";
-
import type { Diff } from "@bindings/diff/Diff";
import type { DiffOptions } from "@bindings/cob/DiffOptions";
+
import type { Diff } from "@bindings/diff/Diff";
import type { Stats } from "@bindings/diff/Stats";
+
import type { Commit } from "@bindings/repo/Commit";

import * as tauri from "@tauri-apps/api/core";
+

import { cached } from "@app/lib/cached";

export async function invoke<T = null>(
modified src/lib/markdown.ts
@@ -1,11 +1,11 @@
import type { MarkedExtension, Tokens } from "marked";

import dompurify from "dompurify";
-
import katexMarkedExtension from "marked-katex-extension";
-
import markedFootnote from "marked-footnote";
-
import markedLinkifyIt from "marked-linkify-it";
import { Marked, Renderer as BaseRenderer } from "marked";
import { markedEmoji } from "marked-emoji";
+
import markedFootnote from "marked-footnote";
+
import katexMarkedExtension from "marked-katex-extension";
+
import markedLinkifyIt from "marked-linkify-it";

import emojis from "@app/lib/emojis";

modified src/lib/notification.ts
@@ -2,7 +2,7 @@ import type { ActionWithAuthor } from "@bindings/cob/inbox/ActionWithAuthor";
import type { Action as IssueAction } from "@bindings/cob/issue/Action";
import type { Action as PatchAction } from "@bindings/cob/patch/Action";

-
import { pluralize, formatOid } from "@app/lib/utils";
+
import { formatOid, pluralize } from "@app/lib/utils";

export type Action =
  | ActionWithAuthor<IssueAction>
modified src/lib/router.ts
@@ -1,11 +1,10 @@
-
import type { LoadedRoute, Route } from "@app/lib/router/definitions";
-

+
import { repoRouteToPath, repoUrlToRoute } from "@app/views/repo/router";
import { get, writable } from "svelte/store";

import * as mutexExecutor from "@app/lib/mutexExecutor";
-
import * as utils from "@app/lib/utils";
+
import type { LoadedRoute, Route } from "@app/lib/router/definitions";
import { loadRoute } from "@app/lib/router/definitions";
-
import { repoRouteToPath, repoUrlToRoute } from "@app/views/repo/router";
+
import * as utils from "@app/lib/utils";

export { type Route };

modified src/lib/router/definitions.ts
@@ -1,4 +1,4 @@
-
import type { LoadedHomeRoute, HomeRoute } from "@app/views/home/router";
+
import type { HomeRoute, LoadedHomeRoute } from "@app/views/home/router";
import type { LoadedRepoRoute, RepoRoute } from "@app/views/repo/router";

import { loadHome } from "@app/views/home/router";
modified src/lib/startup.svelte.ts
@@ -1,7 +1,7 @@
import type { UnlistenFn } from "@tauri-apps/api/event";

-
import once from "lodash/once";
import { listen } from "@tauri-apps/api/event";
+
import once from "lodash/once";

import { nodeRunning } from "./events";

modified src/lib/syntax.ts
@@ -1,36 +1,35 @@
import type { Root } from "hast";

-
import onigurumaWASMUrl from "vscode-oniguruma/release/onig.wasm?url";
-
import sourceAsciiDoc from "@wooorm/starry-night/text.html.asciidoc";
+
import { common, createStarryNight, type Grammar } from "@wooorm/starry-night";
+
import etc from "@wooorm/starry-night/etc";
+
import goMod from "@wooorm/starry-night/go.mod";
+
import goSum from "@wooorm/starry-night/go.sum";
+
import sourceBatchfile from "@wooorm/starry-night/source.batchfile";
import sourceDockerfile from "@wooorm/starry-night/source.dockerfile";
+
import sourceDotenv from "@wooorm/starry-night/source.dotenv";
+
import sourceEditorconfig from "@wooorm/starry-night/source.editorconfig";
import sourceErlang from "@wooorm/starry-night/source.erlang";
-
import sourceSolidity from "@wooorm/starry-night/source.solidity";
-
import sourceSvelte from "@wooorm/starry-night/source.svelte";
-
import sourceSass from "@wooorm/starry-night/source.sass";
-
import sourceToml from "@wooorm/starry-night/source.toml";
-
import sourceTsx from "@wooorm/starry-night/source.tsx";
-
import sourceNix from "@wooorm/starry-night/source.nix";
-
import sourceGitconfig from "@wooorm/starry-night/source.gitconfig";
-
import sourceGitignore from "@wooorm/starry-night/source.gitignore";
import sourceGitrevlist from "@wooorm/starry-night/source.git-revlist";
import sourceGitattributes from "@wooorm/starry-night/source.gitattributes";
-
import sourceJson from "@wooorm/starry-night/source.json";
-
import sourceNpmrc from "@wooorm/starry-night/source.ini.npmrc";
+
import sourceGitconfig from "@wooorm/starry-night/source.gitconfig";
+
import sourceGitignore from "@wooorm/starry-night/source.gitignore";
import sourceGradle from "@wooorm/starry-night/source.groovy.gradle";
-
import sourceBatchfile from "@wooorm/starry-night/source.batchfile";
-
import sourceEditorconfig from "@wooorm/starry-night/source.editorconfig";
import sourceHaproxyConfig from "@wooorm/starry-night/source.haproxy-config";
-
import sourceDotenv from "@wooorm/starry-night/source.dotenv";
+
import sourceNpmrc from "@wooorm/starry-night/source.ini.npmrc";
+
import sourceJson from "@wooorm/starry-night/source.json";
+
import sourceNix from "@wooorm/starry-night/source.nix";
+
import sourceSass from "@wooorm/starry-night/source.sass";
+
import sourceSolidity from "@wooorm/starry-night/source.solidity";
+
import sourceSvelte from "@wooorm/starry-night/source.svelte";
+
import sourceToml from "@wooorm/starry-night/source.toml";
+
import sourceTsx from "@wooorm/starry-night/source.tsx";
import sourceZig from "@wooorm/starry-night/source.zig";
-
import textHtmlVue from "@wooorm/starry-night/text.html.vue";
+
import sourceAsciiDoc from "@wooorm/starry-night/text.html.asciidoc";
import textHtmlDjango from "@wooorm/starry-night/text.html.django";
+
import textHtmlVue from "@wooorm/starry-night/text.html.vue";
import textRobotsTxt from "@wooorm/starry-night/text.robots-txt";
import textZoneFile from "@wooorm/starry-night/text.zone_file";
-
import etc from "@wooorm/starry-night/etc";
-
import goMod from "@wooorm/starry-night/go.mod";
-
import goSum from "@wooorm/starry-night/go.sum";
-

-
import { createStarryNight, common, type Grammar } from "@wooorm/starry-night";
+
import onigurumaWASMUrl from "vscode-oniguruma/release/onig.wasm?url";

export { type Root };

modified src/lib/updateChecker.svelte.ts
@@ -1,8 +1,8 @@
-
import * as z from "zod";
import * as semver from "semver";
+
import * as z from "zod";

-
import useLocalStorage from "./useLocalStorage.svelte";
import { invoke } from "./invoke";
+
import useLocalStorage from "./useLocalStorage.svelte";

interface LatestVersionInfo {
  version: string;
modified src/lib/useLocalStorage.svelte.ts
@@ -1,4 +1,4 @@
-
import { z, type SafeParseReturnType } from "zod";
+
import { type SafeParseReturnType, z } from "zod";

export default function useLocalStorage<
  S extends z.infer<T>,
modified src/lib/utils.ts
@@ -1,13 +1,12 @@
-
import type { ComponentProps } from "svelte";
-

import type { Author } from "@bindings/cob/Author";
import type { Issue } from "@bindings/cob/issue/Issue";
import type { Patch } from "@bindings/cob/patch/Patch";
import type { Review } from "@bindings/cob/patch/Review";
+
import type { ComponentProps } from "svelte";

import bs58 from "bs58";
-
import twemojiModule from "twemoji";
import md5 from "md5";
+
import twemojiModule from "twemoji";

import NodeId from "@app/components/NodeId.svelte";

modified src/main.ts
@@ -1,6 +1,7 @@
-
import { mount } from "svelte";
-
import { hotkeyKeyUX, hotkeyMacCompat, startKeyUX } from "keyux";
import "overlayscrollbars/overlayscrollbars.css";
+
import { hotkeyKeyUX, hotkeyMacCompat, startKeyUX } from "keyux";
+
import { mount } from "svelte";
+

import App from "./App.svelte";

const app = mount(App, { target: document.body });
modified src/views/booting/Auth.svelte
@@ -2,8 +2,14 @@
  import type { Author } from "@bindings/cob/Author";
  import type { ErrorWrapper } from "@bindings/error/ErrorWrapper";

-
  import * as router from "@app/lib/router";
+
  import logo from "/radicle.svg?url";
+

  import { invoke } from "@app/lib/invoke";
+
  import * as router from "@app/lib/router";
+
  import {
+
    createEventEmittersOnce,
+
    setUnlistenNodeEvents,
+
  } from "@app/lib/startup.svelte";
  import { truncateDid } from "@app/lib/utils";

  import Border from "@app/components/Border.svelte";
@@ -11,11 +17,6 @@
  import Icon from "@app/components/Icon.svelte";
  import Spinner from "@app/components/Spinner.svelte";
  import TextInput from "@app/components/TextInput.svelte";
-
  import logo from "/radicle.svg?url";
-
  import {
-
    setUnlistenNodeEvents,
-
    createEventEmittersOnce,
-
  } from "@app/lib/startup.svelte";

  interface Props {
    profile: Author;
modified src/views/booting/CreateIdentity.svelte
@@ -1,15 +1,16 @@
<script lang="ts">
  import type { ErrorWrapper } from "@bindings/error/ErrorWrapper";

+
  import logo from "/radicle.svg?url";
+
  import debounce from "lodash/debounce";
+

+
  import { invoke } from "@app/lib/invoke";
  import * as router from "@app/lib/router";
  import { createEventEmittersOnce } from "@app/lib/startup.svelte";
-
  import { invoke } from "@app/lib/invoke";

-
  import debounce from "lodash/debounce";
  import Button from "@app/components/Button.svelte";
  import Icon from "@app/components/Icon.svelte";
  import TextInput from "@app/components/TextInput.svelte";
-
  import logo from "/radicle.svg?url";

  let passphrase = $state("");
  let notMatchingPassphrases = $state<boolean>();
modified src/views/home/Repos.svelte
@@ -1,30 +1,30 @@
<script lang="ts">
+
  import type { HomeReposTab } from "@app/views/home/router";
  import type { Config } from "@bindings/config/Config";
  import type { ErrorWrapper } from "@bindings/error/ErrorWrapper";
-
  import type { HomeReposTab } from "@app/views/home/router";
  import type { RepoCount } from "@bindings/repo/RepoCount";
  import type { RepoInfo } from "@bindings/repo/RepoInfo";

  import fuzzysort from "fuzzysort";
  import { onMount } from "svelte";

-
  import * as router from "@app/lib/router";
-
  import { didFromPublicKey, modifierKey } from "@app/lib/utils";
  import { dynamicInterval } from "@app/lib/interval";
-
  import { guidePopoverToggleId } from "@app/components/GuideButton.svelte";
  import { invoke } from "@app/lib/invoke";
+
  import * as router from "@app/lib/router";
  import { sleep } from "@app/lib/sleep";
+
  import { didFromPublicKey, modifierKey } from "@app/lib/utils";

  import AddRepoButton from "@app/components/AddRepoButton.svelte";
  import Border from "@app/components/Border.svelte";
+
  import { guidePopoverToggleId } from "@app/components/GuideButton.svelte";
  import HomeSidebar from "@app/components/HomeSidebar.svelte";
  import Icon from "@app/components/Icon.svelte";
-
  import Layout from "@app/views/repo/Layout.svelte";
  import NakedButton from "@app/components/NakedButton.svelte";
  import NodeBreadcrumb from "@app/components/NodeBreadcrumb.svelte";
  import RepoCard from "@app/components/RepoCard.svelte";
  import RepoCardPlaceholder from "@app/components/RepoCardPlaceholder.svelte";
  import TextInput from "@app/components/TextInput.svelte";
+
  import Layout from "@app/views/repo/Layout.svelte";

  interface Props {
    activeTab: HomeReposTab;
modified src/views/home/router.ts
@@ -1,6 +1,6 @@
import type { Config } from "@bindings/config/Config";
-
import type { RepoInfo } from "@bindings/repo/RepoInfo";
import type { RepoCount } from "@bindings/repo/RepoCount";
+
import type { RepoInfo } from "@bindings/repo/RepoInfo";

import { invoke } from "@app/lib/invoke";

modified src/views/repo/BreadcrumbCopyButton.svelte
@@ -1,14 +1,14 @@
<script lang="ts">
  import type { ComponentProps } from "svelte";

-
  import { writeToClipboard } from "@app/lib/invoke";
-

  import debounce from "lodash/debounce";
-
  import { closeFocused } from "@app/components/Popover.svelte";
+

+
  import { writeToClipboard } from "@app/lib/invoke";

  import Border from "@app/components/Border.svelte";
  import DropdownListItem from "@app/components/DropdownListItem.svelte";
  import Icon from "@app/components/Icon.svelte";
+
  import { closeFocused } from "@app/components/Popover.svelte";
  import Popover from "@app/components/Popover.svelte";

  interface Props {
modified src/views/repo/CreateIssue.svelte
@@ -1,19 +1,17 @@
<script lang="ts">
+
  import type { IssueStatus } from "./router";
  import type { Author } from "@bindings/cob/Author";
-
  import type { Config } from "@bindings/config/Config";
  import type { Issue } from "@bindings/cob/issue/Issue";
-
  import type { RepoInfo } from "@bindings/repo/RepoInfo";
-
  import type { IssueStatus } from "./router";
  import type { Embed } from "@bindings/cob/thread/Embed";
+
  import type { Config } from "@bindings/config/Config";
+
  import type { RepoInfo } from "@bindings/repo/RepoInfo";

+
  import { nodeRunning } from "@app/lib/events";
  import { invoke } from "@app/lib/invoke";
-

  import * as roles from "@app/lib/roles";
  import * as router from "@app/lib/router";
-
  import { nodeRunning } from "@app/lib/events";

  import { announce } from "@app/components/AnnounceSwitch.svelte";
-

  import AssigneeInput from "@app/components/AssigneeInput.svelte";
  import Border from "@app/components/Border.svelte";
  import ExtendedTextarea from "@app/components/ExtendedTextarea.svelte";
modified src/views/repo/Issue.svelte
@@ -1,19 +1,19 @@
<script lang="ts">
-
  import type { Action } from "@bindings/cob/issue/Action";
+
  import type { IssueStatus } from "./router";
  import type { Author } from "@bindings/cob/Author";
-
  import type { Config } from "@bindings/config/Config";
-
  import type { Embed } from "@bindings/cob/thread/Embed";
+
  import type { Action } from "@bindings/cob/issue/Action";
  import type { Issue } from "@bindings/cob/issue/Issue";
-
  import type { IssueStatus } from "./router";
  import type { Operation } from "@bindings/cob/Operation";
-
  import type { RepoInfo } from "@bindings/repo/RepoInfo";
+
  import type { Embed } from "@bindings/cob/thread/Embed";
  import type { Thread } from "@bindings/cob/thread/Thread";
+
  import type { Config } from "@bindings/config/Config";
+
  import type { RepoInfo } from "@bindings/repo/RepoInfo";

  import partial from "lodash/partial";

-
  import * as roles from "@app/lib/roles";
-
  import { invoke } from "@app/lib/invoke";
  import { nodeRunning } from "@app/lib/events";
+
  import { invoke } from "@app/lib/invoke";
+
  import * as roles from "@app/lib/roles";
  import {
    explorerUrl,
    issueStatusBackgroundColor,
@@ -22,11 +22,11 @@
  } from "@app/lib/utils";

  import { announce } from "@app/components/AnnounceSwitch.svelte";
-

  import AssigneeInput from "@app/components/AssigneeInput.svelte";
  import Border from "@app/components/Border.svelte";
  import CommentComponent from "@app/components/Comment.svelte";
  import Discussion from "@app/components/Discussion.svelte";
+
  import DropdownListItem from "@app/components/DropdownListItem.svelte";
  import EditableTitle from "@app/components/EditableTitle.svelte";
  import Icon from "@app/components/Icon.svelte";
  import InlineTitle from "@app/components/InlineTitle.svelte";
@@ -34,6 +34,7 @@
  import IssueStateButton from "@app/components/IssueStateButton.svelte";
  import IssueTimeline from "@app/components/IssueTimeline.svelte";
  import LabelInput from "@app/components/LabelInput.svelte";
+
  import MoreBreadcrumbsButton from "@app/components/MoreBreadcrumbsButton.svelte";
  import NakedButton from "@app/components/NakedButton.svelte";
  import NodeBreadcrumb from "@app/components/NodeBreadcrumb.svelte";
  import Sidebar from "@app/components/Sidebar.svelte";
@@ -42,8 +43,6 @@
  import IssuesBreadcrumb from "./IssuesBreadcrumb.svelte";
  import Layout from "./Layout.svelte";
  import RepoBreadcrumb from "./RepoBreadcrumb.svelte";
-
  import MoreBreadcrumbsButton from "@app/components/MoreBreadcrumbsButton.svelte";
-
  import DropdownListItem from "@app/components/DropdownListItem.svelte";

  interface Props {
    repo: RepoInfo;
modified src/views/repo/Issues.svelte
@@ -1,27 +1,27 @@
<script lang="ts">
+
  import type { IssueStatus } from "@app/views/repo/router";
  import type { CacheEvent } from "@bindings/cob/CacheEvent";
-
  import type { Config } from "@bindings/config/Config";
  import type { Issue } from "@bindings/cob/issue/Issue";
-
  import type { IssueStatus } from "@app/views/repo/router";
+
  import type { Config } from "@bindings/config/Config";
  import type { RepoInfo } from "@bindings/repo/RepoInfo";

-
  import delay from "lodash/delay";
-
  import fuzzysort from "fuzzysort";
  import { Channel } from "@tauri-apps/api/core";
+
  import fuzzysort from "fuzzysort";
+
  import delay from "lodash/delay";

-
  import * as router from "@app/lib/router";
-
  import { explorerUrl, modifierKey } from "@app/lib/utils";
  import { invoke } from "@app/lib/invoke";
  import {
    issueCountMismatch,
    resetIssueCounts,
  } from "@app/lib/issueCounts.svelte";
+
  import * as router from "@app/lib/router";
+
  import { explorerUrl, modifierKey } from "@app/lib/utils";

  import Border from "@app/components/Border.svelte";
  import Button from "@app/components/Button.svelte";
  import Icon from "@app/components/Icon.svelte";
-
  import IssueTeaser from "@app/components/IssueTeaser.svelte";
  import IssuesSecondColumn from "@app/components/IssuesSecondColumn.svelte";
+
  import IssueTeaser from "@app/components/IssueTeaser.svelte";
  import NodeBreadcrumb from "@app/components/NodeBreadcrumb.svelte";
  import Spinner from "@app/components/Spinner.svelte";
  import TextInput from "@app/components/TextInput.svelte";
modified src/views/repo/Layout.svelte
@@ -24,8 +24,8 @@
</script>

<script lang="ts">
-
  import type { Snippet } from "svelte";
  import type { Config } from "@bindings/config/Config";
+
  import type { Snippet } from "svelte";

  import { OverlayScrollbarsComponent } from "overlayscrollbars-svelte";

modified src/views/repo/Patch.svelte
@@ -1,32 +1,31 @@
<script lang="ts">
-
  import type { Action } from "@bindings/cob/patch/Action";
-
  import type { Config } from "@bindings/config/Config";
-
  import type { DraftReview } from "@app/lib/draftReviewStorage";
+
  import type { PatchStatus } from "./router";
  import type { Operation } from "@bindings/cob/Operation";
  import type { PaginatedQuery } from "@bindings/cob/PaginatedQuery";
+
  import type { Action } from "@bindings/cob/patch/Action";
  import type { Patch } from "@bindings/cob/patch/Patch";
-
  import type { PatchStatus } from "./router";
-
  import type { RepoInfo } from "@bindings/repo/RepoInfo";
  import type { Review } from "@bindings/cob/patch/Review";
  import type { Revision } from "@bindings/cob/patch/Revision";
+
  import type { Config } from "@bindings/config/Config";
+
  import type { RepoInfo } from "@bindings/repo/RepoInfo";

  import fuzzysort from "fuzzysort";

+
  import type { DraftReview } from "@app/lib/draftReviewStorage";
+
  import { draftReviewStorage } from "@app/lib/draftReviewStorage";
+
  import { nodeRunning } from "@app/lib/events";
+
  import { invoke } from "@app/lib/invoke";
  import * as router from "@app/lib/router";
-
  import { DEFAULT_TAKE } from "./router";
-
  import { announce } from "@app/components/AnnounceSwitch.svelte";
+
  import { push } from "@app/lib/router";
  import {
    didFromPublicKey,
    explorerUrl,
    formatOid,
    verdictIcon,
  } from "@app/lib/utils";
-
  import { draftReviewStorage } from "@app/lib/draftReviewStorage";
-
  import { invoke } from "@app/lib/invoke";
  import { modifierKey } from "@app/lib/utils";
-
  import { nodeRunning } from "@app/lib/events";
-
  import { push } from "@app/lib/router";

+
  import { announce } from "@app/components/AnnounceSwitch.svelte";
  import Border from "@app/components/Border.svelte";
  import Button from "@app/components/Button.svelte";
  import CheckoutPatchButton from "@app/components/CheckoutPatchButton.svelte";
@@ -54,6 +53,7 @@
  import Layout from "./Layout.svelte";
  import PatchesBreadcrumb from "./PatchesBreadcrumb.svelte";
  import RepoBreadcrumb from "./RepoBreadcrumb.svelte";
+
  import { DEFAULT_TAKE } from "./router";

  interface Props {
    repo: RepoInfo;
modified src/views/repo/Patches.svelte
@@ -1,32 +1,32 @@
<script lang="ts">
+
  import type { PatchStatus } from "@app/views/repo/router";
  import type { CacheEvent } from "@bindings/cob/CacheEvent";
-
  import type { Config } from "@bindings/config/Config";
  import type { PaginatedQuery } from "@bindings/cob/PaginatedQuery";
  import type { Patch } from "@bindings/cob/patch/Patch";
-
  import type { PatchStatus } from "@app/views/repo/router";
+
  import type { Config } from "@bindings/config/Config";
  import type { RepoInfo } from "@bindings/repo/RepoInfo";

-
  import delay from "lodash/delay";
-
  import fuzzysort from "fuzzysort";
+
  import { DEFAULT_TAKE } from "@app/views/repo/router";
  import { Channel } from "@tauri-apps/api/core";
+
  import fuzzysort from "fuzzysort";
+
  import delay from "lodash/delay";

-
  import * as router from "@app/lib/router";
-
  import { DEFAULT_TAKE } from "@app/views/repo/router";
-
  import { explorerUrl, modifierKey } from "@app/lib/utils";
  import { invoke } from "@app/lib/invoke";
  import {
    patchCountMismatch,
    resetPatchCounts,
    updatePatchCounts,
  } from "@app/lib/patchCounts.svelte";
+
  import * as router from "@app/lib/router";
+
  import { explorerUrl, modifierKey } from "@app/lib/utils";

  import Border from "@app/components/Border.svelte";
  import Button from "@app/components/Button.svelte";
  import Icon from "@app/components/Icon.svelte";
  import NewPatchButton from "@app/components/NewPatchButton.svelte";
  import NodeBreadcrumb from "@app/components/NodeBreadcrumb.svelte";
-
  import PatchTeaser from "@app/components/PatchTeaser.svelte";
  import PatchesSecondColumn from "@app/components/PatchesSecondColumn.svelte";
+
  import PatchTeaser from "@app/components/PatchTeaser.svelte";
  import Spinner from "@app/components/Spinner.svelte";
  import TextInput from "@app/components/TextInput.svelte";

modified src/views/repo/RepoBreadcrumb.svelte
@@ -1,9 +1,9 @@
<script lang="ts">
  import { activeRouteStore } from "@app/lib/router";
-

  import { explorerUrl } from "@app/lib/utils";

  import Link from "@app/components/Link.svelte";
+

  import BreadcrumbCopyButton from "./BreadcrumbCopyButton.svelte";

  interface Props {
modified src/views/repo/router.ts
@@ -1,20 +1,20 @@
import type { Action as IssueAction } from "@bindings/cob/issue/Action";
-
import type { Action as PatchAction } from "@bindings/cob/patch/Action";
-
import type { Config } from "@bindings/config/Config";
-
import type { DraftReview } from "@app/lib/draftReviewStorage";
import type { Issue } from "@bindings/cob/issue/Issue";
import type { Operation } from "@bindings/cob/Operation";
import type { PaginatedQuery } from "@bindings/cob/PaginatedQuery";
+
import type { Action as PatchAction } from "@bindings/cob/patch/Action";
import type { Patch } from "@bindings/cob/patch/Patch";
-
import type { Readme } from "@bindings/repo/Readme";
-
import type { RepoInfo } from "@bindings/repo/RepoInfo";
import type { Review } from "@bindings/cob/patch/Review";
import type { Revision } from "@bindings/cob/patch/Revision";
import type { Thread } from "@bindings/cob/thread/Thread";
+
import type { Config } from "@bindings/config/Config";
+
import type { Readme } from "@bindings/repo/Readme";
+
import type { RepoInfo } from "@bindings/repo/RepoInfo";

-
import { didFromPublicKey, unreachable } from "@app/lib/utils";
+
import type { DraftReview } from "@app/lib/draftReviewStorage";
import { draftReviewStorage } from "@app/lib/draftReviewStorage";
import { invoke } from "@app/lib/invoke";
+
import { didFromPublicKey, unreachable } from "@app/lib/utils";

export type IssueStatus = "all" | Issue["state"]["status"];

modified tests/e2e/clipboard.spec.ts
@@ -1,6 +1,6 @@
+
import { expect, markdownRid, test } from "@tests/support/fixtures.js";
import { chromium } from "playwright";

-
import { expect, markdownRid, test } from "@tests/support/fixtures.js";
import { formatRepositoryId } from "@app/lib/utils";

// We explicitly run all clipboard tests withing the context of a single test
modified tests/e2e/repo/issue.spec.ts
@@ -1,4 +1,4 @@
-
import { test, expect, cobRid } from "@tests/support/fixtures.js";
+
import { cobRid, expect, test } from "@tests/support/fixtures.js";

test("navigate single issue", async ({ page }) => {
  await page.goto(`/repos/${cobRid}/issues?status=all`);
modified tests/e2e/repo/issues.spec.ts
@@ -1,4 +1,4 @@
-
import { test, cobRid, expect } from "@tests/support/fixtures.js";
+
import { cobRid, expect, test } from "@tests/support/fixtures.js";

test("navigate issues listing", async ({ page }) => {
  await page.goto(`/repos/${cobRid}/issues?show=all`);
modified tests/e2e/theme.spec.ts
@@ -1,4 +1,4 @@
-
import { test, expect } from "@tests/support/fixtures.js";
+
import { expect, test } from "@tests/support/fixtures.js";

test("default theme", async ({ page }) => {
  await page.goto("/repos");
modified tests/support/fixtures.ts
@@ -1,18 +1,19 @@
/* eslint-disable @typescript-eslint/naming-convention */
import type { PeerManager, RadiclePeer } from "./peerManager.js";
-
import type * as Stream from "node:stream";

import * as Fs from "node:fs/promises";
import * as Path from "node:path";
-
import { test as base, expect } from "@playwright/test";
-
import { execa } from "execa";
+
import type * as Stream from "node:stream";

+
import { expect, test as base } from "@playwright/test";
import * as issue from "@tests/support/cobs/issue.js";
-
import * as logLabel from "@tests/support/logPrefix.js";
import * as patch from "@tests/support/cobs/patch.js";
-
import { createOptions, supportDir, tmpDir } from "@tests/support/support.js";
+
import * as logLabel from "@tests/support/logPrefix.js";
import { createPeerManager } from "@tests/support/peerManager.js";
import { createRepo } from "@tests/support/repo.js";
+
import { createOptions, supportDir, tmpDir } from "@tests/support/support.js";
+
import { execa } from "execa";
+

import { formatOid } from "@app/lib/utils.js";

export { expect };
modified tests/support/globalSetup.ts
@@ -1,19 +1,20 @@
import * as Fs from "node:fs";
import * as Path from "node:path";
+

import {
-
  assertBinariesInstalled,
-
  heartwoodRelease,
-
  removeWorkspace,
-
  tmpDir,
-
} from "@tests/support/support.js";
-
import {
-
  defaultConfig,
  createCobsFixture,
  createMarkdownFixture,
+
  defaultConfig,
  defaultHttpdPort,
  gitOptions,
} from "@tests/support/fixtures.js";
import { createPeerManager } from "@tests/support/peerManager.js";
+
import {
+
  assertBinariesInstalled,
+
  heartwoodRelease,
+
  removeWorkspace,
+
  tmpDir,
+
} from "@tests/support/support.js";

const heartwoodBinaryPath = Path.join(
  tmpDir,
modified tests/support/peerManager.ts
@@ -3,16 +3,18 @@ import type * as Execa from "execa";
import * as Fs from "node:fs/promises";
import * as Os from "node:os";
import * as Path from "node:path";
+
import * as readline from "node:readline/promises";
import * as Stream from "node:stream";
import * as Util from "node:util";
-
import * as readline from "node:readline/promises";
+

+
import { type Config, defaultConfig } from "@tests/support/fixtures.js";
+
import { logPrefix } from "@tests/support/logPrefix.js";
+
import { randomTag } from "@tests/support/support.js";
+
import { execa } from "execa";
import getPort from "get-port";
import matches from "lodash/matches.js";
import waitOn from "wait-on";
-
import { defaultConfig, type Config } from "@tests/support/fixtures.js";
-
import { execa } from "execa";
-
import { logPrefix } from "@tests/support/logPrefix.js";
-
import { randomTag } from "@tests/support/support.js";
+

import { sleep } from "@app/lib/sleep.js";

export type RefsUpdate =
modified tests/support/router.ts
@@ -1,4 +1,5 @@
import type { Page } from "@playwright/test";
+

import { expect } from "@tests/support/fixtures.js";

// Reloads the current page and verifies that the URL stays correct
modified tests/support/support.ts
@@ -1,10 +1,11 @@
import type { Options } from "execa";

-
import { execa } from "execa";
import * as Crypto from "node:crypto";
-
import { fileURLToPath } from "node:url";
-
import * as Path from "node:path";
import * as Fs from "node:fs/promises";
+
import * as Path from "node:path";
+
import { fileURLToPath } from "node:url";
+

+
import { execa } from "execa";

// Generate string of 12 random characters with 8 bits of entropy.
export function randomTag(): string {
modified tests/unit/notifications.test.ts
@@ -1,8 +1,9 @@
-
import type { Action as NotificationAction } from "@app/lib/notification";
import type { Action as IssueAction } from "@bindings/cob/issue/Action";
import type { Action as PatchAction } from "@bindings/cob/patch/Action";

import { describe, expect, test } from "vitest";
+

+
import type { Action as NotificationAction } from "@app/lib/notification";
import { compressActions, createSummary } from "@app/lib/notification";
import { formatOid } from "@app/lib/utils";

modified vite.config.ts
@@ -1,7 +1,8 @@
-
import { defineConfig } from "vite";
-
import { svelte } from "@sveltejs/vite-plugin-svelte";
import path from "node:path";

+
import { svelte } from "@sveltejs/vite-plugin-svelte";
+
import { defineConfig } from "vite";
+

// https://vitejs.dev/config/
export default defineConfig({
  test: {