@aravindc26/velu 0.12.8 → 0.12.10

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.
Files changed (76) hide show
  1. package/package.json +1 -1
  2. package/src/build.ts +13 -0
  3. package/src/cli.ts +60 -11
  4. package/src/engine/app/(docs)/[...slug]/layout.tsx +21 -537
  5. package/src/engine/app/_preview/[sessionId]/[...slug]/layout.tsx +96 -0
  6. package/src/engine/app/_preview/[sessionId]/[...slug]/page.tsx +298 -0
  7. package/src/engine/app/_preview/[sessionId]/layout.tsx +56 -0
  8. package/src/{preview-engine/app → engine/app/_preview}/[sessionId]/page.tsx +7 -3
  9. package/src/{preview-engine/app → engine/app/_preview}/api/sessions/[sessionId]/assets/[...path]/route.ts +1 -1
  10. package/src/{preview-engine/app → engine/app/_preview}/api/sessions/[sessionId]/init/route.ts +2 -2
  11. package/src/{preview-engine/app → engine/app/_preview}/api/sessions/[sessionId]/route.ts +3 -3
  12. package/src/{preview-engine/app → engine/app/_preview}/api/sessions/[sessionId]/sync/route.ts +2 -2
  13. package/src/{preview-engine/app → engine/app/_preview}/layout.tsx +4 -1
  14. package/src/engine/app/global.css +0 -3623
  15. package/src/engine/app/layout.tsx +4 -3
  16. package/src/engine/components/sidebar-links.tsx +11 -5
  17. package/src/engine/lib/docs-layout.tsx +605 -0
  18. package/src/engine/lib/layout.shared.ts +7 -7
  19. package/src/engine/lib/preview-config.ts +129 -0
  20. package/src/{preview-engine/lib/content-generator.ts → engine/lib/preview-content.ts} +238 -42
  21. package/src/engine/lib/source.ts +80 -97
  22. package/src/engine/lib/velu.ts +79 -55
  23. package/src/engine/mdx-components.tsx +14 -650
  24. package/src/engine/source.config.ts +11 -89
  25. package/src/engine/tsconfig.json +1 -0
  26. package/src/engine-core/components/assistant.tsx +361 -0
  27. package/src/engine-core/components/banner.tsx +80 -0
  28. package/src/engine-core/components/changelog-filters.tsx +114 -0
  29. package/src/engine-core/components/code-group.tsx +383 -0
  30. package/src/engine-core/components/color.tsx +118 -0
  31. package/src/engine-core/components/copy-page.tsx +223 -0
  32. package/src/engine-core/components/dropdown-switcher.tsx +142 -0
  33. package/src/engine-core/components/expandable.tsx +77 -0
  34. package/src/engine-core/components/header-tab-link.tsx +43 -0
  35. package/src/engine-core/components/icon.tsx +136 -0
  36. package/src/engine-core/components/image-zoom-fallback.tsx +147 -0
  37. package/src/engine-core/components/image.tsx +111 -0
  38. package/src/engine-core/components/lang-switcher.tsx +101 -0
  39. package/src/engine-core/components/manual-api-playground.tsx +154 -0
  40. package/src/engine-core/components/mermaid.tsx +142 -0
  41. package/src/engine-core/components/openapi-toc-sync.tsx +59 -0
  42. package/src/engine-core/components/openapi.tsx +1682 -0
  43. package/src/engine-core/components/page-feedback-api.test.ts +83 -0
  44. package/src/engine-core/components/page-feedback-api.ts +89 -0
  45. package/src/engine-core/components/page-feedback.tsx +200 -0
  46. package/src/engine-core/components/product-switcher.tsx +107 -0
  47. package/src/engine-core/components/prompt.tsx +90 -0
  48. package/src/engine-core/components/providers.tsx +21 -0
  49. package/src/engine-core/components/search.tsx +318 -0
  50. package/src/engine-core/components/sidebar-links.tsx +54 -0
  51. package/src/engine-core/components/synced-tabs.tsx +57 -0
  52. package/src/engine-core/components/theme-toggle.tsx +39 -0
  53. package/src/engine-core/components/toc-examples.tsx +110 -0
  54. package/src/engine-core/components/version-switcher.tsx +95 -0
  55. package/src/engine-core/components/view.tsx +344 -0
  56. package/src/engine-core/css/assistant.css +326 -0
  57. package/src/engine-core/css/copy-page.css +206 -0
  58. package/src/engine-core/css/search.css +142 -0
  59. package/src/engine-core/css/shared.css +3628 -0
  60. package/src/engine-core/lib/remark-plugins.ts +102 -0
  61. package/src/engine-core/lib/source-plugins.ts +105 -0
  62. package/src/engine-core/mdx-components.tsx +654 -0
  63. package/src/engine-core/types.ts +49 -0
  64. package/src/preview-engine/app/[sessionId]/[...slug]/page.tsx +0 -41
  65. package/src/preview-engine/app/[sessionId]/layout.tsx +0 -26
  66. package/src/preview-engine/app/global.css +0 -29
  67. package/src/preview-engine/lib/session-config.ts +0 -86
  68. package/src/preview-engine/lib/session-layout.ts +0 -190
  69. package/src/preview-engine/lib/source.ts +0 -60
  70. package/src/preview-engine/next.config.mjs +0 -20
  71. package/src/preview-engine/postcss.config.mjs +0 -8
  72. package/src/preview-engine/source.config.ts +0 -26
  73. package/src/preview-engine/tsconfig.json +0 -32
  74. package/src/preview-engine/tsconfig.tsbuildinfo +0 -1
  75. /package/src/{preview-engine/app → engine/app/_preview}/page.tsx +0 -0
  76. /package/src/{preview-engine/lib/auth.ts → engine/lib/preview-auth.ts} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aravindc26/velu",
