create-fumadocs-app 16.0.98 → 16.0.99

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { i as templates, n as isCI } from "./constants-Ca1-QYLK.js";
3
- import { n as getPackageManager, r as managers, t as create } from "./src-CPrOSG3X.js";
2
+ import { i as templates, n as isCI } from "./constants-B5zoDdbl.js";
3
+ import { n as getPackageManager, r as managers, t as create } from "./src-Bb4ZMd3E.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";
@@ -86,14 +86,14 @@ function pick(obj, keys) {
86
86
  //#endregion
87
87
  //#region ../create-app-versions/package.json
88
88
  var dependencies$4 = {
89
- "@biomejs/biome": "^2.4.12",
89
+ "@biomejs/biome": "^2.4.13",
90
90
  "@orama/core": "^1.2.19",
91
- "@takumi-rs/image-response": "^1.0.14",
91
+ "@takumi-rs/image-response": "^1.1.2",
92
92
  "eslint": "^10.2.1",
93
93
  "fumadocs-core": "workspace:*",
94
94
  "fumadocs-mdx": "workspace:*",
95
95
  "fumadocs-ui": "workspace:*",
96
- "oxlint": "^1.60.0",
96
+ "oxlint": "^1.61.0",
97
97
  "react": "^19.2.5"
98
98
  };
99
99
  //#endregion
@@ -120,7 +120,7 @@ var package_exports$3 = /* @__PURE__ */ __exportAll({
120
120
  version: () => version$3
121
121
  });
122
122
  var name$3 = "fumadocs-core";
123
- var version$3 = "16.8.2";
123
+ var version$3 = "16.8.3";
124
124
  var description$3 = "The React.js library for building a documentation website";
125
125
  var keywords$3 = ["Docs", "Fumadocs"];
126
126
  var homepage$3 = "https://fumadocs.dev";
@@ -235,7 +235,7 @@ var dependencies$3 = {
235
235
  var devDependencies$3 = {
236
236
  "@formatjs/intl-localematcher": "^0.8.3",
237
237
  "@mdx-js/mdx": "^3.1.1",
238
- "@mixedbread/sdk": "^0.61.0",
238
+ "@mixedbread/sdk": "^0.62.0",
239
239
  "@orama/core": "^1.2.19",
240
240
  "@oramacloud/client": "^2.1.4",
241
241
  "@shikijs/transformers": "^4.0.2",
@@ -248,22 +248,22 @@ var devDependencies$3 = {
248
248
  "@types/node": "25.6.0",
249
249
  "@types/react": "^19.2.14",
250
250
  "@types/react-dom": "^19.2.3",
251
- "algoliasearch": "5.50.2",
251
+ "algoliasearch": "5.51.0",
252
252
  "flexsearch": "^0.8.212",
253
253
  "image-size": "^2.0.2",
254
- "lucide-react": "^1.8.0",
254
+ "lucide-react": "^1.9.0",
255
255
  "negotiator": "^1.0.0",
256
256
  "next": "16.2.4",
257
257
  "npm-to-yarn": "^3.0.1",
258
258
  "path-to-regexp": "^8.4.2",
259
- "react-router": "^7.14.1",
259
+ "react-router": "^7.14.2",
260
260
  "remark-directive": "^4.0.0",
261
261
  "remark-mdx": "^3.1.1",
262
262
  "remove-markdown": "^0.6.3",
263
263
  "tsconfig": "workspace:*",
264
- "tsdown": "0.21.9",
264
+ "tsdown": "0.21.10",
265
265
  "typescript": "^6.0.3",
266
- "waku": "1.0.0-alpha.7",
266
+ "waku": "1.0.0-alpha.8",
267
267
  "zod": "^4.3.6"
268
268
  };
269
269
  var peerDependencies$3 = {
@@ -425,7 +425,7 @@ var dependencies$2 = {
425
425
  "zod": "^4.3.6"
426
426
  };
427
427
  var devDependencies$2 = {
428
- "@types/bun": "^1.3.12",
428
+ "@types/bun": "^1.3.13",
429
429
  "@types/js-yaml": "^4.0.9",
430
430
  "@types/mdast": "^4.0.4",
431
431
  "@types/mdx": "^2.0.13",
@@ -439,10 +439,10 @@ var devDependencies$2 = {
439
439
  "remark": "^15.0.1",
440
440
  "remark-directive": "^4.0.0",
441
441
  "remark-mdx": "^3.1.1",
442
- "rolldown": "1.0.0-rc.16",
442
+ "rolldown": "1.0.0-rc.17",
443
443
  "tsconfig": "workspace:*",
444
- "tsdown": "0.21.9",
445
- "vite": "^8.0.8",
444
+ "tsdown": "0.21.10",
445
+ "vite": "^8.0.10",
446
446
  "webpack": "^5.106.2"
447
447
  };
448
448
  var peerDependencies$2 = {
@@ -509,7 +509,7 @@ var package_exports$1 = /* @__PURE__ */ __exportAll({
509
509
  version: () => version$1
510
510
  });
511
511
  var name$1 = "fumadocs-ui";
512
- var version$1 = "16.8.2";
512
+ var version$1 = "16.8.3";
513
513
  var description$1 = "The Radix UI version of Fumadocs UI";
514
514
  var keywords$1 = ["Docs", "Fumadocs"];
515
515
  var homepage$1 = "https://fumadocs.dev";
@@ -594,6 +594,8 @@ var exports$1 = {
594
594
  "./layouts/shared/slots/language-select": "./dist/layouts/shared/slots/language-select.js",
595
595
  "./layouts/shared/slots/search-trigger": "./dist/layouts/shared/slots/search-trigger.js",
596
596
  "./layouts/shared/slots/theme-switch": "./dist/layouts/shared/slots/theme-switch.js",
597
+ "./legacy/layout": "./dist/legacy/layout.js",
598
+ "./legacy/sidebar": "./dist/legacy/sidebar.js",
597
599
  "./mdx": {
598
600
  "types": "./dist/mdx.d.ts",
599
601
  "node": "./dist/mdx.server.js",
@@ -614,14 +616,8 @@ var exports$1 = {
614
616
  "./components/image-zoom2.css": "./dist/components/image-zoom2.css",
615
617
  "./style.css": "./dist/style.css",
616
618
  "./css/*": "./css/*",
617
- "./utils/get-sidebar-tabs": {
618
- "types": "./dist/components/sidebar/tabs/index.d.ts",
619
- "import": "./dist/components/sidebar/tabs/index.js"
620
- },
621
- "./components/tabs.unstyled": {
622
- "types": "./dist/components/ui/tabs.d.ts",
623
- "import": "./dist/components/ui/tabs.js"
624
- }
619
+ "./utils/get-sidebar-tabs": "./dist/components/sidebar/tabs/index.js",
620
+ "./components/tabs.unstyled": "./dist/components/ui/tabs.js"
625
621
  };
626
622
  var publishConfig$1 = { "access": "public" };
627
623
  var scripts$1 = {
@@ -629,7 +625,7 @@ var scripts$1 = {
629
625
  "build:layout": "tsdown --config-loader unrun",
630
626
  "build:tailwind": "tailwindcss -i css/style.css -o ./dist/style.css",
631
627
  "clean": "rimraf dist",
632
- "dev": "concurrently \"tsdown --watch --clean false\" \"tailwindcss -i css/style.css -o ./dist/style.css -w\"",
628
+ "dev": "concurrently \"tsdown --watch --clean false --config-loader unrun\" \"tailwindcss -i css/style.css -o ./dist/style.css -w\"",
633
629
  "lint": "oxlint .",
634
630
  "types:check": "tsc --noEmit"
635
631
  };
@@ -646,7 +642,7 @@ var dependencies$1 = {
646
642
  "@radix-ui/react-slot": "^1.2.4",
647
643
  "@radix-ui/react-tabs": "^1.1.13",
648
644
  "class-variance-authority": "^0.7.1",
649
- "lucide-react": "^1.8.0",
645
+ "lucide-react": "^1.9.0",
650
646
  "motion": "^12.38.0",
651
647
  "next-themes": "^0.4.6",
652
648
  "react-remove-scroll": "^2.7.2",
@@ -658,8 +654,9 @@ var dependencies$1 = {
658
654
  };
659
655
  var devDependencies$1 = {
660
656
  "@fumadocs/cli": "workspace:*",
661
- "@tailwindcss/cli": "^4.2.2",
662
- "@tsdown/css": "^0.21.9",
657
+ "@tailwindcss/cli": "^4.2.4",
658
+ "@tailwindcss/oxide": "^4.2.4",
659
+ "@tsdown/css": "^0.21.10",
663
660
  "@types/hast": "^3.0.4",
664
661
  "@types/mdx": "^2.0.13",
665
662
  "@types/node": "^25.6.0",
@@ -668,9 +665,9 @@ var devDependencies$1 = {
668
665
  "fuma-cli": "^0.0.5",
669
666
  "fumadocs-core": "workspace:*",
670
667
  "react-medium-image-zoom": "^5.4.3",
671
- "tailwindcss": "^4.2.2",
668
+ "tailwindcss": "^4.2.4",
672
669
  "tsconfig": "workspace:*",
673
- "tsdown": "0.21.9",
670
+ "tsdown": "0.21.10",
674
671
  "unified": "^11.0.5"
675
672
  };
676
673
  var peerDependencies$1 = {
@@ -733,7 +730,7 @@ var package_exports = /* @__PURE__ */ __exportAll({
733
730
  version: () => version
734
731
  });
735
732
  var name = "@fumadocs/base-ui";
736
- var version = "16.8.2";
733
+ var version = "16.8.3";
737
734
  var description = "The Base UI version of Fumadocs UI";
738
735
  var keywords = ["Docs", "Fumadocs"];
739
736
  var homepage = "https://fumadocs.dev";
@@ -850,10 +847,10 @@ var scripts = {
850
847
  "types:check": "tsc --noEmit"
851
848
  };
852
849
  var dependencies = {
853
- "@base-ui/react": "^1.4.0",
850
+ "@base-ui/react": "^1.4.1",
854
851
  "@fumadocs/tailwind": "workspace:*",
855
852
  "class-variance-authority": "^0.7.1",
856
- "lucide-react": "^1.8.0",
853
+ "lucide-react": "^1.9.0",
857
854
  "motion": "^12.38.0",
858
855
  "next-themes": "^0.4.6",
859
856
  "react-remove-scroll": "^2.7.2",
@@ -865,8 +862,9 @@ var dependencies = {
865
862
  };
866
863
  var devDependencies = {
867
864
  "@fumadocs/cli": "workspace:*",
868
- "@tailwindcss/cli": "^4.2.2",
869
- "@tsdown/css": "^0.21.9",
865
+ "@tailwindcss/cli": "^4.2.4",
866
+ "@tailwindcss/oxide": "^4.2.4",
867
+ "@tsdown/css": "^0.21.10",
870
868
  "@types/hast": "^3.0.4",
871
869
  "@types/mdx": "^2.0.13",
872
870
  "@types/node": "^25.6.0",
@@ -875,9 +873,9 @@ var devDependencies = {
875
873
  "fuma-cli": "^0.0.5",
876
874
  "fumadocs-core": "workspace:*",
877
875
  "react-medium-image-zoom": "^5.4.3",
878
- "tailwindcss": "^4.2.2",
876
+ "tailwindcss": "^4.2.4",
879
877
  "tsconfig": "workspace:*",
880
- "tsdown": "0.21.9",
878
+ "tsdown": "0.21.10",
881
879
  "unified": "^11.0.5"
882
880
  };
883
881
  var peerDependencies = {
@@ -978,4 +976,4 @@ for (const workspace of workspaces) depVersions[workspace.name] = workspace.vers
978
976
  //#endregion
979
977
  export { copy as a, writeFile$1 as c, templates as i, isCI as n, pick as o, sourceDir as r, tryGitInit as s, depVersions as t };
980
978
 
981
- //# sourceMappingURL=constants-Ca1-QYLK.js.map
979
+ //# sourceMappingURL=constants-B5zoDdbl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants-Ca1-QYLK.js","names":["writeFile","corePkg","mdxPkg","radixPkg","basePkg","versionPkg.dependencies"],"sources":["../src/utils.ts","../../create-app-versions/package.json","../../core/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 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, 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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"}
1
+ {"version":3,"file":"constants-B5zoDdbl.js","names":["writeFile","corePkg","mdxPkg","radixPkg","basePkg","versionPkg.dependencies"],"sources":["../src/utils.ts","../../create-app-versions/package.json","../../core/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 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, 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":";;;;;;;;;;;;;;;;;AAIA,eAAsBA,YAAU,MAAc,SAAiB;AAC7D,OAAM,GAAG,MAAM,KAAK,QAAQ,KAAK,EAAE,EAAE,WAAW,MAAM,CAAC;AACvD,OAAM,GAAG,UAAU,MAAM,QAAQ;;AAGnC,eAAsB,KACpB,MACA,IACA,UAII,EAAE,EACS;CACf,MAAM,EAAE,UAAU,MAAM,GAAG,kBAAkB,MAAM,eAAe,SAAS;CAC3E,MAAM,QAAQ,MAAM,GAAG,KAAK,KAAK;AAEjC,KAAI,MAAM,aAAa,IAAI,UAAU,KAAK,EAAE;EAC1C,MAAM,QAAQ,MAAM,GAAG,QAAQ,KAAK;AAEpC,QAAM,QAAQ,IACZ,MAAM,KAAK,SAAS,KAAK,KAAK,KAAK,MAAM,KAAK,EAAE,KAAK,KAAK,IAAI,KAAK,EAAE,QAAQ,CAAC,CAC/E;;AAGH,KAAI,MAAM,QAAQ,IAAI,OAAO,KAAK,EAAE;AAClC,OAAK,OAAO,GAAG;AACf,QAAM,GAAG,MAAM,KAAK,QAAQ,GAAG,EAAE,EAAE,WAAW,MAAM,CAAC;AACrD,QAAM,GAAG,SAAS,MAAM,GAAG;;;AAI/B,eAAe,kBAAkB,KAAa;CAC5C,MAAM,EAAE,aAAa,MAAM,EAAE,OAAO,CAAC,aAAa,wBAAwB,EAAE,EAC1E,aAAa,EAAE,KAAK,EACrB,CAAC;AAEF,QAAO,aAAa;;AAGtB,eAAe,mBAAmB,KAAa;CAC7C,MAAM,EAAE,aAAa,MAAM,EAAE,OAAO,CAAC,UAAU,qBAAqB,EAAE,EACpE,aAAa,EAAE,KAAK,EACrB,CAAC;AAEF,QAAO,aAAa;;AAQtB,eAAsB,WAAW,KAA+B;CAC9D,MAAM,EAAE,aAAa,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC;AAClD,KAAI,aAAa,EAAG,QAAO;AAE3B,KAAI,MAAM,kBAAkB,IAAI,CAAE,QAAO;AAEzC,KAAI;AACF,QAAM,EAAE,OAAO,CAAC,OAAO,EAAE;GACvB,cAAc;GACd,aAAa,EAAE,KAAK;GACrB,CAAC;AAEF,MAAI,CAAE,MAAM,mBAAmB,IAAI,CACjC,OAAM,EAAE,OAAO;GAAC;GAAY;GAAM;GAAO,EAAE;GACzC,cAAc;GACd,aAAa,EACX,KACD;GACF,CAAC;AAGJ,QAAM,EAAE,OAAO,CAAC,OAAO,KAAK,EAAE;GAC5B,cAAc;GACd,aAAa,EACX,KACD;GACF,CAAC;AAEF,QAAM,EAAE,OAAO;GAAC;GAAU;GAAM;GAA0C,EAAE;GAC1E,cAAc;GACd,aAAa,EACX,KACD;GACF,CAAC;AACF,SAAO;SACD;AACN,QAAM,GAAG,GAAG,KAAK,KAAK,OAAO,EAAE;GAAE,WAAW;GAAM,OAAO;GAAM,CAAC;AAEhE,SAAO;;;AAIX,SAAgB,KAA0C,KAAQ,MAAuB;CACvF,MAAM,SAAqB,EAAE;AAE7B,MAAK,MAAM,OAAO,KAChB,KAAI,OAAO,IACT,QAAO,OAAO,IAAI;AAItB,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AMrGT,MAAa,YAAY,cAAc,IAAI,IAAI,OAAO,OAAO,KAAK,IAAI,CAAC,KAAK;AAE5E,MAAa,OAAO,QAAQ,QAAQ,IAAI,GAAG;AAwB3C,MAAa,YAA4B;CACvC;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,QAAQ;EACR,kBAAkB;EACnB;CACD;EACE,OAAO;EACP,OAAO;EACP,QAAQ;EACR,kBAAkB;EACnB;CACD;EACE,OAAO;EACP,OAAO;EACP,QAAQ;EACR,kBAAkB;EACnB;CACD;EACE,OAAO;EACP,OAAO;EACP,QAAQ;EACR,kBAAkB;EACnB;CACD;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,QAAQ;EACR,kBAAkB;EACnB;CACD;EACE,OAAO;EACP,OAAO;EACP,QAAQ;EACR,kBAAkB;EACnB;CACD;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,QAAQ;EACR,kBAAkB;EACnB;CACF;AAED,MAAM,aAAa;CAACC;CAASC;CAAQC;CAAUC;CAAQ;AAEvD,MAAa,cAAcC;AAE3B,KAAK,MAAM,aAAa,WACtB,aAAY,UAAU,QAAoC,UAAU"}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import { t as create } from "./src-CPrOSG3X.js";
1
+ import { t as create } from "./src-Bb4ZMd3E.js";
2
2
  export { create };
@@ -1 +1 @@
1
- {"version":3,"file":"ai.js","names":[],"sources":["../../src/plugins/ai.ts"],"sourcesContent":["import { TemplatePlugin, TemplatePluginContext } from '@/index';\nimport { createSourceFile } from '@/transform/shared';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { SyntaxKind } from 'ts-morph';\nimport { FumadocsComponentInstaller } from '@fumadocs/cli/registry/installer';\nimport { HttpRegistryConnector } from 'fuma-cli/registry/connector';\nimport { getDefaultConfig } from '@fumadocs/cli/config';\n\nexport function ai(provider: 'openrouter' | 'inkeep'): TemplatePlugin {\n return {\n async afterWrite() {\n const config = await getDefaultConfig(this.dest);\n const installer = new FumadocsComponentInstaller(\n new HttpRegistryConnector('https://fumadocs.dev/registry'),\n config,\n this.dest,\n );\n\n try {\n const deps = await installer.install(`ai/${provider}`).then((res) => res.deps());\n if (deps.hasRequired()) await deps.writeRequired();\n\n await addAIChat(this);\n await fs.writeFile(\n path.join(this.dest, '.env.local'),\n provider === 'openrouter' ? 'OPENROUTER_API_KEY=' : 'INKEEP_API_KEY=',\n );\n } catch (e) {\n console.error(e);\n }\n },\n };\n}\n\nasync function addAIChat({ template, appDir }: TemplatePluginContext) {\n let filePath: string;\n switch (template.value) {\n case '+next+fuma-docs-mdx':\n case '+next+fuma-docs-mdx+static':\n filePath = path.join(appDir, 'app/docs/layout.tsx');\n break;\n case 'waku':\n filePath = path.join(appDir, 'pages/docs/_layout.tsx');\n break;\n case 'react-router':\n case 'react-router-spa':\n filePath = path.join(appDir, 'routes/docs.tsx');\n break;\n case 'tanstack-start':\n case 'tanstack-start-spa':\n filePath = path.join(appDir, 'routes/docs/$.tsx');\n break;\n }\n\n const file = await createSourceFile(filePath);\n const elements = file.getDescendantsOfKind(SyntaxKind.JsxElement);\n const code = `<AISearch>\n <AISearchPanel />\n <AISearchTrigger\n position=\"float\"\n className={cn(\n buttonVariants({\n variant: 'secondary',\n className: 'text-fd-muted-foreground rounded-2xl',\n }),\n )}\n >\n <MessageCircleIcon className=\"size-4.5\" />\n Ask AI\n </AISearchTrigger>\n</AISearch>`;\n\n for (const element of elements) {\n const opening = element.getFirstChildByKind(SyntaxKind.JsxOpeningElement);\n if (opening?.getTagNameNode().getText() !== 'DocsLayout') continue;\n\n const prior = element\n .getJsxChildren()\n .map((child) => child.print().trim())\n .join('\\n');\n element.setBodyText(`${code}\\n\\n${prior}`);\n break;\n }\n\n file.addImportDeclarations([\n {\n moduleSpecifier: '@/components/ai/search',\n namedImports: ['AISearch', 'AISearchPanel', 'AISearchTrigger'],\n },\n {\n moduleSpecifier: 'lucide-react',\n namedImports: ['MessageCircleIcon'],\n },\n {\n moduleSpecifier: '@/lib/cn',\n namedImports: ['cn'],\n },\n {\n moduleSpecifier: 'fumadocs-ui/components/ui/button',\n namedImports: ['buttonVariants'],\n },\n ]);\n\n await file.save();\n}\n"],"mappings":";;;;;;;;AASA,SAAgB,GAAG,UAAmD;AACpE,QAAO,EACL,MAAM,aAAa;EACjB,MAAM,SAAS,MAAM,iBAAiB,KAAK,KAAK;EAChD,MAAM,YAAY,IAAI,2BACpB,IAAI,sBAAsB,gCAAgC,EAC1D,QACA,KAAK,KACN;AAED,MAAI;GACF,MAAM,OAAO,MAAM,UAAU,QAAQ,MAAM,WAAW,CAAC,MAAM,QAAQ,IAAI,MAAM,CAAC;AAChF,OAAI,KAAK,aAAa,CAAE,OAAM,KAAK,eAAe;AAElD,SAAM,UAAU,KAAK;AACrB,SAAM,GAAG,UACP,KAAK,KAAK,KAAK,MAAM,aAAa,EAClC,aAAa,eAAe,wBAAwB,kBACrD;WACM,GAAG;AACV,WAAQ,MAAM,EAAE;;IAGrB;;AAGH,eAAe,UAAU,EAAE,UAAU,UAAiC;CACpE,IAAI;AACJ,SAAQ,SAAS,OAAjB;EACE,KAAK;EACL,KAAK;AACH,cAAW,KAAK,KAAK,QAAQ,sBAAsB;AACnD;EACF,KAAK;AACH,cAAW,KAAK,KAAK,QAAQ,yBAAyB;AACtD;EACF,KAAK;EACL,KAAK;AACH,cAAW,KAAK,KAAK,QAAQ,kBAAkB;AAC/C;EACF,KAAK;EACL,KAAK;AACH,cAAW,KAAK,KAAK,QAAQ,oBAAoB;AACjD;;CAGJ,MAAM,OAAO,MAAM,iBAAiB,SAAS;CAC7C,MAAM,WAAW,KAAK,qBAAqB,WAAW,WAAW;CACjE,MAAM,OAAO;;;;;;;;;;;;;;;AAgBb,MAAK,MAAM,WAAW,UAAU;AAE9B,MADgB,QAAQ,oBAAoB,WAAW,kBAAkB,EAC5D,gBAAgB,CAAC,SAAS,KAAK,aAAc;EAE1D,MAAM,QAAQ,QACX,gBAAgB,CAChB,KAAK,UAAU,MAAM,OAAO,CAAC,MAAM,CAAC,CACpC,KAAK,KAAK;AACb,UAAQ,YAAY,GAAG,KAAK,MAAM,QAAQ;AAC1C;;AAGF,MAAK,sBAAsB;EACzB;GACE,iBAAiB;GACjB,cAAc;IAAC;IAAY;IAAiB;IAAkB;GAC/D;EACD;GACE,iBAAiB;GACjB,cAAc,CAAC,oBAAoB;GACpC;EACD;GACE,iBAAiB;GACjB,cAAc,CAAC,KAAK;GACrB;EACD;GACE,iBAAiB;GACjB,cAAc,CAAC,iBAAiB;GACjC;EACF,CAAC;AAEF,OAAM,KAAK,MAAM"}
1
+ {"version":3,"file":"ai.js","names":[],"sources":["../../src/plugins/ai.ts"],"sourcesContent":["import { TemplatePlugin, TemplatePluginContext } from '@/index';\nimport { createSourceFile } from '@/transform/shared';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { SyntaxKind } from 'ts-morph';\nimport { FumadocsComponentInstaller } from '@fumadocs/cli/registry/installer';\nimport { HttpRegistryConnector } from 'fuma-cli/registry/connector';\nimport { getDefaultConfig } from '@fumadocs/cli/config';\n\nexport function ai(provider: 'openrouter' | 'inkeep'): TemplatePlugin {\n return {\n async afterWrite() {\n const config = await getDefaultConfig(this.dest);\n const installer = new FumadocsComponentInstaller(\n new HttpRegistryConnector('https://fumadocs.dev/registry'),\n config,\n this.dest,\n );\n\n try {\n const deps = await installer.install(`ai/${provider}`).then((res) => res.deps());\n if (deps.hasRequired()) await deps.writeRequired();\n\n await addAIChat(this);\n await fs.writeFile(\n path.join(this.dest, '.env.local'),\n provider === 'openrouter' ? 'OPENROUTER_API_KEY=' : 'INKEEP_API_KEY=',\n );\n } catch (e) {\n console.error(e);\n }\n },\n };\n}\n\nasync function addAIChat({ template, appDir }: TemplatePluginContext) {\n let filePath: string;\n switch (template.value) {\n case '+next+fuma-docs-mdx':\n case '+next+fuma-docs-mdx+static':\n filePath = path.join(appDir, 'app/docs/layout.tsx');\n break;\n case 'waku':\n filePath = path.join(appDir, 'pages/docs/_layout.tsx');\n break;\n case 'react-router':\n case 'react-router-spa':\n filePath = path.join(appDir, 'routes/docs.tsx');\n break;\n case 'tanstack-start':\n case 'tanstack-start-spa':\n filePath = path.join(appDir, 'routes/docs/$.tsx');\n break;\n }\n\n const file = await createSourceFile(filePath);\n const elements = file.getDescendantsOfKind(SyntaxKind.JsxElement);\n const code = `<AISearch>\n <AISearchPanel />\n <AISearchTrigger\n position=\"float\"\n className={cn(\n buttonVariants({\n variant: 'secondary',\n className: 'text-fd-muted-foreground rounded-2xl',\n }),\n )}\n >\n <MessageCircleIcon className=\"size-4.5\" />\n Ask AI\n </AISearchTrigger>\n</AISearch>`;\n\n for (const element of elements) {\n const opening = element.getFirstChildByKind(SyntaxKind.JsxOpeningElement);\n if (opening?.getTagNameNode().getText() !== 'DocsLayout') continue;\n\n const prior = element\n .getJsxChildren()\n .map((child) => child.print().trim())\n .join('\\n');\n element.setBodyText(`${code}\\n\\n${prior}`);\n break;\n }\n\n file.addImportDeclarations([\n {\n moduleSpecifier: '@/components/ai/search',\n namedImports: ['AISearch', 'AISearchPanel', 'AISearchTrigger'],\n },\n {\n moduleSpecifier: 'lucide-react',\n namedImports: ['MessageCircleIcon'],\n },\n {\n moduleSpecifier: '@/lib/cn',\n namedImports: ['cn'],\n },\n {\n moduleSpecifier: 'fumadocs-ui/components/ui/button',\n namedImports: ['buttonVariants'],\n },\n ]);\n\n await file.save();\n}\n"],"mappings":";;;;;;;;AASA,SAAgB,GAAG,UAAmD;AACpE,QAAO,EACL,MAAM,aAAa;EACjB,MAAM,SAAS,MAAM,iBAAiB,KAAK,KAAK;EAChD,MAAM,YAAY,IAAI,2BACpB,IAAI,sBAAsB,gCAAgC,EAC1D,QACA,KAAK,KACN;AAED,MAAI;GACF,MAAM,OAAO,MAAM,UAAU,QAAQ,MAAM,WAAW,CAAC,MAAM,QAAQ,IAAI,MAAM,CAAC;AAChF,OAAI,KAAK,aAAa,CAAE,OAAM,KAAK,eAAe;AAElD,SAAM,UAAU,KAAK;AACrB,SAAM,GAAG,UACP,KAAK,KAAK,KAAK,MAAM,aAAa,EAClC,aAAa,eAAe,wBAAwB,kBACrD;WACM,GAAG;AACV,WAAQ,MAAM,EAAE;;IAGrB;;AAGH,eAAe,UAAU,EAAE,UAAU,UAAiC;CACpE,IAAI;AACJ,SAAQ,SAAS,OAAjB;EACE,KAAK;EACL,KAAK;AACH,cAAW,KAAK,KAAK,QAAQ,sBAAsB;AACnD;EACF,KAAK;AACH,cAAW,KAAK,KAAK,QAAQ,yBAAyB;AACtD;EACF,KAAK;EACL,KAAK;AACH,cAAW,KAAK,KAAK,QAAQ,kBAAkB;AAC/C;EACF,KAAK;EACL,KAAK;AACH,cAAW,KAAK,KAAK,QAAQ,oBAAoB;AACjD;;CAGJ,MAAM,OAAO,MAAM,iBAAiB,SAAS;CAC7C,MAAM,WAAW,KAAK,qBAAqB,WAAW,WAAW;CACjE,MAAM,OAAO;;;;;;;;;;;;;;;AAgBb,MAAK,MAAM,WAAW,UAAU;AAE9B,MADgB,QAAQ,oBAAoB,WAAW,kBAC5C,EAAE,gBAAgB,CAAC,SAAS,KAAK,aAAc;EAE1D,MAAM,QAAQ,QACX,gBAAgB,CAChB,KAAK,UAAU,MAAM,OAAO,CAAC,MAAM,CAAC,CACpC,KAAK,KAAK;AACb,UAAQ,YAAY,GAAG,KAAK,MAAM,QAAQ;AAC1C;;AAGF,MAAK,sBAAsB;EACzB;GACE,iBAAiB;GACjB,cAAc;IAAC;IAAY;IAAiB;IAAkB;GAC/D;EACD;GACE,iBAAiB;GACjB,cAAc,CAAC,oBAAoB;GACpC;EACD;GACE,iBAAiB;GACjB,cAAc,CAAC,KAAK;GACrB;EACD;GACE,iBAAiB;GACjB,cAAc,CAAC,iBAAiB;GACjC;EACF,CAAC;AAEF,OAAM,KAAK,MAAM"}
@@ -1,4 +1,4 @@
1
- import { c as writeFile, o as pick, t as depVersions } from "../constants-Ca1-QYLK.js";
1
+ import { c as writeFile, o as pick, t as depVersions } from "../constants-B5zoDdbl.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";
@@ -1,4 +1,4 @@
1
- import { c as writeFile, o as pick, t as depVersions } from "../constants-Ca1-QYLK.js";
1
+ import { c as writeFile, o as pick, t as depVersions } from "../constants-B5zoDdbl.js";
2
2
  import path from "node:path";
3
3
  //#region src/plugins/eslint.ts
4
4
  const config = `import { defineConfig, globalIgnores } from 'eslint/config';
@@ -1,4 +1,4 @@
1
- import { o as pick, t as depVersions } from "../constants-Ca1-QYLK.js";
1
+ import { o as pick, t as depVersions } from "../constants-B5zoDdbl.js";
2
2
  import { readFile, writeFile } from "node:fs/promises";
3
3
  import { join } from "node:path";
4
4
  //#region src/plugins/next-use-takumi.ts
@@ -1 +1 @@
1
- {"version":3,"file":"next-use-takumi.js","names":[],"sources":["../../src/plugins/next-use-takumi.ts"],"sourcesContent":["import { TemplatePlugin, TemplatePluginContext } from '@/index';\nimport { depVersions } from '@/constants';\nimport { pick } from '@/utils';\nimport { join } from 'node:path';\nimport { readFile, writeFile } from 'node:fs/promises';\n\nexport function nextUseTakumi(): TemplatePlugin {\n return {\n packageJson(packageJson) {\n if (this.template.value.startsWith('+next')) {\n return {\n ...packageJson,\n dependencies: {\n ...packageJson.dependencies,\n ...pick(depVersions, ['@takumi-rs/image-response']),\n },\n };\n }\n return packageJson;\n },\n async afterWrite() {\n if (this.template.value.startsWith('+next')) {\n await replaceImports(this);\n await replaceImagePath(this);\n await nextConfigExternal(this);\n }\n },\n };\n}\n\nasync function replaceImports(context: TemplatePluginContext) {\n const path = join(context.appDir, 'app/og/docs/[...slug]/route.tsx');\n const content = await readFile(path, 'utf-8');\n const replaced = content\n .replaceAll('next/og', '@takumi-rs/image-response')\n .replaceAll('fumadocs-ui/og', 'fumadocs-ui/og/takumi')\n .replace('height: 630,', \"height: 630,\\n format: 'webp',\");\n\n await writeFile(path, replaced);\n}\n\nasync function replaceImagePath(context: TemplatePluginContext) {\n const path = join(context.appDir, 'lib/source.ts');\n const content = await readFile(path, 'utf-8');\n const replaced = content.replaceAll('image.png', 'image.webp');\n\n await writeFile(path, replaced);\n}\n\nasync function nextConfigExternal(context: TemplatePluginContext) {\n const path = join(context.dest, 'next.config.mjs');\n const content = await readFile(path, 'utf-8');\n\n const replaced = content.replace(\n 'const config = {',\n `const config = {\n serverExternalPackages: ['@takumi-rs/image-response'],`,\n );\n\n await writeFile(path, replaced);\n}\n"],"mappings":";;;;AAMA,SAAgB,gBAAgC;AAC9C,QAAO;EACL,YAAY,aAAa;AACvB,OAAI,KAAK,SAAS,MAAM,WAAW,QAAQ,CACzC,QAAO;IACL,GAAG;IACH,cAAc;KACZ,GAAG,YAAY;KACf,GAAG,KAAK,aAAa,CAAC,4BAA4B,CAAC;KACpD;IACF;AAEH,UAAO;;EAET,MAAM,aAAa;AACjB,OAAI,KAAK,SAAS,MAAM,WAAW,QAAQ,EAAE;AAC3C,UAAM,eAAe,KAAK;AAC1B,UAAM,iBAAiB,KAAK;AAC5B,UAAM,mBAAmB,KAAK;;;EAGnC;;AAGH,eAAe,eAAe,SAAgC;CAC5D,MAAM,OAAO,KAAK,QAAQ,QAAQ,kCAAkC;AAOpE,OAAM,UAAU,OANA,MAAM,SAAS,MAAM,QAAQ,EAE1C,WAAW,WAAW,4BAA4B,CAClD,WAAW,kBAAkB,wBAAwB,CACrD,QAAQ,gBAAgB,sCAAsC,CAElC;;AAGjC,eAAe,iBAAiB,SAAgC;CAC9D,MAAM,OAAO,KAAK,QAAQ,QAAQ,gBAAgB;AAIlD,OAAM,UAAU,OAHA,MAAM,SAAS,MAAM,QAAQ,EACpB,WAAW,aAAa,aAAa,CAE/B;;AAGjC,eAAe,mBAAmB,SAAgC;CAChE,MAAM,OAAO,KAAK,QAAQ,MAAM,kBAAkB;AASlD,OAAM,UAAU,OARA,MAAM,SAAS,MAAM,QAAQ,EAEpB,QACvB,oBACA;0DAED,CAE8B"}
1
+ {"version":3,"file":"next-use-takumi.js","names":[],"sources":["../../src/plugins/next-use-takumi.ts"],"sourcesContent":["import { TemplatePlugin, TemplatePluginContext } from '@/index';\nimport { depVersions } from '@/constants';\nimport { pick } from '@/utils';\nimport { join } from 'node:path';\nimport { readFile, writeFile } from 'node:fs/promises';\n\nexport function nextUseTakumi(): TemplatePlugin {\n return {\n packageJson(packageJson) {\n if (this.template.value.startsWith('+next')) {\n return {\n ...packageJson,\n dependencies: {\n ...packageJson.dependencies,\n ...pick(depVersions, ['@takumi-rs/image-response']),\n },\n };\n }\n return packageJson;\n },\n async afterWrite() {\n if (this.template.value.startsWith('+next')) {\n await replaceImports(this);\n await replaceImagePath(this);\n await nextConfigExternal(this);\n }\n },\n };\n}\n\nasync function replaceImports(context: TemplatePluginContext) {\n const path = join(context.appDir, 'app/og/docs/[...slug]/route.tsx');\n const content = await readFile(path, 'utf-8');\n const replaced = content\n .replaceAll('next/og', '@takumi-rs/image-response')\n .replaceAll('fumadocs-ui/og', 'fumadocs-ui/og/takumi')\n .replace('height: 630,', \"height: 630,\\n format: 'webp',\");\n\n await writeFile(path, replaced);\n}\n\nasync function replaceImagePath(context: TemplatePluginContext) {\n const path = join(context.appDir, 'lib/source.ts');\n const content = await readFile(path, 'utf-8');\n const replaced = content.replaceAll('image.png', 'image.webp');\n\n await writeFile(path, replaced);\n}\n\nasync function nextConfigExternal(context: TemplatePluginContext) {\n const path = join(context.dest, 'next.config.mjs');\n const content = await readFile(path, 'utf-8');\n\n const replaced = content.replace(\n 'const config = {',\n `const config = {\n serverExternalPackages: ['@takumi-rs/image-response'],`,\n );\n\n await writeFile(path, replaced);\n}\n"],"mappings":";;;;AAMA,SAAgB,gBAAgC;AAC9C,QAAO;EACL,YAAY,aAAa;AACvB,OAAI,KAAK,SAAS,MAAM,WAAW,QAAQ,CACzC,QAAO;IACL,GAAG;IACH,cAAc;KACZ,GAAG,YAAY;KACf,GAAG,KAAK,aAAa,CAAC,4BAA4B,CAAC;KACpD;IACF;AAEH,UAAO;;EAET,MAAM,aAAa;AACjB,OAAI,KAAK,SAAS,MAAM,WAAW,QAAQ,EAAE;AAC3C,UAAM,eAAe,KAAK;AAC1B,UAAM,iBAAiB,KAAK;AAC5B,UAAM,mBAAmB,KAAK;;;EAGnC;;AAGH,eAAe,eAAe,SAAgC;CAC5D,MAAM,OAAO,KAAK,QAAQ,QAAQ,kCAAkC;AAOpE,OAAM,UAAU,OALC,MADK,SAAS,MAAM,QAAQ,EAE1C,WAAW,WAAW,4BAA4B,CAClD,WAAW,kBAAkB,wBAAwB,CACrD,QAAQ,gBAAgB,sCAEG,CAAC;;AAGjC,eAAe,iBAAiB,SAAgC;CAC9D,MAAM,OAAO,KAAK,QAAQ,QAAQ,gBAAgB;AAIlD,OAAM,UAAU,OAFC,MADK,SAAS,MAAM,QAAQ,EACpB,WAAW,aAAa,aAEnB,CAAC;;AAGjC,eAAe,mBAAmB,SAAgC;CAChE,MAAM,OAAO,KAAK,QAAQ,MAAM,kBAAkB;AASlD,OAAM,UAAU,OANC,MAFK,SAAS,MAAM,QAAQ,EAEpB,QACvB,oBACA;0DAI4B,CAAC"}
@@ -1,4 +1,4 @@
1
- import { a as copy, c as writeFile$1, o as pick, r as sourceDir, t as depVersions } from "../constants-Ca1-QYLK.js";
1
+ import { a as copy, c as writeFile$1, o as pick, r as sourceDir, t as depVersions } from "../constants-B5zoDdbl.js";
2
2
  import { n as getCodeValue, t as createSourceFile } from "../shared-DUVwToe1.js";
3
3
  import fs from "node:fs/promises";
4
4
  import path from "node:path";
@@ -1,4 +1,4 @@
1
- import { o as pick, t as depVersions } from "../constants-Ca1-QYLK.js";
1
+ import { o as pick, t as depVersions } from "../constants-B5zoDdbl.js";
2
2
  import { writeFile } from "node:fs/promises";
3
3
  import path from "node:path";
4
4
  //#region src/plugins/oxlint.ts
@@ -1,4 +1,4 @@
1
- import { a as copy, i as templates, r as sourceDir, s as tryGitInit, t as depVersions } from "./constants-Ca1-QYLK.js";
1
+ import { a as copy, i as templates, r as sourceDir, s as tryGitInit, t as depVersions } from "./constants-B5zoDdbl.js";
2
2
  import fs from "node:fs/promises";
3
3
  import path from "node:path";
4
4
  import { x } from "tinyexec";
@@ -84,4 +84,4 @@ async function initPackageJson(projectName, packageJsonPath) {
84
84
  //#endregion
85
85
  export { getPackageManager as n, managers as r, create as t };
86
86
 
87
- //# sourceMappingURL=src-CPrOSG3X.js.map
87
+ //# sourceMappingURL=src-Bb4ZMd3E.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"src-CPrOSG3X.js","names":[],"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, 'utf-8'));\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,MAAM,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,MAAM,cAA+B,KAAK,MAAM,MAAM,GAAG,SAAS,iBAAiB,QAAQ,CAAC;AAE5F,QAAO;EACL,GAAG;EACH,MAAM;EACN,SAAS;GACP,GAAG,YAAY;GACf,aAAa;GACd;EACD,cAAc,qBAAqB,YAAY,aAAa;EAC5D,iBAAiB,qBAAqB,YAAY,gBAAgB;EACnE"}
1
+ {"version":3,"file":"src-Bb4ZMd3E.js","names":[],"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, 'utf-8'));\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,MAAM,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,MAAM,cAA+B,KAAK,MAAM,MAAM,GAAG,SAAS,iBAAiB,QAAQ,CAAC;AAE5F,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.98",
3
+ "version": "16.0.99",
4
4
  "description": "Create a new documentation site with Fumadocs",
5
5
  "keywords": [
6
6
  "Docs",
@@ -46,7 +46,7 @@
46
46
  "@types/cross-spawn": "^6.0.6",
47
47
  "@types/node": "25.6.0",
48
48
  "tinyglobby": "^0.2.16",
49
- "tsdown": "0.21.9",
49
+ "tsdown": "0.21.10",
50
50
  "typescript": "^6.0.3",
51
51
  "tsconfig": "0.0.0"
52
52
  },
@@ -12,20 +12,20 @@
12
12
  "fumadocs-core": "workspace:*",
13
13
  "fumadocs-mdx": "workspace:*",
14
14
  "fumadocs-ui": "workspace:*",
15
- "lucide-react": "^1.8.0",
15
+ "lucide-react": "^1.9.0",
16
16
  "next": "16.2.4",
17
17
  "react": "^19.2.5",
18
18
  "react-dom": "^19.2.5",
19
19
  "tailwind-merge": "^3.5.0"
20
20
  },
21
21
  "devDependencies": {
22
- "@tailwindcss/postcss": "^4.2.2",
22
+ "@tailwindcss/postcss": "^4.2.4",
23
23
  "@types/mdx": "^2.0.13",
24
24
  "@types/node": "^25.6.0",
25
25
  "@types/react": "^19.2.14",
26
26
  "@types/react-dom": "^19.2.3",
27
27
  "postcss": "^8.5.10",
28
- "tailwindcss": "^4.2.2",
28
+ "tailwindcss": "^4.2.4",
29
29
  "typescript": "^6.0.3"
30
30
  }
31
31
  }
@@ -13,21 +13,21 @@
13
13
  "fumadocs-core": "workspace:*",
14
14
  "fumadocs-mdx": "workspace:*",
15
15
  "fumadocs-ui": "workspace:*",
16
- "lucide-react": "^1.8.0",
16
+ "lucide-react": "^1.9.0",
17
17
  "next": "16.2.4",
18
18
  "react": "^19.2.5",
19
19
  "react-dom": "^19.2.5",
20
20
  "tailwind-merge": "^3.5.0"
21
21
  },
22
22
  "devDependencies": {
23
- "@tailwindcss/postcss": "^4.2.2",
23
+ "@tailwindcss/postcss": "^4.2.4",
24
24
  "@types/mdx": "^2.0.13",
25
25
  "@types/node": "^25.6.0",
26
26
  "@types/react": "^19.2.14",
27
27
  "@types/react-dom": "^19.2.3",
28
28
  "postcss": "^8.5.10",
29
29
  "serve": "^14.2.6",
30
- "tailwindcss": "^4.2.2",
30
+ "tailwindcss": "^4.2.4",
31
31
  "typescript": "^6.0.3"
32
32
  }
33
33
  }
@@ -9,29 +9,29 @@
9
9
  "types:check": "react-router typegen && fumadocs-mdx && tsc --noEmit"
10
10
  },
11
11
  "dependencies": {
12
- "@react-router/node": "^7.14.1",
13
- "@react-router/serve": "^7.14.1",
14
- "@takumi-rs/image-response": "^1.0.14",
12
+ "@react-router/node": "^7.14.2",
13
+ "@react-router/serve": "^7.14.2",
14
+ "@takumi-rs/image-response": "^1.1.2",
15
15
  "fumadocs-core": "workspace:*",
16
16
  "fumadocs-mdx": "workspace:*",
17
17
  "fumadocs-ui": "workspace:*",
18
18
  "isbot": "^5.1.39",
19
- "lucide-react": "^1.8.0",
19
+ "lucide-react": "^1.9.0",
20
20
  "react": "^19.2.5",
21
21
  "react-dom": "^19.2.5",
22
- "react-router": "^7.14.1",
22
+ "react-router": "^7.14.2",
23
23
  "tailwind-merge": "^3.5.0"
24
24
  },
25
25
  "devDependencies": {
26
- "@react-router/dev": "^7.14.1",
27
- "@tailwindcss/vite": "^4.2.2",
26
+ "@react-router/dev": "^7.14.2",
27
+ "@tailwindcss/vite": "^4.2.4",
28
28
  "@types/mdx": "^2.0.13",
29
29
  "@types/node": "^25.6.0",
30
30
  "@types/react": "^19.2.14",
31
31
  "@types/react-dom": "^19.2.3",
32
32
  "react-router-devtools": "^6.2.0",
33
- "tailwindcss": "^4.2.2",
33
+ "tailwindcss": "^4.2.4",
34
34
  "typescript": "^6.0.3",
35
- "vite": "^8.0.8"
35
+ "vite": "^8.0.10"
36
36
  }
37
37
  }
@@ -10,28 +10,28 @@
10
10
  },
11
11
  "dependencies": {
12
12
  "@orama/orama": "^3.1.18",
13
- "@react-router/node": "^7.14.1",
13
+ "@react-router/node": "^7.14.2",
14
14
  "fumadocs-core": "workspace:*",
15
15
  "fumadocs-mdx": "workspace:*",
16
16
  "fumadocs-ui": "workspace:*",
17
17
  "isbot": "^5.1.39",
18
- "lucide-react": "^1.8.0",
18
+ "lucide-react": "^1.9.0",
19
19
  "react": "^19.2.5",
20
20
  "react-dom": "^19.2.5",
21
- "react-router": "^7.14.1",
21
+ "react-router": "^7.14.2",
22
22
  "tailwind-merge": "^3.5.0"
23
23
  },
24
24
  "devDependencies": {
25
- "@react-router/dev": "^7.14.1",
26
- "@tailwindcss/vite": "^4.2.2",
25
+ "@react-router/dev": "^7.14.2",
26
+ "@tailwindcss/vite": "^4.2.4",
27
27
  "@types/mdx": "^2.0.13",
28
28
  "@types/node": "^25.6.0",
29
29
  "@types/react": "^19.2.14",
30
30
  "@types/react-dom": "^19.2.3",
31
31
  "react-router-devtools": "^6.2.0",
32
32
  "serve": "^14.2.6",
33
- "tailwindcss": "^4.2.2",
33
+ "tailwindcss": "^4.2.4",
34
34
  "typescript": "^6.0.3",
35
- "vite": "^8.0.8"
35
+ "vite": "^8.0.10"
36
36
  }
37
37
  }
@@ -17,21 +17,21 @@
17
17
  "fumadocs-core": "workspace:*",
18
18
  "fumadocs-mdx": "workspace:*",
19
19
  "fumadocs-ui": "workspace:*",
20
- "lucide-react": "^1.8.0",
20
+ "lucide-react": "^1.9.0",
21
21
  "react": "^19.2.5",
22
22
  "react-dom": "^19.2.5",
23
23
  "tailwind-merge": "^3.5.0",
24
- "vite": "^8.0.8"
24
+ "vite": "^8.0.10"
25
25
  },
26
26
  "devDependencies": {
27
- "@tailwindcss/vite": "^4.2.2",
27
+ "@tailwindcss/vite": "^4.2.4",
28
28
  "@types/mdx": "^2.0.13",
29
29
  "@types/node": "^25.6.0",
30
30
  "@types/react": "^19.2.14",
31
31
  "@types/react-dom": "^19.2.3",
32
32
  "@vitejs/plugin-react": "^6.0.1",
33
33
  "nitro": "3.0.260415-beta",
34
- "tailwindcss": "^4.2.2",
34
+ "tailwindcss": "^4.2.4",
35
35
  "typescript": "^6.0.3"
36
36
  }
37
37
  }
@@ -19,14 +19,14 @@
19
19
  "fumadocs-core": "workspace:*",
20
20
  "fumadocs-mdx": "workspace:*",
21
21
  "fumadocs-ui": "workspace:*",
22
- "lucide-react": "^1.8.0",
22
+ "lucide-react": "^1.9.0",
23
23
  "react": "^19.2.5",
24
24
  "react-dom": "^19.2.5",
25
25
  "tailwind-merge": "^3.5.0",
26
- "vite": "^8.0.8"
26
+ "vite": "^8.0.10"
27
27
  },
28
28
  "devDependencies": {
29
- "@tailwindcss/vite": "^4.2.2",
29
+ "@tailwindcss/vite": "^4.2.4",
30
30
  "@types/mdx": "^2.0.13",
31
31
  "@types/node": "^25.6.0",
32
32
  "@types/react": "^19.2.14",
@@ -35,7 +35,7 @@
35
35
  "nitro": "3.0.260415-beta",
36
36
  "serve": "^14.2.6",
37
37
  "srvx": "^0.11.15",
38
- "tailwindcss": "^4.2.2",
38
+ "tailwindcss": "^4.2.4",
39
39
  "typescript": "^6.0.3"
40
40
  }
41
41
  }
@@ -10,25 +10,25 @@
10
10
  "types:check": "fumadocs-mdx && tsc --noEmit"
11
11
  },
12
12
  "dependencies": {
13
- "@takumi-rs/image-response": "^1.0.14",
13
+ "@takumi-rs/image-response": "^1.1.2",
14
14
  "fumadocs-core": "workspace:*",
15
15
  "fumadocs-mdx": "workspace:*",
16
16
  "fumadocs-ui": "workspace:*",
17
- "lucide-react": "^1.8.0",
17
+ "lucide-react": "^1.9.0",
18
18
  "react": "^19.2.5",
19
19
  "react-dom": "^19.2.5",
20
20
  "react-server-dom-webpack": "^19.2.5",
21
21
  "tailwind-merge": "^3.5.0",
22
- "waku": "1.0.0-alpha.7"
22
+ "waku": "1.0.0-alpha.8"
23
23
  },
24
24
  "devDependencies": {
25
- "@tailwindcss/vite": "^4.2.2",
25
+ "@tailwindcss/vite": "^4.2.4",
26
26
  "@types/mdx": "^2.0.13",
27
27
  "@types/node": "^25.6.0",
28
28
  "@types/react": "^19.2.14",
29
29
  "@types/react-dom": "^19.2.3",
30
- "tailwindcss": "^4.2.2",
30
+ "tailwindcss": "^4.2.4",
31
31
  "typescript": "^6.0.3",
32
- "vite": "^8.0.8"
32
+ "vite": "^8.0.10"
33
33
  }
34
34
  }