@clarify-labs/cli 0.4.0 → 0.5.0
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/output/cli/commands/init.d.ts +1 -1
- package/output/cli/package.d.ts +5 -0
- package/output/cli.cjs +209 -47
- package/output/cli.cjs.map +1 -1
- package/output/cli.js +211 -49
- package/output/cli.js.map +1 -1
- package/output/core/log.d.ts +2 -0
- package/output/core/virtual-modules.d.ts +8 -6
- package/output/index.cjs +1 -1
- package/output/index.js +1 -1
- package/output/parsers/mdx.d.ts +1 -2
- package/output/{plugin-BSPUvgb3.cjs → plugin-DnD0L83F.cjs} +14 -12
- package/output/plugin-DnD0L83F.cjs.map +1 -0
- package/output/{plugin-B-_5mQmO.js → plugin-PEEknlAO.js} +14 -11
- package/output/plugin-PEEknlAO.js.map +1 -0
- package/package.json +3 -3
- package/output/plugin-B-_5mQmO.js.map +0 -1
- package/output/plugin-BSPUvgb3.cjs.map +0 -1
package/output/cli.js
CHANGED
|
@@ -1,10 +1,83 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { i as createClarifyRuntimeAliases, r as loadClarifyConfig, t as clarifyPlugin } from "./plugin-
|
|
2
|
+
import { i as createClarifyRuntimeAliases, r as loadClarifyConfig, t as clarifyPlugin } from "./plugin-PEEknlAO.js";
|
|
3
3
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
4
|
-
import { dirname, resolve } from "node:path";
|
|
4
|
+
import { dirname, join, resolve } from "node:path";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
6
|
-
import { build, createServer } from "vite";
|
|
6
|
+
import { build, createLogger, createServer } from "vite";
|
|
7
|
+
import { createRequire } from "node:module";
|
|
7
8
|
import { cac } from "cac";
|
|
9
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
10
|
+
import { copyTemplateDirectory, getTemplateDirectory, resolveTemplate } from "@clarify-labs/templates";
|
|
11
|
+
//#region source/core/log.ts
|
|
12
|
+
var LOG_FILE_NAME = ".clarify.log";
|
|
13
|
+
var DEFAULT_LOG_ENTRIES = 50;
|
|
14
|
+
var ENTRY_SEPARATOR = "\n\n---\n\n";
|
|
15
|
+
function getMaxLogEntries() {
|
|
16
|
+
const envValue = process.env.CLARIFY_LOG_MAX_ENTRIES;
|
|
17
|
+
if (!envValue) return DEFAULT_LOG_ENTRIES;
|
|
18
|
+
const parsed = Number(envValue);
|
|
19
|
+
return Number.isInteger(parsed) && parsed > 0 ? parsed : DEFAULT_LOG_ENTRIES;
|
|
20
|
+
}
|
|
21
|
+
function normalizeErrorMessage(error) {
|
|
22
|
+
if (error === void 0) return "undefined";
|
|
23
|
+
if (error === null) return "null";
|
|
24
|
+
if (error instanceof Error) return error.message;
|
|
25
|
+
if (typeof error === "object") {
|
|
26
|
+
if ("message" in error && typeof error.message === "string") return error.message;
|
|
27
|
+
try {
|
|
28
|
+
return JSON.stringify(error);
|
|
29
|
+
} catch {
|
|
30
|
+
return String(error);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return String(error);
|
|
34
|
+
}
|
|
35
|
+
function normalizeErrorStack(error) {
|
|
36
|
+
if (error instanceof Error) return error.stack;
|
|
37
|
+
}
|
|
38
|
+
function formatLogEntry(root, error) {
|
|
39
|
+
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
40
|
+
const message = normalizeErrorMessage(error);
|
|
41
|
+
const stack = normalizeErrorStack(error);
|
|
42
|
+
return [
|
|
43
|
+
`=== Clarify build error ===`,
|
|
44
|
+
`Timestamp: ${timestamp}`,
|
|
45
|
+
`Project root: ${root}`,
|
|
46
|
+
`Error: ${message}`,
|
|
47
|
+
stack ? `Stack:\n${stack}` : void 0
|
|
48
|
+
].filter(Boolean).join("\n");
|
|
49
|
+
}
|
|
50
|
+
async function logBuildError(root, error, maxEntries) {
|
|
51
|
+
const logPath = join(root, LOG_FILE_NAME);
|
|
52
|
+
const entry = formatLogEntry(root, error);
|
|
53
|
+
const max = maxEntries ?? getMaxLogEntries();
|
|
54
|
+
let entries = [];
|
|
55
|
+
if (existsSync(logPath)) try {
|
|
56
|
+
entries = (await readFile(logPath, "utf8")).split(ENTRY_SEPARATOR).map((item) => item.trim()).filter(Boolean);
|
|
57
|
+
} catch {
|
|
58
|
+
entries = [];
|
|
59
|
+
}
|
|
60
|
+
entries.push(entry);
|
|
61
|
+
if (entries.length > max) entries = entries.slice(-max);
|
|
62
|
+
mkdirSync(dirname(logPath), { recursive: true });
|
|
63
|
+
await writeFile(logPath, entries.join(ENTRY_SEPARATOR) + "\n", "utf8");
|
|
64
|
+
}
|
|
65
|
+
function logBuildErrorSync(root, error, maxEntries) {
|
|
66
|
+
const logPath = join(root, LOG_FILE_NAME);
|
|
67
|
+
const entry = formatLogEntry(root, error);
|
|
68
|
+
const max = maxEntries ?? getMaxLogEntries();
|
|
69
|
+
let entries = [];
|
|
70
|
+
if (existsSync(logPath)) try {
|
|
71
|
+
entries = readFileSync(logPath, "utf8").split(ENTRY_SEPARATOR).map((item) => item.trim()).filter(Boolean);
|
|
72
|
+
} catch {
|
|
73
|
+
entries = [];
|
|
74
|
+
}
|
|
75
|
+
entries.push(entry);
|
|
76
|
+
if (entries.length > max) entries = entries.slice(-max);
|
|
77
|
+
mkdirSync(dirname(logPath), { recursive: true });
|
|
78
|
+
writeFileSync(logPath, entries.join(ENTRY_SEPARATOR) + "\n", "utf8");
|
|
79
|
+
}
|
|
80
|
+
//#endregion
|
|
8
81
|
//#region source/core/vite-config.ts
|
|
9
82
|
var DEFAULT_HTML = "<!doctype html><html lang=\"en\"><head><meta charset=\"UTF-8\" /><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" /><title>Clarify</title></head><body><div id=\"root\"></div></body></html>";
|
|
10
83
|
function ensureHtmlEntry(root) {
|
|
@@ -15,6 +88,35 @@ function ensureHtmlEntry(root) {
|
|
|
15
88
|
writeFileSync(generatedHtmlPath, DEFAULT_HTML, "utf-8");
|
|
16
89
|
return generatedHtmlPath;
|
|
17
90
|
}
|
|
91
|
+
function createClarifyLogger(root, env, level) {
|
|
92
|
+
if (env.command !== "build") return void 0;
|
|
93
|
+
const baseLogger = createLogger(level, { allowClearScreen: true });
|
|
94
|
+
return {
|
|
95
|
+
info(msg, options) {
|
|
96
|
+
baseLogger.info(msg, options);
|
|
97
|
+
},
|
|
98
|
+
warn(msg, options) {
|
|
99
|
+
baseLogger.warn(msg, options);
|
|
100
|
+
},
|
|
101
|
+
warnOnce(msg, options) {
|
|
102
|
+
baseLogger.warnOnce(msg, options);
|
|
103
|
+
},
|
|
104
|
+
error(msg, options) {
|
|
105
|
+
baseLogger.error(msg, options);
|
|
106
|
+
if (options?.error) logBuildErrorSync(root, options.error);
|
|
107
|
+
else logBuildErrorSync(root, typeof msg === "string" ? new Error(msg) : msg);
|
|
108
|
+
},
|
|
109
|
+
clearScreen(type) {
|
|
110
|
+
baseLogger.clearScreen(type);
|
|
111
|
+
},
|
|
112
|
+
hasErrorLogged(error) {
|
|
113
|
+
return baseLogger.hasErrorLogged(error);
|
|
114
|
+
},
|
|
115
|
+
get hasWarned() {
|
|
116
|
+
return baseLogger.hasWarned;
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
}
|
|
18
120
|
function createHtmlFallbackPlugin() {
|
|
19
121
|
return {
|
|
20
122
|
name: "clarify:cli-html-fallback",
|
|
@@ -52,6 +154,7 @@ async function createViteConfig(options, env) {
|
|
|
52
154
|
configFile: false,
|
|
53
155
|
appType: "custom",
|
|
54
156
|
resolve: { alias: createClarifyRuntimeAliases() },
|
|
157
|
+
customLogger: createClarifyLogger(options.root, env, "info"),
|
|
55
158
|
plugins: [clarifyPlugin(buildOptions), createHtmlFallbackPlugin()],
|
|
56
159
|
server: {
|
|
57
160
|
host: options.host,
|
|
@@ -92,10 +195,15 @@ async function createViteConfig(options, env) {
|
|
|
92
195
|
//#endregion
|
|
93
196
|
//#region source/cli/commands/build.ts
|
|
94
197
|
async function runBuild(options) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
198
|
+
try {
|
|
199
|
+
await build(await createViteConfig(options, {
|
|
200
|
+
command: "build",
|
|
201
|
+
mode: "production"
|
|
202
|
+
}));
|
|
203
|
+
} catch (error) {
|
|
204
|
+
await logBuildError(options.root, error);
|
|
205
|
+
throw error;
|
|
206
|
+
}
|
|
99
207
|
}
|
|
100
208
|
//#endregion
|
|
101
209
|
//#region source/cli/commands/dev.ts
|
|
@@ -108,14 +216,86 @@ async function runDev(options) {
|
|
|
108
216
|
server.printUrls();
|
|
109
217
|
server.bindCLIShortcuts({ print: true });
|
|
110
218
|
}
|
|
219
|
+
var cliPackageVersion = {
|
|
220
|
+
name: "@clarify-labs/cli",
|
|
221
|
+
version: "0.5.0",
|
|
222
|
+
license: "AGPL-3.0-only",
|
|
223
|
+
type: "module",
|
|
224
|
+
repository: {
|
|
225
|
+
"type": "git",
|
|
226
|
+
"url": "https://github.com/taicode-labs/clarify",
|
|
227
|
+
"directory": "packages/cli"
|
|
228
|
+
},
|
|
229
|
+
main: "output/index.cjs",
|
|
230
|
+
module: "output/index.js",
|
|
231
|
+
types: "output/index.d.ts",
|
|
232
|
+
bin: { "clarify": "bin/clarify.js" },
|
|
233
|
+
exports: {
|
|
234
|
+
".": {
|
|
235
|
+
"types": "./output/index.d.ts",
|
|
236
|
+
"import": "./output/index.js",
|
|
237
|
+
"require": "./output/index.cjs",
|
|
238
|
+
"default": "./output/index.js"
|
|
239
|
+
},
|
|
240
|
+
"./package.json": "./package.json"
|
|
241
|
+
},
|
|
242
|
+
files: [
|
|
243
|
+
"LICENSE",
|
|
244
|
+
"bin",
|
|
245
|
+
"output"
|
|
246
|
+
],
|
|
247
|
+
scripts: {
|
|
248
|
+
"dev": "vite build --watch",
|
|
249
|
+
"build": "vite build",
|
|
250
|
+
"lint": "eslint source/",
|
|
251
|
+
"lint:fix": "eslint source/ --fix",
|
|
252
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
253
|
+
"test": "vitest run",
|
|
254
|
+
"test:watch": "vitest"
|
|
255
|
+
},
|
|
256
|
+
dependencies: {
|
|
257
|
+
"@apidevtools/swagger-parser": "^12.1.0",
|
|
258
|
+
"@clarify-labs/renderer": "workspace:*",
|
|
259
|
+
"@clarify-labs/templates": "workspace:*",
|
|
260
|
+
"@mdx-js/rollup": "^3.1.1",
|
|
261
|
+
"@tailwindcss/vite": "^4.1.11",
|
|
262
|
+
"@vitejs/plugin-react": "^6.0.2",
|
|
263
|
+
"cac": "^7.0.0",
|
|
264
|
+
"github-slugger": "^2.0.0",
|
|
265
|
+
"gray-matter": "^4.0.3",
|
|
266
|
+
"mdast-util-to-string": "^4.0.0",
|
|
267
|
+
"openapi-types": "^12.1.3",
|
|
268
|
+
"react": "^19.1.0",
|
|
269
|
+
"react-dom": "^19.1.0",
|
|
270
|
+
"react-router-dom": "^7.0.0",
|
|
271
|
+
"remark": "^15.0.1",
|
|
272
|
+
"remark-gfm": "^4.0.1",
|
|
273
|
+
"shiki": "0.14.7",
|
|
274
|
+
"unist-util-visit": "^5.1.0",
|
|
275
|
+
"vite": "^8.0.15",
|
|
276
|
+
"zod": "^4.4.3"
|
|
277
|
+
},
|
|
278
|
+
devDependencies: {
|
|
279
|
+
"@mdx-js/mdx": "^3.1.1",
|
|
280
|
+
"typescript": "^5.8.3",
|
|
281
|
+
"vite-plugin-dts": "^4.5.4",
|
|
282
|
+
"vitest": "^4.1.9"
|
|
283
|
+
}
|
|
284
|
+
}.version ?? "0.0.0";
|
|
285
|
+
var cliPackageVersionWithCaret = `^${cliPackageVersion}`;
|
|
111
286
|
//#endregion
|
|
112
287
|
//#region source/cli/commands/init.ts
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
288
|
+
var require = createRequire(import.meta.url);
|
|
289
|
+
function findTemplatesPackagePath() {
|
|
290
|
+
try {
|
|
291
|
+
return require.resolve("@clarify-labs/templates/package.json");
|
|
292
|
+
} catch {
|
|
293
|
+
const workspacePackagePath = resolve(dirname(fileURLToPath(import.meta.url)), "../../../../templates/package.json");
|
|
294
|
+
if (existsSync(workspacePackagePath)) return workspacePackagePath;
|
|
295
|
+
throw new Error("[clarify] Templates package not found.");
|
|
296
|
+
}
|
|
118
297
|
}
|
|
298
|
+
var templatesDirectory = dirname(findTemplatesPackagePath());
|
|
119
299
|
function updatePackageJson(root, force) {
|
|
120
300
|
const packageJsonPath = resolve(root, "package.json");
|
|
121
301
|
const packageJson = existsSync(packageJsonPath) ? JSON.parse(readFileSync(packageJsonPath, "utf-8")) : { type: "module" };
|
|
@@ -124,58 +304,40 @@ function updatePackageJson(root, force) {
|
|
|
124
304
|
if (force || !scripts.build) scripts.build = "clarify build";
|
|
125
305
|
packageJson.scripts = scripts;
|
|
126
306
|
const devDependencies = typeof packageJson.devDependencies === "object" && packageJson.devDependencies !== null ? packageJson.devDependencies : {};
|
|
127
|
-
if (!devDependencies["@clarify-labs/cli"]) devDependencies["@clarify-labs/cli"] =
|
|
307
|
+
if (!devDependencies["@clarify-labs/cli"]) devDependencies["@clarify-labs/cli"] = cliPackageVersionWithCaret;
|
|
128
308
|
packageJson.devDependencies = devDependencies;
|
|
129
309
|
writeFileSync(packageJsonPath, `${JSON.stringify(packageJson, null, 2)}\n`, "utf-8");
|
|
130
310
|
return true;
|
|
131
311
|
}
|
|
132
|
-
function runInit(options, force) {
|
|
133
|
-
const
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
title: 'Clarify Docs',
|
|
139
|
-
description: 'Documentation powered by Clarify',
|
|
140
|
-
theme: { preset: 'default' },
|
|
141
|
-
})
|
|
142
|
-
`, force) ? created : skipped).push("clarify.ts");
|
|
143
|
-
(writeTextFile(resolve(options.root, options.content, "index.mdx"), `---
|
|
144
|
-
title: Welcome
|
|
145
|
-
---
|
|
146
|
-
|
|
147
|
-
# Welcome to Clarify
|
|
148
|
-
|
|
149
|
-
Start writing your documentation in \`${options.content}\`.
|
|
150
|
-
`, force) ? created : skipped).push(`${options.content}/index.mdx`);
|
|
312
|
+
function runInit(options, force, template) {
|
|
313
|
+
const selectedTemplate = resolveTemplate(template);
|
|
314
|
+
const { created } = copyTemplateDirectory(getTemplateDirectory(templatesDirectory, selectedTemplate), options.root, {
|
|
315
|
+
contentDir: options.content,
|
|
316
|
+
force
|
|
317
|
+
});
|
|
151
318
|
if (updatePackageJson(options.root, force)) created.push("package.json");
|
|
152
|
-
console.log(
|
|
319
|
+
console.log(`[clarify] Init complete with ${selectedTemplate} template.`);
|
|
153
320
|
if (created.length > 0) console.log(`[clarify] Created or updated: ${created.join(", ")}`);
|
|
154
|
-
if (skipped.length > 0) console.log(`[clarify] Skipped existing files: ${skipped.join(", ")}. Use --force to overwrite.`);
|
|
155
321
|
}
|
|
156
322
|
//#endregion
|
|
157
323
|
//#region source/cli/options.ts
|
|
324
|
+
function resolvePort(port) {
|
|
325
|
+
if (port === void 0) return void 0;
|
|
326
|
+
const parsedPort = typeof port === "string" ? Number(port) : port;
|
|
327
|
+
if (!Number.isInteger(parsedPort) || parsedPort < 1 || parsedPort > 65535) throw new Error("[clarify] --port must be an integer between 1 and 65535");
|
|
328
|
+
return parsedPort;
|
|
329
|
+
}
|
|
158
330
|
function resolveCliOptions(options) {
|
|
159
331
|
return {
|
|
160
332
|
root: resolve(options.root ?? process.cwd()),
|
|
161
333
|
content: options.content ?? "source",
|
|
162
334
|
output: options.output ?? "output",
|
|
163
335
|
host: options.host,
|
|
164
|
-
port:
|
|
336
|
+
port: resolvePort(options.port),
|
|
165
337
|
open: options.open
|
|
166
338
|
};
|
|
167
339
|
}
|
|
168
340
|
//#endregion
|
|
169
|
-
//#region source/cli/package.ts
|
|
170
|
-
function readPackageVersion() {
|
|
171
|
-
try {
|
|
172
|
-
const packageJsonPath = resolve(dirname(fileURLToPath(import.meta.url)), "../package.json");
|
|
173
|
-
return JSON.parse(readFileSync(packageJsonPath, "utf-8")).version ?? "0.0.0";
|
|
174
|
-
} catch {
|
|
175
|
-
return "0.0.0";
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
//#endregion
|
|
179
341
|
//#region source/cli/index.ts
|
|
180
342
|
function withSharedOptions(command) {
|
|
181
343
|
return command.option("--root <dir>", "Project root directory").option("--content <dir>", "Content directory relative to root").option("--output <dir>", "Build output directory relative to root");
|
|
@@ -185,15 +347,15 @@ function resolveOptions(options) {
|
|
|
185
347
|
}
|
|
186
348
|
async function main() {
|
|
187
349
|
const cli = cac("clarify");
|
|
188
|
-
cli.version(
|
|
350
|
+
cli.version(cliPackageVersion).help();
|
|
189
351
|
withSharedOptions(cli.command("dev", "Start the local documentation server")).option("--host [host]", "Dev server host").option("--port <port>", "Dev server port").option("--open [path]", "Open the dev server in a browser").action(async (options) => {
|
|
190
352
|
await runDev(resolveOptions(options));
|
|
191
353
|
});
|
|
192
354
|
withSharedOptions(cli.command("build", "Build the static documentation site")).action(async (options) => {
|
|
193
355
|
await runBuild(resolveOptions(options));
|
|
194
356
|
});
|
|
195
|
-
withSharedOptions(cli.command("init", "Create a
|
|
196
|
-
runInit(resolveOptions(options), options.force === true);
|
|
357
|
+
withSharedOptions(cli.command("init", "Create a Clarify project scaffold")).option("--force", "Overwrite files created by init").option("--template <name>", "Template to use: minimal, standard, or complete").action((options) => {
|
|
358
|
+
runInit(resolveOptions(options), options.force === true, options.template);
|
|
197
359
|
});
|
|
198
360
|
const args = process.argv.slice(2);
|
|
199
361
|
cli.parse(process.argv, { run: false });
|
|
@@ -204,7 +366,7 @@ async function main() {
|
|
|
204
366
|
await cli.runMatchedCommand();
|
|
205
367
|
}
|
|
206
368
|
main().catch((error) => {
|
|
207
|
-
console.error(error instanceof Error ? error.message : error);
|
|
369
|
+
console.error(error instanceof Error ? error.stack ?? error.message : String(error));
|
|
208
370
|
process.exitCode = 1;
|
|
209
371
|
});
|
|
210
372
|
//#endregion
|
package/output/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","names":[],"sources":["../source/core/vite-config.ts","../source/cli/commands/build.ts","../source/cli/commands/dev.ts","../source/cli/commands/init.ts","../source/cli/options.ts","../source/cli/package.ts","../source/cli/index.ts"],"sourcesContent":["import { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\n\nimport type { ConfigEnv, InlineConfig, Plugin } from 'vite'\n\nimport type { ClarifyBuildOptions } from './options.js'\nimport { clarifyPlugin } from './plugin.js'\nimport { createClarifyRuntimeAliases } from './runtime-deps.js'\nimport { loadClarifyConfig } from './user-config.js'\n\nexport type ClarifyViteConfigOptions = {\n root: string\n content: string\n output: string\n host?: string | boolean\n port?: number\n open?: boolean | string\n}\n\nconst DEFAULT_HTML = '<!doctype html><html lang=\"en\"><head><meta charset=\"UTF-8\" /><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" /><title>Clarify</title></head><body><div id=\"root\"></div></body></html>'\n\nfunction ensureHtmlEntry(root: string): string {\n const projectHtmlPath = resolve(root, 'index.html')\n if (existsSync(projectHtmlPath)) return projectHtmlPath\n\n const generatedHtmlPath = resolve(root, '.clarify/index.html')\n mkdirSync(dirname(generatedHtmlPath), { recursive: true })\n writeFileSync(generatedHtmlPath, DEFAULT_HTML, 'utf-8')\n return generatedHtmlPath\n}\n\nfunction createHtmlFallbackPlugin(): Plugin {\n return {\n name: 'clarify:cli-html-fallback',\n configureServer(server) {\n server.middlewares.use(async (req, res, next) => {\n const requestPath = req.url?.split('?')[0] ?? '/'\n const acceptsHtml = req.headers.accept?.includes('text/html') ?? false\n const hasFileExtension = /\\.[^/]+$/.test(requestPath)\n if (!acceptsHtml || hasFileExtension) {\n next()\n return\n }\n\n try {\n const html = await server.transformIndexHtml(requestPath, DEFAULT_HTML)\n res.statusCode = 200\n res.setHeader('Content-Type', 'text/html; charset=utf-8')\n res.end(html)\n } catch (error) {\n next(error)\n }\n })\n },\n }\n}\n\nexport async function createViteConfig(options: ClarifyViteConfigOptions, env: ConfigEnv): Promise<InlineConfig> {\n const entryHtmlPath = ensureHtmlEntry(options.root)\n const userConfig = await loadClarifyConfig(options.root, env)\n const buildOptions: ClarifyBuildOptions = {\n ...userConfig,\n projectRoot: options.root,\n rootDirectory: options.content,\n outputDirectory: options.output,\n }\n\n return {\n root: options.root,\n configFile: false,\n appType: 'custom',\n resolve: {\n alias: createClarifyRuntimeAliases(),\n },\n plugins: [\n clarifyPlugin(buildOptions),\n createHtmlFallbackPlugin(),\n ],\n server: {\n host: options.host,\n port: options.port,\n open: options.open,\n },\n build: {\n outDir: options.output,\n rolldownOptions: {\n input: {\n index: entryHtmlPath,\n },\n checks: {\n pluginTimings: false,\n },\n output: {\n codeSplitting: {\n groups: [\n {\n name: 'react-vendor',\n test: /node_modules[\\\\/](react|react-dom|react-router|react-router-dom)[\\\\/]/,\n priority: 40,\n },\n {\n name: 'icons-vendor',\n test: /node_modules[\\\\/]lucide-react[\\\\/]/,\n priority: 35,\n },\n {\n name: 'ui-vendor',\n test: /node_modules[\\\\/](@headlessui|framer-motion)[\\\\/]/,\n priority: 30,\n },\n {\n name: 'vendor',\n test: /node_modules[\\\\/]/,\n priority: 10\n },\n ],\n },\n },\n },\n },\n }\n}\n","import { build as viteBuild } from 'vite'\n\nimport { createViteConfig } from '../../core/vite-config.js'\nimport type { ResolvedCliOptions } from '../options.js'\n\nexport async function runBuild(options: ResolvedCliOptions): Promise<void> {\n await viteBuild(await createViteConfig(options, { command: 'build', mode: 'production' }))\n}\n","import { createServer } from 'vite'\n\nimport { createViteConfig } from '../../core/vite-config.js'\nimport type { ResolvedCliOptions } from '../options.js'\n\nexport async function runDev(options: ResolvedCliOptions): Promise<void> {\n const server = await createServer(await createViteConfig(options, { command: 'serve', mode: 'development' }))\n await server.listen()\n server.printUrls()\n server.bindCLIShortcuts({ print: true })\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\n\nimport type { ResolvedCliOptions } from '../options.js'\n\nfunction writeTextFile(filePath: string, content: string, force: boolean): boolean {\n if (existsSync(filePath) && !force) return false\n mkdirSync(dirname(filePath), { recursive: true })\n writeFileSync(filePath, content, 'utf-8')\n return true\n}\n\nfunction updatePackageJson(root: string, force: boolean): boolean {\n const packageJsonPath = resolve(root, 'package.json')\n const packageJson = existsSync(packageJsonPath)\n ? JSON.parse(readFileSync(packageJsonPath, 'utf-8')) as Record<string, unknown>\n : { type: 'module' }\n\n const scripts = typeof packageJson.scripts === 'object' && packageJson.scripts !== null\n ? packageJson.scripts as Record<string, string>\n : {}\n\n if (force || !scripts.dev) scripts.dev = 'clarify dev'\n if (force || !scripts.build) scripts.build = 'clarify build'\n packageJson.scripts = scripts\n\n const devDependencies = typeof packageJson.devDependencies === 'object' && packageJson.devDependencies !== null\n ? packageJson.devDependencies as Record<string, string>\n : {}\n if (!devDependencies['@clarify-labs/cli']) devDependencies['@clarify-labs/cli'] = '^0.2.0'\n packageJson.devDependencies = devDependencies\n\n writeFileSync(packageJsonPath, `${JSON.stringify(packageJson, null, 2)}\\n`, 'utf-8')\n return true\n}\n\nexport function runInit(options: ResolvedCliOptions, force: boolean): void {\n const created: string[] = []\n const skipped: string[] = []\n\n const clarifyConfigCreated = writeTextFile(resolve(options.root, 'clarify.ts'), `import { defineConfig } from '@clarify-labs/cli'\n\nexport default defineConfig({\n title: 'Clarify Docs',\n description: 'Documentation powered by Clarify',\n theme: { preset: 'default' },\n})\n`, force)\n ;(clarifyConfigCreated ? created : skipped).push('clarify.ts')\n\n const contentCreated = writeTextFile(resolve(options.root, options.content, 'index.mdx'), `---\ntitle: Welcome\n---\n\n# Welcome to Clarify\n\nStart writing your documentation in \\`${options.content}\\`.\n`, force)\n ;(contentCreated ? created : skipped).push(`${options.content}/index.mdx`)\n\n const packageJsonUpdated = updatePackageJson(options.root, force)\n if (packageJsonUpdated) created.push('package.json')\n\n console.log('[clarify] Init complete.')\n if (created.length > 0) console.log(`[clarify] Created or updated: ${created.join(', ')}`)\n if (skipped.length > 0) console.log(`[clarify] Skipped existing files: ${skipped.join(', ')}. Use --force to overwrite.`)\n}\n","import { resolve } from 'node:path'\n\nexport type CliOptions = {\n root?: string\n content?: string\n output?: string\n host?: string | boolean\n port?: string | number\n open?: boolean | string\n}\n\nexport type ResolvedCliOptions = {\n root: string\n content: string\n output: string\n host?: string | boolean\n port?: number\n open?: boolean | string\n}\n\nexport function resolveCliOptions(options: CliOptions): ResolvedCliOptions {\n return {\n root: resolve(options.root ?? process.cwd()),\n content: options.content ?? 'source',\n output: options.output ?? 'output',\n host: options.host,\n port: typeof options.port === 'string' ? Number.parseInt(options.port, 10) : options.port,\n open: options.open,\n }\n}\n","import { readFileSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nexport function readPackageVersion(): string {\n try {\n const packageJsonPath = resolve(dirname(fileURLToPath(import.meta.url)), '../package.json')\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8')) as { version?: string }\n return packageJson.version ?? '0.0.0'\n } catch {\n return '0.0.0'\n }\n}\n","#!/usr/bin/env node\nimport { cac } from 'cac'\n\nimport { runBuild } from './commands/build.js'\nimport { runDev } from './commands/dev.js'\nimport { runInit } from './commands/init.js'\nimport { resolveCliOptions, type CliOptions, type ResolvedCliOptions } from './options.js'\nimport { readPackageVersion } from './package.js'\n\nfunction withSharedOptions(command: ReturnType<ReturnType<typeof cac>['command']>) {\n return command\n .option('--root <dir>', 'Project root directory')\n .option('--content <dir>', 'Content directory relative to root')\n .option('--output <dir>', 'Build output directory relative to root')\n}\n\nfunction resolveOptions(options: CliOptions): ResolvedCliOptions {\n return resolveCliOptions(options)\n}\n\nasync function main(): Promise<void> {\n const cli = cac('clarify')\n\n cli\n .version(readPackageVersion())\n .help()\n\n withSharedOptions(cli.command('dev', 'Start the local documentation server'))\n .option('--host [host]', 'Dev server host')\n .option('--port <port>', 'Dev server port')\n .option('--open [path]', 'Open the dev server in a browser')\n .action(async (options: CliOptions) => {\n await runDev(resolveOptions(options))\n })\n\n withSharedOptions(cli.command('build', 'Build the static documentation site'))\n .action(async (options: CliOptions) => {\n await runBuild(resolveOptions(options))\n })\n\n withSharedOptions(cli.command('init', 'Create a minimal Clarify project scaffold'))\n .option('--force', 'Overwrite files created by init')\n .action((options: CliOptions & { force?: boolean }) => {\n runInit(resolveOptions(options), options.force === true)\n })\n\n const args = process.argv.slice(2)\n cli.parse(process.argv, { run: false })\n\n if (args.length === 0) {\n cli.outputHelp()\n return\n }\n\n await cli.runMatchedCommand()\n}\n\nmain().catch(error => {\n console.error(error instanceof Error ? error.message : error)\n process.exitCode = 1\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","names":[],"sources":["../source/core/log.ts","../source/core/vite-config.ts","../source/cli/commands/build.ts","../source/cli/commands/dev.ts","../package.json","../source/cli/package.ts","../source/cli/commands/init.ts","../source/cli/options.ts","../source/cli/index.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { readFile, writeFile } from 'node:fs/promises'\nimport { dirname, join } from 'node:path'\n\nconst LOG_FILE_NAME = '.clarify.log'\nconst DEFAULT_LOG_ENTRIES = 50\nconst ENTRY_SEPARATOR = '\\n\\n---\\n\\n'\n\nfunction getMaxLogEntries(): number {\n const envValue = process.env.CLARIFY_LOG_MAX_ENTRIES\n if (!envValue) return DEFAULT_LOG_ENTRIES\n const parsed = Number(envValue)\n return Number.isInteger(parsed) && parsed > 0 ? parsed : DEFAULT_LOG_ENTRIES\n}\n\nfunction normalizeErrorMessage(error: unknown): string {\n if (error === undefined) return 'undefined'\n if (error === null) return 'null'\n if (error instanceof Error) return error.message\n if (typeof error === 'object') {\n if ('message' in error && typeof (error as { message?: unknown }).message === 'string') {\n return (error as { message: string }).message\n }\n try {\n return JSON.stringify(error)\n } catch {\n return String(error)\n }\n }\n return String(error)\n}\n\nfunction normalizeErrorStack(error: unknown): string | undefined {\n if (error instanceof Error) {\n return error.stack\n }\n return undefined\n}\n\nfunction formatLogEntry(root: string, error: unknown): string {\n const timestamp = new Date().toISOString()\n const message = normalizeErrorMessage(error)\n const stack = normalizeErrorStack(error)\n\n return [`=== Clarify build error ===`, `Timestamp: ${timestamp}`, `Project root: ${root}`, `Error: ${message}`, stack ? `Stack:\\n${stack}` : undefined]\n .filter(Boolean)\n .join('\\n')\n}\n\nexport async function logBuildError(root: string, error: unknown, maxEntries?: number): Promise<void> {\n const logPath = join(root, LOG_FILE_NAME)\n const entry = formatLogEntry(root, error)\n const max = maxEntries ?? getMaxLogEntries()\n\n let entries: string[] = []\n if (existsSync(logPath)) {\n try {\n const content = await readFile(logPath, 'utf8')\n entries = content\n .split(ENTRY_SEPARATOR)\n .map((item) => item.trim())\n .filter(Boolean)\n } catch {\n entries = []\n }\n }\n\n entries.push(entry)\n if (entries.length > max) {\n entries = entries.slice(-max)\n }\n\n mkdirSync(dirname(logPath), { recursive: true })\n await writeFile(logPath, entries.join(ENTRY_SEPARATOR) + '\\n', 'utf8')\n}\n\nexport function logBuildErrorSync(root: string, error: unknown, maxEntries?: number): void {\n const logPath = join(root, LOG_FILE_NAME)\n const entry = formatLogEntry(root, error)\n const max = maxEntries ?? getMaxLogEntries()\n\n let entries: string[] = []\n if (existsSync(logPath)) {\n try {\n const content = readFileSync(logPath, 'utf8')\n entries = content\n .split(ENTRY_SEPARATOR)\n .map((item) => item.trim())\n .filter(Boolean)\n } catch {\n entries = []\n }\n }\n\n entries.push(entry)\n if (entries.length > max) {\n entries = entries.slice(-max)\n }\n\n mkdirSync(dirname(logPath), { recursive: true })\n writeFileSync(logPath, entries.join(ENTRY_SEPARATOR) + '\\n', 'utf8')\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\n\nimport { createLogger } from 'vite'\nimport type { ConfigEnv, InlineConfig, Plugin, LogLevel, Logger, LogOptions, LogErrorOptions, LogType } from 'vite'\n\nimport { logBuildErrorSync } from './log.js'\nimport type { ClarifyBuildOptions } from './options.js'\nimport { clarifyPlugin } from './plugin.js'\nimport { createClarifyRuntimeAliases } from './runtime-deps.js'\nimport { loadClarifyConfig } from './user-config.js'\n\nexport type ClarifyViteConfigOptions = {\n root: string\n content: string\n output: string\n host?: string | boolean\n port?: number\n open?: boolean | string\n}\n\nconst DEFAULT_HTML = '<!doctype html><html lang=\"en\"><head><meta charset=\"UTF-8\" /><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" /><title>Clarify</title></head><body><div id=\"root\"></div></body></html>'\n\nfunction ensureHtmlEntry(root: string): string {\n const projectHtmlPath = resolve(root, 'index.html')\n if (existsSync(projectHtmlPath)) return projectHtmlPath\n\n const generatedHtmlPath = resolve(root, '.clarify/index.html')\n mkdirSync(dirname(generatedHtmlPath), { recursive: true })\n writeFileSync(generatedHtmlPath, DEFAULT_HTML, 'utf-8')\n return generatedHtmlPath\n}\n\nfunction createClarifyLogger(root: string, env: ConfigEnv, level: LogLevel): Logger | undefined {\n if (env.command !== 'build') return undefined\n\n const baseLogger = createLogger(level, { allowClearScreen: true })\n\n return {\n info(msg: string, options?: LogOptions) {\n baseLogger.info(msg, options)\n },\n warn(msg: string, options?: LogOptions) {\n baseLogger.warn(msg, options)\n },\n warnOnce(msg: string, options?: LogOptions) {\n baseLogger.warnOnce(msg, options)\n },\n error(msg: string, options?: LogErrorOptions) {\n baseLogger.error(msg, options)\n if (options?.error) {\n logBuildErrorSync(root, options.error)\n } else {\n logBuildErrorSync(root, typeof msg === 'string' ? new Error(msg) : msg)\n }\n },\n clearScreen(type: LogType) {\n baseLogger.clearScreen(type)\n },\n hasErrorLogged(error: Error | unknown) {\n return baseLogger.hasErrorLogged(error as Error)\n },\n get hasWarned() {\n return baseLogger.hasWarned\n },\n }\n}\n\nfunction createHtmlFallbackPlugin(): Plugin {\n return {\n name: 'clarify:cli-html-fallback',\n configureServer(server) {\n server.middlewares.use(async (req, res, next) => {\n const requestPath = req.url?.split('?')[0] ?? '/'\n const acceptsHtml = req.headers.accept?.includes('text/html') ?? false\n const hasFileExtension = /\\.[^/]+$/.test(requestPath)\n if (!acceptsHtml || hasFileExtension) {\n next()\n return\n }\n\n try {\n const html = await server.transformIndexHtml(requestPath, DEFAULT_HTML)\n res.statusCode = 200\n res.setHeader('Content-Type', 'text/html; charset=utf-8')\n res.end(html)\n } catch (error) {\n next(error)\n }\n })\n },\n }\n}\n\nexport async function createViteConfig(options: ClarifyViteConfigOptions, env: ConfigEnv): Promise<InlineConfig> {\n const entryHtmlPath = ensureHtmlEntry(options.root)\n const userConfig = await loadClarifyConfig(options.root, env)\n const buildOptions: ClarifyBuildOptions = {\n ...userConfig,\n projectRoot: options.root,\n rootDirectory: options.content,\n outputDirectory: options.output,\n }\n\n return {\n root: options.root,\n configFile: false,\n appType: 'custom',\n resolve: {\n alias: createClarifyRuntimeAliases(),\n },\n customLogger: createClarifyLogger(options.root, env, 'info'),\n plugins: [\n clarifyPlugin(buildOptions),\n createHtmlFallbackPlugin(),\n ],\n server: {\n host: options.host,\n port: options.port,\n open: options.open,\n },\n build: {\n outDir: options.output,\n rolldownOptions: {\n input: {\n index: entryHtmlPath,\n },\n checks: {\n pluginTimings: false,\n },\n output: {\n codeSplitting: {\n groups: [\n {\n name: 'react-vendor',\n test: /node_modules[\\\\/](react|react-dom|react-router|react-router-dom)[\\\\/]/,\n priority: 40,\n },\n {\n name: 'icons-vendor',\n test: /node_modules[\\\\/]lucide-react[\\\\/]/,\n priority: 35,\n },\n {\n name: 'ui-vendor',\n test: /node_modules[\\\\/](@headlessui|framer-motion)[\\\\/]/,\n priority: 30,\n },\n {\n name: 'vendor',\n test: /node_modules[\\\\/]/,\n priority: 10\n },\n ],\n },\n },\n },\n },\n }\n}\n","import { build as viteBuild } from 'vite'\n\nimport { logBuildError } from '../../core/log.js'\nimport { createViteConfig } from '../../core/vite-config.js'\nimport type { ResolvedCliOptions } from '../options.js'\n\nexport async function runBuild(options: ResolvedCliOptions): Promise<void> {\n try {\n await viteBuild(await createViteConfig(options, { command: 'build', mode: 'production' }))\n } catch (error) {\n await logBuildError(options.root, error)\n throw error\n }\n}\n","import { createServer } from 'vite'\n\nimport { createViteConfig } from '../../core/vite-config.js'\nimport type { ResolvedCliOptions } from '../options.js'\n\nexport async function runDev(options: ResolvedCliOptions): Promise<void> {\n const server = await createServer(await createViteConfig(options, { command: 'serve', mode: 'development' }))\n await server.listen()\n server.printUrls()\n server.bindCLIShortcuts({ print: true })\n}\n","{\n \"name\": \"@clarify-labs/cli\",\n \"version\": \"0.5.0\",\n \"license\": \"AGPL-3.0-only\",\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/taicode-labs/clarify\",\n \"directory\": \"packages/cli\"\n },\n \"main\": \"output/index.cjs\",\n \"module\": \"output/index.js\",\n \"types\": \"output/index.d.ts\",\n \"bin\": {\n \"clarify\": \"bin/clarify.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./output/index.d.ts\",\n \"import\": \"./output/index.js\",\n \"require\": \"./output/index.cjs\",\n \"default\": \"./output/index.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"files\": [\n \"LICENSE\",\n \"bin\",\n \"output\"\n ],\n \"scripts\": {\n \"dev\": \"vite build --watch\",\n \"build\": \"vite build\",\n \"lint\": \"eslint source/\",\n \"lint:fix\": \"eslint source/ --fix\",\n \"typecheck\": \"tsc -p tsconfig.json --noEmit\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\"\n },\n \"dependencies\": {\n \"@apidevtools/swagger-parser\": \"^12.1.0\",\n \"@clarify-labs/renderer\": \"workspace:*\",\n \"@clarify-labs/templates\": \"workspace:*\",\n \"@mdx-js/rollup\": \"^3.1.1\",\n \"@tailwindcss/vite\": \"^4.1.11\",\n \"@vitejs/plugin-react\": \"^6.0.2\",\n \"cac\": \"^7.0.0\",\n \"github-slugger\": \"^2.0.0\",\n \"gray-matter\": \"^4.0.3\",\n \"mdast-util-to-string\": \"^4.0.0\",\n \"openapi-types\": \"^12.1.3\",\n \"react\": \"^19.1.0\",\n \"react-dom\": \"^19.1.0\",\n \"react-router-dom\": \"^7.0.0\",\n \"remark\": \"^15.0.1\",\n \"remark-gfm\": \"^4.0.1\",\n \"shiki\": \"0.14.7\",\n \"unist-util-visit\": \"^5.1.0\",\n \"vite\": \"^8.0.15\",\n \"zod\": \"^4.4.3\"\n },\n \"devDependencies\": {\n \"@mdx-js/mdx\": \"^3.1.1\",\n \"typescript\": \"^5.8.3\",\n \"vite-plugin-dts\": \"^4.5.4\",\n \"vitest\": \"^4.1.9\"\n }\n}\n","import packageJson from '../../package.json' with { type: 'json' }\n\nexport const cliPackageJson = packageJson as { version?: string }\nexport const cliPackageVersion = cliPackageJson.version ?? '0.0.0'\nexport const cliPackageVersionWithCaret = `^${cliPackageVersion}`\n\nexport function readPackageVersion(): string {\n return cliPackageVersion\n}\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { dirname, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { copyTemplateDirectory, getTemplateDirectory, resolveTemplate } from '@clarify-labs/templates'\n\nimport type { ResolvedCliOptions } from '../options.js'\nimport { cliPackageVersionWithCaret } from '../package.js'\n\nconst require = createRequire(import.meta.url)\n\nfunction findTemplatesPackagePath(): string {\n try {\n return require.resolve('@clarify-labs/templates/package.json')\n } catch {\n const currentDirectory = dirname(fileURLToPath(import.meta.url))\n const workspacePackagePath = resolve(currentDirectory, '../../../../templates/package.json')\n if (existsSync(workspacePackagePath)) return workspacePackagePath\n throw new Error('[clarify] Templates package not found.')\n }\n}\n\nconst templatesPackagePath = findTemplatesPackagePath()\nconst templatesDirectory = dirname(templatesPackagePath)\n\nfunction updatePackageJson(root: string, force: boolean): boolean {\n const packageJsonPath = resolve(root, 'package.json')\n const packageJson = existsSync(packageJsonPath)\n ? JSON.parse(readFileSync(packageJsonPath, 'utf-8')) as Record<string, unknown>\n : { type: 'module' }\n\n const scripts = typeof packageJson.scripts === 'object' && packageJson.scripts !== null\n ? packageJson.scripts as Record<string, string>\n : {}\n\n if (force || !scripts.dev) scripts.dev = 'clarify dev'\n if (force || !scripts.build) scripts.build = 'clarify build'\n packageJson.scripts = scripts\n\n const devDependencies = typeof packageJson.devDependencies === 'object' && packageJson.devDependencies !== null\n ? packageJson.devDependencies as Record<string, string>\n : {}\n if (!devDependencies['@clarify-labs/cli']) devDependencies['@clarify-labs/cli'] = cliPackageVersionWithCaret\n packageJson.devDependencies = devDependencies\n\n writeFileSync(packageJsonPath, `${JSON.stringify(packageJson, null, 2)}\\n`, 'utf-8')\n return true\n}\n\nexport function runInit(options: ResolvedCliOptions, force: boolean, template?: string): void {\n const selectedTemplate = resolveTemplate(template)\n const templateDirectory = getTemplateDirectory(templatesDirectory, selectedTemplate)\n const { created } = copyTemplateDirectory(templateDirectory, options.root, {\n contentDir: options.content,\n force,\n })\n\n const packageJsonUpdated = updatePackageJson(options.root, force)\n if (packageJsonUpdated) created.push('package.json')\n\n console.log(`[clarify] Init complete with ${selectedTemplate} template.`)\n if (created.length > 0) console.log(`[clarify] Created or updated: ${created.join(', ')}`)\n}\n","import { resolve } from 'node:path'\n\nexport type CliOptions = {\n root?: string\n content?: string\n output?: string\n host?: string | boolean\n port?: string | number\n open?: boolean | string\n}\n\nexport type ResolvedCliOptions = {\n root: string\n content: string\n output: string\n host?: string | boolean\n port?: number\n open?: boolean | string\n}\n\nfunction resolvePort(port: CliOptions['port']): number | undefined {\n if (port === undefined) return undefined\n\n const parsedPort = typeof port === 'string' ? Number(port) : port\n if (!Number.isInteger(parsedPort) || parsedPort < 1 || parsedPort > 65535) {\n throw new Error('[clarify] --port must be an integer between 1 and 65535')\n }\n\n return parsedPort\n}\n\nexport function resolveCliOptions(options: CliOptions): ResolvedCliOptions {\n return {\n root: resolve(options.root ?? process.cwd()),\n content: options.content ?? 'source',\n output: options.output ?? 'output',\n host: options.host,\n port: resolvePort(options.port),\n open: options.open,\n }\n}\n","#!/usr/bin/env node\nimport { cac } from 'cac'\n\nimport { runBuild } from './commands/build.js'\nimport { runDev } from './commands/dev.js'\nimport { runInit } from './commands/init.js'\nimport { resolveCliOptions, type CliOptions, type ResolvedCliOptions } from './options.js'\nimport { cliPackageVersion } from './package.js'\n\ntype InitCommandOptions = CliOptions & {\n force?: boolean\n template?: string\n}\n\nfunction withSharedOptions(command: ReturnType<ReturnType<typeof cac>['command']>) {\n return command\n .option('--root <dir>', 'Project root directory')\n .option('--content <dir>', 'Content directory relative to root')\n .option('--output <dir>', 'Build output directory relative to root')\n}\n\nfunction resolveOptions(options: CliOptions): ResolvedCliOptions {\n return resolveCliOptions(options)\n}\n\nasync function main(): Promise<void> {\n const cli = cac('clarify')\n\n cli\n .version(cliPackageVersion)\n .help()\n\n withSharedOptions(cli.command('dev', 'Start the local documentation server'))\n .option('--host [host]', 'Dev server host')\n .option('--port <port>', 'Dev server port')\n .option('--open [path]', 'Open the dev server in a browser')\n .action(async (options: CliOptions) => {\n await runDev(resolveOptions(options))\n })\n\n withSharedOptions(cli.command('build', 'Build the static documentation site'))\n .action(async (options: CliOptions) => {\n await runBuild(resolveOptions(options))\n })\n\n withSharedOptions(cli.command('init', 'Create a Clarify project scaffold'))\n .option('--force', 'Overwrite files created by init')\n .option('--template <name>', 'Template to use: minimal, standard, or complete')\n .action((options: InitCommandOptions) => {\n runInit(resolveOptions(options), options.force === true, options.template)\n })\n\n const args = process.argv.slice(2)\n cli.parse(process.argv, { run: false })\n\n if (args.length === 0) {\n cli.outputHelp()\n return\n }\n\n await cli.runMatchedCommand()\n}\n\nmain().catch(error => {\n console.error(error instanceof Error ? error.stack ?? error.message : String(error))\n process.exitCode = 1\n})\n"],"mappings":"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"}
|
|
@@ -6,14 +6,16 @@ export declare const VIRTUAL_OPENAPI_REGISTRY = "virtual:clarify-openapi-registr
|
|
|
6
6
|
export declare const VIRTUAL_CLIENT_ENTRY = "virtual:clarify-entry-client";
|
|
7
7
|
export declare const RESOLVED_CLIENT_ENTRY: string;
|
|
8
8
|
export type VirtualModules = Map<string, string>;
|
|
9
|
+
type BuildVirtualModulesArgs = {
|
|
10
|
+
projectConfig: ResolvedProjectConfig;
|
|
11
|
+
generateOptions: ResolvedBuildOptions;
|
|
12
|
+
routes: ContentRoute[];
|
|
13
|
+
navigation?: NavigationTree;
|
|
14
|
+
};
|
|
9
15
|
export declare function resolveVirtualId(id: string): string;
|
|
10
16
|
export declare function stripVirtualPrefix(id: string): string;
|
|
11
17
|
export declare function generateConfigModule(projectConfig: ResolvedProjectConfig, buildOptions: ResolvedBuildOptions): string;
|
|
12
18
|
export declare function generateRoutesModule(routes: ContentRoute[], resolvedNavigation?: NavigationTree, projectConfig?: ResolvedProjectConfig, mode?: 'client' | 'server'): string;
|
|
13
19
|
export declare function createClientEntryModule(): string;
|
|
14
|
-
export declare function buildVirtualModules(args:
|
|
15
|
-
|
|
16
|
-
generateOptions: ResolvedBuildOptions;
|
|
17
|
-
routes: ContentRoute[];
|
|
18
|
-
navigation?: NavigationTree;
|
|
19
|
-
}): VirtualModules;
|
|
20
|
+
export declare function buildVirtualModules(args: BuildVirtualModulesArgs): VirtualModules;
|
|
21
|
+
export {};
|
package/output/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_plugin = require("./plugin-
|
|
2
|
+
const require_plugin = require("./plugin-DnD0L83F.cjs");
|
|
3
3
|
exports.clarifyPlugin = require_plugin.clarifyPlugin;
|
|
4
4
|
exports.defineConfig = require_plugin.defineConfig;
|
package/output/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as defineConfig, t as clarifyPlugin } from "./plugin-
|
|
1
|
+
import { n as defineConfig, t as clarifyPlugin } from "./plugin-PEEknlAO.js";
|
|
2
2
|
export { clarifyPlugin, defineConfig };
|
package/output/parsers/mdx.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { default as remarkGfm } from 'remark-gfm';
|
|
2
1
|
type HastNode = {
|
|
3
2
|
type: string;
|
|
4
3
|
tagName?: string;
|
|
@@ -9,6 +8,6 @@ type HastNode = {
|
|
|
9
8
|
export declare function rehypeParseCodeBlocks(): (tree: HastNode) => void;
|
|
10
9
|
export declare function rehypeShiki(): (tree: HastNode) => Promise<void>;
|
|
11
10
|
export declare function rehypeSlugSections(): (tree: HastNode) => void;
|
|
12
|
-
export declare const remarkPlugins:
|
|
11
|
+
export declare const remarkPlugins: typeof import('remark-gfm').default[];
|
|
13
12
|
export declare const rehypePlugins: (typeof rehypeSlugSections)[];
|
|
14
13
|
export {};
|
|
@@ -31,11 +31,10 @@ _vitejs_plugin_react = __toESM(_vitejs_plugin_react, 1);
|
|
|
31
31
|
let github_slugger = require("github-slugger");
|
|
32
32
|
github_slugger = __toESM(github_slugger, 1);
|
|
33
33
|
let mdast_util_to_string = require("mdast-util-to-string");
|
|
34
|
-
let remark_gfm = require("remark-gfm");
|
|
35
|
-
remark_gfm = __toESM(remark_gfm, 1);
|
|
36
34
|
let shiki = require("shiki");
|
|
37
35
|
shiki = __toESM(shiki, 1);
|
|
38
36
|
let unist_util_visit = require("unist-util-visit");
|
|
37
|
+
let _clarify_labs_renderer = require("@clarify-labs/renderer");
|
|
39
38
|
let remark = require("remark");
|
|
40
39
|
let gray_matter = require("gray-matter");
|
|
41
40
|
gray_matter = __toESM(gray_matter, 1);
|
|
@@ -123,7 +122,7 @@ function rehypeSlugSections() {
|
|
|
123
122
|
});
|
|
124
123
|
};
|
|
125
124
|
}
|
|
126
|
-
var remarkPlugins =
|
|
125
|
+
var remarkPlugins = _clarify_labs_renderer.markdownRemarkPlugins;
|
|
127
126
|
var rehypePlugins = [
|
|
128
127
|
rehypeSlugSections,
|
|
129
128
|
rehypeParseCodeBlocks,
|
|
@@ -667,10 +666,10 @@ function generateOpenAPIRegistryModule(openApis) {
|
|
|
667
666
|
}
|
|
668
667
|
function generateOpenAPIModule(spec) {
|
|
669
668
|
return `import { createElement } from 'react';
|
|
670
|
-
import {
|
|
669
|
+
import { OpenApiDocument } from '@clarify-labs/renderer';
|
|
671
670
|
const spec = ${JSON.stringify(spec)};
|
|
672
671
|
export default function OpenApiRoutePage() {
|
|
673
|
-
return createElement(
|
|
672
|
+
return createElement(OpenApiDocument, { spec });
|
|
674
673
|
}`;
|
|
675
674
|
}
|
|
676
675
|
function generateOpenAPIErrorModule(diagnostic) {
|
|
@@ -679,7 +678,7 @@ const diagnostic = ${JSON.stringify(diagnostic)};
|
|
|
679
678
|
export default function OpenApiErrorRoutePage() {
|
|
680
679
|
return createElement('article', { className: 'flex h-full flex-col pt-16 pb-10' },
|
|
681
680
|
createElement('div', { className: 'prose max-w-none flex-auto dark:prose-invert' },
|
|
682
|
-
createElement('p', { className: 'mb-3
|
|
681
|
+
createElement('p', { className: 'mb-3 text-xs/6 font-medium tracking-widest text-red-500 uppercase dark:text-red-400' }, 'OpenAPI Error'),
|
|
683
682
|
createElement('h1', null, diagnostic.title),
|
|
684
683
|
createElement('p', { className: 'lead' }, diagnostic.message),
|
|
685
684
|
diagnostic.filePath ? createElement('div', { className: 'not-prose mt-6 rounded-lg border border-zinc-200 bg-zinc-50 p-4 text-sm dark:border-white/10 dark:bg-white/5' },
|
|
@@ -688,7 +687,7 @@ export default function OpenApiErrorRoutePage() {
|
|
|
688
687
|
) : null,
|
|
689
688
|
diagnostic.cause ? createElement('div', { className: 'not-prose mt-4 rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-800 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-200' },
|
|
690
689
|
createElement('div', { className: 'mb-1 font-semibold' }, 'Why it happened'),
|
|
691
|
-
createElement('pre', { className: 'whitespace-pre-wrap break-words
|
|
690
|
+
createElement('pre', { className: 'whitespace-pre-wrap break-words text-xs' }, diagnostic.cause)
|
|
692
691
|
) : null
|
|
693
692
|
)
|
|
694
693
|
);
|
|
@@ -1229,8 +1228,11 @@ function generateConfigModule(projectConfig, buildOptions) {
|
|
|
1229
1228
|
...buildOptions
|
|
1230
1229
|
})};`;
|
|
1231
1230
|
}
|
|
1231
|
+
function moduleSpecifier(value) {
|
|
1232
|
+
return JSON.stringify(value);
|
|
1233
|
+
}
|
|
1232
1234
|
function generateRoutesModule(routes, resolvedNavigation, projectConfig, mode = "client") {
|
|
1233
|
-
const imports = mode === "server" ? routes.map((r, i) => `import Page${i} from
|
|
1235
|
+
const imports = mode === "server" ? routes.map((r, i) => `import Page${i} from ${moduleSpecifier(r.virtualModuleId)};`).join("\n") : "";
|
|
1234
1236
|
const routesArray = routes.map((r, i) => {
|
|
1235
1237
|
const sections = r.sections && r.sections.length > 0 ? `, sections: ${JSON.stringify(r.sections.map((s) => ({
|
|
1236
1238
|
id: s.id,
|
|
@@ -1245,9 +1247,9 @@ function generateRoutesModule(routes, resolvedNavigation, projectConfig, mode =
|
|
|
1245
1247
|
const alternates = r.alternates ? `, alternates: ${JSON.stringify(r.alternates)}` : "";
|
|
1246
1248
|
const description = r.description ? `, description: ${JSON.stringify(r.description)}` : "";
|
|
1247
1249
|
const keywords = r.keywords && r.keywords.length > 0 ? `, keywords: ${JSON.stringify(r.keywords)}` : "";
|
|
1248
|
-
const component = mode === "server" ? `Page${i}` : `() => import(
|
|
1250
|
+
const component = mode === "server" ? `Page${i}` : `() => import(${moduleSpecifier(r.virtualModuleId)})`;
|
|
1249
1251
|
const lazy = mode === "client" ? ", lazy: true" : "";
|
|
1250
|
-
return ` { path: ${JSON.stringify(r.path)}, title: ${JSON.stringify(r.title)}, component: ${component}${lazy}, kind:
|
|
1252
|
+
return ` { path: ${JSON.stringify(r.path)}, title: ${JSON.stringify(r.title)}, component: ${component}${lazy}, kind: ${JSON.stringify(r.kind)}${basePath}${locale}${isFallback}${alternates}${description}${keywords}${sections}${contentArtifactUrl} }`;
|
|
1251
1253
|
}).join(",\n");
|
|
1252
1254
|
const navigation = resolvedNavigation ?? (projectConfig?.tabs ? projectConfig.i18n ? buildLocalizedNavigationFromTabsConfig(routes, projectConfig.tabs, projectConfig.i18n) ?? {} : buildNavigationFromTabsConfig(routes, projectConfig.tabs) : buildNavigation(routes));
|
|
1253
1255
|
return `${imports}\n\nexport const routes = [\n${routesArray}\n];\n\nexport const navigation = ${JSON.stringify(navigation, null, 2)};\n`;
|
|
@@ -1271,7 +1273,7 @@ function buildVirtualModules(args) {
|
|
|
1271
1273
|
modules.set(RESOLVED_CLIENT_ENTRY, createClientEntryModule());
|
|
1272
1274
|
for (const route of args.routes) {
|
|
1273
1275
|
if (route.kind === "openapi") continue;
|
|
1274
|
-
modules.set(route.virtualModuleId, `export { default } from
|
|
1276
|
+
modules.set(route.virtualModuleId, `export { default } from ${moduleSpecifier(route.filePath)};`);
|
|
1275
1277
|
}
|
|
1276
1278
|
return modules;
|
|
1277
1279
|
}
|
|
@@ -1576,4 +1578,4 @@ Object.defineProperty(exports, "loadClarifyConfig", {
|
|
|
1576
1578
|
}
|
|
1577
1579
|
});
|
|
1578
1580
|
|
|
1579
|
-
//# sourceMappingURL=plugin-
|
|
1581
|
+
//# sourceMappingURL=plugin-DnD0L83F.cjs.map
|