create-docus 1.0.7 → 2.0.0-beta.1

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/README.md CHANGED
@@ -1,24 +1,112 @@
1
- # Docus CLI
1
+ [![docus](https://docus-puce.vercel.app/__og-image__/static/og.png)](https://docus.dev)
2
2
 
3
- The Docus CLI.
3
+ > CLI tool to create beautiful docs with Markdown
4
4
 
5
- ## Quick Setup
5
+ [![npm version](https://img.shields.io/npm/v/create-docus.svg?style=flat&colorA=020420&colorB=EEEEEE)](https://npmjs.com/package/create-docus)
6
+ [![npm downloads](https://img.shields.io/npm/dm/create-docus.svg?style=flat&colorA=020420&colorB=EEEEEE)](https://npm.chart.dev/create-docus)
7
+ [![License](https://img.shields.io/npm/l/create-docus.svg?style=flat&colorA=020420&colorB=EEEEEE)](https://npmjs.com/package/create-docus)
6
8
 
7
- Add `docus` package globally:
9
+ The fastest way to create a new [Docus](https://docus.dev) documentation project. This CLI tool scaffolds a complete documentation website using the [`docus`](https://www.github.com/nuxtlabs/docus/tree/main/layer) Nuxt layer.
10
+
11
+ ## 🚀 Quick Start
12
+
13
+ Create a new documentation project in seconds:
8
14
 
9
15
  ```bash
10
- # Using Yarn
11
- yarn install --global docus
12
- # Using NPM
13
- npm install --global docus
16
+ # Create a new project
17
+ npx create docus my-docs
18
+
19
+ # Navigate to your project
20
+ cd my-docs
21
+
22
+ # Start development server
23
+ npm run dev
14
24
  ```
15
25
 
16
- ## Commands
26
+ That's it! Your documentation site will be running at `http://localhost:3000`
27
+
28
+ ## 🎯 What it creates
29
+
30
+ The CLI scaffolds a complete documentation project with:
31
+
32
+ - ✨ **Beautiful Design** - Clean, modern documentation theme
33
+ - 📱 **Responsive** - Mobile-first responsive design
34
+ - 🌙 **Dark Mode** - Built-in dark/light mode support
35
+ - 🔍 **Search** - Full-text search functionality
36
+ - 📝 **Markdown Enhanced** - Extended markdown with custom components
37
+ - 🎨 **Customizable** - Easy theming and brand customization
38
+ - ⚡ **Fast** - Optimized for performance with Nuxt 4
39
+ - 🔧 **TypeScript** - Full TypeScript support
40
+
41
+ ## 📁 Project Structure
42
+
43
+ ### Generated project
44
+
45
+ ```
46
+ my-docs/
47
+ ├── content/ # Your markdown content
48
+ │ ├── index.md # Homepage
49
+ │ └── docs/ # Documentation pages
50
+ ├── public/ # Static assets
51
+ └── package.json # Dependencies and scripts
52
+ ```
53
+
54
+ ### Optional files and folders
55
+
56
+ Docus uses a layer system, you can go further and use any feature or file of a classical Nuxt project:
57
+
58
+ ```
59
+ my-docs/
60
+ ├── app.config.ts # App configuration
61
+ ├── nuxt.config.ts # Nuxt configuration (add extra modules, components, etc.)
62
+ ├── app/ # App directory
63
+ │ ├── components/ # Components (add your own components)
64
+ │ ├── layouts/ # Layouts (add your own layouts)
65
+ │ └── pages/ # Pages (add your own pages)
66
+ └── server/ # Server-side code (add your own server-side code)
67
+ ```
17
68
 
18
- TODO
69
+ ## ⚡ Built with
70
+
71
+ Your project comes pre-configured with the best of the Nuxt ecosystem:
72
+
73
+ - [Nuxt 4](https://nuxt.com) - The web framework
74
+ - [Nuxt Content](https://content.nuxt.com/) - File-based CMS
75
+ - [Nuxt UI Pro](https://ui.nuxt.com/pro) - Premium UI components
76
+ - [Nuxt Image](https://image.nuxt.com/) - Optimized images
77
+ - [Tailwind CSS 4](https://tailwindcss.com/) - Utility-first CSS
78
+ - [Docus Layer](https://www.npmjs.com/package/docus) - Documentation theme
79
+
80
+ ## 🔗 Related Packages
81
+
82
+ - [`docus`](https://github.com/nuxtlabs/docus/tree/main/layer) - The Nuxt layer that powers your documentation
83
+
84
+ ## 📖 Documentation
85
+
86
+ For detailed documentation on customizing your Docus project, visit the [Docus Documentation](https://docus.dev)
87
+
88
+ ## 🛠️ Development
89
+
90
+ This repository contains the CLI tool source code.
91
+
92
+ ### Local Development
93
+
94
+ To contribute to the CLI tool:
95
+
96
+ ```bash
97
+ # Clone this repository
98
+ git clone https://github.com/nuxtlabs/docus
99
+
100
+ # Install dependencies
101
+ pnpm install
102
+
103
+ # Build the CLI
104
+ pnpm run build
105
+
106
+ # Run the dev server to run the docus docs
107
+ pnpm run dev
108
+ ```
19
109
 
20
- ## Development
110
+ ## 📄 License
21
111
 
22
- 1. Clone this repository
23
- 2. Install dependencies using `yarn install`
24
- 3. Start dev server using `yarn dev`
112
+ Published under the [MIT](https://github.com/nuxtlabs/docus/blob/main/LICENSE) license.
package/dist/main.mjs ADDED
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env node
2
+
3
+ // cli.ts
4
+ import { resolve } from "path";
5
+ import { defineCommand, runMain } from "citty";
6
+ function createCLI(opts) {
7
+ const main = defineCommand({
8
+ meta: {
9
+ name: opts.name,
10
+ description: opts.description
11
+ },
12
+ args: {
13
+ dir: {
14
+ type: "positional",
15
+ description: "Project directory",
16
+ required: false,
17
+ default: "docs"
18
+ }
19
+ },
20
+ async setup({ args }) {
21
+ const dir = resolve(args.dir);
22
+ const { runCommand } = await import("nuxi");
23
+ await runCommand("init", [dir, "-t", "gh:nuxtlabs/docus/.starters/default#feat/nuxt-cli"]);
24
+ }
25
+ });
26
+ return {
27
+ runMain: () => runMain(main)
28
+ };
29
+ }
30
+
31
+ // main.ts
32
+ var cli = createCLI({
33
+ name: "create-docus",
34
+ description: "Create a new Docus documentation project",
35
+ setup: {
36
+ defaults: {}
37
+ }
38
+ });
39
+ cli.runMain();
package/package.json CHANGED
@@ -1,72 +1,45 @@
1
1
  {
2
2
  "name": "create-docus",
3
- "version": "1.0.7",
4
- "description": "The Docus CLI.",
5
- "repository": "https://github.com/docusgen/cli",
6
- "bugs": {
7
- "url": "https://github.com/docusgen/cli/issues"
3
+ "description": "CLI for creating Docus documentation projects",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "git+https://github.com/nuxtlabs/docus.git"
8
7
  },
9
- "homepage": "https://github.com/docusgen/cli#readme",
10
- "author": "Yaël GUILLOUX <yael.guilloux@gmail.com>",
8
+ "private": false,
9
+ "version": "2.0.0-beta.1",
10
+ "keywords": [],
11
11
  "license": "MIT",
12
- "keywords": [
13
- "typescript",
14
- "starter"
15
- ],
16
- "main": "dist/index.js",
17
- "module": "dist/index.mjs",
18
- "types": "dist/src/index.d.ts",
19
- "scripts": {
20
- "dev": "jiti scripts/watch.ts --cache",
21
- "build": "unbuild",
22
- "lint": "prettier -c --parser typescript \"{src,tests}/**/*.[jt]s?(x)\"",
23
- "lint:fix": "yarn run lint --write",
24
- "test:types": "tsc --build tsconfig.json",
25
- "test:unit": "jest",
26
- "test": "yarn run test:types && yarn run test:unit"
27
- },
28
- "engines": {
29
- "node": ">=14.0.0"
30
- },
31
12
  "bin": {
32
- "create-docus": "dist/create-docus/create-docus.js"
13
+ "create-docus": "dist/main.mjs"
33
14
  },
34
15
  "files": [
35
- "dist/**/*",
36
- "LICENSE",
37
- "README.md"
16
+ "dist"
38
17
  ],
18
+ "scripts": {
19
+ "prepare": "pnpm build",
20
+ "build": "tsup-node ./main.ts --format esm",
21
+ "dev": "tsx ./main.ts",
22
+ "lint": "eslint ."
23
+ },
39
24
  "dependencies": {
40
- "degit": "^2.8.4",
41
- "execa": "^5.1.1",
42
- "kolorist": "^1.5.0",
43
- "minimist": "^1.2.5",
44
- "prompts": "^2.4.1"
25
+ "@nuxt/kit": "^4.0.0",
26
+ "c12": "^3.1.0",
27
+ "citty": "^0.1.6",
28
+ "defu": "^6.1.4",
29
+ "dotenv": "^17.2.0",
30
+ "git-url-parse": "^16.1.0",
31
+ "minimark": "^0.2.0",
32
+ "nuxi": "^3.26.2",
33
+ "pkg-types": "^2.2.0",
34
+ "scule": "^1.3.0",
35
+ "ufo": "^1.6.1",
36
+ "unctx": "^2.4.1",
37
+ "unist-util-visit": "^5.0.0"
45
38
  },
46
39
  "devDependencies": {
47
- "@types/degit": "^2.8.3",
48
- "@types/jest": "^27.0.1",
49
- "@types/minimist": "^1.2.2",
50
- "@types/prompts": "^2.0.14",
51
- "chokidar": "^3.5.2",
52
- "jest": "^27.0.6",
53
- "jiti": "^1.11.0",
54
- "lint-staged": "^11.1.2",
55
- "pascalcase": "^1.0.0",
56
- "prettier": "^2.3.2",
57
- "ts-jest": "^27.0.5",
58
- "typescript": "^4.3.5",
59
- "unbuild": "^0.4.2"
60
- },
61
- "gitHooks": {
62
- "pre-commit": "lint-staged"
40
+ "@types/node": "^24.0.14",
41
+ "tsup": "^8.5.0",
42
+ "tsx": "^4.20.3"
63
43
  },
64
- "lint-staged": {
65
- "*.js": [
66
- "prettier --write"
67
- ],
68
- "*.ts?(x)": [
69
- "prettier --parser=typescript --write"
70
- ]
71
- }
44
+ "packageManager": "pnpm@10.13.1"
72
45
  }
@@ -1,7 +0,0 @@
1
- #!/usr/bin/env node
2
- // #!/usr/bin/env node
3
- "use strict";
4
-
5
- var _index = require("./index");
6
-
7
- (0, _index.createDocus)().catch(console.log);
@@ -1,244 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.getProjectType = getProjectType;
7
- exports.getTemplate = getTemplate;
8
- exports.createDir = createDir;
9
- exports.getValidPackageName = getValidPackageName;
10
- exports.getTargetDir = getTargetDir;
11
- exports.createProject = createProject;
12
- exports.log = exports.pkgManager = exports.args = exports.cwd = void 0;
13
-
14
- var _package = require("../../package.json");
15
-
16
- var _fs = _interopRequireDefault(require("fs"));
17
-
18
- var _path = _interopRequireDefault(require("path"));
19
-
20
- var _kolorist = require("kolorist");
21
-
22
- var _minimist = _interopRequireDefault(require("minimist"));
23
-
24
- var _prompts = _interopRequireDefault(require("prompts"));
25
-
26
- var _degit = _interopRequireDefault(require("degit"));
27
-
28
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
-
30
- const cwd = process.cwd();
31
- exports.cwd = cwd;
32
- const args = (0, _minimist.default)(process.argv.slice(2));
33
- exports.args = args;
34
- const pkgManager = /pnpm/.test(process.env.npm_execpath || "") || /pnpm/.test(process.env.npm_config_user_agent || "") ? "pnpm" : /yarn/.test(process.env.npm_execpath || "") ? "yarn" : "npm";
35
- exports.pkgManager = pkgManager;
36
- const log = {
37
- space: () => console.log(),
38
- bold: str => (0, _kolorist.bold)(str),
39
- primary: str => (0, _kolorist.green)(str),
40
- secondary: str => (0, _kolorist.dim)(str),
41
- warning: str => (0, _kolorist.yellow)(str),
42
- error: str => (0, _kolorist.red)(str),
43
- broadcast: str => console.log(` ${str}`),
44
- motd: () => {
45
- log.space();
46
- log.broadcast(`${(0, _kolorist.bold)("Docus") + log.secondary(" CLI")} ${log.primary(`v${_package.version}`)}`);
47
- log.space();
48
- }
49
- };
50
- exports.log = log;
51
- const REPOSITORIES = {
52
- website: "git@github.com:docusgen/starter.git",
53
- theme: "git@github.com:docusgen/theme-starter.git",
54
- module: "git@github.com:docusgen/module-starter.git"
55
- };
56
-
57
- function copyDir(srcDir, destDir) {
58
- _fs.default.mkdirSync(destDir, {
59
- recursive: true
60
- });
61
-
62
- for (const file of _fs.default.readdirSync(srcDir)) {
63
- const srcFile = _path.default.resolve(srcDir, file);
64
-
65
- const destFile = _path.default.resolve(destDir, file);
66
-
67
- copy(srcFile, destFile);
68
- }
69
- }
70
-
71
- function emptyDir(dir) {
72
- if (!_fs.default.existsSync(dir)) return;
73
-
74
- for (const file of _fs.default.readdirSync(dir)) {
75
- const abs = _path.default.resolve(dir, file);
76
-
77
- if (_fs.default.lstatSync(abs).isDirectory()) {
78
- emptyDir(abs);
79
-
80
- _fs.default.rmdirSync(abs);
81
- } else {
82
- _fs.default.unlinkSync(abs);
83
- }
84
- }
85
- }
86
-
87
- function copy(src, dest) {
88
- const stat = _fs.default.statSync(src);
89
-
90
- if (stat.isDirectory()) copyDir(src, dest);else _fs.default.copyFileSync(src, dest);
91
- }
92
-
93
- function getProjectType() {
94
- switch (args["type"]) {
95
- case "theme":
96
- return "theme";
97
-
98
- case "module":
99
- return "module";
100
-
101
- default:
102
- return "website";
103
- }
104
- }
105
-
106
- async function getTemplate(projectType) {
107
- const {
108
- broadcast,
109
- primary,
110
- secondary
111
- } = log;
112
-
113
- const templateDir = _path.default.join(__dirname, "./template");
114
-
115
- broadcast([secondary("Cloning the latest"), primary(projectType === "website" ? "Docus" : projectType), secondary("template...")].join(" "));
116
- emptyDir(templateDir);
117
- const projectRepository = REPOSITORIES[projectType];
118
- const repo = (0, _degit.default)(projectRepository, {
119
- force: true,
120
- verbose: true,
121
- mode: "git"
122
- });
123
- await repo.clone(templateDir);
124
- return templateDir;
125
- }
126
-
127
- async function createDir(targetDir) {
128
- const projectPath = _path.default.join(cwd, targetDir);
129
-
130
- const {
131
- broadcast,
132
- warning,
133
- error,
134
- space,
135
- secondary
136
- } = log;
137
-
138
- if (!_fs.default.existsSync(projectPath)) {
139
- _fs.default.mkdirSync(projectPath, {
140
- recursive: true
141
- });
142
- } else {
143
- const existing = _fs.default.readdirSync(projectPath);
144
-
145
- const dir = projectPath.split("/");
146
- const dirName = dir[dir.length - 1];
147
-
148
- if (existing.length) {
149
- space();
150
- broadcast(warning(`Target directory "${dirName}" is not empty.`));
151
- space();
152
- const {
153
- yes
154
- } = await (0, _prompts.default)({
155
- type: "confirm",
156
- name: "yes",
157
- initial: "Y",
158
- message: "Remove existing files and continue?"
159
- });
160
- if (yes) emptyDir(projectPath);else {
161
- space();
162
- broadcast(warning(`Target directory is not empty and you do not want to overwrite it.`));
163
- space();
164
- broadcast(error(`Cancelling project creation.`));
165
- process.exit(1);
166
- }
167
- }
168
- }
169
-
170
- space();
171
- broadcast(secondary("Scaffolding project in ") + targetDir + secondary("..."));
172
- return projectPath;
173
- }
174
-
175
- async function getValidPackageName(projectName) {
176
- projectName = _path.default.basename(projectName);
177
- const packageNameRegExp = /^(?:@[a-z0-9-*~][a-z0-9-*._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/;
178
-
179
- if (packageNameRegExp.test(projectName)) {
180
- return projectName;
181
- } else {
182
- const suggestedPackageName = projectName.trim().toLowerCase().replace(/\s+/g, "-").replace(/^[._]/, "").replace(/[^a-z0-9-~]+/g, "-");
183
- const {
184
- inputPackageName
185
- } = await (0, _prompts.default)({
186
- type: "text",
187
- name: "inputPackageName",
188
- message: "Package name:",
189
- initial: suggestedPackageName,
190
- validate: input => packageNameRegExp.test(input) ? true : "Invalid package.json name"
191
- });
192
- return inputPackageName;
193
- }
194
- }
195
-
196
- async function getTargetDir(projectType) {
197
- const {
198
- space,
199
- broadcast,
200
- error,
201
- warning
202
- } = log;
203
- let targetDir = args._[0];
204
-
205
- if (!targetDir) {
206
- const {
207
- projectName
208
- } = await (0, _prompts.default)({
209
- type: "text",
210
- name: "projectName",
211
- message: "Project name:",
212
- initial: `my-${projectType}`
213
- });
214
-
215
- if (!projectName) {
216
- space();
217
- broadcast(warning(`You must specify a project name.`));
218
- space();
219
- broadcast(error(`Cancelling project creation.`));
220
- process.exit(1);
221
- }
222
-
223
- targetDir = projectName.trim();
224
- }
225
-
226
- return targetDir;
227
- }
228
-
229
- function createProject(root, templateDir, packageName) {
230
- const write = (file, content = void 0) => {
231
- const targetPath = _path.default.join(root, file);
232
-
233
- if (content) _fs.default.writeFileSync(targetPath, content);else copy(_path.default.join(templateDir, file), targetPath);
234
- };
235
-
236
- const files = _fs.default.readdirSync(templateDir);
237
-
238
- for (const file of files.filter(f => f !== "package.json")) write(file);
239
-
240
- const pkg = require(_path.default.join(templateDir, "package.json"));
241
-
242
- pkg.name = packageName;
243
- write("package.json", JSON.stringify(pkg, null, 2));
244
- }
@@ -1,87 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.createDocus = createDocus;
7
-
8
- var _path = require("path");
9
-
10
- var _prompts = _interopRequireDefault(require("prompts"));
11
-
12
- var _execa = _interopRequireDefault(require("execa"));
13
-
14
- var _helpers = require("./helpers");
15
-
16
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
-
18
- const {
19
- motd,
20
- primary,
21
- secondary,
22
- warning,
23
- bold,
24
- space,
25
- broadcast
26
- } = _helpers.log;
27
-
28
- async function createDocus() {
29
- motd();
30
- const projectType = (0, _helpers.getProjectType)();
31
- const targetDir = await (0, _helpers.getTargetDir)(projectType);
32
- const packageName = await (0, _helpers.getValidPackageName)(targetDir);
33
- const projectPath = await (0, _helpers.createDir)(targetDir);
34
- const templateDir = await (0, _helpers.getTemplate)(projectType);
35
- (0, _helpers.createProject)(projectPath, templateDir, packageName);
36
- broadcast(primary("Done."));
37
- space();
38
- const {
39
- yes
40
- } = await (0, _prompts.default)({
41
- type: "confirm",
42
- name: "yes",
43
- initial: "Y",
44
- message: "Install and start it now?"
45
- });
46
- if (yes) await startProject(projectPath);else startItLater(projectPath);
47
- }
48
-
49
- async function startProject(projectPath) {
50
- space();
51
- const {
52
- agent
53
- } = await (0, _prompts.default)({
54
- name: "agent",
55
- type: "select",
56
- message: "Choose the agent",
57
- choices: ["yarn", "npm", "pnpm"].map(i => ({
58
- value: i,
59
- title: i
60
- }))
61
- });
62
-
63
- if (!agent) {
64
- space();
65
- broadcast(warning(`You cancelled the agent selection!`));
66
- return startItLater(projectPath);
67
- }
68
-
69
- await (0, _execa.default)(agent, ["install"], {
70
- stdio: "inherit",
71
- cwd: projectPath
72
- });
73
- await (0, _execa.default)(agent, ["run", "dev"], {
74
- stdio: "inherit",
75
- cwd: projectPath
76
- });
77
- }
78
-
79
- function startItLater(projectPath) {
80
- space();
81
- broadcast(secondary("Start it later with:"));
82
- space();
83
- const dir = (0, _path.relative)(_helpers.cwd, projectPath);
84
- if (projectPath !== _helpers.cwd) broadcast(primary(`cd ${bold(dir)}`));
85
- broadcast(primary(`${_helpers.pkgManager === "yarn" ? "yarn" : `${_helpers.pkgManager} install`}`));
86
- broadcast(primary(`${_helpers.pkgManager === "yarn" ? "yarn dev" : `${_helpers.pkgManager} run dev`}`));
87
- }
package/dist/index.js DELETED
@@ -1,10 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- module.exports = void 0;
7
-
8
- var _default = () => {};
9
-
10
- module.exports = _default;