Skip to content

Commit 279e5d1

Browse files
committed
fix: use packageName instead of packageId in html
1 parent dae1451 commit 279e5d1

File tree

14 files changed

+114
-45
lines changed

14 files changed

+114
-45
lines changed

src/builder.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ import { asyncDebugPerformance } from './utils/logs'
7777
import { ExportVersionStrategy } from './strategies/export-version.strategy'
7878
import { ExportRestDocumentStrategy } from './strategies/export-rest-document.strategy'
7979
import { ExportRestOperationsGroupStrategy } from './strategies/export-rest-operations-group.strategy'
80+
import { ResolvedPackage } from './types/external/package'
8081

8182
export const DEFAULT_RUN_OPTIONS: BuilderRunOptions = {
8283
cleanCache: false,
@@ -181,6 +182,7 @@ export class PackageVersionBuilder implements IPackageVersionBuilder {
181182
apiBuilders: this.apiBuilders,
182183
// todo only used in build strategy, move to the dedicated BuilderContext subtype
183184
basePath: basePath,
185+
packageResolver: this.packageResolver.bind(this),
184186
versionDeprecatedResolver: this.versionDeprecatedResolver.bind(this),
185187
templateResolver: this.templateResolver.bind(this),
186188
parsedFileResolver: this.parsedFileResolver.bind(this),
@@ -427,6 +429,22 @@ export class PackageVersionBuilder implements IPackageVersionBuilder {
427429
return documents
428430
}
429431

432+
async packageResolver(
433+
packageId: string,
434+
): Promise<ResolvedPackage> {
435+
const { packageResolver } = this.params.resolvers
436+
if (!packageResolver) {
437+
throw new Error('No packageResolver provided')
438+
}
439+
440+
const resolvedPackage = await packageResolver(packageId)
441+
if (!resolvedPackage) {
442+
throw new Error(`No such package: packageId: ${packageId}`)
443+
}
444+
445+
return resolvedPackage
446+
}
447+
430448
async versionDocumentsResolver(
431449
version: VersionId,
432450
packageId: PackageId,

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import {
3838
async function createTransformedDocument(
3939
file: File,
4040
format: OperationsGroupExportFormat,
41-
packageId: string,
41+
packageName: string,
4242
version: string,
4343
templateResolver: _TemplateResolver,
4444
allowedOasExtensions?: OpenApiExtensionKey[],
@@ -48,7 +48,7 @@ async function createTransformedDocument(
4848
if (format === HTML_EXPORT_GROUP_FORMAT) {
4949
return createExportDocument(
5050
`${getDocumentTitle(file.name)}.${HTML_EXPORT_GROUP_FORMAT}`,
51-
await generateHtmlPage(JSON.stringify(data, undefined, 2), getDocumentTitle(file.name), packageId, version, templateResolver),
51+
await generateHtmlPage(JSON.stringify(data, undefined, 2), getDocumentTitle(file.name), packageName, version, templateResolver),
5252
)
5353
}
5454

@@ -66,19 +66,20 @@ async function createTransformedDocument(
6666
export class ExportRestDocumentStrategy implements BuilderStrategy {
6767
async execute(config: ExportRestDocumentBuildConfig, buildResult: BuildResult, contexts: BuildTypeContexts): Promise<BuildResult> {
6868
const { builderContext } = contexts
69-
const { rawDocumentResolver, templateResolver } = builderContext(config)
69+
const { rawDocumentResolver, templateResolver, packageResolver } = builderContext(config)
7070
const { packageId, version, documentId, format, allowedOasExtensions } = config
7171

7272
const file = await rawDocumentResolver(
7373
version,
7474
packageId,
7575
documentId, //document.slug,
7676
)
77+
const { name: packageName } = await packageResolver(packageId)
7778

78-
buildResult.exportDocuments.push(await createTransformedDocument(file, format, packageId, version, templateResolver, allowedOasExtensions))
79+
buildResult.exportDocuments.push(await createTransformedDocument(file, format, packageName, version, templateResolver, allowedOasExtensions))
7980

8081
if (format === HTML_EXPORT_GROUP_FORMAT) {
81-
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageId, version, templateResolver, buildResult.exportDocuments[0].fileId))
82+
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageName, version, templateResolver, buildResult.exportDocuments[0].fileId))
8283
buildResult.exportFileName = createSingleFileExportName(packageId, version, getDocumentTitle(file.name), 'zip')
8384
return buildResult
8485
}

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

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ export class ExportRestOperationsGroupStrategy implements BuilderStrategy {
5858

5959
async function exportMergedDocument(config: ExportRestOperationsGroupBuildConfig, buildResult: BuildResult, contexts: BuildTypeContexts): Promise<BuildResult> {
6060
const { packageId, version, groupName, format = JSON_EXPORT_GROUP_FORMAT, allowedOasExtensions } = config
61-
const { templateResolver } = contexts.builderContext(config)
61+
const { templateResolver, packageResolver } = contexts.builderContext(config)
62+
const { name: packageName } = await packageResolver(packageId)
6263

6364
await new MergedDocumentGroupStrategy().execute({
6465
...config,
@@ -73,10 +74,10 @@ async function exportMergedDocument(config: ExportRestOperationsGroupBuildConfig
7374
if (format === HTML_EXPORT_GROUP_FORMAT) {
7475
const htmlExportDocument = createExportDocument(
7576
`${getDocumentTitle(buildResult.merged.filename)}.${HTML_EXPORT_GROUP_FORMAT}`,
76-
await generateHtmlPage(JSON.stringify(removeOasExtensions(buildResult.merged?.data, allowedOasExtensions), undefined, 2), getDocumentTitle(buildResult.merged.filename), packageId, version, templateResolver, false),
77+
await generateHtmlPage(JSON.stringify(removeOasExtensions(buildResult.merged?.data, allowedOasExtensions), undefined, 2), getDocumentTitle(buildResult.merged.filename), packageName, version, templateResolver, false),
7778
)
7879
buildResult.exportDocuments.push(htmlExportDocument)
79-
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageId, version, templateResolver, htmlExportDocument.filename))
80+
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageName, version, templateResolver, htmlExportDocument.filename))
8081
buildResult.exportFileName = `${packageId}_${version}_${groupName}.zip`
8182
return buildResult
8283
}
@@ -96,7 +97,8 @@ async function exportMergedDocument(config: ExportRestOperationsGroupBuildConfig
9697

9798
async function exportReducedDocuments(config: ExportRestOperationsGroupBuildConfig, buildResult: BuildResult, contexts: BuildTypeContexts): Promise<BuildResult> {
9899
const { packageId, version, groupName, format = JSON_EXPORT_GROUP_FORMAT, allowedOasExtensions } = config
99-
const { templateResolver } = contexts.builderContext(config)
100+
const { templateResolver, packageResolver } = contexts.builderContext(config)
101+
const { name: packageName } = await packageResolver(packageId)
100102

101103
await new DocumentGroupStrategy().execute({
102104
...config,
@@ -106,14 +108,14 @@ async function exportReducedDocuments(config: ExportRestOperationsGroupBuildConf
106108

107109
const generatedHtmlExportDocuments: ZippableDocument[] = []
108110
const transformedDocuments = await Promise.all([...buildResult.documents.values()].map(async document => {
109-
return await createTransformedDocument(document, format, packageId, version, generatedHtmlExportDocuments, templateResolver, allowedOasExtensions)
111+
return await createTransformedDocument(document, format, packageName, version, generatedHtmlExportDocuments, templateResolver, allowedOasExtensions)
110112
}))
111113

112114
buildResult.exportDocuments.push(...transformedDocuments)
113115

114116
if (format === HTML_EXPORT_GROUP_FORMAT) {
115-
buildResult.exportDocuments.push(createExportDocument('index.html', await generateIndexHtmlPage(packageId, version, generatedHtmlExportDocuments, templateResolver)))
116-
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageId, version, templateResolver))
117+
buildResult.exportDocuments.push(createExportDocument('index.html', await generateIndexHtmlPage(packageName, version, generatedHtmlExportDocuments, templateResolver)))
118+
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageName, version, templateResolver))
117119
}
118120

119121
if (buildResult.exportDocuments.length > 1) {
@@ -128,7 +130,7 @@ async function exportReducedDocuments(config: ExportRestOperationsGroupBuildConf
128130
async function createTransformedDocument(
129131
document: VersionDocument,
130132
format: OperationsGroupExportFormat,
131-
packageId: string,
133+
packageName: string,
132134
version: string,
133135
generatedHtmlExportDocuments: ZippableDocument[],
134136
templateResolver: _TemplateResolver,
@@ -139,7 +141,7 @@ async function createTransformedDocument(
139141
if (isRestDocument(document) && format === HTML_EXPORT_GROUP_FORMAT) {
140142
const htmlExportDocument = createExportDocument(
141143
`${getDocumentTitle(document.filename)}.${HTML_EXPORT_GROUP_FORMAT}`,
142-
await generateHtmlPage(JSON.stringify(removeOasExtensions(document.data, allowedOasExtensions), undefined, 2), getDocumentTitle(document.filename), packageId, version, templateResolver, true),
144+
await generateHtmlPage(JSON.stringify(removeOasExtensions(document.data, allowedOasExtensions), undefined, 2), getDocumentTitle(document.filename), packageName, version, templateResolver, true),
143145
)
144146
generatedHtmlExportDocuments.push(htmlExportDocument)
145147
return htmlExportDocument

src/strategies/export-version.strategy.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ async function createTransformedDocument(
6060
document: ResolvedVersionDocument,
6161
file: File,
6262
format: OperationsGroupExportFormat,
63-
packageId: string,
63+
packageName: string,
6464
version: string,
6565
generatedHtmlExportDocuments: ZippableDocument[],
6666
templateResolver: _TemplateResolver,
@@ -73,7 +73,7 @@ async function createTransformedDocument(
7373
if (isRestDocument(document) && format === HTML_EXPORT_GROUP_FORMAT) {
7474
const htmlExportDocument = createExportDocument(
7575
`${getDocumentTitle(file.name)}.${HTML_EXPORT_GROUP_FORMAT}`,
76-
await generateHtmlPage(JSON.stringify(removeOasExtensions(JSON.parse(data), allowedOasExtensions), undefined, 2), getDocumentTitle(file.name), packageId, version, templateResolver, true),
76+
await generateHtmlPage(JSON.stringify(removeOasExtensions(JSON.parse(data), allowedOasExtensions), undefined, 2), getDocumentTitle(file.name), packageName, version, templateResolver, true),
7777
)
7878
generatedHtmlExportDocuments.push(htmlExportDocument)
7979
return htmlExportDocument
@@ -93,8 +93,9 @@ async function createTransformedDocument(
9393
export class ExportVersionStrategy implements BuilderStrategy {
9494
async execute(config: ExportVersionBuildConfig, buildResult: BuildResult, contexts: BuildTypeContexts): Promise<BuildResult> {
9595
const { builderContext } = contexts
96-
const { versionDocumentsResolver, rawDocumentResolver, templateResolver } = builderContext(config)
96+
const { versionDocumentsResolver, rawDocumentResolver, templateResolver, packageResolver } = builderContext(config)
9797
const { packageId, version, format = JSON_EXPORT_GROUP_FORMAT, allowedOasExtensions } = config
98+
const { name: packageName } = await packageResolver(packageId)
9899

99100
const { documents } = await versionDocumentsResolver(
100101
version,
@@ -104,18 +105,18 @@ export class ExportVersionStrategy implements BuilderStrategy {
104105
const generatedHtmlExportDocuments: ZippableDocument[] = []
105106
const transformedDocuments = await Promise.all(documents.map(async document => {
106107
const file = await rawDocumentResolver(version, packageId, document.slug)
107-
return await createTransformedDocument(document, file, format, packageId, version, generatedHtmlExportDocuments, templateResolver, allowedOasExtensions)
108+
return await createTransformedDocument(document, file, format, packageName, version, generatedHtmlExportDocuments, templateResolver, allowedOasExtensions)
108109
}))
109110

110111
buildResult.exportDocuments.push(...transformedDocuments)
111112

112113
const restDocuments = documents.filter(isRestDocument)
113114
if (format === HTML_EXPORT_GROUP_FORMAT && restDocuments.length > 0) {
114-
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageId, version, templateResolver))
115+
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageName, version, templateResolver))
115116
const readme = buildResult.exportDocuments.find(({ fileId }) => fileId.toLowerCase() === 'readme.md')?.description
116117

117118
if (restDocuments.length > 1 || readme) {
118-
buildResult.exportDocuments.push(createExportDocument('index.html', await generateIndexHtmlPage(packageId, version, generatedHtmlExportDocuments, templateResolver, readme)))
119+
buildResult.exportDocuments.push(createExportDocument('index.html', await generateIndexHtmlPage(packageName, version, generatedHtmlExportDocuments, templateResolver, readme)))
119120
}
120121
}
121122

src/types/external/package.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* Copyright 2024-2025 NetCracker Technology Corporation
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
import { PackageId } from './types'
18+
19+
export type PackageResolver = (
20+
packageId: PackageId,
21+
) => Promise<ResolvedPackage | null>
22+
23+
export type ResolvedPackage = {
24+
packageId: string
25+
name: string
26+
27+
// other params (not used in builder logic)
28+
[key: string]: unknown
29+
}

src/types/external/resolvers.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,11 @@ import { VersionOperationsResolver } from './operations'
2727
import { VersionReferencesResolver } from './references'
2828
import { VersionResolver } from './version'
2929
import { GroupExportTemplateResolver } from '../internal'
30+
import { PackageResolver } from './package'
3031

3132
export interface BuilderResolvers {
3233
fileResolver: FileResolver
34+
packageResolver?: PackageResolver
3335
versionResolver?: VersionResolver
3436
versionOperationsResolver?: VersionOperationsResolver
3537
versionReferencesResolver?: VersionReferencesResolver

src/types/internal/apiBuilder.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import { SourceFile, TextFile } from './internal'
4141
import { ApiOperation } from './operation'
4242
import { Diff } from '@netcracker/qubership-apihub-api-diff'
4343
import { DebugPerformanceContext } from '../../utils/logs'
44+
import { ResolvedPackage } from '../external/package'
4445

4546
export type BuilderType =
4647
| typeof REST_API_TYPE
@@ -55,6 +56,7 @@ export interface BuilderContext<T = any> {
5556
basePath: string
5657
parsedFileResolver: _ParsedFileResolver
5758
templateResolver: _TemplateResolver
59+
packageResolver: _PackageResolver
5860
notifications: NotificationMessage[]
5961
config: BuildConfig
6062
builderRunOptions: BuilderRunOptions
@@ -116,6 +118,7 @@ export interface ApiBuilder<T = any, O = any, M = any> {
116118
}
117119

118120
// internal
121+
export type _PackageResolver = (packageId: PackageId) => Promise<ResolvedPackage>
119122
export type _VersionResolver = (packageId: PackageId, version: VersionId) => Promise<VersionCache | null>
120123
export type _VersionReferencesResolver = (packageId: PackageId, version: VersionId) => Promise<BuildConfigRef[]>
121124

src/utils/export.ts

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ import { _TemplateResolver, ZippableDocument } from '../types'
1717
import { UNKNOWN_API_TYPE } from '../apitypes'
1818
import { getDocumentTitle } from './document'
1919

20-
export async function createCommonStaticExportDocuments(packageId: string, version: string, templateResolver: _TemplateResolver, backLinkFilename: string = 'index.html'): Promise<ZippableDocument[]> {
20+
export async function createCommonStaticExportDocuments(packageName: string, version: string, templateResolver: _TemplateResolver, backLinkFilename: string = 'index.html'): Promise<ZippableDocument[]> {
2121
return [
22-
createExportDocument('ls.html', await generateLegalStatementPage(packageId, version, await templateResolver('ls.html'), backLinkFilename)),
22+
createExportDocument('ls.html', await generateLegalStatementPage(packageName, version, await templateResolver('ls.html'), backLinkFilename)),
2323
createExportDocument('resources/corporatelogo.svg', await templateResolver('resources/corporatelogo.svg')),
2424
createExportDocument('resources/styles.css', await templateResolver('resources/styles.css')),
2525
]
@@ -37,31 +37,25 @@ export function createExportDocument(fileId: string, source: Blob): ZippableDocu
3737
}
3838
}
3939

40-
export async function generateLegalStatementPage(packageId: string, version: string, legalStatement: Blob, backLinkFilename: string): Promise<Blob> {
40+
export async function generateLegalStatementPage(packageName: string, version: string, legalStatement: Blob, backLinkFilename: string): Promise<Blob> {
4141
const filled = (await legalStatement.text())
42-
// todo use packageName instead of packageId
43-
.replace('{{packageName}}', packageId)
44-
.replace('{{version}}', version)
42+
.replaceAll('{{packageName}}', packageName)
43+
.replaceAll('{{version}}', version)
4544
.replace('{{backLinkFilename}}', backLinkFilename)
46-
// todo use packageName instead of packageId
47-
.replace('{{packageNameAndVersion}}', `${packageId} ${version}`)
4845
return new Blob([filled])
4946
}
5047

51-
export async function generateHtmlPage(document: string, fileTitle: string, packageId: string, version: string, templateResolver: _TemplateResolver, addBackLink: boolean = false): Promise<Blob> {
48+
export async function generateHtmlPage(document: string, fileTitle: string, packageName: string, version: string, templateResolver: _TemplateResolver, addBackLink: boolean = false): Promise<Blob> {
5249
const template = await (await templateResolver('page.html')).text()
5350
const apispecViewScript = await (await templateResolver('scripts/apispec-view.js')).text()
5451
const breadcrumbs = addBackLink ? `<div class="breadcrumbs"><a href="index.html">Table of contents</a> > <span>${fileTitle}</span></div>` : ''
5552
const filled = template
5653
.replace('{{fileTitle}}', fileTitle)
5754
.replace('{{apispecViewScript}}', () => apispecViewScript)
58-
// todo use packageName instead of packageId
59-
.replace('{{packageName}}', packageId)
60-
.replace('{{version}}', version)
55+
.replaceAll('{{packageName}}', packageName)
56+
.replaceAll('{{version}}', version)
6157
.replace('{{breadcrumbs}}', breadcrumbs)
6258
.replace('{{spec}}', escapeHTML(document))
63-
// todo use packageName instead of packageId
64-
.replace('{{packageNameAndVersion}}', `${packageId} ${version}`)
6559
return new Blob([filled])
6660
}
6761

@@ -83,7 +77,7 @@ async function generateReadmeParts(templateResolver: _TemplateResolver, readme?:
8377
return [readmeHtml, `<script>${markdownIt}</script>`]
8478
}
8579

86-
export async function generateIndexHtmlPage(packageId: string, version: string, generatedHtmlExportDocuments: ZippableDocument[], templateResolver: _TemplateResolver, readme?: string): Promise<Blob> {
80+
export async function generateIndexHtmlPage(packageName: string, version: string, generatedHtmlExportDocuments: ZippableDocument[], templateResolver: _TemplateResolver, readme?: string): Promise<Blob> {
8781
const template = await (await templateResolver('index.html')).text()
8882
const htmlList = generatedHtmlExportDocuments.reduce(
8983
(acc, { filename }) => acc.concat(` <li><a href="${filename}">${getDocumentTitle(filename)}</a></li>\n`),
@@ -93,14 +87,11 @@ export async function generateIndexHtmlPage(packageId: string, version: string,
9387
const [readmeHtml, markdownItScript] = await generateReadmeParts(templateResolver, readme)
9488

9589
const filled = template
96-
// todo use packageName instead of packageId
97-
.replaceAll('{{packageName}}', packageId)
90+
.replaceAll('{{packageName}}', packageName)
91+
.replaceAll('{{version}}', version)
9892
.replace('{{markdownItScript}}', markdownItScript)
99-
.replace('{{version}}', version)
10093
.replace('{{readmeHtml}}', readmeHtml)
10194
.replace('{{htmlList}}', htmlList)
102-
// todo use packageName instead of packageId
103-
.replace('{{packageNameAndVersion}}', `${packageId} ${version}`)
10495
return new Blob([filled])
10596
}
10697

templates/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ <h4>Version: {{version}}</h4>
2727
<a href="ls.html">Legal statement</a>
2828
</span>
2929
<span class="footer__legal">
30-
{{packageNameAndVersion}}<br><br>
30+
{{packageName}} {{version}}<br><br>
3131
qubership-apihub
3232
</span>
3333
</div>

templates/ls.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ <h4>Version: {{version}}</h4>
4141
</div>
4242
<div class="footer">
4343
<span class="footer__legal">
44-
{{packageNameAndVersion}}<br><br>
44+
{{packageName}} {{version}}<br><br>
4545
qubership-apihub
4646
</span>
4747
</div>

0 commit comments

Comments
 (0)