Radish alpha
r
rad:z4V1sjrXqjvFdnCUbxPFqd5p4DtH5
Radicle web interface
Radicle
Git
Display correct error message when file to be loaded is too big
Merged did:key:z6MkkfM3...sVz5 opened 2 years ago
6 files changed +54 -36 3bf25fe8 8c069387
modified package-lock.json
@@ -25,7 +25,6 @@
        "marked-linkify-it": "^3.1.9",
        "md5": "^2.3.0",
        "plausible-tracker": "^0.3.8",
-
        "sinon": "^17.0.1",
        "svelte": "^4.2.12",
        "twemoji": "^14.0.2",
        "zod": "^3.22.4"
@@ -54,6 +53,7 @@
        "happy-dom": "^14.3.8",
        "prettier": "^3.2.5",
        "prettier-plugin-svelte": "^3.2.2",
+
        "sinon": "^17.0.1",
        "svelte-check": "^3.6.8",
        "typescript": "^5.4.3",
        "vite": "^5.2.6",
@@ -937,6 +937,7 @@
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
      "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
+
      "dev": true,
      "dependencies": {
        "type-detect": "4.0.8"
      }
@@ -945,6 +946,7 @@
      "version": "11.2.2",
      "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz",
      "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==",
+
      "dev": true,
      "dependencies": {
        "@sinonjs/commons": "^3.0.0"
      }
@@ -953,6 +955,7 @@
      "version": "8.0.0",
      "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz",
      "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==",
