reborn-ui 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -438,95 +438,6 @@ function looksLikeNuxtProject(cwd) {
438
438
  pathExists(path7.join(cwd, "nuxt.config.mjs"))
439
439
  ]).then((arr) => arr.some(Boolean));
440
440
  }
441
- function isTailwindConfig(content) {
442
- return content.includes("tailwind") || content.includes("content:");
443
- }
444
- function patchTailwindContentArray(existing, wantedGlobs) {
445
- const m = existing.match(/content\s*:\s*\[([\s\S]*?)\]/m);
446
- if (!m) return null;
447
- const inner = m[1] ?? "";
448
- const missing = wantedGlobs.filter((g) => !inner.includes(g));
449
- if (!missing.length) return existing;
450
- const insertion = missing.map((g) => ` "${g}",`).join("\n");
451
- const replaced = existing.replace(
452
- /content\s*:\s*\[([\s\S]*?)\]/m,
453
- (full) => {
454
- return full.replace(/\]\s*$/, `${insertion}
455
- ]`);
456
- }
457
- );
458
- return replaced;
459
- }
460
- function defaultCssVariables() {
461
- return `@tailwind base;
462
- @tailwind components;
463
- @tailwind utilities;
464
-
465
- @layer base {
466
- :root {
467
- --background: 0 0% 100%;
468
- --foreground: 222.2 84% 4.9%;
469
-
470
- --card: 0 0% 100%;
471
- --card-foreground: 222.2 84% 4.9%;
472
-
473
- --popover: 0 0% 100%;
474
- --popover-foreground: 222.2 84% 4.9%;
475
-
476
- --primary: 222.2 47.4% 11.2%;
477
- --primary-foreground: 210 40% 98%;
478
-
479
- --secondary: 210 40% 96.1%;
480
- --secondary-foreground: 222.2 47.4% 11.2%;
481
-
482
- --muted: 210 40% 96.1%;
483
- --muted-foreground: 215.4 16.3% 46.9%;
484
-
485
- --accent: 210 40% 96.1%;
486
- --accent-foreground: 222.2 47.4% 11.2%;
487
-
488
- --destructive: 0 84.2% 60.2%;
489
- --destructive-foreground: 210 40% 98%;
490
-
491
- --border: 214.3 31.8% 91.4%;
492
- --input: 214.3 31.8% 91.4%;
493
- --ring: 222.2 84% 4.9%;
494
-
495
- --radius: 0.5rem;
496
- }
497
-
498
- .dark {
499
- --background: 222.2 84% 4.9%;
500
- --foreground: 210 40% 98%;
501
-
502
- --card: 222.2 84% 4.9%;
503
- --card-foreground: 210 40% 98%;
504
-
505
- --popover: 222.2 84% 4.9%;
506
- --popover-foreground: 210 40% 98%;
507
-
508
- --primary: 210 40% 98%;
509
- --primary-foreground: 222.2 47.4% 11.2%;
510
-
511
- --secondary: 217.2 32.6% 17.5%;
512
- --secondary-foreground: 210 40% 98%;
513
-
514
- --muted: 217.2 32.6% 17.5%;
515
- --muted-foreground: 215 20.2% 65.1%;
516
-
517
- --accent: 217.2 32.6% 17.5%;
518
- --accent-foreground: 210 40% 98%;
519
-
520
- --destructive: 0 62.8% 30.6%;
521
- --destructive-foreground: 210 40% 98%;
522
-
523
- --border: 217.2 32.6% 17.5%;
524
- --input: 217.2 32.6% 17.5%;
525
- --ring: 212.7 26.8% 83.9%;
526
- }
527
- }
528
- `;
529
- }
530
441
  function cnUtilsTs(params) {
531
442
  void params;
532
443
  return `import { type ClassValue, clsx } from "clsx";
@@ -537,28 +448,6 @@ export function cn(...inputs: ClassValue[]) {
537
448
  }
538
449
  `;
539
450
  }
