mirror of
https://github.com/shadcn-ui/ui.git
synced 2026-06-26 22:26:05 +00:00
* feat(v4): update home page * fix * fix: cards * feat(v4): charts page * feat: update pages * feat: colors * fix * feat: add docs * feat: mdx work * fix * fix * fix: sidebar * fix: lint * feat: updates * feat: update components * feat: fix docs * fix: responsive * feat: implement cmdk * fix: update navigation menu demo * fix: code style * fix: themes * feat: implement blocks page * fix: docs config * refactor * fix: outputFileTracingIncludes * fix * fix: output * fix * fix: registry * refactor: move docs * debug: docs * debug * revert * fix: mjs * deps: pin fumadocs * debug * fix: downgrade next * fix: index page * refactor: move mdx components * fix: remove copy button * fix * was it zod * yes it was * remove copy page * fix: color page * fix: colors page * fix: meta colors * fix: copy button * feat: sync registry * fix: registry build script * feat: update port * feat: clean up examples * fix * fix: mobile nav * fix: blur for mobile * fix: sidebar nav * feat: update examples * fix: build scripts * feat: update components * feat: restyle * fix: types * fix: styles * fix: margins * fix: screenshots * fix * feat: update theme * fix: charts nav * fix: image * feat: optimize images * fix: menu * fix: card * fix: border * check * feat: implement charts page * fix: charts * fix: og images * feat: extend touch * fix: static * fix: sizing * fix: mobile screenshots * fix: page nav * fix * feat: update favicon * fix: theme selector * fix: feedback * fix: sink * docs: update * fix: styles * chore: update registry * fix: command * fix * fix: minor updates * fix: typography on smaller devices * fix: format * fix: remove unused icon * feat: update favicon * fix: typography * docs: typography page * fix: steps
161 lines
4.4 KiB
TypeScript
161 lines
4.4 KiB
TypeScript
import fs from "fs"
|
|
import path from "path"
|
|
import { u } from "unist-builder"
|
|
import { visit } from "unist-util-visit"
|
|
|
|
import { Index } from "@/registry/__index__"
|
|
|
|
interface UnistNode {
|
|
type: string
|
|
name?: string
|
|
tagName?: string
|
|
value?: string
|
|
properties?: Record<string, unknown>
|
|
attributes?: {
|
|
name: string
|
|
value: unknown
|
|
type?: string
|
|
}[]
|
|
children?: UnistNode[]
|
|
}
|
|
|
|
export interface UnistTree {
|
|
type: string
|
|
children: UnistNode[]
|
|
}
|
|
|
|
export function rehypeComponent() {
|
|
return async (tree: UnistTree) => {
|
|
visit(tree, (node: UnistNode) => {
|
|
// src prop overrides both name and fileName.
|
|
const { value: srcPath } =
|
|
(getNodeAttributeByName(node, "src") as {
|
|
name: string
|
|
value?: string
|
|
type?: string
|
|
}) || {}
|
|
|
|
if (node.name === "ComponentSource") {
|
|
const name = getNodeAttributeByName(node, "name")?.value as string
|
|
const fileName = getNodeAttributeByName(node, "fileName")?.value as
|
|
| string
|
|
| undefined
|
|
|
|
if (!name && !srcPath) {
|
|
return null
|
|
}
|
|
|
|
try {
|
|
let src: string
|
|
|
|
if (srcPath) {
|
|
src = path.join(process.cwd(), srcPath)
|
|
} else {
|
|
const component = Index[name]
|
|
src = fileName
|
|
? component.files.find((file: unknown) => {
|
|
if (typeof file === "string") {
|
|
return (
|
|
file.endsWith(`${fileName}.tsx`) ||
|
|
file.endsWith(`${fileName}.ts`)
|
|
)
|
|
}
|
|
return false
|
|
}) || component.files[0]?.path
|
|
: component.files[0]?.path
|
|
}
|
|
|
|
// Read the source file.
|
|
const filePath = src
|
|
let source = fs.readFileSync(filePath, "utf8")
|
|
|
|
// Replace imports.
|
|
// TODO: Use @swc/core and a visitor to replace this.
|
|
// For now a simple regex should do.
|
|
source = source.replaceAll(`@/registry/new-york-v4/`, "@/components/")
|
|
source = source.replaceAll("export default", "export")
|
|
|
|
// Add code as children so that rehype can take over at build time.
|
|
node.children?.push(
|
|
u("element", {
|
|
tagName: "pre",
|
|
properties: {
|
|
__src__: src,
|
|
},
|
|
children: [
|
|
u("element", {
|
|
tagName: "code",
|
|
properties: {
|
|
className: ["language-tsx"],
|
|
},
|
|
children: [
|
|
{
|
|
type: "text",
|
|
value: source,
|
|
},
|
|
],
|
|
}),
|
|
],
|
|
})
|
|
)
|
|
} catch (error) {
|
|
console.error(error)
|
|
}
|
|
}
|
|
|
|
if (node.name === "ComponentPreview") {
|
|
const name = getNodeAttributeByName(node, "name")?.value as string
|
|
|
|
if (!name) {
|
|
return null
|
|
}
|
|
|
|
try {
|
|
const component = Index[name]
|
|
const src = component.files[0]?.path
|
|
|
|
// Read the source file.
|
|
const filePath = src
|
|
let source = fs.readFileSync(filePath, "utf8")
|
|
|
|
// Replace imports.
|
|
// TODO: Use @swc/core and a visitor to replace this.
|
|
// For now a simple regex should do.
|
|
source = source.replaceAll(`@/registry/new-york-v4/`, "@/components/")
|
|
source = source.replaceAll("export default", "export")
|
|
|
|
// Add code as children so that rehype can take over at build time.
|
|
node.children?.push(
|
|
u("element", {
|
|
tagName: "pre",
|
|
properties: {
|
|
__src__: src,
|
|
},
|
|
children: [
|
|
u("element", {
|
|
tagName: "code",
|
|
properties: {
|
|
className: ["language-tsx"],
|
|
},
|
|
children: [
|
|
{
|
|
type: "text",
|
|
value: source,
|
|
},
|
|
],
|
|
}),
|
|
],
|
|
})
|
|
)
|
|
} catch (error) {
|
|
console.error(error)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
function getNodeAttributeByName(node: UnistNode, name: string) {
|
|
return node.attributes?.find((attribute) => attribute.name === name)
|
|
}
|