+
      "dev": true,
      "dependencies": {
        "@sinonjs/commons": "^2.0.0",
        "lodash.get": "^4.4.2",
@@ -963,6 +966,7 @@
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz",
      "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==",
+
      "dev": true,
      "dependencies": {
        "type-detect": "4.0.8"
      }
@@ -970,7 +974,8 @@
    "node_modules/@sinonjs/text-encoding": {
      "version": "0.7.2",
      "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz",
-
      "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ=="
+
      "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==",
+
      "dev": true
    },
    "node_modules/@sveltejs/vite-plugin-svelte": {
      "version": "3.0.2",
@@ -2023,6 +2028,7 @@
      "version": "5.2.0",
      "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
      "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
+
      "dev": true,
      "engines": {
        "node": ">=0.3.1"
      }
@@ -2778,6 +2784,7 @@
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+
      "dev": true,
      "engines": {
        "node": ">=8"
      }
@@ -3174,7 +3181,8 @@
    "node_modules/just-extend": {
      "version": "6.2.0",
      "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz",
-
      "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw=="
+
      "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==",
+
      "dev": true
    },
    "node_modules/katex": {
      "version": "0.16.10",
@@ -3298,7 +3306,8 @@
    "node_modules/lodash.get": {
      "version": "4.4.2",
      "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
-
      "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ=="
+
      "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
+
      "dev": true
    },
    "node_modules/lodash.merge": {
      "version": "4.6.2",
@@ -3641,6 +3650,7 @@
      "version": "5.1.9",
      "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.9.tgz",
      "integrity": "sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==",
+
      "dev": true,
      "dependencies": {
        "@sinonjs/commons": "^3.0.0",
        "@sinonjs/fake-timers": "^11.2.2",
@@ -3809,7 +3819,8 @@
    "node_modules/path-to-regexp": {
      "version": "6.2.1",
      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz",
-
      "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw=="
+
      "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==",
+
      "dev": true
    },
    "node_modules/path-type": {
      "version": "4.0.0",
@@ -4350,6 +4361,7 @@
      "version": "17.0.1",
      "resolved": "https://registry.npmjs.org/sinon/-/sinon-17.0.1.tgz",
      "integrity": "sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==",
+
      "dev": true,
      "dependencies": {
        "@sinonjs/commons": "^3.0.0",
        "@sinonjs/fake-timers": "^11.2.2",
@@ -4501,6 +4513,7 @@
      "version": "7.2.0",
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+
      "dev": true,
      "dependencies": {
        "has-flag": "^4.0.0"
      },
@@ -4756,6 +4769,7 @@
      "version": "4.0.8",
      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
      "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+
      "dev": true,
      "engines": {
        "node": ">=4"
      }
modified package.json
@@ -39,6 +39,7 @@
    "happy-dom": "^14.3.8",
    "prettier": "^3.2.5",
    "prettier-plugin-svelte": "^3.2.2",
+
    "sinon": "^17.0.1",
    "svelte-check": "^3.6.8",
    "typescript": "^5.4.3",
    "vite": "^5.2.6",
@@ -63,7 +64,6 @@
    "marked-linkify-it": "^3.1.9",
    "md5": "^2.3.0",
    "plausible-tracker": "^0.3.8",
-
    "sinon": "^17.0.1",
    "svelte": "^4.2.12",
    "twemoji": "^14.0.2",
    "zod": "^3.22.4"
modified src/components/Placeholder.svelte
@@ -12,6 +12,7 @@
<style>
  .placeholder {
    align-items: center;
+
    text-align: center;
    color: var(--color-foreground-dim);
    display: flex;
    flex-direction: column;
@@ -26,5 +27,8 @@

<div class="placeholder" class:inline>
  <Icon name={iconName} size={iconSize} />
-
  {caption}
+
  {#each caption.split("\n") as line}
+
    {line}
+
    <br />
+
  {/each}
</div>
modified src/views/projects/Source.svelte
@@ -195,6 +195,13 @@
            blob={blobResult.blob}
            highlighted={blobResult.highlighted}
            rawPath={rawPath(tree.lastCommit.id)} />
+
        {:else if blobResult.error.status === 413}
+
          <div class="placeholder">
+
            <Placeholder
+
              iconName="exclamation-circle"
+
              caption="This file is too big to be displayed.
+
              If you want to explore this file clone this repository locally." />
+
          </div>
        {:else if path === "/"}
          <div class="placeholder">
            <Placeholder iconName="no-file" caption="No README found." />
modified src/views/projects/router.ts
@@ -198,7 +198,7 @@ export type ProjectLoadedRoute =

export type BlobResult =
  | { ok: true; blob: Blob; highlighted: Syntax.Root | undefined }
-
  | { ok: false; error: { message: string; path: string } };
+
  | { ok: false; error: { status?: number; message: string; path: string } };

export type PatchView =
  | {
@@ -477,8 +477,17 @@ async function loadBlob(
        ? await Syntax.highlight(blob.content, blob.path.split(".").pop() ?? "")
        : undefined,
    };
-
  } catch {
-
    if (path === "/") {
+
  } catch (e: unknown) {
+
    if (e instanceof ResponseError) {
+
      return {
+
        ok: false,
+
        error: {
+
          status: e.status,
+
          message: "Not able to load file",
+
          path,
+
        },
+
      };
+
    } else if (path === "/") {
      return {
        ok: false,
        error: {
modified vite.config.ts
@@ -42,32 +42,16 @@ export default defineConfig({
    outDir: "build",
    rollupOptions: {
      output: {
-
        manualChunks: {
-
          markdown: [
-
            "@radicle/gray-matter",
-
            "dompurify",
-
            "hast-util-to-dom",
-
            "hast-util-to-html",
-
            "katex",
-
            "marked",
-
          ],
-
          syntax: ["@wooorm/starry-night"],
-
          grammarsTsx: [
-
            "@wooorm/starry-night/source.ts",
-
            "@wooorm/starry-night/source.tsx",
-
          ],
-
          grammars: [
-
            "@wooorm/starry-night/source.python",
-
            "@wooorm/starry-night/source.js",
-
            "@wooorm/starry-night/source.perl",
-
            "@wooorm/starry-night/source.haskell",
-
            "@wooorm/starry-night/source.ruby",
-
            "@wooorm/starry-night/source.css",
-
            "@wooorm/starry-night/source.solidity",
-
            "@wooorm/starry-night/source.cs",
-
            "@wooorm/starry-night/source.swift",
-
          ],
-
          dom: ["svelte", "twemoji"],
+
        manualChunks: id => {
+
          if (id.includes("lodash")) {
+
            return "lodash";
+
          } else if (id.includes("katex")) {
+
            return "katex";
+
          } else if (id.includes("node_modules")) {
+
            return "vendor";
+
          } else if (id.includes("components")) {
+
            return "components";
+
          }
        },
      },
    },