540
- async function patchNuxtConfigAddCss(params) {
541
- const { cwd, cssPath } = params;
542
- const nuxtConfigPath = path7.join(cwd, "nuxt.config.ts");
543
- if (!await pathExists(nuxtConfigPath)) return false;
544
- const raw = await fs6.readFile(nuxtConfigPath, "utf8");
545
- if (raw.includes(cssPath)) return true;
546
- if (raw.match(/\bcss\s*:\s*\[/)) {
547
- const patched2 = raw.replace(/\bcss\s*:\s*\[/, `css: ["${cssPath}", `);
548
- await fs6.writeFile(nuxtConfigPath, patched2, "utf8");
549
- return true;
550
- }
551
- const m = raw.match(/defineNuxtConfig\(\s*\{\s*/);
552
- if (!m) return false;
553
- const patched = raw.replace(
554
- /defineNuxtConfig\(\s*\{\s*/,
555
- (s) => `${s}
556
- css: ["${cssPath}"],
557
- `
558
- );
559
- await fs6.writeFile(nuxtConfigPath, patched, "utf8");
560
- return true;
561
- }
562
451
  async function rewriteAliasInDir(params) {
563
452
  const { cwd, targetDir, aliasSymbol } = params;
564
453
  if (!aliasSymbol || aliasSymbol === "@") return;
@@ -574,7 +463,7 @@ async function rewriteAliasInDir(params) {
574
463
  }
575
464
  }
576
465
  function initCommand() {
577
- const cmd = new Command3("init").description("\u521D\u59CB\u5316\u65B0\u9879\u76EE\uFF1A\u5B89\u88C5\u4F9D\u8D56\u3001\u751F\u6210 lib/utils.ts\u3001\u914D\u7F6E tailwind \u4E0E CSS \u53D8\u91CF\uFF0C\u5E76\u5199\u5165 components.json").option("--cwd <path>", "\u76EE\u6807\u9879\u76EE\u76EE\u5F55", process.cwd()).option("--pm <pm>", "\u5305\u7BA1\u7406\u5668\uFF1Apnpm|npm|yarn|bun").option("--yes", "\u8DF3\u8FC7\u4EA4\u4E92\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u503C", false).option("--overwrite", "\u8986\u76D6\u5DF2\u5B58\u5728\u7684\u6A21\u677F\u6587\u4EF6\uFF08lib/composables\uFF09", false).option(
466
+ const cmd = new Command3("init").description("\u521D\u59CB\u5316\u65B0\u9879\u76EE").option("--cwd <path>", "\u76EE\u6807\u9879\u76EE\u76EE\u5F55", process.cwd()).option("--pm <pm>", "\u5305\u7BA1\u7406\u5668\uFF1Apnpm|npm|yarn|bun").option("--yes", "\u8DF3\u8FC7\u4EA4\u4E92\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u503C", false).option("--overwrite", "\u8986\u76D6\u5DF2\u5B58\u5728\u7684\u6A21\u677F\u6587\u4EF6\uFF08lib/composables\uFF09", false).option(
578
467
  "--config <path>",
579
468
  "\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\uFF08\u76F8\u5BF9 cwd\uFF09",
580
469
  DEFAULT_CONFIG_PATH
@@ -647,24 +536,6 @@ function initCommand() {
647
536
  name: "aliasSymbol",
648
537
  message: "\u57FA\u4E8E\u9879\u76EE\u6839\u76EE\u5F55\u7684\u201C\u6620\u5C04\u201D\u7684\u7B26\u53F7\u662F\uFF1F\uFF08aliasSymbol\uFF09",
649
538
  initial: cfg.aliasSymbol ?? "@"
650
- },
651
- {
652
- type: "text",
653
- name: "registry",
654
- message: "registry\uFF08\u5305\u540D\u6216\u8DEF\u5F84\uFF09",
655
- initial: cfg.registry
656
- },
657
- {
658
- type: "confirm",
659
- name: "installBaseDeps",
660
- message: `\u5B89\u88C5\u57FA\u7840\u4F9D\u8D56\uFF08clsx\u3001tailwind-merge\u3001tailwindcss \u7B49\uFF09\uFF1F`,
661
- initial: true
662
- },
663
- {
664
- type: nuxt ? "confirm" : null,
665
- name: "installDocs",
666
- message: `\u68C0\u6D4B\u5230 Nuxt\uFF1A\u82E5\u7F3A\u5931\u5219\u5B89\u88C5 shadcn-docs-nuxt\uFF1F`,
667
- initial: true
668
539
  }
669
540
  ],
670
541
  {
@@ -677,16 +548,8 @@ function initCommand() {
677
548
  cfg.libDir = res.libDir ?? cfg.libDir;
678
549
  cfg.composablesDir = res.composablesDir ?? cfg.composablesDir;
679
550
  cfg.aliasSymbol = res.aliasSymbol ?? cfg.aliasSymbol;
680
- cfg.registry = res.registry ?? cfg.registry;
681
551
  const cfgPath2 = path7.join(cwd, opts.config);
682
552
  await writeJsonFile(cfgPath2, cfg);
683
- const pkg2 = await readPackageJson(cwd);
684
- const wantDeps2 = [];
685
- if (res.installBaseDeps)
686
- wantDeps2.push("clsx", "tailwind-merge", "tailwindcss", "postcss", "autoprefixer");
687
- if (res.installDocs) wantDeps2.push("shadcn-docs-nuxt");
688
- const missing2 = getMissingDeps(pkg2, wantDeps2);
689
- await installDeps({ cwd, pm, deps: missing2 });
690
553
  await copyTemplateSubdir({
691
554
  subdir: "lib",
692
555
  cwd,
@@ -707,50 +570,13 @@ function initCommand() {
707
570
  });
708
571
  const libUtilsPath2 = path7.join(cwd, cfg.libDir, "utils.ts");
709
572
  if (!await pathExists(libUtilsPath2)) await writeTextFile(libUtilsPath2, cnUtilsTs({}));
710
- const cssRel2 = "assets/css/reborn-ui.css";
711
- const cssAbs2 = path7.join(cwd, cssRel2);
712
- if (!await pathExists(cssAbs2)) {
713
- await writeTextFile(cssAbs2, defaultCssVariables());
714
- }
715
- const contentGlobs2 = [
716
- "./components/**/*.{vue,js,ts}",
717
- "./layouts/**/*.{vue,js,ts}",
718
- "./pages/**/*.{vue,js,ts}",
719
- "./plugins/**/*.{js,ts}",
720
- "./app.vue",
721
- "./error.vue",
722
- "./content/**/*.{md,yml,yaml,json}",
723
- `./${cfg.componentsDir}/**/*.{vue,js,ts}`,
724
- `./${cfg.composablesDir}/**/*.{js,ts}`
725
- ];
726
- const twPath2 = path7.join(cwd, "tailwind.config.ts");
727
- if (await pathExists(twPath2)) {
728
- const rawTw = await fs6.readFile(twPath2, "utf8");
729
- if (isTailwindConfig(rawTw)) {
730
- const patched = patchTailwindContentArray(rawTw, contentGlobs2);
731
- if (patched && patched !== rawTw) {
732
- await fs6.writeFile(twPath2, patched, "utf8");
733
- }
734
- }
735
- } else {
736
- const templatePath = path7.join(getTemplatesRootDir(), "tailwind.config.template");
737
- let templateContent = await fs6.readFile(templatePath, "utf8");
738
- await writeTextFile(twPath2, templateContent);
739
- }
740
- await patchNuxtConfigAddCss({ cwd, cssPath: `~/${cssRel2}` });
741
- console.log(
742
- `\u5DF2\u5199\u5165\u914D\u7F6E\uFF1A${path7.relative(process.cwd(), cfgPath2)}\uFF1B\u5E76\u751F\u6210 cn/utils\u3001tailwind \u914D\u7F6E\u4E0E CSS \u53D8\u91CF\uFF08pm=${pm}\uFF09`
743
- );
573
+ console.log(`\u5DF2\u5199\u5165\u914D\u7F6E\uFF1A${path7.relative(process.cwd(), cfgPath2)}\uFF1B\u5E76\u751F\u6210 cn/utils\uFF08pm=${pm}\uFF09`);
574
+ console.log("\u8BF7\u6309\u7167 https://tw.icebreaker.top/docs/quick-start/v4/uni-app-vite \u6307\u5F15\u8FDB\u884C\u9879\u76EE\u914D\u7F6E\u521D\u59CB\u5316");
744
575
  return;
745
576
  }
746
577
  const cfgPath = path7.join(cwd, opts.config);
747
578
  await ensureDir(path7.dirname(cfgPath));
748
579
  await fs6.writeFile(cfgPath, JSON.stringify(cfg, null, 2) + "\n", "utf8");
749
- const pkg = await readPackageJson(cwd);
750
- const wantDeps = ["clsx", "tailwind-merge", "tailwindcss", "postcss", "autoprefixer"];
751
- if (await looksLikeNuxtProject(cwd)) wantDeps.push("shadcn-docs-nuxt");
752
- const missing = getMissingDeps(pkg, wantDeps);
753
- await installDeps({ cwd, pm, deps: missing });
754
580
  await copyTemplateSubdir({
755
581
  subdir: "lib",
756
582
  cwd,
@@ -771,42 +597,63 @@ function initCommand() {
771
597
  });
772
598
  const libUtilsPath = path7.join(cwd, cfg.libDir, "utils.ts");
773
599
  if (!await pathExists(libUtilsPath)) await writeTextFile(libUtilsPath, cnUtilsTs({}));
774
- const cssRel = "assets/css/reborn-ui.css";
775
- const cssAbs = path7.join(cwd, cssRel);
776
- if (!await pathExists(cssAbs)) {
777
- await writeTextFile(cssAbs, defaultCssVariables());
778
- }
779
- const contentGlobs = [
780
- "./components/**/*.{vue,js,ts}",
781
- "./layouts/**/*.{vue,js,ts}",
782
- "./pages/**/*.{vue,js,ts}",
783
- "./plugins/**/*.{js,ts}",
784
- "./app.vue",
785
- "./error.vue",
786
- "./content/**/*.{md,yml,yaml,json}",
787
- `./${cfg.componentsDir}/**/*.{vue,js,ts}`,
788
- `./${cfg.composablesDir}/**/*.{js,ts}`
789
- ];
790
- const twPath = path7.join(cwd, "tailwind.config.ts");
791
- if (await pathExists(twPath)) {
792
- const rawTw = await fs6.readFile(twPath, "utf8");
793
- const patched = patchTailwindContentArray(rawTw, contentGlobs);
794
- if (patched && patched !== rawTw) await fs6.writeFile(twPath, patched, "utf8");
795
- } else {
796
- const templatePath = path7.join(getTemplatesRootDir(), "tailwind.config.template");
797
- let templateContent = await fs6.readFile(templatePath, "utf8");
798
- await writeTextFile(twPath, templateContent);
799
- }
800
- await patchNuxtConfigAddCss({ cwd, cssPath: `~/${cssRel}` });
801
- console.log(
802
- `\u5DF2\u521D\u59CB\u5316\uFF1A${path7.relative(process.cwd(), cfgPath)}\uFF1B\u5E76\u751F\u6210 cn/utils\u3001tailwind \u914D\u7F6E\u4E0E CSS \u53D8\u91CF\uFF08pm=${pm}\uFF09`
803
- );
600
+ console.log(`\u5DF2\u521D\u59CB\u5316\uFF1A${path7.relative(process.cwd(), cfgPath)}\uFF1B\u5E76\u751F\u6210 cn/utils\uFF08pm=${pm}\uFF09`);
601
+ console.log("\u8BF7\u6309\u7167 https://tw.icebreaker.top/docs/quick-start/v4/uni-app-vite \u6307\u5F15\u8FDB\u884C\u9879\u76EE\u914D\u7F6E\u521D\u59CB\u5316");
804
602
  });
805
603
  return cmd;
806
604
  }
807
605
 
606
+ // package.json
607
+ var package_default = {
608
+ name: "reborn-ui",
609
+ version: "0.1.4",
610
+ description: "A CLI for Reborn UI",
611
+ author: "1997liuyh-boop",
612
+ license: "MIT",
613
+ repository: {
614
+ type: "git",
615
+ url: "https://github.com/1997liuyh-boop/Reborn-UI.git"
616
+ },
617
+ type: "module",
618
+ bin: {
619
+ "reborn-ui": "dist/index.js"
620
+ },
621
+ files: [
622
+ "dist",
623
+ "registry",
624
+ "templates",
625
+ "README.md"
626
+ ],
627
+ publishConfig: {
628
+ access: "public"
629
+ },
630
+ scripts: {
631
+ cli: "tsx src/index.ts",
632
+ build: "tsup",
633
+ dev: "tsx src/index.ts",
634
+ clean: "rimraf dist",
635
+ prepare: "tsup",
636
+ "registry:build": "tsx src/index.ts build --root ../..",
637
+ prepack: "npm run build && npm run registry:build",
638
+ prepublishOnly: "npm run build && npm run registry:build"
639
+ },
640
+ dependencies: {
641
+ commander: "^14.0.0",
642
+ execa: "^9.6.0",
643
+ prompts: "^2.4.2"
644
+ },
645
+ devDependencies: {
646
+ "@types/node": "^22.10.7",
647
+ "@types/prompts": "^2.4.9",
648
+ rimraf: "^6.0.1",
649
+ tsup: "^8.5.0",
650
+ tsx: "^4.20.0",
651
+ typescript: "^5.8.3"
652
+ }
653
+ };
654
+
808
655
  // src/index.ts
809
- var program = new Command4().name("reborn-ui").description("Reborn UI - \u7EC4\u4EF6\u5B89\u88C5\u4E0E registry \u8F85\u52A9 CLI").version("0.1.0");
656
+ var program = new Command4().name("reborn-ui").description("Reborn UI - \u7EC4\u4EF6\u5B89\u88C5\u4E0E registry \u8F85\u52A9 CLI").version(package_default.version);
810
657
  program.addCommand(initCommand());
811
658
  program.addCommand(addCommand());
812
659
  program.addCommand(buildCommand());
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/add.ts","../src/utils/fs.ts","../src/utils/pm.ts","../src/utils/registry.ts","../src/commands/build.ts","../src/utils/imports.ts","../src/commands/init.ts","../src/utils/templates.ts"],"sourcesContent":["import { Command } from \"commander\";\r\nimport { addCommand } from \"./commands/add.js\";\r\nimport { buildCommand } from \"./commands/build.js\";\r\nimport { initCommand } from \"./commands/init.js\";\r\n\r\nconst program = new Command()\r\n .name(\"reborn-ui\")\r\n .description(\"Reborn UI - 组件安装与 registry 辅助 CLI\")\r\n .version(\"0.1.0\");\r\n\r\nprogram.addCommand(initCommand());\r\nprogram.addCommand(addCommand());\r\nprogram.addCommand(buildCommand());\r\n\r\nawait program.parseAsync(process.argv);\r\n\r\n\r\n","import path from \"node:path\";\r\nimport { Command } from \"commander\";\r\nimport prompts from \"prompts\";\r\nimport type { PackageManager, RegistryComponent } from \"../types.js\";\r\nimport { ensureDir, pathExists, writeTextFile } from \"../utils/fs.js\";\r\nimport {\r\n detectPackageManager,\r\n getMissingDeps,\r\n installDeps,\r\n readPackageJson,\r\n} from \"../utils/pm.js\";\r\nimport { defaultConfig, loadConfigCompat, loadRegistry } from \"../utils/registry.js\";\r\n\r\nfunction rewriteImports(params: {\r\n content: string;\r\n aliasSymbol: string;\r\n}) {\r\n const { content, aliasSymbol } = params;\r\n if (!aliasSymbol || aliasSymbol === \"@\") return content;\r\n\r\n // 仅替换项目根目录映射符号:把 \"@/xxx\" -> \"<aliasSymbol>/xxx\"\r\n // 注意:不要影响 scoped package(@scope/name),这里只替换 \"@/\" 前缀。\r\n return content.replaceAll(\"@/\", `${aliasSymbol}/`);\r\n}\r\n\r\nasync function writeComponentFiles(params: {\r\n cwd: string;\r\n componentsDir: string;\r\n aliasSymbol: string;\r\n component: RegistryComponent;\r\n overwrite?: boolean;\r\n}) {\r\n const { cwd, componentsDir, aliasSymbol, component, overwrite } = params;\r\n const baseDir = path.join(cwd, componentsDir, component.name);\r\n await ensureDir(baseDir);\r\n\r\n for (const f of component.files) {\r\n const target = path.join(baseDir, ...f.path.split(\"/\"));\r\n if (!overwrite && (await pathExists(target))) continue;\r\n const nextContent = rewriteImports({ content: f.content, aliasSymbol });\r\n await writeTextFile(target, nextContent);\r\n }\r\n\r\n return baseDir;\r\n}\r\n\r\nexport function addCommand() {\r\n const cmd = new Command(\"add\")\r\n .description(\"向项目中添加组件与相关依赖\")\r\n .argument(\"[components...]\", \"组件名(可多个)\")\r\n .option(\"--cwd <path>\", \"目标项目目录\", process.cwd())\r\n .option(\"--pm <pm>\", \"包管理器:pnpm|npm|yarn|bun\")\r\n .option(\"--yes\", \"跳过交互\", false)\r\n .option(\"--overwrite\", \"覆盖已存在文件\", false)\r\n .option(\"--config <path>\", \"配置文件路径(相对 cwd)\", \"components.json\")\r\n .option(\"--registry <pkgOrPath>\", \"覆盖配置里的 registry\")\r\n .option(\"--components-dir <path>\", \"覆盖配置里的 componentsDir\")\r\n .option(\"--lib-dir <path>\", \"覆盖配置里的 libDir\")\r\n .option(\"--alias-symbol <symbol>\", \"覆盖配置里的 aliasSymbol(默认 @)\")\r\n .action(async (components: string[], opts) => {\r\n const cwd = path.resolve(opts.cwd);\r\n const pm: PackageManager =\r\n opts.pm ?? (await detectPackageManager(cwd));\r\n\r\n const cfg = (await loadConfigCompat(cwd, opts.config)) ?? defaultConfig();\r\n if (opts.registry) cfg.registry = opts.registry;\r\n if (opts.componentsDir) cfg.componentsDir = opts.componentsDir;\r\n if (opts.libDir) cfg.libDir = opts.libDir;\r\n if (opts.aliasSymbol) cfg.aliasSymbol = opts.aliasSymbol;\r\n\r\n const registry = await loadRegistry({ cwd, registry: cfg.registry });\r\n\r\n let targets = components ?? [];\r\n if (!targets.length) {\r\n if (opts.yes) {\r\n throw new Error(\"未指定组件名;请传入组件参数或去掉 --yes 以交互选择。\");\r\n }\r\n const choices = registry.components.map((c) => ({\r\n title: c.name,\r\n value: c.name,\r\n }));\r\n const res = await prompts(\r\n [\r\n {\r\n type: \"multiselect\",\r\n name: \"selected\",\r\n message: \"选择要添加的组件\",\r\n choices,\r\n min: 1,\r\n },\r\n ],\r\n {\r\n onCancel: () => {\r\n throw new Error(\"已取消\");\r\n },\r\n },\r\n );\r\n targets = res.selected ?? [];\r\n }\r\n\r\n const pkg = await readPackageJson(cwd);\r\n const allDeps = new Set<string>();\r\n\r\n for (const name of targets) {\r\n const c = registry.components.find((x) => x.name === name);\r\n if (!c) throw new Error(`registry 中不存在该组件:${name}`);\r\n\r\n const outDir = await writeComponentFiles({\r\n cwd,\r\n componentsDir: cfg.componentsDir,\r\n aliasSymbol: cfg.aliasSymbol ?? \"@\",\r\n component: c,\r\n overwrite: opts.overwrite,\r\n });\r\n\r\n // eslint-disable-next-line no-console\r\n console.log(`已写入组件:${name} -> ${path.relative(cwd, outDir)}`);\r\n\r\n for (const dep of c.dependencies) allDeps.add(dep);\r\n }\r\n\r\n const missing = getMissingDeps(pkg, [...allDeps]);\r\n await installDeps({ cwd, pm, deps: missing });\r\n\r\n // eslint-disable-next-line no-console\r\n console.log(\r\n `完成:添加 ${targets.length} 个组件;补装依赖 ${missing.length} 个(pm=${pm})`,\r\n );\r\n });\r\n\r\n return cmd;\r\n}\r\n\r\n\r\n","import { createHash } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport async function pathExists(p: string) {\n try {\n await fs.access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function ensureDir(dirPath: string) {\n await fs.mkdir(dirPath, { recursive: true });\n}\n\nexport async function readJsonFile<T>(filePath: string): Promise<T> {\n const raw = await fs.readFile(filePath, \"utf8\");\n return JSON.parse(raw) as T;\n}\n\nexport async function writeJsonFile(filePath: string, data: unknown) {\n await ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, JSON.stringify(data, null, 2) + \"\\n\", \"utf8\");\n}\n\nexport async function writeTextFile(filePath: string, content: string) {\n await ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, content, \"utf8\");\n}\n\nexport async function listFilesRecursive(\n dirPath: string,\n opts?: { ignoreDirNames?: Set<string> },\n) {\n const ignoreDirNames =\n opts?.ignoreDirNames ??\n new Set([\"node_modules\", \".git\", \".nuxt\", \"dist\", \".output\"]);\n\n const out: string[] = [];\n\n async function walk(current: string) {\n const entries = await fs.readdir(current, { withFileTypes: true });\n for (const entry of entries) {\n const p = path.join(current, entry.name);\n if (entry.isDirectory()) {\n if (ignoreDirNames.has(entry.name)) continue;\n await walk(p);\n } else if (entry.isFile()) {\n out.push(p);\n }\n }\n }\n\n await walk(dirPath);\n return out;\n}\n\nexport async function copyDirRecursive(params: {\n fromDir: string;\n toDir: string;\n overwrite?: boolean;\n ignoreFileNames?: Set<string>;\n}) {\n const { fromDir, toDir, overwrite } = params;\n const ignoreFileNames = params.ignoreFileNames ?? new Set([\".DS_Store\"]);\n\n const entries = await fs.readdir(fromDir, { withFileTypes: true });\n await ensureDir(toDir);\n\n for (const entry of entries) {\n if (ignoreFileNames.has(entry.name)) continue;\n const from = path.join(fromDir, entry.name);\n const to = path.join(toDir, entry.name);\n\n if (entry.isDirectory()) {\n await copyDirRecursive({ fromDir: from, toDir: to, overwrite, ignoreFileNames });\n continue;\n }\n\n if (!entry.isFile()) continue;\n\n if (!overwrite) {\n try {\n await fs.access(to);\n continue; // 已存在则跳过\n } catch {\n // not exists\n }\n }\n\n await ensureDir(path.dirname(to));\n await fs.copyFile(from, to);\n }\n}\n\nexport function sha1(text: string) {\n return createHash(\"sha1\").update(text).digest(\"hex\");\n}\n\n\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\nimport { execa } from \"execa\";\r\nimport type { PackageManager } from \"../types.js\";\r\nimport { pathExists, readJsonFile, writeJsonFile } from \"./fs.js\";\r\n\r\nexport async function detectPackageManager(cwd: string): Promise<PackageManager> {\r\n if (await pathExists(path.join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\r\n if (await pathExists(path.join(cwd, \"yarn.lock\"))) return \"yarn\";\r\n if (await pathExists(path.join(cwd, \"package-lock.json\"))) return \"npm\";\r\n if (await pathExists(path.join(cwd, \"bun.lockb\"))) return \"bun\";\r\n return \"pnpm\";\r\n}\r\n\r\nexport async function readPackageJson(\r\n cwd: string,\r\n): Promise<Record<string, any> & { dependencies?: Record<string, string>; devDependencies?: Record<string, string> }> {\r\n return await readJsonFile(path.join(cwd, \"package.json\"));\r\n}\r\n\r\nexport async function writePackageJson(cwd: string, pkg: unknown) {\r\n await writeJsonFile(path.join(cwd, \"package.json\"), pkg);\r\n}\r\n\r\nexport function getMissingDeps(\r\n pkg: { dependencies?: Record<string, string>; devDependencies?: Record<string, string> },\r\n deps: string[],\r\n) {\r\n const existing = new Set([\r\n ...Object.keys(pkg.dependencies ?? {}),\r\n ...Object.keys(pkg.devDependencies ?? {}),\r\n ]);\r\n return deps.filter((d) => !existing.has(d));\r\n}\r\n\r\nexport async function installDeps(params: {\r\n cwd: string;\r\n pm: PackageManager;\r\n deps: string[];\r\n dev?: boolean;\r\n}) {\r\n const { cwd, pm, deps, dev } = params;\r\n if (!deps.length) return;\r\n\r\n const args: string[] = [];\r\n if (pm === \"pnpm\") args.push(\"add\");\r\n else if (pm === \"npm\") args.push(\"install\");\r\n else if (pm === \"yarn\") args.push(\"add\");\r\n else if (pm === \"bun\") args.push(\"add\");\r\n\r\n if (dev) {\r\n if (pm === \"npm\") args.push(\"--save-dev\");\r\n else args.push(\"-D\");\r\n }\r\n\r\n args.push(...deps);\r\n\r\n await execa(pm, args, { cwd, stdio: \"inherit\" });\r\n}\r\n\r\nexport async function ensureJsonFile(cwd: string, relPath: string, defaultJson: unknown) {\r\n const p = path.join(cwd, relPath);\r\n if (await pathExists(p)) return;\r\n await fs.mkdir(path.dirname(p), { recursive: true });\r\n await fs.writeFile(p, JSON.stringify(defaultJson, null, 2) + \"\\n\", \"utf8\");\r\n}\r\n\r\n\r\n","import path from \"node:path\";\nimport fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\nimport type { CliConfig, RegistryFile } from \"../types.js\";\nimport { pathExists, readJsonFile } from \"./fs.js\";\n\nexport const DEFAULT_CONFIG_PATH = \"components.json\";\n\nfunction findNearestPackageRoot(from: string) {\n // from: import.meta.url\n let dir = path.dirname(fileURLToPath(from));\n while (true) {\n if (fs.existsSync(path.join(dir, \"package.json\"))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) return dir;\n dir = parent;\n }\n}\n\nexport function defaultConfig(): CliConfig {\n return {\n schemaVersion: 1,\n componentsDir: \"components\",\n libDir: \"lib\",\n composablesDir: \"composables\",\n // 默认使用 CLI 包内置的 registry(随 reborn-ui 一起发布)\n registry: \"builtin\",\n // 项目根目录映射别名符号(默认 @)\n aliasSymbol: \"@\",\n };\n}\n\nexport async function loadConfig(cwd: string, configPath = DEFAULT_CONFIG_PATH) {\n const abs = path.isAbsolute(configPath)\n ? configPath\n : path.join(cwd, configPath);\n if (!(await pathExists(abs))) return null;\n return await readJsonFile<CliConfig>(abs);\n}\n\nexport function resolveRegistryJsonPath(params: { cwd: string; registry: string }) {\n const { cwd, registry } = params;\n\n // 0) 内置 registry\n if (!registry || registry === \"builtin\") {\n // 注意:CLI 经过打包后可能变成单文件(例如 dist/index.js),\n // import.meta.url 的相对基准会变化,不能用固定的 ../../registry/...\n // 这里通过向上查找最近的 package.json 来定位包根目录。\n const pkgRoot = findNearestPackageRoot(import.meta.url);\n return path.join(pkgRoot, \"registry\", \"registry.json\");\n }\n\n // 1) 如果是文件路径(包含分隔符或 .json),优先当成路径处理\n const looksLikePath =\n registry.includes(\"/\") ||\n registry.includes(\"\\\\\") ||\n registry.endsWith(\".json\");\n\n if (looksLikePath) {\n const abs = path.isAbsolute(registry) ? registry : path.join(cwd, registry);\n return abs;\n }\n\n // 2) 当成包名处理:默认读取 <pkg>/registry/registry.json\n const require = createRequire(import.meta.url);\n // 不显式绑定 cwd,避免 npx 场景下找不到 registry 包\n return require.resolve(`${registry}/registry/registry.json`);\n}\n\nexport async function loadRegistry(params: { cwd: string; registry: string }) {\n const jsonPath = resolveRegistryJsonPath(params);\n return await readJsonFile<RegistryFile>(jsonPath);\n}\n\n// 兼容旧配置文件名:shadcn-docs.json\nexport async function loadConfigCompat(cwd: string, configPath?: string) {\n if (configPath) return await loadConfig(cwd, configPath);\n const primary = await loadConfig(cwd, DEFAULT_CONFIG_PATH);\n if (primary) return primary;\n return await loadConfig(cwd, \"shadcn-docs.json\");\n}\n\n\n","import path from \"node:path\";\r\nimport fs from \"node:fs/promises\";\r\nimport fssync from \"node:fs\";\r\nimport { Command } from \"commander\";\r\nimport type { RegistryComponent, RegistryFile } from \"../types.js\";\r\nimport { listFilesRecursive, sha1, writeJsonFile } from \"../utils/fs.js\";\r\nimport { extractNpmDependenciesFromText } from \"../utils/imports.js\";\r\n\r\nfunction isAllowedFile(filePath: string) {\r\n const ext = path.extname(filePath).toLowerCase();\r\n return [\r\n \".vue\",\r\n \".ts\",\r\n \".js\",\r\n \".json\",\r\n \".css\",\r\n \".md\",\r\n \".svg\",\r\n ].includes(ext);\r\n}\r\n\r\nfunction findWorkspaceRoot(startDir: string) {\r\n let current = path.resolve(startDir);\r\n for (;;) {\r\n const marker = path.join(current, \"pnpm-workspace.yaml\");\r\n if (fssync.existsSync(marker)) return current;\r\n const parent = path.dirname(current);\r\n if (parent === current) return startDir;\r\n current = parent;\r\n }\r\n}\r\n\r\nexport function buildCommand() {\r\n const cmd = new Command(\"build\")\r\n .description(\"(内部)扫描组件源码并生成 registry JSON\")\r\n .option(\"--root <path>\", \"仓库根目录(默认自动向上查找 pnpm-workspace.yaml)\")\r\n .option(\r\n \"--source <path>\",\r\n \"组件源码目录(相对 root)\",\r\n \"components/content/reborn\",\r\n )\r\n .option(\r\n \"--out <path>\",\r\n \"输出 registry.json 路径(相对 root)\",\r\n \"packages/cli/registry/registry.json\",\r\n )\r\n .option(\r\n \"--also-out <path>\",\r\n \"额外再输出一份 registry.json(可重复传参)\",\r\n (val, acc: string[]) => {\r\n acc.push(val);\r\n return acc;\r\n },\r\n [],\r\n )\r\n .action(async (opts) => {\r\n const rootDir = opts.root\r\n ? path.resolve(opts.root)\r\n : findWorkspaceRoot(process.cwd());\r\n const sourceDir = path.join(rootDir, opts.source);\r\n const outPath = path.join(rootDir, opts.out);\r\n const alsoOutPaths: string[] = (opts.alsoOut ?? []).map((p: string) =>\r\n path.join(rootDir, p),\r\n );\r\n\r\n const dirents = await fs.readdir(sourceDir, { withFileTypes: true });\r\n const componentDirs = dirents\r\n .filter((d) => d.isDirectory())\r\n .map((d) => path.join(sourceDir, d.name))\r\n .sort((a, b) => a.localeCompare(b));\r\n\r\n const components: RegistryComponent[] = [];\r\n\r\n for (const absComponentDir of componentDirs) {\r\n const name = path.basename(absComponentDir);\r\n const absFiles = (await listFilesRecursive(absComponentDir)).filter(\r\n isAllowedFile,\r\n );\r\n\r\n const files: RegistryComponent[\"files\"] = [];\r\n const depSet = new Set<string>();\r\n\r\n for (const absFile of absFiles) {\r\n const rel = path\r\n .relative(absComponentDir, absFile)\r\n .split(path.sep)\r\n .join(\"/\");\r\n const content = await fs.readFile(absFile, \"utf8\");\r\n files.push({ path: rel, content });\r\n\r\n // 只从代码文件里抽依赖\r\n const ext = path.extname(absFile).toLowerCase();\r\n if (ext === \".ts\" || ext === \".js\" || ext === \".vue\") {\r\n for (const dep of extractNpmDependenciesFromText(content)) {\r\n depSet.add(dep);\r\n }\r\n }\r\n }\r\n\r\n components.push({\r\n name,\r\n dependencies: [...depSet].sort(),\r\n files,\r\n });\r\n }\r\n\r\n const registry: RegistryFile = {\r\n schemaVersion: 1,\r\n generatedAt: new Date().toISOString(),\r\n source: {\r\n rootDir: rootDir.split(path.sep).join(\"/\"),\r\n componentsDir: opts.source,\r\n },\r\n components,\r\n };\r\n\r\n async function writeOut(targetRegistryPath: string) {\r\n const outComponentsDir = path.join(\r\n path.dirname(targetRegistryPath),\r\n \"components\",\r\n );\r\n await writeJsonFile(targetRegistryPath, registry);\r\n\r\n // 额外输出每个组件的 json,方便调试/按需读取\r\n await fs.mkdir(outComponentsDir, { recursive: true });\r\n for (const c of components) {\r\n await writeJsonFile(\r\n path.join(outComponentsDir, `${c.name}.json`),\r\n {\r\n ...c,\r\n fileCount: c.files.length,\r\n contentHash: sha1(JSON.stringify(c.files.map((f) => f.content))),\r\n },\r\n );\r\n }\r\n }\r\n\r\n await writeOut(outPath);\r\n for (const p of alsoOutPaths) await writeOut(p);\r\n\r\n // eslint-disable-next-line no-console\r\n console.log(\r\n `registry 已生成:${path.relative(process.cwd(), outPath)}(${components.length} 个组件)`,\r\n );\r\n });\r\n\r\n return cmd;\r\n}\r\n\r\n\r\n","const IMPORT_RE =\r\n /\\bfrom\\s+[\"']([^\"']+)[\"']|\\bimport\\(\\s*[\"']([^\"']+)[\"']\\s*\\)|\\brequire\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/g;\r\n\r\nfunction normalizePackageName(specifier: string) {\r\n // ignore relative/alias/virtual\r\n if (\r\n specifier.startsWith(\".\") ||\r\n specifier.startsWith(\"/\") ||\r\n specifier.startsWith(\"@/\") ||\r\n specifier.startsWith(\"~/\") ||\r\n specifier.startsWith(\"#\") ||\r\n specifier.startsWith(\"virtual:\")\r\n ) {\r\n return null;\r\n }\r\n\r\n // scoped package: @scope/name[/...]\r\n if (specifier.startsWith(\"@\")) {\r\n const parts = specifier.split(\"/\");\r\n if (parts.length >= 2) return `${parts[0]}/${parts[1]}`;\r\n return specifier;\r\n }\r\n\r\n // normal package: name[/...]\r\n return specifier.split(\"/\")[0] ?? null;\r\n}\r\n\r\nexport function extractNpmDependenciesFromText(text: string) {\r\n const out = new Set<string>();\r\n\r\n for (const match of text.matchAll(IMPORT_RE)) {\r\n const spec = match[1] ?? match[2] ?? match[3];\r\n if (!spec) continue;\r\n const pkg = normalizePackageName(spec);\r\n if (!pkg) continue;\r\n out.add(pkg);\r\n }\r\n\r\n // 常见“框架自带/不应自动安装”的虚拟模块\r\n out.delete(\"nuxt\");\r\n out.delete(\"vue\");\r\n\r\n return [...out].sort();\r\n}\r\n\r\n\r\n","import path from \"node:path\";\r\nimport fs from \"node:fs/promises\";\r\nimport { Command } from \"commander\";\r\nimport prompts from \"prompts\";\r\nimport type { CliConfig, PackageManager } from \"../types.js\";\r\nimport { ensureDir, listFilesRecursive, pathExists, writeJsonFile, writeTextFile } from \"../utils/fs.js\";\r\nimport {\r\n detectPackageManager,\r\n getMissingDeps,\r\n installDeps,\r\n readPackageJson,\r\n} from \"../utils/pm.js\";\r\nimport { DEFAULT_CONFIG_PATH, defaultConfig, loadConfigCompat } from \"../utils/registry.js\";\r\nimport { copyTemplateSubdir, getTemplatesRootDir } from \"../utils/templates.js\";\r\n\r\nfunction looksLikeNuxtProject(cwd: string) {\r\n return Promise.all([\r\n pathExists(path.join(cwd, \"nuxt.config.ts\")),\r\n pathExists(path.join(cwd, \"nuxt.config.js\")),\r\n pathExists(path.join(cwd, \"nuxt.config.mjs\")),\r\n ]).then((arr) => arr.some(Boolean));\r\n}\r\n\r\nfunction isTailwindConfig(content: string) {\r\n return content.includes(\"tailwind\") || content.includes(\"content:\");\r\n}\r\n\r\n// function makeDefaultTailwindConfig removed in favor of template file\r\n\r\nfunction patchTailwindContentArray(existing: string, wantedGlobs: string[]) {\r\n // 尽量保守:只在发现 content: [ ... ] 时往里补缺失项\r\n const m = existing.match(/content\\s*:\\s*\\[([\\s\\S]*?)\\]/m);\r\n if (!m) return null;\r\n const inner = m[1] ?? \"\";\r\n\r\n const missing = wantedGlobs.filter((g) => !inner.includes(g));\r\n if (!missing.length) return existing;\r\n\r\n const insertion = missing.map((g) => ` \"${g}\",`).join(\"\\n\");\r\n const replaced = existing.replace(\r\n /content\\s*:\\s*\\[([\\s\\S]*?)\\]/m,\r\n (full) => {\r\n // 在 ] 前插入\r\n return full.replace(/\\]\\s*$/, `${insertion}\\n ]`);\r\n },\r\n );\r\n return replaced;\r\n}\r\n\r\nfunction defaultCssVariables() {\r\n return `@tailwind base;\\n@tailwind components;\\n@tailwind utilities;\\n\\n@layer base {\\n :root {\\n --background: 0 0% 100%;\\n --foreground: 222.2 84% 4.9%;\\n\\n --card: 0 0% 100%;\\n --card-foreground: 222.2 84% 4.9%;\\n\\n --popover: 0 0% 100%;\\n --popover-foreground: 222.2 84% 4.9%;\\n\\n --primary: 222.2 47.4% 11.2%;\\n --primary-foreground: 210 40% 98%;\\n\\n --secondary: 210 40% 96.1%;\\n --secondary-foreground: 222.2 47.4% 11.2%;\\n\\n --muted: 210 40% 96.1%;\\n --muted-foreground: 215.4 16.3% 46.9%;\\n\\n --accent: 210 40% 96.1%;\\n --accent-foreground: 222.2 47.4% 11.2%;\\n\\n --destructive: 0 84.2% 60.2%;\\n --destructive-foreground: 210 40% 98%;\\n\\n --border: 214.3 31.8% 91.4%;\\n --input: 214.3 31.8% 91.4%;\\n --ring: 222.2 84% 4.9%;\\n\\n --radius: 0.5rem;\\n }\\n\\n .dark {\\n --background: 222.2 84% 4.9%;\\n --foreground: 210 40% 98%;\\n\\n --card: 222.2 84% 4.9%;\\n --card-foreground: 210 40% 98%;\\n\\n --popover: 222.2 84% 4.9%;\\n --popover-foreground: 210 40% 98%;\\n\\n --primary: 210 40% 98%;\\n --primary-foreground: 222.2 47.4% 11.2%;\\n\\n --secondary: 217.2 32.6% 17.5%;\\n --secondary-foreground: 210 40% 98%;\\n\\n --muted: 217.2 32.6% 17.5%;\\n --muted-foreground: 215 20.2% 65.1%;\\n\\n --accent: 217.2 32.6% 17.5%;\\n --accent-foreground: 210 40% 98%;\\n\\n --destructive: 0 62.8% 30.6%;\\n --destructive-foreground: 210 40% 98%;\\n\\n --border: 217.2 32.6% 17.5%;\\n --input: 217.2 32.6% 17.5%;\\n --ring: 212.7 26.8% 83.9%;\\n }\\n}\\n`;\r\n}\r\n\r\nfunction cnUtilsTs(params: { importPath?: string }) {\r\n // importPath 预留:如果用户想从别处导入 clsx/twMerge\r\n void params;\r\n return `import { type ClassValue, clsx } from \"clsx\";\\nimport { twMerge } from \"tailwind-merge\";\\n\\nexport function cn(...inputs: ClassValue[]) {\\n return twMerge(clsx(inputs));\\n}\\n`;\r\n}\r\n\r\nasync function patchNuxtConfigAddCss(params: { cwd: string; cssPath: string }) {\r\n const { cwd, cssPath } = params;\r\n const nuxtConfigPath = path.join(cwd, \"nuxt.config.ts\");\r\n if (!(await pathExists(nuxtConfigPath))) return false;\r\n const raw = await fs.readFile(nuxtConfigPath, \"utf8\");\r\n if (raw.includes(cssPath)) return true;\r\n\r\n // 1) 已有 css: [] -> 补进去\r\n if (raw.match(/\\bcss\\s*:\\s*\\[/)) {\r\n const patched = raw.replace(/\\bcss\\s*:\\s*\\[/, `css: [\"${cssPath}\", `);\r\n await fs.writeFile(nuxtConfigPath, patched, \"utf8\");\r\n return true;\r\n }\r\n\r\n // 2) 没有 css 字段:在 defineNuxtConfig({ 后插入\r\n const m = raw.match(/defineNuxtConfig\\(\\s*\\{\\s*/);\r\n if (!m) return false;\r\n const patched = raw.replace(\r\n /defineNuxtConfig\\(\\s*\\{\\s*/,\r\n (s) => `${s}\\n css: [\"${cssPath}\"],\\n`,\r\n );\r\n await fs.writeFile(nuxtConfigPath, patched, \"utf8\");\r\n return true;\r\n}\r\n\r\nasync function rewriteAliasInDir(params: {\r\n cwd: string;\r\n targetDir: string;\r\n aliasSymbol: string;\r\n}) {\r\n const { cwd, targetDir, aliasSymbol } = params;\r\n if (!aliasSymbol || aliasSymbol === \"@\") return;\r\n const absDir = path.join(cwd, targetDir);\r\n if (!(await pathExists(absDir))) return;\r\n\r\n const files = await listFilesRecursive(absDir);\r\n for (const f of files) {\r\n const ext = path.extname(f).toLowerCase();\r\n // 只处理常见文本文件,避免误改二进制\r\n if (![\".ts\", \".tsx\", \".js\", \".jsx\", \".vue\", \".mjs\", \".cjs\"].includes(ext)) continue;\r\n const raw = await fs.readFile(f, \"utf8\");\r\n const next = raw.replaceAll(\"@/\", `${aliasSymbol}/`);\r\n if (next !== raw) await fs.writeFile(f, next, \"utf8\");\r\n }\r\n}\r\n\r\nexport function initCommand() {\r\n const cmd = new Command(\"init\")\r\n .description(\"初始化新项目:安装依赖、生成 lib/utils.ts、配置 tailwind 与 CSS 变量,并写入 components.json\")\r\n .option(\"--cwd <path>\", \"目标项目目录\", process.cwd())\r\n .option(\"--pm <pm>\", \"包管理器:pnpm|npm|yarn|bun\")\r\n .option(\"--yes\", \"跳过交互,使用默认值\", false)\r\n .option(\"--overwrite\", \"覆盖已存在的模板文件(lib/composables)\", false)\r\n .option(\r\n \"--config <path>\",\r\n \"配置文件路径(相对 cwd)\",\r\n DEFAULT_CONFIG_PATH,\r\n )\r\n .option(\r\n \"--components-dir <path>\",\r\n \"组件写入目录\",\r\n defaultConfig().componentsDir,\r\n )\r\n .option(\r\n \"--lib-dir <path>\",\r\n \"lib 目录(cn/utils)\",\r\n defaultConfig().libDir,\r\n )\r\n .option(\r\n \"--composables-dir <path>\",\r\n \"composables 目录\",\r\n defaultConfig().composablesDir,\r\n )\r\n .option(\r\n \"--alias-symbol <symbol>\",\r\n \"项目根目录映射别名符号(默认 @)\",\r\n defaultConfig().aliasSymbol,\r\n )\r\n .option(\"--registry <pkgOrPath>\", \"registry 来源(默认 builtin)\", defaultConfig().registry)\r\n .action(async (opts) => {\r\n const cwd = path.resolve(opts.cwd);\r\n\r\n // eslint-disable-next-line no-console\r\n console.log(\r\n \"提示:项目中有部分依赖需要使用@/ 路径进行配置,请您安装到项目中配置好的路径下,请慎重选择文件位置\",\r\n );\r\n\r\n const pkgPath = path.join(cwd, \"package.json\");\r\n if (!(await pathExists(pkgPath))) {\r\n throw new Error(`未找到 package.json:${pkgPath}`);\r\n }\r\n\r\n const pm: PackageManager =\r\n opts.pm ?? (await detectPackageManager(cwd));\r\n\r\n const cfg: CliConfig = {\r\n schemaVersion: 1,\r\n componentsDir: opts.componentsDir,\r\n libDir: opts.libDir,\r\n composablesDir: opts.composablesDir,\r\n aliasSymbol: opts.aliasSymbol,\r\n registry: opts.registry,\r\n };\r\n\r\n // 如果已存在 components.json,默认沿用(除非用户显式传参覆盖)\r\n const existing = await loadConfigCompat(cwd);\r\n if (existing) {\r\n cfg.componentsDir = opts.componentsDir ?? existing.componentsDir ?? cfg.componentsDir;\r\n cfg.libDir = opts.libDir ?? existing.libDir ?? cfg.libDir;\r\n cfg.composablesDir = opts.composablesDir ?? existing.composablesDir ?? cfg.composablesDir;\r\n cfg.aliasSymbol = opts.aliasSymbol ?? existing.aliasSymbol ?? cfg.aliasSymbol;\r\n cfg.registry = opts.registry ?? existing.registry ?? cfg.registry;\r\n }\r\n\r\n if (!opts.yes) {\r\n const nuxt = await looksLikeNuxtProject(cwd);\r\n const res = await prompts(\r\n [\r\n {\r\n type: \"text\",\r\n name: \"componentsDir\",\r\n message: \"组件目录(componentsDir)\",\r\n initial: cfg.componentsDir,\r\n },\r\n {\r\n type: \"text\",\r\n name: \"libDir\",\r\n message: \"lib 目录(libDir,用于 cn/utils)\",\r\n initial: cfg.libDir,\r\n },\r\n {\r\n type: \"text\",\r\n name: \"composablesDir\",\r\n message: \"composables 目录(composablesDir)\",\r\n initial: cfg.composablesDir,\r\n },\r\n {\r\n type: \"text\",\r\n name: \"aliasSymbol\",\r\n message: \"基于项目根目录的“映射”的符号是?(aliasSymbol)\",\r\n initial: cfg.aliasSymbol ?? \"@\",\r\n },\r\n {\r\n type: \"text\",\r\n name: \"registry\",\r\n message: \"registry(包名或路径)\",\r\n initial: cfg.registry,\r\n },\r\n {\r\n type: \"confirm\",\r\n name: \"installBaseDeps\",\r\n message: `安装基础依赖(clsx、tailwind-merge、tailwindcss 等)?`,\r\n initial: true,\r\n },\r\n {\r\n type: nuxt ? \"confirm\" : null,\r\n name: \"installDocs\",\r\n message: `检测到 Nuxt:若缺失则安装 shadcn-docs-nuxt?`,\r\n initial: true,\r\n },\r\n ],\r\n {\r\n onCancel: () => {\r\n throw new Error(\"已取消\");\r\n },\r\n },\r\n );\r\n\r\n cfg.componentsDir = res.componentsDir ?? cfg.componentsDir;\r\n cfg.libDir = res.libDir ?? cfg.libDir;\r\n cfg.composablesDir = res.composablesDir ?? cfg.composablesDir;\r\n cfg.aliasSymbol = res.aliasSymbol ?? cfg.aliasSymbol;\r\n cfg.registry = res.registry ?? cfg.registry;\r\n\r\n // 写配置\r\n const cfgPath = path.join(cwd, opts.config);\r\n await writeJsonFile(cfgPath, cfg);\r\n\r\n const pkg = await readPackageJson(cwd);\r\n const wantDeps: string[] = [];\r\n if (res.installBaseDeps)\r\n wantDeps.push(\"clsx\", \"tailwind-merge\", \"tailwindcss\", \"postcss\", \"autoprefixer\");\r\n if (res.installDocs) wantDeps.push(\"shadcn-docs-nuxt\");\r\n const missing = getMissingDeps(pkg, wantDeps);\r\n // tailwind 相关更适合 devDependencies,但为简化:统一装到 dependencies(pnpm add)\r\n await installDeps({ cwd, pm, deps: missing });\r\n\r\n // 复制模板:lib/ + composables/\r\n await copyTemplateSubdir({\r\n subdir: \"lib\",\r\n cwd,\r\n targetDir: cfg.libDir,\r\n overwrite: opts.overwrite,\r\n });\r\n await copyTemplateSubdir({\r\n subdir: \"composables\",\r\n cwd,\r\n targetDir: cfg.composablesDir,\r\n overwrite: opts.overwrite,\r\n });\r\n // 仅替换 \"@/...\" 的别名符号,不改其它路径内容\r\n await rewriteAliasInDir({ cwd, targetDir: cfg.libDir, aliasSymbol: cfg.aliasSymbol ?? \"@\" });\r\n await rewriteAliasInDir({\r\n cwd,\r\n targetDir: cfg.composablesDir,\r\n aliasSymbol: cfg.aliasSymbol ?? \"@\",\r\n });\r\n\r\n // 兜底:如果用户模板里没有 utils.ts,则生成 cn\r\n const libUtilsPath = path.join(cwd, cfg.libDir, \"utils.ts\");\r\n if (!(await pathExists(libUtilsPath))) await writeTextFile(libUtilsPath, cnUtilsTs({}));\r\n\r\n // 写 CSS 变量文件\r\n const cssRel = \"assets/css/reborn-ui.css\";\r\n const cssAbs = path.join(cwd, cssRel);\r\n if (!(await pathExists(cssAbs))) {\r\n await writeTextFile(cssAbs, defaultCssVariables());\r\n }\r\n\r\n // tailwind.config.ts:存在则补 content;不存在则生成\r\n const contentGlobs = [\r\n \"./components/**/*.{vue,js,ts}\",\r\n \"./layouts/**/*.{vue,js,ts}\",\r\n \"./pages/**/*.{vue,js,ts}\",\r\n \"./plugins/**/*.{js,ts}\",\r\n \"./app.vue\",\r\n \"./error.vue\",\r\n \"./content/**/*.{md,yml,yaml,json}\",\r\n `./${cfg.componentsDir}/**/*.{vue,js,ts}`,\r\n `./${cfg.composablesDir}/**/*.{js,ts}`,\r\n ];\r\n const twPath = path.join(cwd, \"tailwind.config.ts\");\r\n if (await pathExists(twPath)) {\r\n const rawTw = await fs.readFile(twPath, \"utf8\");\r\n if (isTailwindConfig(rawTw)) {\r\n const patched = patchTailwindContentArray(rawTw, contentGlobs);\r\n if (patched && patched !== rawTw) {\r\n await fs.writeFile(twPath, patched, \"utf8\");\r\n }\r\n }\r\n } else {\r\n const templatePath = path.join(getTemplatesRootDir(), \"tailwind.config.template\");\r\n let templateContent = await fs.readFile(templatePath, \"utf8\");\r\n // <%- contentGlobs %> removed from template, no replacement needed\r\n await writeTextFile(twPath, templateContent);\r\n }\r\n\r\n // Nuxt:把 CSS 文件加入 nuxt.config.ts(尽量自动化)\r\n await patchNuxtConfigAddCss({ cwd, cssPath: `~/${cssRel}` });\r\n\r\n // eslint-disable-next-line no-console\r\n console.log(\r\n `已写入配置:${path.relative(process.cwd(), cfgPath)};并生成 cn/utils、tailwind 配置与 CSS 变量(pm=${pm})`,\r\n );\r\n return;\r\n }\r\n\r\n // --yes:直接写默认配置并安装基础依赖(缺失则补)\r\n const cfgPath = path.join(cwd, opts.config);\r\n await ensureDir(path.dirname(cfgPath));\r\n await fs.writeFile(cfgPath, JSON.stringify(cfg, null, 2) + \"\\n\", \"utf8\");\r\n\r\n const pkg = await readPackageJson(cwd);\r\n const wantDeps = [\"clsx\", \"tailwind-merge\", \"tailwindcss\", \"postcss\", \"autoprefixer\"];\r\n if (await looksLikeNuxtProject(cwd)) wantDeps.push(\"shadcn-docs-nuxt\");\r\n const missing = getMissingDeps(pkg, wantDeps);\r\n await installDeps({ cwd, pm, deps: missing });\r\n\r\n // 复制模板:lib/ + composables/\r\n await copyTemplateSubdir({\r\n subdir: \"lib\",\r\n cwd,\r\n targetDir: cfg.libDir,\r\n overwrite: opts.overwrite,\r\n });\r\n await copyTemplateSubdir({\r\n subdir: \"composables\",\r\n cwd,\r\n targetDir: cfg.composablesDir,\r\n overwrite: opts.overwrite,\r\n });\r\n // 仅替换 \"@/...\" 的别名符号,不改其它路径内容\r\n await rewriteAliasInDir({ cwd, targetDir: cfg.libDir, aliasSymbol: cfg.aliasSymbol ?? \"@\" });\r\n await rewriteAliasInDir({\r\n cwd,\r\n targetDir: cfg.composablesDir,\r\n aliasSymbol: cfg.aliasSymbol ?? \"@\",\r\n });\r\n\r\n // 兜底:如果用户模板里没有 utils.ts,则生成 cn\r\n const libUtilsPath = path.join(cwd, cfg.libDir, \"utils.ts\");\r\n if (!(await pathExists(libUtilsPath))) await writeTextFile(libUtilsPath, cnUtilsTs({}));\r\n\r\n // 写 CSS 变量文件\r\n const cssRel = \"assets/css/reborn-ui.css\";\r\n const cssAbs = path.join(cwd, cssRel);\r\n if (!(await pathExists(cssAbs))) {\r\n await writeTextFile(cssAbs, defaultCssVariables());\r\n }\r\n\r\n // tailwind.config.ts:存在则补 content;不存在则生成\r\n const contentGlobs = [\r\n \"./components/**/*.{vue,js,ts}\",\r\n \"./layouts/**/*.{vue,js,ts}\",\r\n \"./pages/**/*.{vue,js,ts}\",\r\n \"./plugins/**/*.{js,ts}\",\r\n \"./app.vue\",\r\n \"./error.vue\",\r\n \"./content/**/*.{md,yml,yaml,json}\",\r\n `./${cfg.componentsDir}/**/*.{vue,js,ts}`,\r\n `./${cfg.composablesDir}/**/*.{js,ts}`,\r\n ];\r\n const twPath = path.join(cwd, \"tailwind.config.ts\");\r\n if (await pathExists(twPath)) {\r\n const rawTw = await fs.readFile(twPath, \"utf8\");\r\n const patched = patchTailwindContentArray(rawTw, contentGlobs);\r\n if (patched && patched !== rawTw) await fs.writeFile(twPath, patched, \"utf8\");\r\n } else {\r\n const templatePath = path.join(getTemplatesRootDir(), \"tailwind.config.template\");\r\n let templateContent = await fs.readFile(templatePath, \"utf8\");\r\n // <%- contentGlobs %> removed from template, no replacement needed\r\n await writeTextFile(twPath, templateContent);\r\n }\r\n\r\n await patchNuxtConfigAddCss({ cwd, cssPath: `~/${cssRel}` });\r\n\r\n // eslint-disable-next-line no-console\r\n console.log(\r\n `已初始化:${path.relative(process.cwd(), cfgPath)};并生成 cn/utils、tailwind 配置与 CSS 变量(pm=${pm})`,\r\n );\r\n });\r\n\r\n return cmd;\r\n}\r\n\r\n\r\n","import path from \"node:path\";\nimport fs from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { pathExists } from \"./fs.js\";\nimport { copyDirRecursive } from \"./fs.js\";\n\nfunction findNearestPackageRoot(from: string) {\n // from: import.meta.url\n let dir = path.dirname(fileURLToPath(from));\n while (true) {\n if (fs.existsSync(path.join(dir, \"package.json\"))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) return dir;\n dir = parent;\n }\n}\n\nexport function getTemplatesRootDir() {\n // 注意:CLI 打包后可能变成单文件(dist/index.js),此时 import.meta.url 的相对基准会变化。\n // 通过向上查找最近的 package.json 来定位包根目录。\n const pkgRoot = findNearestPackageRoot(import.meta.url);\n return path.join(pkgRoot, \"templates\");\n}\n\nexport async function copyTemplateSubdir(params: {\n subdir: \"lib\" | \"composables\";\n cwd: string;\n targetDir: string;\n overwrite?: boolean;\n}) {\n const templatesRoot = getTemplatesRootDir();\n const fromDir = path.join(templatesRoot, params.subdir);\n if (!(await pathExists(fromDir))) return false;\n\n const toDir = path.join(params.cwd, params.targetDir);\n await copyDirRecursive({ fromDir, toDir, overwrite: params.overwrite });\n return true;\n}\n\n\n\n\n\n\n"],"mappings":"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","names":["Command","path","fs","path","path","path","fs","path","fs","require","path","path","fs","Command","path","Command","fs","path","fs","Command","prompts","path","fs","fileURLToPath","findNearestPackageRoot","path","fileURLToPath","fs","path","fs","patched","Command","prompts","cfgPath","pkg","wantDeps","missing","libUtilsPath","cssRel","cssAbs","contentGlobs","twPath","Command"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/add.ts","../src/utils/fs.ts","../src/utils/pm.ts","../src/utils/registry.ts","../src/commands/build.ts","../src/utils/imports.ts","../src/commands/init.ts","../src/utils/templates.ts","../package.json"],"sourcesContent":["import { Command } from \"commander\";\r\nimport { addCommand } from \"./commands/add.js\";\r\nimport { buildCommand } from \"./commands/build.js\";\r\nimport { initCommand } from \"./commands/init.js\";\r\nimport packageJson from \"../package.json\" assert { type: \"json\" };\r\n\r\nconst program = new Command()\r\n .name(\"reborn-ui\")\r\n .description(\"Reborn UI - 组件安装与 registry 辅助 CLI\")\r\n .version(packageJson.version);\r\n\r\nprogram.addCommand(initCommand());\r\nprogram.addCommand(addCommand());\r\nprogram.addCommand(buildCommand());\r\n\r\nawait program.parseAsync(process.argv);\r\n\r\n\r\n","import path from \"node:path\";\r\nimport { Command } from \"commander\";\r\nimport prompts from \"prompts\";\r\nimport type { PackageManager, RegistryComponent } from \"../types.js\";\r\nimport { ensureDir, pathExists, writeTextFile } from \"../utils/fs.js\";\r\nimport {\r\n detectPackageManager,\r\n getMissingDeps,\r\n installDeps,\r\n readPackageJson,\r\n} from \"../utils/pm.js\";\r\nimport { defaultConfig, loadConfigCompat, loadRegistry } from \"../utils/registry.js\";\r\n\r\nfunction rewriteImports(params: {\r\n content: string;\r\n aliasSymbol: string;\r\n}) {\r\n const { content, aliasSymbol } = params;\r\n if (!aliasSymbol || aliasSymbol === \"@\") return content;\r\n\r\n // 仅替换项目根目录映射符号:把 \"@/xxx\" -> \"<aliasSymbol>/xxx\"\r\n // 注意:不要影响 scoped package(@scope/name),这里只替换 \"@/\" 前缀。\r\n return content.replaceAll(\"@/\", `${aliasSymbol}/`);\r\n}\r\n\r\nasync function writeComponentFiles(params: {\r\n cwd: string;\r\n componentsDir: string;\r\n aliasSymbol: string;\r\n component: RegistryComponent;\r\n overwrite?: boolean;\r\n}) {\r\n const { cwd, componentsDir, aliasSymbol, component, overwrite } = params;\r\n const baseDir = path.join(cwd, componentsDir, component.name);\r\n await ensureDir(baseDir);\r\n\r\n for (const f of component.files) {\r\n const target = path.join(baseDir, ...f.path.split(\"/\"));\r\n if (!overwrite && (await pathExists(target))) continue;\r\n const nextContent = rewriteImports({ content: f.content, aliasSymbol });\r\n await writeTextFile(target, nextContent);\r\n }\r\n\r\n return baseDir;\r\n}\r\n\r\nexport function addCommand() {\r\n const cmd = new Command(\"add\")\r\n .description(\"向项目中添加组件与相关依赖\")\r\n .argument(\"[components...]\", \"组件名(可多个)\")\r\n .option(\"--cwd <path>\", \"目标项目目录\", process.cwd())\r\n .option(\"--pm <pm>\", \"包管理器:pnpm|npm|yarn|bun\")\r\n .option(\"--yes\", \"跳过交互\", false)\r\n .option(\"--overwrite\", \"覆盖已存在文件\", false)\r\n .option(\"--config <path>\", \"配置文件路径(相对 cwd)\", \"components.json\")\r\n .option(\"--registry <pkgOrPath>\", \"覆盖配置里的 registry\")\r\n .option(\"--components-dir <path>\", \"覆盖配置里的 componentsDir\")\r\n .option(\"--lib-dir <path>\", \"覆盖配置里的 libDir\")\r\n .option(\"--alias-symbol <symbol>\", \"覆盖配置里的 aliasSymbol(默认 @)\")\r\n .action(async (components: string[], opts) => {\r\n const cwd = path.resolve(opts.cwd);\r\n const pm: PackageManager =\r\n opts.pm ?? (await detectPackageManager(cwd));\r\n\r\n const cfg = (await loadConfigCompat(cwd, opts.config)) ?? defaultConfig();\r\n if (opts.registry) cfg.registry = opts.registry;\r\n if (opts.componentsDir) cfg.componentsDir = opts.componentsDir;\r\n if (opts.libDir) cfg.libDir = opts.libDir;\r\n if (opts.aliasSymbol) cfg.aliasSymbol = opts.aliasSymbol;\r\n\r\n const registry = await loadRegistry({ cwd, registry: cfg.registry });\r\n\r\n let targets = components ?? [];\r\n if (!targets.length) {\r\n if (opts.yes) {\r\n throw new Error(\"未指定组件名;请传入组件参数或去掉 --yes 以交互选择。\");\r\n }\r\n const choices = registry.components.map((c) => ({\r\n title: c.name,\r\n value: c.name,\r\n }));\r\n const res = await prompts(\r\n [\r\n {\r\n type: \"multiselect\",\r\n name: \"selected\",\r\n message: \"选择要添加的组件\",\r\n choices,\r\n min: 1,\r\n },\r\n ],\r\n {\r\n onCancel: () => {\r\n throw new Error(\"已取消\");\r\n },\r\n },\r\n );\r\n targets = res.selected ?? [];\r\n }\r\n\r\n const pkg = await readPackageJson(cwd);\r\n const allDeps = new Set<string>();\r\n\r\n for (const name of targets) {\r\n const c = registry.components.find((x) => x.name === name);\r\n if (!c) throw new Error(`registry 中不存在该组件:${name}`);\r\n\r\n const outDir = await writeComponentFiles({\r\n cwd,\r\n componentsDir: cfg.componentsDir,\r\n aliasSymbol: cfg.aliasSymbol ?? \"@\",\r\n component: c,\r\n overwrite: opts.overwrite,\r\n });\r\n\r\n // eslint-disable-next-line no-console\r\n console.log(`已写入组件:${name} -> ${path.relative(cwd, outDir)}`);\r\n\r\n for (const dep of c.dependencies) allDeps.add(dep);\r\n }\r\n\r\n const missing = getMissingDeps(pkg, [...allDeps]);\r\n await installDeps({ cwd, pm, deps: missing });\r\n\r\n // eslint-disable-next-line no-console\r\n console.log(\r\n `完成:添加 ${targets.length} 个组件;补装依赖 ${missing.length} 个(pm=${pm})`,\r\n );\r\n });\r\n\r\n return cmd;\r\n}\r\n\r\n\r\n","import { createHash } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport async function pathExists(p: string) {\n try {\n await fs.access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function ensureDir(dirPath: string) {\n await fs.mkdir(dirPath, { recursive: true });\n}\n\nexport async function readJsonFile<T>(filePath: string): Promise<T> {\n const raw = await fs.readFile(filePath, \"utf8\");\n return JSON.parse(raw) as T;\n}\n\nexport async function writeJsonFile(filePath: string, data: unknown) {\n await ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, JSON.stringify(data, null, 2) + \"\\n\", \"utf8\");\n}\n\nexport async function writeTextFile(filePath: string, content: string) {\n await ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, content, \"utf8\");\n}\n\nexport async function listFilesRecursive(\n dirPath: string,\n opts?: { ignoreDirNames?: Set<string> },\n) {\n const ignoreDirNames =\n opts?.ignoreDirNames ??\n new Set([\"node_modules\", \".git\", \".nuxt\", \"dist\", \".output\"]);\n\n const out: string[] = [];\n\n async function walk(current: string) {\n const entries = await fs.readdir(current, { withFileTypes: true });\n for (const entry of entries) {\n const p = path.join(current, entry.name);\n if (entry.isDirectory()) {\n if (ignoreDirNames.has(entry.name)) continue;\n await walk(p);\n } else if (entry.isFile()) {\n out.push(p);\n }\n }\n }\n\n await walk(dirPath);\n return out;\n}\n\nexport async function copyDirRecursive(params: {\n fromDir: string;\n toDir: string;\n overwrite?: boolean;\n ignoreFileNames?: Set<string>;\n}) {\n const { fromDir, toDir, overwrite } = params;\n const ignoreFileNames = params.ignoreFileNames ?? new Set([\".DS_Store\"]);\n\n const entries = await fs.readdir(fromDir, { withFileTypes: true });\n await ensureDir(toDir);\n\n for (const entry of entries) {\n if (ignoreFileNames.has(entry.name)) continue;\n const from = path.join(fromDir, entry.name);\n const to = path.join(toDir, entry.name);\n\n if (entry.isDirectory()) {\n await copyDirRecursive({ fromDir: from, toDir: to, overwrite, ignoreFileNames });\n continue;\n }\n\n if (!entry.isFile()) continue;\n\n if (!overwrite) {\n try {\n await fs.access(to);\n continue; // 已存在则跳过\n } catch {\n // not exists\n }\n }\n\n await ensureDir(path.dirname(to));\n await fs.copyFile(from, to);\n }\n}\n\nexport function sha1(text: string) {\n return createHash(\"sha1\").update(text).digest(\"hex\");\n}\n\n\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\nimport { execa } from \"execa\";\r\nimport type { PackageManager } from \"../types.js\";\r\nimport { pathExists, readJsonFile, writeJsonFile } from \"./fs.js\";\r\n\r\nexport async function detectPackageManager(cwd: string): Promise<PackageManager> {\r\n if (await pathExists(path.join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\r\n if (await pathExists(path.join(cwd, \"yarn.lock\"))) return \"yarn\";\r\n if (await pathExists(path.join(cwd, \"package-lock.json\"))) return \"npm\";\r\n if (await pathExists(path.join(cwd, \"bun.lockb\"))) return \"bun\";\r\n return \"pnpm\";\r\n}\r\n\r\nexport async function readPackageJson(\r\n cwd: string,\r\n): Promise<Record<string, any> & { dependencies?: Record<string, string>; devDependencies?: Record<string, string> }> {\r\n return await readJsonFile(path.join(cwd, \"package.json\"));\r\n}\r\n\r\nexport async function writePackageJson(cwd: string, pkg: unknown) {\r\n await writeJsonFile(path.join(cwd, \"package.json\"), pkg);\r\n}\r\n\r\nexport function getMissingDeps(\r\n pkg: { dependencies?: Record<string, string>; devDependencies?: Record<string, string> },\r\n deps: string[],\r\n) {\r\n const existing = new Set([\r\n ...Object.keys(pkg.dependencies ?? {}),\r\n ...Object.keys(pkg.devDependencies ?? {}),\r\n ]);\r\n return deps.filter((d) => !existing.has(d));\r\n}\r\n\r\nexport async function installDeps(params: {\r\n cwd: string;\r\n pm: PackageManager;\r\n deps: string[];\r\n dev?: boolean;\r\n}) {\r\n const { cwd, pm, deps, dev } = params;\r\n if (!deps.length) return;\r\n\r\n const args: string[] = [];\r\n if (pm === \"pnpm\") args.push(\"add\");\r\n else if (pm === \"npm\") args.push(\"install\");\r\n else if (pm === \"yarn\") args.push(\"add\");\r\n else if (pm === \"bun\") args.push(\"add\");\r\n\r\n if (dev) {\r\n if (pm === \"npm\") args.push(\"--save-dev\");\r\n else args.push(\"-D\");\r\n }\r\n\r\n args.push(...deps);\r\n\r\n await execa(pm, args, { cwd, stdio: \"inherit\" });\r\n}\r\n\r\nexport async function ensureJsonFile(cwd: string, relPath: string, defaultJson: unknown) {\r\n const p = path.join(cwd, relPath);\r\n if (await pathExists(p)) return;\r\n await fs.mkdir(path.dirname(p), { recursive: true });\r\n await fs.writeFile(p, JSON.stringify(defaultJson, null, 2) + \"\\n\", \"utf8\");\r\n}\r\n\r\n\r\n","import path from \"node:path\";\nimport fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\nimport type { CliConfig, RegistryFile } from \"../types.js\";\nimport { pathExists, readJsonFile } from \"./fs.js\";\n\nexport const DEFAULT_CONFIG_PATH = \"components.json\";\n\nfunction findNearestPackageRoot(from: string) {\n // from: import.meta.url\n let dir = path.dirname(fileURLToPath(from));\n while (true) {\n if (fs.existsSync(path.join(dir, \"package.json\"))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) return dir;\n dir = parent;\n }\n}\n\nexport function defaultConfig(): CliConfig {\n return {\n schemaVersion: 1,\n componentsDir: \"components\",\n libDir: \"lib\",\n composablesDir: \"composables\",\n // 默认使用 CLI 包内置的 registry(随 reborn-ui 一起发布)\n registry: \"builtin\",\n // 项目根目录映射别名符号(默认 @)\n aliasSymbol: \"@\",\n };\n}\n\nexport async function loadConfig(cwd: string, configPath = DEFAULT_CONFIG_PATH) {\n const abs = path.isAbsolute(configPath)\n ? configPath\n : path.join(cwd, configPath);\n if (!(await pathExists(abs))) return null;\n return await readJsonFile<CliConfig>(abs);\n}\n\nexport function resolveRegistryJsonPath(params: { cwd: string; registry: string }) {\n const { cwd, registry } = params;\n\n // 0) 内置 registry\n if (!registry || registry === \"builtin\") {\n // 注意:CLI 经过打包后可能变成单文件(例如 dist/index.js),\n // import.meta.url 的相对基准会变化,不能用固定的 ../../registry/...\n // 这里通过向上查找最近的 package.json 来定位包根目录。\n const pkgRoot = findNearestPackageRoot(import.meta.url);\n return path.join(pkgRoot, \"registry\", \"registry.json\");\n }\n\n // 1) 如果是文件路径(包含分隔符或 .json),优先当成路径处理\n const looksLikePath =\n registry.includes(\"/\") ||\n registry.includes(\"\\\\\") ||\n registry.endsWith(\".json\");\n\n if (looksLikePath) {\n const abs = path.isAbsolute(registry) ? registry : path.join(cwd, registry);\n return abs;\n }\n\n // 2) 当成包名处理:默认读取 <pkg>/registry/registry.json\n const require = createRequire(import.meta.url);\n // 不显式绑定 cwd,避免 npx 场景下找不到 registry 包\n return require.resolve(`${registry}/registry/registry.json`);\n}\n\nexport async function loadRegistry(params: { cwd: string; registry: string }) {\n const jsonPath = resolveRegistryJsonPath(params);\n return await readJsonFile<RegistryFile>(jsonPath);\n}\n\n// 兼容旧配置文件名:shadcn-docs.json\nexport async function loadConfigCompat(cwd: string, configPath?: string) {\n if (configPath) return await loadConfig(cwd, configPath);\n const primary = await loadConfig(cwd, DEFAULT_CONFIG_PATH);\n if (primary) return primary;\n return await loadConfig(cwd, \"shadcn-docs.json\");\n}\n\n\n","import path from \"node:path\";\r\nimport fs from \"node:fs/promises\";\r\nimport fssync from \"node:fs\";\r\nimport { Command } from \"commander\";\r\nimport type { RegistryComponent, RegistryFile } from \"../types.js\";\r\nimport { listFilesRecursive, sha1, writeJsonFile } from \"../utils/fs.js\";\r\nimport { extractNpmDependenciesFromText } from \"../utils/imports.js\";\r\n\r\nfunction isAllowedFile(filePath: string) {\r\n const ext = path.extname(filePath).toLowerCase();\r\n return [\r\n \".vue\",\r\n \".ts\",\r\n \".js\",\r\n \".json\",\r\n \".css\",\r\n \".md\",\r\n \".svg\",\r\n ].includes(ext);\r\n}\r\n\r\nfunction findWorkspaceRoot(startDir: string) {\r\n let current = path.resolve(startDir);\r\n for (;;) {\r\n const marker = path.join(current, \"pnpm-workspace.yaml\");\r\n if (fssync.existsSync(marker)) return current;\r\n const parent = path.dirname(current);\r\n if (parent === current) return startDir;\r\n current = parent;\r\n }\r\n}\r\n\r\nexport function buildCommand() {\r\n const cmd = new Command(\"build\")\r\n .description(\"(内部)扫描组件源码并生成 registry JSON\")\r\n .option(\"--root <path>\", \"仓库根目录(默认自动向上查找 pnpm-workspace.yaml)\")\r\n .option(\r\n \"--source <path>\",\r\n \"组件源码目录(相对 root)\",\r\n \"components/content/reborn\",\r\n )\r\n .option(\r\n \"--out <path>\",\r\n \"输出 registry.json 路径(相对 root)\",\r\n \"packages/cli/registry/registry.json\",\r\n )\r\n .option(\r\n \"--also-out <path>\",\r\n \"额外再输出一份 registry.json(可重复传参)\",\r\n (val, acc: string[]) => {\r\n acc.push(val);\r\n return acc;\r\n },\r\n [],\r\n )\r\n .action(async (opts) => {\r\n const rootDir = opts.root\r\n ? path.resolve(opts.root)\r\n : findWorkspaceRoot(process.cwd());\r\n const sourceDir = path.join(rootDir, opts.source);\r\n const outPath = path.join(rootDir, opts.out);\r\n const alsoOutPaths: string[] = (opts.alsoOut ?? []).map((p: string) =>\r\n path.join(rootDir, p),\r\n );\r\n\r\n const dirents = await fs.readdir(sourceDir, { withFileTypes: true });\r\n const componentDirs = dirents\r\n .filter((d) => d.isDirectory())\r\n .map((d) => path.join(sourceDir, d.name))\r\n .sort((a, b) => a.localeCompare(b));\r\n\r\n const components: RegistryComponent[] = [];\r\n\r\n for (const absComponentDir of componentDirs) {\r\n const name = path.basename(absComponentDir);\r\n const absFiles = (await listFilesRecursive(absComponentDir)).filter(\r\n isAllowedFile,\r\n );\r\n\r\n const files: RegistryComponent[\"files\"] = [];\r\n const depSet = new Set<string>();\r\n\r\n for (const absFile of absFiles) {\r\n const rel = path\r\n .relative(absComponentDir, absFile)\r\n .split(path.sep)\r\n .join(\"/\");\r\n const content = await fs.readFile(absFile, \"utf8\");\r\n files.push({ path: rel, content });\r\n\r\n // 只从代码文件里抽依赖\r\n const ext = path.extname(absFile).toLowerCase();\r\n if (ext === \".ts\" || ext === \".js\" || ext === \".vue\") {\r\n for (const dep of extractNpmDependenciesFromText(content)) {\r\n depSet.add(dep);\r\n }\r\n }\r\n }\r\n\r\n components.push({\r\n name,\r\n dependencies: [...depSet].sort(),\r\n files,\r\n });\r\n }\r\n\r\n const registry: RegistryFile = {\r\n schemaVersion: 1,\r\n generatedAt: new Date().toISOString(),\r\n source: {\r\n rootDir: rootDir.split(path.sep).join(\"/\"),\r\n componentsDir: opts.source,\r\n },\r\n components,\r\n };\r\n\r\n async function writeOut(targetRegistryPath: string) {\r\n const outComponentsDir = path.join(\r\n path.dirname(targetRegistryPath),\r\n \"components\",\r\n );\r\n await writeJsonFile(targetRegistryPath, registry);\r\n\r\n // 额外输出每个组件的 json,方便调试/按需读取\r\n await fs.mkdir(outComponentsDir, { recursive: true });\r\n for (const c of components) {\r\n await writeJsonFile(\r\n path.join(outComponentsDir, `${c.name}.json`),\r\n {\r\n ...c,\r\n fileCount: c.files.length,\r\n contentHash: sha1(JSON.stringify(c.files.map((f) => f.content))),\r\n },\r\n );\r\n }\r\n }\r\n\r\n await writeOut(outPath);\r\n for (const p of alsoOutPaths) await writeOut(p);\r\n\r\n // eslint-disable-next-line no-console\r\n console.log(\r\n `registry 已生成:${path.relative(process.cwd(), outPath)}(${components.length} 个组件)`,\r\n );\r\n });\r\n\r\n return cmd;\r\n}\r\n\r\n\r\n","const IMPORT_RE =\r\n /\\bfrom\\s+[\"']([^\"']+)[\"']|\\bimport\\(\\s*[\"']([^\"']+)[\"']\\s*\\)|\\brequire\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/g;\r\n\r\nfunction normalizePackageName(specifier: string) {\r\n // ignore relative/alias/virtual\r\n if (\r\n specifier.startsWith(\".\") ||\r\n specifier.startsWith(\"/\") ||\r\n specifier.startsWith(\"@/\") ||\r\n specifier.startsWith(\"~/\") ||\r\n specifier.startsWith(\"#\") ||\r\n specifier.startsWith(\"virtual:\")\r\n ) {\r\n return null;\r\n }\r\n\r\n // scoped package: @scope/name[/...]\r\n if (specifier.startsWith(\"@\")) {\r\n const parts = specifier.split(\"/\");\r\n if (parts.length >= 2) return `${parts[0]}/${parts[1]}`;\r\n return specifier;\r\n }\r\n\r\n // normal package: name[/...]\r\n return specifier.split(\"/\")[0] ?? null;\r\n}\r\n\r\nexport function extractNpmDependenciesFromText(text: string) {\r\n const out = new Set<string>();\r\n\r\n for (const match of text.matchAll(IMPORT_RE)) {\r\n const spec = match[1] ?? match[2] ?? match[3];\r\n if (!spec) continue;\r\n const pkg = normalizePackageName(spec);\r\n if (!pkg) continue;\r\n out.add(pkg);\r\n }\r\n\r\n // 常见“框架自带/不应自动安装”的虚拟模块\r\n out.delete(\"nuxt\");\r\n out.delete(\"vue\");\r\n\r\n return [...out].sort();\r\n}\r\n\r\n\r\n","import path from \"node:path\";\r\nimport fs from \"node:fs/promises\";\r\nimport { Command } from \"commander\";\r\nimport prompts from \"prompts\";\r\nimport type { CliConfig, PackageManager } from \"../types.js\";\r\nimport { ensureDir, listFilesRecursive, pathExists, writeJsonFile, writeTextFile } from \"../utils/fs.js\";\r\nimport {\r\n detectPackageManager,\r\n getMissingDeps,\r\n installDeps,\r\n readPackageJson,\r\n} from \"../utils/pm.js\";\r\nimport { DEFAULT_CONFIG_PATH, defaultConfig, loadConfigCompat } from \"../utils/registry.js\";\r\nimport { copyTemplateSubdir } from \"../utils/templates.js\";\r\n\r\nfunction looksLikeNuxtProject(cwd: string) {\r\n return Promise.all([\r\n pathExists(path.join(cwd, \"nuxt.config.ts\")),\r\n pathExists(path.join(cwd, \"nuxt.config.js\")),\r\n pathExists(path.join(cwd, \"nuxt.config.mjs\")),\r\n ]).then((arr) => arr.some(Boolean));\r\n}\r\n\r\n\r\n// function makeDefaultTailwindConfig removed in favor of template file\r\n\r\n\r\n\r\n\r\nfunction cnUtilsTs(params: { importPath?: string }) {\r\n // importPath 预留:如果用户想从别处导入 clsx/twMerge\r\n void params;\r\n return `import { type ClassValue, clsx } from \"clsx\";\\nimport { twMerge } from \"tailwind-merge\";\\n\\nexport function cn(...inputs: ClassValue[]) {\\n return twMerge(clsx(inputs));\\n}\\n`;\r\n}\r\n\r\nasync function rewriteAliasInDir(params: {\r\n cwd: string;\r\n targetDir: string;\r\n aliasSymbol: string;\r\n}) {\r\n const { cwd, targetDir, aliasSymbol } = params;\r\n if (!aliasSymbol || aliasSymbol === \"@\") return;\r\n const absDir = path.join(cwd, targetDir);\r\n if (!(await pathExists(absDir))) return;\r\n\r\n const files = await listFilesRecursive(absDir);\r\n for (const f of files) {\r\n const ext = path.extname(f).toLowerCase();\r\n // 只处理常见文本文件,避免误改二进制\r\n if (![\".ts\", \".tsx\", \".js\", \".jsx\", \".vue\", \".mjs\", \".cjs\"].includes(ext)) continue;\r\n const raw = await fs.readFile(f, \"utf8\");\r\n const next = raw.replaceAll(\"@/\", `${aliasSymbol}/`);\r\n if (next !== raw) await fs.writeFile(f, next, \"utf8\");\r\n }\r\n}\r\n\r\nexport function initCommand() {\r\n const cmd = new Command(\"init\")\r\n .description(\"初始化新项目\")\r\n .option(\"--cwd <path>\", \"目标项目目录\", process.cwd())\r\n .option(\"--pm <pm>\", \"包管理器:pnpm|npm|yarn|bun\")\r\n .option(\"--yes\", \"跳过交互,使用默认值\", false)\r\n .option(\"--overwrite\", \"覆盖已存在的模板文件(lib/composables)\", false)\r\n .option(\r\n \"--config <path>\",\r\n \"配置文件路径(相对 cwd)\",\r\n DEFAULT_CONFIG_PATH,\r\n )\r\n .option(\r\n \"--components-dir <path>\",\r\n \"组件写入目录\",\r\n defaultConfig().componentsDir,\r\n )\r\n .option(\r\n \"--lib-dir <path>\",\r\n \"lib 目录(cn/utils)\",\r\n defaultConfig().libDir,\r\n )\r\n .option(\r\n \"--composables-dir <path>\",\r\n \"composables 目录\",\r\n defaultConfig().composablesDir,\r\n )\r\n .option(\r\n \"--alias-symbol <symbol>\",\r\n \"项目根目录映射别名符号(默认 @)\",\r\n defaultConfig().aliasSymbol,\r\n )\r\n .option(\"--registry <pkgOrPath>\", \"registry 来源(默认 builtin)\", defaultConfig().registry)\r\n .action(async (opts) => {\r\n const cwd = path.resolve(opts.cwd);\r\n\r\n // eslint-disable-next-line no-console\r\n console.log(\r\n \"提示:项目中有部分依赖需要使用@/ 路径进行配置,请您安装到项目中配置好的路径下,请慎重选择文件位置\",\r\n );\r\n\r\n const pkgPath = path.join(cwd, \"package.json\");\r\n if (!(await pathExists(pkgPath))) {\r\n throw new Error(`未找到 package.json:${pkgPath}`);\r\n }\r\n\r\n const pm: PackageManager =\r\n opts.pm ?? (await detectPackageManager(cwd));\r\n\r\n const cfg: CliConfig = {\r\n schemaVersion: 1,\r\n componentsDir: opts.componentsDir,\r\n libDir: opts.libDir,\r\n composablesDir: opts.composablesDir,\r\n aliasSymbol: opts.aliasSymbol,\r\n registry: opts.registry,\r\n };\r\n\r\n // 如果已存在 components.json,默认沿用(除非用户显式传参覆盖)\r\n const existing = await loadConfigCompat(cwd);\r\n if (existing) {\r\n cfg.componentsDir = opts.componentsDir ?? existing.componentsDir ?? cfg.componentsDir;\r\n cfg.libDir = opts.libDir ?? existing.libDir ?? cfg.libDir;\r\n cfg.composablesDir = opts.composablesDir ?? existing.composablesDir ?? cfg.composablesDir;\r\n cfg.aliasSymbol = opts.aliasSymbol ?? existing.aliasSymbol ?? cfg.aliasSymbol;\r\n cfg.registry = opts.registry ?? existing.registry ?? cfg.registry;\r\n }\r\n\r\n if (!opts.yes) {\r\n const nuxt = await looksLikeNuxtProject(cwd);\r\n const res = await prompts(\r\n [\r\n {\r\n type: \"text\",\r\n name: \"componentsDir\",\r\n message: \"组件目录(componentsDir)\",\r\n initial: cfg.componentsDir,\r\n },\r\n {\r\n type: \"text\",\r\n name: \"libDir\",\r\n message: \"lib 目录(libDir,用于 cn/utils)\",\r\n initial: cfg.libDir,\r\n },\r\n {\r\n type: \"text\",\r\n name: \"composablesDir\",\r\n message: \"composables 目录(composablesDir)\",\r\n initial: cfg.composablesDir,\r\n },\r\n {\r\n type: \"text\",\r\n name: \"aliasSymbol\",\r\n message: \"基于项目根目录的“映射”的符号是?(aliasSymbol)\",\r\n initial: cfg.aliasSymbol ?? \"@\",\r\n },\r\n ],\r\n {\r\n onCancel: () => {\r\n throw new Error(\"已取消\");\r\n },\r\n },\r\n );\r\n\r\n cfg.componentsDir = res.componentsDir ?? cfg.componentsDir;\r\n cfg.libDir = res.libDir ?? cfg.libDir;\r\n cfg.composablesDir = res.composablesDir ?? cfg.composablesDir;\r\n cfg.aliasSymbol = res.aliasSymbol ?? cfg.aliasSymbol;\r\n\r\n // 写配置\r\n const cfgPath = path.join(cwd, opts.config);\r\n await writeJsonFile(cfgPath, cfg);\r\n\r\n // 复制模板:lib/ + composables/\r\n await copyTemplateSubdir({\r\n subdir: \"lib\",\r\n cwd,\r\n targetDir: cfg.libDir,\r\n overwrite: opts.overwrite,\r\n });\r\n await copyTemplateSubdir({\r\n subdir: \"composables\",\r\n cwd,\r\n targetDir: cfg.composablesDir,\r\n overwrite: opts.overwrite,\r\n });\r\n // 仅替换 \"@/...\" 的别名符号,不改其它路径内容\r\n await rewriteAliasInDir({ cwd, targetDir: cfg.libDir, aliasSymbol: cfg.aliasSymbol ?? \"@\" });\r\n await rewriteAliasInDir({\r\n cwd,\r\n targetDir: cfg.composablesDir,\r\n aliasSymbol: cfg.aliasSymbol ?? \"@\",\r\n });\r\n\r\n // 兜底:如果用户模板里没有 utils.ts,则生成 cn\r\n const libUtilsPath = path.join(cwd, cfg.libDir, \"utils.ts\");\r\n if (!(await pathExists(libUtilsPath))) await writeTextFile(libUtilsPath, cnUtilsTs({}));\r\n\r\n // eslint-disable-next-line no-console\r\n console.log(`已写入配置:${path.relative(process.cwd(), cfgPath)};并生成 cn/utils(pm=${pm})`);\r\n console.log(\"请按照 https://tw.icebreaker.top/docs/quick-start/v4/uni-app-vite 指引进行项目配置初始化\");\r\n return;\r\n }\r\n\r\n // --yes:直接写默认配置\r\n const cfgPath = path.join(cwd, opts.config);\r\n await ensureDir(path.dirname(cfgPath));\r\n await fs.writeFile(cfgPath, JSON.stringify(cfg, null, 2) + \"\\n\", \"utf8\");\r\n\r\n // 复制模板:lib/ + composables/\r\n await copyTemplateSubdir({\r\n subdir: \"lib\",\r\n cwd,\r\n targetDir: cfg.libDir,\r\n overwrite: opts.overwrite,\r\n });\r\n await copyTemplateSubdir({\r\n subdir: \"composables\",\r\n cwd,\r\n targetDir: cfg.composablesDir,\r\n overwrite: opts.overwrite,\r\n });\r\n // 仅替换 \"@/...\" 的别名符号,不改其它路径内容\r\n await rewriteAliasInDir({ cwd, targetDir: cfg.libDir, aliasSymbol: cfg.aliasSymbol ?? \"@\" });\r\n await rewriteAliasInDir({\r\n cwd,\r\n targetDir: cfg.composablesDir,\r\n aliasSymbol: cfg.aliasSymbol ?? \"@\",\r\n });\r\n\r\n // 兜底:如果用户模板里没有 utils.ts,则生成 cn\r\n const libUtilsPath = path.join(cwd, cfg.libDir, \"utils.ts\");\r\n if (!(await pathExists(libUtilsPath))) await writeTextFile(libUtilsPath, cnUtilsTs({}));\r\n\r\n // eslint-disable-next-line no-console\r\n console.log(`已初始化:${path.relative(process.cwd(), cfgPath)};并生成 cn/utils(pm=${pm})`);\r\n console.log(\"请按照 https://tw.icebreaker.top/docs/quick-start/v4/uni-app-vite 指引进行项目配置初始化\");\r\n });\r\n\r\n return cmd;\r\n}\r\n\r\n\r\n","import path from \"node:path\";\nimport fs from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { pathExists } from \"./fs.js\";\nimport { copyDirRecursive } from \"./fs.js\";\n\nfunction findNearestPackageRoot(from: string) {\n // from: import.meta.url\n let dir = path.dirname(fileURLToPath(from));\n while (true) {\n if (fs.existsSync(path.join(dir, \"package.json\"))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) return dir;\n dir = parent;\n }\n}\n\nexport function getTemplatesRootDir() {\n // 注意:CLI 打包后可能变成单文件(dist/index.js),此时 import.meta.url 的相对基准会变化。\n // 通过向上查找最近的 package.json 来定位包根目录。\n const pkgRoot = findNearestPackageRoot(import.meta.url);\n return path.join(pkgRoot, \"templates\");\n}\n\nexport async function copyTemplateSubdir(params: {\n subdir: \"lib\" | \"composables\";\n cwd: string;\n targetDir: string;\n overwrite?: boolean;\n}) {\n const templatesRoot = getTemplatesRootDir();\n const fromDir = path.join(templatesRoot, params.subdir);\n if (!(await pathExists(fromDir))) return false;\n\n const toDir = path.join(params.cwd, params.targetDir);\n await copyDirRecursive({ fromDir, toDir, overwrite: params.overwrite });\n return true;\n}\n\n\n\n\n\n\n","{\r\n \"name\": \"reborn-ui\",\r\n \"version\": \"0.1.4\",\r\n \"description\": \"A CLI for Reborn UI\",\r\n \"author\": \"1997liuyh-boop\",\r\n \"license\": \"MIT\",\r\n \"repository\": {\r\n \"type\": \"git\",\r\n \"url\": \"https://github.com/1997liuyh-boop/Reborn-UI.git\"\r\n },\r\n \"type\": \"module\",\r\n \"bin\": {\r\n \"reborn-ui\": \"dist/index.js\"\r\n },\r\n \"files\": [\r\n \"dist\",\r\n \"registry\",\r\n \"templates\",\r\n \"README.md\"\r\n ],\r\n \"publishConfig\": {\r\n \"access\": \"public\"\r\n },\r\n \"scripts\": {\r\n \"cli\": \"tsx src/index.ts\",\r\n \"build\": \"tsup\",\r\n \"dev\": \"tsx src/index.ts\",\r\n \"clean\": \"rimraf dist\",\r\n \"prepare\": \"tsup\",\r\n \"registry:build\": \"tsx src/index.ts build --root ../..\",\r\n \"prepack\": \"npm run build && npm run registry:build\",\r\n \"prepublishOnly\": \"npm run build && npm run registry:build\"\r\n },\r\n \"dependencies\": {\r\n \"commander\": \"^14.0.0\",\r\n \"execa\": \"^9.6.0\",\r\n \"prompts\": \"^2.4.2\"\r\n },\r\n \"devDependencies\": {\r\n \"@types/node\": \"^22.10.7\",\r\n \"@types/prompts\": \"^2.4.9\",\r\n \"rimraf\": \"^6.0.1\",\r\n \"tsup\": \"^8.5.0\",\r\n \"tsx\": \"^4.20.0\",\r\n \"typescript\": \"^5.8.3\"\r\n }\r\n}"],"mappings":"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","names":["Command","path","fs","path","path","path","fs","path","fs","require","path","path","fs","Command","path","Command","fs","path","fs","Command","prompts","path","fs","fileURLToPath","findNearestPackageRoot","path","fileURLToPath","fs","path","fs","Command","prompts","cfgPath","libUtilsPath","Command"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reborn-ui",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "A CLI for Reborn UI",
5
5
  "author": "1997liuyh-boop",
6
6
  "license": "MIT",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "generatedAt": "2025-12-31T03:34:46.615Z",
3
+ "generatedAt": "2025-12-31T07:33:01.790Z",
4
4
  "source": {
5
5
  "rootDir": "D:/demo/shadcn-docs-nuxt-starter",
6
6
  "componentsDir": "components/content/reborn"
@@ -20,3 +20,5 @@ export function useMouseState() {
20
20
 
21
21
 
22
22
 
23
+
24
+
@@ -1,117 +0,0 @@
1
- import type { Config } from 'tailwindcss'
2
- import animate from 'tailwindcss-animate';
3
-
4
- export default <Config>{
5
- content: [resolve("./**/*.{uvue,vue}"), "!**/node_modules/**", "!**/dist/**"],
6
- darkMode: "class",
7
- theme: {
8
- extend: {
9
- // 1. 字体家族配置
10
- fontFamily: {
11
- sans: [
12
- '-apple-system',
13
- 'BlinkMacSystemFont',
14
- '"PingFang SC"',
15
- '"Microsoft YaHei"',
16
- '"Noto Sans SC"',
17
- 'Roboto',
18
- 'Helvetica',
19
- 'Arial',
20
- 'sans-serif',
21
- ],
22
- },
23
- // 2. 颜色规范 (包含品牌色与中性色)
24
- colors: {
25
- red: {
26
- 1: '#FFEBEE',
27
- 2: '#FFE0E4',
28
- 3: '#FFB1BC',
29
- 4: '#FF8B9B',
30
- 5: '#FF6675',
31
- 6: '#FF3D58',
32
- 7: '#D92946',
33
- 8: '#B31938',
34
- 9: '#8C0D2A',
35
- 10: '#660821',
36
- },
37
- orange: {
38
- 1: '#FFF6E7',
39
- 2: '#FFE9C9',
40
- 3: '#FFD5A0',
41
- 4: '#FFC370',
42
- 5: '#FFB03B',
43
- 6: '#FF9711',
44
- 7: '#BF7C2A',
45
- 8: '#995C1A',
46
- 9: '#733D0E',
47
- 10: '#522601',
48
- },
49
- green: {
50
- 1: '#F1FAF8',
51
- 2: '#E7F6F3',
52
- 3: '#A2DFCF',
53
- 4: '#5FCFAD',
54
- 5: '#3AC29E',
55
- 6: '#16AE88',
56
- 7: '#0B876C',
57
- 8: '#036150',
58
- 9: '#003B32',
59
- 10: '#001412',
60
- },
61
- blue: {
62
- 1: '#ECF9FF',
63
- 2: '#DFF4FF',
64
- 3: '#9ED6F5',
65
- 4: '#61CCFF',
66
- 5: '#35B6F2',
67
- 6: '#0D99E5',
68
- 7: '#0277BF',
69
- 8: '#005999',
70
- 9: '#003F73',
71
- 10: '#00284D',
72
- },
73
- gray: {
74
- 1: '#FFFFFF',
75
- 2: '#F5F5F5',
76
- 3: '#EEEEEE',
77
- 4: '#CCCCCC',
78
- 5: '#AAAAAA',
79
- 6: '#999999',
80
- 7: '#666666',
81
- 8: '#333333',
82
- },
83
- },
84
- // 3. 字号规范
85
- fontSize: {
86
- '3xs': '20px', // 辅助文字 (sub-sm)
87
- '2xs': '22px', // 辅助文字 (sub-md)
88
- 'xs': '24px', // 辅助文字 (sub-lg)
89
- 'sm': '26px', // 正文 (main-sm)
90
- 'base': '28px', // 正文 (main)
91
- 'lg': '30px', // 标题 (title-sub)
92
- 'xl': '32px', // 标题 (title-primary)
93
- '2xl': '36px', // 标题 (title-lg)
94
- '3xl': '40px', // 标题 (title-xl)
95
- '4xl': '48px', // 标题 (title-2xl)
96
- '5xl': '52px', // 标题 (title-3xl)
97
- },
98
- // 4. 行高规范
99
- lineHeight: {
100
- tight: '1.3', // 紧凑
101
- normal: '1.5', // 常规 (默认)
102
- relaxed: '1.7', // 宽松
103
- none: '1.0', // 无行高
104
- },
105
- // 5. 圆角规范
106
- borderRadius: {
107
- 'xs': '4px',
108
- 'sm': '6px',
109
- 'md': '8px',
110
- 'lg': '12px',
111
- 'xl': '16px', // 常规
112
- '2xl': '24px',
113
- },
114
- },
115
- },
116
- plugins: [animate],
117
- }