3
- "version": "0.12.8",
3
+ "version": "0.12.10",
4
4
  "description": "A modern documentation site generator powered by Markdown and JSON configuration",
5
5
  "type": "module",
6
6
  "license": "MIT",
package/src/build.ts CHANGED
@@ -11,6 +11,9 @@ const __dirname = dirname(__filename);
11
11
  const PACKAGED_ENGINE_DIR = join(__dirname, "engine");
12
12
  const DEV_ENGINE_DIR = join(__dirname, "..", "src", "engine");
13
13
  const ENGINE_DIR = existsSync(DEV_ENGINE_DIR) ? DEV_ENGINE_DIR : PACKAGED_ENGINE_DIR;
14
+ const PACKAGED_ENGINE_CORE_DIR = join(__dirname, "engine-core");
15
+ const DEV_ENGINE_CORE_DIR = join(__dirname, "..", "src", "engine-core");
16
+ const ENGINE_CORE_DIR = existsSync(DEV_ENGINE_CORE_DIR) ? DEV_ENGINE_CORE_DIR : PACKAGED_ENGINE_CORE_DIR;
14
17
  const CLI_PACKAGE_JSON_PATH = join(__dirname, "..", "package.json");
15
18
  const PRIMARY_CONFIG_NAME = "docs.json";
16
19
  const LEGACY_CONFIG_NAME = "velu.json";
