{"id":14263205,"url":"https://github.com/rehypejs/rehype-twoslash","last_synced_at":"2026-03-14T13:09:00.240Z","repository":{"id":245354604,"uuid":"818318519","full_name":"rehypejs/rehype-twoslash","owner":"rehypejs","description":"plugin to process JavaScript and TypeScript code with `twoslash` and highlight it with `starry-night`","archived":false,"fork":false,"pushed_at":"2024-08-02T15:00:14.000Z","size":164,"stargazers_count":18,"open_issues_count":0,"forks_count":0,"subscribers_count":8,"default_branch":"main","last_synced_at":"2024-12-01T18:13:05.734Z","etag":null,"topics":["highlight","html","plugin","rehype","rehype-plugin","syntax","twoslash","typescript","unified"],"latest_commit_sha":null,"homepage":"https://unifiedjs.com","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rehypejs.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"license","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"unifiedjs","open_collective":"unified"}},"created_at":"2024-06-21T15:21:06.000Z","updated_at":"2024-10-02T04:12:10.000Z","dependencies_parsed_at":"2024-06-21T18:08:17.885Z","dependency_job_id":"8c124ac9-c306-4e55-ae00-cdb6875c8258","html_url":"https://github.com/rehypejs/rehype-twoslash","commit_stats":null,"previous_names":["rehypejs/rehype-twoslash"],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rehypejs%2Frehype-twoslash","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rehypejs%2Frehype-twoslash/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rehypejs%2Frehype-twoslash/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rehypejs%2Frehype-twoslash/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rehypejs","download_url":"https://codeload.github.com/rehypejs/rehype-twoslash/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":229754508,"owners_count":18119127,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["highlight","html","plugin","rehype","rehype-plugin","syntax","twoslash","typescript","unified"],"created_at":"2024-08-22T13:03:34.826Z","updated_at":"2026-03-14T13:09:00.206Z","avatar_url":"https://github.com/rehypejs.png","language":"JavaScript","funding_links":["https://github.com/sponsors/unifiedjs","https://opencollective.com/unified"],"categories":["typescript"],"sub_categories":[],"readme":"# rehype-twoslash\n\n[![Build][badge-build-image]][badge-build-url]\n[![Coverage][badge-coverage-image]][badge-coverage-url]\n[![Downloads][badge-downloads-image]][badge-downloads-url]\n[![Size][badge-size-image]][badge-size-url]\n[![Sponsors][badge-sponsors-image]][badge-collective-url]\n[![Backers][badge-backers-image]][badge-collective-url]\n[![Chat][badge-chat-image]][badge-chat-url]\n\n**[rehype][github-rehype]** plugin to process JavaScript and TypeScript code\nwith [`twoslash`][twoslash] and highlight it with\n[`starry-night`][github-starry-night].\n\n\u003c!--\n  To do: at some point, would be fun to have a `## Syntax` section that\n  describes the syntax of `twoslash`.\n--\u003e\n\n## Contents\n\n* [What is this?](#what-is-this)\n* [When should I use this?](#when-should-i-use-this)\n* [Install](#install)\n* [Use](#use)\n* [API](#api)\n  * [`Options`](#options)\n  * [`Render`](#render)\n  * [`RenderResult`](#renderresult)\n  * [`Renderers`](#renderers)\n  * [`rehypeTwoslash(options) (default)`](#rehypetwoslashoptions-default)\n* [HTML](#html)\n* [Markdown](#markdown)\n* [CSS](#css)\n* [JavaScript](#javascript)\n* [Compatibility](#compatibility)\n* [Security](#security)\n* [Related](#related)\n* [Contribute](#contribute)\n* [License](#license)\n\n## What is this?\n\nThis package is a [unified][github-unified] ([rehype][github-rehype]) plugin to\nprocess JavaScript and TypeScript code with [`twoslash`][twoslash] and\nhighlight it with [`starry-night`][github-starry-night].\n\n`twoslash` is a tool to run code through the TypeScript compiler and extract\ninfo about that code.\nInfo you also see in your editor.\nThis info can for example be type errors or type info that is shown on hover.\n`twoslash` also supports a command syntax through comments in the code,\nso an author can highlight a particular piece of code,\nignore certain errors,\nor show a specific file.\n\n`starry-night` is a beautiful syntax highlighter,\nlike what GitHub uses to highlight code,\nbut free and in JavaScript.\n\n## When should I use this?\n\nThis plugin is particularly useful for your own website or blog,\nor any place where you want to talk about JavaScript-y code,\nand want to improve the experience of your readers by showing them more\ninfo about the code.\n\nYou can combine this package with\n[`rehype-starry-night`][github-rehype-starry-night].\nThat applies syntax highlighting with `starry-night` to all code.\n\nIf you are not using remark or rehype,\nyou can instead use [`twoslash`][twoslash] directly.\nIf you don’t care for [`starry-night`][github-starry-night],\nyou can use [`@shikijs/twoslash`][github-shikijs-twoslash].\n\n## Install\n\nThis package is [ESM only][github-gist-esm].\nIn Node.js (version 16+), install with [npm][npm-install]:\n\n```sh\nnpm install rehype-twoslash\n```\n\nIn Deno with [`esm.sh`][esmsh]:\n\n```js\nimport rehypeTwoslash from 'https://esm.sh/rehype-twoslash@1'\n```\n\nIn browsers with [`esm.sh`][esmsh]:\n\n```html\n\u003cscript type=\"module\"\u003e\n  import rehypeTwoslash from 'https://esm.sh/rehype-twoslash@1?bundle'\n\u003c/script\u003e\n```\n\n## Use\n\nSay we have the following file `example.md`:\n\n````markdown\n# Jupiter\n\n```js twoslash\nconst name = 'Jupiter'\nconsole.log('Hello, ' + name + '!')\n```\n````\n\n…and our module `example.js` contains:\n\n```js\nimport rehypeStringify from 'rehype-stringify'\nimport rehypeTwoslash from 'rehype-twoslash'\nimport remarkParse from 'remark-parse'\nimport remarkRehype from 'remark-rehype'\nimport {read} from 'to-vfile'\nimport {unified} from 'unified'\n\nconst file = await read('example.md')\n\nawait unified()\n  .use(remarkParse)\n  .use(remarkRehype)\n  .use(rehypeTwoslash)\n  .use(rehypeStringify)\n  .process(file)\n\nconsole.log(String(file))\n```\n\n…then running `node example.js` yields:\n\n```html\n\u003ch1\u003eJupiter\u003c/h1\u003e\n\u003cdiv class=\"highlight highlight-js\"\u003e\n\u003cpre\u003e\u003ccode class=\"language-js\"\u003e\u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"rehype-twoslash-popover-target\" data-popover-target=\"rehype-twoslash-cnJcnJcn-0\"\u003e\u003cspan class=\"pl-c1\"\u003ename\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003eJupiter\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"rehype-twoslash-popover-target\" data-popover-target=\"rehype-twoslash-cnJcnJcn-1\"\u003e\u003cspan class=\"pl-en\"\u003econsole\u003c/span\u003e\u003c/span\u003e.\u003cspan class=\"rehype-twoslash-popover-target\" data-popover-target=\"rehype-twoslash-cnJcnJcn-2\"\u003e\u003cspan class=\"pl-c1\"\u003elog\u003c/span\u003e\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003eHello, \u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e+\u003c/span\u003e \u003cspan class=\"rehype-twoslash-popover-target\" data-popover-target=\"rehype-twoslash-cnJcnJcn-3\"\u003ename\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e+\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e!\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cdiv class=\"rehype-twoslash-hover rehype-twoslash-popover\" id=\"rehype-twoslash-cnJcnJcn-0\" popover=\"\"\u003e\u003cpre class=\"rehype-twoslash-popover-code\"\u003e\u003ccode class=\"language-ts\"\u003e\u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003ename\u003c/span\u003e\u003cspan class=\"pl-k\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eJupiter\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"rehype-twoslash-hover rehype-twoslash-popover\" id=\"rehype-twoslash-cnJcnJcn-1\" popover=\"\"\u003e\u003cpre class=\"rehype-twoslash-popover-code\"\u003e\u003ccode class=\"language-ts\"\u003e\u003cspan class=\"pl-k\"\u003evar\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003econsole\u003c/span\u003e\u003cspan class=\"pl-k\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eConsole\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"rehype-twoslash-hover rehype-twoslash-popover\" id=\"rehype-twoslash-cnJcnJcn-2\" popover=\"\"\u003e\u003cpre class=\"rehype-twoslash-popover-code\"\u003e\u003ccode class=\"language-ts\"\u003e(\u003cspan class=\"pl-smi\"\u003emethod\u003c/span\u003e) \u003cspan class=\"pl-c1\"\u003eConsole\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003elog\u003c/span\u003e(\u003cspan class=\"pl-k\"\u003e...\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003edata\u003c/span\u003e: \u003cspan class=\"pl-smi\"\u003eany\u003c/span\u003e[]): \u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003cdiv class=\"rehype-twoslash-popover-description\"\u003e\u003cp\u003e\u003ca href=\"https://developer.mozilla.org/docs/Web/API/console/log_static\"\u003eMDN Reference\u003c/a\u003e\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cdiv class=\"rehype-twoslash-hover rehype-twoslash-popover\" id=\"rehype-twoslash-cnJcnJcn-3\" popover=\"\"\u003e\u003cpre class=\"rehype-twoslash-popover-code\"\u003e\u003ccode class=\"language-ts\"\u003e\u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003ename\u003c/span\u003e\u003cspan class=\"pl-k\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eJupiter\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/div\u003e\n```\n\nWith some [CSS][section-css] and [JavaScript][section-javascript] that could\nlook like this:\n\n\u003cpicture\u003e\n  \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"screenshot-dark.jpg\"\u003e\n  \u003cimg alt=\"\" src=\"screenshot-light.jpg\"\u003e\n\u003c/picture\u003e\n\n## API\n\n### `Options`\n\nConfiguration for `rehype-twoslash`.\n\n###### Notes\n\n`rehype-twoslash` runs on `\u003ccode\u003e` elements with a `twoslash` directive.\nThat directive can be passed as a word in markdown (` ```ts twoslash `) or\nas a class in HTML (`\u003ccode class=\"language-ts twoslash\"\u003e`).\n\nThe inverse occurs when `directive` is `false`.\nAll `\u003ccode\u003e` where the language class is JavaScript or TypeScript is\nprocessed.\nThen `no-twoslash` (` ```ts no-twoslash `,\n`\u003ccode class=\"language-ts no-twoslash\"\u003e`) can be used to prevent processing.\n\n###### Fields\n\n* `directive?` (`boolean | null | undefined`)\n  — whether to require a `twoslash` directive (default: `true`)\n* `grammars?` (`ReadonlyArray\u003cGrammar\u003e | null | undefined`)\n  — grammars for `starry-night` to support (default:\n  `[sourceJson, sourceJs, sourceTsx, sourceTs]`)\n* `idPrefix?` (`string | null | undefined`)\n  — prefix before IDs (default: `'rehype-twoslash-'`)\n* `renderers?` (`Renderers | null | undefined`)\n  — renderers for `twoslash` annotations (optional)\n* `twoslash?` (`TwoslashOptions | null | undefined`)\n  — options passed to `twoslash` (optional);\n  this includes fields such as `cache`,\n  `customTransformers`,\n  and `filterNode`;\n  see\n  [`TwoslashOptions` from `twoslash`](https://github.com/twoslashes/twoslash/blob/1eb3af3/packages/twoslash/src/types/options.ts#L18)\n  for more info\n\n### `Render`\n\nRender function.\n\nTakes a particular annotation from the TypeScript compiler (such as an error)\nand turns it into `hast` (HTML) content.\nSee `lib/render.js` for examples.\n\n###### Notes\n\nYou can return `Array\u003cElementContent\u003e` directly instead of a `RenderResult`\nwhen you don’t have content for a footer.\n\n###### Type\n\n```ts\n(\n  state: State,\n  annotation: Annotation,\n  children: Array\u003cElementContent\u003e\n) =\u003e Array\u003cElementContent\u003e | RenderResult\n```\n\n### `RenderResult`\n\nResult from `Render`.\n\n###### Fields\n\n* `content?` (`Array\u003cElementContent\u003e | undefined`)\n  — main inline content to use in the code block;\n  for example a `\u003cspan\u003e` that causes a tooltip to show\n* `footer?` (`Array\u003cElementContent\u003e | undefined`)\n  — extra content to use that relates to the code block;\n  for example a `\u003cdiv\u003e` for a tooltip\n\n### `Renderers`\n\nRenderers.\n\nEach key is a type of an annotation (such as `error` or `hover`) and each\nvalue a corresponding render function.\n\n###### Type\n\n```ts\n{ completion?: Render\u003cNodeCompletion\u003e | null | undefined; error?: Render\u003cNodeError\u003e | null | undefined; highlight?: Render\u003cNodeHighlight\u003e | null | undefined; hover?: Render\u003c...\u003e | ... 1 more ... | undefined; query?: Render\u003c...\u003e | ... 1 more ... | undefined; }\n```\n\n### `rehypeTwoslash(options) (default)`\n\nPlugin to process JavaScript and TypeScript code with `twoslash`\nand highlight it with `starry-night`.\n\n###### Parameters\n\n* `options?` (`Readonly\u003cOptions\u003e | null | undefined`)\n  — configuration (optional)\n\n###### Returns\n\nTransform (`(tree: Root, file: VFile) =\u003e Promise\u003cRoot\u003e`).\n\n## HTML\n\nOn the input side,\nthis plugin looks for code blocks with a `twoslash` class.\nSo:\n\n```html\n\u003cpre\u003e\u003ccode class=\"language-ts twoslash\"\u003econsole.log('Hello, Mercury!')\u003c/code\u003e\u003c/pre\u003e\n```\n\nIt will warn when that class is used with a programming language that\n`twoslash` does not understand (such as Rust).\n\nIf you want to process all JavaScript and TypeScript code blocks,\nyou can set `directive: false` in options.\nThen the `language-*` class is enough and no directive is needed.\nYou can still prevent processing of a particular block with a `no-twoslash`\nclass:\n\n```html\n\u003cpre\u003e\u003ccode class=\"language-ts no-twoslash\"\u003econsole.log('Hello, Mars!')\u003c/code\u003e\u003c/pre\u003e\n```\n\nOn the output side,\nthis plugin generates markup that can be enhanced with\n[CSS][section-css] and [JavaScript][section-javascript] into tooltips and\nmore.\nYou can also choose to generate different HTML by passing custom render\nfunctions in `options.renderers`.\n\nTo illustrate,\nhere is an example of a tooltip target for the identifier in a variable\ndeclaration (`const name = …`):\n\n```html\n\u003cspan\n  class=\"rehype-twoslash-popover-target\"\n  data-popover-target=\"rehype-twoslash-cnJcnJcn-3\"\n\u003e\u003cspan class=\"pl-c1\"\u003ename\u003c/span\u003e\u003c/span\u003e\n```\n\nIt has a corresponding tooltip:\n\n```html\n\u003cdiv\n  class=\"rehype-twoslash-hover rehype-twoslash-popover\"\n  id=\"rehype-twoslash-cnJcnJcn-3\"\n  popover=\"\"\n\u003e\n  \u003cpre class=\"rehype-twoslash-popover-code\"\u003e\u003ccode class=\"language-ts\"\u003e\u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003ename\u003c/span\u003e\u003cspan class=\"pl-k\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eJupiter\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\n\u003c/div\u003e\n```\n\nObserve that there are sufficient classes to hook into with CSS and JavaScript\nand that unique identifiers connect the popover and its popover target together.\n\n## Markdown\n\nWhen combined with [`remark-parse`][github-remark-parse] and\n[`remark-rehype`][github-remark-rehype],\nthis plugin works similarly on markdown to how it does on HTML as described\nabove.\nIt then understands the `twoslash` and `no-twoslash` word in the info string,\nright after the language.\nTo illustrate:\n\n````markdown\n```ts twoslash\nconsole.log('Hello, Venus!')\n```\n\n```ts no-twoslash\nconsole.log('Hello, Earth!')\n```\n````\n\n## CSS\n\nThis plugin generates sufficient classes that can be styled with CSS.\nWhich ones to use and how to style them depends on the rest of your website\nand your heart’s desire.\nTo illustrate,\nsee [`demo/index.css`][file-demo-css].\nBut get creative!\n\n## JavaScript\n\nThis plugin generates markup that needs to be made interactive with JavaScript.\nWhat to do exactly,\nand how to do it,\ndepends on your website and your preferences.\nFor inspiration,\nsee [`demo/index.js`][file-demo-js].\n\n## Compatibility\n\nProjects maintained by the unified collective are compatible with maintained\nversions of Node.js.\n\nWhen we cut a new major release, we drop support for unmaintained versions of\nNode.\nThis means we try to keep the current release line, `rehype-twoslash@1`,\ncompatible with Node.js 16.\n\n## Security\n\nUse of `rehype-twoslash` is likely not safe on arbitrary user content,\nas it passes code through the TypeScript compiler,\nwhich I assume has some access to the file system and there might be ways to\nexploit it.\n\n## Related\n\n* [`rehype-starry-night`](https://github.com/rehypejs/rehype-starry-night)\n  — apply syntax highlighting with `starry-night` to all code\n\n## Contribute\n\nSee [`contributing.md`][health-contributing] in [`rehypejs/.github`][health]\nfor ways to get started.\nSee [`support.md`][health-support] for ways to get help.\n\nThis project has a [code of conduct][health-coc].\nBy interacting with this repository, organization, or community you agree to\nabide by its terms.\n\n## License\n\n[MIT][file-license] © [Titus Wormer][wooorm]\n\n\u003c!-- Definitions --\u003e\n\n[badge-backers-image]: https://opencollective.com/unified/backers/badge.svg\n\n[badge-build-image]: https://github.com/rehypejs/rehype-twoslash/actions/workflows/main.yml/badge.svg\n\n[badge-build-url]: https://github.com/rehypejs/rehype-twoslash/actions\n\n[badge-collective-url]: https://opencollective.com/unified\n\n[badge-coverage-image]: https://img.shields.io/codecov/c/github/rehypejs/rehype-twoslash.svg\n\n[badge-coverage-url]: https://codecov.io/github/rehypejs/rehype-twoslash\n\n[badge-downloads-image]: https://img.shields.io/npm/dm/rehype-twoslash.svg\n\n[badge-downloads-url]: https://www.npmjs.com/package/rehype-twoslash\n\n[badge-size-image]: https://img.shields.io/bundlejs/size/rehype-twoslash\n\n[badge-size-url]: https://bundlejs.com/?q=rehype-twoslash\n\n[badge-sponsors-image]: https://opencollective.com/unified/sponsors/badge.svg\n\n[badge-chat-image]: https://img.shields.io/badge/chat-discussions-success.svg\n\n[badge-chat-url]: https://github.com/rehypejs/rehype/discussions\n\n[esmsh]: https://esm.sh\n\n[file-demo-css]: demo/index.css\n\n[file-demo-js]: demo/index.js\n\n[file-license]: license\n\n[github-gist-esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c\n\n[github-rehype]: https://github.com/rehypejs/rehype\n\n[github-rehype-starry-night]: https://github.com/rehypejs/rehype-starry-night\n\n[github-remark-parse]: https://github.com/remarkjs/remark/tree/main/packages/remark-parse\n\n[github-remark-rehype]: https://github.com/remarkjs/remark-rehype\n\n[github-shikijs-twoslash]: https://github.com/shikijs/shiki/tree/main/packages/twoslash\n\n[github-starry-night]: https://github.com/wooorm/starry-night\n\n[github-unified]: https://github.com/unifiedjs/unified\n\n[health-coc]: https://github.com/rehypejs/.github/blob/main/code-of-conduct.md\n\n[health-contributing]: https://github.com/rehypejs/.github/blob/main/contributing.md\n\n[health-support]: https://github.com/rehypejs/.github/blob/main/support.md\n\n[health]: https://github.com/rehypejs/.github\n\n[npm-install]: https://docs.npmjs.com/cli/install\n\n[section-css]: #css\n\n[section-javascript]: #javascript\n\n[twoslash]: https://twoslash.netlify.app\n\n[wooorm]: https://wooorm.com\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frehypejs%2Frehype-twoslash","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frehypejs%2Frehype-twoslash","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frehypejs%2Frehype-twoslash/lists"}