From ecb31b1dffbb0b79499ef5809e529e6a4e1d07e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guilherme=20Ara=C3=BAjo?= Date: Wed, 8 Jan 2025 15:38:07 -0300 Subject: [PATCH 1/2] feat: check code blocks syntax --- apps/site/next.mdx.shiki.mjs | 31 ++++++++++++- package-lock.json | 87 ++++++++++++++++++------------------ package.json | 1 + 3 files changed, 75 insertions(+), 44 deletions(-) diff --git a/apps/site/next.mdx.shiki.mjs b/apps/site/next.mdx.shiki.mjs index 9b8c0edbb94d4..0033e043b5dce 100644 --- a/apps/site/next.mdx.shiki.mjs +++ b/apps/site/next.mdx.shiki.mjs @@ -1,5 +1,6 @@ 'use strict'; +import { parse } from 'acorn'; import classNames from 'classnames'; import { toString } from 'hast-util-to-string'; import { SKIP, visit } from 'unist-util-visit'; @@ -53,6 +54,29 @@ function isCodeBlock(node) { ); } +/** + * Check code syntax is valid. + * + * @param {string} code - The code to be checked. + * @param {string} languageId - The language id. + * @returns {boolean} + */ +function checkCodeSyntax(code, languageId) { + try { + if (!['js', 'cjs', 'mjs'].includes(languageId)) { + return true; + } + + parse(code, { + ecmaVersion: 'latest', + sourceType: languageId === 'cjs' ? 'script' : 'module', + }); + return true; + } catch { + return false; + } +} + export default function rehypeShikiji() { return function (tree) { visit(tree, 'element', (_, index, parent) => { @@ -124,7 +148,7 @@ export default function rehypeShikiji() { } }); - visit(tree, 'element', (node, index, parent) => { + visit(tree, 'element', async (node, index, parent) => { // We only want to process
...
elements if (!parent || index == null || node.tagName !== 'pre') { return; @@ -168,6 +192,11 @@ export default function rehypeShikiji() { // Grabs the relevant alias/name of the language const languageId = codeLanguage.slice(languagePrefix.length); + // Check code for syntax errors + if (!checkCodeSyntax(preElementContents, languageId)) { + throw new Error('Code block contains syntax errors'); + } + // Parses the
 contents and returns a HAST tree with the highlighted code
       const { children } = highlightToHast(preElementContents, languageId);
 
diff --git a/package-lock.json b/package-lock.json
index 569c9367d9c92..1cdc24c5fac8f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,6 +11,7 @@
         "packages/*"
       ],
       "dependencies": {
+        "acorn": "^8.14.0",
         "husky": "9.1.7",
         "lint-staged": "15.3.0",
         "turbo": "2.3.3"
@@ -5412,9 +5413,9 @@
       }
     },
     "node_modules/@swc/core": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.10.2.tgz",
-      "integrity": "sha512-d3reIYowBL6gbp4jC6FRZ3hE0eWcWwqh0XcHd6k5rKF/oZA6jLb7gxIRduJhrn+jyLz/HCC8WyfomUkEcs7iZQ==",
+      "version": "1.10.6",
+      "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.10.6.tgz",
+      "integrity": "sha512-zgXXsI6SAVwr6XsXyMnqlyLoa1lT+r09bAWI1xT3679ejWqI1Vnl14eJG0GjWYXCEMKHCNytfMq3OOQ62C39QQ==",
       "dev": true,
       "hasInstallScript": true,
       "license": "Apache-2.0",
@@ -5430,16 +5431,16 @@
         "url": "https://opencollective.com/swc"
       },
       "optionalDependencies": {
-        "@swc/core-darwin-arm64": "1.10.2",
-        "@swc/core-darwin-x64": "1.10.2",
-        "@swc/core-linux-arm-gnueabihf": "1.10.2",
-        "@swc/core-linux-arm64-gnu": "1.10.2",
-        "@swc/core-linux-arm64-musl": "1.10.2",
-        "@swc/core-linux-x64-gnu": "1.10.2",
-        "@swc/core-linux-x64-musl": "1.10.2",
-        "@swc/core-win32-arm64-msvc": "1.10.2",
-        "@swc/core-win32-ia32-msvc": "1.10.2",
-        "@swc/core-win32-x64-msvc": "1.10.2"
+        "@swc/core-darwin-arm64": "1.10.6",
+        "@swc/core-darwin-x64": "1.10.6",
+        "@swc/core-linux-arm-gnueabihf": "1.10.6",
+        "@swc/core-linux-arm64-gnu": "1.10.6",
+        "@swc/core-linux-arm64-musl": "1.10.6",
+        "@swc/core-linux-x64-gnu": "1.10.6",
+        "@swc/core-linux-x64-musl": "1.10.6",
+        "@swc/core-win32-arm64-msvc": "1.10.6",
+        "@swc/core-win32-ia32-msvc": "1.10.6",
+        "@swc/core-win32-x64-msvc": "1.10.6"
       },
       "peerDependencies": {
         "@swc/helpers": "*"
@@ -5451,9 +5452,9 @@
       }
     },
     "node_modules/@swc/core-darwin-arm64": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.10.2.tgz",
-      "integrity": "sha512-xPDbCUfGdVjA/0yhRFVSyog73wO3/W3JNgx1PkOcCc+0OgZtgAnt4YD8QbSsUE+euc5bQJs/7HfJQ3305+HWVA==",
+      "version": "1.10.6",
+      "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.10.6.tgz",
+      "integrity": "sha512-USbMvT8Rw5PvIfF6HyTm+yW84J9c45emzmHBDIWY76vZHkFsS5MepNi+JLQyBzBBgE7ScwBRBNhRx6VNhkSoww==",
       "cpu": [
         "arm64"
       ],
@@ -5468,9 +5469,9 @@
       }
     },
     "node_modules/@swc/core-darwin-x64": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.10.2.tgz",
-      "integrity": "sha512-Dm4R9ffQw4yrGjvdYxxuO5RViwkRkSsn64WF7YGYZIlhkyFoseibPnQlOsx5qnjquc8f3h1C8/806XG+y3rMaQ==",
+      "version": "1.10.6",
+      "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.10.6.tgz",
+      "integrity": "sha512-7t2IozcZN4r1p27ei+Kb8IjN4aLoBDn107fPi+aPLcVp2uFgJEUzhCDuZXBNW2057Mx1OHcjzrkaleRpECz3Xg==",
       "cpu": [
         "x64"
       ],
@@ -5485,9 +5486,9 @@
       }
     },
     "node_modules/@swc/core-linux-arm-gnueabihf": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.10.2.tgz",
