create-fumadocs-app 16.0.38 → 16.0.39
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 +2 -2
- package/dist/{constants-CG8Fydtp.js → constants-CbWReQFk.js} +31 -22
- package/dist/constants-CbWReQFk.js.map +1 -0
- package/dist/index.js +2 -2
- package/dist/plugins/biome.js +1 -1
- package/dist/plugins/eslint.js +1 -1
- package/dist/plugins/orama-cloud.js +1 -1
- package/dist/{src-DO725G4h.js → src-B5lWFrhF.js} +2 -2
- package/dist/{src-DO725G4h.js.map → src-B5lWFrhF.js.map} +1 -1
- package/package.json +2 -2
- package/template/+next+fuma-docs-mdx/app/docs/[[...slug]]/page.tsx +15 -1
- package/template/+next+fuma-docs-mdx/app/llms.mdx/docs/[[...slug]]/route.ts +20 -0
- package/template/+next+fuma-docs-mdx/components/ai/page-actions.tsx +230 -0
- package/template/+next+fuma-docs-mdx/lib/cn.ts +1 -0
- package/template/+next+fuma-docs-mdx/next.config.mjs +8 -0
- package/template/+next+fuma-docs-mdx/package.json +3 -2
- package/template/+next+fuma-docs-mdx+static/package.json +1 -1
- package/template/react-router/app/docs/page.tsx +8 -2
- package/template/react-router/package.json +7 -7
- package/template/react-router-spa/app/docs/page.tsx +8 -2
- package/template/react-router-spa/package.json +6 -6
- package/template/tanstack-start/package.json +5 -5
- package/template/tanstack-start-spa/package.json +7 -7
- package/template/tanstack-start-spa/src/lib/source.ts +2 -8
- package/template/tanstack-start-spa/src/routes/docs/$.tsx +8 -2
- package/template/tanstack-start-spa/src/routes/index.tsx +13 -11
- package/template/waku/package.json +3 -4
- package/template/waku/src/pages/_root.tsx +20 -0
- package/template/waku/waku.config.ts +5 -0
- package/dist/constants-CG8Fydtp.js.map +0 -1
- package/template/waku/src/pages/_layout.tsx +0 -7
package/dist/bin.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
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-
|
|
2
|
+
import { i as templates, n as isCI } from "./constants-CbWReQFk.js";
|
|
3
|
+
import { n as getPackageManager, r as managers, t as create } from "./src-B5lWFrhF.js";
|
|
4
4
|
import fs from "node:fs/promises";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { cancel, confirm, group, intro, isCancel, outro, select, spinner, text } from "@clack/prompts";
|
|
@@ -77,7 +77,10 @@ async function tryGitInit(cwd) {
|
|
|
77
77
|
});
|
|
78
78
|
return true;
|
|
79
79
|
} catch {
|
|
80
|
-
await fs.
|
|
80
|
+
await fs.rm(join(cwd, ".git"), {
|
|
81
|
+
recursive: true,
|
|
82
|
+
force: true
|
|
83
|
+
});
|
|
81
84
|
return false;
|
|
82
85
|
}
|
|
83
86
|
}
|
|
@@ -122,7 +125,7 @@ var package_exports$4 = /* @__PURE__ */ __exportAll({
|
|
|
122
125
|
version: () => version$4
|
|
123
126
|
});
|
|
124
127
|
var name$4 = "fumadocs-core";
|
|
125
|
-
var version$4 = "16.4.
|
|
128
|
+
var version$4 = "16.4.6";
|
|
126
129
|
var description$4 = "The React.js library for building a documentation website";
|
|
127
130
|
var keywords$4 = ["Docs", "Fumadocs"];
|
|
128
131
|
var homepage$4 = "https://fumadocs.dev";
|
|
@@ -234,10 +237,10 @@ var scripts$4 = {
|
|
|
234
237
|
"types:check": "tsc --noEmit"
|
|
235
238
|
};
|
|
236
239
|
var dependencies$4 = {
|
|
237
|
-
"@formatjs/intl-localematcher": "^0.7.
|
|
240
|
+
"@formatjs/intl-localematcher": "^0.7.5",
|
|
238
241
|
"@orama/orama": "^3.1.18",
|
|
239
|
-
"@shikijs/rehype": "^3.
|
|
240
|
-
"@shikijs/transformers": "^3.
|
|
242
|
+
"@shikijs/rehype": "^3.21.0",
|
|
243
|
+
"@shikijs/transformers": "^3.21.0",
|
|
241
244
|
"estree-util-value-to-estree": "^3.5.0",
|
|
242
245
|
"github-slugger": "^2.0.0",
|
|
243
246
|
"hast-util-to-estree": "^3.1.3",
|
|
@@ -250,21 +253,21 @@ var dependencies$4 = {
|
|
|
250
253
|
"remark-gfm": "^4.0.1",
|
|
251
254
|
"remark-rehype": "^11.1.2",
|
|
252
255
|
"scroll-into-view-if-needed": "^3.1.0",
|
|
253
|
-
"shiki": "^3.
|
|
256
|
+
"shiki": "^3.21.0",
|
|
254
257
|
"tinyglobby": "^0.2.15",
|
|
255
258
|
"unist-util-visit": "^5.0.0"
|
|
256
259
|
};
|
|
257
260
|
var devDependencies$4 = {
|
|
258
261
|
"@mdx-js/mdx": "^3.1.1",
|
|
259
|
-
"@mixedbread/sdk": "^0.
|
|
262
|
+
"@mixedbread/sdk": "^0.50.0",
|
|
260
263
|
"@orama/core": "^1.2.16",
|
|
261
264
|
"@oramacloud/client": "^2.1.4",
|
|
262
|
-
"@tanstack/react-router": "1.
|
|
265
|
+
"@tanstack/react-router": "1.146.2",
|
|
263
266
|
"@types/estree-jsx": "^1.0.5",
|
|
264
267
|
"@types/hast": "^3.0.4",
|
|
265
268
|
"@types/mdast": "^4.0.4",
|
|
266
269
|
"@types/negotiator": "^0.6.4",
|
|
267
|
-
"@types/node": "
|
|
270
|
+
"@types/node": "25.0.3",
|
|
268
271
|
"@types/react": "^19.2.7",
|
|
269
272
|
"@types/react-dom": "^19.2.3",
|
|
270
273
|
"algoliasearch": "5.46.2",
|
|
@@ -273,7 +276,7 @@ var devDependencies$4 = {
|
|
|
273
276
|
"mdast-util-mdx-jsx": "^3.2.0",
|
|
274
277
|
"mdast-util-mdxjs-esm": "^2.0.1",
|
|
275
278
|
"next": "16.1.1",
|
|
276
|
-
"react-router": "^7.
|
|
279
|
+
"react-router": "^7.12.0",
|
|
277
280
|
"remark-directive": "^4.0.0",
|
|
278
281
|
"remark-mdx": "^3.1.1",
|
|
279
282
|
"remove-markdown": "^0.6.2",
|
|
@@ -282,7 +285,7 @@ var devDependencies$4 = {
|
|
|
282
285
|
"typescript": "^5.9.3",
|
|
283
286
|
"unified": "^11.0.5",
|
|
284
287
|
"vfile": "^6.0.3",
|
|
285
|
-
"waku": "1.0.0-alpha.
|
|
288
|
+
"waku": "1.0.0-alpha.1",
|
|
286
289
|
"zod": "^4.3.5"
|
|
287
290
|
};
|
|
288
291
|
var peerDependencies$4 = {
|
|
@@ -358,7 +361,7 @@ var package_exports$3 = /* @__PURE__ */ __exportAll({
|
|
|
358
361
|
version: () => version$3
|
|
359
362
|
});
|
|
360
363
|
var name$3 = "@fumadocs/ui";
|
|
361
|
-
var version$3 = "16.4.
|
|
364
|
+
var version$3 = "16.4.6";
|
|
362
365
|
var description$3 = "The low-level primitives for Fumadocs UI.";
|
|
363
366
|
var keywords$3 = ["Docs", "Fumadocs"];
|
|
364
367
|
var homepage$3 = "https://fumadocs.dev";
|
|
@@ -383,7 +386,6 @@ var scripts$3 = {
|
|
|
383
386
|
"types:check": "tsc --noEmit"
|
|
384
387
|
};
|
|
385
388
|
var dependencies$3 = {
|
|
386
|
-
"fumadocs-core": "workspace:*",
|
|
387
389
|
"next-themes": "^0.4.6",
|
|
388
390
|
"postcss-selector-parser": "^7.1.1",
|
|
389
391
|
"tailwind-merge": "^3.4.0"
|
|
@@ -406,6 +408,7 @@ var devDependencies$3 = {
|
|
|
406
408
|
};
|
|
407
409
|
var peerDependencies$3 = {
|
|
408
410
|
"@types/react": "*",
|
|
411
|
+
"fumadocs-core": "workspace:*",
|
|
409
412
|
"next": "16.x.x",
|
|
410
413
|
"react": "^19.2.0",
|
|
411
414
|
"react-dom": "^19.2.0",
|
|
@@ -548,7 +551,7 @@ var devDependencies$2 = {
|
|
|
548
551
|
"@types/js-yaml": "^4.0.9",
|
|
549
552
|
"@types/mdast": "^4.0.4",
|
|
550
553
|
"@types/mdx": "^2.0.13",
|
|
551
|
-
"@types/node": "^
|
|
554
|
+
"@types/node": "^25.0.3",
|
|
552
555
|
"@types/picomatch": "^4.0.2",
|
|
553
556
|
"@types/react": "^19.2.7",
|
|
554
557
|
"eslint-config-custom": "workspace:*",
|
|
@@ -563,7 +566,7 @@ var devDependencies$2 = {
|
|
|
563
566
|
"rollup": "^4.55.1",
|
|
564
567
|
"tsconfig": "workspace:*",
|
|
565
568
|
"tsdown": "^0.18.4",
|
|
566
|
-
"vite": "^7.3.
|
|
569
|
+
"vite": "^7.3.1",
|
|
567
570
|
"webpack": "^5.104.1"
|
|
568
571
|
};
|
|
569
572
|
var peerDependencies$2 = {
|
|
@@ -627,7 +630,7 @@ var package_exports$1 = /* @__PURE__ */ __exportAll({
|
|
|
627
630
|
version: () => version$1
|
|
628
631
|
});
|
|
629
632
|
var name$1 = "fumadocs-ui";
|
|
630
|
-
var version$1 = "16.4.
|
|
633
|
+
var version$1 = "16.4.6";
|
|
631
634
|
var description$1 = "The Radix UI version of Fumadocs UI";
|
|
632
635
|
var keywords$1 = ["Docs", "Fumadocs"];
|
|
633
636
|
var homepage$1 = "https://fumadocs.dev";
|
|
@@ -734,7 +737,6 @@ var dependencies$1 = {
|
|
|
734
737
|
"@radix-ui/react-slot": "^1.2.4",
|
|
735
738
|
"@radix-ui/react-tabs": "^1.1.13",
|
|
736
739
|
"class-variance-authority": "^0.7.1",
|
|
737
|
-
"fumadocs-core": "workspace:*",
|
|
738
740
|
"lucide-react": "^0.562.0",
|
|
739
741
|
"next-themes": "^0.4.6",
|
|
740
742
|
"react-medium-image-zoom": "^5.4.0",
|
|
@@ -743,21 +745,25 @@ var dependencies$1 = {
|
|
|
743
745
|
var devDependencies$1 = {
|
|
744
746
|
"@fumadocs/cli": "workspace:*",
|
|
745
747
|
"@tailwindcss/cli": "^4.1.18",
|
|
746
|
-
"@types/node": "^
|
|
748
|
+
"@types/node": "^25.0.3",
|
|
747
749
|
"@types/react": "^19.2.7",
|
|
748
750
|
"@types/react-dom": "^19.2.3",
|
|
749
751
|
"eslint-config-custom": "workspace:*",
|
|
752
|
+
"fumadocs-core": "workspace:*",
|
|
750
753
|
"tailwindcss": "^4.1.18",
|
|
751
754
|
"tsconfig": "workspace:*",
|
|
752
755
|
"tsdown": "^0.18.4"
|
|
753
756
|
};
|
|
754
757
|
var peerDependencies$1 = {
|
|
755
758
|
"@types/react": "*",
|
|
759
|
+
"fumadocs-core": "workspace:*",
|
|
760
|
+
"next": "16.x.x",
|
|
756
761
|
"react": "^19.2.0",
|
|
757
762
|
"react-dom": "^19.2.0",
|
|
758
763
|
"tailwindcss": "^4.0.0"
|
|
759
764
|
};
|
|
760
765
|
var peerDependenciesMeta$1 = {
|
|
766
|
+
"next": { "optional": true },
|
|
761
767
|
"@types/react": { "optional": true },
|
|
762
768
|
"tailwindcss": { "optional": true }
|
|
763
769
|
};
|
|
@@ -804,7 +810,7 @@ var package_exports = /* @__PURE__ */ __exportAll({
|
|
|
804
810
|
version: () => version
|
|
805
811
|
});
|
|
806
812
|
var name = "@fumadocs/base-ui";
|
|
807
|
-
var version = "16.4.
|
|
813
|
+
var version = "16.4.6";
|
|
808
814
|
var description = "The Base UI version of Fumadocs UI";
|
|
809
815
|
var keywords = ["Docs", "Fumadocs"];
|
|
810
816
|
var homepage = "https://fumadocs.dev";
|
|
@@ -894,7 +900,6 @@ var dependencies = {
|
|
|
894
900
|
"@base-ui/react": "^1.0.0",
|
|
895
901
|
"@fumadocs/ui": "workspace:*",
|
|
896
902
|
"class-variance-authority": "^0.7.1",
|
|
897
|
-
"fumadocs-core": "workspace:*",
|
|
898
903
|
"lucide-react": "^0.562.0",
|
|
899
904
|
"next-themes": "^0.4.6",
|
|
900
905
|
"react-medium-image-zoom": "^5.4.0",
|
|
@@ -903,21 +908,25 @@ var dependencies = {
|
|
|
903
908
|
var devDependencies = {
|
|
904
909
|
"@fumadocs/cli": "workspace:*",
|
|
905
910
|
"@tailwindcss/cli": "^4.1.18",
|
|
906
|
-
"@types/node": "^
|
|
911
|
+
"@types/node": "^25.0.3",
|
|
907
912
|
"@types/react": "^19.2.7",
|
|
908
913
|
"@types/react-dom": "^19.2.3",
|
|
909
914
|
"eslint-config-custom": "workspace:*",
|
|
915
|
+
"fumadocs-core": "workspace:*",
|
|
910
916
|
"tailwindcss": "^4.1.18",
|
|
911
917
|
"tsconfig": "workspace:*",
|
|
912
918
|
"tsdown": "^0.18.4"
|
|
913
919
|
};
|
|
914
920
|
var peerDependencies = {
|
|
915
921
|
"@types/react": "*",
|
|
922
|
+
"fumadocs-core": "workspace:*",
|
|
923
|
+
"next": "16.x.x",
|
|
916
924
|
"react": "^19.2.0",
|
|
917
925
|
"react-dom": "^19.2.0",
|
|
918
926
|
"tailwindcss": "^4.0.0"
|
|
919
927
|
};
|
|
920
928
|
var peerDependenciesMeta = {
|
|
929
|
+
"next": { "optional": true },
|
|
921
930
|
"@types/react": { "optional": true },
|
|
922
931
|
"tailwindcss": { "optional": true }
|
|
923
932
|
};
|
|
@@ -1004,4 +1013,4 @@ for (const workspace of workspaces) depVersions[workspace.name] = workspace.vers
|
|
|
1004
1013
|
|
|
1005
1014
|
//#endregion
|
|
1006
1015
|
export { copy as a, writeFile as c, templates as i, isCI as n, pick as o, sourceDir as r, tryGitInit as s, depVersions as t };
|
|
1007
|
-
//# sourceMappingURL=constants-
|
|
1016
|
+
//# sourceMappingURL=constants-CbWReQFk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants-CbWReQFk.js","names":["files","result: Partial<T>","templates: TemplateInfo[]","corePkg","uiPkg","mdxPkg","radixPkg","basePkg","versionPkg.dependencies"],"sources":["../src/utils.ts","../../create-app-versions/package.json","../../core/package.json","../../ui/package.json","../../mdx/package.json","../../radix-ui/package.json","../../base-ui/package.json","../src/constants.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport path, { join } from 'node:path';\nimport { x } from 'tinyexec';\n\nexport async function writeFile(file: string, content: string) {\n await fs.mkdir(path.dirname(file), { recursive: true });\n await fs.writeFile(file, content);\n}\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\nexport function pick<T extends object, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> {\n const result: Partial<T> = {};\n\n for (const key of keys) {\n if (key in obj) {\n result[key] = obj[key];\n }\n }\n\n return result as Pick<T, K>;\n}\n","","","","","","","import { fileURLToPath } from 'node:url';\nimport versionPkg from '../../create-app-versions/package.json';\nimport * as corePkg from '../../core/package.json';\nimport * as uiPkg from '../../ui/package.json';\nimport * as mdxPkg from '../../mdx/package.json';\nimport * as radixPkg from '../../radix-ui/package.json';\nimport * as basePkg from '../../base-ui/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 | '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',\n appDir: '',\n rootProviderPath: 'app/layout.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: 'waku',\n label: 'Waku: Fumadocs MDX',\n appDir: 'src',\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\nconst workspaces = [corePkg, uiPkg, mdxPkg, radixPkg, basePkg];\n\nexport const depVersions = versionPkg.dependencies;\n\nfor (const workspace of workspaces) {\n depVersions[workspace.name as keyof typeof depVersions] = workspace.version;\n}\n"],"mappings":"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"}
|
package/dist/index.js
CHANGED
package/dist/plugins/biome.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as writeFile, o as pick, t as depVersions } from "../constants-
|
|
1
|
+
import { c as writeFile, o as pick, t as depVersions } from "../constants-CbWReQFk.js";
|
|
2
2
|
import biome_base_default from "./biome.base.js";
|
|
3
3
|
import biome_next_default from "./biome.next.js";
|
|
4
4
|
import path from "node:path";
|
package/dist/plugins/eslint.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as copy, c as writeFile, o as pick, r as sourceDir, t as depVersions } from "../constants-
|
|
1
|
+
import { a as copy, c as writeFile, o as pick, r as sourceDir, t as depVersions } from "../constants-CbWReQFk.js";
|
|
2
2
|
import fs from "node:fs/promises";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { IndentationText, Project, QuoteKind, StructureKind, SyntaxKind, ts } from "ts-morph";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as copy, i as templates, r as sourceDir, s as tryGitInit, t as depVersions } from "./constants-
|
|
1
|
+
import { a as copy, i as templates, r as sourceDir, s as tryGitInit, t as depVersions } from "./constants-CbWReQFk.js";
|
|
2
2
|
import fs from "node:fs/promises";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { x } from "tinyexec";
|
|
@@ -86,4 +86,4 @@ async function initPackageJson(projectName, packageJsonPath) {
|
|
|
86
86
|
|
|
87
87
|
//#endregion
|
|
88
88
|
export { getPackageManager as n, managers as r, create as t };
|
|
89
|
-
//# sourceMappingURL=src-
|
|
89
|
+
//# sourceMappingURL=src-B5lWFrhF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"src-
|
|
1
|
+
{"version":3,"file":"src-B5lWFrhF.js","names":["pluginContext: TemplatePluginContext","packageJson: PackageJsonType"],"sources":["../src/auto-install.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 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)).toString());\n\n return {\n ...packageJson,\n name: projectName,\n scripts: {\n ...packageJson.scripts,\n postinstall: 'fumadocs-mdx',\n },\n dependencies: replaceWorkspaceDeps(packageJson.dependencies),\n devDependencies: replaceWorkspaceDeps(packageJson.devDependencies),\n };\n}\n"],"mappings":";;;;;;AAIA,MAAa,WAAW;CAAC;CAAO;CAAQ;CAAO;CAAO;AAEtD,SAAgB,oBAAoC;CAClD,MAAM,YAAY,QAAQ,IAAI,yBAAyB;AAEvD,KAAI,UAAU,WAAW,OAAO,CAC9B,QAAO;AAGT,KAAI,UAAU,WAAW,OAAO,CAC9B,QAAO;AAGT,KAAI,UAAU,WAAW,MAAM,CAC7B,QAAO;AAGT,QAAO;;AAGT,eAAsB,YAAY,SAAyB,MAAc;AACvE,OAAM,EAAE,SAAS,CAAC,UAAU,EAAE;EAC5B,cAAc;EACd,aAAa;GACX,KAAK;IACH,GAAG,QAAQ;IACX,UAAU;IACV,wBAAwB;IACzB;GACD,KAAK;GACN;EACF,CAAC;;;;;AC4BJ,eAAsB,OAAO,eAAuC;CAClE,MAAM,EACJ,WACA,UAAU,EAAE,EACZ,iBAAiB,OACjB,gBAAgB,OAChB,cAAc,OACd,MAAM,QAAQ,QACZ;CAEJ,IAAI,WAAW,UAAU,MAAM,SAAS,KAAK,UAAU,cAAc,SAAS;AAC9E,MAAK,MAAM,UAAU,QACnB,YAAY,MAAM,OAAO,UAAU,KAAK,EAAE,MAAM,WAAW,EAAE,SAAS,IAAK;CAG7E,MAAM,SAAS,KAAK,KAAK,WAAW,SAAS,OAAO;CACpD,MAAM,cAAc,KAAK,SAAS,UAAU;CAC5C,MAAMA,gBAAuC;EAC3C;EACA,MAAM;EACN;EACA;EACD;AAED,OAAM,KAAK,KAAK,KAAK,WAAW,YAAY,SAAS,MAAM,EAAE,WAAW,EACtE,OAAO,MAAM;AACX,SAAO,KAAK,QAAQ,qBAAqB,aAAa;AAEtD,SAAO,SAAS,SAAS,KAAK,IAAI;IAErC,CAAC;CAEF,MAAM,kBAAkB,KAAK,KAAK,WAAW,eAAe;CAC5D,IAAI,cAAc,MAAM,gBAAgB,aAAa,gBAAgB;AACrE,MAAK,MAAM,UAAU,QACnB,eAAe,MAAM,OAAO,aAAa,KAAK,eAAe,YAAY,IAAK;AAEhF,OAAM,GAAG,UAAU,iBAAiB,KAAK,UAAU,aAAa,MAAM,EAAE,CAAC;CAEzE,MAAM,aAAa,KAAK,KAAK,WAAW,YAAY;CACpD,IAAI,SAAS,KAAK,YAAY,MAAM,MAAM,GAAG,SAAS,WAAW;AACjE,MAAK,MAAM,UAAU,QACnB,UAAU,MAAM,OAAO,QAAQ,KAAK,eAAe,OAAO,IAAK;AAEjE,OAAM,GAAG,UAAU,YAAY,OAAO;AAEtC,MAAK,MAAM,UAAU,QACnB,OAAM,OAAO,YAAY,KAAK,cAAc;AAG9C,KAAI,YACF,KAAI;AACF,QAAM,YAAY,gBAAgB,UAAU;AAC5C,MAAI,yBAAyB;UACtB,KAAK;AACZ,MAAI,mCAAmC,MAAM;;AAIjD,KAAI,iBAAkB,MAAM,WAAW,UAAU,CAC/C,KAAI,6BAA6B;;AAIrC,eAAe,gBACb,aACA,iBAC0B;CAC1B,SAAS,qBAAqB,OAA+B,EAAE,EAAE;AAC/D,OAAK,MAAM,KAAK,KACd,KAAI,KAAK,GAAG,WAAW,aAAa,IAAI,KAAK,YAC3C,MAAK,KAAK,YAAY;AAI1B,SAAO;;CAGT,MAAMC,cAA+B,KAAK,OAAO,MAAM,GAAG,SAAS,gBAAgB,EAAE,UAAU,CAAC;AAEhG,QAAO;EACL,GAAG;EACH,MAAM;EACN,SAAS;GACP,GAAG,YAAY;GACf,aAAa;GACd;EACD,cAAc,qBAAqB,YAAY,aAAa;EAC5D,iBAAiB,qBAAqB,YAAY,gBAAgB;EACnE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-fumadocs-app",
|
|
3
|
-
"version": "16.0.
|
|
3
|
+
"version": "16.0.39",
|
|
4
4
|
"description": "Create a new documentation site with Fumadocs",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Docs",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@types/cross-spawn": "^6.0.6",
|
|
45
|
-
"@types/node": "
|
|
45
|
+
"@types/node": "25.0.3",
|
|
46
46
|
"tinyglobby": "^0.2.15",
|
|
47
47
|
"tsdown": "^0.18.4",
|
|
48
48
|
"typescript": "^5.9.3",
|
|
@@ -4,6 +4,7 @@ import { notFound } from 'next/navigation';
|
|
|
4
4
|
import { getMDXComponents } from '@/mdx-components';
|
|
5
5
|
import type { Metadata } from 'next';
|
|
6
6
|
import { createRelativeLink } from 'fumadocs-ui/mdx';
|
|
7
|
+
import { LLMCopyButton, ViewOptions } from '@/components/ai/page-actions';
|
|
7
8
|
|
|
8
9
|
export default async function Page(props: PageProps<'/docs/[[...slug]]'>) {
|
|
9
10
|
const params = await props.params;
|
|
@@ -11,11 +12,24 @@ export default async function Page(props: PageProps<'/docs/[[...slug]]'>) {
|
|
|
11
12
|
if (!page) notFound();
|
|
12
13
|
|
|
13
14
|
const MDX = page.data.body;
|
|
15
|
+
const gitConfig = {
|
|
16
|
+
user: 'username',
|
|
17
|
+
repo: 'repo',
|
|
18
|
+
branch: 'main',
|
|
19
|
+
};
|
|
14
20
|
|
|
15
21
|
return (
|
|
16
22
|
<DocsPage toc={page.data.toc} full={page.data.full}>
|
|
17
23
|
<DocsTitle>{page.data.title}</DocsTitle>
|
|
18
|
-
<DocsDescription>{page.data.description}</DocsDescription>
|
|
24
|
+
<DocsDescription className="mb-0">{page.data.description}</DocsDescription>
|
|
25
|
+
<div className="flex flex-row gap-2 items-center border-b pb-6">
|
|
26
|
+
<LLMCopyButton markdownUrl={`${page.url}.mdx`} />
|
|
27
|
+
<ViewOptions
|
|
28
|
+
markdownUrl={`${page.url}.mdx`}
|
|
29
|
+
// update it to match your repo
|
|
30
|
+
githubUrl={`https://github.com/${gitConfig.user}/${gitConfig.repo}/blob/${gitConfig.branch}/docs/content/docs/${page.path}`}
|
|
31
|
+
/>
|
|
32
|
+
</div>
|
|
19
33
|
<DocsBody>
|
|
20
34
|
<MDX
|
|
21
35
|
components={getMDXComponents({
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { getLLMText, source } from '@/lib/source';
|
|
2
|
+
import { notFound } from 'next/navigation';
|
|
3
|
+
|
|
4
|
+
export const revalidate = false;
|
|
5
|
+
|
|
6
|
+
export async function GET(_req: Request, { params }: RouteContext<'/llms.mdx/docs/[[...slug]]'>) {
|
|
7
|
+
const { slug } = await params;
|
|
8
|
+
const page = source.getPage(slug);
|
|
9
|
+
if (!page) notFound();
|
|
10
|
+
|
|
11
|
+
return new Response(await getLLMText(page), {
|
|
12
|
+
headers: {
|
|
13
|
+
'Content-Type': 'text/markdown',
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function generateStaticParams() {
|
|
19
|
+
return source.generateParams();
|
|
20
|
+
}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useMemo, useState } from 'react';
|
|
3
|
+
import { Check, ChevronDown, Copy, ExternalLinkIcon, MessageCircleIcon } from 'lucide-react';
|
|
4
|
+
import { cn } from '@/lib/cn';
|
|
5
|
+
import { useCopyButton } from 'fumadocs-ui/utils/use-copy-button';
|
|
6
|
+
import { buttonVariants } from 'fumadocs-ui/components/ui/button';
|
|
7
|
+
import { Popover, PopoverContent, PopoverTrigger } from 'fumadocs-ui/components/ui/popover';
|
|
8
|
+
|
|
9
|
+
const cache = new Map<string, string>();
|
|
10
|
+
|
|
11
|
+
export function LLMCopyButton({
|
|
12
|
+
/**
|
|
13
|
+
* A URL to fetch the raw Markdown/MDX content of page
|
|
14
|
+
*/
|
|
15
|
+
markdownUrl,
|
|
16
|
+
}: {
|
|
17
|
+
markdownUrl: string;
|
|
18
|
+
}) {
|
|
19
|
+
const [isLoading, setLoading] = useState(false);
|
|
20
|
+
const [checked, onClick] = useCopyButton(async () => {
|
|
21
|
+
const cached = cache.get(markdownUrl);
|
|
22
|
+
if (cached) return navigator.clipboard.writeText(cached);
|
|
23
|
+
|
|
24
|
+
setLoading(true);
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
await navigator.clipboard.write([
|
|
28
|
+
new ClipboardItem({
|
|
29
|
+
'text/plain': fetch(markdownUrl).then(async (res) => {
|
|
30
|
+
const content = await res.text();
|
|
31
|
+
cache.set(markdownUrl, content);
|
|
32
|
+
|
|
33
|
+
return content;
|
|
34
|
+
}),
|
|
35
|
+
}),
|
|
36
|
+
]);
|
|
37
|
+
} finally {
|
|
38
|
+
setLoading(false);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
return (
|
|
43
|
+
<button
|
|
44
|
+
disabled={isLoading}
|
|
45
|
+
className={cn(
|
|
46
|
+
buttonVariants({
|
|
47
|
+
color: 'secondary',
|
|
48
|
+
size: 'sm',
|
|
49
|
+
className: 'gap-2 [&_svg]:size-3.5 [&_svg]:text-fd-muted-foreground',
|
|
50
|
+
}),
|
|
51
|
+
)}
|
|
52
|
+
onClick={onClick}
|
|
53
|
+
>
|
|
54
|
+
{checked ? <Check /> : <Copy />}
|
|
55
|
+
Copy Markdown
|
|
56
|
+
</button>
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function ViewOptions({
|
|
61
|
+
markdownUrl,
|
|
62
|
+
githubUrl,
|
|
63
|
+
}: {
|
|
64
|
+
/**
|
|
65
|
+
* A URL to the raw Markdown/MDX content of page
|
|
66
|
+
*/
|
|
67
|
+
markdownUrl: string;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Source file URL on GitHub
|
|
71
|
+
*/
|
|
72
|
+
githubUrl: string;
|
|
73
|
+
}) {
|
|
74
|
+
const items = useMemo(() => {
|
|
75
|
+
const fullMarkdownUrl =
|
|
76
|
+
typeof window !== 'undefined' ? new URL(markdownUrl, window.location.origin) : 'loading';
|
|
77
|
+
const q = `Read ${fullMarkdownUrl}, I want to ask questions about it.`;
|
|
78
|
+
|
|
79
|
+
return [
|
|
80
|
+
{
|
|
81
|
+
title: 'Open in GitHub',
|
|
82
|
+
href: githubUrl,
|
|
83
|
+
icon: (
|
|
84
|
+
<svg fill="currentColor" role="img" viewBox="0 0 24 24">
|
|
85
|
+
<title>GitHub</title>
|
|
86
|
+
<path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" />
|
|
87
|
+
</svg>
|
|
88
|
+
),
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
title: 'Open in Scira AI',
|
|
92
|
+
href: `https://scira.ai/?${new URLSearchParams({
|
|
93
|
+
q,
|
|
94
|
+
})}`,
|
|
95
|
+
icon: (
|
|
96
|
+
<svg
|
|
97
|
+
width="910"
|
|
98
|
+
height="934"
|
|
99
|
+
viewBox="0 0 910 934"
|
|
100
|
+
fill="none"
|
|
101
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
102
|
+
>
|
|
103
|
+
<title>Scira AI</title>
|
|
104
|
+
<path
|
|
105
|
+
d="M647.664 197.775C569.13 189.049 525.5 145.419 516.774 66.8849C508.048 145.419 464.418 189.049 385.884 197.775C464.418 206.501 508.048 250.131 516.774 328.665C525.5 250.131 569.13 206.501 647.664 197.775Z"
|
|
106
|
+
fill="currentColor"
|
|
107
|
+
stroke="currentColor"
|
|
108
|
+
strokeWidth="8"
|
|
109
|
+
strokeLinejoin="round"
|
|
110
|
+
/>
|
|
111
|
+
<path
|
|
112
|
+
d="M516.774 304.217C510.299 275.491 498.208 252.087 480.335 234.214C462.462 216.341 439.058 204.251 410.333 197.775C439.059 191.3 462.462 179.209 480.335 161.336C498.208 143.463 510.299 120.06 516.774 91.334C523.25 120.059 535.34 143.463 553.213 161.336C571.086 179.209 594.49 191.3 623.216 197.775C594.49 204.251 571.086 216.341 553.213 234.214C535.34 252.087 523.25 275.491 516.774 304.217Z"
|
|
113
|
+
fill="currentColor"
|
|
114
|
+
stroke="currentColor"
|
|
115
|
+
strokeWidth="8"
|
|
116
|
+
strokeLinejoin="round"
|
|
117
|
+
/>
|
|
118
|
+
<path
|
|
119
|
+
d="M857.5 508.116C763.259 497.644 710.903 445.288 700.432 351.047C689.961 445.288 637.605 497.644 543.364 508.116C637.605 518.587 689.961 570.943 700.432 665.184C710.903 570.943 763.259 518.587 857.5 508.116Z"
|
|
120
|
+
stroke="currentColor"
|
|
121
|
+
strokeWidth="20"
|
|
122
|
+
strokeLinejoin="round"
|
|
123
|
+
/>
|
|
124
|
+
<path
|
|
125
|
+
d="M700.432 615.957C691.848 589.05 678.575 566.357 660.383 548.165C642.191 529.973 619.499 516.7 592.593 508.116C619.499 499.533 642.191 486.258 660.383 468.066C678.575 449.874 691.848 427.181 700.432 400.274C709.015 427.181 722.289 449.874 740.481 468.066C758.673 486.258 781.365 499.533 808.271 508.116C781.365 516.7 758.673 529.973 740.481 548.165C722.289 566.357 709.015 589.05 700.432 615.957Z"
|
|
126
|
+
stroke="currentColor"
|
|
127
|
+
strokeWidth="20"
|
|
128
|
+
strokeLinejoin="round"
|
|
129
|
+
/>
|
|
130
|
+
<path
|
|
131
|
+
d="M889.949 121.237C831.049 114.692 798.326 81.9698 791.782 23.0692C785.237 81.9698 752.515 114.692 693.614 121.237C752.515 127.781 785.237 160.504 791.782 219.404C798.326 160.504 831.049 127.781 889.949 121.237Z"
|
|
132
|
+
fill="currentColor"
|
|
133
|
+
stroke="currentColor"
|
|
134
|
+
strokeWidth="8"
|
|
135
|
+
strokeLinejoin="round"
|
|
136
|
+
/>
|
|
137
|
+
<path
|
|
138
|
+
d="M791.782 196.795C786.697 176.937 777.869 160.567 765.16 147.858C752.452 135.15 736.082 126.322 716.226 121.237C736.082 116.152 752.452 107.324 765.16 94.6152C777.869 81.9065 786.697 65.5368 791.782 45.6797C796.867 65.5367 805.695 81.9066 818.403 94.6152C831.112 107.324 847.481 116.152 867.338 121.237C847.481 126.322 831.112 135.15 818.403 147.858C805.694 160.567 796.867 176.937 791.782 196.795Z"
|
|
139
|
+
fill="currentColor"
|
|
140
|
+
stroke="currentColor"
|
|
141
|
+
strokeWidth="8"
|
|
142
|
+
strokeLinejoin="round"
|
|
143
|
+
/>
|
|
144
|
+
<path
|
|
145
|
+
d="M760.632 764.337C720.719 814.616 669.835 855.1 611.872 882.692C553.91 910.285 490.404 924.255 426.213 923.533C362.022 922.812 298.846 907.419 241.518 878.531C184.19 849.643 134.228 808.026 95.4548 756.863C56.6815 705.7 30.1238 646.346 17.8129 583.343C5.50207 520.339 7.76433 455.354 24.4266 393.359C41.089 331.364 71.7099 274.001 113.947 225.658C156.184 177.315 208.919 139.273 268.117 114.442"
|
|
146
|
+
stroke="currentColor"
|
|
147
|
+
strokeWidth="30"
|
|
148
|
+
strokeLinecap="round"
|
|
149
|
+
strokeLinejoin="round"
|
|
150
|
+
/>
|
|
151
|
+
</svg>
|
|
152
|
+
),
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
title: 'Open in ChatGPT',
|
|
156
|
+
href: `https://chatgpt.com/?${new URLSearchParams({
|
|
157
|
+
hints: 'search',
|
|
158
|
+
q,
|
|
159
|
+
})}`,
|
|
160
|
+
icon: (
|
|
161
|
+
<svg
|
|
162
|
+
role="img"
|
|
163
|
+
viewBox="0 0 24 24"
|
|
164
|
+
fill="currentColor"
|
|
165
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
166
|
+
>
|
|
167
|
+
<title>OpenAI</title>
|
|
168
|
+
<path d="M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z" />
|
|
169
|
+
</svg>
|
|
170
|
+
),
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
title: 'Open in Claude',
|
|
174
|
+
href: `https://claude.ai/new?${new URLSearchParams({
|
|
175
|
+
q,
|
|
176
|
+
})}`,
|
|
177
|
+
icon: (
|
|
178
|
+
<svg
|
|
179
|
+
fill="currentColor"
|
|
180
|
+
role="img"
|
|
181
|
+
viewBox="0 0 24 24"
|
|
182
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
183
|
+
>
|
|
184
|
+
<title>Anthropic</title>
|
|
185
|
+
<path d="M17.3041 3.541h-3.6718l6.696 16.918H24Zm-10.6082 0L0 20.459h3.7442l1.3693-3.5527h7.0052l1.3693 3.5528h3.7442L10.5363 3.5409Zm-.3712 10.2232 2.2914-5.9456 2.2914 5.9456Z" />
|
|
186
|
+
</svg>
|
|
187
|
+
),
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
title: 'Open in T3 Chat',
|
|
191
|
+
href: `https://t3.chat/new?${new URLSearchParams({
|
|
192
|
+
q,
|
|
193
|
+
})}`,
|
|
194
|
+
icon: <MessageCircleIcon />,
|
|
195
|
+
},
|
|
196
|
+
];
|
|
197
|
+
}, [githubUrl, markdownUrl]);
|
|
198
|
+
|
|
199
|
+
return (
|
|
200
|
+
<Popover>
|
|
201
|
+
<PopoverTrigger
|
|
202
|
+
className={cn(
|
|
203
|
+
buttonVariants({
|
|
204
|
+
color: 'secondary',
|
|
205
|
+
size: 'sm',
|
|
206
|
+
className: 'gap-2',
|
|
207
|
+
}),
|
|
208
|
+
)}
|
|
209
|
+
>
|
|
210
|
+
Open
|
|
211
|
+
<ChevronDown className="size-3.5 text-fd-muted-foreground" />
|
|
212
|
+
</PopoverTrigger>
|
|
213
|
+
<PopoverContent className="flex flex-col">
|
|
214
|
+
{items.map((item) => (
|
|
215
|
+
<a
|
|
216
|
+
key={item.href}
|
|
217
|
+
href={item.href}
|
|
218
|
+
rel="noreferrer noopener"
|
|
219
|
+
target="_blank"
|
|
220
|
+
className="text-sm p-2 rounded-lg inline-flex items-center gap-2 hover:text-fd-accent-foreground hover:bg-fd-accent [&_svg]:size-4"
|
|
221
|
+
>
|
|
222
|
+
{item.icon}
|
|
223
|
+
{item.title}
|
|
224
|
+
<ExternalLinkIcon className="text-fd-muted-foreground size-3.5 ms-auto" />
|
|
225
|
+
</a>
|
|
226
|
+
))}
|
|
227
|
+
</PopoverContent>
|
|
228
|
+
</Popover>
|
|
229
|
+
);
|
|
230
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { twMerge as cn } from 'tailwind-merge';
|
|
@@ -5,6 +5,14 @@ const withMDX = createMDX();
|
|
|
5
5
|
/** @type {import('next').NextConfig} */
|
|
6
6
|
const config = {
|
|
7
7
|
reactStrictMode: true,
|
|
8
|
+
async rewrites() {
|
|
9
|
+
return [
|
|
10
|
+
{
|
|
11
|
+
source: '/docs/:path*.mdx',
|
|
12
|
+
destination: '/llms.mdx/docs/:path*',
|
|
13
|
+
},
|
|
14
|
+
];
|
|
15
|
+
},
|
|
8
16
|
};
|
|
9
17
|
|
|
10
18
|
export default withMDX(config);
|
|
@@ -15,12 +15,13 @@
|
|
|
15
15
|
"lucide-react": "^0.562.0",
|
|
16
16
|
"next": "16.1.1",
|
|
17
17
|
"react": "^19.2.3",
|
|
18
|
-
"react-dom": "^19.2.3"
|
|
18
|
+
"react-dom": "^19.2.3",
|
|
19
|
+
"tailwind-merge": "^3.4.0"
|
|
19
20
|
},
|
|
20
21
|
"devDependencies": {
|
|
21
22
|
"@tailwindcss/postcss": "^4.1.18",
|
|
22
23
|
"@types/mdx": "^2.0.13",
|
|
23
|
-
"@types/node": "^
|
|
24
|
+
"@types/node": "^25.0.3",
|
|
24
25
|
"@types/react": "^19.2.7",
|
|
25
26
|
"@types/react-dom": "^19.2.3",
|
|
26
27
|
"postcss": "^8.5.6",
|
|
@@ -19,9 +19,15 @@ export async function loader({ params }: Route.LoaderArgs) {
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
const clientLoader = browserCollections.docs.createClientLoader({
|
|
22
|
-
component(
|
|
22
|
+
component(
|
|
23
|
+
{ toc, frontmatter, default: Mdx },
|
|
24
|
+
// you can define props for the `<Content />` component
|
|
25
|
+
props: {
|
|
26
|
+
className?: string;
|
|
27
|
+
},
|
|
28
|
+
) {
|
|
23
29
|
return (
|
|
24
|
-
<DocsPage toc={toc}>
|
|
30
|
+
<DocsPage toc={toc} {...props}>
|
|
25
31
|
<title>{frontmatter.title}</title>
|
|
26
32
|
<meta name="description" content={frontmatter.description} />
|
|
27
33
|
<DocsTitle>{frontmatter.title}</DocsTitle>
|
|
@@ -9,27 +9,27 @@
|
|
|
9
9
|
"types:check": "react-router typegen && fumadocs-mdx && tsc --noEmit"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@react-router/node": "^7.
|
|
13
|
-
"@react-router/serve": "^7.
|
|
12
|
+
"@react-router/node": "^7.12.0",
|
|
13
|
+
"@react-router/serve": "^7.12.0",
|
|
14
14
|
"fumadocs-core": "workspace:*",
|
|
15
15
|
"fumadocs-mdx": "workspace:*",
|
|
16
16
|
"fumadocs-ui": "workspace:*",
|
|
17
17
|
"isbot": "^5.1.32",
|
|
18
18
|
"react": "^19.2.3",
|
|
19
19
|
"react-dom": "^19.2.3",
|
|
20
|
-
"react-router": "^7.
|
|
20
|
+
"react-router": "^7.12.0"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
|
-
"@react-router/dev": "^7.
|
|
23
|
+
"@react-router/dev": "^7.12.0",
|
|
24
24
|
"@tailwindcss/vite": "^4.1.18",
|
|
25
25
|
"@types/mdx": "^2.0.13",
|
|
26
|
-
"@types/node": "^
|
|
26
|
+
"@types/node": "^25.0.3",
|
|
27
27
|
"@types/react": "^19.2.7",
|
|
28
28
|
"@types/react-dom": "^19.2.3",
|
|
29
|
-
"react-router-devtools": "^6.0
|
|
29
|
+
"react-router-devtools": "^6.1.0",
|
|
30
30
|
"tailwindcss": "^4.1.18",
|
|
31
31
|
"typescript": "^5.9.3",
|
|
32
|
-
"vite": "^7.3.
|
|
32
|
+
"vite": "^7.3.1",
|
|
33
33
|
"vite-tsconfig-paths": "^6.0.3"
|
|
34
34
|
}
|
|
35
35
|
}
|
|
@@ -19,9 +19,15 @@ export async function loader({ params }: Route.LoaderArgs) {
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
const clientLoader = browserCollections.docs.createClientLoader({
|
|
22
|
-
component(
|
|
22
|
+
component(
|
|
23
|
+
{ toc, frontmatter, default: Mdx },
|
|
24
|
+
// you can define props for the `<Content />` component
|
|
25
|
+
props: {
|
|
26
|
+
className?: string;
|
|
27
|
+
},
|
|
28
|
+
) {
|
|
23
29
|
return (
|
|
24
|
-
<DocsPage toc={toc}>
|
|
30
|
+
<DocsPage toc={toc} {...props}>
|
|
25
31
|
<title>{frontmatter.title}</title>
|
|
26
32
|
<meta name="description" content={frontmatter.description} />
|
|
27
33
|
<DocsTitle>{frontmatter.title}</DocsTitle>
|
|
@@ -10,27 +10,27 @@
|
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@orama/orama": "^3.1.18",
|
|
13
|
-
"@react-router/node": "^7.
|
|
13
|
+
"@react-router/node": "^7.12.0",
|
|
14
14
|
"fumadocs-core": "workspace:*",
|
|
15
15
|
"fumadocs-mdx": "workspace:*",
|
|
16
16
|
"fumadocs-ui": "workspace:*",
|
|
17
17
|
"isbot": "^5.1.32",
|
|
18
18
|
"react": "^19.2.3",
|
|
19
19
|
"react-dom": "^19.2.3",
|
|
20
|
-
"react-router": "^7.
|
|
20
|
+
"react-router": "^7.12.0"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
|
-
"@react-router/dev": "^7.
|
|
23
|
+
"@react-router/dev": "^7.12.0",
|
|
24
24
|
"@tailwindcss/vite": "^4.1.18",
|
|
25
25
|
"@types/mdx": "^2.0.13",
|
|
26
|
-
"@types/node": "^
|
|
26
|
+
"@types/node": "^25.0.3",
|
|
27
27
|
"@types/react": "^19.2.7",
|
|
28
28
|
"@types/react-dom": "^19.2.3",
|
|
29
|
-
"react-router-devtools": "^6.0
|
|
29
|
+
"react-router-devtools": "^6.1.0",
|
|
30
30
|
"serve": "^14.2.5",
|
|
31
31
|
"tailwindcss": "^4.1.18",
|
|
32
32
|
"typescript": "^5.9.3",
|
|
33
|
-
"vite": "^7.3.
|
|
33
|
+
"vite": "^7.3.1",
|
|
34
34
|
"vite-tsconfig-paths": "^6.0.3"
|
|
35
35
|
}
|
|
36
36
|
}
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
"types:check": "fumadocs-mdx && tsc --noEmit"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@tanstack/react-router": "1.
|
|
14
|
-
"@tanstack/react-router-devtools": "1.
|
|
15
|
-
"@tanstack/react-start": "1.
|
|
13
|
+
"@tanstack/react-router": "1.146.2",
|
|
14
|
+
"@tanstack/react-router-devtools": "1.146.2",
|
|
15
|
+
"@tanstack/react-start": "1.146.2",
|
|
16
16
|
"fumadocs-core": "workspace:*",
|
|
17
17
|
"fumadocs-mdx": "workspace:*",
|
|
18
18
|
"fumadocs-ui": "workspace:*",
|
|
@@ -20,12 +20,12 @@
|
|
|
20
20
|
"react": "^19.2.3",
|
|
21
21
|
"react-dom": "^19.2.3",
|
|
22
22
|
"tailwind-merge": "^3.4.0",
|
|
23
|
-
"vite": "^7.3.
|
|
23
|
+
"vite": "^7.3.1"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@tailwindcss/vite": "^4.1.18",
|
|
27
27
|
"@types/mdx": "^2.0.13",
|
|
28
|
-
"@types/node": "^
|
|
28
|
+
"@types/node": "^25.0.3",
|
|
29
29
|
"@types/react": "^19.2.7",
|
|
30
30
|
"@types/react-dom": "^19.2.3",
|
|
31
31
|
"@vitejs/plugin-react": "^5.1.2",
|
|
@@ -11,23 +11,23 @@
|
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"@orama/orama": "^3.1.18",
|
|
14
|
-
"@tanstack/react-router": "1.
|
|
15
|
-
"@tanstack/react-router-devtools": "1.
|
|
16
|
-
"@tanstack/react-start": "1.
|
|
17
|
-
"@tanstack/start-static-server-functions": "1.
|
|
14
|
+
"@tanstack/react-router": "1.146.2",
|
|
15
|
+
"@tanstack/react-router-devtools": "1.146.2",
|
|
16
|
+
"@tanstack/react-start": "1.146.2",
|
|
17
|
+
"@tanstack/start-static-server-functions": "1.146.2",
|
|
18
18
|
"fumadocs-core": "workspace:*",
|
|
19
19
|
"fumadocs-mdx": "workspace:*",
|
|
20
20
|
"fumadocs-ui": "workspace:*",
|
|
21
|
-
"lucide-
|
|
21
|
+
"lucide-react": "^0.562.0",
|
|
22
22
|
"react": "^19.2.3",
|
|
23
23
|
"react-dom": "^19.2.3",
|
|
24
24
|
"tailwind-merge": "^3.4.0",
|
|
25
|
-
"vite": "^7.3.
|
|
25
|
+
"vite": "^7.3.1"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@tailwindcss/vite": "^4.1.18",
|
|
29
29
|
"@types/mdx": "^2.0.13",
|
|
30
|
-
"@types/node": "^
|
|
30
|
+
"@types/node": "^25.0.3",
|
|
31
31
|
"@types/react": "^19.2.7",
|
|
32
32
|
"@types/react-dom": "^19.2.3",
|
|
33
33
|
"@vitejs/plugin-react": "^5.1.2",
|
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
import { loader } from 'fumadocs-core/source';
|
|
2
|
-
import
|
|
2
|
+
import { lucideIconsPlugin } from 'fumadocs-core/source/lucide-icons';
|
|
3
3
|
import { docs } from 'fumadocs-mdx:collections/server';
|
|
4
4
|
|
|
5
5
|
export const source = loader({
|
|
6
6
|
source: docs.toFumadocsSource(),
|
|
7
7
|
baseUrl: '/docs',
|
|
8
|
-
|
|
9
|
-
if (!icon) {
|
|
10
|
-
return;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
if (icon in icons) return icons[icon as keyof typeof icons];
|
|
14
|
-
},
|
|
8
|
+
plugins: [lucideIconsPlugin()],
|
|
15
9
|
});
|
|
@@ -35,9 +35,15 @@ const loader = createServerFn({
|
|
|
35
35
|
});
|
|
36
36
|
|
|
37
37
|
const clientLoader = browserCollections.docs.createClientLoader({
|
|
38
|
-
component(
|
|
38
|
+
component(
|
|
39
|
+
{ toc, frontmatter, default: MDX },
|
|
40
|
+
// you can define props for the `<Content />` component
|
|
41
|
+
props: {
|
|
42
|
+
className?: string;
|
|
43
|
+
},
|
|
44
|
+
) {
|
|
39
45
|
return (
|
|
40
|
-
<DocsPage toc={toc}>
|
|
46
|
+
<DocsPage toc={toc} {...props}>
|
|
41
47
|
<DocsTitle>{frontmatter.title}</DocsTitle>
|
|
42
48
|
<DocsDescription>{frontmatter.description}</DocsDescription>
|
|
43
49
|
<DocsBody>
|
|
@@ -8,17 +8,19 @@ export const Route = createFileRoute('/')({
|
|
|
8
8
|
|
|
9
9
|
function Home() {
|
|
10
10
|
return (
|
|
11
|
-
<HomeLayout {...baseOptions()}
|
|
12
|
-
<
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
11
|
+
<HomeLayout {...baseOptions()}>
|
|
12
|
+
<div className="flex flex-col items-center justify-center text-center flex-1">
|
|
13
|
+
<h1 className="font-medium text-xl mb-4">Fumadocs on Tanstack Start.</h1>
|
|
14
|
+
<Link
|
|
15
|
+
to="/docs/$"
|
|
16
|
+
params={{
|
|
17
|
+
_splat: '',
|
|
18
|
+
}}
|
|
19
|
+
className="px-3 py-2 rounded-lg bg-fd-primary text-fd-primary-foreground font-medium text-sm mx-auto"
|
|
20
|
+
>
|
|
21
|
+
Open Docs
|
|
22
|
+
</Link>
|
|
23
|
+
</div>
|
|
22
24
|
</HomeLayout>
|
|
23
25
|
);
|
|
24
26
|
}
|
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
"types:check": "fumadocs-mdx && tsc --noEmit"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@fumadocs/ui": "workspace:*",
|
|
14
13
|
"fumadocs-core": "workspace:*",
|
|
15
14
|
"fumadocs-mdx": "workspace:*",
|
|
16
15
|
"fumadocs-ui": "workspace:*",
|
|
@@ -18,17 +17,17 @@
|
|
|
18
17
|
"react": "^19.2.3",
|
|
19
18
|
"react-dom": "^19.2.3",
|
|
20
19
|
"react-server-dom-webpack": "^19.2.3",
|
|
21
|
-
"waku": "1.0.0-alpha.
|
|
20
|
+
"waku": "1.0.0-alpha.1"
|
|
22
21
|
},
|
|
23
22
|
"devDependencies": {
|
|
24
23
|
"@tailwindcss/vite": "^4.1.18",
|
|
25
24
|
"@types/mdx": "^2.0.13",
|
|
26
|
-
"@types/node": "^
|
|
25
|
+
"@types/node": "^25.0.3",
|
|
27
26
|
"@types/react": "^19.2.7",
|
|
28
27
|
"@types/react-dom": "^19.2.3",
|
|
29
28
|
"tailwindcss": "^4.1.18",
|
|
30
29
|
"typescript": "^5.9.3",
|
|
31
|
-
"vite": "^7.3.
|
|
30
|
+
"vite": "^7.3.1",
|
|
32
31
|
"vite-tsconfig-paths": "^6.0.3"
|
|
33
32
|
}
|
|
34
33
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import { Provider } from '@/components/provider';
|
|
3
|
+
import '@/styles/globals.css';
|
|
4
|
+
|
|
5
|
+
export default async function RootElement({ children }: { children: ReactNode }) {
|
|
6
|
+
return (
|
|
7
|
+
<html lang="en" suppressHydrationWarning>
|
|
8
|
+
<head></head>
|
|
9
|
+
<body data-version="1.0">
|
|
10
|
+
<Provider>{children}</Provider>
|
|
11
|
+
</body>
|
|
12
|
+
</html>
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const getConfig = async () => {
|
|
17
|
+
return {
|
|
18
|
+
render: 'static',
|
|
19
|
+
} as const;
|
|
20
|
+
};
|
|
@@ -7,6 +7,11 @@ import type { UserConfig } from 'vite';
|
|
|
7
7
|
|
|
8
8
|
export default defineConfig({
|
|
9
9
|
vite: {
|
|
10
|
+
// we do this to avoid Vite from bundling React contexts and cause duplicated contexts conflicts.
|
|
11
|
+
optimizeDeps: {
|
|
12
|
+
exclude: ['fumadocs-ui', 'fumadocs-core'],
|
|
13
|
+
},
|
|
14
|
+
|
|
10
15
|
plugins: [tailwindcss(), mdx(MdxConfig), tsconfigPaths()],
|
|
11
16
|
} satisfies UserConfig as Config['vite'],
|
|
12
17
|
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants-CG8Fydtp.js","names":["files","result: Partial<T>","templates: TemplateInfo[]","corePkg","uiPkg","mdxPkg","radixPkg","basePkg","versionPkg.dependencies"],"sources":["../src/utils.ts","../../create-app-versions/package.json","../../core/package.json","../../ui/package.json","../../mdx/package.json","../../radix-ui/package.json","../../base-ui/package.json","../src/constants.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport path, { join } from 'node:path';\nimport { x } from 'tinyexec';\n\nexport async function writeFile(file: string, content: string) {\n await fs.mkdir(path.dirname(file), { recursive: true });\n await fs.writeFile(file, content);\n}\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.rmdir(join(cwd, '.git'), { recursive: true }).catch(() => null);\n\n return false;\n }\n}\n\nexport function pick<T extends object, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> {\n const result: Partial<T> = {};\n\n for (const key of keys) {\n if (key in obj) {\n result[key] = obj[key];\n }\n }\n\n return result as Pick<T, K>;\n}\n","","","","","","","import { fileURLToPath } from 'node:url';\nimport versionPkg from '../../create-app-versions/package.json';\nimport * as corePkg from '../../core/package.json';\nimport * as uiPkg from '../../ui/package.json';\nimport * as mdxPkg from '../../mdx/package.json';\nimport * as radixPkg from '../../radix-ui/package.json';\nimport * as basePkg from '../../base-ui/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 | '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',\n appDir: '',\n rootProviderPath: 'app/layout.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: 'waku',\n label: 'Waku: Fumadocs MDX',\n appDir: 'src',\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\nconst workspaces = [corePkg, uiPkg, mdxPkg, radixPkg, basePkg];\n\nexport const depVersions = versionPkg.dependencies;\n\nfor (const workspace of workspaces) {\n depVersions[workspace.name as keyof typeof depVersions] = workspace.version;\n}\n"],"mappings":"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"}
|