Skip to content

Commit 3d2ba9c

Browse files
fix: index.html file is missing during export if package contains just single document (#32)
1 parent 963fd72 commit 3d2ba9c

File tree

6 files changed

+31
-26
lines changed

6 files changed

+31
-26
lines changed

src/apitypes/rest/rest.document.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,6 @@ export async function createRestExportDocument(
125125
templateResolver: _TemplateResolver,
126126
allowedOasExtensions?: OpenApiExtensionKey[],
127127
generatedHtmlExportDocuments?: ExportDocument[],
128-
addBackLink?: boolean,
129128
): Promise<ExportDocument> {
130129
const exportFilename = `${getDocumentTitle(filename)}.${format}`
131130
const [[document], blobProperties] = dump(removeOasExtensions(JSON.parse(data), allowedOasExtensions), EXPORT_FORMAT_TO_FILE_FORMAT.get(format)!)
@@ -138,7 +137,6 @@ export async function createRestExportDocument(
138137
packageName,
139138
version,
140139
templateResolver,
141-
addBackLink,
142140
),
143141
filename: exportFilename,
144142
}

src/strategies/export-rest-document.strategy.ts

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,20 @@
1414
* limitations under the License.
1515
*/
1616

17-
import { BuilderStrategy, BuildResult, BuildTypeContexts, ExportRestDocumentBuildConfig } from '../types'
17+
import {
18+
BuilderStrategy,
19+
BuildResult,
20+
BuildTypeContexts,
21+
ExportDocument,
22+
ExportRestDocumentBuildConfig,
23+
} from '../types'
1824
import { getDocumentTitle, getSplittedVersionKey } from '../utils'
19-
import { createCommonStaticExportDocuments, createSingleFileExportName } from '../utils/export'
25+
import {
26+
createCommonStaticExportDocuments,
27+
createSingleFileExportName,
28+
createUnknownExportDocument,
29+
generateIndexHtmlPage,
30+
} from '../utils/export'
2031
import { createRestExportDocument } from '../apitypes/rest/rest.document'
2132
import { FILE_FORMAT_HTML } from '../consts'
2233

@@ -26,17 +37,17 @@ export class ExportRestDocumentStrategy implements BuilderStrategy {
2637
const { rawDocumentResolver, templateResolver, packageResolver } = builderContext(config)
2738
const { packageId, version: versionWithRevision, documentId, format, allowedOasExtensions } = config
2839
const [version] = getSplittedVersionKey(versionWithRevision)
29-
40+
const generatedHtmlExportDocuments: ExportDocument[] = []
3041
const file = await rawDocumentResolver(
3142
versionWithRevision,
3243
packageId,
3344
documentId,
3445
)
3546
const { name: packageName } = await packageResolver(packageId)
36-
buildResult.exportDocuments.push(await createRestExportDocument(file.name, await file.text(), format, packageName, version, templateResolver, allowedOasExtensions))
37-
47+
buildResult.exportDocuments.push(await createRestExportDocument(file.name, await file.text(), format, packageName, version, templateResolver, allowedOasExtensions, generatedHtmlExportDocuments))
3848
if (format === FILE_FORMAT_HTML) {
39-
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageName, version, templateResolver, buildResult.exportDocuments[0].filename))
49+
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageName, version, templateResolver))
50+
buildResult.exportDocuments.push(createUnknownExportDocument('index.html', await generateIndexHtmlPage(packageName, version, generatedHtmlExportDocuments, templateResolver)))
4051
buildResult.exportFileName = createSingleFileExportName(packageId, version, getDocumentTitle(file.name), 'zip')
4152
return buildResult
4253
}

src/strategies/export-rest-operations-group.strategy.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ async function exportMergedDocument(config: ExportRestOperationsGroupBuildConfig
7878
buildResult.exportDocuments.push(await createRestExportDocument(buildResult.merged.filename, JSON.stringify(buildResult.merged?.data), format, packageName, version, templateResolver, allowedOasExtensions))
7979

8080
if (format === FILE_FORMAT_HTML) {
81-
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageName, version, templateResolver, buildResult.exportDocuments[0].filename))
81+
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageName, version, templateResolver))
8282
}
8383
}
8484

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

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

