create-fumadocs-app 16.2.27 → 16.2.29
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/bin.js +5 -5
- package/dist/bin.js.map +1 -1
- package/dist/{constants-BVDmkkx1.js → constants-BGeuHcdV.js} +30 -17
- package/dist/constants-BGeuHcdV.js.map +1 -0
- package/dist/{feature-EUngoLQC.js → feature-DB9zShId.js} +2 -2
- package/dist/{feature-EUngoLQC.js.map → feature-DB9zShId.js.map} +1 -1
- package/dist/{index-C-_KUJpO.d.ts → index-DHK1sZ4O.d.ts} +2 -2
- package/dist/{index-C-_KUJpO.d.ts.map → index-DHK1sZ4O.d.ts.map} +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/plugins/feature.d.ts +1 -1
- package/dist/plugins/feature.js +1 -1
- package/dist/plugins/next-use-src.d.ts +1 -1
- package/dist/{src-BRd8UCNg.js → src-G2bUVbwQ.js} +2 -2
- package/dist/{src-BRd8UCNg.js.map → src-G2bUVbwQ.js.map} +1 -1
- package/package.json +2 -2
- package/template/+next+fuma-docs-mdx/package.json +1 -1
- package/template/+next+fuma-docs-mdx+static/package.json +1 -1
- package/template/astro/astro.config.mjs +1 -1
- package/template/astro/package.json +1 -1
- package/template/astro/src/lib/shared.ts +9 -5
- package/template/astro/src/pages/docs/[...slug].astro +1 -1
- package/template/astro/src/pages/{llms.mdx/docs/[...slug]/content.md.ts → docs/[...slug].md.ts} +1 -1
- package/template/astro/src/pages/og/docs/[...slug]/image.webp.ts +1 -1
- package/dist/constants-BVDmkkx1.js.map +0 -1
package/dist/bin.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { i as templates, n as isCI } from "./constants-
|
|
3
|
-
import { n as getPackageManager, r as managers, t as create } from "./src-
|
|
4
|
-
import { t as feature } from "./feature-
|
|
2
|
+
import { i as templates, n as isCI } from "./constants-BGeuHcdV.js";
|
|
3
|
+
import { n as getPackageManager, r as managers, t as create } from "./src-G2bUVbwQ.js";
|
|
4
|
+
import { t as feature } from "./feature-DB9zShId.js";
|
|
5
5
|
import fs from "node:fs/promises";
|
|
6
6
|
import path from "node:path";
|
|
7
7
|
import { cancel, confirm, group, intro, isCancel, outro, select, spinner, text } from "@clack/prompts";
|
|
@@ -207,8 +207,8 @@ async function main(defaultName, config) {
|
|
|
207
207
|
process.exit(0);
|
|
208
208
|
} });
|
|
209
209
|
const projectName = options.name.toLowerCase().replace(/\s/, "-");
|
|
210
|
-
if (options.
|
|
211
|
-
console.warn(pc.yellow("AI Chat
|
|
210
|
+
if (options.aiChat && isStatic(options.template)) {
|
|
211
|
+
console.warn(pc.yellow("AI Chat needs a server, the template is static, skipping it."));
|
|
212
212
|
options.aiChat = false;
|
|
213
213
|
}
|
|
214
214
|
if (options.ogImage === "next-og" && !options.template.startsWith("+next")) console.warn(pc.yellow("next/og is only available on Next.js, the template uses Takumi instead."));
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","names":[],"sources":["../src/bin.ts"],"sourcesContent":["#!/usr/bin/env node\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport {\n cancel,\n confirm,\n group,\n intro,\n isCancel,\n outro,\n select,\n spinner,\n text,\n} from '@clack/prompts';\nimport pc from 'picocolors';\nimport { getPackageManager, managers, type PackageManager } from './auto-install';\nimport { create, type Template, type TemplatePlugin } from './index';\nimport { isCI, templates } from './constants';\nimport { cac } from 'cac';\nimport { feature } from './plugins/feature';\nimport { ai, type AIProvider } from '@fumadocs/cli/features/ai';\nimport { lint } from '@fumadocs/cli/features/lint';\nimport { og } from '@fumadocs/cli/features/og';\nimport { search, type SearchProvider } from '@fumadocs/cli/features/search';\n\nconst linters = ['eslint', 'oxlint', 'biome'] as const;\nconst searchProviders = [\n 'orama',\n 'orama-cloud',\n 'algolia',\n 'meilisearch',\n 'typesense',\n 'mixedbread',\n] as const;\nconst ogImages = ['next-og', 'takumi'] as const;\nconst aiChats = ['openrouter', 'llmgateway', 'inkeep'] as const;\nconst templateNames = templates.map((item) => item.value);\n\ninterface CliOptions {\n src?: boolean;\n install?: boolean;\n git: boolean;\n yes?: boolean;\n linter?: (typeof linters)[number];\n search?: SearchProvider | 'orama';\n ogImage?: (typeof ogImages)[number];\n aiChat?: AIProvider;\n template?: Template;\n pm: PackageManager;\n}\n\nconst cli = cac('create-fumadocs-app');\n\ncli\n .command('[name]', 'create a Fumadocs app, [name] is the project name')\n .option('--src', '(Next.js only) enable `src/` directory')\n .option('--install', 'install packages automatically')\n .option('--no-git', 'disable auto Git repository initialization')\n .option('-y, --yes', 'skip prompts and use defaults for unspecified options')\n .option(\n '--linter <name>',\n `configure a linter/formatter, ESLint is currently Next.js only. (${linters.join(', ')})`,\n )\n .option('--search <name>', `configure a search solution (${searchProviders.join(', ')})`)\n .option('--og-image <name>', `configure OG image generation (${ogImages.join(', ')})`)\n .option('--ai-chat <name>', `configure AI chat (${aiChats.join(', ')})`)\n .option('--template <name>', `choose a template (${templateNames.join(', ')})`)\n .option('--pm <name>', `choose a package manager (${managers.join(', ')})`, {\n default: getPackageManager(),\n })\n .action(main);\n\n/** templates without a server at runtime */\nconst isStatic = (template: Template) =>\n template === 'astro' || template === '+next+fuma-docs-mdx+static' || template.endsWith('-spa');\n\nfunction checkOption(name: string, value: string | undefined, choices: readonly string[]) {\n if (value !== undefined && !choices.includes(value))\n throw new Error(`invalid value for --${name}: ${value}, expected: ${choices.join(', ')}`);\n}\n\nasync function main(defaultName: string | undefined, config: CliOptions): Promise<void> {\n checkOption('linter', config.linter, linters);\n checkOption('search', config.search, searchProviders);\n checkOption('og-image', config.ogImage, ogImages);\n checkOption('ai-chat', config.aiChat, aiChats);\n checkOption('template', config.template, templateNames);\n checkOption('pm', config.pm, managers);\n const skipPrompts = isCI || config.yes === true;\n intro(pc.bgCyan(pc.bold('Create Fumadocs App')));\n\n const options = await group(\n {\n name: async () => {\n if (defaultName) return defaultName;\n if (skipPrompts) return 'untitled';\n\n return text({\n message: 'Project name',\n placeholder: 'my-app',\n defaultValue: 'my-app',\n });\n },\n template: async () => {\n if (config.template) return config.template;\n if (skipPrompts) return '+next+fuma-docs-mdx';\n\n return select<Template>({\n message: 'Choose a template',\n initialValue: '+next+fuma-docs-mdx',\n options: templates,\n });\n },\n src: async ({ results }: { results: { template?: Template } }) => {\n if (config.src !== undefined) return config.src;\n if (skipPrompts || !results.template?.startsWith('+next')) return false;\n\n return confirm({\n message: 'Use `/src` directory?',\n initialValue: false,\n });\n },\n lint: async ({ results }: { results: { template?: Template } }) => {\n if (config.linter !== undefined) return config.linter;\n if (skipPrompts) return 'disabled';\n\n return select({\n message: 'Configure linter?',\n options: results.template?.startsWith('+next')\n ? [\n {\n value: 'disabled',\n label: 'Disabled',\n },\n {\n value: 'eslint',\n label: 'ESLint',\n },\n {\n value: 'biome',\n label: 'Biome',\n },\n {\n value: 'oxlint',\n label: 'Oxlint',\n },\n ]\n : [\n {\n value: 'disabled',\n label: 'Disabled',\n },\n {\n value: 'biome',\n label: 'Biome',\n },\n {\n value: 'oxlint',\n label: 'Oxlint',\n },\n ],\n });\n },\n search: async ({ results }: { results: { template?: Template } }) => {\n if (config.search !== undefined) return config.search;\n if (skipPrompts) return 'orama';\n\n return select({\n message: 'Choose a search solution?',\n options: [\n {\n value: 'orama',\n label: 'Default',\n hint: 'local search powered by ZBSearch, recommended',\n },\n {\n value: 'orama-cloud',\n label: 'Orama Cloud',\n hint: '3rd party search solution, signup needed',\n },\n { value: 'algolia', label: 'Algolia', hint: 'signup needed' },\n { value: 'meilisearch', label: 'Meilisearch', hint: 'self-hosted or cloud' },\n { value: 'typesense', label: 'Typesense', hint: 'self-hosted or cloud' },\n // searches on a server\n ...(isStatic(results.template!)\n ? []\n : [{ value: 'mixedbread', label: 'Mixedbread', hint: 'AI search, signup needed' }]),\n ],\n });\n },\n ogImage: async ({ results }: { results: { template?: Template } }) => {\n if (config.ogImage !== undefined) return config.ogImage;\n if (!results.template?.startsWith('+next')) return 'takumi';\n if (skipPrompts) return 'next/og';\n\n return select({\n message: 'Configure Open Graph Image generation?',\n options: [\n {\n value: 'next/og',\n label: 'next/og',\n hint: 'Next.js built-in solution',\n },\n {\n value: 'takumi',\n label: 'Takumi',\n hint: 'Output WebP format, framework-agnostic',\n },\n ],\n });\n },\n aiChat: async ({ results }: { results: { template?: Template } }) => {\n if (config.aiChat !== undefined) return config.aiChat;\n if (skipPrompts || isStatic(results.template!)) return false;\n\n return select<false | 'openrouter' | 'llmgateway' | 'inkeep'>({\n message: 'Configure AI Chat?',\n options: [\n {\n value: false,\n label: 'No',\n },\n {\n value: 'openrouter',\n label: 'AI SDK',\n hint: 'default to OpenRouter',\n },\n {\n value: 'llmgateway',\n label: 'LLMGateway',\n hint: 'open-source LLM gateway, API key required',\n },\n {\n value: 'inkeep',\n label: 'Inkeep AI',\n hint: 'API key required',\n },\n ],\n });\n },\n installDeps: async () => {\n if (config.install !== undefined) return config.install;\n if (skipPrompts) return false;\n\n return confirm({\n message: `Do you want to install packages automatically? (detected as ${config.pm})`,\n });\n },\n },\n {\n onCancel: () => {\n cancel('Installation Stopped.');\n process.exit(0);\n },\n },\n );\n\n const projectName = options.name.toLowerCase().replace(/\\s/, '-');\n if (options.template === 'astro' && options.aiChat) {\n console.warn(pc.yellow('AI Chat is not supported by the Astro template yet, skipping it.'));\n options.aiChat = false;\n }\n if (options.ogImage === 'next-og' && !options.template.startsWith('+next')) {\n console.warn(\n pc.yellow('next/og is only available on Next.js, the template uses Takumi instead.'),\n );\n }\n\n if (!isCI) await checkDir(projectName, skipPrompts);\n\n const info = spinner();\n info.start(`Generating Project`);\n const plugins: TemplatePlugin[] = [];\n\n if (options.src) {\n const { nextUseSrc } = await import('./plugins/next-use-src');\n plugins.push(nextUseSrc());\n }\n\n if (options.search !== 'orama') plugins.push(feature(search, { provider: options.search }));\n if (options.lint !== 'disabled') plugins.push(feature(lint, { linter: options.lint }));\n if (options.ogImage === 'takumi' && options.template.startsWith('+next'))\n plugins.push(feature(og, { engine: 'takumi' }));\n if (options.aiChat) plugins.push(feature(ai, { provider: options.aiChat }));\n\n await create({\n packageManager: config.pm,\n template: options.template,\n outputDir: projectName,\n installDeps: options.installDeps,\n initializeGit: config.git,\n plugins,\n log: (message) => {\n info.message(message);\n },\n });\n\n info.stop('Project Generated');\n\n outro(pc.bgGreen(pc.bold('Done')));\n\n console.log(pc.bold('\\nOpen the project'));\n console.log(pc.cyan(`cd ${projectName}`));\n\n console.log(pc.bold('\\nRun Development Server'));\n if (config.pm === 'npm' || config.pm === 'bun') {\n console.log(pc.cyan(`${config.pm} run dev`));\n } else {\n console.log(pc.cyan(`${config.pm} dev`));\n }\n console.log(pc.bold('\\nYou can now open the project and start writing documents'));\n\n process.exit(0);\n}\n\nasync function checkDir(outputDir: string, skipPrompts: boolean) {\n const destDir = await fs.readdir(outputDir).catch(() => null);\n if (!destDir || destDir.length === 0) return;\n if (skipPrompts) {\n cancel(`directory ${outputDir} already exists and is not empty.`);\n process.exit(1);\n }\n const del = await confirm({\n message: `directory ${outputDir} already exists, do you want to delete its files?`,\n });\n\n if (isCancel(del)) {\n cancel();\n process.exit(1);\n }\n\n if (!del) return;\n\n const info = spinner();\n info.start(`Deleting files in ${outputDir}`);\n\n await Promise.all(\n destDir.map((item) => {\n return fs.rm(path.join(outputDir, item), {\n recursive: true,\n force: true,\n });\n }),\n );\n\n info.stop(`Deleted files in ${outputDir}`);\n}\n\ncli.help();\n\ntry {\n cli.parse(process.argv, { run: false });\n await cli.runMatchedCommand();\n} catch (e) {\n console.error(pc.red(e instanceof Error ? e.message : String(e)));\n process.exit(1);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bin.js","names":[],"sources":["../src/bin.ts"],"sourcesContent":["#!/usr/bin/env node\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport {\n cancel,\n confirm,\n group,\n intro,\n isCancel,\n outro,\n select,\n spinner,\n text,\n} from '@clack/prompts';\nimport pc from 'picocolors';\nimport { getPackageManager, managers, type PackageManager } from './auto-install';\nimport { create, type Template, type TemplatePlugin } from './index';\nimport { isCI, templates } from './constants';\nimport { cac } from 'cac';\nimport { feature } from './plugins/feature';\nimport { ai, type AIProvider } from '@fumadocs/cli/features/ai';\nimport { lint } from '@fumadocs/cli/features/lint';\nimport { og } from '@fumadocs/cli/features/og';\nimport { search, type SearchProvider } from '@fumadocs/cli/features/search';\n\nconst linters = ['eslint', 'oxlint', 'biome'] as const;\nconst searchProviders = [\n 'orama',\n 'orama-cloud',\n 'algolia',\n 'meilisearch',\n 'typesense',\n 'mixedbread',\n] as const;\nconst ogImages = ['next-og', 'takumi'] as const;\nconst aiChats = ['openrouter', 'llmgateway', 'inkeep'] as const;\nconst templateNames = templates.map((item) => item.value);\n\ninterface CliOptions {\n src?: boolean;\n install?: boolean;\n git: boolean;\n yes?: boolean;\n linter?: (typeof linters)[number];\n search?: SearchProvider | 'orama';\n ogImage?: (typeof ogImages)[number];\n aiChat?: AIProvider;\n template?: Template;\n pm: PackageManager;\n}\n\nconst cli = cac('create-fumadocs-app');\n\ncli\n .command('[name]', 'create a Fumadocs app, [name] is the project name')\n .option('--src', '(Next.js only) enable `src/` directory')\n .option('--install', 'install packages automatically')\n .option('--no-git', 'disable auto Git repository initialization')\n .option('-y, --yes', 'skip prompts and use defaults for unspecified options')\n .option(\n '--linter <name>',\n `configure a linter/formatter, ESLint is currently Next.js only. (${linters.join(', ')})`,\n )\n .option('--search <name>', `configure a search solution (${searchProviders.join(', ')})`)\n .option('--og-image <name>', `configure OG image generation (${ogImages.join(', ')})`)\n .option('--ai-chat <name>', `configure AI chat (${aiChats.join(', ')})`)\n .option('--template <name>', `choose a template (${templateNames.join(', ')})`)\n .option('--pm <name>', `choose a package manager (${managers.join(', ')})`, {\n default: getPackageManager(),\n })\n .action(main);\n\n/** templates without a server at runtime */\nconst isStatic = (template: Template) =>\n template === 'astro' || template === '+next+fuma-docs-mdx+static' || template.endsWith('-spa');\n\nfunction checkOption(name: string, value: string | undefined, choices: readonly string[]) {\n if (value !== undefined && !choices.includes(value))\n throw new Error(`invalid value for --${name}: ${value}, expected: ${choices.join(', ')}`);\n}\n\nasync function main(defaultName: string | undefined, config: CliOptions): Promise<void> {\n checkOption('linter', config.linter, linters);\n checkOption('search', config.search, searchProviders);\n checkOption('og-image', config.ogImage, ogImages);\n checkOption('ai-chat', config.aiChat, aiChats);\n checkOption('template', config.template, templateNames);\n checkOption('pm', config.pm, managers);\n const skipPrompts = isCI || config.yes === true;\n intro(pc.bgCyan(pc.bold('Create Fumadocs App')));\n\n const options = await group(\n {\n name: async () => {\n if (defaultName) return defaultName;\n if (skipPrompts) return 'untitled';\n\n return text({\n message: 'Project name',\n placeholder: 'my-app',\n defaultValue: 'my-app',\n });\n },\n template: async () => {\n if (config.template) return config.template;\n if (skipPrompts) return '+next+fuma-docs-mdx';\n\n return select<Template>({\n message: 'Choose a template',\n initialValue: '+next+fuma-docs-mdx',\n options: templates,\n });\n },\n src: async ({ results }: { results: { template?: Template } }) => {\n if (config.src !== undefined) return config.src;\n if (skipPrompts || !results.template?.startsWith('+next')) return false;\n\n return confirm({\n message: 'Use `/src` directory?',\n initialValue: false,\n });\n },\n lint: async ({ results }: { results: { template?: Template } }) => {\n if (config.linter !== undefined) return config.linter;\n if (skipPrompts) return 'disabled';\n\n return select({\n message: 'Configure linter?',\n options: results.template?.startsWith('+next')\n ? [\n {\n value: 'disabled',\n label: 'Disabled',\n },\n {\n value: 'eslint',\n label: 'ESLint',\n },\n {\n value: 'biome',\n label: 'Biome',\n },\n {\n value: 'oxlint',\n label: 'Oxlint',\n },\n ]\n : [\n {\n value: 'disabled',\n label: 'Disabled',\n },\n {\n value: 'biome',\n label: 'Biome',\n },\n {\n value: 'oxlint',\n label: 'Oxlint',\n },\n ],\n });\n },\n search: async ({ results }: { results: { template?: Template } }) => {\n if (config.search !== undefined) return config.search;\n if (skipPrompts) return 'orama';\n\n return select({\n message: 'Choose a search solution?',\n options: [\n {\n value: 'orama',\n label: 'Default',\n hint: 'local search powered by ZBSearch, recommended',\n },\n {\n value: 'orama-cloud',\n label: 'Orama Cloud',\n hint: '3rd party search solution, signup needed',\n },\n { value: 'algolia', label: 'Algolia', hint: 'signup needed' },\n { value: 'meilisearch', label: 'Meilisearch', hint: 'self-hosted or cloud' },\n { value: 'typesense', label: 'Typesense', hint: 'self-hosted or cloud' },\n // searches on a server\n ...(isStatic(results.template!)\n ? []\n : [{ value: 'mixedbread', label: 'Mixedbread', hint: 'AI search, signup needed' }]),\n ],\n });\n },\n ogImage: async ({ results }: { results: { template?: Template } }) => {\n if (config.ogImage !== undefined) return config.ogImage;\n if (!results.template?.startsWith('+next')) return 'takumi';\n if (skipPrompts) return 'next/og';\n\n return select({\n message: 'Configure Open Graph Image generation?',\n options: [\n {\n value: 'next/og',\n label: 'next/og',\n hint: 'Next.js built-in solution',\n },\n {\n value: 'takumi',\n label: 'Takumi',\n hint: 'Output WebP format, framework-agnostic',\n },\n ],\n });\n },\n aiChat: async ({ results }: { results: { template?: Template } }) => {\n if (config.aiChat !== undefined) return config.aiChat;\n if (skipPrompts || isStatic(results.template!)) return false;\n\n return select<false | 'openrouter' | 'llmgateway' | 'inkeep'>({\n message: 'Configure AI Chat?',\n options: [\n {\n value: false,\n label: 'No',\n },\n {\n value: 'openrouter',\n label: 'AI SDK',\n hint: 'default to OpenRouter',\n },\n {\n value: 'llmgateway',\n label: 'LLMGateway',\n hint: 'open-source LLM gateway, API key required',\n },\n {\n value: 'inkeep',\n label: 'Inkeep AI',\n hint: 'API key required',\n },\n ],\n });\n },\n installDeps: async () => {\n if (config.install !== undefined) return config.install;\n if (skipPrompts) return false;\n\n return confirm({\n message: `Do you want to install packages automatically? (detected as ${config.pm})`,\n });\n },\n },\n {\n onCancel: () => {\n cancel('Installation Stopped.');\n process.exit(0);\n },\n },\n );\n\n const projectName = options.name.toLowerCase().replace(/\\s/, '-');\n if (options.aiChat && isStatic(options.template)) {\n console.warn(pc.yellow('AI Chat needs a server, the template is static, skipping it.'));\n options.aiChat = false;\n }\n if (options.ogImage === 'next-og' && !options.template.startsWith('+next')) {\n console.warn(\n pc.yellow('next/og is only available on Next.js, the template uses Takumi instead.'),\n );\n }\n\n if (!isCI) await checkDir(projectName, skipPrompts);\n\n const info = spinner();\n info.start(`Generating Project`);\n const plugins: TemplatePlugin[] = [];\n\n if (options.src) {\n const { nextUseSrc } = await import('./plugins/next-use-src');\n plugins.push(nextUseSrc());\n }\n\n if (options.search !== 'orama') plugins.push(feature(search, { provider: options.search }));\n if (options.lint !== 'disabled') plugins.push(feature(lint, { linter: options.lint }));\n if (options.ogImage === 'takumi' && options.template.startsWith('+next'))\n plugins.push(feature(og, { engine: 'takumi' }));\n if (options.aiChat) plugins.push(feature(ai, { provider: options.aiChat }));\n\n await create({\n packageManager: config.pm,\n template: options.template,\n outputDir: projectName,\n installDeps: options.installDeps,\n initializeGit: config.git,\n plugins,\n log: (message) => {\n info.message(message);\n },\n });\n\n info.stop('Project Generated');\n\n outro(pc.bgGreen(pc.bold('Done')));\n\n console.log(pc.bold('\\nOpen the project'));\n console.log(pc.cyan(`cd ${projectName}`));\n\n console.log(pc.bold('\\nRun Development Server'));\n if (config.pm === 'npm' || config.pm === 'bun') {\n console.log(pc.cyan(`${config.pm} run dev`));\n } else {\n console.log(pc.cyan(`${config.pm} dev`));\n }\n console.log(pc.bold('\\nYou can now open the project and start writing documents'));\n\n process.exit(0);\n}\n\nasync function checkDir(outputDir: string, skipPrompts: boolean) {\n const destDir = await fs.readdir(outputDir).catch(() => null);\n if (!destDir || destDir.length === 0) return;\n if (skipPrompts) {\n cancel(`directory ${outputDir} already exists and is not empty.`);\n process.exit(1);\n }\n const del = await confirm({\n message: `directory ${outputDir} already exists, do you want to delete its files?`,\n });\n\n if (isCancel(del)) {\n cancel();\n process.exit(1);\n }\n\n if (!del) return;\n\n const info = spinner();\n info.start(`Deleting files in ${outputDir}`);\n\n await Promise.all(\n destDir.map((item) => {\n return fs.rm(path.join(outputDir, item), {\n recursive: true,\n force: true,\n });\n }),\n );\n\n info.stop(`Deleted files in ${outputDir}`);\n}\n\ncli.help();\n\ntry {\n cli.parse(process.argv, { run: false });\n await cli.runMatchedCommand();\n} catch (e) {\n console.error(pc.red(e instanceof Error ? e.message : String(e)));\n process.exit(1);\n}\n"],"mappings":"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"}
|
|
@@ -42,7 +42,7 @@ var package_exports$3 = /* @__PURE__ */ __exportAll({
|
|
|
42
42
|
license: () => license$3,
|
|
43
43
|
name: () => name$3,
|
|
44
44
|
peerDependencies: () => peerDependencies$3,
|
|
45
|
-
peerDependenciesMeta: () => peerDependenciesMeta$
|
|
45
|
+
peerDependenciesMeta: () => peerDependenciesMeta$3,
|
|
46
46
|
publishConfig: () => publishConfig$3,
|
|
47
47
|
repository: () => repository$3,
|
|
48
48
|
scripts: () => scripts$3,
|
|
@@ -51,7 +51,7 @@ var package_exports$3 = /* @__PURE__ */ __exportAll({
|
|
|
51
51
|
version: () => version$3
|
|
52
52
|
});
|
|
53
53
|
var name$3 = "fumadocs-core";
|
|
54
|
-
var version$3 = "16.
|
|
54
|
+
var version$3 = "16.18.0";
|
|
55
55
|
var description$3 = "The React.js library for building a documentation website";
|
|
56
56
|
var keywords$3 = ["Docs", "Fumadocs"];
|
|
57
57
|
var homepage$3 = "https://fumadocs.dev";
|
|
@@ -74,6 +74,7 @@ var exports$3 = {
|
|
|
74
74
|
"./framework": "./dist/framework/index.js",
|
|
75
75
|
"./framework/astro": "./dist/framework/astro.js",
|
|
76
76
|
"./framework/next": "./dist/framework/next.js",
|
|
77
|
+
"./framework/plugin": "./dist/framework/plugin.js",
|
|
77
78
|
"./framework/react-router": "./dist/framework/react-router.js",
|
|
78
79
|
"./framework/tanstack": "./dist/framework/tanstack.js",
|
|
79
80
|
"./framework/waku": "./dist/framework/waku.js",
|
|
@@ -237,7 +238,7 @@ var peerDependencies$3 = {
|
|
|
237
238
|
"waku": "*",
|
|
238
239
|
"zod": "4.x.x"
|
|
239
240
|
};
|
|
240
|
-
var peerDependenciesMeta$
|
|
241
|
+
var peerDependenciesMeta$3 = {
|
|
241
242
|
"flexsearch": { "optional": true },
|
|
242
243
|
"@pierre/highlights": { "optional": true },
|
|
243
244
|
"@mdx-js/mdx": { "optional": true },
|
|
@@ -285,7 +286,7 @@ var package_default$3 = {
|
|
|
285
286
|
dependencies: dependencies$3,
|
|
286
287
|
devDependencies: devDependencies$3,
|
|
287
288
|
peerDependencies: peerDependencies$3,
|
|
288
|
-
peerDependenciesMeta: peerDependenciesMeta$
|
|
289
|
+
peerDependenciesMeta: peerDependenciesMeta$3,
|
|
289
290
|
inlinedDependencies: inlinedDependencies$1
|
|
290
291
|
};
|
|
291
292
|
// ../mdx/package.json
|
|
@@ -304,7 +305,7 @@ var package_exports$2 = /* @__PURE__ */ __exportAll({
|
|
|
304
305
|
license: () => license$2,
|
|
305
306
|
name: () => name$2,
|
|
306
307
|
peerDependencies: () => peerDependencies$2,
|
|
307
|
-
peerDependenciesMeta: () => peerDependenciesMeta$
|
|
308
|
+
peerDependenciesMeta: () => peerDependenciesMeta$2,
|
|
308
309
|
publishConfig: () => publishConfig$2,
|
|
309
310
|
repository: () => repository$2,
|
|
310
311
|
scripts: () => scripts$2,
|
|
@@ -313,7 +314,7 @@ var package_exports$2 = /* @__PURE__ */ __exportAll({
|
|
|
313
314
|
version: () => version$2
|
|
314
315
|
});
|
|
315
316
|
var name$2 = "fumadocs-mdx";
|
|
316
|
-
var version$2 = "15.
|
|
317
|
+
var version$2 = "15.5.0";
|
|
317
318
|
var description$2 = "The built-in source for Fumadocs";
|
|
318
319
|
var keywords$2 = ["Docs", "fumadocs"];
|
|
319
320
|
var homepage$2 = "https://fumadocs.dev";
|
|
@@ -338,6 +339,7 @@ var exports$2 = {
|
|
|
338
339
|
"./plugins/index-file": "./dist/plugins/index-file.js",
|
|
339
340
|
"./plugins/json-schema": "./dist/plugins/json-schema.js",
|
|
340
341
|
"./plugins/last-modified": "./dist/plugins/last-modified.js",
|
|
342
|
+
"./press": "./dist/press.js",
|
|
341
343
|
"./rolldown": "./dist/rolldown/index.js",
|
|
342
344
|
"./runtime/browser": "./dist/runtime/browser.js",
|
|
343
345
|
"./runtime/dynamic": "./dist/runtime/dynamic.js",
|
|
@@ -387,6 +389,7 @@ var devDependencies$2 = {
|
|
|
387
389
|
"@types/node": "^26.6.5",
|
|
388
390
|
"@types/picomatch": "^4.0.3",
|
|
389
391
|
"@types/react": "^19.3.0",
|
|
392
|
+
"@vitejs/plugin-rsc": "^0.5.38",
|
|
390
393
|
"fumadocs-core": "workspace:*",
|
|
391
394
|
"mdast-util-directive": "^3.1.1",
|
|
392
395
|
"next": "^16.4.2",
|
|
@@ -406,7 +409,8 @@ var peerDependencies$2 = {
|
|
|
406
409
|
"@types/mdast": "*",
|
|
407
410
|
"@types/mdx": "*",
|
|
408
411
|
"@types/react": "*",
|
|
409
|
-
"
|
|
412
|
+
"@vitejs/plugin-rsc": "^0.5.34",
|
|
413
|
+
"fumadocs-core": "^16.17.11",
|
|
410
414
|
"mdast-util-directive": "*",
|
|
411
415
|
"next": "^15.3.0 || ^16.0.0",
|
|
412
416
|
"react": "^19.2.0",
|
|
@@ -414,8 +418,9 @@ var peerDependencies$2 = {
|
|
|
414
418
|
"satteri": "^0.10.5",
|
|
415
419
|
"vite": "7.x.x || 8.x.x"
|
|
416
420
|
};
|
|
417
|
-
var peerDependenciesMeta$
|
|
421
|
+
var peerDependenciesMeta$2 = {
|
|
418
422
|
"@fumadocs/satteri": { "optional": true },
|
|
423
|
+
"@vitejs/plugin-rsc": { "optional": true },
|
|
419
424
|
"satteri": { "optional": true },
|
|
420
425
|
"rolldown": { "optional": true },
|
|
421
426
|
"mdast-util-directive": { "optional": true },
|
|
@@ -446,7 +451,7 @@ var package_default$2 = {
|
|
|
446
451
|
dependencies: dependencies$2,
|
|
447
452
|
devDependencies: devDependencies$2,
|
|
448
453
|
peerDependencies: peerDependencies$2,
|
|
449
|
-
peerDependenciesMeta: peerDependenciesMeta$
|
|
454
|
+
peerDependenciesMeta: peerDependenciesMeta$2
|
|
450
455
|
};
|
|
451
456
|
// ../base-ui/package.json
|
|
452
457
|
var package_exports$1 = /* @__PURE__ */ __exportAll({
|
|
@@ -463,7 +468,7 @@ var package_exports$1 = /* @__PURE__ */ __exportAll({
|
|
|
463
468
|
license: () => license$1,
|
|
464
469
|
name: () => name$1,
|
|
465
470
|
peerDependencies: () => peerDependencies$1,
|
|
466
|
-
peerDependenciesMeta: () => peerDependenciesMeta,
|
|
471
|
+
peerDependenciesMeta: () => peerDependenciesMeta$1,
|
|
467
472
|
publishConfig: () => publishConfig$1,
|
|
468
473
|
repository: () => repository$1,
|
|
469
474
|
scripts: () => scripts$1,
|
|
@@ -472,7 +477,7 @@ var package_exports$1 = /* @__PURE__ */ __exportAll({
|
|
|
472
477
|
version: () => version$1
|
|
473
478
|
});
|
|
474
479
|
var name$1 = "@fumadocs/base-ui";
|
|
475
|
-
var version$1 = "16.
|
|
480
|
+
var version$1 = "16.18.0";
|
|
476
481
|
var description$1 = "The Base UI version of Fumadocs UI";
|
|
477
482
|
var keywords$1 = ["Docs", "Fumadocs"];
|
|
478
483
|
var homepage$1 = "https://fumadocs.dev";
|
|
@@ -640,7 +645,7 @@ var peerDependencies$1 = {
|
|
|
640
645
|
"react-dom": "^19.2.0",
|
|
641
646
|
"takumi-js": "*"
|
|
642
647
|
};
|
|
643
|
-
var peerDependenciesMeta = {
|
|
648
|
+
var peerDependenciesMeta$1 = {
|
|
644
649
|
"next": { "optional": true },
|
|
645
650
|
"takumi-js": { "optional": true },
|
|
646
651
|
"@types/mdx": { "optional": true },
|
|
@@ -665,7 +670,7 @@ var package_default$1 = {
|
|
|
665
670
|
dependencies: dependencies$1,
|
|
666
671
|
devDependencies: devDependencies$1,
|
|
667
672
|
peerDependencies: peerDependencies$1,
|
|
668
|
-
peerDependenciesMeta,
|
|
673
|
+
peerDependenciesMeta: peerDependenciesMeta$1,
|
|
669
674
|
inlinedDependencies
|
|
670
675
|
};
|
|
671
676
|
// ../astro/package.json
|
|
@@ -682,6 +687,7 @@ var package_exports = /* @__PURE__ */ __exportAll({
|
|
|
682
687
|
license: () => license,
|
|
683
688
|
name: () => name,
|
|
684
689
|
peerDependencies: () => peerDependencies,
|
|
690
|
+
peerDependenciesMeta: () => peerDependenciesMeta,
|
|
685
691
|
publishConfig: () => publishConfig,
|
|
686
692
|
repository: () => repository,
|
|
687
693
|
scripts: () => scripts,
|
|
@@ -690,7 +696,7 @@ var package_exports = /* @__PURE__ */ __exportAll({
|
|
|
690
696
|
version: () => version
|
|
691
697
|
});
|
|
692
698
|
var name = "@fumadocs/astro";
|
|
693
|
-
var version = "0.
|
|
699
|
+
var version = "0.2.0";
|
|
694
700
|
var description = "The Astro integration for Fumadocs";
|
|
695
701
|
var keywords = [
|
|
696
702
|
"Astro",
|
|
@@ -724,6 +730,8 @@ var scripts = {
|
|
|
724
730
|
var dependencies = {
|
|
725
731
|
"@astrojs/mdx": "^8.1.1",
|
|
726
732
|
"@fumadocs/satteri": "workspace:^",
|
|
733
|
+
"devalue": "^6.0.2",
|
|
734
|
+
"satteri": "^0.10.5",
|
|
727
735
|
"yuku-parser": "^0.19.0"
|
|
728
736
|
};
|
|
729
737
|
var devDependencies = {
|
|
@@ -731,26 +739,30 @@ var devDependencies = {
|
|
|
731
739
|
"@astrojs/react": "^7.1.1",
|
|
732
740
|
"@types/estree-jsx": "^1.0.5",
|
|
733
741
|
"@types/hast": "^3.0.5",
|
|
742
|
+
"@types/mdx": "^2.0.14",
|
|
734
743
|
"@types/node": "26.6.5",
|
|
735
744
|
"@types/react": "^19.3.0",
|
|
736
745
|
"@types/react-dom": "^19.3.0",
|
|
737
746
|
"astro": "^7.4.2",
|
|
738
747
|
"fumadocs-core": "workspace:*",
|
|
748
|
+
"fumadocs-ui": "workspace:@fumadocs/base-ui@*",
|
|
739
749
|
"react": "^19.3.1",
|
|
740
750
|
"react-dom": "^19.3.1",
|
|
741
|
-
"satteri": "^0.10.5",
|
|
742
751
|
"tsconfig": "workspace:*",
|
|
743
752
|
"tsdown": "0.23.1",
|
|
744
753
|
"typescript": "^7.0.2",
|
|
754
|
+
"vite": "^8.3.5",
|
|
745
755
|
"vitest": "^5.0.5"
|
|
746
756
|
};
|
|
747
757
|
var peerDependencies = {
|
|
748
758
|
"@astrojs/react": "^7.0.0",
|
|
759
|
+
"@types/mdx": "*",
|
|
749
760
|
"astro": "^7.4.0",
|
|
750
761
|
"fumadocs-core": "^16.17.8",
|
|
751
762
|
"react": "^19.2.0",
|
|
752
763
|
"react-dom": "^19.2.0"
|
|
753
764
|
};
|
|
765
|
+
var peerDependenciesMeta = { "@types/mdx": { "optional": true } };
|
|
754
766
|
var package_default = {
|
|
755
767
|
name,
|
|
756
768
|
version,
|
|
@@ -768,7 +780,8 @@ var package_default = {
|
|
|
768
780
|
scripts,
|
|
769
781
|
dependencies,
|
|
770
782
|
devDependencies,
|
|
771
|
-
peerDependencies
|
|
783
|
+
peerDependencies,
|
|
784
|
+
peerDependenciesMeta
|
|
772
785
|
};
|
|
773
786
|
// src/constants.ts
|
|
774
787
|
const sourceDir = fileURLToPath(new URL(`../`, import.meta.url).href);
|
|
@@ -838,4 +851,4 @@ for (const workspace of workspaces) depVersions[workspace.name] = workspace.vers
|
|
|
838
851
|
depVersions["fumadocs-ui"] = `npm:${name$1}@${version$1}`;
|
|
839
852
|
export { templates as i, isCI as n, sourceDir as r, depVersions as t };
|
|
840
853
|
|
|
841
|
-
//# sourceMappingURL=constants-
|
|
854
|
+
//# sourceMappingURL=constants-BGeuHcdV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants-BGeuHcdV.js","names":["corePkg","mdxPkg","basePkg","astroPkg","versionPkg.dependencies","basePkg.name","basePkg.version"],"sources":["../../create-app-versions/package.json","../../core/package.json","../../mdx/package.json","../../base-ui/package.json","../../astro/package.json","../src/constants.ts"],"sourcesContent":["","","","","","import { fileURLToPath } from 'node:url';\nimport versionPkg from '../../create-app-versions/package.json';\nimport * as corePkg from '../../core/package.json';\nimport * as mdxPkg from '../../mdx/package.json';\nimport * as basePkg from '../../base-ui/package.json';\nimport * as astroPkg from '../../astro/package.json';\n\nexport const sourceDir = fileURLToPath(new URL(`../`, import.meta.url).href);\n\nexport const isCI = Boolean(process.env.CI);\n\nexport interface TemplateInfo {\n value:\n | '+next+fuma-docs-mdx'\n | 'astro'\n | 'waku'\n | 'react-router'\n | 'react-router-spa'\n | 'tanstack-start'\n | 'tanstack-start-spa'\n | '+next+fuma-docs-mdx+static';\n label: string;\n appDir: string;\n /**\n * path to root provider, relative to `appDir`\n */\n rootProviderPath: string;\n hint?: string;\n /**\n * rename files when copying from template\n */\n rename?: (name: string) => string;\n}\n\nexport const templates: TemplateInfo[] = [\n {\n value: '+next+fuma-docs-mdx',\n label: 'Next.js: Fumadocs MDX',\n hint: 'recommended: powerful and mature',\n appDir: '',\n rootProviderPath: 'app/layout.tsx',\n },\n {\n value: 'waku',\n label: 'Waku: Fumadocs MDX',\n hint: 'recommended: fast and simple',\n appDir: 'src',\n rootProviderPath: 'components/provider.tsx',\n },\n {\n value: '+next+fuma-docs-mdx+static',\n label: 'Next.js Static: Fumadocs MDX',\n appDir: '',\n rootProviderPath: 'components/provider.tsx',\n },\n {\n value: 'react-router',\n label: 'React Router: Fumadocs MDX (not RSC)',\n appDir: 'app',\n rootProviderPath: 'root.tsx',\n },\n {\n value: 'react-router-spa',\n label: 'React Router SPA: Fumadocs MDX (not RSC)',\n hint: 'SPA mode allows you to host the site statically, compatible with a CDN.',\n appDir: 'app',\n rootProviderPath: 'root.tsx',\n },\n {\n value: 'tanstack-start',\n label: 'Tanstack Start: Fumadocs MDX (not RSC)',\n appDir: 'src',\n rootProviderPath: 'routes/__root.tsx',\n },\n {\n value: 'tanstack-start-spa',\n label: 'Tanstack Start SPA: Fumadocs MDX (not RSC)',\n hint: 'SPA mode allows you to host the site statically, compatible with a CDN.',\n appDir: 'src',\n rootProviderPath: 'routes/__root.tsx',\n },\n {\n value: 'astro',\n label: 'Astro: Content Collections',\n appDir: 'src',\n rootProviderPath: 'components/provider.tsx',\n },\n];\n\nconst workspaces = [corePkg, mdxPkg, basePkg, astroPkg];\n\nexport const depVersions = versionPkg.dependencies;\n\nfor (const workspace of workspaces) {\n depVersions[workspace.name as keyof typeof depVersions] = workspace.version;\n}\n\ndepVersions['fumadocs-ui'] = `npm:${basePkg.name}@${basePkg.version}`;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AKOA,MAAa,YAAY,cAAc,IAAI,IAAI,OAAO,YAAY,GAAG,CAAC,CAAC,IAAI;AAE3E,MAAa,OAAO,QAAQ,QAAQ,IAAI,EAAE;AAyB1C,MAAa,YAA4B;CACvC;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,QAAQ;EACR,kBAAkB;CACpB;CACA;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,QAAQ;EACR,kBAAkB;CACpB;CACA;EACE,OAAO;EACP,OAAO;EACP,QAAQ;EACR,kBAAkB;CACpB;CACA;EACE,OAAO;EACP,OAAO;EACP,QAAQ;EACR,kBAAkB;CACpB;CACA;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,QAAQ;EACR,kBAAkB;CACpB;CACA;EACE,OAAO;EACP,OAAO;EACP,QAAQ;EACR,kBAAkB;CACpB;CACA;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,QAAQ;EACR,kBAAkB;CACpB;CACA;EACE,OAAO;EACP,OAAO;EACP,QAAQ;EACR,kBAAkB;CACpB;AACF;AAEA,MAAM,aAAa;CAACA;CAASC;CAAQC;CAASC;AAAQ;AAEtD,MAAa,cAAcC;AAE3B,KAAK,MAAM,aAAa,YACtB,YAAY,UAAU,QAAoC,UAAU;AAGtE,YAAY,iBAAiB,OAAOC,OAAa,GAAGC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as depVersions } from "./constants-
|
|
1
|
+
import { t as depVersions } from "./constants-BGeuHcdV.js";
|
|
2
2
|
import { HttpRegistryConnector } from "fuma-cli/registry/connector";
|
|
3
3
|
import { getDefaultConfig } from "@fumadocs/cli/config";
|
|
4
4
|
import { runFeature } from "@fumadocs/cli/features";
|
|
@@ -23,4 +23,4 @@ function feature(feature, options) {
|
|
|
23
23
|
}
|
|
24
24
|
export { feature as t };
|
|
25
25
|
|
|
26
|
-
//# sourceMappingURL=feature-
|
|
26
|
+
//# sourceMappingURL=feature-DB9zShId.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-
|
|
1
|
+
{"version":3,"file":"feature-DB9zShId.js","names":[],"sources":["../src/plugins/feature.ts"],"sourcesContent":["import type { TemplatePlugin } from '@/index';\nimport { HttpRegistryConnector } from 'fuma-cli/registry/connector';\nimport { getDefaultConfig } from '@fumadocs/cli/config';\nimport { type Feature, runFeature } from '@fumadocs/cli/features';\nimport { loadProject } from '@fumadocs/cli/project';\nimport { depVersions } from '@/constants';\n\n/** apply a Fumadocs CLI feature to the generated project */\nexport function feature<O extends object>(feature: Feature<O>, options: O): TemplatePlugin {\n return {\n async afterWrite() {\n const config = await getDefaultConfig(this.dest);\n const project = await loadProject(config, this.dest);\n\n await runFeature(feature, options, {\n project,\n connector: new HttpRegistryConnector('https://fumadocs.dev/registry'),\n versions: depVersions,\n io: { log: this.log, installDependencies: false, confirmOverwrite: async () => true },\n });\n },\n };\n}\n"],"mappings":";;;;;;;AAQA,SAAgB,QAA0B,SAAqB,SAA4B;CACzF,OAAO,EACL,MAAM,aAAa;EACjB,MAAM,SAAS,MAAM,iBAAiB,KAAK,IAAI;EAC/C,MAAM,UAAU,MAAM,YAAY,QAAQ,KAAK,IAAI;EAEnD,MAAM,WAAW,SAAS,SAAS;GACjC;GACA,WAAW,IAAI,sBAAsB,+BAA+B;GACpE,UAAU;GACV,IAAI;IAAE,KAAK,KAAK;IAAK,qBAAqB;IAAO,kBAAkB,YAAY;GAAK;EACtF,CAAC;CACH,EACF;AACF"}
|
|
@@ -5,7 +5,7 @@ interface TemplateInfo {
|
|
|
5
5
|
label: string;
|
|
6
6
|
appDir: string;
|
|
7
7
|
/**
|
|
8
|
-
* path to root provider, relative to `appDir
|
|
8
|
+
* path to root provider, relative to `appDir`
|
|
9
9
|
*/
|
|
10
10
|
rootProviderPath: string;
|
|
11
11
|
hint?: string;
|
|
@@ -58,4 +58,4 @@ interface TemplatePlugin {
|
|
|
58
58
|
}
|
|
59
59
|
declare function create(createOptions: Options): Promise<void>;
|
|
60
60
|
export { TemplatePluginContext as a, TemplatePlugin as i, PackageJsonType as n, create as o, Template as r, Options as t };
|
|
61
|
-
//# sourceMappingURL=index-
|
|
61
|
+
//# sourceMappingURL=index-DHK1sZ4O.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-DHK1sZ4O.d.ts","names":[],"sources":["../src/auto-install.ts","../src/constants.ts","../src/index.ts"],"mappings":"A,KAEY,yBAAyB;cAExB;UCOI;EACf;EASA;EACA;;;;EAIA;EACA;;;;EAIA,UAAU;;KCxBA,WAAW;UACN;EACf;EACA,UAAU;;;;;;EAOV,iBAAiB;EAEjB;EACA;EACA,OAAO;EACP,UAAU;;UAGK;EACf,UAAU;EACV,MAAM;;;;EAIN;;;;EAKA;;KAGU;EACV;EACA;EACA;EACA,UAAU;EACV,eAAe;EACf,kBAAkB;IAChB;KAEC,UAAU,KAAK,IAAI,QAAQ;UAEf;EACf,YACE,MAAM,KAAK,gCACX,MAAM,iBACH,iBAAiB;EACtB,eACE,MAAM,uBACN,aAAa,oBACV,iBAAiB;EACtB,cAAc,MAAM,0BAA0B;EAC9C,UAAU,MAAM,uBAAuB,oBAAoB;;iBAGvC,OAAO,eAAe,UAAU"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as TemplatePluginContext, i as TemplatePlugin, n as PackageJsonType, o as create, r as Template, t as Options } from "./index-
|
|
1
|
+
import { a as TemplatePluginContext, i as TemplatePlugin, n as PackageJsonType, o as create, r as Template, t as Options } from "./index-DHK1sZ4O.js";
|
|
2
2
|
export { Options, PackageJsonType, Template, TemplatePlugin, TemplatePluginContext, create };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { t as create } from "./src-
|
|
1
|
+
export { t as create } from "./src-G2bUVbwQ.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as TemplatePlugin } from "../index-
|
|
1
|
+
import { i as TemplatePlugin } from "../index-DHK1sZ4O.js";
|
|
2
2
|
import { Feature } from "@fumadocs/cli/features";
|
|
3
3
|
/** apply a Fumadocs CLI feature to the generated project */
|
|
4
4
|
export declare function feature<O extends object>(feature: Feature<O>, options: O): TemplatePlugin;
|
package/dist/plugins/feature.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { t as feature } from "../feature-
|
|
1
|
+
export { t as feature } from "../feature-DB9zShId.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as templates, r as sourceDir, t as depVersions } from "./constants-
|
|
1
|
+
import { i as templates, r as sourceDir, t as depVersions } from "./constants-BGeuHcdV.js";
|
|
2
2
|
import fs from "node:fs/promises";
|
|
3
3
|
import path, { join } from "node:path";
|
|
4
4
|
import { x } from "tinyexec";
|
|
@@ -142,4 +142,4 @@ async function initPackageJson(projectName, packageJsonPath) {
|
|
|
142
142
|
}
|
|
143
143
|
export { getPackageManager as n, managers as r, create as t };
|
|
144
144
|
|
|
145
|
-
//# sourceMappingURL=src-
|
|
145
|
+
//# sourceMappingURL=src-G2bUVbwQ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"src-BRd8UCNg.js","names":[],"sources":["../src/auto-install.ts","../src/utils.ts","../src/index.ts"],"sourcesContent":["import { x } from 'tinyexec';\n\nexport type PackageManager = (typeof managers)[number];\n\nexport const managers = ['npm', 'yarn', 'bun', 'pnpm'] as const;\n\nexport function getPackageManager(): PackageManager {\n const userAgent = process.env.npm_config_user_agent ?? '';\n\n if (userAgent.startsWith('yarn')) {\n return 'yarn';\n }\n\n if (userAgent.startsWith('pnpm')) {\n return 'pnpm';\n }\n\n if (userAgent.startsWith('bun')) {\n return 'bun';\n }\n\n return 'npm';\n}\n\nexport async function autoInstall(manager: PackageManager, dest: string) {\n await x(manager, ['install'], {\n throwOnError: true,\n nodeOptions: {\n env: {\n ...process.env,\n NODE_ENV: 'development',\n DISABLE_OPENCOLLECTIVE: '1',\n },\n cwd: dest,\n },\n });\n}\n","import fs from 'node:fs/promises';\nimport path, { join } from 'node:path';\nimport { x } from 'tinyexec';\n\nexport async function copy(\n from: string,\n to: string,\n options: {\n rename?: (s: string) => string;\n filter?: (s: string) => boolean;\n filterDir?: (dir: string) => boolean;\n } = {},\n): Promise<void> {\n const { rename = (s) => s, filterDir = () => true, filter = () => true } = options;\n const stats = await fs.stat(from);\n\n if (stats.isDirectory() && filterDir(from)) {\n const files = await fs.readdir(from);\n\n await Promise.all(\n files.map((file) => copy(path.join(from, file), path.join(to, file), options)),\n );\n }\n\n if (stats.isFile() && filter(from)) {\n to = rename(to);\n await fs.mkdir(path.dirname(to), { recursive: true });\n await fs.copyFile(from, to);\n }\n}\n\nasync function isInGitRepository(cwd: string) {\n const { exitCode } = await x('git', ['rev-parse', '--is-inside-work-tree'], {\n nodeOptions: { cwd },\n });\n\n return exitCode === 0;\n}\n\nasync function isDefaultBranchSet(cwd: string) {\n const { exitCode } = await x('git', ['config', 'init.defaultBranch'], {\n nodeOptions: { cwd },\n });\n\n return exitCode === 0;\n}\n\n/*\nInitialize a Git repo on the project.\n\nBased on https://github.com/vercel/next.js/blob/canary/packages/create-next-app/helpers/git.ts\n*/\nexport async function tryGitInit(cwd: string): Promise<boolean> {\n const { exitCode } = await x('git', ['--version']);\n if (exitCode !== 0) return false;\n\n if (await isInGitRepository(cwd)) return false;\n\n try {\n await x('git', ['init'], {\n throwOnError: true,\n nodeOptions: { cwd },\n });\n\n if (!(await isDefaultBranchSet(cwd))) {\n await x('git', ['checkout', '-b', 'main'], {\n throwOnError: true,\n nodeOptions: {\n cwd,\n },\n });\n }\n\n await x('git', ['add', '-A'], {\n throwOnError: true,\n nodeOptions: {\n cwd,\n },\n });\n\n await x('git', ['commit', '-m', 'Initial commit from Create Fumadocs App'], {\n throwOnError: true,\n nodeOptions: {\n cwd,\n },\n });\n return true;\n } catch {\n await fs.rm(join(cwd, '.git'), { recursive: true, force: true });\n\n return false;\n }\n}\n","import path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { copy, tryGitInit } from '@/utils';\nimport type { PackageManager } from './auto-install';\nimport { autoInstall } from './auto-install';\nimport { depVersions, sourceDir, type TemplateInfo, templates } from './constants';\n\nexport type Template = TemplateInfo['value'];\nexport interface Options {\n outputDir: string;\n template: Template;\n\n /**\n * the package manager to use\n *\n * @defaultValue 'npm'\n */\n packageManager?: PackageManager;\n\n installDeps?: boolean;\n initializeGit?: boolean;\n log?: (message: string) => void;\n plugins?: TemplatePlugin[];\n}\n\nexport interface TemplatePluginContext {\n template: TemplateInfo;\n log: (message: string) => void;\n /**\n * output directory\n */\n dest: string;\n\n /**\n * output directory for app code (e.g. under `/src`)\n */\n appDir: string;\n}\n\nexport type PackageJsonType = {\n name?: string;\n version?: string;\n private?: boolean;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n} & Record<string, unknown>;\n\ntype Awaitable<T> = T | Promise<T>;\n\nexport interface TemplatePlugin {\n template?: (\n this: Pick<TemplatePluginContext, 'dest'>,\n info: TemplateInfo,\n ) => Awaitable<void | TemplateInfo>;\n packageJson?: (\n this: TemplatePluginContext,\n packageJson: PackageJsonType,\n ) => Awaitable<void | PackageJsonType>;\n afterWrite?: (this: TemplatePluginContext) => Awaitable<void>;\n readme?: (this: TemplatePluginContext, content: string) => Awaitable<void | string>;\n}\n\nexport async function create(createOptions: Options): Promise<void> {\n const {\n outputDir,\n plugins = [],\n packageManager = 'npm',\n initializeGit = false,\n installDeps = false,\n log = console.log,\n } = createOptions;\n\n let template = templates.find((item) => item.value === createOptions.template)!;\n for (const plugin of plugins) {\n template = (await plugin.template?.call({ dest: outputDir }, template)) ?? template;\n }\n\n const appDir = path.join(outputDir, template.appDir);\n const projectName = path.basename(outputDir);\n const pluginContext: TemplatePluginContext = {\n template,\n dest: outputDir,\n log,\n appDir,\n };\n\n await copy(path.join(sourceDir, 'template', template.value), outputDir, {\n rename(file) {\n file = file.replace('example.gitignore', '.gitignore');\n\n return template.rename?.(file) ?? file;\n },\n });\n\n const packageJsonPath = path.join(outputDir, 'package.json');\n let packageJson = await initPackageJson(projectName, packageJsonPath);\n for (const plugin of plugins) {\n packageJson = (await plugin.packageJson?.call(pluginContext, packageJson)) ?? packageJson;\n }\n await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));\n\n const readmePath = path.join(outputDir, 'README.md');\n let readme = `# ${projectName}\\n\\n${await fs.readFile(readmePath)}`;\n for (const plugin of plugins) {\n readme = (await plugin.readme?.call(pluginContext, readme)) ?? readme;\n }\n await fs.writeFile(readmePath, readme);\n\n for (const plugin of plugins) {\n await plugin.afterWrite?.call(pluginContext);\n }\n\n if (installDeps) {\n try {\n await autoInstall(packageManager, outputDir);\n log('Installed dependencies');\n } catch (err) {\n log(`Failed to install dependencies: ${err}`);\n }\n }\n\n if (initializeGit && (await tryGitInit(outputDir))) {\n log('Initialized Git repository');\n }\n}\n\nasync function initPackageJson(\n projectName: string,\n packageJsonPath: string,\n): Promise<PackageJsonType> {\n function replaceWorkspaceDeps(deps: Record<string, string> = {}) {\n for (const k in deps) {\n if (deps[k].startsWith('workspace:') && k in depVersions) {\n deps[k] = depVersions[k as keyof typeof depVersions];\n }\n }\n\n return deps;\n }\n\n const packageJson: PackageJsonType = JSON.parse(await fs.readFile(packageJsonPath, 'utf-8'));\n const dependencies = replaceWorkspaceDeps(packageJson.dependencies);\n const devDependencies = replaceWorkspaceDeps(packageJson.devDependencies);\n const scripts = { ...packageJson.scripts };\n\n return {\n ...packageJson,\n name: projectName,\n scripts,\n dependencies,\n devDependencies,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"src-G2bUVbwQ.js","names":[],"sources":["../src/auto-install.ts","../src/utils.ts","../src/index.ts"],"sourcesContent":["import { x } from 'tinyexec';\n\nexport type PackageManager = (typeof managers)[number];\n\nexport const managers = ['npm', 'yarn', 'bun', 'pnpm'] as const;\n\nexport function getPackageManager(): PackageManager {\n const userAgent = process.env.npm_config_user_agent ?? '';\n\n if (userAgent.startsWith('yarn')) {\n return 'yarn';\n }\n\n if (userAgent.startsWith('pnpm')) {\n return 'pnpm';\n }\n\n if (userAgent.startsWith('bun')) {\n return 'bun';\n }\n\n return 'npm';\n}\n\nexport async function autoInstall(manager: PackageManager, dest: string) {\n await x(manager, ['install'], {\n throwOnError: true,\n nodeOptions: {\n env: {\n ...process.env,\n NODE_ENV: 'development',\n DISABLE_OPENCOLLECTIVE: '1',\n },\n cwd: dest,\n },\n });\n}\n","import fs from 'node:fs/promises';\nimport path, { join } from 'node:path';\nimport { x } from 'tinyexec';\n\nexport async function copy(\n from: string,\n to: string,\n options: {\n rename?: (s: string) => string;\n filter?: (s: string) => boolean;\n filterDir?: (dir: string) => boolean;\n } = {},\n): Promise<void> {\n const { rename = (s) => s, filterDir = () => true, filter = () => true } = options;\n const stats = await fs.stat(from);\n\n if (stats.isDirectory() && filterDir(from)) {\n const files = await fs.readdir(from);\n\n await Promise.all(\n files.map((file) => copy(path.join(from, file), path.join(to, file), options)),\n );\n }\n\n if (stats.isFile() && filter(from)) {\n to = rename(to);\n await fs.mkdir(path.dirname(to), { recursive: true });\n await fs.copyFile(from, to);\n }\n}\n\nasync function isInGitRepository(cwd: string) {\n const { exitCode } = await x('git', ['rev-parse', '--is-inside-work-tree'], {\n nodeOptions: { cwd },\n });\n\n return exitCode === 0;\n}\n\nasync function isDefaultBranchSet(cwd: string) {\n const { exitCode } = await x('git', ['config', 'init.defaultBranch'], {\n nodeOptions: { cwd },\n });\n\n return exitCode === 0;\n}\n\n/*\nInitialize a Git repo on the project.\n\nBased on https://github.com/vercel/next.js/blob/canary/packages/create-next-app/helpers/git.ts\n*/\nexport async function tryGitInit(cwd: string): Promise<boolean> {\n const { exitCode } = await x('git', ['--version']);\n if (exitCode !== 0) return false;\n\n if (await isInGitRepository(cwd)) return false;\n\n try {\n await x('git', ['init'], {\n throwOnError: true,\n nodeOptions: { cwd },\n });\n\n if (!(await isDefaultBranchSet(cwd))) {\n await x('git', ['checkout', '-b', 'main'], {\n throwOnError: true,\n nodeOptions: {\n cwd,\n },\n });\n }\n\n await x('git', ['add', '-A'], {\n throwOnError: true,\n nodeOptions: {\n cwd,\n },\n });\n\n await x('git', ['commit', '-m', 'Initial commit from Create Fumadocs App'], {\n throwOnError: true,\n nodeOptions: {\n cwd,\n },\n });\n return true;\n } catch {\n await fs.rm(join(cwd, '.git'), { recursive: true, force: true });\n\n return false;\n }\n}\n","import path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { copy, tryGitInit } from '@/utils';\nimport type { PackageManager } from './auto-install';\nimport { autoInstall } from './auto-install';\nimport { depVersions, sourceDir, type TemplateInfo, templates } from './constants';\n\nexport type Template = TemplateInfo['value'];\nexport interface Options {\n outputDir: string;\n template: Template;\n\n /**\n * the package manager to use\n *\n * @defaultValue 'npm'\n */\n packageManager?: PackageManager;\n\n installDeps?: boolean;\n initializeGit?: boolean;\n log?: (message: string) => void;\n plugins?: TemplatePlugin[];\n}\n\nexport interface TemplatePluginContext {\n template: TemplateInfo;\n log: (message: string) => void;\n /**\n * output directory\n */\n dest: string;\n\n /**\n * output directory for app code (e.g. under `/src`)\n */\n appDir: string;\n}\n\nexport type PackageJsonType = {\n name?: string;\n version?: string;\n private?: boolean;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n} & Record<string, unknown>;\n\ntype Awaitable<T> = T | Promise<T>;\n\nexport interface TemplatePlugin {\n template?: (\n this: Pick<TemplatePluginContext, 'dest'>,\n info: TemplateInfo,\n ) => Awaitable<void | TemplateInfo>;\n packageJson?: (\n this: TemplatePluginContext,\n packageJson: PackageJsonType,\n ) => Awaitable<void | PackageJsonType>;\n afterWrite?: (this: TemplatePluginContext) => Awaitable<void>;\n readme?: (this: TemplatePluginContext, content: string) => Awaitable<void | string>;\n}\n\nexport async function create(createOptions: Options): Promise<void> {\n const {\n outputDir,\n plugins = [],\n packageManager = 'npm',\n initializeGit = false,\n installDeps = false,\n log = console.log,\n } = createOptions;\n\n let template = templates.find((item) => item.value === createOptions.template)!;\n for (const plugin of plugins) {\n template = (await plugin.template?.call({ dest: outputDir }, template)) ?? template;\n }\n\n const appDir = path.join(outputDir, template.appDir);\n const projectName = path.basename(outputDir);\n const pluginContext: TemplatePluginContext = {\n template,\n dest: outputDir,\n log,\n appDir,\n };\n\n await copy(path.join(sourceDir, 'template', template.value), outputDir, {\n rename(file) {\n file = file.replace('example.gitignore', '.gitignore');\n\n return template.rename?.(file) ?? file;\n },\n });\n\n const packageJsonPath = path.join(outputDir, 'package.json');\n let packageJson = await initPackageJson(projectName, packageJsonPath);\n for (const plugin of plugins) {\n packageJson = (await plugin.packageJson?.call(pluginContext, packageJson)) ?? packageJson;\n }\n await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));\n\n const readmePath = path.join(outputDir, 'README.md');\n let readme = `# ${projectName}\\n\\n${await fs.readFile(readmePath)}`;\n for (const plugin of plugins) {\n readme = (await plugin.readme?.call(pluginContext, readme)) ?? readme;\n }\n await fs.writeFile(readmePath, readme);\n\n for (const plugin of plugins) {\n await plugin.afterWrite?.call(pluginContext);\n }\n\n if (installDeps) {\n try {\n await autoInstall(packageManager, outputDir);\n log('Installed dependencies');\n } catch (err) {\n log(`Failed to install dependencies: ${err}`);\n }\n }\n\n if (initializeGit && (await tryGitInit(outputDir))) {\n log('Initialized Git repository');\n }\n}\n\nasync function initPackageJson(\n projectName: string,\n packageJsonPath: string,\n): Promise<PackageJsonType> {\n function replaceWorkspaceDeps(deps: Record<string, string> = {}) {\n for (const k in deps) {\n if (deps[k].startsWith('workspace:') && k in depVersions) {\n deps[k] = depVersions[k as keyof typeof depVersions];\n }\n }\n\n return deps;\n }\n\n const packageJson: PackageJsonType = JSON.parse(await fs.readFile(packageJsonPath, 'utf-8'));\n const dependencies = replaceWorkspaceDeps(packageJson.dependencies);\n const devDependencies = replaceWorkspaceDeps(packageJson.devDependencies);\n const scripts = { ...packageJson.scripts };\n\n return {\n ...packageJson,\n name: projectName,\n scripts,\n dependencies,\n devDependencies,\n };\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-fumadocs-app",
|
|
3
|
-
"version": "16.2.
|
|
3
|
+
"version": "16.2.29",
|
|
4
4
|
"description": "Create a new documentation site with Fumadocs",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Docs",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
42
|
"@clack/prompts": "^1.8.1",
|
|
43
|
-
"@fumadocs/cli": "1.
|
|
43
|
+
"@fumadocs/cli": "1.8.0",
|
|
44
44
|
"cac": "^7.1.0",
|
|
45
45
|
"fuma-cli": "^0.3.1",
|
|
46
46
|
"picocolors": "^1.1.1",
|
|
@@ -3,7 +3,6 @@ import { createGetUrl } from 'fumadocs-core/source';
|
|
|
3
3
|
export const appName = 'Astro';
|
|
4
4
|
export const docsRoute = '/docs';
|
|
5
5
|
export const docsImageRoute = '/og/docs';
|
|
6
|
-
export const docsContentRoute = '/llms.mdx/docs';
|
|
7
6
|
|
|
8
7
|
// fill this with your actual GitHub info, for example:
|
|
9
8
|
export const gitConfig = {
|
|
@@ -12,12 +11,17 @@ export const gitConfig = {
|
|
|
12
11
|
branch: 'main',
|
|
13
12
|
};
|
|
14
13
|
|
|
15
|
-
const
|
|
14
|
+
const getDocsUrl = createGetUrl(docsRoute);
|
|
16
15
|
|
|
17
16
|
export function getPageMarkdownUrl(page: { slugs: string[]; locale?: string }) {
|
|
18
|
-
const segments = [...page.slugs
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
const segments = [...page.slugs];
|
|
18
|
+
if (segments.length === 0) {
|
|
19
|
+
segments.push('index.md');
|
|
20
|
+
} else {
|
|
21
|
+
segments[segments.length - 1] += '.md';
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return { segments, url: getDocsUrl(segments, page.locale) };
|
|
21
25
|
}
|
|
22
26
|
|
|
23
27
|
const getImageUrl = createGetUrl(docsImageRoute);
|
|
@@ -9,7 +9,7 @@ export const prerender = true;
|
|
|
9
9
|
|
|
10
10
|
export const getStaticPaths = (() => {
|
|
11
11
|
return source.getPages().map((page) => ({
|
|
12
|
-
params: { slug: page.slugs.join('/') || undefined },
|
|
12
|
+
params: { slug: decodeURI(page.slugs.join('/')) || undefined },
|
|
13
13
|
props: { page },
|
|
14
14
|
}));
|
|
15
15
|
}) satisfies GetStaticPaths;
|
package/template/astro/src/pages/{llms.mdx/docs/[...slug]/content.md.ts → docs/[...slug].md.ts}
RENAMED
|
@@ -5,7 +5,7 @@ export const prerender = true;
|
|
|
5
5
|
|
|
6
6
|
export const getStaticPaths = (() => {
|
|
7
7
|
return source.getPages().map((page) => ({
|
|
8
|
-
params: { slug: page.slugs.join('/') ||
|
|
8
|
+
params: { slug: decodeURI(page.slugs.join('/')) || 'index' },
|
|
9
9
|
props: { page },
|
|
10
10
|
}));
|
|
11
11
|
}) satisfies GetStaticPaths;
|
|
@@ -7,7 +7,7 @@ export const prerender = true;
|
|
|
7
7
|
|
|
8
8
|
export const getStaticPaths = (() => {
|
|
9
9
|
return source.getPages().map((page) => ({
|
|
10
|
-
params: { slug: page.slugs.join('/') || undefined },
|
|
10
|
+
params: { slug: decodeURI(page.slugs.join('/')) || undefined },
|
|
11
11
|
props: { page },
|
|
12
12
|
}));
|
|
13
13
|
}) satisfies GetStaticPaths;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants-BVDmkkx1.js","names":["corePkg","mdxPkg","basePkg","astroPkg","versionPkg.dependencies","basePkg.name","basePkg.version"],"sources":["../../create-app-versions/package.json","../../core/package.json","../../mdx/package.json","../../base-ui/package.json","../../astro/package.json","../src/constants.ts"],"sourcesContent":["","","","","","import { fileURLToPath } from 'node:url';\nimport versionPkg from '../../create-app-versions/package.json';\nimport * as corePkg from '../../core/package.json';\nimport * as mdxPkg from '../../mdx/package.json';\nimport * as basePkg from '../../base-ui/package.json';\nimport * as astroPkg from '../../astro/package.json';\n\nexport const sourceDir = fileURLToPath(new URL(`../`, import.meta.url).href);\n\nexport const isCI = Boolean(process.env.CI);\n\nexport interface TemplateInfo {\n value:\n | '+next+fuma-docs-mdx'\n | 'astro'\n | 'waku'\n | 'react-router'\n | 'react-router-spa'\n | 'tanstack-start'\n | 'tanstack-start-spa'\n | '+next+fuma-docs-mdx+static';\n label: string;\n appDir: string;\n /**\n * path to root provider, relative to `appDir``\n */\n rootProviderPath: string;\n hint?: string;\n /**\n * rename files when copying from template\n */\n rename?: (name: string) => string;\n}\n\nexport const templates: TemplateInfo[] = [\n {\n value: '+next+fuma-docs-mdx',\n label: 'Next.js: Fumadocs MDX',\n hint: 'recommended: powerful and mature',\n appDir: '',\n rootProviderPath: 'app/layout.tsx',\n },\n {\n value: 'waku',\n label: 'Waku: Fumadocs MDX',\n hint: 'recommended: fast and simple',\n appDir: 'src',\n rootProviderPath: 'components/provider.tsx',\n },\n {\n value: '+next+fuma-docs-mdx+static',\n label: 'Next.js Static: Fumadocs MDX',\n appDir: '',\n rootProviderPath: 'components/provider.tsx',\n },\n {\n value: 'react-router',\n label: 'React Router: Fumadocs MDX (not RSC)',\n appDir: 'app',\n rootProviderPath: 'root.tsx',\n },\n {\n value: 'react-router-spa',\n label: 'React Router SPA: Fumadocs MDX (not RSC)',\n hint: 'SPA mode allows you to host the site statically, compatible with a CDN.',\n appDir: 'app',\n rootProviderPath: 'root.tsx',\n },\n {\n value: 'tanstack-start',\n label: 'Tanstack Start: Fumadocs MDX (not RSC)',\n appDir: 'src',\n rootProviderPath: 'routes/__root.tsx',\n },\n {\n value: 'tanstack-start-spa',\n label: 'Tanstack Start SPA: Fumadocs MDX (not RSC)',\n hint: 'SPA mode allows you to host the site statically, compatible with a CDN.',\n appDir: 'src',\n rootProviderPath: 'routes/__root.tsx',\n },\n {\n value: 'astro',\n label: 'Astro: Content Collections',\n appDir: 'src',\n rootProviderPath: 'components/provider.tsx',\n },\n];\n\nconst workspaces = [corePkg, mdxPkg, basePkg, astroPkg];\n\nexport const depVersions = versionPkg.dependencies;\n\nfor (const workspace of workspaces) {\n depVersions[workspace.name as keyof typeof depVersions] = workspace.version;\n}\n\ndepVersions['fumadocs-ui'] = `npm:${basePkg.name}@${basePkg.version}`;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AKOA,MAAa,YAAY,cAAc,IAAI,IAAI,OAAO,YAAY,GAAG,CAAC,CAAC,IAAI;AAE3E,MAAa,OAAO,QAAQ,QAAQ,IAAI,EAAE;AAyB1C,MAAa,YAA4B;CACvC;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,QAAQ;EACR,kBAAkB;CACpB;CACA;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,QAAQ;EACR,kBAAkB;CACpB;CACA;EACE,OAAO;EACP,OAAO;EACP,QAAQ;EACR,kBAAkB;CACpB;CACA;EACE,OAAO;EACP,OAAO;EACP,QAAQ;EACR,kBAAkB;CACpB;CACA;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,QAAQ;EACR,kBAAkB;CACpB;CACA;EACE,OAAO;EACP,OAAO;EACP,QAAQ;EACR,kBAAkB;CACpB;CACA;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,QAAQ;EACR,kBAAkB;CACpB;CACA;EACE,OAAO;EACP,OAAO;EACP,QAAQ;EACR,kBAAkB;CACpB;AACF;AAEA,MAAM,aAAa;CAACA;CAASC;CAAQC;CAASC;AAAQ;AAEtD,MAAa,cAAcC;AAE3B,KAAK,MAAM,aAAa,YACtB,YAAY,UAAU,QAAoC,UAAU;AAGtE,YAAY,iBAAiB,OAAOC,OAAa,GAAGC"}
|