@@ -1193,6 +1196,16 @@ function build(docsDir: string, outDir: string) {
1193
1196
  cpSync(ENGINE_DIR, outDir, { recursive: true });
1194
1197
  // Remove legacy Astro template leftovers if present in the packaged engine.
1195
1198
  rmSync(join(outDir, "src"), { recursive: true, force: true });
1199
+
1200
+ // Copy engine-core for shared components, CSS, and plugins (@core/* imports)
1201
+ cpSync(ENGINE_CORE_DIR, join(outDir, "engine-core"), { recursive: true });
1202
+
1203
+ // Patch tsconfig so @core/* resolves to the co-located engine-core copy
1204
+ const outTsconfigPath = join(outDir, "tsconfig.json");
1205
+ if (existsSync(outTsconfigPath)) {
1206
+ const tsconfigContent = readFileSync(outTsconfigPath, "utf-8");
1207
+ writeFileSync(outTsconfigPath, tsconfigContent.replace('"../engine-core/*"', '"./engine-core/*"'), "utf-8");
1208
+ }
1196
1209
  console.log("📦 Copied engine files");
1197
1210
 
1198
1211
  // ── 2. Create additional directories ─────────────────────────────────────
package/src/cli.ts CHANGED
@@ -266,7 +266,7 @@ function prepareRuntimeOutDir(docsOutDir: string): string {
266
266
 
267
267
  async function buildStatic(outDir: string, docsDir: string) {
268
268
  await new Promise<void>((res, rej) => {
269
- const child = spawn("node", ["_server.mjs", "build"], {
269
+ const child = spawn(process.execPath, ["_server.mjs", "build"], {
270
270
  cwd: outDir,
271
271
  stdio: "inherit",
272
272
  env: engineEnv(docsDir),
@@ -491,8 +491,14 @@ async function buildSite(docsDir: string) {
491
491
  // ── preview-server ───────────────────────────────────────────────────────────────
492
492
 
493
493
  const PREVIEW_ENGINE_DIR = (() => {
494
- const dev = join(PACKAGE_ROOT, "src", "preview-engine");
495
- const packaged = join(dirname(__filename), "preview-engine");
494
+ const dev = join(PACKAGE_ROOT, "src", "engine");
495
+ const packaged = join(dirname(__filename), "engine");
496
+ return existsSync(dev) ? dev : packaged;
497
+ })();
498
+
499
+ const ENGINE_CORE_DIR = (() => {
500
+ const dev = join(PACKAGE_ROOT, "src", "engine-core");
501
+ const packaged = join(dirname(__filename), "engine-core");
496
502
  return existsSync(dev) ? dev : packaged;
497
503
  })();
498
504
 
@@ -505,16 +511,57 @@ function previewServerEnv(): NodeJS.ProcessEnv {
505
511
  }
506
512
 
507
513
  async function previewServer(port: number) {
508
- const runtimeDir = join(tmpdir(), "velu-preview-out");
514
+ // Allow Docker to pre-populate the runtime dir via PREVIEW_RUNTIME_DIR
515
+ const runtimeDir = process.env.PREVIEW_RUNTIME_DIR || join(PACKAGE_ROOT, ".preview-out");
516
+
517
+ // Skip engine copy if the runtime dir is already set up (e.g. Docker pre-copy)
518
+ const runtimeAppDir = join(runtimeDir, "app");
519
+ if (existsSync(runtimeAppDir) && process.env.PREVIEW_RUNTIME_DIR) {
520
+ // Runtime dir already exists and was explicitly set — skip copy
521
+ } else {
522
+ // Clean and copy MAIN ENGINE to runtime dir
523
+ try { rmSync(runtimeDir, { recursive: true, force: true }); } catch {}
524
+ copyDirMerge(PREVIEW_ENGINE_DIR, runtimeDir);
525
+
526
+ // Copy engine-core for shared components, CSS, and plugins (@core/* imports)
527
+ copyDirMerge(ENGINE_CORE_DIR, join(runtimeDir, "engine-core"));
528
+ }
529
+
530
+ // Activate preview routes: move _preview/* to app root (idempotent — skips if already done)
531
+ const appDir = join(runtimeDir, "app");
532
+ const previewDir = join(appDir, "_preview");
509
533
 
510
- // Clean and copy preview engine to runtime dir
511
- try { rmSync(runtimeDir, { recursive: true, force: true }); } catch {}
512
- copyDirMerge(PREVIEW_ENGINE_DIR, runtimeDir);
534
+ if (existsSync(previewDir)) {
535
+ // Remove production-only routes that don't apply to preview
536
+ for (const dir of ["(docs)", "sitemap.xml", "robots.txt", "og", "llms-file", "llms-full-file", "md-file", "rss-file", "_md"]) {
537
+ try { rmSync(join(appDir, dir), { recursive: true, force: true }); } catch {}
538
+ }
539
+ // Remove production root layout/page (preview has its own in _preview/)
540
+ for (const file of ["layout.tsx", "page.tsx"]) {
541
+ try { rmSync(join(appDir, file), { force: true }); } catch {}
542
+ }
543
+
544
+ // Move preview routes to app root
545
+ copyDirMerge(previewDir, appDir);
546
+ rmSync(previewDir, { recursive: true, force: true });
547
+ }
548
+
549
+ // Create velu-theme.css that imports fumadocs neutral theme as baseline
550
+ // (per-session themes override via <style> tags injected in session layout)
551
+ writeFileSync(join(appDir, "velu-theme.css"), "@import 'fumadocs-ui/css/neutral.css';\n", "utf-8");
552
+
553
+ // Patch tsconfig so @core/* resolves to the co-located engine-core copy
554
+ const runtimeTsconfig = join(runtimeDir, "tsconfig.json");
555
+ if (existsSync(runtimeTsconfig)) {
556
+ const tsconfigContent = readFileSync(runtimeTsconfig, "utf-8");
557
+ writeFileSync(runtimeTsconfig, tsconfigContent.replace('"../engine-core/*"', '"./engine-core/*"'), "utf-8");
558
+ }
513
559
 
514
- // Symlink node_modules so Next.js can resolve dependencies (fumadocs-mdx, etc.)
560
+ // Link node_modules so Next.js can resolve dependencies (fumadocs-mdx, etc.)
561
+ // Use 'junction' on Windows (no elevation required), symlink on other platforms
515
562
  const runtimeNodeModules = join(runtimeDir, "node_modules");
516
563
  if (!existsSync(runtimeNodeModules)) {
517
- symlinkSync(NODE_MODULES_PATH, runtimeNodeModules);
564
+ symlinkSync(NODE_MODULES_PATH, runtimeNodeModules, "junction");
518
565
  }
519
566
 
520
567
  console.log(` Starting preview server on port ${port}...`);
@@ -524,11 +571,13 @@ async function previewServer(port: number) {
524
571
  // Resolve the next binary from the CLI's own node_modules
525
572
  const nextBinPath = join(NODE_MODULES_PATH, "next", "dist", "bin", "next");
526
573
 
527
- const child = spawn("node", [nextBinPath, "dev", "--port", String(port), "--turbopack"], {
574
+ const child = spawn(process.execPath, [nextBinPath, "dev", "--port", String(port), "--turbopack"], {
528
575
  cwd: runtimeDir,
529
576
  stdio: ["inherit", "pipe", "inherit"],
530
577
  env: {
531
578
  ...previewServerEnv(),
579
+ // Align source.config.ts and content-generator on the same content dir
580
+ PREVIEW_CONTENT_DIR: process.env.PREVIEW_CONTENT_DIR || "./content",
532
581
  WATCHPACK_POLLING: process.env.WATCHPACK_POLLING || "true",
533
582
  },
534
583
  });
@@ -571,7 +620,7 @@ function warmupRoutes(port: number) {
571
620
  // ── run ──────────────────────────────────────────────────────────────────────────
572
621
 
573
622
  function spawnServer(outDir: string, command: string, port: number, docsDir: string) {
574
- const child = spawn("node", ["_server.mjs", command, "--port", String(port)], {
623
+ const child = spawn(process.execPath, ["_server.mjs", command, "--port", String(port)], {
575
624
  cwd: outDir,
576
625
  stdio: "inherit",
577
626
  env: engineEnv(docsDir),