Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,10 @@
},
"resolutions": {
"vite": "^6"
},
"dependenciesMeta": {
"@modelcontextprotocol/sdk@1.24.3": {
"unplugged": true
}
}
}
158 changes: 158 additions & 0 deletions shared/design/convertStoryToMdx.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
import { promises as fs } from "node:fs"
import path from "node:path"
import { fileURLToPath } from "node:url"

type WalkOptions = {
filterExts?: Set<string>
}

const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)

async function walk(dir: string, opts: WalkOptions = {}): Promise<string[]> {
const out: string[] = []
const entries = await fs.readdir(dir, { withFileTypes: true })
for (const e of entries) {
if (e.name.startsWith(".")) continue // skip hidden
const full = path.join(dir, e.name)
if (e.isDirectory()) {
out.push(...(await walk(full, opts)))
} else if (e.isFile()) {
if (opts.filterExts) {
const ext = path.extname(e.name).toLowerCase()
if (!opts.filterExts.has(ext)) continue
}
out.push(full)
}
}
return out
}

function longestBacktickRun(s: string): number {
let max = 0
let cur = 0
for (let i = 0; i < s.length; i++) {
if (s[i] === "`") {
cur++
if (cur > max) max = cur
} else {
cur = 0
}
}
return max
}

function codeFenceFor(content: string): string {
const longest = longestBacktickRun(content)
const len = Math.max(3, longest + 1)
return "`".repeat(len)
}

function languageForExt(ext: string): string {
switch (ext) {
case ".ts":
return "ts"
case ".tsx":
return "tsx"
case ".js":
return "js"
case ".jsx":
return "jsx"
case ".md":
return "md"
case ".mdx":
return "mdx"
case ".css":
return "css"
case ".json":
return "json"
default:
return ""
}
}

async function ensureDir(p: string) {
await fs.mkdir(p, { recursive: true })
}

async function fileExists(p: string) {
try {
await fs.stat(p)
return true
} catch {
return false
}
}

async function generateMDX(inputFile: string, inBase: string, outBase: string) {
const rel = path.relative(inBase, inputFile)
const srcExt = path.extname(inputFile)
const baseName = path.basename(inputFile)
const language = languageForExt(srcExt)
const content = await fs.readFile(inputFile, "utf8")
const fence = codeFenceFor(content)

const frontmatter = [
"---",
`title: ${baseName}`,
`source: ${path.join("src/stories", rel).replaceAll("\\", "/")}`,
`generated: ${new Date().toISOString()}`,
"---",
"",
].join("\n")

const heading = `# ${baseName}\n\n`
const codeBlock = [
`${fence}${language ? language : ""}`.trimEnd(),
`// Source: ${path.join("src/stories", rel).replaceAll("\\", "/")}`,
content,
fence,
"",
].join("\n")

const mdx = frontmatter + heading + codeBlock

const relOut = rel.replace(/\.[^.]+$/, ".mdx")
const outFile = path.join(outBase, relOut)
await ensureDir(path.dirname(outFile))
await fs.writeFile(outFile, mdx, "utf8")
return outFile
}

async function main() {
const inBase = path.resolve(__dirname, "src/stories")
const outBase = path.resolve(__dirname, "../figma-plugin/rules")

if (!(await fileExists(inBase))) {
console.error(`Input folder not found: ${inBase}`)
process.exit(1)
}
await ensureDir(outBase)

const filterExts = new Set([".ts", ".tsx", ".js", ".jsx", ".md", ".mdx"])
const files = await walk(inBase, { filterExts })
if (files.length === 0) {
console.warn(
"No files found under src/stories matching allowed extensions.",
)
return
}

console.log(`Found ${files.length} file(s). Generating MDX into: ${outBase}`)

let count = 0
for (const f of files) {
try {
const outFile = await generateMDX(f, inBase, outBase)
count++
console.log(`โœ“ ${path.relative(outBase, outFile).replaceAll("\\", "/")}`)
} catch (err) {
console.error(`โœ— Failed to process ${f}:`, err)
}
}
console.log(`Done. Wrote ${count} MDX file(s).`)
}

// Run if invoked directly

main()
5 changes: 3 additions & 2 deletions shared/figma-plugin/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@ject-5-fe/figma-plugin",
"version": "0.0.1",
"version": "0.3.3",
"type": "module",
"scripts": {
"dev": "plugma dev",
Expand All @@ -14,7 +14,8 @@
"dist/server/server.cjs"
],
"dependencies": {
"@modelcontextprotocol/sdk": "^1",
"@modelcontextprotocol/sdk": "^1.24",
"es-toolkit": "^1.39.10",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"uuid": "^11",
Expand Down
3 changes: 3 additions & 0 deletions shared/figma-plugin/rules/accordion.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
## accordion

### Accordion์€ ์“ฐ์ง€๋งˆ์„ธ์š”
Loading
Loading