Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions src/apitypes/rest/rest.document.ts
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,6 @@ export async function createRestExportDocument(
templateResolver: _TemplateResolver,
allowedOasExtensions?: OpenApiExtensionKey[],
generatedHtmlExportDocuments?: ExportDocument[],
addBackLink?: boolean,
): Promise<ExportDocument> {
const exportFilename = `${getDocumentTitle(filename)}.${format}`
const [[document], blobProperties] = dump(removeOasExtensions(JSON.parse(data), allowedOasExtensions), EXPORT_FORMAT_TO_FILE_FORMAT.get(format)!)
Expand All @@ -138,7 +137,6 @@ export async function createRestExportDocument(
packageName,
version,
templateResolver,
addBackLink,
),
filename: exportFilename,
}
Expand Down
23 changes: 17 additions & 6 deletions src/strategies/export-rest-document.strategy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,20 @@
* limitations under the License.
*/

import { BuilderStrategy, BuildResult, BuildTypeContexts, ExportRestDocumentBuildConfig } from '../types'
import {
BuilderStrategy,
BuildResult,
BuildTypeContexts,
ExportDocument,
ExportRestDocumentBuildConfig,
} from '../types'
import { getDocumentTitle, getSplittedVersionKey } from '../utils'
import { createCommonStaticExportDocuments, createSingleFileExportName } from '../utils/export'
import {
createCommonStaticExportDocuments,
createSingleFileExportName,
createUnknownExportDocument,
generateIndexHtmlPage,
} from '../utils/export'
import { createRestExportDocument } from '../apitypes/rest/rest.document'
import { FILE_FORMAT_HTML } from '../consts'

Expand All @@ -26,17 +37,17 @@ export class ExportRestDocumentStrategy implements BuilderStrategy {
const { rawDocumentResolver, templateResolver, packageResolver } = builderContext(config)
const { packageId, version: versionWithRevision, documentId, format, allowedOasExtensions } = config
const [version] = getSplittedVersionKey(versionWithRevision)

const generatedHtmlExportDocuments: ExportDocument[] = []
const file = await rawDocumentResolver(
versionWithRevision,
packageId,
documentId,
)
const { name: packageName } = await packageResolver(packageId)
buildResult.exportDocuments.push(await createRestExportDocument(file.name, await file.text(), format, packageName, version, templateResolver, allowedOasExtensions))

buildResult.exportDocuments.push(await createRestExportDocument(file.name, await file.text(), format, packageName, version, templateResolver, allowedOasExtensions, generatedHtmlExportDocuments))
if (format === FILE_FORMAT_HTML) {
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageName, version, templateResolver, buildResult.exportDocuments[0].filename))
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageName, version, templateResolver))
buildResult.exportDocuments.push(createUnknownExportDocument('index.html', await generateIndexHtmlPage(packageName, version, generatedHtmlExportDocuments, templateResolver)))
buildResult.exportFileName = createSingleFileExportName(packageId, version, getDocumentTitle(file.name), 'zip')
return buildResult
}
Expand Down
12 changes: 4 additions & 8 deletions src/strategies/export-rest-operations-group.strategy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ async function exportMergedDocument(config: ExportRestOperationsGroupBuildConfig
buildResult.exportDocuments.push(await createRestExportDocument(buildResult.merged.filename, JSON.stringify(buildResult.merged?.data), format, packageName, version, templateResolver, allowedOasExtensions))

if (format === FILE_FORMAT_HTML) {
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageName, version, templateResolver, buildResult.exportDocuments[0].filename))
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageName, version, templateResolver))
}
}

Expand All @@ -100,19 +100,15 @@ async function exportReducedDocuments(config: ExportRestOperationsGroupBuildConf
}, buildResult, contexts)

const generatedHtmlExportDocuments: ExportDocument[] = []
const restDocuments = [...buildResult.documents.values()].filter(isRestDocument)
const transformedDocuments = await Promise.all([...buildResult.documents.values()].map(async document => {
return createRestExportDocument?.(document.filename, JSON.stringify(document.data), format, packageName, version, templateResolver, allowedOasExtensions, generatedHtmlExportDocuments, restDocuments.length > 1)
return createRestExportDocument?.(document.filename, JSON.stringify(document.data), format, packageName, version, templateResolver, allowedOasExtensions, generatedHtmlExportDocuments)
}))

buildResult.exportDocuments.push(...transformedDocuments)

if (format === FILE_FORMAT_HTML) {
const shouldAddIndexPage = generatedHtmlExportDocuments.length > 1
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageName, version, templateResolver, shouldAddIndexPage ? 'index.html' : buildResult.exportDocuments[0].filename))
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageName, version, templateResolver))

