From 7d2b4079080b3588ffeb52cd7b5281551a5dc89e Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 2 Sep 2025 16:09:40 +0000 Subject: [PATCH] Fix puppeteer config to be portable across directories MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Embed puppeteer configuration in Mermaid module - Create temporary config files instead of relying on external file - Remove standalone puppeteer-config.json file - Ensures docster works from any directory without config dependencies 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- puppeteer-config.json | 3 --- src/Docster/Mermaid.hs | 25 ++++++++++++++++++++----- 2 files changed, 20 insertions(+), 8 deletions(-) delete mode 100644 puppeteer-config.json diff --git a/puppeteer-config.json b/puppeteer-config.json deleted file mode 100644 index 411c0e7..0000000 --- a/puppeteer-config.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "args": ["--no-sandbox", "--disable-setuid-sandbox"] -} \ No newline at end of file diff --git a/src/Docster/Mermaid.hs b/src/Docster/Mermaid.hs index 22fb880..e3e3b4d 100644 --- a/src/Docster/Mermaid.hs +++ b/src/Docster/Mermaid.hs @@ -16,8 +16,10 @@ import qualified Data.Text as T import qualified Data.Text.IO as TIO import Data.Hashable (hash) import System.FilePath (takeFileName, ()) -import System.Directory (removeFile) +import System.Directory (removeFile, getTemporaryDirectory) import System.Process (callProcess) +import System.IO (hClose) +import System.IO.Temp (openTempFile) import Control.Exception (bracket, catch, SomeException) -- | Application constants @@ -77,17 +79,30 @@ generateDiagramPaths (DiagramConfig (SourceDir sourceDir) format) (DiagramId dia PDF -> let pngFile = sourceDir diagIdStr <> ".png" in (pngFile, T.pack pngFile) +-- | Puppeteer configuration content for disabling sandbox +puppeteerConfigContent :: Text +puppeteerConfigContent = "{\n \"args\": [\"--no-sandbox\", \"--disable-setuid-sandbox\"]\n}" + -- | Call mermaid CLI process with appropriate arguments callMermaidProcess :: OutputFormat -> FilePath -> FilePath -> IO (Either DocsterError ()) callMermaidProcess format mmdFile outputFile = do let baseArgs = case format of HTML -> ["-i", mmdFile, "-o", outputFile] PDF -> ["-i", mmdFile, "-o", outputFile, "--scale", "3"] - args = baseArgs ++ ["--puppeteerConfigFile", "puppeteer-config.json"] - result <- catch - (callProcess (T.unpack mermaidCommand) args >> return (Right ())) - (\(e :: SomeException) -> return $ Left $ ProcessError $ "Mermaid process failed: " <> T.pack (show e)) + -- Create temporary puppeteer config file + result <- bracket + (do tempDir <- getTemporaryDirectory + (configPath, configHandle) <- openTempFile tempDir "puppeteer-config.json" + hClose configHandle + TIO.writeFile configPath puppeteerConfigContent + return configPath) + (\configPath -> removeFile configPath `catch` \(_ :: SomeException) -> return ()) + (\configPath -> do + let args = baseArgs ++ ["--puppeteerConfigFile", configPath] + catch + (callProcess (T.unpack mermaidCommand) args >> return (Right ())) + (\(e :: SomeException) -> return $ Left $ ProcessError $ "Mermaid process failed: " <> T.pack (show e))) return result -- | Create Pandoc image block from image path