-      "integrity": "sha512-aXTqgel7AueM7CcCOFFUq6+gJyD/A3rFBWxPT6wA34IC7oQ0IIFpJjBLl8zN6/0aZ4OQ1ExlQ7zoKaTlk5tBug==",
+      "version": "1.10.6",
+      "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.10.6.tgz",
+      "integrity": "sha512-CPgWT+D0bDp/qhXsLkIJ54LmKU1/zvyGaf/yz8A4iR+YoF6R5CSXENXhNJY8cIrb6+uNWJZzHJ+gefB5V51bpA==",
       "cpu": [
         "arm"
       ],
@@ -5502,9 +5503,9 @@
       }
     },
     "node_modules/@swc/core-linux-arm64-gnu": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.10.2.tgz",
-      "integrity": "sha512-HYFag6ULpnVMnHuKKAFuZH3kco/2eKKZ24I+gI2M4JlIW4soDmP8Oc2eAADIloln4SfQXzADX34m6merCWp65g==",
+      "version": "1.10.6",
+      "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.10.6.tgz",
+      "integrity": "sha512-5qZ6hVnqO/ShETXdGSzvdGUVx372qydlj1YWSYiaxQzTAepEBc8TC1NVUgYtOHOKVRkky1d7p6GQ9lymsd4bHw==",
       "cpu": [
         "arm64"
       ],
@@ -5519,9 +5520,9 @@
       }
     },
     "node_modules/@swc/core-linux-arm64-musl": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.10.2.tgz",
-      "integrity": "sha512-N8es+V+M9GijYsxfiIG3NJ+lHgoZosX+yjblc5eOx0xrBDeqH3kNLhJpctOczrJk0rUjN+zX5x+8H8qurcEAaw==",
+      "version": "1.10.6",
+      "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.10.6.tgz",
+      "integrity": "sha512-hB2xZFmXCKf2iJF5y2z01PSuLqEoUP3jIX/XlIHN+/AIP7PkSKsValE63LnjlnWPnSEI0IxUyRE3T3FzWE/fQQ==",
       "cpu": [
         "arm64"
       ],
@@ -5536,9 +5537,9 @@
       }
     },
     "node_modules/@swc/core-linux-x64-gnu": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.10.2.tgz",