if (shouldAddIndexPage) {
buildResult.exportDocuments.push(createUnknownExportDocument('index.html', await generateIndexHtmlPage(packageName, version, generatedHtmlExportDocuments, templateResolver)))
}
buildResult.exportDocuments.push(createUnknownExportDocument('index.html', await generateIndexHtmlPage(packageName, version, generatedHtmlExportDocuments, templateResolver)))
}
}
5 changes: 2 additions & 3 deletions src/strategies/export-version.strategy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,7 @@ async function exportToHTML(config: ExportVersionBuildConfig, buildResult: Build

const generatedHtmlExportDocuments: ExportDocument[] = []
const restDocuments = documents.filter(isRestDocument)
const hasReadme = !!documents.find(({ filename }) => filename.toLowerCase() === 'readme.md')
const shouldAddIndexPage = hasReadme && restDocuments.length > 0 || restDocuments.length > 1
const shouldAddIndexPage = restDocuments.length > 0
const transformedDocuments = await Promise.all(documents.map(async document => {
const { createExportDocument } = apiBuilders.find(({ types }) => types.includes(document.type)) || unknownApiBuilder
const file = await rawDocumentResolver(versionWithRevision, packageId, document.slug)
Expand All @@ -74,7 +73,7 @@ async function exportToHTML(config: ExportVersionBuildConfig, buildResult: Build
buildResult.exportDocuments.push(...transformedDocuments)

if (generatedHtmlExportDocuments.length > 0) {
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageName, version, templateResolver, shouldAddIndexPage ? 'index.html' : buildResult.exportDocuments[0].filename))
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageName, version, templateResolver))
}
if (shouldAddIndexPage) {
const readme = await buildResult.exportDocuments.find(({ filename }) => filename.toLowerCase() === 'readme.md')?.data.text()
Expand Down
8 changes: 4 additions & 4 deletions src/utils/export.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@
import { _TemplateResolver, ExportDocument } from '../types'
import { getDocumentTitle } from './document'

export async function createCommonStaticExportDocuments(packageName: string, version: string, templateResolver: _TemplateResolver, backLinkFilename: string): Promise<ExportDocument[]> {
export async function createCommonStaticExportDocuments(packageName: string, version: string, templateResolver: _TemplateResolver): Promise<ExportDocument[]> {
return [
createUnknownExportDocument('ls.html', await generateLegalStatementPage(packageName, version, await templateResolver('ls.html'), backLinkFilename)),
createUnknownExportDocument('ls.html', await generateLegalStatementPage(packageName, version, await templateResolver('ls.html'), 'index.html')),
createUnknownExportDocument('resources/corporatelogo.png', await templateResolver('resources/corporatelogo.png')),
createUnknownExportDocument('resources/styles.css', await templateResolver('resources/styles.css')),
]
Expand All @@ -39,10 +39,10 @@ export async function generateLegalStatementPage(packageName: string, version: s
return new Blob([filled])
}

export async function generateHtmlPage(document: string, fileTitle: string, packageName: string, version: string, templateResolver: _TemplateResolver, addBackLink: boolean = false): Promise<Blob> {
export async function generateHtmlPage(document: string, fileTitle: string, packageName: string, version: string, templateResolver: _TemplateResolver): Promise<Blob> {
const template = await (await templateResolver('page.html')).text()
const apispecViewScript = await (await templateResolver('scripts/apispec-view.js')).text()
const breadcrumbs = addBackLink ? `<div class="breadcrumbs"><a href="index.html">Table of contents</a> > <span>${fileTitle}</span></div>` : ''
const breadcrumbs = `<div class="breadcrumbs"><a href="index.html">Table of contents</a> > <span>${fileTitle}</span></div>`
const filled = template
.replace('{{fileTitle}}', fileTitle)
// arrow function disables replacement patterns like $&
Expand Down
5 changes: 3 additions & 2 deletions test/export.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ describe('Export test', () => {
expect(result).toEqual(exportDocumentsMatcher([
exportDocumentMatcher('1.html'),
exportDocumentMatcher('ls.html'),
exportDocumentMatcher('index.html'),
exportDocumentMatcher('resources/corporatelogo.png'),
exportDocumentMatcher('resources/styles.css'),
]))
Expand Down Expand Up @@ -211,7 +212,7 @@ describe('Export test', () => {
expect(result.exportFileName).toEqual('export_single-document-version.zip')
expect(result).toEqual(exportDocumentsMatcher([
exportDocumentMatcher('1.html'),

exportDocumentMatcher('index.html'),
exportDocumentMatcher('ls.html'),
exportDocumentMatcher('resources/corporatelogo.png'),
exportDocumentMatcher('resources/styles.css'),
Expand Down Expand Up @@ -300,7 +301,7 @@ describe('Export test', () => {
expect(result.exportFileName).toEqual('export_regular-version_GROUP_WITH_OPERATIONS_FROM_ONE_DOCUMENT_ONLY.zip')
expect(result).toEqual(exportDocumentsMatcher([
exportDocumentMatcher('2.html'),

exportDocumentMatcher('index.html'),
exportDocumentMatcher('ls.html'),
exportDocumentMatcher('resources/corporatelogo.png'),
exportDocumentMatcher('resources/styles.css'),
Expand Down