conflutora
Version:
Provider to convert and publish Antora documentation on Confluence
69 lines • 3.74 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ProviderService = void 0;
const vinyl_1 = __importDefault(require("vinyl"));
const node_path_1 = __importDefault(require("node:path"));
const promises_1 = __importDefault(require("node:fs/promises"));
const enum_js_1 = require("../common/enum.js");
const confluence_client_js_1 = require("../clients/confluence.client.js");
const html_parser_service_js_1 = require("./html-parser.service.js");
const Logger_js_1 = require("../utils/Logger.js");
const Page_js_1 = require("../entities/Page.js");
const page_service_js_1 = require("./page.service.js");
const SiteStructure_js_1 = require("../entities/SiteStructure.js");
const hash_util_js_1 = require("../utils/hash.util.js");
const config_service_js_1 = require("../config/config.service.js");
class ProviderService {
logger = new Logger_js_1.Logger(this.constructor.name);
siteStructure = new SiteStructure_js_1.SiteStructure();
htmlParserService = new html_parser_service_js_1.HtmlParserService();
handle = async (files) => {
for (const file of files) {
const filePath = node_path_1.default.resolve(file.base, file.path);
const fileContent = await promises_1.default.readFile(filePath, 'utf-8');
const bufferFile = new vinyl_1.default({ path: file.path, contents: Buffer.from(fileContent) });
this.buildSiteStructure(bufferFile);
}
const rootPage = this.siteStructure.getRootPage();
const uniqueProjectId = this.generateUniqueProjectId(rootPage?.parent ?? 'unknown');
const confluenceClient = new confluence_client_js_1.ConfluenceClient(this.htmlParserService, uniqueProjectId);
const pageService = new page_service_js_1.PageService(confluenceClient, this.siteStructure);
this.logger.info(`[${uniqueProjectId}] Processing ${this.siteStructure.getAllPages().length} pages`);
await pageService.publishPages();
this.logger.info(`[${uniqueProjectId}] All pages processed`);
};
generateUniqueProjectId = (projectName) => {
const spaceKey = config_service_js_1.configService.get('confluence.spaceKey');
const ancestorId = config_service_js_1.configService.get('confluence.ancestorId') ?? '42';
const uniqueId = `${spaceKey}-${ancestorId}-${projectName}`;
return (0, hash_util_js_1.calculateHash)(uniqueId).slice(1, 5);
};
buildSiteStructure = (file) => {
const filePath = file.path;
if (!filePath.endsWith('.html') || filePath.includes(enum_js_1.ANTORA_DEFAULTS.NOT_FOUND_PAGE)) {
this.logger.debug(`Skipping ${filePath}`);
return;
}
const parts = filePath.split('/');
const fileName = parts.pop();
const parentDir = parts.join('/');
if (!fileName) {
this.logger.error(`Error extracting file name from ${filePath}`);
return;
}
const fileContents = this.htmlParserService.extractBodyContent(file.contents.toString());
const pageTitle = this.htmlParserService.getPageTitle(fileContents);
if (!pageTitle) {
this.logger.debug(`No title found for ${fileName}`);
return;
}
const page = new Page_js_1.Page(fileName, pageTitle, parentDir, fileContents);
this.siteStructure.addPage(page, parentDir); // Use directory path as parent identifier
this.logger.debug(`Page added: ${pageTitle} with ID ${page.id}`);
};
}
exports.ProviderService = ProviderService;
//# sourceMappingURL=provider.service.js.map