@fumadocs/cli 1.3.2 → 1.3.3

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.
Files changed (47) hide show
  1. package/dist/build/index.d.ts +4 -6
  2. package/dist/build/index.d.ts.map +1 -1
  3. package/dist/build/index.js +10 -18
  4. package/dist/build/index.js.map +1 -1
  5. package/dist/{client-YTcWP1iz.js → client-C2A4Jf2w.js} +1 -1
  6. package/dist/{client-YTcWP1iz.js.map → client-C2A4Jf2w.js.map} +1 -1
  7. package/dist/{config-Dyass4D9.d.ts → config-Bx-m6awG.d.ts} +9 -5
  8. package/dist/config-Bx-m6awG.d.ts.map +1 -0
  9. package/dist/config.d.ts +2 -2
  10. package/dist/config.js +74 -1
  11. package/dist/config.js.map +1 -0
  12. package/dist/{fs-CigSthjp.js → fs-C3j4H046.js} +1 -1
  13. package/dist/{fs-CigSthjp.js.map → fs-C3j4H046.js.map} +1 -1
  14. package/dist/{ast-BRNdmLn5.js → import-CSbSteB3.js} +56 -2
  15. package/dist/import-CSbSteB3.js.map +1 -0
  16. package/dist/index.js +13 -15
  17. package/dist/index.js.map +1 -1
  18. package/dist/installer-BWoLnsXE.js +673 -0
  19. package/dist/installer-BWoLnsXE.js.map +1 -0
  20. package/dist/registry/client.d.ts +17 -9
  21. package/dist/registry/client.d.ts.map +1 -1
  22. package/dist/registry/client.js +1 -1
  23. package/dist/registry/installer/index.d.ts +17 -27
  24. package/dist/registry/installer/index.d.ts.map +1 -1
  25. package/dist/registry/installer/index.js +1 -3
  26. package/dist/registry/macros/route-handler.d.ts +21 -0
  27. package/dist/registry/macros/route-handler.d.ts.map +1 -0
  28. package/dist/registry/macros/route-handler.js +11 -0
  29. package/dist/registry/macros/route-handler.js.map +1 -0
  30. package/dist/registry/schema.d.ts +2 -2
  31. package/dist/registry/schema.js +14 -11
  32. package/dist/registry/schema.js.map +1 -1
  33. package/dist/{schema-DrgqlhpT.d.ts → schema-BAaUX4uu.d.ts} +21 -10
  34. package/dist/schema-BAaUX4uu.d.ts.map +1 -0
  35. package/dist/schema.json +1 -0
  36. package/dist/types-79PW0lgM.d.ts +6 -0
  37. package/dist/types-79PW0lgM.d.ts.map +1 -0
  38. package/package.json +6 -6
  39. package/dist/ast-BRNdmLn5.js.map +0 -1
  40. package/dist/config-BYrMmXOw.js +0 -55
  41. package/dist/config-BYrMmXOw.js.map +0 -1
  42. package/dist/config-Dyass4D9.d.ts.map +0 -1
  43. package/dist/installer-B3-my9zN.js +0 -248
  44. package/dist/installer-B3-my9zN.js.map +0 -1
  45. package/dist/schema/default.json +0 -1
  46. package/dist/schema/src.json +0 -1
  47. package/dist/schema-DrgqlhpT.d.ts.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-BYrMmXOw.js","names":[],"sources":["../src/utils/is-src.ts","../src/config.ts"],"sourcesContent":["import { exists } from '@/utils/fs';\n\nexport async function isSrc(): Promise<boolean> {\n return exists('./src');\n}\n","import fs from 'node:fs/promises';\nimport { isSrc } from '@/utils/is-src';\nimport { z } from 'zod';\n\nexport function createConfigSchema(isSrc: boolean) {\n const defaultAliases = {\n uiDir: './components/ui',\n componentsDir: './components',\n layoutDir: './layouts',\n cssDir: './styles',\n libDir: './lib',\n };\n\n return z.object({\n $schema: z\n .string()\n .default(\n isSrc\n ? 'node_modules/@fumadocs/cli/dist/schema/src.json'\n : 'node_modules/@fumadocs/cli/dist/schema/default.json',\n )\n .optional(),\n aliases: z\n .object({\n uiDir: z.string().default(defaultAliases.uiDir),\n componentsDir: z.string().default(defaultAliases.uiDir),\n layoutDir: z.string().default(defaultAliases.layoutDir),\n cssDir: z.string().default(defaultAliases.componentsDir),\n libDir: z.string().default(defaultAliases.libDir),\n })\n .default(defaultAliases),\n\n baseDir: z.string().default(isSrc ? 'src' : ''),\n uiLibrary: z.enum(['radix-ui', 'base-ui']).default('radix-ui'),\n\n commands: z\n .object({\n /**\n * command to format output code automatically\n */\n format: z.string().optional(),\n })\n .default({}),\n });\n}\n\ntype ConfigSchema = ReturnType<typeof createConfigSchema>;\n\nexport type ConfigInput = z.input<ConfigSchema>;\nexport type LoadedConfig = z.output<ConfigSchema>;\n\nexport async function createOrLoadConfig(file = './cli.json'): Promise<LoadedConfig> {\n const inited = await initConfig(file);\n if (inited) return inited;\n\n const content = (await fs.readFile(file)).toString();\n const src = await isSrc();\n const configSchema = createConfigSchema(src);\n\n return configSchema.parse(JSON.parse(content));\n}\n\n/**\n * Write new config, skip if a config already exists\n *\n * @returns the created config, `undefined` if not created\n */\nexport async function initConfig(\n file = './cli.json',\n src?: boolean,\n): Promise<LoadedConfig | undefined> {\n if (\n await fs\n .stat(file)\n .then(() => true)\n .catch(() => false)\n ) {\n return;\n }\n\n const defaultConfig = await getDefaultConfig(src);\n await fs.writeFile(file, JSON.stringify(defaultConfig, null, 2));\n return defaultConfig;\n}\n\nexport async function getDefaultConfig(src?: boolean) {\n return createConfigSchema(src ?? (await isSrc())).parse({} satisfies ConfigInput);\n}\n"],"mappings":";;;;AAEA,eAAsB,QAA0B;AAC9C,QAAO,OAAO,QAAQ;;;;ACCxB,SAAgB,mBAAmB,OAAgB;CACjD,MAAM,iBAAiB;EACrB,OAAO;EACP,eAAe;EACf,WAAW;EACX,QAAQ;EACR,QAAQ;EACT;AAED,QAAO,EAAE,OAAO;EACd,SAAS,EACN,QAAQ,CACR,QACC,QACI,oDACA,sDACL,CACA,UAAU;EACb,SAAS,EACN,OAAO;GACN,OAAO,EAAE,QAAQ,CAAC,QAAQ,eAAe,MAAM;GAC/C,eAAe,EAAE,QAAQ,CAAC,QAAQ,eAAe,MAAM;GACvD,WAAW,EAAE,QAAQ,CAAC,QAAQ,eAAe,UAAU;GACvD,QAAQ,EAAE,QAAQ,CAAC,QAAQ,eAAe,cAAc;GACxD,QAAQ,EAAE,QAAQ,CAAC,QAAQ,eAAe,OAAO;GAClD,CAAC,CACD,QAAQ,eAAe;EAE1B,SAAS,EAAE,QAAQ,CAAC,QAAQ,QAAQ,QAAQ,GAAG;EAC/C,WAAW,EAAE,KAAK,CAAC,YAAY,UAAU,CAAC,CAAC,QAAQ,WAAW;EAE9D,UAAU,EACP,OAAO,EAIN,QAAQ,EAAE,QAAQ,CAAC,UAAU,EAC9B,CAAC,CACD,QAAQ,EAAE,CAAC;EACf,CAAC;;AAQJ,eAAsB,mBAAmB,OAAO,cAAqC;CACnF,MAAM,SAAS,MAAM,WAAW,KAAK;AACrC,KAAI,OAAQ,QAAO;CAEnB,MAAM,WAAW,MAAM,GAAG,SAAS,KAAK,EAAE,UAAU;AAIpD,QAFqB,mBADT,MAAM,OAAO,CACmB,CAExB,MAAM,KAAK,MAAM,QAAQ,CAAC;;;;;;;AAQhD,eAAsB,WACpB,OAAO,cACP,KACmC;AACnC,KACE,MAAM,GACH,KAAK,KAAK,CACV,WAAW,KAAK,CAChB,YAAY,MAAM,CAErB;CAGF,MAAM,gBAAgB,MAAM,iBAAiB,IAAI;AACjD,OAAM,GAAG,UAAU,MAAM,KAAK,UAAU,eAAe,MAAM,EAAE,CAAC;AAChE,QAAO;;AAGT,eAAsB,iBAAiB,KAAe;AACpD,QAAO,mBAAmB,OAAQ,MAAM,OAAO,CAAE,CAAC,MAAM,EAAE,CAAuB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-Dyass4D9.d.ts","names":[],"sources":["../src/config.ts"],"mappings":";;;iBAIgB,kBAAA,CAAmB,KAAA,YAAc,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;KA0C5C,YAAA,GAAe,UAAA,QAAkB,kBAAA;AAAA,KAE1B,WAAA,GAAc,CAAA,CAAE,KAAA,CAAM,YAAA;AAAA,KACtB,YAAA,GAAe,CAAA,CAAE,MAAA,CAAO,YAAA;AAAA,iBAEd,kBAAA,CAAmB,IAAA,YAAsB,OAAA,CAAQ,YAAA;;;;;;iBAgBjD,UAAA,CACpB,IAAA,WACA,GAAA,aACC,OAAA,CAAQ,YAAA;AAAA,iBAeW,gBAAA,CAAiB,GAAA,aAAa,OAAA"}
