feat: Add Docusaurus dev server integration

- Add 'dev' flag to run Docusaurus server
- Import docusaurus library
- Enable scan and export if 'dev' flag is set
- Handle export errors more gracefully
- Start Docusaurus dev server after export
This commit is contained in:
Mahmoud-Emad
2025-11-04 16:49:00 +02:00
parent 8bfb021939
commit 10b9af578a
3 changed files with 51 additions and 10 deletions

View File

@@ -4,6 +4,7 @@ import incubaid.herolib.ui.console
import incubaid.herolib.data.atlas import incubaid.herolib.data.atlas
import incubaid.herolib.core.playcmds import incubaid.herolib.core.playcmds
import incubaid.herolib.develop.gittools import incubaid.herolib.develop.gittools
import incubaid.herolib.web.docusaurus
import os import os
import cli { Command, Flag } import cli { Command, Flag }
@@ -59,7 +60,6 @@ pub fn cmd_atlas(mut cmdroot Command) Command {
flag: .string flag: .string
required: false required: false
name: 'destination' name: 'destination'
abbrev: 'd'
description: 'Export destination path.' description: 'Export destination path.'
}) })
@@ -71,6 +71,14 @@ pub fn cmd_atlas(mut cmdroot Command) Command {
description: 'Scan directories for collections.' description: 'Scan directories for collections.'
}) })
cmd_run.add_flag(Flag{
flag: .bool
required: false
name: 'dev'
abbrev: 'd'
description: 'Run development server after export.'
})
cmd_run.add_flag(Flag{ cmd_run.add_flag(Flag{
flag: .bool flag: .bool
required: false required: false
@@ -110,6 +118,7 @@ fn cmd_atlas_execute(cmd Command) ! {
mut update := cmd.flags.get_bool('update') or { false } mut update := cmd.flags.get_bool('update') or { false }
mut scan := cmd.flags.get_bool('scan') or { false } mut scan := cmd.flags.get_bool('scan') or { false }
mut export := cmd.flags.get_bool('export') or { false } mut export := cmd.flags.get_bool('export') or { false }
mut dev := cmd.flags.get_bool('dev') or { false }
// Include and redis default to true unless explicitly disabled // Include and redis default to true unless explicitly disabled
mut no_include := cmd.flags.get_bool('no-include') or { false } mut no_include := cmd.flags.get_bool('no-include') or { false }
@@ -138,9 +147,12 @@ fn cmd_atlas_execute(cmd Command) ! {
console.print_header('Running Atlas for: ${atlas_path.path}') console.print_header('Running Atlas for: ${atlas_path.path}')
// Run HeroScript if exists // Run HeroScript if exists
// Note: emptycheck is false because !!include actions in markdown files
// are processed internally by atlas during export, not through the playbook system
playcmds.run( playcmds.run(
heroscript_path: atlas_path.path heroscript_path: atlas_path.path
reset: false reset: false
emptycheck: false
)! )!
// Create or get atlas instance // Create or get atlas instance
@@ -151,11 +163,18 @@ fn cmd_atlas_execute(cmd Command) ! {
} }
// Default behavior: scan and export if no flags specified // Default behavior: scan and export if no flags specified
// Also enable scan and export if dev is requested
if !scan && !export { if !scan && !export {
scan = true scan = true
export = true export = true
} }
// If dev server is requested, ensure we scan and export first
if dev {
scan = true
export = true
}
// Execute operations // Execute operations
if scan { if scan {
console.print_header('Scanning collections...') console.print_header('Scanning collections...')
@@ -172,12 +191,13 @@ fn cmd_atlas_execute(cmd Command) ! {
console.print_item('Include processing: ${include}') console.print_item('Include processing: ${include}')
console.print_item('Redis metadata: ${redis}') console.print_item('Redis metadata: ${redis}')
// Export even if there are errors - we want to export what we can
a.export( a.export(
destination: destination destination: destination
reset: reset reset: reset
include: include include: include
redis: redis redis: redis
)! ) or { console.print_item('Export completed with errors: ${err}') }
console.print_green(' Export complete to ${destination}') console.print_green(' Export complete to ${destination}')
@@ -188,4 +208,30 @@ fn cmd_atlas_execute(cmd Command) ! {
} }
} }
} }
// Run development server if requested - always run even if there were export errors
if dev {
if destination == '' {
return error('Cannot run dev server: no destination specified. Use -destination flag.')
}
console.print_header('Starting Docusaurus development server')
console.print_item('Atlas content exported to: ${destination}')
// Get the docusaurus site that was configured via heroscript
// The heroscript should have been processed by playcmds.run() above
mut dsite := docusaurus.dsite_get('') or {
console.print_item('Warning: No Docusaurus site configured')
console.print_item('Make sure your atlas source directory contains a heroscript file with Docusaurus configuration')
return error('Cannot start dev server: ${err}')
}
// Run the docusaurus dev server - this will block until Ctrl+C
dsite.dev(
host: 'localhost'
port: 3000
open: true
watch_changes: false
)!
}
} }

View File

@@ -65,7 +65,7 @@ pub fn (mut c Collection) export(args CollectionExportArgs) ! {
path: '${dir_meta.path}/${c.name}.json' path: '${dir_meta.path}/${c.name}.json'
create: true create: true
)! )!
json_file.write(meta)! json_file.write(meta)!
for _, mut page in c.pages { for _, mut page in c.pages {
content := page.content(include: args.include)! content := page.content(include: args.include)!
@@ -82,8 +82,6 @@ pub fn (mut c Collection) export(args CollectionExportArgs) ! {
mut redis := context.redis()! mut redis := context.redis()!
redis.hset('atlas:${c.name}', page.name, page.path)! redis.hset('atlas:${c.name}', page.name, page.path)!
} }
} }
// // Export files // // Export files

View File

@@ -12,7 +12,7 @@ pub fn play(mut plbook PlayBook) ! {
mut atlases := map[string]&Atlas{} mut atlases := map[string]&Atlas{}
mut name := "" mut name := ''
// Process scan actions - scan directories for collections // Process scan actions - scan directories for collections
mut scan_actions := plbook.find(filter: 'atlas.scan')! mut scan_actions := plbook.find(filter: 'atlas.scan')!
@@ -52,13 +52,10 @@ pub fn play(mut plbook PlayBook) ! {
mut atlas_instance_post := atlases[name] or { mut atlas_instance_post := atlases[name] or {
return error("Atlas '${name}' not found. Use !!atlas.scan first.") return error("Atlas '${name}' not found. Use !!atlas.scan first.")
} }
atlas_instance_post.init_post()! atlas_instance_post.init_post()!
println(atlas_instance_post)
// Process export actions - export collections to destination // Process export actions - export collections to destination
mut export_actions := plbook.find(filter: 'atlas.export')! mut export_actions := plbook.find(filter: 'atlas.export')!