@@ -98,7 +99,10 @@ export {
{React.string("Write in ReScript")}
- {HighlightJs.renderHLJS(~darkmode=true, ~code=example.res, ~lang="res", ())}
+
//Right Side (JavaScript)
@@ -109,14 +113,17 @@ export {
{React.string("Compile to JavaScript")}
- {HighlightJs.renderHLJS(~darkmode=true, ~code=example.js, ~lang="js", ())}
+
/* ---Link to Playground--- */
{React.string("Edit this example in Playground")}
@@ -683,7 +690,7 @@ module CuratedResources = {
}
@react.component
-let make = (~components=MarkdownComponents.default) => {
+let make = (~components=MarkdownComponents.default, ~highlightedExample: highlightedExample) => {
<>
{
-
+
diff --git a/apps/docs/app/routes/LandingPage.resi b/apps/docs/app/routes/LandingPage.resi
index 65f28d025..fef9f9086 100644
--- a/apps/docs/app/routes/LandingPage.resi
+++ b/apps/docs/app/routes/LandingPage.resi
@@ -1,2 +1,17 @@
+type example = {
+ res: string,
+ js: string,
+}
+
+type highlightedExample = {
+ res: string,
+ js: string,
+}
+
+let playgroundExample: example
+
@react.component
-let make: (~components: MarkdownComponents.t=?) => React.element
+let make: (
+ ~components: MarkdownComponents.t=?,
+ ~highlightedExample: highlightedExample,
+) => React.element
diff --git a/apps/docs/app/routes/LandingPageRoute.res b/apps/docs/app/routes/LandingPageRoute.res
index bf5446708..c96812b71 100644
--- a/apps/docs/app/routes/LandingPageRoute.res
+++ b/apps/docs/app/routes/LandingPageRoute.res
@@ -1,5 +1,17 @@
+type loaderData = LandingPage.highlightedExample
+
+let loader: ReactRouter.Loader.t = async _ => {
+ let {res, js} = LandingPage.playgroundExample
+ let highlightedExample: LandingPage.highlightedExample = {
+ res: ShikiHighlighter.highlight(~code=res, ~language="rescript"),
+ js: ShikiHighlighter.highlight(~code=js, ~language="javascript"),
+ }
+ highlightedExample
+}
+
let default = () => {
+ let highlightedExample = ReactRouter.useLoaderData()
<>
-
+
>
}
diff --git a/apps/docs/app/routes/LandingPageRoute.resi b/apps/docs/app/routes/LandingPageRoute.resi
index 5f02c123c..caa64bfd9 100644
--- a/apps/docs/app/routes/LandingPageRoute.resi
+++ b/apps/docs/app/routes/LandingPageRoute.resi
@@ -1 +1,5 @@
+type loaderData = LandingPage.highlightedExample
+
+let loader: ReactRouter.Loader.t
+
let default: unit => React.element
diff --git a/apps/docs/package.json b/apps/docs/package.json
index 3baad8db8..69da05e2c 100644
--- a/apps/docs/package.json
+++ b/apps/docs/package.json
@@ -68,6 +68,7 @@
"remark-gfm": "^4.0.1",
"remark-validate-links": "^13.1.0",
"rescript": "^12.2.0",
+ "shiki": "^4.4.3",
"tinyglobby": "^0.2.15",
"unified": "^11.0.5",
"vfile-matter": "^5.0.1"
diff --git a/apps/docs/src/bindings/ShikiHighlighter.res b/apps/docs/src/bindings/ShikiHighlighter.res
new file mode 100644
index 000000000..6665fb376
--- /dev/null
+++ b/apps/docs/src/bindings/ShikiHighlighter.res
@@ -0,0 +1,2 @@
+@module("../server/ShikiHighlighter.js")
+external highlight: (~code: string, ~language: string) => string = "highlight"
diff --git a/apps/docs/src/server/ShikiHighlighter.js b/apps/docs/src/server/ShikiHighlighter.js
new file mode 100644
index 000000000..f0280365f
--- /dev/null
+++ b/apps/docs/src/server/ShikiHighlighter.js
@@ -0,0 +1,32 @@
+import { createHighlighterCoreSync, hastToHtml } from "shiki/core";
+import { createJavaScriptRegexEngine } from "shiki/engine/javascript";
+import javascript from "@shikijs/langs/javascript";
+import githubDark from "@shikijs/themes/github-dark";
+
+// Vendored from rescript-vscode at commit 76d30468cb05401c10dd1e9dcf5a2993f8fc7140.
+// https://github.com/rescript-lang/rescript-vscode/blob/76d30468cb05401c10dd1e9dcf5a2993f8fc7140/grammars/rescript.tmLanguage.json
+import rescriptGrammar from "./rescript.tmLanguage.json" with { type: "json" };
+
+const highlighter = createHighlighterCoreSync({
+ engine: createJavaScriptRegexEngine(),
+ langs: [
+ javascript,
+ {
+ ...rescriptGrammar,
+ name: "rescript",
+ aliases: ["res"],
+ },
+ ],
+ themes: [githubDark],
+});
+
+export const highlight = (code, language) => {
+ const tree = highlighter.codeToHast(code, {
+ lang: language,
+ theme: "github-dark",
+ });
+ const pre = tree.children[0];
+ const codeElement = pre.children[0];
+
+ return codeElement.children.map((child) => hastToHtml(child)).join("");
+};
diff --git a/apps/docs/src/server/rescript.tmLanguage.json b/apps/docs/src/server/rescript.tmLanguage.json
new file mode 100644
index 000000000..7a5bade0f
--- /dev/null
+++ b/apps/docs/src/server/rescript.tmLanguage.json
@@ -0,0 +1,563 @@
+{
+ "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
+ "name": "ReScript",
+ "scopeName": "source.rescript",
+ "repository": {
+ "RE_KEYWORD_CONTROL": {
+ "name": "keyword.control",
+ "match": "\\b(and|as|assert|async|await|catch|constraint|downto|else|exception|external|for|if|in|lazy|mutable|rec|switch|to|try|when|while|with|private)\\b"
+ },
+ "RE_TO_DOWNTO_AS_LABELS": {
+ "patterns": [
+ {
+ "match": "~(to|downto)\\s*(=)",
+ "captures": {
+ "1": {
+ "name": "variable"
+ },
+ "2": {
+ "name": "keyword.operator keyword"
+ }
+ }
+ },
+ {
+ "match": "~(to|downto)\\s+(as)",
+ "captures": {
+ "1": {
+ "name": "variable"
+ },
+ "2": {
+ "name": "keyword.control"
+ }
+ }
+ }
+ ]
+ },
+ "RE_CONSTANTS_BOOL": {
+ "name": "constant.language.boolean",
+ "match": "\\b(false|true)\\b"
+ },
+ "RE_KEYWORD": {
+ "name": "storage.type",
+ "match": "\\b(include|let|module|of|open|type)\\b"
+ },
+ "commentLine": {
+ "match": "//.*",
+ "name": "comment.line"
+ },
+ "commentBlock": {
+ "name": "comment.block",
+ "begin": "/\\*",
+ "end": "\\*/",
+ "patterns": [
+ {
+ "include": "#commentBlock"
+ }
+ ]
+ },
+ "punctuation": {
+ "patterns": [
+ {
+ "match": "~",
+ "name": "punctuation.definition.keyword"
+ },
+ {
+ "match": ";",
+ "name": "punctuation.terminator"
+ },
+ {
+ "match": "\\.",
+ "name": "punctuation.accessor"
+ },
+ {
+ "match": "\\,",
+ "name": "punctuation.separator"
+ },
+ {
+ "match": "\\?|:",
+ "name": "punctuation.separator"
+ },
+ {
+ "match": "\\|(?!\\|)",
+ "name": "punctuation.separator"
+ },
+ {
+ "match": "\\{",
+ "name": "punctuation.section.braces.begin"
+ },
+ {
+ "match": "\\}",
+ "name": "punctuation.section.braces.end"
+ },
+ {
+ "match": "\\[",
+ "name": "punctuation.section.brackets.begin"
+ },
+ {
+ "match": "\\]",
+ "name": "punctuation.section.brackets.end"
+ },
+ {
+ "match": "\\(",
+ "name": "punctuation.section.parens.begin"
+ },
+ {
+ "match": "\\)",
+ "name": "punctuation.section.parens.end"
+ }
+ ]
+ },
+ "keyword": {
+ "patterns": [
+ {
+ "include": "#RE_TO_DOWNTO_AS_LABELS"
+ },
+ {
+ "include": "#RE_KEYWORD_CONTROL"
+ },
+ {
+ "include": "#RE_KEYWORD"
+ }
+ ]
+ },
+ "constant": {
+ "patterns": [
+ {
+ "include": "#RE_CONSTANTS_BOOL"
+ }
+ ]
+ },
+ "string-character-escape": {
+ "name": "constant.character.escape",
+ "match": "\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|u{[0-9A-Fa-f]+}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.|$)"
+ },
+ "string": {
+ "patterns": [
+ {
+ "name": "string.quoted.double",
+ "begin": "\"",
+ "end": "\"",
+ "beginCaptures": {
+ "1": {
+ "name": "punctuation.definition.string.begin"
+ }
+ },
+ "endCaptures": {
+ "1": {
+ "name": "punctuation.definition.string.end"
+ }
+ },
+ "patterns": [
+ {
+ "include": "#string-character-escape"
+ }
+ ]
+ },
+ {
+ "name": "string.template",
+ "begin": "([a-z_][0-9a-zA-Z_]*)?(`)",
+ "end": "(?",
+ "name": "storage.type.function keyword.declaration.function"
+ }
+ ]
+ },
+ "character": {
+ "patterns": [
+ {
+ "match": "'[\\x00-\\x7F]'",
+ "name": "string.quoted.single"
+ }
+ ]
+ },
+ "typeParameter": {
+ "patterns": [
+ {
+ "match": "'[A-Za-z][A-Za-z0-9_]*",
+ "name": "support.type"
+ }
+ ]
+ },
+ "defaultIdIsVariable": {
+ "patterns": [
+ {
+ "match": "[A-Za-z_][A-Za-z0-9_]*",
+ "name": "variable"
+ }
+ ]
+ },
+ "number": {
+ "patterns": [
+ {
+ "match": "\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]+)?([eE][-+]?[0-9_]+)?)?)\\b",
+ "name": "constant.numeric"
+ }
+ ]
+ },
+ "operator": {
+ "patterns": [
+ {
+ "match": "->|\\|\\||&&|\\+\\+|\\*\\*|\\+\\.|\\+|-\\.|-|\\*\\.|\\*|/\\.|/|\\.\\.\\.|\\.\\.|===|==|\\^|:=|!|>=(?! *\\?)|<=|=",
+ "name": "keyword.operator"
+ },
+ {
+ "match": "\\|>",
+ "name": "invalid.deprecated"
+ }
+ ]
+ },
+ "constructor": {
+ "patterns": [
+ {
+ "match": "\\b[A-Z][0-9a-zA-Z_]*\\b",
+ "name": "variable.other.enummember"
+ },
+ {
+ "match": "(#)\\s*([a-zA-Z][0-9a-zA-Z_]*)\\b",
+ "captures": {
+ "1": {
+ "name": "variable.other.enummember"
+ },
+ "2": {
+ "name": "variable.other.enummember"
+ }
+ }
+ },
+ {
+ "match": "(#)\\s*(\\.\\.\\.)\\b",
+ "captures": {
+ "1": {
+ "name": "variable.other.enummember"
+ },
+ "2": {
+ "name": "variable.other.enummember"
+ }
+ }
+ },
+ {
+ "match": "(#)",
+ "captures": {
+ "1": {
+ "name": "variable.other.enummember"
+ }
+ }
+ }
+ ]
+ },
+ "entity-literal": {
+ "patterns": [
+ {
+ "match": "\\b(list|dict)(\\{)",
+ "captures": {
+ "1": {
+ "name": "keyword"
+ },
+ "2": {
+ "name": "punctuation.section.braces.begin"
+ }
+ }
+ },
+ {
+ "match": "\\}",
+ "name": "punctuation.section.braces.end"
+ }
+ ]
+ },
+ "attribute": {
+ "patterns": [
+ {
+ "match": "(%%?|@@?)([A-Za-z_][A-Za-z0-9_\\.]*)",
+ "captures": {
+ "1": {
+ "name": "punctuation.decorator"
+ },
+ "2": {
+ "patterns": [
+ {
+ "match": "bs\\.send\\.pipe",
+ "name": "invalid.deprecated"
+ },
+ {
+ "match": "splice",
+ "name": "invalid.illegal"
+ },
+ {
+ "match": "(bs\\.)?([A-Za-z_][A-Za-z0-9_\\.]*)",
+ "captures": {
+ "1": {
+ "name": "invalid.deprecated"
+ },
+ "2": {
+ "name": "entity.name.function"
+ }
+ }
+ },
+ {
+ "match": "[A-Za-z_][A-Za-z0-9_\\.]*",
+ "name": "entity.name.function"
+ }
+ ]
+ }
+ }
+ }
+ ]
+ },
+ "jsx": {
+ "patterns": [
+ {
+ "match": "<>|>||/>",
+ "name": "punctuation.definition.tag"
+ },
+ {
+ "match": "([A-Z_][0-9a-zA-Z_]*)",
+ "captures": {
+ "0": {
+ "name": "punctuation.definition.tag"
+ },
+ "1": {
+ "name": "entity.name.class"
+ }
+ }
+ },
+ {
+ "match": "([a-z_][0-9a-zA-Z_]*)",
+ "captures": {
+ "0": {
+ "name": "punctuation.definition.tag"
+ },
+ "1": {
+ "name": "variable"
+ }
+ }
+ },
+ {
+ "match": "<([A-Z_][0-9a-zA-Z_]*)",
+ "captures": {
+ "0": {
+ "name": "punctuation.definition.tag"
+ },
+ "1": {
+ "name": "entity.name.class"
+ }
+ }
+ }
+ ]
+ },
+ "openOrIncludeModule": {
+ "patterns": [
+ {
+ "match": "\\b(open|include)\\s+([A-Z_][0-9a-zA-Z_]*((\\.)([A-Z_][0-9a-zA-Z_]*))*)",
+ "captures": {
+ "1": {
+ "name": "keyword"
+ },
+ "2": {
+ "patterns": [
+ {
+ "include": "#moduleAccessEndsWithModule"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "match": "\\b(open|include)\\s+",
+ "name": "keyword"
+ }
+ ]
+ },
+ "moduleAccessEndsWithModule": {
+ "patterns": [
+ {
+ "match": "[A-Z_][0-9a-zA-Z_]*",
+ "name": "entity.name.class"
+ },
+ {
+ "match": "(\\.)([A-Z_][0-9a-zA-Z_]*)",
+ "captures": {
+ "1": {
+ "name": "punctuation.accessor"
+ },
+ "2": {
+ "name": "entity.name.class"
+ }
+ }
+ }
+ ]
+ },
+ "moduleAccess": {
+ "patterns": [
+ {
+ "match": "\\b([A-Z_][0-9a-zA-Z_]*)(\\.)",
+ "captures": {
+ "1": {
+ "name": "entity.name.class"
+ },
+ "2": {
+ "name": "punctuation.accessor"
+ }
+ }
+ }
+ ]
+ },
+ "moduleDeclaration": {
+ "patterns": [
+ {
+ "match": "\\b(module)\\s+(type\\s+)?(of\\s+)?([A-Z_][0-9a-zA-Z_]*)",
+ "captures": {
+ "1": {
+ "name": "keyword"
+ },
+ "2": {
+ "name": "keyword"
+ },
+ "3": {
+ "name": "keyword"
+ },
+ "4": {
+ "name": "entity.name.class"
+ }
+ },
+ "patterns": [
+ {
+ "match": "\\s*:\\s*([A-Z_][0-9a-zA-Z_]*)",
+ "captures": {
+ "1": {
+ "name": "entity.name.class"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "ffi": {
+ "name": "source.embedded.javascript",
+ "contentName": "meta.embedded.block.javascript",
+ "begin": "(%|%%)(raw|ffi)(\\()(`)",
+ "end": "(`)(\\))",
+ "beginCaptures": {
+ "1": {
+ "name": "punctuation.decorator"
+ },
+ "2": {
+ "name": "entity.name.function"
+ },
+ "4": {
+ "name": "punctuation.definition.string.template.begin.embedded-js"
+ }
+ },
+ "endCaptures": {
+ "1": {
+ "name": "punctuation.definition.string.template.end.embedded-js"
+ }
+ },
+ "patterns": [
+ {
+ "include": "source.js"
+ }
+ ]
+ },
+ "ffi-single": {
+ "name": "source.embedded.javascript.single",
+ "match": "(%|%%)(raw|ffi)(\\()(`)(.*?)(`)(\\))",
+ "captures": {
+ "1": {
+ "name": "punctuation.decorator"
+ },
+ "2": {
+ "name": "entity.name.function"
+ },
+ "4": {
+ "name": "punctuation.definition.string.template.begin.embedded-js"
+ },
+ "5": {
+ "patterns": [
+ {
+ "include": "source.js"
+ }
+ ]
+ },
+ "6": {
+ "name": "punctuation.definition.string.template.end.embedded-js"
+ }
+ }
+ }
+ },
+ "patterns": [
+ { "include": "#ffi-single" },
+ { "include": "#ffi" },
+ { "include": "#constant" },
+ { "include": "#commentLine" },
+ { "include": "#commentBlock" },
+ { "include": "#character" },
+ { "include": "#typeParameter" },
+ { "include": "#string" },
+ { "include": "#attribute" },
+ { "include": "#function" },
+ { "include": "#entity-literal" },
+ { "include": "#jsx" },
+ { "include": "#operator" },
+ { "include": "#number" },
+ { "include": "#openOrIncludeModule" },
+ { "include": "#moduleDeclaration" },
+ { "include": "#moduleAccess" },
+ { "include": "#constructor" },
+ { "include": "#keyword" },
+ { "include": "#punctuation" },
+ { "include": "#defaultIdIsVariable" }
+ ]
+}
diff --git a/apps/docs/test-utils/LandingPageFixture.res b/apps/docs/test-utils/LandingPageFixture.res
new file mode 100644
index 000000000..ad6afb87b
--- /dev/null
+++ b/apps/docs/test-utils/LandingPageFixture.res
@@ -0,0 +1,4 @@
+let highlightedExample: LandingPage.highlightedExample = {
+ res: ShikiHighlighter.highlight(~code=LandingPage.playgroundExample.res, ~language="rescript"),
+ js: ShikiHighlighter.highlight(~code=LandingPage.playgroundExample.js, ~language="javascript"),
+}
diff --git a/yarn.lock b/yarn.lock
index c220bc1fe..c307238e9 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1974,6 +1974,7 @@ __metadata:
remark-validate-links: "npm:^13.1.0"
rescript: "npm:^12.2.0"
search-insights: "npm:^2.17.3"
+ shiki: "npm:^4.4.3"
tailwindcss: "npm:^4"
tinyglobby: "npm:^0.2.15"
to-vfile: "npm:^8.0.0"
@@ -2257,6 +2258,86 @@ __metadata:
languageName: node
linkType: hard
+"@shikijs/core@npm:4.4.3":
+ version: 4.4.3
+ resolution: "@shikijs/core@npm:4.4.3"
+ dependencies:
+ "@shikijs/primitive": "npm:4.4.3"
+ "@shikijs/types": "npm:4.4.3"
+ "@shikijs/vscode-textmate": "npm:^10.0.2"
+ "@types/hast": "npm:^3.0.5"
+ hast-util-to-html: "npm:^9.0.5"
+ checksum: 10c0/6ee90d70d9c2b98cadd11c1b9174851f8e761d5a47cf9723d7070546c936135e3faf1bccb9249d489e04963ffcadd07fad48385953057cbd40de49d7fd1f93a3
+ languageName: node
+ linkType: hard
+
+"@shikijs/engine-javascript@npm:4.4.3":
+ version: 4.4.3
+ resolution: "@shikijs/engine-javascript@npm:4.4.3"
+ dependencies:
+ "@shikijs/types": "npm:4.4.3"
+ "@shikijs/vscode-textmate": "npm:^10.0.2"
+ oniguruma-to-es: "npm:^4.3.6"
+ checksum: 10c0/22e611a783950dccb72c45c699d423897378d9bb85681fea6de2dda93e9fe238ade93c530ebe6b7c229ba23817fc64797ddecb314af4ea1e9e317f6167ee4d82
+ languageName: node
+ linkType: hard
+
+"@shikijs/engine-oniguruma@npm:4.4.3":
+ version: 4.4.3
+ resolution: "@shikijs/engine-oniguruma@npm:4.4.3"
+ dependencies:
+ "@shikijs/types": "npm:4.4.3"
+ "@shikijs/vscode-textmate": "npm:^10.0.2"
+ checksum: 10c0/119f5a7e0b660c5d3b5a15a1fb564ca8705e2e6b533e766dfd3124faf3bf3abd869c1fcf70be9b4b04865ae8d8bcb75d4185defacb2a5e1bfa66eea5d0a7d465
+ languageName: node
+ linkType: hard
+
+"@shikijs/langs@npm:4.4.3":
+ version: 4.4.3
+ resolution: "@shikijs/langs@npm:4.4.3"
+ dependencies:
+ "@shikijs/types": "npm:4.4.3"
+ checksum: 10c0/3150ca6b69440511bab56b089a28228206012003e105739509728964108ac7fdce36b3637f4927de401e6960bad88298a68699b92b6021e5afe8eca4102876e7
+ languageName: node
+ linkType: hard
+
+"@shikijs/primitive@npm:4.4.3":
+ version: 4.4.3
+ resolution: "@shikijs/primitive@npm:4.4.3"
+ dependencies:
+ "@shikijs/types": "npm:4.4.3"
+ "@shikijs/vscode-textmate": "npm:^10.0.2"
+ "@types/hast": "npm:^3.0.5"
+ checksum: 10c0/ecee74fca715882eb7dd9de0d7fd5816592285606aa21428abd87dcb5929a065638b2edf275c4199dc69191a4a719c337f522bec9c6dacfe0b63bba5fcc34a38
+ languageName: node
+ linkType: hard
+
+"@shikijs/themes@npm:4.4.3":
+ version: 4.4.3
+ resolution: "@shikijs/themes@npm:4.4.3"
+ dependencies:
+ "@shikijs/types": "npm:4.4.3"
+ checksum: 10c0/69b8e1f1125d493854361e9b31e89b6d7fa14df65600b07e41b581a20e2d24b5291fea4ca4ee4186186c99e8bd3d67cc4569bbf517e6372c9329d556e36ed004
+ languageName: node
+ linkType: hard
+
+"@shikijs/types@npm:4.4.3":
+ version: 4.4.3
+ resolution: "@shikijs/types@npm:4.4.3"
+ dependencies:
+ "@shikijs/vscode-textmate": "npm:^10.0.2"
+ "@types/hast": "npm:^3.0.5"
+ checksum: 10c0/ba8f0f38332d9bf44298e47acc5bf8229025464ed2dce38deddd1198d5d69a195792b29a6800bf2dfb89db67ae6d70720a48340b5ed5a4c33afebd364cca8ab7
+ languageName: node
+ linkType: hard
+
+"@shikijs/vscode-textmate@npm:^10.0.2":
+ version: 10.0.2
+ resolution: "@shikijs/vscode-textmate@npm:10.0.2"
+ checksum: 10c0/36b682d691088ec244de292dc8f91b808f95c89466af421cf84cbab92230f03c8348649c14b3251991b10ce632b0c715e416e992dd5f28ff3221dc2693fd9462
+ languageName: node
+ linkType: hard
+
"@sindresorhus/is@npm:^7.0.2":
version: 7.1.1
resolution: "@sindresorhus/is@npm:7.1.1"
@@ -2543,6 +2624,15 @@ __metadata:
languageName: node
linkType: hard
+"@types/hast@npm:^3.0.5":
+ version: 3.0.5
+ resolution: "@types/hast@npm:3.0.5"
+ dependencies:
+ "@types/unist": "npm:*"
+ checksum: 10c0/f3af8594a6903a507ed191eda944af18099198d6708c29102ae17118c3e20779f6929e91ed37e033541fd28d58055d8a5910a4366dbdf976cf81b13a464741fb
+ languageName: node
+ linkType: hard
+
"@types/hosted-git-info@npm:^3.0.0":
version: 3.0.5
resolution: "@types/hosted-git-info@npm:3.0.5"
@@ -5427,7 +5517,7 @@ __metadata:
languageName: node
linkType: hard
-"hast-util-to-html@npm:^9.0.0":
+"hast-util-to-html@npm:^9.0.0, hast-util-to-html@npm:^9.0.5":
version: 9.0.5
resolution: "hast-util-to-html@npm:9.0.5"
dependencies:
@@ -8163,6 +8253,24 @@ __metadata:
languageName: node
linkType: hard
+"oniguruma-parser@npm:^0.12.2":
+ version: 0.12.2
+ resolution: "oniguruma-parser@npm:0.12.2"
+ checksum: 10c0/fe5255d2cd5a6b845d5a0abe1725898ef40cea5522290dba6ccc08cc388891e9e8007af4baa5059942b786ad44b2b677ef25948039c9ba3f057bd35d2c52076a
+ languageName: node
+ linkType: hard
+
+"oniguruma-to-es@npm:^4.3.6":
+ version: 4.3.6
+ resolution: "oniguruma-to-es@npm:4.3.6"
+ dependencies:
+ oniguruma-parser: "npm:^0.12.2"
+ regex: "npm:^6.1.0"
+ regex-recursion: "npm:^6.0.2"
+ checksum: 10c0/044e08b98e706987c2882ccf228de2a671de4aff33e3bd370da137ba599c0d520549625ad26ecc8898502445c991e19f106f584e94382262ba2af02c908ca3cf
+ languageName: node
+ linkType: hard
+
"open@npm:11.0.0":
version: 11.0.0
resolution: "open@npm:11.0.0"
@@ -8987,6 +9095,31 @@ __metadata:
languageName: node
linkType: hard
+"regex-recursion@npm:^6.0.2":
+ version: 6.0.2
+ resolution: "regex-recursion@npm:6.0.2"
+ dependencies:
+ regex-utilities: "npm:^2.3.0"
+ checksum: 10c0/68e8b6889680e904b75d7f26edaf70a1a4dc1087406bff53face4c2929d918fd77c72223843fe816ac8ed9964f96b4160650e8d5909e26a998c6e9de324dadb1
+ languageName: node
+ linkType: hard
+
+"regex-utilities@npm:^2.3.0":
+ version: 2.3.0
+ resolution: "regex-utilities@npm:2.3.0"
+ checksum: 10c0/78c550a80a0af75223244fff006743922591bd8f61d91fef7c86b9b56cf9bbf8ee5d7adb6d8991b5e304c57c90103fc4818cf1e357b11c6c669b782839bd7893
+ languageName: node
+ linkType: hard
+
+"regex@npm:^6.1.0":
+ version: 6.1.0
+ resolution: "regex@npm:6.1.0"
+ dependencies:
+ regex-utilities: "npm:^2.3.0"
+ checksum: 10c0/6e0ee2a1c17d5a66dc1120dfc51899dedf6677857e83a0df4d5a822ebb8645a54a079772efc1ade382b67aad35e4e22b5bd2d33c05ed28b0e000f8f57eb0aec1
+ languageName: node
+ linkType: hard
+
"regexp.prototype.flags@npm:^1.5.4":
version: 1.5.4
resolution: "regexp.prototype.flags@npm:1.5.4"
@@ -9687,6 +9820,22 @@ __metadata:
languageName: node
linkType: hard
+"shiki@npm:^4.4.3":
+ version: 4.4.3
+ resolution: "shiki@npm:4.4.3"
+ dependencies:
+ "@shikijs/core": "npm:4.4.3"
+ "@shikijs/engine-javascript": "npm:4.4.3"
+ "@shikijs/engine-oniguruma": "npm:4.4.3"
+ "@shikijs/langs": "npm:4.4.3"
+ "@shikijs/themes": "npm:4.4.3"
+ "@shikijs/types": "npm:4.4.3"
+ "@shikijs/vscode-textmate": "npm:^10.0.2"
+ "@types/hast": "npm:^3.0.5"
+ checksum: 10c0/deff32ff8069de44c8b0f11296088eafa9cece8e3aa0817b4a52637a31f291d4da08f1133f19bea1a976dda026386862cd131f37bfe6562c1b15932d25ee460e
+ languageName: node
+ linkType: hard
+
"side-channel-list@npm:^1.0.0":
version: 1.0.0
resolution: "side-channel-list@npm:1.0.0"