-      "integrity": "sha512-fI4rxJkWQaNeG4UcuqKJrc1JM+nAwIzzFba9+A4Aohc6z0EgPokrA1v7WmPUObO+cdZjVXdMpDGkhGQhbok1aQ==",
+      "version": "1.10.6",
+      "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.10.6.tgz",
+      "integrity": "sha512-PRGPp0I22+oJ8RMGg8M4hXYxEffH3ayu0WoSDPOjfol1F51Wj1tfTWN4wVa2RibzJjkBwMOT0KGLGb/hSEDDXQ==",
       "cpu": [
         "x64"
       ],
@@ -5553,9 +5554,9 @@
       }
     },
     "node_modules/@swc/core-linux-x64-musl": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.10.2.tgz",
-      "integrity": "sha512-ycDOxBgII/2xkusMgq2S9n81IQ8SeWk1FU0zuUsZrUkaXEq/78+nHFo/0IStPLrtRxzG2gJ0JZvfaa6jMxr79Q==",
+      "version": "1.10.6",
+      "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.10.6.tgz",
+      "integrity": "sha512-SoNBxlA86lnoV9vIz/TCyakLkdRhFSHx6tFMKNH8wAhz1kKYbZfDmpYoIzeQqdTh0tpx8e/Zu1zdK4smovsZqQ==",
       "cpu": [
         "x64"
       ],
@@ -5570,9 +5571,9 @@
       }
     },
     "node_modules/@swc/core-win32-arm64-msvc": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.10.2.tgz",
-      "integrity": "sha512-s7/UrbdfYGdUar+Nj8jxNeXaFdryWnKuJU5udDONgk9gb1xp7K5TPxBL9j7EtCrAenM2sR9Bd84ZemwzyZ/VLw==",
+      "version": "1.10.6",
+      "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.10.6.tgz",
+      "integrity": "sha512-6L5Y2E+FVvM+BtoA+mJFjf/SjpFr73w2kHBxINxwH8/PkjAjkePDr5m0ibQhPXV61bTwX49+1otzTY85EsUW9Q==",
       "cpu": [
         "arm64"
       ],
@@ -5587,9 +5588,9 @@
       }
     },
     "node_modules/@swc/core-win32-ia32-msvc": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.10.2.tgz",
-      "integrity": "sha512-sz8f+dmrzb816Ji25G+vs8HMq6zHq1IMKF4hVUnSJKdNr2k789+qRjF1fnv3YDcz5kkeYSvolXqVS1mCezDebg==",
+      "version": "1.10.6",
+      "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.10.6.tgz",
+      "integrity": "sha512-kxK3tW8DJwEkAkwy0vhwoBAShRebH1QTe0mvH9tlBQ21rToVZQn+GCV/I44dind80hYPw0Tw2JKFVfoEJyBszg==",
       "cpu": [
         "ia32"
       ],
@@ -5604,9 +5605,9 @@
       }
     },
     "node_modules/@swc/core-win32-x64-msvc": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.10.2.tgz",
-      "integrity": "sha512-XXYHuc5KdhuLx1nP8cEKW+5Kakxy+iq/jcuJ52+27E2uB+xxzLeXvbPvz645je3Cti5nQ4la2HIn6tpST5ufSw==",
+      "version": "1.10.6",
+      "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.10.6.tgz",
+      "integrity": "sha512-4pJka/+t8XcHee12G/R5VWcilkp5poT2EJhrybpuREkpQ7iC/4WOlOVrohbWQ4AhDQmojYQI/iS+gdF2JFLzTQ==",
       "cpu": [
         "x64"
       ],
diff --git a/package.json b/package.json
index 17ceca5084fac..01d8cb251c6f7 100644
--- a/package.json
+++ b/package.json
@@ -35,6 +35,7 @@
     "prepare": "husky"
   },
   "dependencies": {
+    "acorn": "^8.14.0",
     "husky": "9.1.7",
     "lint-staged": "15.3.0",
     "turbo": "2.3.3"

From 7092bae6af2d9bd9d1fb406d899d1c2ef82ac296 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guilherme=20Ara=C3=BAjo?= 
Date: Wed, 8 Jan 2025 16:08:38 -0300
Subject: [PATCH 2/2] refactor: remove useless async

---
 apps/site/next.mdx.shiki.mjs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/apps/site/next.mdx.shiki.mjs b/apps/site/next.mdx.shiki.mjs
index 0033e043b5dce..f16ccb090dac2 100644
--- a/apps/site/next.mdx.shiki.mjs
+++ b/apps/site/next.mdx.shiki.mjs
@@ -148,7 +148,7 @@ export default function rehypeShikiji() {
       }
     });
 
-    visit(tree, 'element', async (node, index, parent) => {
+    visit(tree, 'element', (node, index, parent) => {
       // We only want to process 
...
elements if (!parent || index == null || node.tagName !== 'pre') { return;