create-fumadocs-app 16.0.1 → 16.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-3VWJJEHU.js +204 -0
- package/dist/chunk-HLHY7KAF.js +181 -0
- package/dist/create-app.d.ts +23 -8
- package/dist/create-app.js +4 -5
- package/dist/index.js +33 -31
- package/dist/orama-cloud-VQUOOEZ2.js +313 -0
- package/package.json +5 -3
- package/template/+next+fuma-docs-mdx/app/(home)/page.tsx +16 -0
- package/template/{+next+tailwindcss → +next+fuma-docs-mdx}/app/layout.tsx +1 -1
- package/template/{+next → +next+fuma-docs-mdx}/example.gitignore +0 -2
- package/template/+next+fuma-docs-mdx/lib/layout.shared.tsx +9 -0
- package/template/+next+fuma-docs-mdx/lib/source.ts +1 -1
- package/template/{+next → +next+fuma-docs-mdx}/mdx-components.tsx +0 -1
- package/template/+next+fuma-docs-mdx/package.json +29 -0
- package/template/+next+fuma-docs-mdx/source.config.ts +1 -0
- package/template/+next+fuma-docs-mdx/tsconfig.json +2 -2
- package/template/+orama-cloud/@app/components/search.tsx +59 -0
- package/template/+orama-cloud/@app/lib/export-static-indexes.ts +14 -0
- package/template/+orama-cloud/@root/.env.example +6 -0
- package/template/react-router/app/docs/page.tsx +4 -4
- package/template/react-router/example.gitignore +0 -1
- package/template/react-router/react-router.config.ts +3 -3
- package/template/react-router-spa/README.md +12 -0
- package/template/react-router-spa/app/app.css +3 -0
- package/template/react-router-spa/app/components/search.tsx +50 -0
- package/template/react-router-spa/app/docs/page.tsx +53 -0
- package/template/react-router-spa/app/docs/search.ts +10 -0
- package/template/react-router-spa/app/lib/layout.shared.tsx +9 -0
- package/template/react-router-spa/app/lib/source.ts +7 -0
- package/template/react-router-spa/app/root.tsx +76 -0
- package/template/react-router-spa/app/routes/home.tsx +30 -0
- package/template/react-router-spa/app/routes.ts +7 -0
- package/template/react-router-spa/content/docs/index.mdx +32 -0
- package/template/react-router-spa/content/docs/test.mdx +24 -0
- package/template/react-router-spa/example.gitignore +7 -0
- package/template/react-router-spa/package.json +36 -0
- package/template/react-router-spa/public/favicon.ico +0 -0
- package/template/react-router-spa/react-router.config.ts +23 -0
- package/template/react-router-spa/serve.json +3 -0
- package/template/react-router-spa/source.config.ts +7 -0
- package/template/react-router-spa/tsconfig.json +28 -0
- package/template/react-router-spa/vite.config.ts +10 -0
- package/template/tanstack-start/example.gitignore +9 -1
- package/template/tanstack-start/package.json +6 -6
- package/template/waku/example.gitignore +3 -1
- package/template/waku/package.json +3 -3
- package/dist/chunk-YVEWA65C.js +0 -370
- package/template/+next/README.md +0 -37
- package/template/+next/app/(home)/page.tsx +0 -42
- package/template/+next/app/layout.tsx +0 -23
- package/template/+next/lib/layout.shared.tsx +0 -30
- package/template/+next+content-collections/app/docs/[[...slug]]/page.tsx +0 -51
- package/template/+next+content-collections/content-collections.ts +0 -26
- package/template/+next+content-collections/lib/source.ts +0 -8
- package/template/+next+content-collections/next.config.mjs +0 -8
- package/template/+next+content-collections/tsconfig.json +0 -35
- package/template/+next+tailwindcss/app/(home)/page.tsx +0 -19
- package/template/{+next → +next+fuma-docs-mdx}/app/(home)/layout.tsx +0 -0
- package/template/{+next → +next+fuma-docs-mdx}/app/api/search/route.ts +0 -0
- package/template/{+next → +next+fuma-docs-mdx}/app/docs/layout.tsx +1 -1
- /package/template/{+next+tailwindcss → +next+fuma-docs-mdx}/app/global.css +0 -0
- /package/template/{+next → +next+fuma-docs-mdx}/content/docs/index.mdx +0 -0
- /package/template/{+next → +next+fuma-docs-mdx}/content/docs/test.mdx +0 -0
- /package/template/{+next+tailwindcss → +next+fuma-docs-mdx}/postcss.config.mjs +0 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import {
|
|
2
|
+
copy,
|
|
3
|
+
cwd,
|
|
4
|
+
depVersions,
|
|
5
|
+
pick,
|
|
6
|
+
sourceDir,
|
|
7
|
+
templates,
|
|
8
|
+
tryGitInit
|
|
9
|
+
} from "./chunk-HLHY7KAF.js";
|
|
10
|
+
|
|
11
|
+
// src/create-app.ts
|
|
12
|
+
import path from "path";
|
|
13
|
+
import fs from "fs/promises";
|
|
14
|
+
|
|
15
|
+
// src/auto-install.ts
|
|
16
|
+
import { x } from "tinyexec";
|
|
17
|
+
var managers = ["npm", "yarn", "bun", "pnpm"];
|
|
18
|
+
function getPackageManager() {
|
|
19
|
+
const userAgent = process.env.npm_config_user_agent ?? "";
|
|
20
|
+
if (userAgent.startsWith("yarn")) {
|
|
21
|
+
return "yarn";
|
|
22
|
+
}
|
|
23
|
+
if (userAgent.startsWith("pnpm")) {
|
|
24
|
+
return "pnpm";
|
|
25
|
+
}
|
|
26
|
+
if (userAgent.startsWith("bun")) {
|
|
27
|
+
return "bun";
|
|
28
|
+
}
|
|
29
|
+
return "npm";
|
|
30
|
+
}
|
|
31
|
+
async function autoInstall(manager, dest) {
|
|
32
|
+
await x(manager, ["install"], {
|
|
33
|
+
throwOnError: true,
|
|
34
|
+
nodeOptions: {
|
|
35
|
+
env: {
|
|
36
|
+
...process.env,
|
|
37
|
+
NODE_ENV: "development",
|
|
38
|
+
DISABLE_OPENCOLLECTIVE: "1"
|
|
39
|
+
},
|
|
40
|
+
cwd: dest
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// src/create-app.ts
|
|
46
|
+
function defaults(options) {
|
|
47
|
+
return {
|
|
48
|
+
...options,
|
|
49
|
+
plugins: options.plugins ?? [],
|
|
50
|
+
useSrcDir: options.template.startsWith("+next") && options.useSrcDir === true,
|
|
51
|
+
lint: options.lint ?? false,
|
|
52
|
+
initializeGit: options.initializeGit ?? false,
|
|
53
|
+
installDeps: options.installDeps ?? false,
|
|
54
|
+
log: console.log
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function isRelative(dir, file) {
|
|
58
|
+
return !path.relative(dir, file).startsWith(`..${path.sep}`);
|
|
59
|
+
}
|
|
60
|
+
async function create(createOptions) {
|
|
61
|
+
const options = defaults(createOptions);
|
|
62
|
+
const {
|
|
63
|
+
outputDir,
|
|
64
|
+
useSrcDir,
|
|
65
|
+
log,
|
|
66
|
+
installDeps,
|
|
67
|
+
template,
|
|
68
|
+
lint,
|
|
69
|
+
initializeGit,
|
|
70
|
+
packageManager,
|
|
71
|
+
plugins
|
|
72
|
+
} = options;
|
|
73
|
+
const projectName = path.basename(outputDir);
|
|
74
|
+
const dest = path.resolve(cwd, outputDir);
|
|
75
|
+
const isNext = options.template.startsWith("+next");
|
|
76
|
+
const pluginContext = {
|
|
77
|
+
template: templates.find((item) => item.value === template),
|
|
78
|
+
dest,
|
|
79
|
+
options
|
|
80
|
+
};
|
|
81
|
+
await copy(path.join(sourceDir, `template/${template}`), dest, {
|
|
82
|
+
rename(file) {
|
|
83
|
+
file = file.replace("example.gitignore", ".gitignore");
|
|
84
|
+
if (useSrcDir && (path.basename(file) === "mdx-components.tsx" || isRelative(path.join(dest, "app"), file) || isRelative(path.join(dest, "lib"), file))) {
|
|
85
|
+
return path.join(dest, "src", path.relative(dest, file));
|
|
86
|
+
}
|
|
87
|
+
return file;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
if (isNext && lint) {
|
|
91
|
+
await copy(path.join(sourceDir, `template/+next+${lint}`), dest);
|
|
92
|
+
log("Configured Linter");
|
|
93
|
+
}
|
|
94
|
+
if (isNext && useSrcDir) {
|
|
95
|
+
const tsconfigPath = path.join(dest, "tsconfig.json");
|
|
96
|
+
const content = (await fs.readFile(tsconfigPath)).toString();
|
|
97
|
+
const config = JSON.parse(content);
|
|
98
|
+
if (config.compilerOptions?.paths) {
|
|
99
|
+
Object.assign(config.compilerOptions.paths, {
|
|
100
|
+
"@/*": ["./src/*"]
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
await fs.writeFile(tsconfigPath, JSON.stringify(config, null, 2));
|
|
104
|
+
}
|
|
105
|
+
let packageJson = await createPackageJson(projectName, dest, options);
|
|
106
|
+
for (const plugin of plugins) {
|
|
107
|
+
const result = await plugin.packageJson?.call(pluginContext, packageJson);
|
|
108
|
+
if (result) packageJson = result;
|
|
109
|
+
}
|
|
110
|
+
await fs.writeFile(
|
|
111
|
+
path.join(dest, "package.json"),
|
|
112
|
+
JSON.stringify(packageJson, null, 2)
|
|
113
|
+
);
|
|
114
|
+
let readme = await getReadme(dest, projectName);
|
|
115
|
+
for (const plugin of plugins) {
|
|
116
|
+
readme = await plugin.readme?.call(pluginContext, readme) ?? readme;
|
|
117
|
+
}
|
|
118
|
+
await fs.writeFile(path.join(dest, "README.md"), readme);
|
|
119
|
+
for (const plugin of plugins) {
|
|
120
|
+
await plugin.afterWrite?.call(pluginContext);
|
|
121
|
+
}
|
|
122
|
+
if (installDeps) {
|
|
123
|
+
try {
|
|
124
|
+
await autoInstall(packageManager, dest);
|
|
125
|
+
log("Installed dependencies");
|
|
126
|
+
} catch (err) {
|
|
127
|
+
log(`Failed to install dependencies: ${err}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (initializeGit && await tryGitInit(dest)) {
|
|
131
|
+
log("Initialized Git repository");
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async function getReadme(dest, projectName) {
|
|
135
|
+
const template = await fs.readFile(path.join(dest, "README.md")).then((res) => res.toString());
|
|
136
|
+
return `# ${projectName}
|
|
137
|
+
|
|
138
|
+
${template}`;
|
|
139
|
+
}
|
|
140
|
+
async function createPackageJson(projectName, dir, { template, lint }) {
|
|
141
|
+
const isNext = template.startsWith("+next");
|
|
142
|
+
function replaceWorkspaceDeps(deps) {
|
|
143
|
+
for (const k in deps) {
|
|
144
|
+
if (deps[k].startsWith("workspace:") && k in depVersions) {
|
|
145
|
+
deps[k] = depVersions[k];
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return deps;
|
|
149
|
+
}
|
|
150
|
+
let packageJson = JSON.parse(
|
|
151
|
+
await fs.readFile(path.join(dir, "package.json")).then((res) => res.toString())
|
|
152
|
+
);
|
|
153
|
+
packageJson = {
|
|
154
|
+
name: projectName,
|
|
155
|
+
...packageJson,
|
|
156
|
+
dependencies: replaceWorkspaceDeps(packageJson.dependencies),
|
|
157
|
+
devDependencies: replaceWorkspaceDeps(packageJson.devDependencies)
|
|
158
|
+
};
|
|
159
|
+
if (isNext) {
|
|
160
|
+
packageJson = {
|
|
161
|
+
...packageJson,
|
|
162
|
+
scripts: {
|
|
163
|
+
...packageJson.scripts,
|
|
164
|
+
postinstall: "fumadocs-mdx"
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
if (isNext && lint === "biome") {
|
|
169
|
+
packageJson = {
|
|
170
|
+
...packageJson,
|
|
171
|
+
scripts: {
|
|
172
|
+
...packageJson.scripts,
|
|
173
|
+
lint: "biome check",
|
|
174
|
+
format: "biome format --write"
|
|
175
|
+
},
|
|
176
|
+
devDependencies: {
|
|
177
|
+
...packageJson.devDependencies,
|
|
178
|
+
...pick(depVersions, ["@biomejs/biome"])
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
if (isNext && lint === "eslint") {
|
|
183
|
+
packageJson = {
|
|
184
|
+
...packageJson,
|
|
185
|
+
scripts: {
|
|
186
|
+
...packageJson.scripts,
|
|
187
|
+
lint: "eslint"
|
|
188
|
+
},
|
|
189
|
+
devDependencies: {
|
|
190
|
+
...packageJson.devDependencies,
|
|
191
|
+
eslint: "^9",
|
|
192
|
+
"eslint-config-next": depVersions.next,
|
|
193
|
+
"@eslint/eslintrc": "^3"
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
return packageJson;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export {
|
|
201
|
+
managers,
|
|
202
|
+
getPackageManager,
|
|
203
|
+
create
|
|
204
|
+
};
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
// src/utils.ts
|
|
2
|
+
import fs from "fs/promises";
|
|
3
|
+
import path, { join } from "path";
|
|
4
|
+
import { x } from "tinyexec";
|
|
5
|
+
async function writeFile(file, content) {
|
|
6
|
+
await fs.mkdir(path.dirname(file), { recursive: true });
|
|
7
|
+
await fs.writeFile(file, content);
|
|
8
|
+
}
|
|
9
|
+
async function copy(from, to, options = {}) {
|
|
10
|
+
const {
|
|
11
|
+
rename = (s) => s,
|
|
12
|
+
filterDir = () => true,
|
|
13
|
+
filter = () => true
|
|
14
|
+
} = options;
|
|
15
|
+
const stats = await fs.stat(from);
|
|
16
|
+
if (stats.isDirectory() && filterDir(from)) {
|
|
17
|
+
const files = await fs.readdir(from);
|
|
18
|
+
await Promise.all(
|
|
19
|
+
files.map(
|
|
20
|
+
(file) => copy(path.join(from, file), path.join(to, file), options)
|
|
21
|
+
)
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
if (stats.isFile() && filter(from)) {
|
|
25
|
+
to = rename(to);
|
|
26
|
+
await fs.mkdir(path.dirname(to), { recursive: true });
|
|
27
|
+
await fs.copyFile(from, to);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async function isInGitRepository(cwd2) {
|
|
31
|
+
const { exitCode } = await x("git", ["rev-parse", "--is-inside-work-tree"], {
|
|
32
|
+
nodeOptions: { cwd: cwd2 }
|
|
33
|
+
});
|
|
34
|
+
return exitCode === 0;
|
|
35
|
+
}
|
|
36
|
+
async function isDefaultBranchSet(cwd2) {
|
|
37
|
+
const { exitCode } = await x("git", ["config", "init.defaultBranch"], {
|
|
38
|
+
nodeOptions: { cwd: cwd2 }
|
|
39
|
+
});
|
|
40
|
+
return exitCode === 0;
|
|
41
|
+
}
|
|
42
|
+
async function tryGitInit(cwd2) {
|
|
43
|
+
const { exitCode } = await x("git", ["--version"]);
|
|
44
|
+
if (exitCode !== 0) return false;
|
|
45
|
+
if (await isInGitRepository(cwd2)) return false;
|
|
46
|
+
try {
|
|
47
|
+
await x("git", ["init"], {
|
|
48
|
+
throwOnError: true,
|
|
49
|
+
nodeOptions: { cwd: cwd2 }
|
|
50
|
+
});
|
|
51
|
+
if (!await isDefaultBranchSet(cwd2)) {
|
|
52
|
+
await x("git", ["checkout", "-b", "main"], {
|
|
53
|
+
throwOnError: true,
|
|
54
|
+
nodeOptions: {
|
|
55
|
+
cwd: cwd2
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
await x("git", ["add", "-A"], {
|
|
60
|
+
throwOnError: true,
|
|
61
|
+
nodeOptions: {
|
|
62
|
+
cwd: cwd2
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
await x(
|
|
66
|
+
"git",
|
|
67
|
+
["commit", "-m", "Initial commit from Create Fumadocs App"],
|
|
68
|
+
{
|
|
69
|
+
throwOnError: true,
|
|
70
|
+
nodeOptions: {
|
|
71
|
+
cwd: cwd2
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
);
|
|
75
|
+
return true;
|
|
76
|
+
} catch {
|
|
77
|
+
await fs.rmdir(join(cwd2, ".git"), { recursive: true }).catch(() => null);
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function pick(obj, keys) {
|
|
82
|
+
const result = {};
|
|
83
|
+
for (const key of keys) {
|
|
84
|
+
if (key in obj) {
|
|
85
|
+
result[key] = obj[key];
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// src/constants.ts
|
|
92
|
+
import { fileURLToPath } from "url";
|
|
93
|
+
|
|
94
|
+
// src/versions.js
|
|
95
|
+
var versions = { "fumadocs-core": "16.0.3", "fumadocs-ui": "16.0.3", "fumadocs-mdx": "13.0.1", "@fumadocs/mdx-remote": "1.4.3", "@fumadocs/content-collections": "1.2.4" };
|
|
96
|
+
|
|
97
|
+
// ../create-app-versions/package.json
|
|
98
|
+
var package_default = {
|
|
99
|
+
name: "example-versions",
|
|
100
|
+
version: "0.0.0",
|
|
101
|
+
private: true,
|
|
102
|
+
description: "Used to track dependency versions in create-fumadocs-app",
|
|
103
|
+
dependencies: {
|
|
104
|
+
"@biomejs/biome": "^2.2.6",
|
|
105
|
+
"@content-collections/core": "^0.11.1",
|
|
106
|
+
"@content-collections/mdx": "^0.2.2",
|
|
107
|
+
"@content-collections/next": "^0.2.8",
|
|
108
|
+
"@orama/core": "^1.2.13",
|
|
109
|
+
"@react-router/dev": "^7.9.4",
|
|
110
|
+
"@react-router/node": "^7.9.4",
|
|
111
|
+
"@react-router/serve": "^7.9.4",
|
|
112
|
+
"@tailwindcss/postcss": "^4.1.15",
|
|
113
|
+
"@tailwindcss/vite": "^4.1.15",
|
|
114
|
+
"@tanstack/react-router": "^1.133.21",
|
|
115
|
+
"@tanstack/react-start": "^1.133.21",
|
|
116
|
+
"@types/mdx": "^2.0.13",
|
|
117
|
+
"@types/node": "24.9.1",
|
|
118
|
+
"@types/react": "^19.2.2",
|
|
119
|
+
"@types/react-dom": "^19.2.2",
|
|
120
|
+
"@vitejs/plugin-react": "^5.0.4",
|
|
121
|
+
"gray-matter": "^4.0.3",
|
|
122
|
+
isbot: "^5.1.31",
|
|
123
|
+
"lucide-react": "^0.546.0",
|
|
124
|
+
next: "16.0.0",
|
|
125
|
+
postcss: "^8.5.6",
|
|
126
|
+
react: "^19.2.0",
|
|
127
|
+
"react-dom": "^19.2.0",
|
|
128
|
+
"react-router": "^7.9.4",
|
|
129
|
+
"react-router-devtools": "^5.1.3",
|
|
130
|
+
shiki: "^3.13.0",
|
|
131
|
+
tailwindcss: "^4.1.15",
|
|
132
|
+
tinyglobby: "^0.2.15",
|
|
133
|
+
typescript: "^5.9.3",
|
|
134
|
+
vinxi: "^0.5.8",
|
|
135
|
+
vite: "^7.1.11",
|
|
136
|
+
"vite-tsconfig-paths": "^5.1.4"
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
// src/constants.ts
|
|
141
|
+
var sourceDir = fileURLToPath(new URL(`../`, import.meta.url).href);
|
|
142
|
+
var cwd = process.cwd();
|
|
143
|
+
var templates = [
|
|
144
|
+
{
|
|
145
|
+
value: "+next+fuma-docs-mdx",
|
|
146
|
+
label: "Next.js: Fumadocs MDX",
|
|
147
|
+
hint: "recommended"
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
value: "waku",
|
|
151
|
+
label: "Waku: Fumadocs MDX"
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
value: "react-router",
|
|
155
|
+
label: "React Router: Fumadocs MDX (not RSC)"
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
value: "react-router-spa",
|
|
159
|
+
label: "React Router SPA: Fumadocs MDX (not RSC)",
|
|
160
|
+
hint: "SPA mode allows you to host the site statically, compatible with a CDN."
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
value: "tanstack-start",
|
|
164
|
+
label: "Tanstack Start: Fumadocs MDX (not RSC)"
|
|
165
|
+
}
|
|
166
|
+
];
|
|
167
|
+
var depVersions = {
|
|
168
|
+
...versions,
|
|
169
|
+
...package_default.dependencies
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
export {
|
|
173
|
+
writeFile,
|
|
174
|
+
copy,
|
|
175
|
+
tryGitInit,
|
|
176
|
+
pick,
|
|
177
|
+
sourceDir,
|
|
178
|
+
cwd,
|
|
179
|
+
templates,
|
|
180
|
+
depVersions
|
|
181
|
+
};
|
package/dist/create-app.d.ts
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
type PackageManager = (typeof managers)[number];
|
|
2
2
|
declare const managers: readonly ["npm", "yarn", "bun", "pnpm"];
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
interface TemplateInfo {
|
|
5
|
+
value: '+next+fuma-docs-mdx' | 'waku' | 'react-router' | 'react-router-spa' | 'tanstack-start';
|
|
6
|
+
label: string;
|
|
7
|
+
hint?: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
type Template = TemplateInfo['value'];
|
|
6
11
|
interface Options {
|
|
7
12
|
outputDir: string;
|
|
8
13
|
template: Template;
|
|
@@ -15,11 +20,6 @@ interface Options {
|
|
|
15
20
|
* @defaultValue false
|
|
16
21
|
*/
|
|
17
22
|
useSrcDir?: boolean;
|
|
18
|
-
/**
|
|
19
|
-
* (Next.js only) Configure Tailwind CSS
|
|
20
|
-
* @defaultValue true
|
|
21
|
-
*/
|
|
22
|
-
tailwindcss?: boolean;
|
|
23
23
|
/**
|
|
24
24
|
* (Next.js Only) Configure Lint
|
|
25
25
|
* @defaultValue false
|
|
@@ -28,7 +28,22 @@ interface Options {
|
|
|
28
28
|
installDeps?: boolean;
|
|
29
29
|
initializeGit?: boolean;
|
|
30
30
|
log?: (message: string) => void;
|
|
31
|
+
plugins?: TemplatePlugin[];
|
|
32
|
+
}
|
|
33
|
+
interface TemplatePluginContext {
|
|
34
|
+
template: TemplateInfo;
|
|
35
|
+
options: Required<Options>;
|
|
36
|
+
/**
|
|
37
|
+
* output directory
|
|
38
|
+
*/
|
|
39
|
+
dest: string;
|
|
40
|
+
}
|
|
41
|
+
type Awaitable<T> = T | Promise<T>;
|
|
42
|
+
interface TemplatePlugin {
|
|
43
|
+
packageJson?: (this: TemplatePluginContext, packageJson: any) => Awaitable<void | any>;
|
|
44
|
+
afterWrite?: (this: TemplatePluginContext) => Awaitable<void>;
|
|
45
|
+
readme?: (this: TemplatePluginContext, content: string) => Awaitable<void | string>;
|
|
31
46
|
}
|
|
32
47
|
declare function create(createOptions: Options): Promise<void>;
|
|
33
48
|
|
|
34
|
-
export { type Options, type Template,
|
|
49
|
+
export { type Options, type Template, type TemplatePlugin, type TemplatePluginContext, create };
|
package/dist/create-app.js
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
create,
|
|
4
|
-
cwd,
|
|
5
4
|
getPackageManager,
|
|
6
|
-
managers
|
|
5
|
+
managers
|
|
6
|
+
} from "./chunk-3VWJJEHU.js";
|
|
7
|
+
import {
|
|
8
|
+
cwd,
|
|
7
9
|
templates
|
|
8
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-HLHY7KAF.js";
|
|
9
11
|
|
|
10
12
|
// src/index.ts
|
|
11
13
|
import fs from "fs/promises";
|
|
@@ -35,9 +37,9 @@ program.option("--no-install", "Disable installing packages automatically");
|
|
|
35
37
|
program.option("--no-git", "Disable auto Git repository initialization");
|
|
36
38
|
program.option(
|
|
37
39
|
"--template <name>",
|
|
38
|
-
`template to choose: ${templates.join(", ")}`,
|
|
40
|
+
`template to choose: ${templates.map((v) => v.value).join(", ")}`,
|
|
39
41
|
(value) => {
|
|
40
|
-
if (!templates.
|
|
42
|
+
if (!templates.some((item) => item.value === value)) {
|
|
41
43
|
throw new Error(`Invalid template: ${value}.`);
|
|
42
44
|
}
|
|
43
45
|
return value;
|
|
@@ -71,29 +73,7 @@ async function main(config) {
|
|
|
71
73
|
return select({
|
|
72
74
|
message: "Choose a template",
|
|
73
75
|
initialValue: "+next+fuma-docs-mdx",
|
|
74
|
-
options:
|
|
75
|
-
{
|
|
76
|
-
value: "+next+fuma-docs-mdx",
|
|
77
|
-
label: "Next.js: Fumadocs MDX",
|
|
78
|
-
hint: "recommended"
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
value: "+next+content-collections",
|
|
82
|
-
label: "Next.js: Content Collections"
|
|
83
|
-
},
|
|
84
|
-
{
|
|
85
|
-
value: "waku",
|
|
86
|
-
label: "Waku: Fumadocs MDX"
|
|
87
|
-
},
|
|
88
|
-
{
|
|
89
|
-
value: "react-router",
|
|
90
|
-
label: "React Router: Fumadocs MDX (not RSC)"
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
value: "tanstack-start",
|
|
94
|
-
label: "Tanstack Start: Fumadocs MDX (not RSC)"
|
|
95
|
-
}
|
|
96
|
-
]
|
|
76
|
+
options: templates
|
|
97
77
|
});
|
|
98
78
|
},
|
|
99
79
|
src: async (v) => {
|
|
@@ -116,6 +96,10 @@ async function main(config) {
|
|
|
116
96
|
message: "Configure linter?",
|
|
117
97
|
initialValue: false,
|
|
118
98
|
options: [
|
|
99
|
+
{
|
|
100
|
+
value: false,
|
|
101
|
+
label: "Disabled"
|
|
102
|
+
},
|
|
119
103
|
{
|
|
120
104
|
value: "eslint",
|
|
121
105
|
label: "ESLint"
|
|
@@ -123,10 +107,23 @@ async function main(config) {
|
|
|
123
107
|
{
|
|
124
108
|
value: "biome",
|
|
125
109
|
label: "Biome"
|
|
110
|
+
}
|
|
111
|
+
]
|
|
112
|
+
});
|
|
113
|
+
},
|
|
114
|
+
search: () => {
|
|
115
|
+
return select({
|
|
116
|
+
message: "Choose a search solution?",
|
|
117
|
+
options: [
|
|
118
|
+
{
|
|
119
|
+
value: "orama",
|
|
120
|
+
label: "Default",
|
|
121
|
+
hint: "local search powered by Orama, recommended"
|
|
126
122
|
},
|
|
127
123
|
{
|
|
128
|
-
value:
|
|
129
|
-
label: "
|
|
124
|
+
value: "orama-cloud",
|
|
125
|
+
label: "Orama Cloud",
|
|
126
|
+
hint: "3rd party search solution, signup needed"
|
|
130
127
|
}
|
|
131
128
|
]
|
|
132
129
|
});
|
|
@@ -173,15 +170,20 @@ async function main(config) {
|
|
|
173
170
|
}
|
|
174
171
|
const info = spinner();
|
|
175
172
|
info.start(`Generating Project`);
|
|
173
|
+
const plugins = [];
|
|
174
|
+
if (options.search === "orama-cloud") {
|
|
175
|
+
const { oramaCloud } = await import("./orama-cloud-VQUOOEZ2.js");
|
|
176
|
+
plugins.push(oramaCloud());
|
|
177
|
+
}
|
|
176
178
|
await create({
|
|
177
179
|
packageManager: manager,
|
|
178
|
-
tailwindcss: true,
|
|
179
180
|
template: options.template,
|
|
180
181
|
outputDir: dest,
|
|
181
182
|
installDeps: options.installDeps,
|
|
182
183
|
lint: options.lint,
|
|
183
184
|
useSrcDir: options.src,
|
|
184
185
|
initializeGit: config.git ?? true,
|
|
186
|
+
plugins,
|
|
185
187
|
log: (message) => {
|
|
186
188
|
info.message(message);
|
|
187
189
|
}
|