diff --git a/src/core/output/outputGenerate.ts b/src/core/output/outputGenerate.ts index 272d34bbd..cfaae091d 100644 --- a/src/core/output/outputGenerate.ts +++ b/src/core/output/outputGenerate.ts @@ -1,13 +1,40 @@ import fs from 'node:fs/promises'; import path from 'node:path'; +import Handlebars from 'handlebars'; import type { RepopackConfigMerged } from '../../config/configTypes.js'; import { RepopackError } from '../../shared/errorHandle.js'; import { generateTreeString } from '../file/fileTreeGenerate.js'; import type { ProcessedFile } from '../file/fileTypes.js'; import type { OutputGeneratorContext } from './outputGeneratorTypes.js'; -import { generateMarkdownStyle } from './outputStyles/markdownStyle.js'; -import { generatePlainStyle } from './outputStyles/plainStyle.js'; -import { generateXmlStyle } from './outputStyles/xmlStyle.js'; +import { + generateHeader, + generateSummaryAdditionalInfo, + generateSummaryFileFormat, + generateSummaryNotes, + generateSummaryPurpose, + generateSummaryUsageGuidelines, +} from './outputStyleDecorate.js'; +import { getMarkdownTemplate } from './outputStyles/markdownStyle.js'; +import { getPlainTemplate } from './outputStyles/plainStyle.js'; +import { getXmlTemplate } from './outputStyles/xmlStyle.js'; + +const createRenderContext = (outputGeneratorContext: OutputGeneratorContext) => { + return { + generationHeader: generateHeader(outputGeneratorContext.generationDate), + summaryPurpose: generateSummaryPurpose(), + summaryFileFormat: generateSummaryFileFormat(), + summaryUsageGuidelines: generateSummaryUsageGuidelines( + outputGeneratorContext.config, + outputGeneratorContext.instruction, + ), + summaryNotes: generateSummaryNotes(outputGeneratorContext.config), + summaryAdditionalInfo: generateSummaryAdditionalInfo(), + headerText: outputGeneratorContext.config.output.headerText, + instruction: outputGeneratorContext.instruction, + treeString: outputGeneratorContext.treeString, + processedFiles: outputGeneratorContext.processedFiles, + }; +}; export const generateOutput = async ( rootDir: string, @@ -16,20 +43,22 @@ export const generateOutput = async ( allFilePaths: string[], ): Promise => { const outputGeneratorContext = await buildOutputGeneratorContext(rootDir, config, allFilePaths, processedFiles); + const renderContext = createRenderContext(outputGeneratorContext); - let output: string; + let template: string; switch (config.output.style) { case 'xml': - output = generateXmlStyle(outputGeneratorContext); + template = getXmlTemplate(); break; case 'markdown': - output = generateMarkdownStyle(outputGeneratorContext); + template = getMarkdownTemplate(); break; default: - output = generatePlainStyle(outputGeneratorContext); + template = getPlainTemplate(); } - return output; + const compiledTemplate = Handlebars.compile(template); + return `${compiledTemplate(renderContext).trim()}\n`; }; export const buildOutputGeneratorContext = async ( diff --git a/src/core/output/outputStyles/markdownStyle.ts b/src/core/output/outputStyles/markdownStyle.ts index 5f19a6866..ad2b4b7fa 100644 --- a/src/core/output/outputStyles/markdownStyle.ts +++ b/src/core/output/outputStyles/markdownStyle.ts @@ -1,37 +1,7 @@ import Handlebars from 'handlebars'; -import type { OutputGeneratorContext } from '../outputGeneratorTypes.js'; -import { - generateHeader, - generateSummaryAdditionalInfo, - generateSummaryFileFormat, - generateSummaryNotes, - generateSummaryPurpose, - generateSummaryUsageGuidelines, -} from '../outputStyleDecorate.js'; -export const generateMarkdownStyle = (outputGeneratorContext: OutputGeneratorContext) => { - const template = Handlebars.compile(markdownTemplate); - - const renderContext = { - generationHeader: generateHeader(outputGeneratorContext.generationDate), - summaryPurpose: generateSummaryPurpose(), - summaryFileFormat: generateSummaryFileFormat(), - summaryUsageGuidelines: generateSummaryUsageGuidelines( - outputGeneratorContext.config, - outputGeneratorContext.instruction, - ), - summaryNotes: generateSummaryNotes(outputGeneratorContext.config), - summaryAdditionalInfo: generateSummaryAdditionalInfo(), - headerText: outputGeneratorContext.config.output.headerText, - instruction: outputGeneratorContext.instruction, - treeString: outputGeneratorContext.treeString, - processedFiles: outputGeneratorContext.processedFiles, - }; - - return `${template(renderContext).trim()}\n`; -}; - -const markdownTemplate = /* md */ ` +export const getMarkdownTemplate = () => { + return /* md */ ` {{{generationHeader}}} # File Summary @@ -79,6 +49,7 @@ const markdownTemplate = /* md */ ` {{{instruction}}} {{/if}} `; +}; Handlebars.registerHelper('getFileExtension', (filePath) => { const extension = filePath.split('.').pop()?.toLowerCase(); diff --git a/src/core/output/outputStyles/plainStyle.ts b/src/core/output/outputStyles/plainStyle.ts index 7c15436bf..96df6e5ae 100644 --- a/src/core/output/outputStyles/plainStyle.ts +++ b/src/core/output/outputStyles/plainStyle.ts @@ -1,40 +1,8 @@ -import Handlebars from 'handlebars'; -import type { OutputGeneratorContext } from '../outputGeneratorTypes.js'; -import { - generateHeader, - generateSummaryAdditionalInfo, - generateSummaryFileFormat, - generateSummaryNotes, - generateSummaryPurpose, - generateSummaryUsageGuidelines, -} from '../outputStyleDecorate.js'; - -export const generatePlainStyle = (outputGeneratorContext: OutputGeneratorContext) => { - const template = Handlebars.compile(plainTemplate); - - const renderContext = { - generationHeader: generateHeader(outputGeneratorContext.generationDate), - summaryPurpose: generateSummaryPurpose(), - summaryFileFormat: generateSummaryFileFormat(), - summaryUsageGuidelines: generateSummaryUsageGuidelines( - outputGeneratorContext.config, - outputGeneratorContext.instruction, - ), - summaryNotes: generateSummaryNotes(outputGeneratorContext.config), - summaryAdditionalInfo: generateSummaryAdditionalInfo(), - headerText: outputGeneratorContext.config.output.headerText, - instruction: outputGeneratorContext.instruction, - treeString: outputGeneratorContext.treeString, - processedFiles: outputGeneratorContext.processedFiles, - }; - - return `${template(renderContext).trim()}\n`; -}; - const PLAIN_SEPARATOR = '='.repeat(16); const PLAIN_LONG_SEPARATOR = '='.repeat(64); -const plainTemplate = ` +export const getPlainTemplate = () => { + return ` {{{generationHeader}}} ${PLAIN_LONG_SEPARATOR} @@ -98,3 +66,4 @@ ${PLAIN_LONG_SEPARATOR} {{/if}} `; +}; diff --git a/src/core/output/outputStyles/xmlStyle.ts b/src/core/output/outputStyles/xmlStyle.ts index f343872ac..c4c0a06ee 100644 --- a/src/core/output/outputStyles/xmlStyle.ts +++ b/src/core/output/outputStyles/xmlStyle.ts @@ -1,37 +1,5 @@ -import Handlebars from 'handlebars'; -import type { OutputGeneratorContext } from '../outputGeneratorTypes.js'; -import { - generateHeader, - generateSummaryAdditionalInfo, - generateSummaryFileFormat, - generateSummaryNotes, - generateSummaryPurpose, - generateSummaryUsageGuidelines, -} from '../outputStyleDecorate.js'; - -export const generateXmlStyle = (outputGeneratorContext: OutputGeneratorContext) => { - const template = Handlebars.compile(xmlTemplate); - - const renderContext = { - generationHeader: generateHeader(outputGeneratorContext.generationDate), - summaryPurpose: generateSummaryPurpose(), - summaryFileFormat: generateSummaryFileFormat(), - summaryUsageGuidelines: generateSummaryUsageGuidelines( - outputGeneratorContext.config, - outputGeneratorContext.instruction, - ), - summaryNotes: generateSummaryNotes(outputGeneratorContext.config), - summaryAdditionalInfo: generateSummaryAdditionalInfo(), - headerText: outputGeneratorContext.config.output.headerText, - instruction: outputGeneratorContext.instruction, - treeString: outputGeneratorContext.treeString, - processedFiles: outputGeneratorContext.processedFiles, - }; - - return `${template(renderContext).trim()}\n`; -}; - -const xmlTemplate = /* xml */ ` +export const getXmlTemplate = () => { + return /* xml */ ` {{{generationHeader}}} @@ -89,3 +57,4 @@ This section contains the contents of the repository's files. {{/if}} `; +}; diff --git a/tests/core/output/outputStyles/markdownStyle.test.ts b/tests/core/output/outputStyles/markdownStyle.test.ts index aa8e80c71..0825777f6 100644 --- a/tests/core/output/outputStyles/markdownStyle.test.ts +++ b/tests/core/output/outputStyles/markdownStyle.test.ts @@ -1,7 +1,6 @@ import process from 'node:process'; import { beforeEach, describe, expect, test, vi } from 'vitest'; -import { buildOutputGeneratorContext } from '../../../../src/core/output/outputGenerate.js'; -import { generateMarkdownStyle } from '../../../../src/core/output/outputStyles/markdownStyle.js'; +import { generateOutput } from '../../../../src/core/output/outputGenerate.js'; import { createMockConfig } from '../../../testing/testUtils.js'; vi.mock('fs/promises'); @@ -11,7 +10,7 @@ describe('markdownStyle', () => { vi.resetAllMocks(); }); - test('generateMarkdownOutput should include user-provided header text', async () => { + test('generateOutput for md should include user-provided header text', async () => { const mockConfig = createMockConfig({ output: { filePath: 'output.md', @@ -24,8 +23,7 @@ describe('markdownStyle', () => { }, }); - const context = await buildOutputGeneratorContext(process.cwd(), mockConfig, [], []); - const output = await generateMarkdownStyle(context); + const output = await generateOutput(process.cwd(), mockConfig, [], []); expect(output).toContain('# File Summary'); expect(output).toContain('# Repository Structure'); diff --git a/tests/core/output/outputStyles/plainStyle.test.ts b/tests/core/output/outputStyles/plainStyle.test.ts index 7929f4b3e..921c77d70 100644 --- a/tests/core/output/outputStyles/plainStyle.test.ts +++ b/tests/core/output/outputStyles/plainStyle.test.ts @@ -1,7 +1,6 @@ import process from 'node:process'; import { beforeEach, describe, expect, test, vi } from 'vitest'; -import { buildOutputGeneratorContext } from '../../../../src/core/output/outputGenerate.js'; -import { generatePlainStyle } from '../../../../src/core/output/outputStyles/plainStyle.js'; +import { generateOutput } from '../../../../src/core/output/outputGenerate.js'; import { createMockConfig } from '../../../testing/testUtils.js'; vi.mock('fs/promises'); @@ -11,7 +10,7 @@ describe('plainStyle', () => { vi.resetAllMocks(); }); - test('generatePlainOutput should include user-provided header text', async () => { + test('generateOutput for plain should include user-provided header text', async () => { const mockConfig = createMockConfig({ output: { filePath: 'output.txt', @@ -24,8 +23,7 @@ describe('plainStyle', () => { }, }); - const context = await buildOutputGeneratorContext(process.cwd(), mockConfig, [], []); - const output = await generatePlainStyle(context); + const output = await generateOutput(process.cwd(), mockConfig, [], []); expect(output).toContain('File Summary'); expect(output).toContain('Repository Structure'); diff --git a/tests/core/output/outputStyles/xmlStyle.test.ts b/tests/core/output/outputStyles/xmlStyle.test.ts index c99d04a27..85cf1bb21 100644 --- a/tests/core/output/outputStyles/xmlStyle.test.ts +++ b/tests/core/output/outputStyles/xmlStyle.test.ts @@ -1,7 +1,6 @@ import process from 'node:process'; import { beforeEach, describe, expect, test, vi } from 'vitest'; -import { buildOutputGeneratorContext } from '../../../../src/core/output/outputGenerate.js'; -import { generateXmlStyle } from '../../../../src/core/output/outputStyles/xmlStyle.js'; +import { generateOutput } from '../../../../src/core/output/outputGenerate.js'; import { createMockConfig } from '../../../testing/testUtils.js'; vi.mock('fs/promises'); @@ -11,7 +10,7 @@ describe('xmlStyle', () => { vi.resetAllMocks(); }); - test('generateXmlOutput should include user-provided header text', async () => { + test('generateOutput for xml should include user-provided header text', async () => { const mockConfig = createMockConfig({ output: { filePath: 'output.txt', @@ -24,8 +23,7 @@ describe('xmlStyle', () => { }, }); - const context = await buildOutputGeneratorContext(process.cwd(), mockConfig, [], []); - const output = await generateXmlStyle(context); + const output = await generateOutput(process.cwd(), mockConfig, [], []); expect(output).toContain('file_summary'); expect(output).toContain('repository_structure');