@@ -1,248 +0,0 @@
1
- import { n as transformSpecifiers, r as typescriptExtensions, t as toImportSpecifier } from "./ast-BRNdmLn5.js";
2
- import { r as createCache, t as HttpRegistryClient } from "./client-YTcWP1iz.js";
3
- import fs from "node:fs/promises";
4
- import path from "node:path";
5
- import { x } from "tinyexec";
6
- import { parse } from "oxc-parser";
7
- import { detect } from "package-manager-detector";
8
- import MagicString from "magic-string";
9
- //#region src/utils/get-package-manager.ts
10
- async function getPackageManager() {
11
- return (await detect())?.name ?? "npm";
12
- }
13
- //#endregion
14
- //#region src/registry/installer/dep-manager.ts
15
- var DependencyManager = class {
16
- constructor(cwd) {
17
- this.cwd = cwd;
18
- this.installedDeps = /* @__PURE__ */ new Map();
19
- this.dependencies = [];
20
- this.devDependencies = [];
21
- this.packageManager = "npm";
22
- }
23
- async init(deps, devDeps) {
24
- this.installedDeps.clear();
25
- const packageJsonPath = path.join(this.cwd, "package.json");
26
- const content = await fs.readFile(packageJsonPath).then((res) => res.toString()).catch(() => null);
27
- if (content !== null) {
28
- const parsed = JSON.parse(content);
29
- for (const [k, v] of Object.entries(parsed?.dependencies ?? {})) this.installedDeps.set(k, v);
30
- for (const [k, v] of Object.entries(parsed?.devDependencies ?? {})) this.installedDeps.set(k, v);
31
- }
32
- this.dependencies = this.resolveRequiredDependencies(deps);
33
- this.devDependencies = this.resolveRequiredDependencies(devDeps);
34
- this.packageManager = await getPackageManager();
35
- }
36
- resolveRequiredDependencies(deps) {
37
- return Object.entries(deps).filter(([k]) => !this.installedDeps.has(k)).map(([k, v]) => v === null || v.length === 0 ? k : `${k}@${v}`);
38
- }
39
- hasRequired() {
40
- return this.dependencies.length > 0 || this.devDependencies.length > 0;
41
- }
42
- async writeRequired() {
43
- const packageJsonPath = path.join(this.cwd, "package.json");
44
- const content = await fs.readFile(packageJsonPath).catch(() => null);
45
- if (content === null) return false;
46
- const parsed = JSON.parse(content.toString());
47
- if (!parsed) return false;
48
- for (const dep of this.dependencies) {
49
- const { name, version } = parseDep(dep);
50
- parsed.dependencies ??= {};
51
- parsed.dependencies[name] ??= version;
52
- }
53
- for (const dep of this.devDependencies) {
54
- const { name, version } = parseDep(dep);
55
- parsed.devDependencies ??= {};
56
- parsed.devDependencies[name] ??= version;
57
- }
58
- await fs.writeFile(packageJsonPath, JSON.stringify(parsed, null, 2));
59
- }
60
- async installRequired() {
61
- if (this.dependencies.length > 0) await x(this.packageManager, ["install", ...this.dependencies]);
62
- if (this.devDependencies.length > 0) await x(this.packageManager, [
63
- "install",
64
- ...this.devDependencies,
65
- "-D"
66
- ]);
67
- }
68
- };
69
- function parseDep(dep) {
70
- const idx = dep.indexOf("@", 1);
71
- if (idx === -1) return {
72
- name: dep,
73
- version: "latest"
74
- };
75
- else return {
76
- name: dep.slice(0, idx),
77
- version: dep.slice(idx + 1)
78
- };
79
- }
80
- //#endregion
81
- //#region src/registry/installer/index.ts
82
- var ComponentInstaller = class {
83
- constructor(rootClient, options = {}) {
84
- this.rootClient = rootClient;
85
- this.installedFiles = /* @__PURE__ */ new Set();
86
- this.downloadCache = createCache();
87
- this.dependencies = {};
88
- this.devDependencies = {};
89
- this.cwd = options.cwd ?? process.cwd();
90
- this.plugins = options.plugins ?? [];
91
- }
92
- async installComponent(comp, ctx) {
93
- if (ctx.stack.indexOf(comp) !== ctx.stack.length - 1) return;
94
- const pluginCtx = {
95
- installer: this,
96
- ...ctx
97
- };
98
- for (const plugin of this.plugins) comp = await plugin.beforeInstall?.(comp, pluginCtx) ?? comp;
99
- Object.assign(this.dependencies, comp.dependencies);
100
- Object.assign(this.devDependencies, comp.devDependencies);
101
- for (const file of comp.files) {
102
- const outPath = this.resolveOutputPath(file);
103
- if (this.installedFiles.has(outPath)) continue;
104
- this.installedFiles.add(outPath);
105
- const output = typescriptExtensions.includes(path.extname(outPath)) ? await this.transform(file, comp, ctx) : file.content;
106
- const status = await fs.readFile(outPath).then((res) => {
107
- if (res.toString().trim() === output.trim()) return "ignore";
108
- return "need-update";
109
- }).catch(() => "write");
110
- if (status === "ignore") continue;
111
- if (status === "need-update") {
112
- if (!await ctx.io.confirmFileOverride({ path: outPath })) continue;
113
- }
114
- await fs.mkdir(path.dirname(outPath), { recursive: true });
115
- await fs.writeFile(outPath, output);
116
- ctx.io.onFileDownloaded({
117
- path: outPath,
118
- file,
119
- component: comp
120
- });
121
- }
122
- for (const child of comp.$subComponents) {
123
- const stack = [...ctx.stack, child];
124
- const variables = { ...ctx.$variables };
125
- if (child.$registry.registryId !== comp.$registry.registryId) {
126
- const info = await child.$registry.fetchRegistryInfo();
127
- Object.assign(variables, info.variables);
128
- }
129
- Object.assign(variables, child.variables);
130
- await this.installComponent(child, {
131
- ...ctx,
132
- stack,
133
- $variables: variables
134
- });
135
- }
136
- }
137
- async install(name, io) {
138
- let downloaded;
139
- const registry = (await this.rootClient.fetchRegistryInfo()).registries?.find((registry) => name.startsWith(`${registry}/`));
140
- if (registry) downloaded = await this.download(name.slice(registry.length + 1), this.rootClient.createLinkedRegistryClient(registry));
141
- else downloaded = await this.download(name, this.rootClient);
142
- const allComponents = /* @__PURE__ */ new Set();
143
- function scan(comp) {
144
- if (allComponents.has(comp)) return;
145
- allComponents.add(comp);
146
- for (const child of comp.$subComponents) scan(child);
147
- }
148
- scan(downloaded);
149
- const pathToFile = /* @__PURE__ */ new Map();
150
- for (const comp of allComponents) for (const file of comp.files) pathToFile.set(file.target ?? file.path, file);
151
- const info = await downloaded.$registry.fetchRegistryInfo();
152
- await this.installComponent(downloaded, {
153
- pathToFile,
154
- io,
155
- $variables: {
156
- ...info.env,
157
- ...downloaded.variables
158
- },
159
- stack: [downloaded]
160
- });
161
- }
162
- async deps() {
163
- const manager = new DependencyManager(this.cwd);
164
- await manager.init(this.dependencies, this.devDependencies);
165
- return manager;
166
- }
167
- async onEnd() {
168
- const config = this.rootClient.config;
169
- if (config.commands.format) await x(config.commands.format);
170
- }
171
- /**
172
- * download component & its sub components
173
- */
174
- async download(name, client) {
175
- return this.downloadCache.cached(JSON.stringify([client.registryId, name]), async (presolve) => {
176
- for (const plugin of this.plugins) await plugin.beforeDownload?.({
177
- installer: this,
178
- name
179
- });
180
- const comp = await client.fetchComponent(name);
181
- const result = {
182
- ...comp,
183
- $registry: client,
184
- $subComponents: []
185
- };
186
- presolve(result);
187
- result.$subComponents = await Promise.all(comp.subComponents.map((sub) => {
188
- if (typeof sub === "string") return this.download(sub, client);
189
- let subClient;
190
- if (this.rootClient instanceof HttpRegistryClient) {
191
- const baseUrl = new URL(sub.baseUrl, `${this.rootClient.baseUrl}/`).href;
192
- subClient = client instanceof HttpRegistryClient && client.baseUrl === baseUrl ? client : new HttpRegistryClient(baseUrl, client.config);
193
- } else subClient = new HttpRegistryClient(sub.baseUrl, client.config);
194
- return this.download(sub.component, subClient);
195
- }));
196
- for (const plugin of this.plugins) await plugin.afterDownload?.({
197
- installer: this,
198
- name,
199
- result
200
- });
201
- return result;
202
- });
203
- }
204
- async transform(file, component, ctx) {
205
- const filePath = this.resolveOutputPath(file);
206
- const parsed = await parse(filePath, file.content);
207
- const s = new MagicString(file.content);
208
- const transformCtx = {
209
- installer: this,
210
- s,
211
- file,
212
- component,
213
- parsed,
214
- ...ctx
215
- };
216
- for (const plugin of this.plugins) await plugin.beforeTransform?.(transformCtx);
217
- const prefix = "@/";
218
- transformSpecifiers(parsed.program, s, (specifier) => {
219
- for (const [k, v] of Object.entries(ctx.$variables)) if (typeof v === "string") specifier = specifier.replaceAll(`<${k}>`, v);
220
- if (specifier.startsWith(prefix)) {
221
- const lookup = specifier.substring(2);
222
- const target = ctx.pathToFile.get(lookup);
223
- if (target) specifier = toImportSpecifier(filePath, this.resolveOutputPath(target));
224
- else ctx.io.onWarn(`cannot find the referenced file of ${specifier}`);
225
- }
226
- return specifier;
227
- });
228
- for (const plugin of this.plugins) await plugin.afterTransform?.(transformCtx);
229
- return s.toString();
230
- }
231
- resolveOutputPath(file) {
232
- const config = this.rootClient.config;
233
- const dir = {
234
- components: config.aliases.componentsDir,
235
- ui: config.aliases.uiDir,
236
- css: config.aliases.cssDir,
237
- lib: config.aliases.libDir,
238
- layout: config.aliases.layoutDir,
239
- route: "./"
240
- }[file.type];
241
- if (file.target) return path.resolve(this.cwd, config.baseDir, file.target.replace("<dir>", dir));
242
- return path.resolve(this.cwd, config.baseDir, dir, path.basename(file.path));
243
- }
244
- };
245
- //#endregion
246
- export { ComponentInstaller as t };
247
-
248
- //# sourceMappingURL=installer-B3-my9zN.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"installer-B3-my9zN.js","names":[],"sources":["../src/utils/get-package-manager.ts","../src/registry/installer/dep-manager.ts","../src/registry/installer/index.ts"],"sourcesContent":["import { detect, type AgentName } from 'package-manager-detector';\n\nexport type PackageManager = AgentName;\n\nexport async function getPackageManager(): Promise<PackageManager> {\n const result = await detect();\n\n return result?.name ?? 'npm';\n}\n","import fs from 'node:fs/promises';\nimport { getPackageManager, PackageManager } from '@/utils/get-package-manager';\nimport { x } from 'tinyexec';\nimport path from 'node:path';\n\ninterface PackageJsonType {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\nexport class DependencyManager {\n private installedDeps = new Map<string, string>();\n dependencies: string[] = [];\n devDependencies: string[] = [];\n packageManager: PackageManager = 'npm';\n\n constructor(private readonly cwd: string) {}\n\n async init(deps: Record<string, string | null>, devDeps: Record<string, string | null>) {\n this.installedDeps.clear();\n const packageJsonPath = path.join(this.cwd, 'package.json');\n const content = await fs\n .readFile(packageJsonPath)\n .then((res) => res.toString())\n .catch(() => null);\n\n if (content !== null) {\n const parsed = JSON.parse(content) as PackageJsonType;\n\n for (const [k, v] of Object.entries(parsed?.dependencies ?? {})) {\n this.installedDeps.set(k, v);\n }\n\n for (const [k, v] of Object.entries(parsed?.devDependencies ?? {})) {\n this.installedDeps.set(k, v);\n }\n }\n\n this.dependencies = this.resolveRequiredDependencies(deps);\n this.devDependencies = this.resolveRequiredDependencies(devDeps);\n this.packageManager = await getPackageManager();\n }\n\n private resolveRequiredDependencies(deps: Record<string, string | null>): string[] {\n return Object.entries(deps)\n .filter(([k]) => !this.installedDeps.has(k))\n .map(([k, v]) => (v === null || v.length === 0 ? k : `${k}@${v}`));\n }\n\n hasRequired() {\n return this.dependencies.length > 0 || this.devDependencies.length > 0;\n }\n\n async writeRequired() {\n const packageJsonPath = path.join(this.cwd, 'package.json');\n const content = await fs.readFile(packageJsonPath).catch(() => null);\n if (content === null) return false;\n\n const parsed = JSON.parse(content.toString()) as PackageJsonType;\n if (!parsed) return false;\n\n for (const dep of this.dependencies) {\n const { name, version } = parseDep(dep);\n parsed.dependencies ??= {};\n parsed.dependencies[name] ??= version;\n }\n\n for (const dep of this.devDependencies) {\n const { name, version } = parseDep(dep);\n parsed.devDependencies ??= {};\n parsed.devDependencies[name] ??= version;\n }\n\n await fs.writeFile(packageJsonPath, JSON.stringify(parsed, null, 2));\n }\n\n async installRequired() {\n if (this.dependencies.length > 0)\n await x(this.packageManager, ['install', ...this.dependencies]);\n if (this.devDependencies.length > 0)\n await x(this.packageManager, ['install', ...this.devDependencies, '-D']);\n }\n}\n\nfunction parseDep(dep: string) {\n const idx = dep.indexOf('@', 1);\n if (idx === -1) {\n return { name: dep, version: 'latest' };\n } else {\n return { name: dep.slice(0, idx), version: dep.slice(idx + 1) };\n }\n}\n","import path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { typescriptExtensions } from '@/constants';\nimport { toImportSpecifier, transformSpecifiers } from '@/utils/ast';\nimport type { Component, File } from '@/registry/schema';\nimport { HttpRegistryClient, type RegistryClient } from '@/registry/client';\nimport { x } from 'tinyexec';\nimport { DependencyManager } from '@/registry/installer/dep-manager';\nimport { createCache } from '@/utils/cache';\nimport { parse, type ParseResult } from 'oxc-parser';\nimport MagicString from 'magic-string';\n\ninterface PluginContext {\n installer: ComponentInstaller;\n}\n\ninterface TransformContext extends PluginContext, InstallContext {\n s: MagicString;\n parsed: ParseResult;\n file: File;\n component: DownloadedComponent;\n}\n\ninterface InstallContext {\n pathToFile: Map<string, File>;\n io: IOInterface;\n /** full variables of the current component. */\n $variables: Record<string, unknown>;\n /** the last item is always the current component. */\n stack: DownloadedComponent[];\n}\n\ninterface DownloadedComponent extends Component {\n $subComponents: DownloadedComponent[];\n $registry: RegistryClient;\n}\n\ntype Awaitable<T> = T | Promise<T>;\n\nexport interface ComponentInstallerPlugin {\n /**\n * transform file before writing (before default transformation)\n */\n beforeTransform?: (context: TransformContext) => Awaitable<void>;\n\n /**\n * transform file before writing (after default transformation)\n */\n afterTransform?: (context: TransformContext) => Awaitable<void>;\n\n /**\n * transform component before install\n */\n beforeInstall?: (\n comp: DownloadedComponent,\n context: InstallContext & PluginContext,\n ) => Awaitable<DownloadedComponent | undefined>;\n\n beforeDownload?: (\n context: PluginContext & {\n name: string;\n },\n ) => void | Promise<void>;\n\n afterDownload?: (\n context: PluginContext & {\n name: string;\n result: DownloadedComponent;\n },\n ) => void | Promise<void>;\n}\n\nexport interface IOInterface {\n onWarn: (message: string) => void;\n confirmFileOverride: (options: { path: string }) => Promise<boolean>;\n onFileDownloaded: (options: { path: string; file: File; component: Component }) => void;\n}\n\nexport interface ComponentInstallerOptions {\n plugins?: ComponentInstallerPlugin[];\n cwd?: string;\n}\n\nexport class ComponentInstaller {\n private readonly installedFiles = new Set<string>();\n private readonly downloadCache = createCache<DownloadedComponent>();\n private readonly cwd: string;\n private readonly plugins: ComponentInstallerPlugin[];\n readonly dependencies: Record<string, string | null> = {};\n readonly devDependencies: Record<string, string | null> = {};\n\n constructor(\n private readonly rootClient: RegistryClient,\n options: ComponentInstallerOptions = {},\n ) {\n this.cwd = options.cwd ?? process.cwd();\n this.plugins = options.plugins ?? [];\n }\n\n private async installComponent(comp: DownloadedComponent, ctx: InstallContext) {\n // avoid circular refs\n if (ctx.stack.indexOf(comp) !== ctx.stack.length - 1) return;\n\n const pluginCtx = { installer: this, ...ctx };\n for (const plugin of this.plugins) {\n comp = (await plugin.beforeInstall?.(comp, pluginCtx)) ?? comp;\n }\n\n Object.assign(this.dependencies, comp.dependencies);\n Object.assign(this.devDependencies, comp.devDependencies);\n\n for (const file of comp.files) {\n const outPath = this.resolveOutputPath(file);\n if (this.installedFiles.has(outPath)) continue;\n this.installedFiles.add(outPath);\n\n const output = typescriptExtensions.includes(path.extname(outPath))\n ? await this.transform(file, comp, ctx)\n : file.content;\n\n const status = await fs\n .readFile(outPath)\n .then((res) => {\n if (res.toString().trim() === output.trim()) return 'ignore';\n return 'need-update';\n })\n .catch(() => 'write');\n\n if (status === 'ignore') continue;\n\n if (status === 'need-update') {\n const override = await ctx.io.confirmFileOverride({ path: outPath });\n if (!override) continue;\n }\n\n await fs.mkdir(path.dirname(outPath), { recursive: true });\n await fs.writeFile(outPath, output);\n ctx.io.onFileDownloaded({ path: outPath, file, component: comp });\n }\n\n for (const child of comp.$subComponents) {\n const stack = [...ctx.stack, child];\n const variables = { ...ctx.$variables };\n if (child.$registry.registryId !== comp.$registry.registryId) {\n const info = await child.$registry.fetchRegistryInfo();\n Object.assign(variables, info.variables);\n }\n Object.assign(variables, child.variables);\n\n await this.installComponent(child, { ...ctx, stack, $variables: variables });\n }\n }\n\n async install(name: string, io: IOInterface) {\n let downloaded: DownloadedComponent;\n // detect linked registry\n const rootInfo = await this.rootClient.fetchRegistryInfo();\n const registry = rootInfo.registries?.find((registry) => name.startsWith(`${registry}/`));\n\n if (registry) {\n downloaded = await this.download(\n name.slice(registry.length + 1),\n this.rootClient.createLinkedRegistryClient(registry),\n );\n } else {\n downloaded = await this.download(name, this.rootClient);\n }\n\n const allComponents = new Set<DownloadedComponent>();\n function scan(comp: DownloadedComponent) {\n if (allComponents.has(comp)) return;\n\n allComponents.add(comp);\n for (const child of comp.$subComponents) scan(child);\n }\n\n scan(downloaded);\n\n const pathToFile = new Map<string, File>();\n for (const comp of allComponents) {\n for (const file of comp.files) pathToFile.set(file.target ?? file.path, file);\n }\n\n const info = await downloaded.$registry.fetchRegistryInfo();\n await this.installComponent(downloaded, {\n pathToFile,\n io,\n $variables: { ...info.env, ...downloaded.variables },\n stack: [downloaded],\n });\n }\n\n async deps() {\n const manager = new DependencyManager(this.cwd);\n await manager.init(this.dependencies, this.devDependencies);\n return manager;\n }\n\n async onEnd() {\n const config = this.rootClient.config;\n if (config.commands.format) {\n await x(config.commands.format);\n }\n }\n\n /**\n * download component & its sub components\n */\n private async download(name: string, client: RegistryClient): Promise<DownloadedComponent> {\n return this.downloadCache.cached(\n JSON.stringify([client.registryId, name]),\n async (presolve) => {\n for (const plugin of this.plugins) {\n await plugin.beforeDownload?.({\n installer: this,\n name,\n });\n }\n\n const comp = await client.fetchComponent(name);\n const result: DownloadedComponent = {\n ...comp,\n $registry: client,\n $subComponents: [],\n };\n // place it before downloading child components to avoid recursive downloads\n presolve(result);\n\n result.$subComponents = await Promise.all(\n comp.subComponents.map((sub) => {\n if (typeof sub === 'string') return this.download(sub, client);\n\n let subClient: RegistryClient;\n if (this.rootClient instanceof HttpRegistryClient) {\n const baseUrl = new URL(sub.baseUrl, `${this.rootClient.baseUrl}/`).href;\n subClient =\n client instanceof HttpRegistryClient && client.baseUrl === baseUrl\n ? client\n : new HttpRegistryClient(baseUrl, client.config);\n } else {\n subClient = new HttpRegistryClient(sub.baseUrl, client.config);\n }\n\n return this.download(sub.component, subClient);\n }),\n );\n\n for (const plugin of this.plugins) {\n await plugin.afterDownload?.({\n installer: this,\n name,\n result,\n });\n }\n\n return result;\n },\n );\n }\n\n private async transform(\n file: File,\n component: DownloadedComponent,\n ctx: InstallContext,\n ): Promise<string> {\n const filePath = this.resolveOutputPath(file);\n const parsed = await parse(filePath, file.content);\n const s = new MagicString(file.content);\n const transformCtx: TransformContext = { installer: this, s, file, component, parsed, ...ctx };\n\n for (const plugin of this.plugins) {\n await plugin.beforeTransform?.(transformCtx);\n }\n\n // transform alias\n const prefix = '@/';\n\n transformSpecifiers(parsed.program, s, (specifier) => {\n for (const [k, v] of Object.entries(ctx.$variables)) {\n if (typeof v === 'string') specifier = specifier.replaceAll(`<${k}>`, v);\n }\n\n if (specifier.startsWith(prefix)) {\n const lookup = specifier.substring(prefix.length);\n const target = ctx.pathToFile.get(lookup);\n\n if (target) {\n specifier = toImportSpecifier(filePath, this.resolveOutputPath(target));\n } else {\n ctx.io.onWarn(`cannot find the referenced file of ${specifier}`);\n }\n }\n\n return specifier;\n });\n\n for (const plugin of this.plugins) {\n await plugin.afterTransform?.(transformCtx);\n }\n\n return s.toString();\n }\n\n private resolveOutputPath(file: File): string {\n const config = this.rootClient.config;\n const dir = (\n {\n components: config.aliases.componentsDir,\n ui: config.aliases.uiDir,\n css: config.aliases.cssDir,\n lib: config.aliases.libDir,\n layout: config.aliases.layoutDir,\n route: './',\n } as const\n )[file.type];\n if (file.target) {\n return path.resolve(this.cwd, config.baseDir, file.target.replace('<dir>', dir));\n }\n\n return path.resolve(this.cwd, config.baseDir, dir, path.basename(file.path));\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"$schema":{"default":"node_modules/@fumadocs/cli/dist/schema/default.json","type":"string"},"aliases":{"default":{"uiDir":"./components/ui","componentsDir":"./components","layoutDir":"./layouts","cssDir":"./styles","libDir":"./lib"},"type":"object","properties":{"uiDir":{"default":"./components/ui","type":"string"},"componentsDir":{"default":"./components/ui","type":"string"},"layoutDir":{"default":"./layouts","type":"string"},"cssDir":{"default":"./components","type":"string"},"libDir":{"default":"./lib","type":"string"}}},"baseDir":{"default":"","type":"string"},"uiLibrary":{"default":"radix-ui","type":"string","enum":["radix-ui","base-ui"]},"commands":{"default":{},"type":"object","properties":{"format":{"type":"string"}}}}}
@@ -1 +0,0 @@
1
- {"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"$schema":{"default":"node_modules/@fumadocs/cli/dist/schema/src.json","type":"string"},"aliases":{"default":{"uiDir":"./components/ui","componentsDir":"./components","layoutDir":"./layouts","cssDir":"./styles","libDir":"./lib"},"type":"object","properties":{"uiDir":{"default":"./components/ui","type":"string"},"componentsDir":{"default":"./components/ui","type":"string"},"layoutDir":{"default":"./layouts","type":"string"},"cssDir":{"default":"./components","type":"string"},"libDir":{"default":"./lib","type":"string"}}},"baseDir":{"default":"src","type":"string"},"uiLibrary":{"default":"radix-ui","type":"string","enum":["radix-ui","base-ui"]},"commands":{"default":{},"type":"object","properties":{"format":{"type":"string"}}}}}
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema-DrgqlhpT.d.ts","names":[],"sources":["../src/registry/schema.ts"],"mappings":";;;KAEY,aAAA,WAAwB,UAAA;AAAA,KACxB,YAAA,GAAe,CAAA,CAAE,KAAA,QAAa,UAAA;AAAA,KAC9B,iBAAA,GAAoB,CAAA,CAAE,KAAA,QAAa,eAAA;AAAA,KACnC,oBAAA,GAAuB,CAAA,CAAE,KAAA,QAAa,kBAAA;AAAA,KACtC,sBAAA,GAAyB,CAAA,CAAE,MAAA,QAAc,kBAAA;AAAA,KACzC,IAAA,GAAO,CAAA,CAAE,MAAA,QAAc,UAAA;AAAA,KACvB,SAAA,GAAY,CAAA,CAAE,MAAA,QAAc,eAAA;AAAA,cAE3B,UAAA;AAAA,cAEA,WAAA,EAAW,CAAA,CAAA,SAAA;;;;;cAMX,UAAA,EAAU,CAAA,CAAA,SAAA;;;;;;cAOV,gBAAA,EAAgB,CAAA,CAAA,SAAA;;;;;cAMhB,eAAA,EAAe,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;cAoBf,kBAAA,EAAkB,CAAA,CAAA,SAAA"}