Skip to content

Commit 036bdb0

Browse files
committed
feat: Review
1 parent e74370a commit 036bdb0

File tree

17 files changed

+107
-99
lines changed

17 files changed

+107
-99
lines changed

src/apitypes/graphql/graphql.operation.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,12 @@ import {
1919
getKeyValue,
2020
getSplittedVersionKey,
2121
isOperationDeprecated,
22-
rawToApiKind,
2322
removeComponents,
2423
setValueByPath,
2524
takeIf,
2625
takeIfDefined,
2726
} from '../../utils'
28-
import { APIHUB_API_COMPATIBILITY_KIND, INLINE_REFS_FLAG, ORIGINS_SYMBOL, VERSION_STATUS } from '../../consts'
27+
import { APIHUB_API_BWC_KIND, INLINE_REFS_FLAG, ORIGINS_SYMBOL, VERSION_STATUS } from '../../consts'
2928
import { GraphQLSchemaType, VersionGraphQLDocument, VersionGraphQLOperation } from './graphql.types'
3029
import { GRAPHQL_API_TYPE, GRAPHQL_TYPE } from './graphql.consts'
3130
import { GraphApiSchema } from '@netcracker/qubership-apihub-graphapi'
@@ -89,7 +88,7 @@ export const buildGraphQLOperation = (
8988
operationId,
9089
documentId: documentSlug,
9190
apiType: GRAPHQL_API_TYPE,
92-
apiKind: rawToApiKind(documentApiKind, APIHUB_API_COMPATIBILITY_KIND.BWC),
91+
apiKind: documentApiKind || APIHUB_API_BWC_KIND,
9392
deprecated: !!singleOperationEffectiveSpec[type]?.[method]?.directives?.deprecated,
9493
title: toTitleCase(method),
9594
metadata: {

src/apitypes/rest/rest.changes.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ import {
8383
OperationsMap,
8484
} from '../../components'
8585
import { createApiKindChecker } from '../../components/compare/bwc.validation'
86-
import { calculateApiKindFromLabels, getApiKind } from '../../components/document'
86+
import { calculateApiKindFromLabels, getApiKindProperty } from '../../components/document'
8787

8888
export const compareDocuments: DocumentsCompare = async (
8989
operationsMap: OperationsMap,
@@ -125,8 +125,8 @@ export const compareDocuments: DocumentsCompare = async (
125125
currDocData = createCopyWithEmptyPathItems(prevDocData)
126126
}
127127

128-
const prevApiKind = prevDoc?.apiKind || getApiKind(prevDocData?.info) || calculateApiKindFromLabels(prevDoc?.labels, previousVersionLabels)
129-
const currApiKind = currDoc?.apiKind || getApiKind(currDocData?.info) || calculateApiKindFromLabels(currDoc?.labels, currentVersionLabels)
128+
const prevDocumentApiKind = prevDoc?.apiKind || getApiKindProperty(prevDocData?.info) || calculateApiKindFromLabels(prevDoc?.labels, previousVersionLabels)
129+
const currDocumentApiKind = currDoc?.apiKind || getApiKindProperty(currDocData?.info) || calculateApiKindFromLabels(currDoc?.labels, currentVersionLabels)
130130

131131
const { merged, diffs } = apiDiff(
132132
prevDocData,
@@ -139,7 +139,7 @@ export const compareDocuments: DocumentsCompare = async (
139139
normalizedResult: false,
140140
afterValueNormalizedProperty: AFTER_VALUE_NORMALIZED_PROPERTY,
141141
beforeValueNormalizedProperty: BEFORE_VALUE_NORMALIZED_PROPERTY,
142-
apiCompatibilityScopeFunction: createApiKindChecker(prevApiKind, currApiKind),
142+
apiCompatibilityScopeFunction: createApiKindChecker(prevDocumentApiKind, currDocumentApiKind),
143143
},
144144
) as { merged: OpenAPIV3.Document; diffs: Diff[] }
145145

src/apitypes/rest/rest.document.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import { dump } from './rest.utils'
4040
import { generateHtmlPage } from '../../utils/export'
4141
import { removeOasExtensions } from '../../utils/removeOasExtensions'
4242
import { OpenApiExtensionKey } from '@netcracker/qubership-apihub-api-unifier'
43-
import { getApiKind } from '../../components/document'
43+
import { getApiKindProperty } from '../../components/document'
4444

4545
const openApiDocumentMeta = (data: OpenAPIV3.Document): RestDocumentInfo => {
4646
if (typeof data !== 'object' || !data) {
@@ -76,7 +76,7 @@ export const buildRestDocument: DocumentBuilder<OpenAPIV3.Document> = async (par
7676

7777
let bundledFileData = data
7878

79-
const documentApiKind = getApiKind(bundledFileData?.info) || apiKind
79+
const documentApiKind = getApiKindProperty(bundledFileData?.info) || apiKind
8080

8181
if (parsedFile.type === REST_DOCUMENT_TYPE.SWAGGER) {
8282
try {

src/apitypes/rest/rest.operation.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
import { JsonPath, syncCrawl } from '@netcracker/qubership-apihub-json-crawl'
1818
import { OpenAPIV3 } from 'openapi-types'
19-
import { REST_API_TYPE, REST_KIND_KEY } from './rest.consts'
19+
import { REST_API_TYPE } from './rest.consts'
2020
import { operationRules } from './rest.rules'
2121
import type * as TYPE from './rest.types'
2222
import { RestOperationData } from './rest.types'
@@ -30,9 +30,9 @@ import {
3030
SearchScopes,
3131
} from '../../types'
3232
import {
33+
_calculateRestOperationIdV1,
3334
buildSearchScope,
3435
calculateRestOperationId,
35-
_calculateRestOperationIdV1,
3636
capitalize,
3737
extractSymbolProperty,
3838
getKeyValue,
@@ -42,12 +42,11 @@ import {
4242
isOperationDeprecated,
4343
isValidHttpMethod,
4444
normalizePath,
45-
rawToApiKind,
4645
setValueByPath,
4746
takeIf,
4847
takeIfDefined,
4948
} from '../../utils'
50-
import { APIHUB_API_COMPATIBILITY_KIND, INLINE_REFS_FLAG, ORIGINS_SYMBOL, VERSION_STATUS } from '../../consts'
49+
import { APIHUB_API_BWC_KIND, INLINE_REFS_FLAG, ORIGINS_SYMBOL, VERSION_STATUS } from '../../consts'
5150
import { extractSecuritySchemesNames, getCustomTags, resolveApiAudience } from './rest.utils'
5251
import { DebugPerformanceContext, syncDebugPerformance } from '../../utils/logs'
5352
import {
@@ -68,6 +67,7 @@ import { extractOperationBasePath } from '@netcracker/qubership-apihub-api-diff'
6867
import { calculateHash, ObjectHashCache } from '../../utils/hashes'
6968
import { calculateTolerantHash } from '../../components/deprecated'
7069
import { getValueByPath } from '../../utils/path'
70+
import { getApiKindProperty } from '../../components/document'
7171

7272
export const buildRestOperation = (
7373
operationId: string,
@@ -142,7 +142,7 @@ export const buildRestOperation = (
142142
}, debugCtx)
143143

144144
const models: Record<string, string> = {}
145-
const apiKind = effectiveOperationObject[REST_KIND_KEY] || documentApiKind || APIHUB_API_COMPATIBILITY_KIND.BWC
145+
const operationApiKind = getApiKindProperty(effectiveOperationObject) || documentApiKind || APIHUB_API_BWC_KIND
146146
const [specWithSingleOperation] = syncDebugPerformance('[ModelsAndOperationHashing]', () => {
147147
const operationSecurity = effectiveOperationObject.security
148148
const specWithSingleOperation = createSingleOperationSpec(
@@ -171,7 +171,7 @@ export const buildRestOperation = (
171171
operationId,
172172
documentId: documentSlug,
173173
apiType: REST_API_TYPE,
174-
apiKind: rawToApiKind(apiKind, APIHUB_API_COMPATIBILITY_KIND.BWC),
174+
apiKind: operationApiKind,
175175
deprecated: !!effectiveOperationObject.deprecated,
176176
title: effectiveOperationObject.summary || operationId.split('-').map(str => capitalize(str)).join(' '),
177177
metadata: {

src/components/compare/bwc.validation.ts

Lines changed: 36 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -14,67 +14,53 @@
1414
* limitations under the License.
1515
*/
1616

17-
import { APIHUB_API_COMPATIBILITY_KIND } from '../../consts'
17+
import { APIHUB_API_BWC_KIND, APIHUB_API_NO_BWC_KIND, ApihubApiCompatibilityKind } from '../../consts'
1818
import { isObject, isValidHttpMethod } from '../../utils'
1919
import { JsonPath } from '@netcracker/qubership-apihub-json-crawl'
2020
import {
21-
ApiCompatibilityKind,
2221
ApiCompatibilityScope,
2322
ApiCompatibilityScopeFunction,
23+
BACKWARD_COMPATIBLE,
24+
NOT_BACKWARD_COMPATIBLE,
2425
} from '@netcracker/qubership-apihub-api-diff'
25-
import { ApihubApiCompatibilityKind } from '../../types'
26-
import { getApiKind } from '../document'
27-
28-
const convertApihubToApiCompatibilityKind = (apihubApiKind: ApihubApiCompatibilityKind): ApiCompatibilityKind => {
29-
switch (apihubApiKind) {
30-
case APIHUB_API_COMPATIBILITY_KIND.BWC:
31-
return ApiCompatibilityKind.BACKWARD_COMPATIBLE
32-
case APIHUB_API_COMPATIBILITY_KIND.NO_BWC:
33-
return ApiCompatibilityKind.NOT_BACKWARD_COMPATIBLE
34-
default:
35-
return ApiCompatibilityKind.BACKWARD_COMPATIBLE
36-
}
37-
}
38-
39-
export const getApiCompatibilityKind = (
40-
beforeJson: unknown,
41-
afterJson: unknown,
42-
beforeParentApiKind: ApihubApiCompatibilityKind,
43-
afterParentApiKind: ApihubApiCompatibilityKind,
44-
): ApiCompatibilityKind | undefined => {
45-
const beforeKind = getApiKind(beforeJson) ?? beforeParentApiKind
46-
const afterKind = getApiKind(afterJson) ?? afterParentApiKind
47-
48-
if (beforeKind === APIHUB_API_COMPATIBILITY_KIND.NO_BWC || afterKind === APIHUB_API_COMPATIBILITY_KIND.NO_BWC) {
49-
return convertApihubToApiCompatibilityKind(APIHUB_API_COMPATIBILITY_KIND.NO_BWC)
26+
import { getApiKindProperty } from '../document'
27+
import { OpenAPIV3 } from 'openapi-types'
28+
29+
export const calculateOperationApiCompatibilityKind = (
30+
beforeOperationObject: OpenAPIV3.OperationObject | undefined,
31+
afterOperationObject: OpenAPIV3.OperationObject | undefined,
32+
beforeDefaultApiKind: ApihubApiCompatibilityKind,
33+
afterDefaultApiKind: ApihubApiCompatibilityKind,
34+
): ApiCompatibilityScope | undefined => {
35+
const beforeKind = getApiKindProperty(beforeOperationObject, beforeDefaultApiKind)
36+
const afterKind = getApiKindProperty(afterOperationObject, afterDefaultApiKind)
37+
38+
if (beforeKind === APIHUB_API_NO_BWC_KIND || afterKind === APIHUB_API_NO_BWC_KIND) {
39+
return NOT_BACKWARD_COMPATIBLE
5040
}
5141

52-
if (beforeKind === APIHUB_API_COMPATIBILITY_KIND.BWC && afterKind === APIHUB_API_COMPATIBILITY_KIND.BWC) {
53-
return convertApihubToApiCompatibilityKind(APIHUB_API_COMPATIBILITY_KIND.BWC)
42+
if (beforeKind === APIHUB_API_BWC_KIND && afterKind === APIHUB_API_BWC_KIND) {
43+
return BACKWARD_COMPATIBLE
5444
}
55-
56-
return undefined
5745
}
5846

59-
export const getMethodsApiCompatibilityKind = (obj: unknown): ApiCompatibilityKind | undefined => {
60-
if (checkAllMethodsHaveSameApiKind(obj, APIHUB_API_COMPATIBILITY_KIND.NO_BWC)) {
61-
return convertApihubToApiCompatibilityKind(APIHUB_API_COMPATIBILITY_KIND.NO_BWC)
47+
export const getMethodsApiCompatibilityKind = (pathItemObject: OpenAPIV3.PathItemObject): ApiCompatibilityScope | undefined => {
48+
if (checkAllMethodsHaveSameApiKind(pathItemObject, APIHUB_API_NO_BWC_KIND)) {
49+
return NOT_BACKWARD_COMPATIBLE
6250
}
6351

64-
if (checkAllMethodsHaveSameApiKind(obj, APIHUB_API_COMPATIBILITY_KIND.BWC)) {
65-
return convertApihubToApiCompatibilityKind(APIHUB_API_COMPATIBILITY_KIND.BWC)
52+
if (checkAllMethodsHaveSameApiKind(pathItemObject, APIHUB_API_BWC_KIND)) {
53+
return BACKWARD_COMPATIBLE
6654
}
67-
68-
return undefined
6955
}
7056

71-
const hasApiKind = (obj: unknown, apiKind: string): boolean => {
72-
return getApiKind(obj) === apiKind
57+
const hasApiKind = (obj: OpenAPIV3.OperationObject, apiKind: ApihubApiCompatibilityKind): boolean => {
58+
return getApiKindProperty(obj) === apiKind
7359
}
7460

7561
// If a path object is removed/added, we must ensure every HTTP method under it
7662
// is explicitly marked NO_BWC before treating the change as risky.
77-
const checkAllMethodsHaveSameApiKind = (obj: unknown, apiKind: string): boolean => {
63+
const checkAllMethodsHaveSameApiKind = (obj: OpenAPIV3.PathItemObject, apiKind: ApihubApiCompatibilityKind): boolean => {
7864
if (!isObject(obj)) {
7965
return false
8066
}
@@ -93,12 +79,12 @@ const PATH_ITEM_PATH_LENGTH = 2
9379
const OPERATION_OBJECT_PATH_LENGTH = 3
9480

9581
export const createApiKindChecker = (
96-
prevApiKind: ApihubApiCompatibilityKind = APIHUB_API_COMPATIBILITY_KIND.BWC,
97-
currApiKind: ApihubApiCompatibilityKind = APIHUB_API_COMPATIBILITY_KIND.BWC,
82+
prevDocumentApiKind: ApihubApiCompatibilityKind = APIHUB_API_BWC_KIND,
83+
currDocumentApiKind: ApihubApiCompatibilityKind = APIHUB_API_BWC_KIND,
9884
): ApiCompatibilityScopeFunction => {
99-
const defaultApiCompatibilityKind = (prevApiKind === APIHUB_API_COMPATIBILITY_KIND.NO_BWC || currApiKind === APIHUB_API_COMPATIBILITY_KIND.NO_BWC)
100-
? ApiCompatibilityKind.NOT_BACKWARD_COMPATIBLE
101-
: ApiCompatibilityKind.BACKWARD_COMPATIBLE
85+
const defaultApiCompatibilityKind = (prevDocumentApiKind === APIHUB_API_NO_BWC_KIND || currDocumentApiKind === APIHUB_API_NO_BWC_KIND)
86+
? NOT_BACKWARD_COMPATIBLE
87+
: BACKWARD_COMPATIBLE
10288

10389
return (
10490
path?: JsonPath,
@@ -147,7 +133,10 @@ export const createApiKindChecker = (
147133
}
148134

149135
if (pathLength === OPERATION_OBJECT_PATH_LENGTH) {
150-
return getApiCompatibilityKind(beforeJson, afterJson, prevApiKind, currApiKind)
136+
const beforeOperationObject = beforeJson as OpenAPIV3.OperationObject | undefined
137+
const afterOperationObject = afterJson as OpenAPIV3.OperationObject | undefined
138+
139+
return calculateOperationApiCompatibilityKind(beforeOperationObject, afterOperationObject, prevDocumentApiKind, currDocumentApiKind)
151140
}
152141

153142
return undefined

src/components/document.ts

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

17-
import { ApihubApiCompatibilityKind, BuildConfigFile, BuilderContext, FILE_KIND, SourceFile, TextFile, VersionDocument } from '../types'
18-
import { APIHUB_API_COMPATIBILITY_KIND, API_KIND_LABEL, DOCUMENT_TYPE, FILE_FORMAT_UNKNOWN } from '../consts'
17+
import { BuildConfigFile, BuilderContext, FILE_KIND, SourceFile, TextFile, VersionDocument } from '../types'
18+
import {
19+
API_KIND_LABEL,
20+
APIHUB_API_BWC_KIND,
21+
ApihubApiCompatibilityKind,
22+
DOCUMENT_TYPE,
23+
FILE_FORMAT_UNKNOWN,
24+
} from '../consts'
1925
import {
2026
createVersionInternalDocument,
2127
getDocumentTitle,
@@ -65,7 +71,7 @@ export const buildDocument = async (parsedFile: SourceFile, file: BuildConfigFil
6571

6672
export const calculateApiKindFromLabels = (fileLabels: unknown, versionLabels: unknown): ApihubApiCompatibilityKind => {
6773
if (!Array.isArray(fileLabels) && !Array.isArray(versionLabels)) {
68-
return APIHUB_API_COMPATIBILITY_KIND.BWC
74+
return APIHUB_API_BWC_KIND
6975
}
7076

7177
const labels = [
@@ -80,13 +86,13 @@ export const calculateApiKindFromLabels = (fileLabels: unknown, versionLabels: u
8086

8187
const match = new RegExp(`${API_KIND_LABEL}:`).exec(label)
8288
if (match) {
83-
return rawToApiKind(label.slice(match[0].length).trim(), APIHUB_API_COMPATIBILITY_KIND.BWC)
89+
return rawToApiKind(label.slice(match[0].length).trim(), APIHUB_API_BWC_KIND)
8490
}
8591
}
86-
return APIHUB_API_COMPATIBILITY_KIND.BWC
92+
return APIHUB_API_BWC_KIND
8793
}
8894

89-
export const getApiKind = (obj: unknown, defaultApiKind?: ApihubApiCompatibilityKind): ApihubApiCompatibilityKind | undefined => {
95+
export const getApiKindProperty = (obj: unknown, defaultApiKind?: ApihubApiCompatibilityKind): ApihubApiCompatibilityKind | undefined => {
9096
if (isObject(obj)) {
9197
const apiKindLike = obj?.[REST_KIND_KEY]
9298
if (isString(apiKindLike)) {

src/consts.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,13 @@ export const VERSION_STATUS = {
108108
NONE: '', // non-existent status for changelog builds
109109
} as const
110110

111-
export const APIHUB_API_COMPATIBILITY_KIND = {
112-
BWC: 'bwc',
113-
NO_BWC: 'no-bwc',
114-
EXPERIMENTAL: 'experimental',
115-
} as const
111+
export const APIHUB_API_BWC_KIND = 'bwc'
112+
export const APIHUB_API_NO_BWC_KIND = 'no-bwc'
113+
export const APIHUB_API_EXPERIMENTAL_KIND = 'experimental'
114+
115+
export type ApihubApiCompatibilityKind = typeof APIHUB_API_BWC_KIND
116+
| typeof APIHUB_API_NO_BWC_KIND
117+
| typeof APIHUB_API_EXPERIMENTAL_KIND
116118

117119
export const API_KIND_LABEL = 'apihub/x-api-kind'
118120

src/types/external/config.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,15 @@
1515
*/
1616

1717
import { FileId, KeyOfConstType, OperationsApiType, PackageId, VersionId } from './types'
18-
import { BUILD_TYPE, FILE_FORMAT_HTML, FILE_FORMAT_JSON, FILE_FORMAT_YAML, VERSION_STATUS } from '../../consts'
18+
import {
19+
ApihubApiCompatibilityKind,
20+
BUILD_TYPE,
21+
FILE_FORMAT_HTML,
22+
FILE_FORMAT_JSON,
23+
FILE_FORMAT_YAML,
24+
VERSION_STATUS,
25+
} from '../../consts'
1926
import { OpenApiExtensionKey } from '@netcracker/qubership-apihub-api-unifier'
20-
import { ApihubApiCompatibilityKind } from './operations'
2127

2228
export type BuildType = KeyOfConstType<typeof BUILD_TYPE>
2329
export type VersionStatus = KeyOfConstType<typeof VERSION_STATUS>

src/types/external/documents.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import { FileId, OperationsApiType, PackageId, TemplatePath, VersionId } from './types'
1818
import { ResolvedReferenceMap } from './references'
1919
import { FileFormat } from '../internal'
20-
import { ApihubApiCompatibilityKind } from './operations'
20+
import { ApihubApiCompatibilityKind } from '../../consts'
2121

2222
export type ResolvedDocument = {
2323
fileId: string

src/types/external/operations.ts

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

17-
import { KeyOfConstType, OperationId, OperationsApiType, PackageId, VersionId } from './types'
17+
import { OperationId, OperationsApiType, PackageId, VersionId } from './types'
1818
import { DeprecateItem } from './deprecated'
19-
import { APIHUB_API_COMPATIBILITY_KIND } from '../../consts'
2019
import { ApiAudience } from '../package'
21-
22-
export type ApihubApiCompatibilityKind = KeyOfConstType<typeof APIHUB_API_COMPATIBILITY_KIND>
20+
import { ApihubApiCompatibilityKind } from '../../consts'
2321

2422
export type VersionOperationsResolver = (
2523
apiType: OperationsApiType,

0 commit comments

Comments
 (0)