From d008f294170561cec8ebfc7aa54352fb34c8cc44 Mon Sep 17 00:00:00 2001 From: Andrew McClenaghan Date: Thu, 27 Apr 2023 16:29:24 +1000 Subject: [PATCH] feat: Allow setting content root for FilesystemAdaptor --- packages/cli/src/index.ts | 5 +-- packages/lib/src/Settings.ts | 53 ++++++++++++++++++++----- packages/lib/src/adaptors/filesystem.ts | 13 +++--- 3 files changed, 50 insertions(+), 21 deletions(-) diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index 63cf4112..a0b5b366 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -17,10 +17,7 @@ async function main() { const settingLoader = new ConfluenceUploadSettings.AutoSettingsLoader(); const settings = settingLoader.load(); - const adaptor = new FileSystemAdaptor( - settings, - "/Users/andrewmcclenaghan/dev/obsidian-confluence/obsidian-confluence/dev-vault/" - ); // Make sure this is identical as possible between Obsidian and CLI + const adaptor = new FileSystemAdaptor(settings); // Make sure this is identical as possible between Obsidian and CLI const mermaidRenderer = new PuppeteerMermaidRenderer(); const confluenceClient = new ConfluenceClient({ host: settings.confluenceBaseUrl, diff --git a/packages/lib/src/Settings.ts b/packages/lib/src/Settings.ts index 6076b648..2aeb20ae 100644 --- a/packages/lib/src/Settings.ts +++ b/packages/lib/src/Settings.ts @@ -2,21 +2,39 @@ import fs from "fs"; import path from "path"; import yargs from "yargs"; -export interface ConfluenceSettings { +export class ConfluenceSettings { confluenceBaseUrl: string; confluenceParentId: string; atlassianUserName: string; atlassianApiToken: string; folderToPublish: string; + // eslint-disable-next-line @typescript-eslint/naming-convention + private _contentRoot: string; + + public get contentRoot(): string { + return this._contentRoot; + } + public set contentRoot(path: string) { + if (!fs.existsSync(path)) { + fs.mkdirSync(path); + } + if (!fs.lstatSync(path).isDirectory()) { + throw new Error(`'${path}' is not a directory.`); + } + if (!path.endsWith("/")) { + path += "/"; + } + this._contentRoot = path; + } } -export const DEFAULT_SETTINGS: ConfluenceSettings = { - confluenceBaseUrl: "", - confluenceParentId: "", - atlassianUserName: "", - atlassianApiToken: "", - folderToPublish: "Confluence Pages", -}; +export const DEFAULT_SETTINGS = new ConfluenceSettings(); +DEFAULT_SETTINGS.confluenceBaseUrl = ""; +DEFAULT_SETTINGS.confluenceParentId = ""; +DEFAULT_SETTINGS.atlassianUserName = ""; +DEFAULT_SETTINGS.atlassianApiToken = ""; +DEFAULT_SETTINGS.folderToPublish = "Confluence Pages"; +DEFAULT_SETTINGS.contentRoot = process.cwd(); export abstract class SettingsLoader { abstract loadPartial(): Partial; @@ -49,6 +67,10 @@ export abstract class SettingsLoader { throw new Error("Folder to publish is required"); } + if (!settings.contentRoot) { + throw new Error("Content root is required"); + } + return settings as ConfluenceSettings; } } @@ -89,6 +111,7 @@ export class EnvironmentVariableSettingsLoader extends SettingsLoader { atlassianUserName: process.env.ATLASSIAN_USERNAME, atlassianApiToken: process.env.ATLASSIAN_API_TOKEN, folderToPublish: process.env.FOLDER_TO_PUBLISH, + contentRoot: process.env.CONFLUENCE_CONTENT_ROOT, }; } } @@ -181,11 +204,19 @@ export class CommandLineArgumentSettingsLoader extends SettingsLoader { type: "string", demandOption: false, }) - .option("folder", { + .option("enableFolder", { alias: "f", - describe: "Folder to publish", + describe: "Folder enable to publish", + type: "string", + demandOption: false, + }) + .option("contentRoot", { + alias: "cr", + describe: + "Root to search for files to publish. All files must be part of this directory.", type: "string", demandOption: false, + default: process.cwd(), }) .parseSync(); @@ -194,7 +225,7 @@ export class CommandLineArgumentSettingsLoader extends SettingsLoader { confluenceParentId: options.parentId, atlassianUserName: options.userName, atlassianApiToken: options.apiToken, - folderToPublish: options.folder, + folderToPublish: options.enableFolder, }; } } diff --git a/packages/lib/src/adaptors/filesystem.ts b/packages/lib/src/adaptors/filesystem.ts index 3e86ad41..d72d6eee 100644 --- a/packages/lib/src/adaptors/filesystem.ts +++ b/packages/lib/src/adaptors/filesystem.ts @@ -12,11 +12,9 @@ import { export class FileSystemAdaptor implements LoaderAdaptor { settings: ConfluenceSettings; - folderPath: string; - constructor(settings: ConfluenceSettings, folderPath: string) { + constructor(settings: ConfluenceSettings) { this.settings = settings; - this.folderPath = folderPath; } async getFileContent(absoluteFilePath: string) { @@ -100,7 +98,7 @@ export class FileSystemAdaptor implements LoaderAdaptor { } async getMarkdownFilesToUpload(): Promise { - const files = await this.loadMarkdownFiles(this.folderPath); + const files = await this.loadMarkdownFiles(this.settings.contentRoot); const filesToPublish = []; for (const file of files) { try { @@ -141,7 +139,10 @@ export class FileSystemAdaptor implements LoaderAdaptor { "application/octet-stream"; return { contents: fileContents, - filePath: absoluteFilePath.replace(this.folderPath, ""), + filePath: absoluteFilePath.replace( + this.settings.contentRoot, + "" + ), filename: path.basename(absoluteFilePath), mimeType: mimeType, }; @@ -177,7 +178,7 @@ export class FileSystemAdaptor implements LoaderAdaptor { matchingFiles.push(fullPath); } else if ( entry.isDirectory() && - fullPath.startsWith(this.folderPath) + fullPath.startsWith(this.settings.contentRoot) ) { directoriesToSearch.push(fullPath); }