108107
buildResult.exportDocuments.push(...transformedDocuments)
109108

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

114-
if (shouldAddIndexPage) {
115-
buildResult.exportDocuments.push(createUnknownExportDocument('index.html', await generateIndexHtmlPage(packageName, version, generatedHtmlExportDocuments, templateResolver)))
116-
}
112+
buildResult.exportDocuments.push(createUnknownExportDocument('index.html', await generateIndexHtmlPage(packageName, version, generatedHtmlExportDocuments, templateResolver)))
117113
}
118114
}

src/strategies/export-version.strategy.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,7 @@ async function exportToHTML(config: ExportVersionBuildConfig, buildResult: Build
6363

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

7675
if (generatedHtmlExportDocuments.length > 0) {
77-
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageName, version, templateResolver, shouldAddIndexPage ? 'index.html' : buildResult.exportDocuments[0].filename))
76+
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageName, version, templateResolver))
7877
}
7978
if (shouldAddIndexPage) {
8079
const readme = await buildResult.exportDocuments.find(({ filename }) => filename.toLowerCase() === 'readme.md')?.data.text()

src/utils/export.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616
import { _TemplateResolver, ExportDocument } from '../types'
1717
import { getDocumentTitle } from './document'
1818

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

42-
export async function generateHtmlPage(document: string, fileTitle: string, packageName: string, version: string, templateResolver: _TemplateResolver, addBackLink: boolean = false): Promise<Blob> {
42+
export async function generateHtmlPage(document: string, fileTitle: string, packageName: string, version: string, templateResolver: _TemplateResolver): Promise<Blob> {
4343
const template = await (await templateResolver('page.html')).text()
4444
const apispecViewScript = await (await templateResolver('scripts/apispec-view.js')).text()
45-
const breadcrumbs = addBackLink ? `<div class="breadcrumbs"><a href="index.html">Table of contents</a> > <span>${fileTitle}</span></div>` : ''
45+
const breadcrumbs = `<div class="breadcrumbs"><a href="index.html">Table of contents</a> > <span>${fileTitle}</span></div>`
4646
const filled = template
4747
.replace('{{fileTitle}}', fileTitle)
4848
// arrow function disables replacement patterns like $&

test/export.test.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ describe('Export test', () => {
117117
expect(result).toEqual(exportDocumentsMatcher([
118118
exportDocumentMatcher('1.html'),
119119
exportDocumentMatcher('ls.html'),
120+
exportDocumentMatcher('index.html'),
120121
exportDocumentMatcher('resources/corporatelogo.png'),
121122
exportDocumentMatcher('resources/styles.css'),
122123
]))
@@ -211,7 +212,7 @@ describe('Export test', () => {
211212
expect(result.exportFileName).toEqual('export_single-document-version.zip')
212213
expect(result).toEqual(exportDocumentsMatcher([
213214
exportDocumentMatcher('1.html'),
214-
215+
exportDocumentMatcher('index.html'),
215216
exportDocumentMatcher('ls.html'),
216217
exportDocumentMatcher('resources/corporatelogo.png'),
217218
exportDocumentMatcher('resources/styles.css'),
@@ -253,7 +254,7 @@ describe('Export test', () => {
253254
exportDocumentMatcher('1.html'),
254255
exportDocumentMatcher('README.md'),
255256

256-
exportDocumentMatcher('index.html'), // contains index.html due to the presence of README
257+
exportDocumentMatcher('index.html'),
257258
exportDocumentMatcher('ls.html'),
258259
exportDocumentMatcher('resources/corporatelogo.png'),
259260
exportDocumentMatcher('resources/styles.css'),
@@ -300,7 +301,7 @@ describe('Export test', () => {
300301
expect(result.exportFileName).toEqual('export_regular-version_GROUP_WITH_OPERATIONS_FROM_ONE_DOCUMENT_ONLY.zip')
301302
expect(result).toEqual(exportDocumentsMatcher([
302303
exportDocumentMatcher('2.html'),
303-
304+
exportDocumentMatcher('index.html'),
304305
exportDocumentMatcher('ls.html'),
305306
exportDocumentMatcher('resources/corporatelogo.png'),
306307
exportDocumentMatcher('resources/styles.css'),

0 commit comments

Comments
 (0)