Core: Support bun in remark-install plugin

This commit is contained in:
Fuma Nama
2024-04-03 14:40:01 +08:00
parent ba641d6b5a
commit bbad52ff65
7 changed files with 74 additions and 54 deletions
+5
View File
@@ -0,0 +1,5 @@
---
"fumadocs-core": patch
---
Support `bun` in `remark-install` plugin
-1
View File
@@ -15,7 +15,6 @@
"@next/env": "^14.1.4",
"algoliasearch": "^4.23.2",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.0",
"fumadocs-core": "workspace:*",
"fumadocs-mdx": "workspace:*",
"fumadocs-twoslash": "workspace:^",
+1
View File
@@ -122,6 +122,7 @@
"github-slugger": "^2.0.0",
"hast-util-to-estree": "^3.1.0",
"negotiator": "^0.6.3",
"npm-to-yarn": "^2.2.1",
"react-remove-scroll": "^2.5.9",
"remark": "^15.0.0",
"remark-gfm": "^4.0.0",
+23 -16
View File
@@ -1,11 +1,16 @@
import type { Code, Root } from 'mdast';
import type { Transformer } from 'unified';
import { visit } from 'unist-util-visit';
import convert from 'npm-to-yarn';
type PackageManager = (name: string) => {
packageManager: string;
command: string;
};
interface PackageManager {
name: string;
/**
* Convert from npm to another package manager
*/
command: (command: string) => string;
}
export type RemarkInstallOptions = Partial<{
Tabs: string;
@@ -13,12 +18,13 @@ export type RemarkInstallOptions = Partial<{
packageManagers: PackageManager[];
}>;
// todo: Extract to separate package
/**
* It generates the following structure from a code block with `package-install` as language
*
* @example
* ```tsx
* <Tabs items={["pnpm", "npm", "yarn"]}>
* <Tabs items={["npm", "pnpm", "yarn", "bun"]}>
* <Tab value="pnpm">...</Tab>
* ...
* </Tabs>
@@ -28,16 +34,19 @@ export function remarkInstall({
Tab = 'Tab',
Tabs = 'Tabs',
packageManagers = [
(name) => ({ command: `npm install ${name}`, packageManager: 'npm' }),
(name) => ({ command: `pnpm add ${name}`, packageManager: 'pnpm' }),
(name) => ({ command: `yarn add ${name}`, packageManager: 'yarn' }),
{ command: (cmd) => convert(cmd, 'npm'), name: 'npm' },
{ command: (cmd) => convert(cmd, 'pnpm'), name: 'pnpm' },
{ command: (cmd) => convert(cmd, 'yarn'), name: 'yarn' },
{ command: (cmd) => convert(cmd, 'bun'), name: 'bun' },
],
}: RemarkInstallOptions = {}): Transformer<Root, Root> {
return (tree) => {
visit(tree, 'code', (node) => {
if (node.lang !== 'package-install') return 'skip';
const managers = packageManagers.map((manager) => manager(node.value));
const value = node.value.startsWith('npm')
? node.value
: `npm install ${node.value}`;
const insert = {
type: 'mdxJsxFlowElement',
@@ -55,9 +64,9 @@ export function remarkInstall({
type: 'ExpressionStatement',
expression: {
type: 'ArrayExpression',
elements: managers.map(({ packageManager }) => ({
elements: packageManagers.map(({ name }) => ({
type: 'Literal',
value: packageManager,
value: name,
})),
},
},
@@ -67,17 +76,15 @@ export function remarkInstall({
},
},
],
children: managers.map(({ command, packageManager }) => ({
children: packageManagers.map(({ command, name }) => ({
type: 'mdxJsxFlowElement',
name: Tab,
attributes: [
{ type: 'mdxJsxAttribute', name: 'value', value: packageManager },
],
attributes: [{ type: 'mdxJsxAttribute', name: 'value', value: name }],
children: [
{
type: 'code',
lang: 'bash',
value: command,
value: command(value),
} satisfies Code,
],
})),
+9 -1
View File
@@ -8,7 +8,7 @@ function _createMdxContent(props) {
if (!Tab) _missingMdxReference("Tab", true);
if (!Tabs) _missingMdxReference("Tabs", true);
return _jsxs(Tabs, {
items: ["npm", "pnpm", "yarn"],
items: ["npm", "pnpm", "yarn", "bun"],
children: [_jsx(Tab, {
value: "npm",
children: _jsx(_components.pre, {
@@ -33,6 +33,14 @@ function _createMdxContent(props) {
children: "yarn add next\n"
})
})
}), _jsx(Tab, {
value: "bun",
children: _jsx(_components.pre, {
children: _jsx(_components.code, {
className: "language-bash",
children: "bun add next\n"
})
})
})]
});
}
-1
View File
@@ -102,7 +102,6 @@
"@radix-ui/react-tabs": "^1.0.4",
"@tailwindcss/typography": "^0.5.12",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.0",
"cmdk": "^1.0.0",
"fumadocs-core": "workspace:*",
"lucide-react": "^0.363.0",
+36 -35
View File
@@ -1,9 +1,5 @@
lockfileVersion: '6.0'
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
overrides:
'@opentelemetry/api': ^1.4.1
remark-rehype: ^11.0.0
@@ -61,9 +57,6 @@ importers:
class-variance-authority:
specifier: ^0.7.0
version: 0.7.0
clsx:
specifier: ^2.1.0
version: 2.1.0
fumadocs-core:
specifier: workspace:*
version: link:../../packages/core
@@ -296,6 +289,9 @@ importers:
negotiator:
specifier: ^0.6.3
version: 0.6.3
npm-to-yarn:
specifier: ^2.2.1
version: 2.2.1
react:
specifier: '>= 18'
version: 18.2.0
@@ -658,9 +654,6 @@ importers:
class-variance-authority:
specifier: ^0.7.0
version: 0.7.0
clsx:
specifier: ^2.1.0
version: 2.1.0
cmdk:
specifier: ^1.0.0
version: 1.0.0(@types/[email protected])(@types/[email protected])([email protected])([email protected])
@@ -1364,6 +1357,10 @@ packages:
peerDependencies:
'@effect-ts/otel-node': '*'
peerDependenciesMeta:
'@effect-ts/core':
optional: true
'@effect-ts/otel':
optional: true
'@effect-ts/otel-node':
optional: true
dependencies:
@@ -1401,7 +1398,7 @@ packages:
resolution: {integrity: sha512-47gAg0O2pW5Jlo86jfzjdkwL5a7Bzb+Kj5WTmdu4CxYRfWn9ytKjuuYIfsNDW8neuhdKzn+P5wCddgEh0glYyQ==}
peerDependencies:
'@effect-ts/core': ^0.60.2
'@opentelemetry/api': ^1.4.1
'@opentelemetry/api': ^1.4.0
'@opentelemetry/core': ^1.13.0
'@opentelemetry/exporter-trace-otlp-grpc': ^0.39.0
'@opentelemetry/sdk-trace-base': ^1.13.0
@@ -1417,7 +1414,7 @@ packages:
resolution: {integrity: sha512-a2sF0ylmn8xOJs8fNeT/spJ1gUcsksAJCALxo9WOfuTCMtTwMVtVhCKEPEeQoL7wFqU+JgPkVdP91+FJ/Rkeow==}
peerDependencies:
'@effect-ts/core': ^0.60.2
'@opentelemetry/api': ^1.4.1
'@opentelemetry/api': ^1.4.0
'@opentelemetry/core': ^1.13.0
'@opentelemetry/sdk-trace-base': ^1.13.0
'@opentelemetry/sdk-trace-node': ^1.13.0
@@ -1433,7 +1430,7 @@ packages:
resolution: {integrity: sha512-AmZJHl7t0+Peh7Yb2+hqn6r9+rd9/UfeA4AMV9h0YGTdOyouyFfD3wzWlxnAUzAQ4Lrod4kC7Noruret4EpqpA==}
peerDependencies:
'@effect-ts/core': ^0.60.2
'@opentelemetry/api': ^1.4.1
'@opentelemetry/api': ^1.4.0
'@opentelemetry/core': ^1.13.0
'@opentelemetry/sdk-trace-base': ^1.13.0
dependencies:
@@ -2251,7 +2248,7 @@ packages:
resolution: {integrity: sha512-bDIRCgpKniSyhORU0fTL9ISW6ucU9nruKyXKwYrEBep/2f3uLz8LFyF51ZUK9QxIwBHw6WJudK/2UqttWzER4w==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.4.1
'@opentelemetry/api': '>=1.0.0 <1.7.0'
dependencies:
'@opentelemetry/api': 1.6.0
@@ -2259,7 +2256,7 @@ packages:
resolution: {integrity: sha512-2dBX3Sj99H96uwJKvc2w9NOiNgbvAO6mOFJFramNkKfS9O4Um+VWgpnlAazoYjT6kUJ1MP70KQ5ngD4ed+4NUw==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.4.1
'@opentelemetry/api': '>=1.0.0 <1.5.0'
dependencies:
'@opentelemetry/api': 1.6.0
'@opentelemetry/semantic-conventions': 1.13.0
@@ -2268,7 +2265,7 @@ packages:
resolution: {integrity: sha512-tfnl3h+UefCgx1aeN2xtrmr6BmdWGKXypk0pflQR0urFS40aE88trnkOMc2HTJZbMrqEEl4HsaBeFhwLVXsrJg==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.4.1
'@opentelemetry/api': '>=1.0.0 <1.7.0'
dependencies:
'@opentelemetry/api': 1.6.0
'@opentelemetry/semantic-conventions': 1.17.0
@@ -2277,7 +2274,7 @@ packages:
resolution: {integrity: sha512-l5RhLKx6U+yuLhMrtgavTDthX50E1mZM3/SSySC7OPZiArFHV/b/9x9jxAzrOgIQUDxyj4N0V9aLKSA2t7Qzxg==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.4.1
'@opentelemetry/api': ^1.0.0
dependencies:
'@grpc/grpc-js': 1.9.3
'@opentelemetry/api': 1.6.0
@@ -2291,7 +2288,7 @@ packages:
resolution: {integrity: sha512-Pv5X8fbi6jD/RJBePyn7MnCSuE6MbPB6dl+7YYBWJ5RcMGYMwvLXjd4h2jWsPV2TSUg38H/RoSP0aXvQ06Y7iw==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.4.1
'@opentelemetry/api': ^1.0.0
dependencies:
'@opentelemetry/api': 1.6.0
'@opentelemetry/core': 1.13.0(@opentelemetry/[email protected])
@@ -2300,7 +2297,7 @@ packages:
resolution: {integrity: sha512-u3ErFRQqQFKjjIMuwLWxz/tLPYInfmiAmSy//fGSCzCh2ZdJgqQjMOAxBgqFtCF2xFL+OmMhyuC2ThMzceGRWA==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.4.1
'@opentelemetry/api': ^1.0.0
dependencies:
'@grpc/grpc-js': 1.9.3
'@opentelemetry/api': 1.6.0
@@ -2312,7 +2309,7 @@ packages:
resolution: {integrity: sha512-0hgVnXXz5efI382B/24NxD4b6Zxlh7nxCdJkxkdmQMbn0yRiwoq/ZT+QG8eUL6JNzsBAV1WJlF5aJNsL8skHvw==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.4.1
'@opentelemetry/api': '>=1.3.0 <1.5.0'
dependencies:
'@opentelemetry/api': 1.6.0
'@opentelemetry/api-logs': 0.39.1
@@ -2326,7 +2323,7 @@ packages:
resolution: {integrity: sha512-oklstXImtaly4vDaL+rGtX41YXZR50jp5a7CSEPMcStp1B7ozdZ5G2I5wftrDvOlOcLt/TIkGWDCr/OkVN7kWg==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.4.1
'@opentelemetry/api': '>=1.0.0 <1.7.0'
dependencies:
'@opentelemetry/api': 1.6.0
'@opentelemetry/core': 1.17.0(@opentelemetry/[email protected])
@@ -2335,7 +2332,7 @@ packages:
resolution: {integrity: sha512-iZzu8K0QkZZ16JH9yox6hZk7/Rxc4SPeGU37pvlB9DtzfNxAEX1FMK9zvowv3ve7r2uzZNpa7JGVUwpy5ewdHQ==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.4.1
'@opentelemetry/api': '>=1.0.0 <1.7.0'
dependencies:
'@opentelemetry/api': 1.6.0
'@opentelemetry/core': 1.17.0(@opentelemetry/[email protected])
@@ -2344,7 +2341,7 @@ packages:
resolution: {integrity: sha512-euqjOkiN6xhjE//0vQYGvbStxoD/WWQRhDiO0OTLlnLBO9Yw2Gd/VoSx2H+svsebjzYk5OxLuREBmcdw6rbUNg==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.4.1
'@opentelemetry/api': '>=1.0.0 <1.5.0'
dependencies:
'@opentelemetry/api': 1.6.0
'@opentelemetry/core': 1.13.0(@opentelemetry/[email protected])
@@ -2354,7 +2351,7 @@ packages:
resolution: {integrity: sha512-+u0ciVnj8lhuL/qGRBPeVYvk7fL+H/vOddfvmOeJaA1KC+5/3UED1c9KoZQlRsNT5Kw1FaK8LkY2NVLYfOVZQw==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.4.1
'@opentelemetry/api': '>=1.0.0 <1.7.0'
dependencies:
'@opentelemetry/api': 1.6.0
'@opentelemetry/core': 1.17.0(@opentelemetry/[email protected])
@@ -2364,7 +2361,7 @@ packages:
resolution: {integrity: sha512-/gmgKfZ1ZVFporKuwsewqIyvaUIGpv76JZ7lBpHQQPb37IMpaXO6pdqFI4ebHAWfNIm3akMyhmdtzivcgF3lgw==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.4.1
'@opentelemetry/api': '>=1.4.0 <1.5.0'
'@opentelemetry/api-logs': '>=0.38.0'
dependencies:
'@opentelemetry/api': 1.6.0
@@ -2376,7 +2373,7 @@ packages:
resolution: {integrity: sha512-MOjZX6AnSOqLliCcZUrb+DQKjAWXBiGeICGbHAGe5w0BB18PJIeIo995lO5JSaFfHpmUMgJButTPfJJD27W3Vg==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.4.1
'@opentelemetry/api': '>=1.3.0 <1.5.0'
dependencies:
'@opentelemetry/api': 1.6.0
'@opentelemetry/core': 1.13.0(@opentelemetry/[email protected])
@@ -2387,7 +2384,7 @@ packages:
resolution: {integrity: sha512-moTiQtc0uPR1hQLt6gLDJH9IIkeBhgRb71OKjNHZPE1VF45fHtD6nBDi5J/DkTHTwYP5X3kBJLa3xN7ub6J4eg==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.4.1
'@opentelemetry/api': '>=1.0.0 <1.5.0'
dependencies:
'@opentelemetry/api': 1.6.0
'@opentelemetry/core': 1.13.0(@opentelemetry/[email protected])
@@ -2398,7 +2395,7 @@ packages:
resolution: {integrity: sha512-2T5HA1/1iE36Q9eg6D4zYlC4Y4GcycI1J6NsHPKZY9oWfAxWsoYnRlkPfUqyY5XVtocCo/xHpnJvGNHwzT70oQ==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.4.1
'@opentelemetry/api': '>=1.0.0 <1.7.0'
dependencies:
'@opentelemetry/api': 1.6.0
'@opentelemetry/core': 1.17.0(@opentelemetry/[email protected])
@@ -2409,7 +2406,7 @@ packages:
resolution: {integrity: sha512-Twlaje+t16b5j62CfcaKU869rP9oyBG/sVQWBI5+kDaWuP/YIFnF4LbovaEahK9GwAnW8vPIn6iYLAl/jZBidA==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.4.1
'@opentelemetry/api': '>=1.0.0 <1.7.0'
dependencies:
'@opentelemetry/api': 1.6.0
'@opentelemetry/context-async-hooks': 1.17.0(@opentelemetry/[email protected])
@@ -4687,11 +4684,6 @@ packages:
engines: {node: '>=6'}
dev: false
/[email protected]:
resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==}
engines: {node: '>=6'}
dev: false
/[email protected](@types/[email protected])(@types/[email protected])([email protected])([email protected]):
resolution: {integrity: sha512-gDzVf0a09TvoJ5jnuPvygTB77+XdOSwEmJ88L6XPFPlv7T3RxbP9jgenfylrAMD0+Le1aO0nVjQUzl2g+vjz5Q==}
peerDependencies:
@@ -8327,7 +8319,7 @@ packages:
engines: {node: '>=18.17.0'}
hasBin: true
peerDependencies:
'@opentelemetry/api': ^1.4.1
'@opentelemetry/api': ^1.1.0
react: ^18.2.0
react-dom: ^18.2.0
sass: ^1.3.0
@@ -8401,6 +8393,11 @@ packages:
path-key: 4.0.0
dev: true
/[email protected]:
resolution: {integrity: sha512-O/j/ROyX0KGLG7O6Ieut/seQ0oiTpHF2tXAcFbpdTLQFiaNtkyTXXocM1fwpaa60dg1qpWj0nHlbNhx6qwuENQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dev: false
/[email protected]:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
@@ -11175,3 +11172,7 @@ packages:
/[email protected]:
resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false