Skip to content

Commit 189b03e

Browse files
committed
refactor: simplify export strategies
1 parent 7c4d740 commit 189b03e

File tree

15 files changed

+169
-238
lines changed

15 files changed

+169
-238
lines changed

src/apitypes/rest/rest.document.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,9 @@ import {
2525
DocumentBuilder,
2626
DocumentDumper,
2727
ExportDocument,
28-
HTML_EXPORT_GROUP_FORMAT,
29-
OperationsGroupExportFormat,
28+
ExportFormat,
3029
} from '../../types'
31-
import { FILE_FORMAT, FILE_FORMAT_JSON } from '../../consts'
30+
import { FILE_FORMAT, FILE_FORMAT_HTML, FILE_FORMAT_JSON } from '../../consts'
3231
import {
3332
createBundlingErrorHandler,
3433
EXPORT_FORMAT_TO_FILE_FORMAT,
@@ -120,25 +119,26 @@ export const dumpRestDocument: DocumentDumper<OpenAPIV3.Document> = (document, f
120119
export async function createRestExportDocument(
121120
filename: string,
122121
data: string,
123-
format: OperationsGroupExportFormat,
122+
format: ExportFormat,
124123
packageName: string,
125124
version: string,
126125
templateResolver: _TemplateResolver,
127126
allowedOasExtensions?: OpenApiExtensionKey[],
128127
generatedHtmlExportDocuments?: ExportDocument[],
128+
addBackLink?: boolean,
129129
): Promise<ExportDocument> {
130130
const exportFilename = `${getDocumentTitle(filename)}.${format}`
131-
const [d, bp] = dump(removeOasExtensions(JSON.parse(data), allowedOasExtensions), EXPORT_FORMAT_TO_FILE_FORMAT.get(format)!)
131+
const [[document], blobProperties] = dump(removeOasExtensions(JSON.parse(data), allowedOasExtensions), EXPORT_FORMAT_TO_FILE_FORMAT.get(format)!)
132132

133-
if (format === HTML_EXPORT_GROUP_FORMAT) {
133+
if (format === FILE_FORMAT_HTML) {
134134
const htmlExportDocument = {
135135
data: await generateHtmlPage(
136-
d[0],
136+
document,
137137
getDocumentTitle(filename),
138138
packageName,
139139
version,
140140
templateResolver,
141-
true,
141+
addBackLink,
142142
),
143143
filename: exportFilename,
144144
}
@@ -147,7 +147,7 @@ export async function createRestExportDocument(
147147
}
148148

149149
return {
150-
data: new Blob(d, bp),
150+
data: new Blob([document], blobProperties),
151151
filename: exportFilename,
152152
}
153153
}

src/apitypes/rest/rest.utils.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,9 @@ export const resolveApiAudience = (info: unknown): ApiAudience => {
7070
export const dump = (value: unknown, format: typeof FILE_FORMAT_YAML | typeof FILE_FORMAT_JSON): [[string], BlobPropertyBag] => {
7171
if (format === FILE_FORMAT_YAML) {
7272
return [[YAML.dump(value)], { type: 'application/yaml' }]
73-
// return new Blob([YAML.dump(value)], { type: 'application/yaml' })
7473
}
7574
if (format === FILE_FORMAT_JSON) {
7675
return [[JSON.stringify(value, undefined, 2)], { type: 'application/json' }]
77-
// return new Blob([JSON.stringify(value, undefined, 2)], { type: 'application/json' })
7876
}
7977
throw new Error(`Unsupported format: ${format}`)
8078
}

src/components/package.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import {
3636
} from '../types'
3737
import { unknownApiBuilder } from '../apitypes'
3838
import { BUILD_TYPE, MESSAGE_SEVERITY, PACKAGE } from '../consts'
39-
import { takeIf, toPackageDocument } from '../utils'
39+
import { EXPORT_FORMAT_TO_FILE_FORMAT, takeIf, toPackageDocument } from '../utils'
4040
import { toVersionsComparisonDto } from '../utils/transformToDto'
4141

4242
export interface ZipTool {
@@ -130,8 +130,8 @@ const writeDocumentsToZip = async (zip: ZipTool, documents: ZippableDocument[],
130130

131131
const apiBuilder =
132132
apiBuilders.find(({ types }) => types.includes(document.type)) || unknownApiBuilder
133-
// @ts-ignore todo
134-
const data = apiBuilder.dumpDocument(document, format)
133+
const documentFormat = EXPORT_FORMAT_TO_FILE_FORMAT.get(format!)
134+
const data = apiBuilder.dumpDocument(document, documentFormat)
135135
await zip.file(document.filename, data)
136136
}
137137
}

src/consts.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -135,14 +135,8 @@ export const FILE_FORMAT = {
135135
PROTO: FILE_FORMAT_PROTO,
136136
} as const
137137

138-
//todo separate supported for build and for export
139138
export const SUPPORTED_FILE_FORMATS = Object.values(FILE_FORMAT)
140139

141-
export type ExportFileFormat =
142-
| typeof FILE_FORMAT_YAML
143-
| typeof FILE_FORMAT_JSON
144-
| typeof FILE_FORMAT_HTML
145-
146140
export const SYNTHETIC_TITLE_FLAG = Symbol('synthetic-title')
147141
export const ORIGINS_SYMBOL = Symbol('origins')
148142
export const HASH_FLAG = Symbol('hash')

src/strategies/document-group.strategy.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import {
1919
BuildResult,
2020
BuildTypeContexts,
2121
FileFormat,
22-
JSON_EXPORT_GROUP_FORMAT,
2322
ReducedSourceSpecificationsBuildConfig,
2423
ResolvedGroupDocument,
2524
ResolvedReferenceMap,
@@ -37,7 +36,7 @@ import {
3736
import { OpenAPIV3 } from 'openapi-types'
3837
import { getOperationBasePath } from '../apitypes/rest/rest.utils'
3938
import { VersionRestDocument } from '../apitypes/rest/rest.types'
40-
import { INLINE_REFS_FLAG, NORMALIZE_OPTIONS } from '../consts'
39+
import { FILE_FORMAT_JSON, INLINE_REFS_FLAG, NORMALIZE_OPTIONS } from '../consts'
4140
import { normalize } from '@netcracker/qubership-apihub-api-unifier'
4241
import { calculateSpecRefs, extractCommonPathItemProperties } from '../apitypes/rest/rest.operation'
4342

@@ -71,7 +70,7 @@ function getTransformedDocument(document: ResolvedGroupDocument, format: FileFor
7170
export class DocumentGroupStrategy implements BuilderStrategy {
7271
async execute(config: ReducedSourceSpecificationsBuildConfig, buildResult: BuildResult, contexts: BuildTypeContexts): Promise<BuildResult> {
7372
const { builderContext } = contexts
74-
const { packageId, version, groupName, apiType, format = JSON_EXPORT_GROUP_FORMAT } = config
73+
const { packageId, version, groupName, apiType, format = FILE_FORMAT_JSON } = config
7574

7675
if (!groupName) {
7776
throw new Error('No group to transform documents for provided')

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

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -14,34 +14,11 @@
1414
* limitations under the License.
1515
*/
1616

17-
import {
18-
_TemplateResolver,
19-
BuilderStrategy,
20-
BuildResult,
21-
BuildTypeContexts,
22-
DocumentExporter,
23-
ExportDocument,
24-
ExportRestDocumentBuildConfig,
25-
HTML_EXPORT_GROUP_FORMAT,
26-
OperationsGroupExportFormat,
27-
} from '../types'
17+
import { BuilderStrategy, BuildResult, BuildTypeContexts, ExportRestDocumentBuildConfig } from '../types'
2818
import { getDocumentTitle, getSplittedVersionKey } from '../utils'
29-
import { OpenApiExtensionKey } from '@netcracker/qubership-apihub-api-unifier'
3019
import { createCommonStaticExportDocuments, createSingleFileExportName } from '../utils/export'
3120
import { createRestExportDocument } from '../apitypes/rest/rest.document'
32-
33-
async function createTransformedDocument(
34-
file: File,
35-
format: OperationsGroupExportFormat,
36-
packageName: string,
37-
version: string,
38-
templateResolver: _TemplateResolver,
39-
createExportDocument: DocumentExporter,
40-
allowedOasExtensions?: OpenApiExtensionKey[],
41-
generatedHtmlExportDocuments?: ExportDocument[],
42-
): Promise<ExportDocument> {
43-
return createExportDocument?.(file.name, await file.text(), format, packageName, version, templateResolver, allowedOasExtensions, generatedHtmlExportDocuments)
44-
}
21+
import { FILE_FORMAT_HTML } from '../consts'
4522

4623
export class ExportRestDocumentStrategy implements BuilderStrategy {
4724
async execute(config: ExportRestDocumentBuildConfig, buildResult: BuildResult, contexts: BuildTypeContexts): Promise<BuildResult> {
@@ -56,10 +33,9 @@ export class ExportRestDocumentStrategy implements BuilderStrategy {
5633
documentId,
5734
)
5835
const { name: packageName } = await packageResolver(packageId)
36+
buildResult.exportDocuments.push(await createRestExportDocument(file.name, await file.text(), format, packageName, version, templateResolver, allowedOasExtensions))
5937

60-
buildResult.exportDocuments.push(await createTransformedDocument(file, format, packageName, version, templateResolver, createRestExportDocument, allowedOasExtensions))
61-
62-
if (format === HTML_EXPORT_GROUP_FORMAT) {
38+
if (format === FILE_FORMAT_HTML) {
6339
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageName, version, templateResolver, buildResult.exportDocuments[0].filename))
6440
buildResult.exportFileName = createSingleFileExportName(packageId, version, getDocumentTitle(file.name), 'zip')
6541
return buildResult

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

Lines changed: 26 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -15,47 +15,50 @@
1515
*/
1616

1717
import {
18-
_TemplateResolver,
1918
BuilderStrategy,
2019
BuildResult,
2120
BuildTypeContexts,
22-
DocumentExporter,
2321
ExportDocument,
2422
ExportRestOperationsGroupBuildConfig,
25-
HTML_EXPORT_GROUP_FORMAT,
26-
JSON_EXPORT_GROUP_FORMAT,
27-
OperationsGroupExportFormat,
2823
TRANSFORMATION_KIND_MERGED,
2924
TRANSFORMATION_KIND_REDUCED,
3025
} from '../types'
3126
import { DocumentGroupStrategy } from './document-group.strategy'
3227
import { MergedDocumentGroupStrategy } from './merged-document-group.strategy'
3328
import { EXPORT_FORMAT_TO_FILE_FORMAT, getSplittedVersionKey } from '../utils'
34-
import { OpenApiExtensionKey } from '@netcracker/qubership-apihub-api-unifier'
35-
import { BUILD_TYPE } from '../consts'
29+
import { BUILD_TYPE, FILE_FORMAT_HTML, FILE_FORMAT_JSON } from '../consts'
3630
import { createCommonStaticExportDocuments, createUnknownExportDocument, generateIndexHtmlPage } from '../utils/export'
3731
import { createRestExportDocument } from '../apitypes/rest/rest.document'
32+
import { isRestDocument } from '../apitypes'
3833

3934
export class ExportRestOperationsGroupStrategy implements BuilderStrategy {
4035
async execute(config: ExportRestOperationsGroupBuildConfig, buildResult: BuildResult, contexts: BuildTypeContexts): Promise<BuildResult> {
41-
4236
switch (config.operationsSpecTransformation) {
4337
case TRANSFORMATION_KIND_MERGED:
4438
await exportMergedDocument(config, buildResult, contexts)
45-
return buildResult
39+
break
4640
case TRANSFORMATION_KIND_REDUCED:
4741
await exportReducedDocuments(config, buildResult, contexts)
48-
return buildResult
42+
break
43+
}
44+
45+
const { packageId, version: versionWithRevision, format = FILE_FORMAT_JSON, groupName } = config
46+
const [version] = getSplittedVersionKey(versionWithRevision)
47+
if (buildResult.exportDocuments.length > 1) {
48+
buildResult.exportFileName = `${packageId}_${version}_${groupName}.zip`
49+
return buildResult
4950
}
51+
52+
buildResult.exportFileName = `${packageId}_${version}_${groupName}.${format}`
53+
return buildResult
5054
}
5155
}
5256

53-
async function exportMergedDocument(config: ExportRestOperationsGroupBuildConfig, buildResult: BuildResult, contexts: BuildTypeContexts): Promise<BuildResult> {
57+
async function exportMergedDocument(config: ExportRestOperationsGroupBuildConfig, buildResult: BuildResult, contexts: BuildTypeContexts): Promise<void> {
5458
const {
5559
packageId,
5660
version: versionWithRevision,
57-
groupName,
58-
format = JSON_EXPORT_GROUP_FORMAT,
61+
format = FILE_FORMAT_JSON,
5962
allowedOasExtensions,
6063
} = config
6164
const [version] = getSplittedVersionKey(versionWithRevision)
@@ -74,23 +77,16 @@ async function exportMergedDocument(config: ExportRestOperationsGroupBuildConfig
7477

7578
buildResult.exportDocuments.push(await createRestExportDocument(buildResult.merged.filename, JSON.stringify(buildResult.merged?.data), format, packageName, version, templateResolver, allowedOasExtensions))
7679

77-
if (format === HTML_EXPORT_GROUP_FORMAT) {
78-
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageName, version, templateResolver))
79-
buildResult.exportFileName = `${packageId}_${version}_${groupName}.zip`
80-
return buildResult
80+
if (format === FILE_FORMAT_HTML) {
81+
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageName, version, templateResolver, buildResult.exportDocuments[0].filename))
8182
}
82-
83-
buildResult.exportFileName = `${packageId}_${version}_${groupName}.${format}`
84-
85-
return buildResult
8683
}
8784

88-
async function exportReducedDocuments(config: ExportRestOperationsGroupBuildConfig, buildResult: BuildResult, contexts: BuildTypeContexts): Promise<BuildResult> {
85+
async function exportReducedDocuments(config: ExportRestOperationsGroupBuildConfig, buildResult: BuildResult, contexts: BuildTypeContexts): Promise<void> {
8986
const {
9087
packageId,
9188
version: versionWithRevision,
92-
groupName,
93-
format = JSON_EXPORT_GROUP_FORMAT,
89+
format = FILE_FORMAT_JSON,
9490
allowedOasExtensions,
9591
} = config
9692
const [version] = getSplittedVersionKey(versionWithRevision)
@@ -104,39 +100,19 @@ async function exportReducedDocuments(config: ExportRestOperationsGroupBuildConf
104100
}, buildResult, contexts)
105101

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

111108
buildResult.exportDocuments.push(...transformedDocuments)
112109

113-
if (format === HTML_EXPORT_GROUP_FORMAT) {
114-
buildResult.exportDocuments.push(...await createCommonStaticExportDocuments(packageName, version, templateResolver))
110+
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))
115113

116-
if (generatedHtmlExportDocuments.length > 1) {
114+
if (shouldAddIndexPage) {
117115
buildResult.exportDocuments.push(createUnknownExportDocument('index.html', await generateIndexHtmlPage(packageName, version, generatedHtmlExportDocuments, templateResolver)))
118116
}
119117
}
120-
121-
if (buildResult.exportDocuments.length > 1) {
122-
buildResult.exportFileName = `${packageId}_${version}_${groupName}.zip`
123-
return buildResult
124-
}
125-
126-
buildResult.exportFileName = `${packageId}_${version}_${groupName}.${format}`
127-
return buildResult
128-
}
129-
130-
async function createTransformedDocument(
131-
filename: string,
132-
data: string,
133-
format: OperationsGroupExportFormat,
134-
packageName: string,
135-
version: string,
136-
templateResolver: _TemplateResolver,
137-
createExportDocument: DocumentExporter,
138-
allowedOasExtensions?: OpenApiExtensionKey[],
139-
generatedHtmlExportDocuments?: ExportDocument[],
140-
): Promise<ExportDocument> {
141-
return createExportDocument?.(filename, data, format, packageName, version, templateResolver, allowedOasExtensions, generatedHtmlExportDocuments)
142118
}

0 commit comments

Comments
 (0)