diff --git a/.changeset/late-dodos-drop.md b/.changeset/late-dodos-drop.md new file mode 100644 index 0000000000..617d7d8469 --- /dev/null +++ b/.changeset/late-dodos-drop.md @@ -0,0 +1,8 @@ +--- +'@sap-cloud-sdk/openapi-generator': minor +'@sap-cloud-sdk/generator-common': minor +'@sap-cloud-sdk/generator': minor +--- + +[Compatibility Note] The project has been updated to `typescript` version 6. +Some options are deprecated in TypeScript 6, reference the [breaking changes page](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-6-0.html#breaking-changes-and-deprecations-in-typescript-60) for more details. diff --git a/.github/actions/check-public-api/index.js b/.github/actions/check-public-api/index.js index 1f611fe4ce..001c28311e 100644 --- a/.github/actions/check-public-api/index.js +++ b/.github/actions/check-public-api/index.js @@ -65966,6 +65966,9 @@ async function readCompilerOptions(pathToTsConfig) { if (options.module) { options.module = parseModuleKind(options.module); } + if (needsIgnoreDeprecationsTs6(options.moduleResolution, options.target, options.module)) { + options.ignoreDeprecations = '6.0'; + } return options; } function parseModuleResolutionKind(input) { @@ -66017,6 +66020,22 @@ function parseModuleKind(input) { logger.warn(`The selected module kind ${input} is not found - Fallback commonJS used`); return typescript_1.ModuleKind.CommonJS; } +function needsIgnoreDeprecationsTs6(moduleResolutionKind, scriptTarget, moduleKind) { + if (moduleResolutionKind === typescript_1.ModuleResolutionKind.NodeJs || + moduleResolutionKind === typescript_1.ModuleResolutionKind.Classic) { + logger.warn(`The selected module resolution kind ${typescript_1.ModuleResolutionKind[moduleResolutionKind]} is not deprecated with TypeScript 6.0`); + return true; + } + if (scriptTarget === typescript_1.ScriptTarget.ES3 || scriptTarget === typescript_1.ScriptTarget.ES5) { + logger.warn(`The selected script target ${typescript_1.ScriptTarget[scriptTarget]} is not deprecated with TypeScript 6.0`); + return true; + } + if (moduleKind === typescript_1.ModuleKind.AMD) { + logger.warn(`The selected module kind ${typescript_1.ModuleKind[moduleKind]} is not deprecated with TypeScript 6.0`); + return true; + } + return false; +} //# sourceMappingURL=compiler.js.map /***/ }), @@ -66747,7 +66766,7 @@ class ErrorWithCause extends Error { this.addStack(cause); } isAxiosError(err) { - return err['isAxiosError'] === true; + return 'isAxiosError' in err && err.isAxiosError === true; } addStack(cause) { // Axios removed the stack property in version 0.27 which gave no useful information anyway. This adds the http cause. diff --git a/.github/actions/merge-and-write-changelogs/index.js b/.github/actions/merge-and-write-changelogs/index.js index 595b19c7dc..2596c3374d 100644 --- a/.github/actions/merge-and-write-changelogs/index.js +++ b/.github/actions/merge-and-write-changelogs/index.js @@ -46261,7 +46261,7 @@ function parseContent(content, version, packageName) { summary, packageNames: [packageName], // TODO: add link to commit - commit: groups.commit ? `(${groups.commit})` : '', + commit: groups?.commit ? `(${groups.commit})` : '', type }; }); diff --git a/build-packages/changesets-fixed-version-bump/package.json b/build-packages/changesets-fixed-version-bump/package.json index 0f95ef3d34..edc1a35c21 100644 --- a/build-packages/changesets-fixed-version-bump/package.json +++ b/build-packages/changesets-fixed-version-bump/package.json @@ -26,6 +26,6 @@ "eslint": "^9.39.2", "memfs": "^4.57.2", "prettier": "^3.8.1", - "typescript": "~5.9.3" + "typescript": "~6.0.2" } } diff --git a/build-packages/changesets-fixed-version-bump/tsconfig.json b/build-packages/changesets-fixed-version-bump/tsconfig.json index 4c886abdd6..8e31813fb2 100644 --- a/build-packages/changesets-fixed-version-bump/tsconfig.json +++ b/build-packages/changesets-fixed-version-bump/tsconfig.json @@ -8,7 +8,8 @@ "declaration": false, "esModuleInterop": true, "target": "ESNext", - "module": "NodeNext" + "module": "NodeNext", + "types": ["node", "jest"] }, "include": ["*.ts"], "exclude": [] diff --git a/build-packages/check-license/package.json b/build-packages/check-license/package.json index 7ce42d2642..3830b8ac81 100644 --- a/build-packages/check-license/package.json +++ b/build-packages/check-license/package.json @@ -22,6 +22,6 @@ "depcheck": "^1.4.7", "eslint": "^9.39.2", "prettier": "^3.8.1", - "typescript": "~5.9.3" + "typescript": "~6.0.3" } } diff --git a/build-packages/check-license/tsconfig.json b/build-packages/check-license/tsconfig.json index bbe8d883e9..c37384e09e 100644 --- a/build-packages/check-license/tsconfig.json +++ b/build-packages/check-license/tsconfig.json @@ -11,7 +11,8 @@ "target": "esnext", "noUncheckedSideEffectImports": true, "libReplacement": false, - "module": "NodeNext" + "module": "NodeNext", + "types": ["node"] }, "types": ["node"], "include": ["*.ts"], diff --git a/build-packages/check-pr/package.json b/build-packages/check-pr/package.json index 076c20143e..7a4ae3f988 100644 --- a/build-packages/check-pr/package.json +++ b/build-packages/check-pr/package.json @@ -26,6 +26,6 @@ "eslint": "^9.39.2", "memfs": "^4.57.2", "prettier": "^3.8.1", - "typescript": "~5.9.3" + "typescript": "~6.0.2" } } diff --git a/build-packages/check-pr/tsconfig.json b/build-packages/check-pr/tsconfig.json index 002f463c86..f031784a9f 100644 --- a/build-packages/check-pr/tsconfig.json +++ b/build-packages/check-pr/tsconfig.json @@ -8,7 +8,8 @@ "skipLibCheck": true, "isolatedModules": true, "outDir": "./lib", - "tsBuildInfoFile": "./lib/.tsbuildinfo" + "tsBuildInfoFile": "./lib/.tsbuildinfo", + "types": ["node", "jest"] }, "include": ["*.ts"], "exclude": [] diff --git a/build-packages/check-public-api/package.json b/build-packages/check-public-api/package.json index e490be9fb3..0518508074 100644 --- a/build-packages/check-public-api/package.json +++ b/build-packages/check-public-api/package.json @@ -30,6 +30,6 @@ "eslint": "^9.39.2", "memfs": "^4.57.2", "prettier": "^3.8.1", - "typescript": "~5.9.3" + "typescript": "~6.0.2" } } diff --git a/build-packages/check-public-api/tsconfig.json b/build-packages/check-public-api/tsconfig.json index 002f463c86..f031784a9f 100644 --- a/build-packages/check-public-api/tsconfig.json +++ b/build-packages/check-public-api/tsconfig.json @@ -8,7 +8,8 @@ "skipLibCheck": true, "isolatedModules": true, "outDir": "./lib", - "tsBuildInfoFile": "./lib/.tsbuildinfo" + "tsBuildInfoFile": "./lib/.tsbuildinfo", + "types": ["node", "jest"] }, "include": ["*.ts"], "exclude": [] diff --git a/build-packages/get-changelog/index.ts b/build-packages/get-changelog/index.ts index 94ef6219ad..8305602f33 100644 --- a/build-packages/get-changelog/index.ts +++ b/build-packages/get-changelog/index.ts @@ -20,6 +20,6 @@ async function getChangelog(v?: string): Promise { try { setOutput('changelog', await getChangelog()); } catch (error) { - setFailed(error.message); + setFailed((error as Error).message); } })(); diff --git a/build-packages/get-changelog/package.json b/build-packages/get-changelog/package.json index 728694ee35..a22c7dd926 100644 --- a/build-packages/get-changelog/package.json +++ b/build-packages/get-changelog/package.json @@ -21,6 +21,6 @@ "depcheck": "^1.4.7", "eslint": "^9.39.2", "prettier": "^3.8.1", - "typescript": "~5.9.3" + "typescript": "~6.0.2" } } diff --git a/build-packages/get-changelog/tsconfig.json b/build-packages/get-changelog/tsconfig.json index 281f3bab66..1d6f11242e 100644 --- a/build-packages/get-changelog/tsconfig.json +++ b/build-packages/get-changelog/tsconfig.json @@ -7,7 +7,8 @@ "incremental": true, "declaration": false, "esModuleInterop": true, - "module": "NodeNext" + "module": "NodeNext", + "types": ["node"] }, "files": [ "index.ts" diff --git a/build-packages/merge-and-write-changelogs/index.ts b/build-packages/merge-and-write-changelogs/index.ts index 69deaf865b..c2d1868987 100644 --- a/build-packages/merge-and-write-changelogs/index.ts +++ b/build-packages/merge-and-write-changelogs/index.ts @@ -106,7 +106,7 @@ function parseContent( summary, packageNames: [packageName], // TODO: add link to commit - commit: groups.commit ? `(${groups.commit})` : '', + commit: groups?.commit ? `(${groups.commit})` : '', type }; }); diff --git a/build-packages/merge-and-write-changelogs/package.json b/build-packages/merge-and-write-changelogs/package.json index 47f7b5ecc8..681f217412 100644 --- a/build-packages/merge-and-write-changelogs/package.json +++ b/build-packages/merge-and-write-changelogs/package.json @@ -22,6 +22,6 @@ "depcheck": "^1.4.7", "eslint": "^9.39.2", "prettier": "^3.8.1", - "typescript": "~5.9.3" + "typescript": "~6.0.3" } } diff --git a/build-packages/merge-and-write-changelogs/tsconfig.json b/build-packages/merge-and-write-changelogs/tsconfig.json index 2022f0666c..4cd2167d04 100644 --- a/build-packages/merge-and-write-changelogs/tsconfig.json +++ b/build-packages/merge-and-write-changelogs/tsconfig.json @@ -8,7 +8,8 @@ "declaration": false, "esModuleInterop": true, "target": "ESNext", - "module": "NodeNext" + "module": "NodeNext", + "types": ["node"] }, "include": ["*.ts"], "exclude": [] diff --git a/build-packages/test-utils/package.json b/build-packages/test-utils/package.json index 1a29789fa7..a640691abe 100644 --- a/build-packages/test-utils/package.json +++ b/build-packages/test-utils/package.json @@ -24,6 +24,6 @@ "depcheck": "^1.4.7", "eslint": "^9.39.2", "prettier": "^3.8.1", - "typescript": "~5.9.3" + "typescript": "~6.0.3" } } diff --git a/package.json b/package.json index 01eb4a7849..4ac049c72b 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,8 @@ "@types/jest": "^30.0.0", "@types/jsonwebtoken": "^9.0.10", "@types/node": "^22.19.15", + "@types/sap__xsenv": "^3.3.2", + "@types/semver": "^7.7.1", "@types/voca": "^1.4.6", "axios": "^1.15.0", "cross-env": "10.1.0", @@ -87,7 +89,7 @@ "ts-node": "^10.9.2", "turbo": "^2.9.6", "typedoc": "^0.28.18", - "typescript": "~5.9.3", + "typescript": "~6.0.3", "unionfs": "^4.6.0" } } diff --git a/packages/connectivity/package.json b/packages/connectivity/package.json index c24ff39a57..a494ee1b66 100644 --- a/packages/connectivity/package.json +++ b/packages/connectivity/package.json @@ -53,10 +53,11 @@ "devDependencies": { "@jest/globals": "^30.3.0", "@sap-cloud-sdk/test-util-internal": "workspace:^", + "@types/async-retry": "^1.4.9", "depcheck": "^1.4.7", "memfs": "^4.57.2", "nock": "^14.0.11", "prettier": "^3.8.1", - "typescript": "~5.9.3" + "typescript": "~6.0.3" } } diff --git a/packages/connectivity/src/http-agent/http-agent.ts b/packages/connectivity/src/http-agent/http-agent.ts index 1ed454c9d8..18685bfee3 100644 --- a/packages/connectivity/src/http-agent/http-agent.ts +++ b/packages/connectivity/src/http-agent/http-agent.ts @@ -260,9 +260,9 @@ function isSupportedFormat(format: string | undefined): boolean { return !!format && supportedCertificateFormats.includes(format); } -function selectCertificate(destination): DestinationCertificate { - const certificate = destination.certificates.find( - c => c.name === destination.keyStoreName +function selectCertificate(destination: Destination): DestinationCertificate { + const certificate = destination.certificates?.find( + (c: DestinationCertificate) => c.name === destination.keyStoreName ); if (!certificate) { diff --git a/packages/connectivity/src/scp-cf/connectivity-service.ts b/packages/connectivity/src/scp-cf/connectivity-service.ts index 3a14c80699..3955635f70 100644 --- a/packages/connectivity/src/scp-cf/connectivity-service.ts +++ b/packages/connectivity/src/scp-cf/connectivity-service.ts @@ -127,7 +127,7 @@ async function proxyAuthorizationHeader( } catch (error) { throw new ErrorWithCause( 'Failed to add proxy authorization header - client credentials grant failed!', - error + error as Error ); } } diff --git a/packages/connectivity/src/scp-cf/destination/destination-from-env.ts b/packages/connectivity/src/scp-cf/destination/destination-from-env.ts index f8d5d65ed2..37331b78b6 100644 --- a/packages/connectivity/src/scp-cf/destination/destination-from-env.ts +++ b/packages/connectivity/src/scp-cf/destination/destination-from-env.ts @@ -11,6 +11,7 @@ import { import { isHttpDestination } from './destination-service-types'; import { addForwardedAuthTokenIfNeeded } from './forward-auth-token'; import type { Destination } from './destination-service-types'; +import type { DestinationConfiguration } from './destination'; import type { DestinationFetchOptions } from './destination-accessor-types'; const logger = createLogger({ @@ -37,14 +38,15 @@ export function getDestinationsFromEnv(): Destination[] { } catch (err) { throw new ErrorWithCause( 'Error in parsing the destinations from the environment variable.', - err + err as Error ); } validateDestinations(destinations); - return destinations.map(destination => - isDestinationConfiguration(destination) - ? parseDestination(destination) - : sanitizeDestination(destination) + return destinations.map( + (destination: DestinationConfiguration | Destination) => + isDestinationConfiguration(destination) + ? parseDestination(destination) + : sanitizeDestination(destination) ); } return []; @@ -121,7 +123,7 @@ export function searchEnvVariablesForDestination( } } catch (error) { logger.error( - `Error in reading the given destinations from the environment variable ${error.message}.` + `Error in reading the given destinations from the environment variable ${(error as Error).message}.` ); } } diff --git a/packages/connectivity/src/scp-cf/destination/destination-from-vcap.ts b/packages/connectivity/src/scp-cf/destination/destination-from-vcap.ts index b2f3f2dc04..b1d8eece5c 100644 --- a/packages/connectivity/src/scp-cf/destination/destination-from-vcap.ts +++ b/packages/connectivity/src/scp-cf/destination/destination-from-vcap.ts @@ -161,7 +161,7 @@ export async function searchServiceBindingForDestination( return destination; } catch (error) { logger.debug( - `Could not retrieve destination from service binding. If you are not using SAP Extension Factory, this information probably does not concern you. ${error.message}` + `Could not retrieve destination from service binding. If you are not using SAP Extension Factory, this information probably does not concern you. ${(error as Error).message}` ); } return null; diff --git a/packages/connectivity/src/scp-cf/destination/destination-service.ts b/packages/connectivity/src/scp-cf/destination/destination-service.ts index c6f007e269..a3f75595e9 100644 --- a/packages/connectivity/src/scp-cf/destination/destination-service.ts +++ b/packages/connectivity/src/scp-cf/destination/destination-service.ts @@ -4,7 +4,7 @@ import { propertyExists, removeTrailingSlashes } from '@sap-cloud-sdk/util'; -import axios from 'axios'; +import axios, { isAxiosError } from 'axios'; import { executeWithMiddleware } from '@sap-cloud-sdk/resilience/internal'; import { resilience } from '@sap-cloud-sdk/resilience'; import asyncRetry from 'async-retry'; @@ -76,8 +76,8 @@ export async function fetchDestinations( headers ) .then(response => { - const destinations: Destination[] = response.data.map(destination => - parseDestination(destination) + const destinations: Destination[] = response.data.map( + (destination: DestinationJson) => parseDestination(destination) ); if (options?.useCache) { @@ -156,6 +156,7 @@ export async function fetchDestinationWithoutTokenRetrieval( }; } catch (err) { if ( + isAxiosError(err) && err.response?.status === 404 && err.response?.data?.ErrorMessage === 'Configuration with the specified name was not found' @@ -166,8 +167,8 @@ export async function fetchDestinationWithoutTokenRetrieval( }; } throw new ErrorWithCause( - `Failed to fetch destination.${errorMessageFromResponse(err)}`, - err + `Failed to fetch destination.${errorMessageFromResponse(err as AxiosError<{ ErrorMessage: string }>)}`, + err as Error ); } } @@ -323,12 +324,14 @@ function retryDestination( } return destination; } catch (error) { - const status = error?.response?.status; - if (status.toString().startsWith('4')) { + const status = isAxiosError(error) + ? error.response?.status + : undefined; + if (status?.toString().startsWith('4')) { bail( new ErrorWithCause( `Request failed with status code ${status}`, - error + error as Error ) ); // We need to return something here but the actual value does not matter diff --git a/packages/connectivity/src/scp-cf/destination/destination.ts b/packages/connectivity/src/scp-cf/destination/destination.ts index 06c9f5a4c8..eefad6747f 100644 --- a/packages/connectivity/src/scp-cf/destination/destination.ts +++ b/packages/connectivity/src/scp-cf/destination/destination.ts @@ -42,17 +42,17 @@ export function parseDestination( const destinationConfig = getDestinationConfig(destinationJson); const destination = Object.entries(destinationConfig).reduce( - (dest, [originalKey, value]) => { + (dest: Partial, [originalKey, value]) => { if (originalKey in configMapping) { - dest[configMapping[originalKey]] = value; + dest[configMapping[originalKey] as keyof Destination] = value as any; } return dest; }, { originalProperties: destinationJson, - authTokens: destinationJson['authTokens'] || [], - certificates: destinationJson['certificates'] || [] - } + authTokens: (destinationJson as DestinationJson)['authTokens'] || [], + certificates: (destinationJson as DestinationJson)['certificates'] || [] + } as unknown as Partial ); const additionalHeadersAndQueryParameters = @@ -100,7 +100,8 @@ function getAdditionalProperties( export function getAdditionalHeadersAndQueryParameters( destinationConfig: DestinationConfiguration ): Pick { - const additionalProperties = {}; + const additionalProperties: Pick = + {} as Pick; const additionalHeaders = getAdditionalHeaders(destinationConfig).headers; if (additionalHeaders && Object.keys(additionalHeaders).length) { @@ -136,7 +137,7 @@ export function getAdditionalHeaders( 'URL.headers.' ); - const additionalProperties = {}; + const additionalProperties: Pick = {}; if (Object.keys(additionalHeaders).length) { additionalProperties['headers'] = additionalHeaders; } @@ -161,7 +162,7 @@ export function getAdditionalQueryParameters( 'URL.queries.' ); - const additionalProperties = {}; + const additionalProperties: Pick = {}; if (Object.keys(additionalQueryParameters).length) { additionalProperties['queryParameters'] = additionalQueryParameters; } @@ -193,8 +194,8 @@ export function toDestinationNameUrl( } const text = ['name', 'url'] - .filter(key => destination[key]) - .map(key => `${key}: ${destination[key]}`); + .filter(key => destination[key as keyof typeof destination]) + .map(key => `${key}: ${destination[key as keyof typeof destination]}`); return text.length > 0 ? text.join(',') @@ -243,8 +244,8 @@ function parseCertificates( ): Record { return { ...destination, - certificates: (destination.certificates || []).map(certificate => - parseCertificate(certificate) + certificates: (destination.certificates || []).map( + (certificate: Record) => parseCertificate(certificate) ) }; } @@ -264,8 +265,8 @@ function parseAuthTokens( ): Record { return { ...destination, - authTokens: (destination.authTokens || []).map(token => - parseAuthToken(token) + authTokens: (destination.authTokens || []).map( + (token: Record) => parseAuthToken(token) ) }; } diff --git a/packages/connectivity/src/scp-cf/destination/get-subscriber-token.ts b/packages/connectivity/src/scp-cf/destination/get-subscriber-token.ts index 6a79484e50..810c7c3041 100644 --- a/packages/connectivity/src/scp-cf/destination/get-subscriber-token.ts +++ b/packages/connectivity/src/scp-cf/destination/get-subscriber-token.ts @@ -68,7 +68,7 @@ async function retrieveServiceToken( ); } catch (err) { logger.warn( - `Failed to fetch subscriber service token for destination. This is only relevant if you are using subscriber destinations. Failure caused by: ${err.message}` + `Failed to fetch subscriber service token for destination. This is only relevant if you are using subscriber destinations. Failure caused by: ${(err as Error).message}` ); } } diff --git a/packages/connectivity/src/scp-cf/destination/http-proxy-util.ts b/packages/connectivity/src/scp-cf/destination/http-proxy-util.ts index 72636c2288..aed6492fd7 100644 --- a/packages/connectivity/src/scp-cf/destination/http-proxy-util.ts +++ b/packages/connectivity/src/scp-cf/destination/http-proxy-util.ts @@ -191,7 +191,7 @@ export function parseProxyEnv( return proxyConfig; } catch (err) { logger.warn( - `Could not parse proxy configuration from environment variable. Reason: ${err.message}` + `Could not parse proxy configuration from environment variable. Reason: ${(err as Error).message}` ); return undefined; } diff --git a/packages/connectivity/src/scp-cf/environment-accessor/service-bindings.ts b/packages/connectivity/src/scp-cf/environment-accessor/service-bindings.ts index fc13708019..b8b5f33103 100644 --- a/packages/connectivity/src/scp-cf/environment-accessor/service-bindings.ts +++ b/packages/connectivity/src/scp-cf/environment-accessor/service-bindings.ts @@ -14,7 +14,7 @@ const logger = createLogger({ * @internal */ export function getServiceBindings(service: string): Service[] { - return xsenv.filterServices({ label: service }); + return xsenv.filterServices({ label: service }) as unknown as Service[]; } /** @@ -24,7 +24,9 @@ export function getServiceBindings(service: string): Service[] { * @returns The first found service. */ export function getServiceBinding(service: string): Service | undefined { - const services: Service[] = xsenv.filterServices({ label: service }); + const services: Service[] = xsenv.filterServices({ + label: service + }) as unknown as Service[]; if (!services.length) { logger.warn( @@ -74,7 +76,9 @@ export function resolveServiceBinding(service: string | Service): Service { export function getServiceBindingByInstanceName( serviceInstanceName: string ): Service { - const service = xsenv.filterServices(serviceInstanceName); + const service = xsenv.filterServices( + serviceInstanceName + ) as unknown as Service[]; if (!service.length) { throw Error(`Could not find service with name: '${serviceInstanceName}'.`); diff --git a/packages/connectivity/src/scp-cf/jwt/jwt.ts b/packages/connectivity/src/scp-cf/jwt/jwt.ts index 069f415db9..2371322ce9 100644 --- a/packages/connectivity/src/scp-cf/jwt/jwt.ts +++ b/packages/connectivity/src/scp-cf/jwt/jwt.ts @@ -137,8 +137,9 @@ function audiencesFromAud({ aud }: JwtPayload): string[] { function audiencesFromScope({ scope }: JwtPayload): string[] { return makeArray(scope).reduce( - (aud, s) => (s.includes('.') ? [...aud, s.split('.')[0]] : aud), - [] + (aud: string[], s: string) => + s.includes('.') ? [...aud, s.split('.')[0]] : aud, + [] as string[] ); } diff --git a/packages/connectivity/src/scp-cf/protocol.ts b/packages/connectivity/src/scp-cf/protocol.ts index b27012ac5e..563a1980e0 100644 --- a/packages/connectivity/src/scp-cf/protocol.ts +++ b/packages/connectivity/src/scp-cf/protocol.ts @@ -18,5 +18,5 @@ export type Protocol = 'http' | 'https' | 'socks'; export function getProtocol(protocol: string): Protocol | undefined { return protocol.endsWith(':') ? getProtocol(protocol.slice(0, -1)) - : protocols[protocol]; + : protocols[protocol as Protocol]; } diff --git a/packages/connectivity/src/scp-cf/token-accessor.ts b/packages/connectivity/src/scp-cf/token-accessor.ts index 604ee521a0..ee9793d9b4 100644 --- a/packages/connectivity/src/scp-cf/token-accessor.ts +++ b/packages/connectivity/src/scp-cf/token-accessor.ts @@ -75,7 +75,7 @@ export async function serviceToken( } catch (err) { throw new ErrorWithCause( `Could not fetch client credentials token for service of type "${serviceBinding.label}".`, - err + err as Error ); } } diff --git a/packages/connectivity/src/scp-cf/xsuaa-service.ts b/packages/connectivity/src/scp-cf/xsuaa-service.ts index 3147f15d8a..e32a0112f7 100644 --- a/packages/connectivity/src/scp-cf/xsuaa-service.ts +++ b/packages/connectivity/src/scp-cf/xsuaa-service.ts @@ -34,7 +34,9 @@ export async function getClientCredentialsToken( serviceCredentials: resolveServiceBinding(service).credentials }; - const xssecPromise = function (arg): Promise { + const xssecPromise = function ( + arg: XsuaaParameters + ): Promise { const xsuaaService = getXsuaaInstanceFromServiceCredentials( arg.serviceCredentials ); @@ -94,7 +96,7 @@ export function getUserToken( tenant: arg.zoneId ? undefined : arg.subdomain, zid: arg.zoneId }) - .then(token => token.access_token); + .then((token: ClientCredentialsResponse) => token.access_token); }; return executeWithMiddleware< diff --git a/packages/generator-common/package.json b/packages/generator-common/package.json index 98b899153c..664cbce95d 100644 --- a/packages/generator-common/package.json +++ b/packages/generator-common/package.json @@ -51,9 +51,11 @@ "devDependencies": { "@jest/globals": "^30.3.0", "@sap-cloud-sdk/test-util-internal": "workspace:^", + "@types/fast-levenshtein": "^0.0.4", + "@types/fs-extra": "^11.0.4", "@types/yargs": "^17.0.33", "depcheck": "^1.4.7", "memfs": "^4.57.2", - "typescript": "~5.9.3" + "typescript": "~6.0.3" } } diff --git a/packages/generator-common/src/compiler.spec.ts b/packages/generator-common/src/compiler.spec.ts index 6e0b3c3adb..ff8e85b5b6 100644 --- a/packages/generator-common/src/compiler.spec.ts +++ b/packages/generator-common/src/compiler.spec.ts @@ -89,10 +89,12 @@ describe('compiler options', () => { it('parses the module resolution kind', async () => { await expect(readCompilerOptions('config1')).resolves.toEqual({ - moduleResolution: ModuleResolutionKind.NodeJs + moduleResolution: ModuleResolutionKind.NodeJs, + ignoreDeprecations: '6.0' }); await expect(readCompilerOptions('config2')).resolves.toEqual({ - moduleResolution: ModuleResolutionKind.Classic + moduleResolution: ModuleResolutionKind.Classic, + ignoreDeprecations: '6.0' }); await expect(readCompilerOptions('config7')).resolves.toEqual({ moduleResolution: ModuleResolutionKind.Node16 @@ -110,7 +112,8 @@ describe('compiler options', () => { it('parses the module kind', async () => { await expect(readCompilerOptions('config5')).resolves.toEqual({ - module: ModuleKind.AMD + module: ModuleKind.AMD, + ignoreDeprecations: '6.0' }); }); @@ -154,6 +157,7 @@ describe('compilation', () => { sourceMap: true, moduleResolution: ModuleResolutionKind.NodeJs, module: ModuleKind.CommonJS, + ignoreDeprecations: '6.0', lib: ['lib.esnext.d.ts'] }; } diff --git a/packages/generator-common/src/compiler.ts b/packages/generator-common/src/compiler.ts index c8889562e4..88b5b92e89 100644 --- a/packages/generator-common/src/compiler.ts +++ b/packages/generator-common/src/compiler.ts @@ -209,6 +209,16 @@ export async function readCompilerOptions( options.module = parseModuleKind(options.module as any); } + if ( + needsIgnoreDeprecationsTs6( + options.moduleResolution, + options.target, + options.module + ) + ) { + options.ignoreDeprecations = '6.0'; + } + return options; } @@ -268,3 +278,34 @@ function parseModuleKind(input: string): ModuleKind { ); return ModuleKind.CommonJS; } + +function needsIgnoreDeprecationsTs6( + moduleResolutionKind: ModuleResolutionKind | undefined, + scriptTarget: ScriptTarget | undefined, + moduleKind: ModuleKind | undefined +): boolean { + if ( + moduleResolutionKind === ModuleResolutionKind.NodeJs || + moduleResolutionKind === ModuleResolutionKind.Classic + ) { + logger.warn( + `The selected module resolution kind ${ModuleResolutionKind[moduleResolutionKind]} is not deprecated with TypeScript 6.0` + ); + return true; + } + + if (scriptTarget === ScriptTarget.ES3 || scriptTarget === ScriptTarget.ES5) { + logger.warn( + `The selected script target ${ScriptTarget[scriptTarget]} is not deprecated with TypeScript 6.0` + ); + return true; + } + + if (moduleKind === ModuleKind.AMD) { + logger.warn( + `The selected module kind ${ModuleKind[moduleKind]} is not deprecated with TypeScript 6.0` + ); + return true; + } + return false; +} diff --git a/packages/generator-common/src/file-writer/create-file.ts b/packages/generator-common/src/file-writer/create-file.ts index 89fcd4230e..c6e6a93b3c 100644 --- a/packages/generator-common/src/file-writer/create-file.ts +++ b/packages/generator-common/src/file-writer/create-file.ts @@ -163,12 +163,12 @@ export async function createFile( }); } catch (err) { const recommendation = - err.code === 'EEXIST' && !overwrite + (err as NodeJS.ErrnoException).code === 'EEXIST' && !overwrite ? ' File already exists. If you want to allow overwriting files, enable the `overwrite` flag.' : ''; throw new ErrorWithCause( `Could not write file "${fileName}".${recommendation}`, - err + err as Error ); } } diff --git a/packages/generator-common/src/options-parser.ts b/packages/generator-common/src/options-parser.ts index 642c085188..4eaafb8895 100644 --- a/packages/generator-common/src/options-parser.ts +++ b/packages/generator-common/src/options-parser.ts @@ -197,7 +197,7 @@ function resolveFilePaths(filePaths: string[]): string[] { * @param options */ export function resolveOptionsPerService( - arg: string, + arg: string | undefined, options: GeneratorOptionsT & { config?: string } ): string | undefined { if (typeof arg !== 'undefined') { @@ -293,13 +293,14 @@ class OptionsParser< private addDefaults( parsedOptions: ParsedOptions ): ParsedOptions { + const mutableOptions = parsedOptions as Record; Object.entries(this.options).forEach(([name, option]) => { if ('default' in option) { - parsedOptions[name] = parsedOptions[name] ?? option.default; + mutableOptions[name] = mutableOptions[name] ?? option.default; } if ('coerce' in option) { - parsedOptions[name] = option.coerce?.( - parsedOptions[name], + mutableOptions[name] = option.coerce?.( + mutableOptions[name], parsedOptions ); } diff --git a/packages/generator-common/src/options-per-service.ts b/packages/generator-common/src/options-per-service.ts index c72094f1bb..4d91a5eccd 100644 --- a/packages/generator-common/src/options-per-service.ts +++ b/packages/generator-common/src/options-per-service.ts @@ -88,7 +88,7 @@ export async function getOptionsPerService( } const optsPerService: OptionsPerService = inputPaths.reduce( - (previousOptions, inputPath) => { + (previousOptions: OptionsPerService, inputPath) => { const relativePath = getRelPathWithPosixSeparator(inputPath); const uniqueDirName = uniqueNameGenerator.generateAndSaveUniqueName( @@ -102,7 +102,7 @@ export async function getOptionsPerService( ); return previousOptions; }, - {} + {} as OptionsPerService ); return optsPerService; } @@ -111,15 +111,18 @@ function getDirectoryNamesByPaths( inputPaths: string[], originalOptionsPerService: PartialOptionsPerService ): Record { - return inputPaths.reduce((directoryNamesByPaths, inputPath) => { - const relativePath = getRelPathWithPosixSeparator(inputPath); - const directoryName = - originalOptionsPerService[relativePath]?.directoryName || - parseDirectoryName(relativePath); - - directoryNamesByPaths[inputPath] = directoryName; - return directoryNamesByPaths; - }, {}); + return inputPaths.reduce( + (directoryNamesByPaths: Record, inputPath) => { + const relativePath = getRelPathWithPosixSeparator(inputPath); + const directoryName = + originalOptionsPerService[relativePath]?.directoryName || + parseDirectoryName(relativePath); + + directoryNamesByPaths[inputPath] = directoryName; + return directoryNamesByPaths; + }, + {} + ); } /** @@ -136,7 +139,7 @@ function getPathsByDirName( dirNamesByPaths: Record ): Record { return Object.entries(dirNamesByPaths).reduce( - (pathsByDirName, [inputPath, dirName]) => { + (pathsByDirName: Record, [inputPath, dirName]) => { if (!pathsByDirName[dirName]) { pathsByDirName[dirName] = []; } diff --git a/packages/generator-common/src/sdk-metadata/sdk-metadata.ts b/packages/generator-common/src/sdk-metadata/sdk-metadata.ts index 10ef5bff60..66e80046dc 100644 --- a/packages/generator-common/src/sdk-metadata/sdk-metadata.ts +++ b/packages/generator-common/src/sdk-metadata/sdk-metadata.ts @@ -48,13 +48,16 @@ export function getLevenshteinClosest( objectsToCheck: T[], extractorFn: (x: T) => string ): T | undefined { - const distBelowThreshold = objectsToCheck.reduce((prev, obj) => { - const levenshteinDist = getLevenshteinDistance(name, extractorFn(obj)); - if (levenshteinDist < distanceThreshold) { - return [...prev, { dist: levenshteinDist, obj }]; - } - return prev; - }, []); + const distBelowThreshold = objectsToCheck.reduce( + (prev: { dist: number; obj: T }[], obj) => { + const levenshteinDist = getLevenshteinDistance(name, extractorFn(obj)); + if (levenshteinDist < distanceThreshold) { + return [...prev, { dist: levenshteinDist, obj }]; + } + return prev; + }, + [] as { dist: number; obj: T }[] + ); if (distBelowThreshold.length > 0) { return distBelowThreshold.sort((a, b) => (a.dist < b.dist ? -1 : 1))[0].obj; } diff --git a/packages/generator-common/src/ts-config.ts b/packages/generator-common/src/ts-config.ts index f744f878f6..7747ded9d9 100644 --- a/packages/generator-common/src/ts-config.ts +++ b/packages/generator-common/src/ts-config.ts @@ -43,7 +43,7 @@ export async function readCustomTsConfig(configPath: string): Promise { } catch (err) { throw new ErrorWithCause( `Could not read tsconfig.json at ${configPath}.`, - err + err as Error ); } } diff --git a/packages/generator/package.json b/packages/generator/package.json index 32a4da91cc..56839b2e88 100644 --- a/packages/generator/package.json +++ b/packages/generator/package.json @@ -52,7 +52,7 @@ "fast-xml-parser": "^5.5.9", "fs-extra": "^11.3.4", "ts-morph": "^28.0.0", - "typescript": "~5.9.3", + "typescript": "~6.0.3", "voca": "^1.4.1", "winston": "^3.19.0" }, diff --git a/packages/generator/src/edmx-parser/edmx-file-reader.ts b/packages/generator/src/edmx-parser/edmx-file-reader.ts index 0cf26cb8e5..1e294d0baf 100644 --- a/packages/generator/src/edmx-parser/edmx-file-reader.ts +++ b/packages/generator/src/edmx-parser/edmx-file-reader.ts @@ -72,16 +72,16 @@ function parseEdmxFile(edmx: string, edmxPath: PathLike): EdmxMetadata { return parseMetadata(root, getODataVersion(parsedEdmx), edmxPath); } -function getODataVersion(edmx): ODataVersion { +function getODataVersion(edmx: Record): ODataVersion { return edmx['edmx:Edmx'].Version === '4.0' ? 'v4' : 'v2'; } -function getRoot(edmx) { +function getRoot(edmx: Record): any[] { const schema = edmx['edmx:Edmx']['edmx:DataServices'].Schema; return forceArray(schema); } -function parseLink(root): string | undefined { +function parseLink(root: any[]): string | undefined { const links = getMergedPropertyWithNamespace(root, 'atom:link'); const selfLink = links.find(link => link.rel === 'self'); if (selfLink) { diff --git a/packages/generator/src/edmx-parser/v4/edmx-parser.ts b/packages/generator/src/edmx-parser/v4/edmx-parser.ts index d0f063e5a4..dd252b4f17 100644 --- a/packages/generator/src/edmx-parser/v4/edmx-parser.ts +++ b/packages/generator/src/edmx-parser/v4/edmx-parser.ts @@ -122,7 +122,7 @@ export function parseEntitySetsV4(root: any): EdmxEntitySet[] { } function parseNavigationPropertyBinding( - entitySet + entitySet: any ): EdmxNavigationPropertyBinding[] { return forceArray(entitySet.NavigationPropertyBinding); } diff --git a/packages/generator/src/edmx-to-vdm/common/complex-type.ts b/packages/generator/src/edmx-to-vdm/common/complex-type.ts index 41858c4e2c..73b3ae634d 100644 --- a/packages/generator/src/edmx-to-vdm/common/complex-type.ts +++ b/packages/generator/src/edmx-to-vdm/common/complex-type.ts @@ -39,7 +39,7 @@ export function transformComplexTypesBase( ...formatted, [c.Name]: formatter.originalToComplexTypeName(c.Name) }), - {} + {} as Record ); return complexTypes.map(c => { const typeName = formattedTypes[c.Name]; diff --git a/packages/generator/src/edmx-to-vdm/common/entity.ts b/packages/generator/src/edmx-to-vdm/common/entity.ts index bf9b342f40..dc9c0cc2bf 100644 --- a/packages/generator/src/edmx-to-vdm/common/entity.ts +++ b/packages/generator/src/edmx-to-vdm/common/entity.ts @@ -84,7 +84,7 @@ function properties( formatter: ServiceNameFormatter, enumTypes: VdmEnumType[] ): VdmProperty[] { - return entity.entityType.Property.map(p => { + return entity.entityType.Property.map((p: any) => { checkCollectionKind(p); const swaggerProp = entity.swaggerDefinition ? entity.swaggerDefinition.properties[p.Name] @@ -207,7 +207,7 @@ export function createEntityClassNames( ...names, [e.entitySet.Name]: formatter.originalToEntityClassName(e.entitySet.Name) }), - {} + {} as Record ); } diff --git a/packages/generator/src/edmx-to-vdm/common/enum-type.ts b/packages/generator/src/edmx-to-vdm/common/enum-type.ts index 1f6417c501..478534d0c3 100644 --- a/packages/generator/src/edmx-to-vdm/common/enum-type.ts +++ b/packages/generator/src/edmx-to-vdm/common/enum-type.ts @@ -20,7 +20,7 @@ export function transformEnumTypesBase( ...formatted, [enumType.Name]: formatter.originalToEnumTypeName(enumType.Name) }), - {} + {} as Record ); return enumTypes.map(e => { e.UnderlyingType = e.UnderlyingType || 'Edm.Int32'; diff --git a/packages/generator/src/edmx-to-vdm/common/operation-return-type.ts b/packages/generator/src/edmx-to-vdm/common/operation-return-type.ts index f3b2787a8f..1d70102bfc 100644 --- a/packages/generator/src/edmx-to-vdm/common/operation-return-type.ts +++ b/packages/generator/src/edmx-to-vdm/common/operation-return-type.ts @@ -172,4 +172,4 @@ export function cannotDeserialize(returnType: VdmOperationReturnType): boolean { /** * @internal */ -export type ExtractResponse = (string) => string; +export type ExtractResponse = (val: string) => string; diff --git a/packages/generator/src/generator-utils.ts b/packages/generator/src/generator-utils.ts index 3dbaaa678d..8cb0ecf577 100644 --- a/packages/generator/src/generator-utils.ts +++ b/packages/generator/src/generator-utils.ts @@ -166,7 +166,8 @@ export function getFallbackEdmTypeIfNeeded(edmType: string): EdmTypeShared { * @internal */ export function edmToTsType(edmType: string): string { - const tsType = edmToTsTypeMapping[edmType]; + const tsType = + edmToTsTypeMapping[edmType as Exclude]; if (!tsType) { throw new Error( `Could not determine TypeScript type for EDM type: '${edmType}'.` @@ -178,7 +179,7 @@ export function edmToTsType(edmType: string): string { * @internal */ export function edmToFieldType(edmType: string): string { - const fieldType = edmToFieldTypeMapping[edmType]; + const fieldType = edmToFieldTypeMapping[edmType as EdmTypeShared]; if (!fieldType) { throw new Error( `Could not determine field type for EDM type: '${edmType}'.` diff --git a/packages/generator/src/generator.ts b/packages/generator/src/generator.ts index d2d50ef5cd..e7acf24b68 100644 --- a/packages/generator/src/generator.ts +++ b/packages/generator/src/generator.ts @@ -110,14 +110,17 @@ async function generateWithParsedOptions( const chunks = splitInChunks(directories, options.transpilationProcesses); try { await chunks.reduce( - (all, chunk) => all.then(() => transpileDirectories(chunk, options)), + (all: Promise, chunk) => + all + .then(() => transpileDirectories(chunk, options)) + .then(() => undefined), Promise.resolve() ); } catch (err) { - if (err.message?.includes('error TS2307')) { + if ((err as Error).message?.includes('error TS2307')) { throw new ErrorWithCause( getInstallODataErrorMessage(projectAndServices), - err + err as Error ); } throw err; diff --git a/packages/generator/src/operations/import.ts b/packages/generator/src/operations/import.ts index 5c9c50bf40..e46c8a659f 100644 --- a/packages/generator/src/operations/import.ts +++ b/packages/generator/src/operations/import.ts @@ -57,7 +57,7 @@ function returnTypeImports( ...imports, ...returnTypeImport(returnType, options) ], - [] + [] as ImportDeclarationStructure[] ) ); } diff --git a/packages/generator/src/swagger-parser/swagger-types.ts b/packages/generator/src/swagger-parser/swagger-types.ts index 1313a0ba9e..1f589ed610 100644 --- a/packages/generator/src/swagger-parser/swagger-types.ts +++ b/packages/generator/src/swagger-parser/swagger-types.ts @@ -29,7 +29,7 @@ export interface SwaggerMetadata { /** * @internal */ - externalDocs?: { description: string; url; string }; + externalDocs?: { description: string; url: string }; } /** * @internal diff --git a/packages/generator/src/swagger-parser/swagger-util.ts b/packages/generator/src/swagger-parser/swagger-util.ts index e18248b552..384762638a 100644 --- a/packages/generator/src/swagger-parser/swagger-util.ts +++ b/packages/generator/src/swagger-parser/swagger-util.ts @@ -30,8 +30,8 @@ function communicationScenario(swagger: SwaggerMetadata): string | null { return ( swagger['x-sap-ext-overview'] - .find(x => x.name === 'Communication Scenario') - .values.map(x => x.text) + .find((x: any) => x.name === 'Communication Scenario') + .values.map((x: any) => x.text) .join(', ') || null ); } diff --git a/packages/http-client/package.json b/packages/http-client/package.json index 391b804beb..bdd083c4a1 100644 --- a/packages/http-client/package.json +++ b/packages/http-client/package.json @@ -52,6 +52,6 @@ "jsonwebtoken": "^9.0.3", "nock": "^14.0.11", "prettier": "^3.8.1", - "typescript": "~5.9.3" + "typescript": "~6.0.3" } } diff --git a/packages/http-client/src/csrf-token-middleware.ts b/packages/http-client/src/csrf-token-middleware.ts index 107a2d90b3..6642d9687f 100644 --- a/packages/http-client/src/csrf-token-middleware.ts +++ b/packages/http-client/src/csrf-token-middleware.ts @@ -7,7 +7,7 @@ import { pickValueIgnoreCase, removeTrailingSlashes } from '@sap-cloud-sdk/util'; -import axios from 'axios'; +import axios, { isAxiosError } from 'axios'; import { executeWithMiddleware } from '@sap-cloud-sdk/resilience/internal'; import type { HttpMiddleware, @@ -137,13 +137,13 @@ async function makeCsrfRequest( }); return findCsrfHeader(response.headers); } catch (error) { - if (findCsrfHeader(error.response?.headers)) { + if (isAxiosError(error) && findCsrfHeader(error.response?.headers)) { return findCsrfHeader(error.response?.headers); } logger.warn( new ErrorWithCause( `Failed to get CSRF token from URL: ${requestConfig.url}.`, - error + error as Error ) ); } diff --git a/packages/http-client/src/http-client.ts b/packages/http-client/src/http-client.ts index 5b7f9ac78b..d0249afe7f 100644 --- a/packages/http-client/src/http-client.ts +++ b/packages/http-client/src/http-client.ts @@ -103,9 +103,9 @@ export function execute(executeFn: ExecuteHttpRequestFn) { return executeWithMiddleware(requestConfig.middleware, { fnArgument: request, - fn: (req: typeof request) => { + fn: (req: HttpRequestConfig) => { logRequestInformation(request); - return executeFn(req); + return executeFn(req as HttpRequest); }, context: { jwt: destination.jwt, @@ -409,7 +409,7 @@ async function buildHeaders( try { return await buildHeadersForDestination(destination); } catch (error) { - throw new ErrorWithCause('Failed to build headers.', error); + throw new ErrorWithCause('Failed to build headers.', error as Error); } } diff --git a/packages/http-client/src/http-request-config.ts b/packages/http-client/src/http-request-config.ts index 3a551256e8..a95ebb73c3 100644 --- a/packages/http-client/src/http-request-config.ts +++ b/packages/http-client/src/http-request-config.ts @@ -53,7 +53,10 @@ export function mergeOptionsWithPriority( if (headersOrParams) { return origins.reduce( (mergedHeadersOrParams, origin) => - mergeIgnoreCase(mergedHeadersOrParams, headersOrParams[origin]), + mergeIgnoreCase( + mergedHeadersOrParams, + headersOrParams[origin as keyof OriginOptionsInternal] + ), {} ); } diff --git a/packages/odata-common/package.json b/packages/odata-common/package.json index 385f35ce46..91df177460 100644 --- a/packages/odata-common/package.json +++ b/packages/odata-common/package.json @@ -52,6 +52,6 @@ "@sap-cloud-sdk/test-util-internal": "workspace:^", "depcheck": "^1.4.7", "prettier": "^3.8.1", - "typescript": "~5.9.3" + "typescript": "~6.0.3" } } diff --git a/packages/odata-common/src/de-serializers/de-serializers.ts b/packages/odata-common/src/de-serializers/de-serializers.ts index 32bedb319e..54af238086 100644 --- a/packages/odata-common/src/de-serializers/de-serializers.ts +++ b/packages/odata-common/src/de-serializers/de-serializers.ts @@ -138,7 +138,8 @@ export function createValueDeserializer( deSerializers: DeSerializersT ): (value: any, edmType: EdmT) => DeserializedType { return (value, edmType) => { - const deserialize = deSerializers[edmType as any]?.deserialize; + const deserialize = (deSerializers as Record)[edmType as any] + ?.deserialize; return deserialize ? deserialize(value) : value; }; } @@ -154,7 +155,8 @@ export function createValueSerializer( deSerializers: DeSerializersT ): (value: any, edmType: EdmT, precision?: number) => any { return (value, edmType, precision) => { - const serialize = deSerializers[edmType as any]?.serialize; + const serialize = (deSerializers as Record)[edmType as any] + ?.serialize; return serialize ? serialize(value, precision) : value; }; } diff --git a/packages/odata-common/src/de-serializers/uri-value-converter.ts b/packages/odata-common/src/de-serializers/uri-value-converter.ts index 33cf9d910c..379d9440f5 100644 --- a/packages/odata-common/src/de-serializers/uri-value-converter.ts +++ b/packages/odata-common/src/de-serializers/uri-value-converter.ts @@ -33,7 +33,9 @@ export type UriConverter = ( */ export function createUriConverter(deSerializers: DeSerializers): UriConverter { return (value: any, edmType: EdmTypeShared<'any'>): string => { - const { serializeToUri, serialize } = deSerializers[edmType]; + const { serializeToUri, serialize } = ( + deSerializers as Record + )[edmType]; return serializeToUri ? serializeToUri(value, serialize) : serialize(value); }; } diff --git a/packages/odata-common/src/entity-base.ts b/packages/odata-common/src/entity-base.ts index 5d52295d47..a2b1ae0035 100644 --- a/packages/odata-common/src/entity-base.ts +++ b/packages/odata-common/src/entity-base.ts @@ -54,14 +54,14 @@ export abstract class EntityBase { * Remote state refers to the last known state of the entity on the remote system from which it has been retrieved or to which it has been posted. * It is stored as map, where the keys are stored in the format of the original OData properties. */ - protected remoteState: { [keys: string]: any }; + protected remoteState!: { [keys: string]: any }; /** * The current ETag version of the entity in the remote system. * The ETag identified the version of the in the remote system. It will be automatically set in the "if-match" header of update requests and can be set as a custom header for delete requests. * When no ETag is provided by the remote system the value of this variable defaults to "*". */ - protected _versionIdentifier: string; + protected _versionIdentifier!: string; /** * A mapper representing custom fields in an entity. @@ -170,7 +170,8 @@ export abstract class EntityBase { state = state || this.asObject(); this.remoteState = Object.entries(state).reduce( (stateObject, [fieldName, value]) => { - const propertyName = this[camelCase(fieldName)] + const self = this as Record; + const propertyName = self[camelCase(fieldName)] ? camelCase(fieldName) : fieldName; return { ...stateObject, [propertyName]: value }; @@ -251,15 +252,18 @@ export abstract class EntityBase { key: string, visitedEntities: EntityBase[] = [] ): any { + const self = this as Record; if (isNavigationProperty(key, this._entityApi.schema)) { - if (isNullish(this[key])) { - return this[key]; + if (isNullish(self[key])) { + return self[key]; } - return Array.isArray(this[key]) - ? this[key].map(linkedEntity => linkedEntity.asObject(visitedEntities)) - : this[key].asObject(visitedEntities); + return Array.isArray(self[key]) + ? self[key].map((linkedEntity: any) => + linkedEntity.asObject(visitedEntities) + ) + : self[key].asObject(visitedEntities); } - return Array.isArray(this[key]) ? [...this[key]] : this[key]; + return Array.isArray(self[key]) ? [...self[key]] : self[key]; } /** @@ -280,12 +284,13 @@ export abstract class EntityBase { */ protected asObject(visitedEntities: EntityBase[] = []): Record { visitedEntities.push(this); + const self = this as Record; return Object.keys(this) .filter( key => this.propertyIsEnumerable(key) && (!isNavigationProperty(key, this._entityApi.schema) || - !this.isVisitedEntity(this[key], visitedEntities)) + !this.isVisitedEntity(self[key], visitedEntities)) ) .reduce( (accumulatedMap, key) => ({ @@ -362,8 +367,8 @@ export function entityBuilder< const builder = new EntityBuilder(entityApi); Object.values(entityApi.schema).forEach((field: any) => { const fieldName = `${camelCase(field._fieldName)}`; - builder[fieldName] = function (value) { - this._entity[fieldName] = value; + (builder as Record)[fieldName] = function (value: any) { + (this._entity as Record)[fieldName] = value; return this; }; }); diff --git a/packages/odata-common/src/entity-builder.ts b/packages/odata-common/src/entity-builder.ts index 6cbd6ee9a7..f6b2520833 100644 --- a/packages/odata-common/src/entity-builder.ts +++ b/packages/odata-common/src/entity-builder.ts @@ -54,7 +54,7 @@ export class EntityBuilder< EntityT extends EntityBase, DeSerializersT extends DeSerializers > { - protected _entity: EntityT; + protected _entity!: EntityT; constructor(readonly _entityApi: EntityApi) { if (!this._entity) { @@ -96,7 +96,8 @@ export class EntityBuilder< const [entityEntries, customEntries] = partition( Object.entries(json), - ([key]) => typeof entityBuilder[key] === 'function' + ([key]) => + typeof (entityBuilder as Record)[key] === 'function' ); entityEntries.forEach(([key, value]) => { @@ -105,7 +106,7 @@ export class EntityBuilder< ? buildNavigationPropertyFromJson(key, value, this._entityApi) : value; - entityBuilder[key](propertyValue); + (entityBuilder as Record)[key](propertyValue); }); const customFields = customEntries.reduce( @@ -120,17 +121,20 @@ export class EntityBuilder< private filterCustomFields( customFields: Record ): Record { - return Object.keys(customFields).reduce((validCfs, cf) => { - if (!this._entityApi.schema[upperCaseSnakeCase(cf)]) { - validCfs[cf] = customFields[cf]; - } - logger.warn( - `Field name "${cf}" is already existing in "${toClassName( - this._entityApi.entityConstructor._entityName - )}" and thus cannot be defined as custom field. ` - ); - return validCfs; - }, {}); + return Object.keys(customFields).reduce( + (validCfs: Record, cf) => { + if (!this._entityApi.schema[upperCaseSnakeCase(cf)]) { + validCfs[cf] = customFields[cf]; + } + logger.warn( + `Field name "${cf}" is already existing in "${toClassName( + this._entityApi.entityConstructor._entityName + )}" and thus cannot be defined as custom field. ` + ); + return validCfs; + }, + {} + ); } } diff --git a/packages/odata-common/src/entity-deserializer.ts b/packages/odata-common/src/entity-deserializer.ts index cac738bc6c..a805792c38 100644 --- a/packages/odata-common/src/entity-deserializer.ts +++ b/packages/odata-common/src/entity-deserializer.ts @@ -75,11 +75,8 @@ export function entityDeserializer( * @param requestHeader - Optional parameter which may be used to add a version identifier (ETag) to the entity. * @returns An instance of the entity class. */ - function deserializeEntity< - EntityApiT extends EntityApi, - JsonT - >( - json: Partial, + function deserializeEntity>( + json: Record, entityApi: EntityApiT, requestHeader?: any ): EntityType { @@ -100,10 +97,9 @@ export function entityDeserializer( function getFieldValue< EntityT extends EntityBase, - DeSerializersT extends DeSerializers, - JsonT + DeSerializersT extends DeSerializers >( - json: Partial, + json: Record, field: | Field | Link> @@ -136,10 +132,9 @@ export function entityDeserializer( function getLinkFromJson< EntityT extends EntityBase, DeSerializersT extends DeSerializers, - LinkedEntityApiT extends EntityApi, - JsonT + LinkedEntityApiT extends EntityApi >( - json: Partial, + json: Record, link: Link ) { return link instanceof OneToOneLink @@ -152,13 +147,12 @@ export function entityDeserializer( function getSingleLinkFromJson< EntityT extends EntityBase, DeSerializersT extends DeSerializers, - LinkedEntityApiT extends EntityApi, - JsonT + LinkedEntityApiT extends EntityApi >( - json: Partial, + json: Record, link: Link ): EntityType | null { - if (isExpandedProperty(json, link)) { + if (isExpandedProperty(json, link as unknown as Link)) { return deserializeEntity(json[link._fieldName], link._linkedEntityApi); } return null; @@ -167,15 +161,14 @@ export function entityDeserializer( function getMultiLinkFromJson< EntityT extends EntityBase, DeSerializersT extends DeSerializers, - LinkedEntityApiT extends EntityApi, - JsonT + LinkedEntityApiT extends EntityApi >( - json: Partial, + json: Record, link: Link ): EntityType[] | undefined { - if (isSelectedProperty(json, link)) { + if (isSelectedProperty(json, link as unknown as Link)) { const results = extractDataFromOneToManyLink(json[link._fieldName]); - return results.map(linkJson => + return results.map((linkJson: any) => deserializeEntity(linkJson, link._linkedEntityApi) ); } @@ -289,8 +282,8 @@ export function extractEtagFromHeader(headers: any): string | undefined { * @returns An object containing the custom fields as key-value pairs. * @internal */ -export function extractCustomFields( - json: Partial, +export function extractCustomFields( + json: Record, schema: Record ): Record { const regularODataProperties = [ @@ -302,7 +295,7 @@ export function extractCustomFields( const regularFields = new Set(regularODataProperties); return Object.keys(json) .filter(key => !regularFields.has(key)) - .reduce((customFields, key) => { + .reduce((customFields: Record, key) => { customFields[key] = json[key]; return customFields; }, {}); diff --git a/packages/odata-common/src/entity-serializer.ts b/packages/odata-common/src/entity-serializer.ts index a621c1bc2b..0faad8bcc3 100644 --- a/packages/odata-common/src/entity-serializer.ts +++ b/packages/odata-common/src/entity-serializer.ts @@ -90,7 +90,7 @@ export function entitySerializer( return serializeEntity(fieldValue, field._linkedEntityApi); } if (field instanceof Link) { - return fieldValue.map(linkedEntity => + return fieldValue.map((linkedEntity: EntityBase) => serializeEntity(linkedEntity, field._linkedEntityApi) ); } @@ -122,7 +122,7 @@ export function entitySerializer( ): Record { return getFieldNames(entity, diff).reduce((serialized, key) => { const field = entityApi.schema[upperCaseSnakeCase(key)]; - const fieldValue = entity[key]; + const fieldValue = (entity as Record)[key]; const serializedValue = serializeField(field, fieldValue); diff --git a/packages/odata-common/src/filter/boolean-filter-function.ts b/packages/odata-common/src/filter/boolean-filter-function.ts index f498375b24..eef1363f12 100644 --- a/packages/odata-common/src/filter/boolean-filter-function.ts +++ b/packages/odata-common/src/filter/boolean-filter-function.ts @@ -31,9 +31,10 @@ export class BooleanFilterFunction< export function isBooleanFilterFunction( filterable: Filterable ): filterable is BooleanFilterFunction { + const f = filterable as unknown as Record; return ( - typeof filterable['functionName'] !== 'undefined' && - typeof filterable['parameters'] !== 'undefined' && - filterable['edmType'] === 'Edm.Boolean' + typeof f['functionName'] !== 'undefined' && + typeof f['parameters'] !== 'undefined' && + f['edmType'] === 'Edm.Boolean' ); } diff --git a/packages/odata-common/src/filter/filter-link.ts b/packages/odata-common/src/filter/filter-link.ts index 70a0abf871..2eec816e0e 100644 --- a/packages/odata-common/src/filter/filter-link.ts +++ b/packages/odata-common/src/filter/filter-link.ts @@ -23,13 +23,13 @@ export class FilterLink< /** * Entity type of the entity tp be filtered. */ - readonly _entity: EntityT; - readonly _deSerializers: DeSerializersT; + readonly _entity!: EntityT; + readonly _deSerializers!: DeSerializersT; /** * Linked entity to be filtered by. */ - readonly _linkedEntityType: EntityType; + readonly _linkedEntityType!: EntityType; /** * Creates an instance of `FilterLink`. @@ -55,8 +55,8 @@ export function isFilterLink< >( filterable: Filterable ): filterable is FilterLink { + const f = filterable as unknown as Record; return ( - typeof filterable['link'] !== 'undefined' && - typeof filterable['filters'] !== 'undefined' + typeof f['link'] !== 'undefined' && typeof f['filters'] !== 'undefined' ); } diff --git a/packages/odata-common/src/filter/filter-list.ts b/packages/odata-common/src/filter/filter-list.ts index b262d8db25..fe8d8ca8fb 100644 --- a/packages/odata-common/src/filter/filter-list.ts +++ b/packages/odata-common/src/filter/filter-list.ts @@ -15,8 +15,8 @@ export class FilterList< /** * Entity type of the entity tp be filtered. */ - readonly _entity: EntityT; - _deSerializers: DeSerializersT; + readonly _entity!: EntityT; + _deSerializers!: DeSerializersT; /** * Creates an instance of FilterList. @@ -41,12 +41,13 @@ export function isFilterList< >( filterable: Filterable ): filterable is FilterList { + const f = filterable as unknown as Record; return ( - typeof filterable['field'] === 'undefined' && - typeof filterable['operator'] === 'undefined' && - typeof filterable['value'] === 'undefined' && - typeof filterable['functionName'] === 'undefined' && - typeof filterable['link'] === 'undefined' && + typeof f['field'] === 'undefined' && + typeof f['operator'] === 'undefined' && + typeof f['value'] === 'undefined' && + typeof f['functionName'] === 'undefined' && + typeof f['link'] === 'undefined' && !('lambdaOperator' in filterable) && !(filterable instanceof OneToManyLink) ); diff --git a/packages/odata-common/src/filter/filter.ts b/packages/odata-common/src/filter/filter.ts index 35823ff3de..1f42e48337 100644 --- a/packages/odata-common/src/filter/filter.ts +++ b/packages/odata-common/src/filter/filter.ts @@ -57,9 +57,9 @@ export class Filter< /** * Entity type of the entity tp be filtered. */ - readonly _entity: EntityT; + readonly _entity!: EntityT; - readonly _deSerializers: DeSerializersT; + readonly _deSerializers!: DeSerializersT; /** * Creates an instance of Filter. @@ -89,9 +89,10 @@ export function isFilter< >( filterable: Filterable ): filterable is Filter { + const f = filterable as unknown as Record; return ( - typeof filterable['field'] !== 'undefined' && - typeof filterable['operator'] !== 'undefined' && - typeof filterable['value'] !== 'undefined' + typeof f['field'] !== 'undefined' && + typeof f['operator'] !== 'undefined' && + typeof f['value'] !== 'undefined' ); } diff --git a/packages/odata-common/src/filter/unary-filter.ts b/packages/odata-common/src/filter/unary-filter.ts index d5d0ee0f0d..8c4ccd0660 100644 --- a/packages/odata-common/src/filter/unary-filter.ts +++ b/packages/odata-common/src/filter/unary-filter.ts @@ -29,8 +29,9 @@ export function isUnaryFilter< >( filterable: Filterable ): filterable is UnaryFilter { + const f = filterable as unknown as Record; return ( - typeof filterable['singleOperand'] !== 'undefined' && - typeof filterable['operator'] !== 'undefined' + typeof f['singleOperand'] !== 'undefined' && + typeof f['operator'] !== 'undefined' ); } diff --git a/packages/odata-common/src/order/order-link.ts b/packages/odata-common/src/order/order-link.ts index 2d2e70972c..393fc3073f 100644 --- a/packages/odata-common/src/order/order-link.ts +++ b/packages/odata-common/src/order/order-link.ts @@ -12,8 +12,8 @@ export class OrderLink< EntityT extends EntityBase, LinkedEntityApiT extends EntityApi > { - readonly entityType: EntityT; - readonly linkedEntityType: EntityType; + readonly entityType!: EntityT; + readonly linkedEntityType!: EntityType; /** * Creates an instance of OrderLink. diff --git a/packages/odata-common/src/order/order.ts b/packages/odata-common/src/order/order.ts index 21f1a36e49..8b34cb2f61 100644 --- a/packages/odata-common/src/order/order.ts +++ b/packages/odata-common/src/order/order.ts @@ -17,8 +17,8 @@ export class Order implements EntityIdentifiable< EntityT, any > { - readonly _entityConstructor: Constructable; - readonly _entity: EntityT; + readonly _entityConstructor!: Constructable; + readonly _entity!: EntityT; readonly _deSerializers: any; /** diff --git a/packages/odata-common/src/request-builder/batch/batch-response-parser.ts b/packages/odata-common/src/request-builder/batch/batch-response-parser.ts index e3705fc236..6a403020a8 100644 --- a/packages/odata-common/src/request-builder/batch/batch-response-parser.ts +++ b/packages/odata-common/src/request-builder/batch/batch-response-parser.ts @@ -97,7 +97,7 @@ export function splitBatchResponse(response: HttpResponse): string[] { ); return splitResponse(body, boundary); } catch (err) { - throw new ErrorWithCause('Could not parse batch response.', err); + throw new ErrorWithCause('Could not parse batch response.', err as Error); } } @@ -114,7 +114,10 @@ export function splitChangeSetResponse(changeSetResponse: string): string[] { const boundary = getBoundary(pickValueIgnoreCase(headers, 'content-type')); return splitResponse(changeSetResponse, boundary); } catch (err) { - throw new ErrorWithCause('Could not parse change set response.', err); + throw new ErrorWithCause( + 'Could not parse change set response.', + err as Error + ); } } diff --git a/packages/odata-common/src/request-builder/create-request-builder-base.ts b/packages/odata-common/src/request-builder/create-request-builder-base.ts index 4e66ffbbbb..b312bb8c10 100644 --- a/packages/odata-common/src/request-builder/create-request-builder-base.ts +++ b/packages/odata-common/src/request-builder/create-request-builder-base.ts @@ -27,8 +27,8 @@ export abstract class CreateRequestBuilderBase< > implements EntityIdentifiable, WithBatchReference { - readonly _deSerializers: DeSerializersT; - private _batchReference: BatchReference; + readonly _deSerializers!: DeSerializersT; + private _batchReference!: BatchReference; /** * Creates an instance of CreateRequestBuilder. diff --git a/packages/odata-common/src/request-builder/delete-request-builder-base.ts b/packages/odata-common/src/request-builder/delete-request-builder-base.ts index d9f86a4448..07ab27cf15 100644 --- a/packages/odata-common/src/request-builder/delete-request-builder-base.ts +++ b/packages/odata-common/src/request-builder/delete-request-builder-base.ts @@ -23,9 +23,9 @@ export abstract class DeleteRequestBuilderBase< > implements EntityIdentifiable, WithBatchReference { - readonly _entity: EntityT; - readonly _deSerializers: DeSerializersT; - private _batchReference: BatchReference; + readonly _entity!: EntityT; + readonly _deSerializers!: DeSerializersT; + private _batchReference!: BatchReference; /** * Creates an instance of DeleteRequestBuilder. If the entity is passed, version identifier will also be added. diff --git a/packages/odata-common/src/request-builder/get-by-key-request-builder-base.ts b/packages/odata-common/src/request-builder/get-by-key-request-builder-base.ts index 1970370b3c..631325e9ab 100644 --- a/packages/odata-common/src/request-builder/get-by-key-request-builder-base.ts +++ b/packages/odata-common/src/request-builder/get-by-key-request-builder-base.ts @@ -29,7 +29,7 @@ export abstract class GetByKeyRequestBuilderBase< > implements WithBatchReference { - private _batchReference: BatchReference; + private _batchReference!: BatchReference; /** * Creates an instance of GetByKeyRequestBuilder. diff --git a/packages/odata-common/src/request-builder/get-request-builder-base.ts b/packages/odata-common/src/request-builder/get-request-builder-base.ts index a524fad791..2a0a779377 100644 --- a/packages/odata-common/src/request-builder/get-request-builder-base.ts +++ b/packages/odata-common/src/request-builder/get-request-builder-base.ts @@ -28,9 +28,9 @@ export abstract class GetRequestBuilderBase< extends MethodRequestBuilder implements EntityIdentifiable { - readonly _entity: EntityT; - readonly _entityConstructor: Constructable; - readonly _deSerializers: DeSerializersT; + readonly _entity!: EntityT; + readonly _entityConstructor!: Constructable; + readonly _deSerializers!: DeSerializersT; /** * Creates an instance of GetAllRequestBuilder. diff --git a/packages/odata-common/src/request-builder/operation-request-builder-base.ts b/packages/odata-common/src/request-builder/operation-request-builder-base.ts index ec60d60248..3f9f2d0c2a 100644 --- a/packages/odata-common/src/request-builder/operation-request-builder-base.ts +++ b/packages/odata-common/src/request-builder/operation-request-builder-base.ts @@ -23,7 +23,7 @@ export abstract class OperationRequestBuilderBase< extends MethodRequestBuilder implements WithBatchReference { - private _batchReference: BatchReference; + private _batchReference!: BatchReference; /** * Base class for function and action request builder. * @param responseTransformer - Transformation function for the response. diff --git a/packages/odata-common/src/request-builder/request-builder.ts b/packages/odata-common/src/request-builder/request-builder.ts index 4d973b5a3f..feb352022a 100644 --- a/packages/odata-common/src/request-builder/request-builder.ts +++ b/packages/odata-common/src/request-builder/request-builder.ts @@ -9,8 +9,8 @@ export abstract class RequestBuilder< EntityT extends EntityBase, DeSerializersT extends DeSerializers > implements EntityIdentifiable { - _deSerializers: DeSerializersT; - _entity: EntityT; + _deSerializers!: DeSerializersT; + _entity!: EntityT; constructor(public entityApi: EntityApi) {} } diff --git a/packages/odata-common/src/request-builder/update-request-builder-base.ts b/packages/odata-common/src/request-builder/update-request-builder-base.ts index 6a764d59e3..9da836b549 100644 --- a/packages/odata-common/src/request-builder/update-request-builder-base.ts +++ b/packages/odata-common/src/request-builder/update-request-builder-base.ts @@ -32,10 +32,10 @@ export abstract class UpdateRequestBuilderBase< > implements EntityIdentifiable, WithBatchReference { - readonly _deSerializers: DeSerializersT; + readonly _deSerializers!: DeSerializersT; private ignored: Set; private required: Set; - private _batchReference: BatchReference; + private _batchReference!: BatchReference; /** * Creates an instance of UpdateRequestBuilder. diff --git a/packages/odata-common/src/request/odata-create-request-config.ts b/packages/odata-common/src/request/odata-create-request-config.ts index 45baa53154..41548b01e4 100644 --- a/packages/odata-common/src/request/odata-create-request-config.ts +++ b/packages/odata-common/src/request/odata-create-request-config.ts @@ -16,12 +16,12 @@ export class ODataCreateRequestConfig< /** * Keys of the parent of the entity to create. Defined only when attempting to create child entities. */ - parentKeys: Record; + parentKeys!: Record; /** * Field that links the parent entity class to the child entity class. */ - childField: Link>; + childField!: Link>; /** * Creates an instance of ODataRequest. diff --git a/packages/odata-common/src/request/odata-delete-request-config.ts b/packages/odata-common/src/request/odata-delete-request-config.ts index 68fdf8d0dd..d4e6eb580c 100644 --- a/packages/odata-common/src/request/odata-delete-request-config.ts +++ b/packages/odata-common/src/request/odata-delete-request-config.ts @@ -16,8 +16,8 @@ export class ODataDeleteRequestConfig< extends ODataRequestConfig implements WithKeys, WithETag { - keys: Record; - eTag: string; + keys!: Record; + eTag!: string; versionIdentifierIgnored = false; /** diff --git a/packages/odata-common/src/request/odata-get-all-request-config.ts b/packages/odata-common/src/request/odata-get-all-request-config.ts index ef66fbc944..84c141ebd7 100644 --- a/packages/odata-common/src/request/odata-get-all-request-config.ts +++ b/packages/odata-common/src/request/odata-get-all-request-config.ts @@ -20,12 +20,12 @@ export class ODataGetAllRequestConfig< extends ODataRequestConfig implements WithGetAllRestrictions { - top: number; - skip: number; - filter: Filterable; - orderBy: Orderable[]; - selects: Selectable[]; - expands: Expandable< + top!: number; + skip!: number; + filter!: Filterable; + orderBy!: Orderable[]; + selects!: Selectable[]; + expands!: Expandable< EntityT, DeSerializersT, EntityApi diff --git a/packages/odata-common/src/request/odata-get-by-key-request-config.ts b/packages/odata-common/src/request/odata-get-by-key-request-config.ts index 053bfc7342..80b9ae8c56 100644 --- a/packages/odata-common/src/request/odata-get-by-key-request-config.ts +++ b/packages/odata-common/src/request/odata-get-by-key-request-config.ts @@ -18,9 +18,9 @@ export class ODataGetByKeyRequestConfig< extends ODataRequestConfig implements WithKeys, WithSelection { - keys: Record; + keys!: Record; selects: Selectable[] = []; - expands: Expandable< + expands!: Expandable< EntityT, DeSerializersT, EntityApi diff --git a/packages/odata-common/src/request/odata-request-config.ts b/packages/odata-common/src/request/odata-request-config.ts index e8c33dbbd8..17d47ef445 100644 --- a/packages/odata-common/src/request/odata-request-config.ts +++ b/packages/odata-common/src/request/odata-request-config.ts @@ -15,8 +15,8 @@ export type RequestMethodType = 'get' | 'post' | 'patch' | 'delete' | 'put'; * Parent class for all OData request configs like `getAll`, `delete` or `count`. */ export abstract class ODataRequestConfig { - payload: Record | string; - basePath: string; + payload!: Record | string; + basePath!: string; readonly defaultHeaders: Record = { 'content-type': 'application/json', @@ -134,10 +134,13 @@ export abstract class ODataRequestConfig { protected prependDollarToQueryParameters( params: Record ): Record { - return Object.entries(params).reduce((newParams, [key, value]) => { - newParams[`$${key}`] = value; - return newParams; - }, {}); + return Object.entries(params).reduce( + (newParams: Record, [key, value]) => { + newParams[`$${key}`] = value; + return newParams; + }, + {} + ); } /** diff --git a/packages/odata-common/src/request/odata-request.ts b/packages/odata-common/src/request/odata-request.ts index 84de27c67f..25444e5a5e 100644 --- a/packages/odata-common/src/request/odata-request.ts +++ b/packages/odata-common/src/request/odata-request.ts @@ -175,7 +175,7 @@ export class ODataRequest { } catch (error) { throw new ErrorWithCause( 'Constructing headers for OData request failed!', - error + error as Error ); } } @@ -279,7 +279,7 @@ export class ODataRequest { } } -function constructError(error, requestMethod: string, url: string): Error { +function constructError(error: any, requestMethod: string, url: string): Error { if (error.isAxiosError) { const defaultMessage = `${requestMethod} request to ${url} failed!`; const s4SpecificMessage = propertyExists(error, 'response', 'data', 'error') @@ -292,7 +292,7 @@ function constructError(error, requestMethod: string, url: string): Error { return error; } -function messageFromS4ErrorResponse(error): string { +function messageFromS4ErrorResponse(error: any): string { return `${ propertyExists(error.response.data.error, 'message', 'value') ? error.response.data.error.message.value diff --git a/packages/odata-common/src/request/odata-update-request-config.ts b/packages/odata-common/src/request/odata-update-request-config.ts index 564d59c495..d1fd36e401 100644 --- a/packages/odata-common/src/request/odata-update-request-config.ts +++ b/packages/odata-common/src/request/odata-update-request-config.ts @@ -16,8 +16,8 @@ export class ODataUpdateRequestConfig< extends ODataRequestConfig implements WithKeys, WithETag { - keys: Record; - eTag: string; + keys!: Record; + eTag!: string; versionIdentifierIgnored = false; /** diff --git a/packages/odata-common/src/response-data-accessor.ts b/packages/odata-common/src/response-data-accessor.ts index 21942850f6..b4fde467ab 100644 --- a/packages/odata-common/src/response-data-accessor.ts +++ b/packages/odata-common/src/response-data-accessor.ts @@ -7,11 +7,11 @@ export interface ResponseDataAccessor { * A function that extracts array data from the response object. * The data is extracted per default from `data.d.results`. */ - getCollectionResult: (data) => any[]; + getCollectionResult: (data: any) => any[]; /** * Checks if the response is an array-like object. */ - isCollectionResult: (data) => boolean; + isCollectionResult: (data: any) => boolean; /** * A function that extracts object data from the response object. * The data is extracted by default from `data.d.results`. @@ -21,5 +21,5 @@ export interface ResponseDataAccessor { * Extract the collection data from the one-to-many link response. * If the data does not contain a collection, an empty array is returned. */ - getLinkedCollectionResult: (data) => any[]; + getLinkedCollectionResult: (data: any) => any[]; } diff --git a/packages/odata-common/src/selectable/all-fields.ts b/packages/odata-common/src/selectable/all-fields.ts index d0f1159bac..06d38ae77c 100644 --- a/packages/odata-common/src/selectable/all-fields.ts +++ b/packages/odata-common/src/selectable/all-fields.ts @@ -5,7 +5,7 @@ import type { EntityBase, Constructable } from '../entity-base'; * This field should be used in the schema of entities. */ export class AllFields { - readonly selectable: true; + readonly selectable!: true; constructor( public _fieldName: string, diff --git a/packages/odata-common/src/selectable/collection-field.ts b/packages/odata-common/src/selectable/collection-field.ts index 971abdca0c..9e154b77c5 100644 --- a/packages/odata-common/src/selectable/collection-field.ts +++ b/packages/odata-common/src/selectable/collection-field.ts @@ -22,7 +22,7 @@ export class CollectionField< NullableT extends boolean = false, SelectableT extends boolean = false > extends Field { - readonly _deSerializers: DeSerializersT; + readonly _deSerializers!: DeSerializersT; /** * Creates an instance of CollectionField. * @param fieldName - Actual name of the field used in the OData request. diff --git a/packages/odata-common/src/selectable/edm-type-field.ts b/packages/odata-common/src/selectable/edm-type-field.ts index 14c122a738..b53873d821 100644 --- a/packages/odata-common/src/selectable/edm-type-field.ts +++ b/packages/odata-common/src/selectable/edm-type-field.ts @@ -54,7 +54,7 @@ export class EdmTypeField< extends Field implements EntityIdentifiable { - readonly _entity: EntityT; + readonly _entity!: EntityT; /** * Creates an instance of EdmTypeField. diff --git a/packages/odata-common/src/selectable/link.ts b/packages/odata-common/src/selectable/link.ts index 2dbe7a35d9..65d8358397 100644 --- a/packages/odata-common/src/selectable/link.ts +++ b/packages/odata-common/src/selectable/link.ts @@ -26,8 +26,8 @@ export class Link< DeSerializersT extends DeSerializers, LinkedEntityApiT extends EntityApi > implements EntityIdentifiable { - readonly _entity: EntityT; - readonly _deSerializers: DeSerializersT; + readonly _entity!: EntityT; + readonly _deSerializers!: DeSerializersT; /** * List of selectables on the linked entity. diff --git a/packages/odata-common/src/selectable/one-to-many-link.ts b/packages/odata-common/src/selectable/one-to-many-link.ts index fb20dc3f7c..65970d74b2 100644 --- a/packages/odata-common/src/selectable/one-to-many-link.ts +++ b/packages/odata-common/src/selectable/one-to-many-link.ts @@ -32,10 +32,10 @@ export class OneToManyLink< DeSerializersT extends DeSerializers, LinkedEntityApiT extends EntityApi > extends Link { - _filters: FilterLink; + _filters!: FilterLink; _orderBy: Orderable>[] = []; - _top: number; - _skip: number; + _top!: number; + _skip!: number; clone(): this { const clonedLink = super.clone(); diff --git a/packages/odata-common/src/selectable/one-to-one-link.ts b/packages/odata-common/src/selectable/one-to-one-link.ts index 2febaf3c29..d7bc0e4fe9 100644 --- a/packages/odata-common/src/selectable/one-to-one-link.ts +++ b/packages/odata-common/src/selectable/one-to-one-link.ts @@ -25,7 +25,7 @@ export class OneToOneLink< /** * Filterables to apply to the given entity based on the linked entity. */ - filters: Filterable, DeSerializersT>; + filters!: Filterable, DeSerializersT>; clone(): this { const clonedLink = super.clone(); diff --git a/packages/odata-common/src/uri-conversion/get-keys.ts b/packages/odata-common/src/uri-conversion/get-keys.ts index cfa8d1a2c6..a7cf49d8eb 100644 --- a/packages/odata-common/src/uri-conversion/get-keys.ts +++ b/packages/odata-common/src/uri-conversion/get-keys.ts @@ -21,7 +21,7 @@ export function getEntityKeys( return entityApi.entityConstructor._keys.reduce( (prev, curr) => ({ ...prev, - [curr]: entity[camelCase(curr)] + [curr]: (entity as Record)[camelCase(curr)] }), {} ); diff --git a/packages/odata-v2/package.json b/packages/odata-v2/package.json index 0a8b6c9e35..a8f5762773 100644 --- a/packages/odata-v2/package.json +++ b/packages/odata-v2/package.json @@ -53,6 +53,6 @@ "@sap-cloud-sdk/test-util-internal": "workspace:^", "nock": "^14.0.11", "prettier": "^3.8.1", - "typescript": "~5.9.3" + "typescript": "~6.0.3" } } diff --git a/packages/odata-v2/src/de-serializers/converters.ts b/packages/odata-v2/src/de-serializers/converters.ts index 63ca741003..a69bfce6fa 100644 --- a/packages/odata-v2/src/de-serializers/converters.ts +++ b/packages/odata-v2/src/de-serializers/converters.ts @@ -70,7 +70,7 @@ export function serializeFromMoment(momentInstance: moment.Moment): string { const timestamp = momentInstance.unix() * 1000; // For some reason isUtc() returns wrong values here, so we use the internal flag directly - if (momentInstance['_isUTC']) { + if ((momentInstance as any)['_isUTC']) { const offset = Math.abs(momentInstance.utcOffset()); const operator = momentInstance.utcOffset() >= 0 ? '+' : '-'; return `/Date(${timestamp}${operator}${leftPad(offset, 4)})/`; diff --git a/packages/odata-v2/src/de-serializers/payload-value-converter.ts b/packages/odata-v2/src/de-serializers/payload-value-converter.ts index 22f2454d33..44ed22e438 100644 --- a/packages/odata-v2/src/de-serializers/payload-value-converter.ts +++ b/packages/odata-v2/src/de-serializers/payload-value-converter.ts @@ -13,7 +13,7 @@ export function edmToTs( edmType: EdmTypeShared<'v2'>, deSerializers: DeSerializers ): any { - return deSerializers[edmType].deserialize(value); + return (deSerializers as Record)[edmType].deserialize(value); } /** @@ -24,5 +24,5 @@ export function tsToEdm( edmType: EdmTypeShared<'v2'>, deSerializers: DeSerializers ): any { - return deSerializers[edmType].serialize(value); + return (deSerializers as Record)[edmType].serialize(value); } diff --git a/packages/odata-v2/src/request-builder/update-request-builder.ts b/packages/odata-v2/src/request-builder/update-request-builder.ts index 48c103b2c3..228dc42302 100644 --- a/packages/odata-v2/src/request-builder/update-request-builder.ts +++ b/packages/odata-v2/src/request-builder/update-request-builder.ts @@ -103,7 +103,9 @@ function warnIfNavigation< schema: Record ): ODataRequest> { const setNavigationProperties = Object.keys(entity).filter( - key => !isNullish(entity[key]) && isNavigationProperty(key, schema) + key => + !isNullish((entity as Record)[key]) && + isNavigationProperty(key, schema) ); if (setNavigationProperties.length) { diff --git a/packages/odata-v2/src/request/odata-function-request-config.ts b/packages/odata-v2/src/request/odata-function-request-config.ts index 0049487cd8..be973c8b19 100644 --- a/packages/odata-v2/src/request/odata-function-request-config.ts +++ b/packages/odata-v2/src/request/odata-function-request-config.ts @@ -40,7 +40,9 @@ export class ODataFunctionRequestConfig< queryParameters(): Record { return { - ...(Object.values(this.parameters) + ...(Object.values( + this.parameters as Record> + ) .filter( (parameter: OperationParameter) => typeof parameter.value !== 'undefined' diff --git a/packages/odata-v2/src/uri-conversion/odata-uri.ts b/packages/odata-v2/src/uri-conversion/odata-uri.ts index 6093183524..b2f6793531 100644 --- a/packages/odata-v2/src/uri-conversion/odata-uri.ts +++ b/packages/odata-v2/src/uri-conversion/odata-uri.ts @@ -7,7 +7,11 @@ import type { } from '@sap-cloud-sdk/odata-common/internal'; // eslint-disable-next-line @typescript-eslint/no-unused-vars -function getExpandWrapped(selects, expands, entityConstructor) { +function getExpandWrapped( + selects: any[], + _expands: any[], + _entityConstructor: any +) { return getExpand(selects); } @@ -20,5 +24,9 @@ function getExpandWrapped(selects, expands, entityConstructor) { export function createODataUri( deSerializers: DeSerializersT ): ODataUri { - return createODataUriBase(deSerializers, getExpandWrapped, getSelect); + return createODataUriBase( + deSerializers, + getExpandWrapped as any, + getSelect as any + ); } diff --git a/packages/odata-v4/package.json b/packages/odata-v4/package.json index 449fcaf23d..ce567ef28b 100644 --- a/packages/odata-v4/package.json +++ b/packages/odata-v4/package.json @@ -52,6 +52,6 @@ "@sap-cloud-sdk/test-util-internal": "workspace:^", "nock": "^14.0.11", "prettier": "^3.8.1", - "typescript": "~5.9.3" + "typescript": "~6.0.3" } } diff --git a/packages/odata-v4/src/de-serializers/payload-value-converter.ts b/packages/odata-v4/src/de-serializers/payload-value-converter.ts index 4f972d274c..98eeefdf2e 100644 --- a/packages/odata-v4/src/de-serializers/payload-value-converter.ts +++ b/packages/odata-v4/src/de-serializers/payload-value-converter.ts @@ -13,7 +13,7 @@ export function edmToTs( edmType: EdmTypeShared<'v4'>, deSerializers: DeSerializers ): any { - return deSerializers[edmType].deserialize(value); + return (deSerializers as Record)[edmType].deserialize(value); } /** @@ -24,5 +24,5 @@ export function tsToEdm( edmType: EdmTypeShared<'v4'>, deSerializers: DeSerializers ): any { - return deSerializers[edmType].serialize(value); + return (deSerializers as Record)[edmType].serialize(value); } diff --git a/packages/odata-v4/src/filter-function.ts b/packages/odata-v4/src/filter-function.ts index 53fbacd047..cc2503abe3 100644 --- a/packages/odata-v4/src/filter-function.ts +++ b/packages/odata-v4/src/filter-function.ts @@ -83,9 +83,15 @@ export function filterFunction( return new DateFilterFunction(functionName, parameters); } if (isCollectionReturnType(returnType)) { - const edmType = returnTypeMapping[returnType.replace('[]', '')]; + const edmType = (returnTypeMapping as Record)[ + returnType.replace('[]', '') + ]; if (edmType) { - return new CollectionFilterFunction(functionName, parameters, edmType); + return new CollectionFilterFunction( + functionName, + parameters, + edmType as any + ); } throw new Error( `Cannot create filter function for unknown return type ${returnType}.` diff --git a/packages/odata-v4/src/request-builder/response-data-accessor.ts b/packages/odata-v4/src/request-builder/response-data-accessor.ts index 51779d64aa..898d81c6f2 100644 --- a/packages/odata-v4/src/request-builder/response-data-accessor.ts +++ b/packages/odata-v4/src/request-builder/response-data-accessor.ts @@ -32,7 +32,7 @@ export function isCollectionResult(data: any): boolean { return Array.isArray(data.value); } -function validateCollectionResult(data): void { +function validateCollectionResult(data: any): void { if (!isCollectionResult(data)) { logger.warn( 'The given response data does not have the standard OData v4 format for collections.' @@ -63,11 +63,11 @@ export function getSingleResult(data: any): Record { return isSingleResult(data) ? data : {}; } -function isSingleResult(data): boolean { +function isSingleResult(data: any): boolean { return typeof data === 'object' && !Array.isArray(data); } -function validateSingleResult(data): void { +function validateSingleResult(data: any): void { if (!isSingleResult(data)) { logger.warn( 'The given response data does not have the standard OData v4 format for single results.' diff --git a/packages/odata-v4/src/request/odata-action-request-config.ts b/packages/odata-v4/src/request/odata-action-request-config.ts index ebb5671f4c..4d44e7dc26 100644 --- a/packages/odata-v4/src/request/odata-action-request-config.ts +++ b/packages/odata-v4/src/request/odata-action-request-config.ts @@ -43,13 +43,19 @@ export class ODataActionRequestConfig< private buildHttpPayload( parameters: OperationParameters ): Record { - const payload = Object.keys(parameters).reduce((all, key) => { - const payloadElement: OperationParameter = parameters[key]; - if (typeof payloadElement.value !== 'undefined') { - all[payloadElement.originalName] = payloadElement.value; - } - return all; - }, {}); + const payload = Object.keys(parameters).reduce( + (all, key) => { + const payloadElement: OperationParameter = ( + parameters as Record + )[key]; + if (typeof payloadElement.value !== 'undefined') { + (all as Record)[payloadElement.originalName] = + payloadElement.value; + } + return all; + }, + {} as Record + ); return payload; } diff --git a/packages/odata-v4/src/request/odata-bound-action-request-config.ts b/packages/odata-v4/src/request/odata-bound-action-request-config.ts index be8e09f8ab..f4e02e3ae4 100644 --- a/packages/odata-v4/src/request/odata-bound-action-request-config.ts +++ b/packages/odata-v4/src/request/odata-bound-action-request-config.ts @@ -21,7 +21,7 @@ export class ODataBoundActionRequestConfig< extends ODataActionRequestConfig implements WithKeys { - keys: Record; + keys!: Record; constructor( readonly entityApi: EntityApi, actionName: string, diff --git a/packages/odata-v4/src/request/odata-bound-function-request-config.ts b/packages/odata-v4/src/request/odata-bound-function-request-config.ts index 6171a03b01..58626ea64b 100644 --- a/packages/odata-v4/src/request/odata-bound-function-request-config.ts +++ b/packages/odata-v4/src/request/odata-bound-function-request-config.ts @@ -22,7 +22,7 @@ export class ODataBoundFunctionRequestConfig< extends ODataFunctionRequestConfig implements WithKeys { - keys: Record; + keys!: Record; constructor( method: RequestMethodType, readonly entityApi: EntityApi, diff --git a/packages/odata-v4/src/request/odata-function-request-config.ts b/packages/odata-v4/src/request/odata-function-request-config.ts index f54fa65396..8f09e7fa79 100644 --- a/packages/odata-v4/src/request/odata-function-request-config.ts +++ b/packages/odata-v4/src/request/odata-function-request-config.ts @@ -35,7 +35,9 @@ export class ODataFunctionRequestConfig< } resourcePath(): string { - return `${this.functionName}(${Object.values(this.parameters) + return `${this.functionName}(${Object.values( + this.parameters as Record> + ) .map( (parameter: OperationParameter) => `${parameter.originalName}=${this.oDataUri.convertToUriFormat( diff --git a/packages/openapi-generator/package.json b/packages/openapi-generator/package.json index afaf966a6c..13f38dee91 100644 --- a/packages/openapi-generator/package.json +++ b/packages/openapi-generator/package.json @@ -55,9 +55,10 @@ "@sap-cloud-sdk/test-util-internal": "workspace:^", "@types/content-type": "^1.1.9", "@types/js-yaml": "^4.0.9", + "@types/swagger2openapi": "^7.0.4", "depcheck": "^1.4.7", "memfs": "^4.57.2", "prettier": "^3.8.1", - "typescript": "~5.9.3" + "typescript": "~6.0.2" } } diff --git a/packages/openapi-generator/src/document-converter.ts b/packages/openapi-generator/src/document-converter.ts index db2ab480c2..e226a04963 100644 --- a/packages/openapi-generator/src/document-converter.ts +++ b/packages/openapi-generator/src/document-converter.ts @@ -3,7 +3,7 @@ import { parse } from 'path'; import { convert } from 'swagger2openapi'; import { load } from 'js-yaml'; import { ErrorWithCause } from '@sap-cloud-sdk/util'; -import type { OpenAPIV3 } from 'openapi-types'; +import type { OpenAPIV2, OpenAPIV3 } from 'openapi-types'; const { readFile } = promises; /** @@ -21,7 +21,7 @@ export async function convertOpenApiSpec( } catch (err) { throw new ErrorWithCause( 'Could not convert document to the format needed for parsing and generation.', - err + err as Error ); } } @@ -61,11 +61,11 @@ export async function convertDocToOpenApiV3( ): Promise { // This is a hidden cast to OpenAPIV3.Document try { - return (await convert(openApiDocument, {})).openapi; + return (await convert(openApiDocument as OpenAPIV2.Document, {})).openapi; } catch (err) { throw new ErrorWithCause( - `Could not convert OpenAPI specification to OpenAPI version 3. ${err.message}`, - err + `Could not convert OpenAPI specification to OpenAPI version 3. ${(err as Error).message}`, + err as Error ); } } diff --git a/packages/openapi-generator/src/file-serializer/api-file.ts b/packages/openapi-generator/src/file-serializer/api-file.ts index 48726734de..b75a921016 100644 --- a/packages/openapi-generator/src/file-serializer/api-file.ts +++ b/packages/openapi-generator/src/file-serializer/api-file.ts @@ -58,7 +58,7 @@ function collectRefsFromOperations( ] ) ], - [] + [] as OpenApiReferenceSchema[] ) ); } diff --git a/packages/openapi-generator/src/generator.ts b/packages/openapi-generator/src/generator.ts index 8dce6f59fa..0c65b71c04 100644 --- a/packages/openapi-generator/src/generator.ts +++ b/packages/openapi-generator/src/generator.ts @@ -108,10 +108,10 @@ export async function generateWithParsedOptions( : 'Could not generate client.'; await finishAll(promises, errorMessage); } catch (err) { - if (err.message?.includes('error TS2307')) { + if ((err as Error).message?.includes('error TS2307')) { throw new ErrorWithCause( 'Did you forget to install "@sap-cloud-sdk/openapi"?', - err + err as Error ); } throw err; diff --git a/packages/openapi-generator/src/parser/api.ts b/packages/openapi-generator/src/parser/api.ts index ed45f39484..a86440ed59 100644 --- a/packages/openapi-generator/src/parser/api.ts +++ b/packages/openapi-generator/src/parser/api.ts @@ -70,9 +70,11 @@ function getApiNameForOperation( document: OpenAPIV3.Document ): string { const originalApiName = - operation[apiNameExtension] || - getPathItem(document, pathPattern)[apiNameExtension] || - document[apiNameExtension] || + (operation as Record)[apiNameExtension] || + (getPathItem(document, pathPattern) as Record)[ + apiNameExtension + ] || + (document as Record)[apiNameExtension] || operation.tags?.[0] || defaultApiName; return `${pascalCase(originalApiName.replace(/api$/i, ''))}Api`; @@ -104,8 +106,11 @@ function getAllOperations( openApiDocument: OpenAPIV3.Document ): OperationInfo[] { return flat( - Object.entries(openApiDocument.paths).map( - ([pathPattern, pathItem]: [string, OpenAPIV3.PathItemObject]) => + Object.entries(openApiDocument.paths) + .filter( + (entry): entry is [string, OpenAPIV3.PathItemObject] => !!entry[1] + ) + .map(([pathPattern, pathItem]) => methods .filter(method => pathItem[method]) .map(method => ({ @@ -115,6 +120,6 @@ function getAllOperations( pathItemParameters: pathItem.parameters || [], method })) - ) + ) ); } diff --git a/packages/openapi-generator/src/parser/document.ts b/packages/openapi-generator/src/parser/document.ts index 3e88d41de4..5a10c71fb0 100644 --- a/packages/openapi-generator/src/parser/document.ts +++ b/packages/openapi-generator/src/parser/document.ts @@ -63,9 +63,12 @@ async function sanitizeDiscriminatedSchemas( options: ParserOptions ) { const discriminatorSchemas = schemas - .filter(({ schema }) => isOneOfSchema(schema) && schema.discriminator) + .filter( + (s): s is OpenApiPersistedSchemaWithDiscriminator => + isOneOfSchema(s.schema) && !!s.schema.discriminator + ) // type is known because of the filter above - .map(({ schema, schemaName }: OpenApiPersistedSchemaWithDiscriminator) => ({ + .map(({ schema, schemaName }) => ({ children: Object.values(schema.discriminator.mapping), schemaName, propertyName: schema.discriminator.propertyName diff --git a/packages/openapi-generator/src/parser/schema.ts b/packages/openapi-generator/src/parser/schema.ts index c79fe09b33..8a2d908f35 100644 --- a/packages/openapi-generator/src/parser/schema.ts +++ b/packages/openapi-generator/src/parser/schema.ts @@ -175,7 +175,7 @@ function parseObjectSchemaProperties( schemaProperties: { ...parseSchemaProperties(propSchema) } } ], - [] + [] as OpenApiObjectSchemaProperty[] ); } @@ -336,8 +336,9 @@ export function parseSchemaProperties( 'pattern' ]; return schemaPropertyNames.reduce((properties, propertyName) => { - if (schema[propertyName]) { - return { ...properties, [propertyName]: schema[propertyName] }; + const schemaAny = schema as Record; + if (schemaAny[propertyName]) { + return { ...properties, [propertyName]: schemaAny[propertyName] }; } return properties; }, {}); diff --git a/packages/openapi-generator/src/parser/type-mapping.ts b/packages/openapi-generator/src/parser/type-mapping.ts index 5e1344b611..66ff9f629a 100644 --- a/packages/openapi-generator/src/parser/type-mapping.ts +++ b/packages/openapi-generator/src/parser/type-mapping.ts @@ -53,7 +53,9 @@ export function getType( if (originalType === 'string' && format === 'binary') { return 'Blob'; } - const type = originalType ? typeMapping[originalType] : 'any'; + const type = originalType + ? (typeMapping as Record)[originalType] + : 'any'; if (!type) { logger.verbose( `Could not map type '${originalType}' to a native type. Using any.` diff --git a/packages/openapi-generator/src/parser/unique-naming.ts b/packages/openapi-generator/src/parser/unique-naming.ts index 03c0252eb5..2fba66a5b7 100644 --- a/packages/openapi-generator/src/parser/unique-naming.ts +++ b/packages/openapi-generator/src/parser/unique-naming.ts @@ -125,7 +125,7 @@ function getNonConflictingNames( !isFormatted(name, format) ? correctNames : [...correctNames, name], - [] + [] as string[] ); } diff --git a/packages/openapi/package.json b/packages/openapi/package.json index 4e22d4ac5a..cec2a7ef62 100644 --- a/packages/openapi/package.json +++ b/packages/openapi/package.json @@ -51,6 +51,6 @@ "depcheck": "^1.4.7", "nock": "^14.0.11", "prettier": "^3.8.1", - "typescript": "~5.9.3" + "typescript": "~6.0.3" } } diff --git a/packages/resilience/package.json b/packages/resilience/package.json index c26bd29e3e..ff2a0d25be 100644 --- a/packages/resilience/package.json +++ b/packages/resilience/package.json @@ -52,6 +52,6 @@ "depcheck": "^1.4.7", "nock": "^14.0.11", "prettier": "^3.8.1", - "typescript": "~5.9.3" + "typescript": "~6.0.3" } } diff --git a/packages/resilience/src/circuit-breaker.ts b/packages/resilience/src/circuit-breaker.ts index 7474cecedc..c4f7c9cbe8 100644 --- a/packages/resilience/src/circuit-breaker.ts +++ b/packages/resilience/src/circuit-breaker.ts @@ -1,5 +1,5 @@ import CircuitBreaker from 'opossum'; -import type { AxiosError } from 'axios'; +import { isAxiosError } from 'axios'; import type { MiddlewareContext, Middleware, @@ -27,14 +27,16 @@ export const circuitBreakerDefaultOptions: CircuitBreakerOptions = { resetTimeout: 30000, cache: false }; -type ErrorFilter = (err) => boolean; +type ErrorFilter = (err: unknown) => boolean; type KeyBuilder> = ( context: ContextT ) => string; -function httpErrorFilter(error: AxiosError): boolean { +function httpErrorFilter(error: unknown): boolean { return ( - !!error.response?.status && error.response.status.toString().startsWith('4') + isAxiosError(error) && + !!error.response?.status && + error.response.status.toString().startsWith('4') ); } diff --git a/packages/resilience/src/retry.ts b/packages/resilience/src/retry.ts index b705d14b34..31350da654 100644 --- a/packages/resilience/src/retry.ts +++ b/packages/resilience/src/retry.ts @@ -1,5 +1,6 @@ import { ErrorWithCause, createLogger } from '@sap-cloud-sdk/util'; import * as asyncRetry from 'async-retry'; +import { isAxiosError } from 'axios'; import type { MiddlewareContext, Middleware, @@ -40,7 +41,9 @@ export function retry< return await options.fn(arg); } catch (error) { // Don't retry on error statuses where a second attempt won't help - const status = error?.response?.status; + const status = isAxiosError(error) + ? error.response?.status + : undefined; if (!status) { logger.debug( 'HTTP request failed but error did not contain a response status field as expected. Rethrowing error.' @@ -49,7 +52,7 @@ export function retry< bail( new ErrorWithCause( `Request failed with status code ${status}`, - error + error as Error ) ); // We need to return something here but the actual value does not matter diff --git a/packages/temporal-de-serializers/package.json b/packages/temporal-de-serializers/package.json index 64080cad62..1c7c65df04 100644 --- a/packages/temporal-de-serializers/package.json +++ b/packages/temporal-de-serializers/package.json @@ -46,6 +46,6 @@ "devDependencies": { "depcheck": "^1.4.7", "prettier": "^3.8.1", - "typescript": "~5.9.3" + "typescript": "~6.0.3" } } diff --git a/packages/test-util/package.json b/packages/test-util/package.json index 7c9f6ab482..d079726854 100644 --- a/packages/test-util/package.json +++ b/packages/test-util/package.json @@ -53,6 +53,6 @@ "depcheck": "^1.4.7", "memfs": "^4.57.2", "prettier": "^3.8.1", - "typescript": "~5.9.3" + "typescript": "~6.0.3" } } diff --git a/packages/test-util/src/test-destination-provider.ts b/packages/test-util/src/test-destination-provider.ts index 331ee65e2b..63df33c91a 100644 --- a/packages/test-util/src/test-destination-provider.ts +++ b/packages/test-util/src/test-destination-provider.ts @@ -164,14 +164,19 @@ function readCredentialsOrFail( return []; } -function mergeSystemsAndCredentials(systems, credentials) { +function mergeSystemsAndCredentials( + systems: Record[], + credentials: Record[] +) { return systems.map(system => ({ ...system, ...credentials.find(({ alias }) => alias === system.alias) })); } -function toDestinations(systemsAndCredentials): Destination[] { +function toDestinations( + systemsAndCredentials: Record[] +): Destination[] { return systemsAndCredentials.map(sysAndCred => ({ name: sysAndCred.alias, url: sysAndCred.uri, diff --git a/packages/util/package.json b/packages/util/package.json index d19259267d..b31bf20fbf 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -51,6 +51,6 @@ "memfs": "^4.57.2", "nock": "^14.0.11", "prettier": "^3.8.1", - "typescript": "~5.9.3" + "typescript": "~6.0.3" } } diff --git a/packages/util/src/array.ts b/packages/util/src/array.ts index 4e0b4c0105..b7ca09870c 100644 --- a/packages/util/src/array.ts +++ b/packages/util/src/array.ts @@ -106,7 +106,7 @@ export const flatten = (input: any[]): any[] => { */ export function zip(left: T[], right: T[]): T[] { const longerArr = left.length > right.length ? left : right; - return longerArr.reduce((zipped, _, i) => { + return longerArr.reduce((zipped, _, i) => { const currentZipped: T[] = []; if (left.length > i) { currentZipped.push(left[i]); diff --git a/packages/util/src/error-with-cause.ts b/packages/util/src/error-with-cause.ts index 3196aa36d2..6f86571c7a 100644 --- a/packages/util/src/error-with-cause.ts +++ b/packages/util/src/error-with-cause.ts @@ -28,7 +28,7 @@ export class ErrorWithCause extends Error { } private isAxiosError(err: Error | AxiosError): err is AxiosError { - return err['isAxiosError'] === true; + return 'isAxiosError' in err && err.isAxiosError === true; } private addStack(cause: Error) { @@ -39,7 +39,9 @@ export class ErrorWithCause extends Error { try { response = `\n${JSON.stringify(cause.response?.data, null, 2)}`; } catch (error) { - logger.warn(`Failed to stringify response data: ${error.message}`); + logger.warn( + `Failed to stringify response data: ${(error as Error).message}` + ); response = `\n${cause.response?.data}`; } } diff --git a/packages/util/src/logger/cloud-sdk-logger.ts b/packages/util/src/logger/cloud-sdk-logger.ts index e733d99b1e..ea8185a649 100644 --- a/packages/util/src/logger/cloud-sdk-logger.ts +++ b/packages/util/src/logger/cloud-sdk-logger.ts @@ -21,8 +21,8 @@ container.options.format = process.env.NODE_ENV === 'production' ? logFormat.kibana : logFormat.local; const exceptionTransport = new transports.Console(); -const customLogLevels = {}; -const customLogFormats = {}; +const customLogLevels: Record = {}; +const customLogFormats: Record = {}; const DEFAULT_LOGGER__MESSAGE_CONTEXT = '__DEFAULT_LOGGER__MESSAGE_CONTEXT'; let silent = false; diff --git a/packages/util/src/object.ts b/packages/util/src/object.ts index 0ee1995032..54316992de 100644 --- a/packages/util/src/object.ts +++ b/packages/util/src/object.ts @@ -50,11 +50,11 @@ export const pick = >( keys: string[], obj: T ): Partial => { - const result = {}; + const result: Partial = {}; keys.forEach(key => { const value = obj[key]; if (Object.keys(obj).includes(key)) { - result[key] = value; + (result as Record)[key] = value; } }); return result; @@ -71,11 +71,11 @@ export const exclude = >( keys: string[], obj: T ): Partial => { - const result = {}; + const result: Partial = {}; Object.keys(obj).forEach(key => { const value = obj[key]; if (!keys.includes(key)) { - result[key] = value; + (result as Record)[key] = value; } }); return result; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 02fb9c5457..f0fd205b97 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,6 +44,12 @@ importers: '@types/node': specifier: ^22.19.15 version: 22.19.17 + '@types/sap__xsenv': + specifier: ^3.3.2 + version: 3.3.2 + '@types/semver': + specifier: ^7.7.1 + version: 7.7.1 '@types/voca': specifier: ^1.4.6 version: 1.4.6 @@ -70,13 +76,13 @@ importers: version: 17.5.0 jest: specifier: ^30.3.0 - version: 30.3.0(@types/node@22.19.17)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3)) + version: 30.3.0(@types/node@22.19.17)(ts-node@10.9.2(@types/node@22.19.17)(typescript@6.0.3)) jest-junit: specifier: ^17.0.0 version: 17.0.0 madge: specifier: ^8.0.0 - version: 8.0.0(typescript@5.9.3) + version: 8.0.0(typescript@6.0.3) memfs: specifier: ^4.57.2 version: 4.57.2(tslib@2.8.1) @@ -85,25 +91,25 @@ importers: version: 3.8.3 puppeteer: specifier: ^24.40.0 - version: 24.42.0(typescript@5.9.3) + version: 24.42.0(typescript@6.0.3) semver: specifier: ^7.7.4 version: 7.7.4 ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(jest-util@30.3.0)(jest@30.3.0(@types/node@22.19.17)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3)))(typescript@5.9.3) + version: 29.4.9(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(jest-util@30.3.0)(jest@30.3.0(@types/node@22.19.17)(ts-node@10.9.2(@types/node@22.19.17)(typescript@6.0.3)))(typescript@6.0.3) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@22.19.17)(typescript@5.9.3) + version: 10.9.2(@types/node@22.19.17)(typescript@6.0.3) turbo: specifier: ^2.9.6 version: 2.9.6 typedoc: specifier: ^0.28.18 - version: 0.28.19(typescript@5.9.3) + version: 0.28.19(typescript@6.0.3) typescript: - specifier: ~5.9.3 - version: 5.9.3 + specifier: ~6.0.3 + version: 6.0.3 unionfs: specifier: ^4.6.0 version: 4.6.0 @@ -142,8 +148,8 @@ importers: specifier: ^3.8.1 version: 3.8.3 typescript: - specifier: ~5.9.3 - version: 5.9.3 + specifier: ~6.0.2 + version: 6.0.3 build-packages/check-license: dependencies: @@ -167,8 +173,8 @@ importers: specifier: ^3.8.1 version: 3.8.3 typescript: - specifier: ~5.9.3 - version: 5.9.3 + specifier: ~6.0.3 + version: 6.0.3 build-packages/check-pr: dependencies: @@ -198,8 +204,8 @@ importers: specifier: ^3.8.1 version: 3.8.3 typescript: - specifier: ~5.9.3 - version: 5.9.3 + specifier: ~6.0.2 + version: 6.0.3 build-packages/check-public-api: dependencies: @@ -238,8 +244,8 @@ importers: specifier: ^3.8.1 version: 3.8.3 typescript: - specifier: ~5.9.3 - version: 5.9.3 + specifier: ~6.0.2 + version: 6.0.3 build-packages/get-changelog: dependencies: @@ -260,8 +266,8 @@ importers: specifier: ^3.8.1 version: 3.8.3 typescript: - specifier: ~5.9.3 - version: 5.9.3 + specifier: ~6.0.2 + version: 6.0.3 build-packages/merge-and-write-changelogs: dependencies: @@ -285,8 +291,8 @@ importers: specifier: ^3.8.1 version: 3.8.3 typescript: - specifier: ~5.9.3 - version: 5.9.3 + specifier: ~6.0.3 + version: 6.0.3 build-packages/test-utils: dependencies: @@ -307,8 +313,8 @@ importers: specifier: ^3.8.1 version: 3.8.3 typescript: - specifier: ~5.9.3 - version: 5.9.3 + specifier: ~6.0.3 + version: 6.0.3 packages/connectivity: dependencies: @@ -346,6 +352,9 @@ importers: '@sap-cloud-sdk/test-util-internal': specifier: workspace:^ version: link:../../test-resources/test/test-util + '@types/async-retry': + specifier: ^1.4.9 + version: 1.4.9 depcheck: specifier: ^1.4.7 version: 1.4.7 @@ -359,8 +368,8 @@ importers: specifier: ^3.8.1 version: 3.8.3 typescript: - specifier: ~5.9.3 - version: 5.9.3 + specifier: ~6.0.3 + version: 6.0.3 packages/eslint-config: dependencies: @@ -369,10 +378,10 @@ importers: version: 10.0.1(eslint@9.39.4) '@stylistic/eslint-plugin': specifier: ^3.1.0 - version: 3.1.0(eslint@9.39.4)(typescript@5.9.3) + version: 3.1.0(eslint@9.39.4)(typescript@6.0.3) '@typescript-eslint/parser': specifier: ^8.58.0 - version: 8.59.0(eslint@9.39.4)(typescript@5.9.3) + version: 8.59.0(eslint@9.39.4)(typescript@6.0.3) eslint: specifier: '>=8.0.0' version: 9.39.4 @@ -384,7 +393,7 @@ importers: version: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.4) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4) + version: 2.32.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@6.0.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4) eslint-plugin-jsdoc: specifier: ^62.9.0 version: 62.9.0(eslint@9.39.4) @@ -396,10 +405,10 @@ importers: version: 1.10.0(eslint@9.39.4) eslint-plugin-unused-imports: specifier: ^4.4.1 - version: 4.4.1(@typescript-eslint/eslint-plugin@8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4) + version: 4.4.1(@typescript-eslint/eslint-plugin@8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4) typescript-eslint: specifier: ^8.58.0 - version: 8.59.0(eslint@9.39.4)(typescript@5.9.3) + version: 8.59.0(eslint@9.39.4)(typescript@6.0.3) packages/generator: dependencies: @@ -431,8 +440,8 @@ importers: specifier: ^28.0.0 version: 28.0.0 typescript: - specifier: ~5.9.3 - version: 5.9.3 + specifier: ~6.0.3 + version: 6.0.3 voca: specifier: ^1.4.1 version: 1.4.1 @@ -489,6 +498,12 @@ importers: '@sap-cloud-sdk/test-util-internal': specifier: workspace:^ version: link:../../test-resources/test/test-util + '@types/fast-levenshtein': + specifier: ^0.0.4 + version: 0.0.4 + '@types/fs-extra': + specifier: ^11.0.4 + version: 11.0.4 '@types/yargs': specifier: ^17.0.33 version: 17.0.35 @@ -499,8 +514,8 @@ importers: specifier: ^4.57.2 version: 4.57.2(tslib@2.8.1) typescript: - specifier: ~5.9.3 - version: 5.9.3 + specifier: ~6.0.3 + version: 6.0.3 packages/http-client: dependencies: @@ -536,8 +551,8 @@ importers: specifier: ^3.8.1 version: 3.8.3 typescript: - specifier: ~5.9.3 - version: 5.9.3 + specifier: ~6.0.3 + version: 6.0.3 packages/odata-common: dependencies: @@ -573,8 +588,8 @@ importers: specifier: ^3.8.1 version: 3.8.3 typescript: - specifier: ~5.9.3 - version: 5.9.3 + specifier: ~6.0.3 + version: 6.0.3 packages/odata-v2: dependencies: @@ -613,8 +628,8 @@ importers: specifier: ^3.8.1 version: 3.8.3 typescript: - specifier: ~5.9.3 - version: 5.9.3 + specifier: ~6.0.3 + version: 6.0.3 packages/odata-v4: dependencies: @@ -650,8 +665,8 @@ importers: specifier: ^3.8.1 version: 3.8.3 typescript: - specifier: ~5.9.3 - version: 5.9.3 + specifier: ~6.0.3 + version: 6.0.3 packages/openapi: dependencies: @@ -684,8 +699,8 @@ importers: specifier: ^3.8.1 version: 3.8.3 typescript: - specifier: ~5.9.3 - version: 5.9.3 + specifier: ~6.0.3 + version: 6.0.3 packages/openapi-generator: dependencies: @@ -729,6 +744,9 @@ importers: '@types/js-yaml': specifier: ^4.0.9 version: 4.0.9 + '@types/swagger2openapi': + specifier: ^7.0.4 + version: 7.0.4 depcheck: specifier: ^1.4.7 version: 1.4.7 @@ -739,8 +757,8 @@ importers: specifier: ^3.8.1 version: 3.8.3 typescript: - specifier: ~5.9.3 - version: 5.9.3 + specifier: ~6.0.2 + version: 6.0.3 packages/resilience: dependencies: @@ -773,8 +791,8 @@ importers: specifier: ^3.8.1 version: 3.8.3 typescript: - specifier: ~5.9.3 - version: 5.9.3 + specifier: ~6.0.3 + version: 6.0.3 packages/temporal-de-serializers: dependencies: @@ -792,8 +810,8 @@ importers: specifier: ^3.8.1 version: 3.8.3 typescript: - specifier: ~5.9.3 - version: 5.9.3 + specifier: ~6.0.3 + version: 6.0.3 packages/test-util: dependencies: @@ -820,8 +838,8 @@ importers: specifier: ^3.8.1 version: 3.8.3 typescript: - specifier: ~5.9.3 - version: 5.9.3 + specifier: ~6.0.3 + version: 6.0.3 packages/util: dependencies: @@ -860,8 +878,8 @@ importers: specifier: ^3.8.1 version: 3.8.3 typescript: - specifier: ~5.9.3 - version: 5.9.3 + specifier: ~6.0.3 + version: 6.0.3 test-packages/e2e-tests: devDependencies: @@ -1211,8 +1229,8 @@ importers: specifier: ^4.57.2 version: 4.57.2(tslib@2.8.1) typescript: - specifier: ~5.9.3 - version: 5.9.3 + specifier: ~6.0.3 + version: 6.0.3 unionfs: specifier: ^4.6.0 version: 4.6.0 @@ -2199,6 +2217,9 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/fast-levenshtein@0.0.4': + resolution: {integrity: sha512-tkDveuitddQCxut1Db8eEFfMahTjOumTJGPHmT9E7KUH+DkVq9WTpVvlfenf3S+uCBeu8j5FP2xik/KfxOEjeA==} + '@types/fs-extra@11.0.4': resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} @@ -2268,9 +2289,18 @@ packages: '@types/retry@0.12.5': resolution: {integrity: sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==} + '@types/sap__xsenv@3.3.2': + resolution: {integrity: sha512-yK6uL5yvXcMFkGjg+lWA3etJM6rQUFV3rstd118V3q0udMe5wcg+qB0poVTjKLZs4aX+n1DVrqukdRgVdwiK7g==} + + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + '@types/swagger2openapi@7.0.4': + resolution: {integrity: sha512-ffMqzciTDihOKH4Q//9Ond1yb5JP1P5FC/aFPsLK4blea1Fwk2aYctiNCkAh5etDYFswFXS+5LV/vuGkf+PU6A==} + '@types/triple-beam@1.3.5': resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} @@ -6010,6 +6040,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true + uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} @@ -6831,7 +6866,7 @@ snapshots: jest-util: 30.3.0 slash: 3.0.0 - '@jest/core@30.3.0(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3))': + '@jest/core@30.3.0(ts-node@10.9.2(@types/node@22.19.17)(typescript@6.0.3))': dependencies: '@jest/console': 30.3.0 '@jest/pattern': 30.0.1 @@ -6846,7 +6881,7 @@ snapshots: exit-x: 0.2.2 graceful-fs: 4.2.11 jest-changed-files: 30.3.0 - jest-config: 30.3.0(@types/node@22.19.17)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3)) + jest-config: 30.3.0(@types/node@22.19.17)(ts-node@10.9.2(@types/node@22.19.17)(typescript@6.0.3)) jest-haste-map: 30.3.0 jest-message-util: 30.3.0 jest-regex-util: 30.0.1 @@ -6890,7 +6925,7 @@ snapshots: dependencies: '@jest/types': 30.3.0 '@sinonjs/fake-timers': 15.1.1 - '@types/node': 25.6.0 + '@types/node': 22.19.17 jest-message-util: 30.3.0 jest-mock: 30.3.0 jest-util: 30.3.0 @@ -6908,7 +6943,7 @@ snapshots: '@jest/pattern@30.0.1': dependencies: - '@types/node': 25.6.0 + '@types/node': 22.19.17 jest-regex-util: 30.0.1 '@jest/reporters@30.3.0': @@ -7481,9 +7516,9 @@ snapshots: color: 5.0.3 text-hex: 1.0.0 - '@stylistic/eslint-plugin@3.1.0(eslint@9.39.4)(typescript@5.9.3)': + '@stylistic/eslint-plugin@3.1.0(eslint@9.39.4)(typescript@6.0.3)': dependencies: - '@typescript-eslint/utils': 8.57.2(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.2(eslint@9.39.4)(typescript@6.0.3) eslint: 9.39.4 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -7583,6 +7618,8 @@ snapshots: '@types/estree@1.0.8': {} + '@types/fast-levenshtein@0.0.4': {} + '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 @@ -7594,7 +7631,7 @@ snapshots: '@types/http-proxy@1.17.17': dependencies: - '@types/node': 25.6.0 + '@types/node': 22.19.17 '@types/istanbul-lib-coverage@2.0.6': {} @@ -7619,7 +7656,7 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 22.19.15 + '@types/node': 22.19.17 '@types/jsonwebtoken@9.0.10': dependencies: @@ -7656,8 +7693,17 @@ snapshots: '@types/retry@0.12.5': {} + '@types/sap__xsenv@3.3.2': {} + + '@types/semver@7.7.1': {} + '@types/stack-utils@2.0.3': {} + '@types/swagger2openapi@7.0.4': + dependencies: + '@types/node': 22.19.17 + openapi-types: 12.1.3 + '@types/triple-beam@1.3.5': {} '@types/unist@3.0.3': {} @@ -7675,40 +7721,40 @@ snapshots: '@types/node': 22.19.17 optional: true - '@typescript-eslint/eslint-plugin@8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.0(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/parser': 8.59.0(eslint@9.39.4)(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.59.0 - '@typescript-eslint/type-utils': 8.59.0(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.0(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.59.0(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.0(eslint@9.39.4)(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.59.0 eslint: 9.39.4 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@6.0.3)': dependencies: '@typescript-eslint/scope-manager': 8.59.0 '@typescript-eslint/types': 8.59.0 - '@typescript-eslint/typescript-estree': 8.59.0(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.59.0 debug: 4.4.3 eslint: 9.39.4 - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.57.2(typescript@5.9.3)': + '@typescript-eslint/project-service@8.57.2(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.57.2(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.57.2(typescript@6.0.3) '@typescript-eslint/types': 8.57.2 debug: 4.4.3 - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -7721,6 +7767,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/project-service@8.59.0(typescript@6.0.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.59.0(typescript@6.0.3) + '@typescript-eslint/types': 8.59.0 + debug: 4.4.3 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@8.57.2': dependencies: '@typescript-eslint/types': 8.57.2 @@ -7731,23 +7786,27 @@ snapshots: '@typescript-eslint/types': 8.59.0 '@typescript-eslint/visitor-keys': 8.59.0 - '@typescript-eslint/tsconfig-utils@8.57.2(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.57.2(typescript@6.0.3)': dependencies: - typescript: 5.9.3 + typescript: 6.0.3 '@typescript-eslint/tsconfig-utils@8.59.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.59.0(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.59.0(typescript@6.0.3)': + dependencies: + typescript: 6.0.3 + + '@typescript-eslint/type-utils@8.59.0(eslint@9.39.4)(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 8.59.0 - '@typescript-eslint/typescript-estree': 8.59.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.0(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.0(eslint@9.39.4)(typescript@6.0.3) debug: 4.4.3 eslint: 9.39.4 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -7757,18 +7816,18 @@ snapshots: '@typescript-eslint/types@8.59.0': {} - '@typescript-eslint/typescript-estree@8.57.2(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.57.2(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.57.2(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.57.2(typescript@5.9.3) + '@typescript-eslint/project-service': 8.57.2(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.57.2(typescript@6.0.3) '@typescript-eslint/types': 8.57.2 '@typescript-eslint/visitor-keys': 8.57.2 debug: 4.4.3 minimatch: 10.2.5 semver: 7.7.4 tinyglobby: 0.2.16 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -7787,25 +7846,40 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.57.2(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.59.0(typescript@6.0.3)': + dependencies: + '@typescript-eslint/project-service': 8.59.0(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.59.0(typescript@6.0.3) + '@typescript-eslint/types': 8.59.0 + '@typescript-eslint/visitor-keys': 8.59.0 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.7.4 + tinyglobby: 0.2.16 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.57.2(eslint@9.39.4)(typescript@6.0.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) '@typescript-eslint/scope-manager': 8.57.2 '@typescript-eslint/types': 8.57.2 - '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.57.2(typescript@6.0.3) eslint: 9.39.4 - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.59.0(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/utils@8.59.0(eslint@9.39.4)(typescript@6.0.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) '@typescript-eslint/scope-manager': 8.59.0 '@typescript-eslint/types': 8.59.0 - '@typescript-eslint/typescript-estree': 8.59.0(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3) eslint: 9.39.4 - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -8472,14 +8546,14 @@ snapshots: path-type: 4.0.0 yaml: 1.10.3 - cosmiconfig@9.0.1(typescript@5.9.3): + cosmiconfig@9.0.1(typescript@6.0.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.1 parse-json: 5.2.0 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 create-require@1.1.1: {} @@ -8901,22 +8975,22 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@6.0.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@6.0.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.59.0(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/parser': 8.59.0(eslint@9.39.4)(typescript@6.0.3) eslint: 9.39.4 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.4) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@6.0.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -8927,7 +9001,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.4 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@6.0.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -8939,7 +9013,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.59.0(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/parser': 8.59.0(eslint@9.39.4)(typescript@6.0.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -8978,11 +9052,11 @@ snapshots: dependencies: eslint: 9.39.4 - eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4): + eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4): dependencies: eslint: 9.39.4 optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3) eslint-rule-docs@1.1.235: {} @@ -9882,15 +9956,15 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.3.0(@types/node@22.19.17)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3)): + jest-cli@30.3.0(@types/node@22.19.17)(ts-node@10.9.2(@types/node@22.19.17)(typescript@6.0.3)): dependencies: - '@jest/core': 30.3.0(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3)) + '@jest/core': 30.3.0(ts-node@10.9.2(@types/node@22.19.17)(typescript@6.0.3)) '@jest/test-result': 30.3.0 '@jest/types': 30.3.0 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.3.0(@types/node@22.19.17)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3)) + jest-config: 30.3.0(@types/node@22.19.17)(ts-node@10.9.2(@types/node@22.19.17)(typescript@6.0.3)) jest-util: 30.3.0 jest-validate: 30.3.0 yargs: 17.7.2 @@ -9901,7 +9975,7 @@ snapshots: - supports-color - ts-node - jest-config@30.3.0(@types/node@22.19.17)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3)): + jest-config@30.3.0(@types/node@22.19.17)(ts-node@10.9.2(@types/node@22.19.17)(typescript@6.0.3)): dependencies: '@babel/core': 7.29.0 '@jest/get-type': 30.1.0 @@ -9928,7 +10002,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 22.19.17 - ts-node: 10.9.2(@types/node@22.19.17)(typescript@5.9.3) + ts-node: 10.9.2(@types/node@22.19.17)(typescript@6.0.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -10130,7 +10204,7 @@ snapshots: jest-util@30.3.0: dependencies: '@jest/types': 30.3.0 - '@types/node': 25.6.0 + '@types/node': 22.19.17 chalk: 4.1.2 ci-info: 4.4.0 graceful-fs: 4.2.11 @@ -10164,12 +10238,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.3.0(@types/node@22.19.17)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3)): + jest@30.3.0(@types/node@22.19.17)(ts-node@10.9.2(@types/node@22.19.17)(typescript@6.0.3)): dependencies: - '@jest/core': 30.3.0(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3)) + '@jest/core': 30.3.0(ts-node@10.9.2(@types/node@22.19.17)(typescript@6.0.3)) '@jest/types': 30.3.0 import-local: 3.2.0 - jest-cli: 30.3.0(@types/node@22.19.17)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3)) + jest-cli: 30.3.0(@types/node@22.19.17)(ts-node@10.9.2(@types/node@22.19.17)(typescript@6.0.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -10372,6 +10446,25 @@ snapshots: transitivePeerDependencies: - supports-color + madge@8.0.0(typescript@6.0.3): + dependencies: + chalk: 4.1.2 + commander: 7.2.0 + commondir: 1.0.1 + debug: 4.4.3 + dependency-tree: 11.4.0 + ora: 5.4.1 + pluralize: 8.0.0 + pretty-ms: 7.0.1 + rc: 1.2.8 + stream-to-array: 2.3.0 + ts-graphviz: 2.1.6 + walkdir: 0.4.1 + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -11120,11 +11213,11 @@ snapshots: - supports-color - utf-8-validate - puppeteer@24.42.0(typescript@5.9.3): + puppeteer@24.42.0(typescript@6.0.3): dependencies: '@puppeteer/browsers': 2.13.0 chromium-bidi: 14.0.0(devtools-protocol@0.0.1595872) - cosmiconfig: 9.0.1(typescript@5.9.3) + cosmiconfig: 9.0.1(typescript@6.0.3) devtools-protocol: 0.0.1595872 puppeteer-core: 24.42.0 typed-query-selector: 2.12.1 @@ -11788,6 +11881,10 @@ snapshots: dependencies: typescript: 5.9.3 + ts-api-utils@2.5.0(typescript@6.0.3): + dependencies: + typescript: 6.0.3 + ts-graphviz@2.1.6: dependencies: '@ts-graphviz/adapter': 2.0.6 @@ -11795,18 +11892,18 @@ snapshots: '@ts-graphviz/common': 2.1.5 '@ts-graphviz/core': 2.0.7 - ts-jest@29.4.9(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(jest-util@30.3.0)(jest@30.3.0(@types/node@22.19.17)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3)))(typescript@5.9.3): + ts-jest@29.4.9(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(jest-util@30.3.0)(jest@30.3.0(@types/node@22.19.17)(ts-node@10.9.2(@types/node@22.19.17)(typescript@6.0.3)))(typescript@6.0.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 handlebars: 4.7.9 - jest: 30.3.0(@types/node@22.19.17)(ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3)) + jest: 30.3.0(@types/node@22.19.17)(ts-node@10.9.2(@types/node@22.19.17)(typescript@6.0.3)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.7.4 type-fest: 4.41.0 - typescript: 5.9.3 + typescript: 6.0.3 yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.29.0 @@ -11820,7 +11917,7 @@ snapshots: '@ts-morph/common': 0.29.0 code-block-writer: 13.0.3 - ts-node@10.9.2(@types/node@22.19.17)(typescript@5.9.3): + ts-node@10.9.2(@types/node@22.19.17)(typescript@6.0.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 @@ -11834,7 +11931,7 @@ snapshots: create-require: 1.1.1 diff: 4.0.4 make-error: 1.3.6 - typescript: 5.9.3 + typescript: 6.0.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -11945,28 +12042,30 @@ snapshots: typedarray@0.0.6: {} - typedoc@0.28.19(typescript@5.9.3): + typedoc@0.28.19(typescript@6.0.3): dependencies: '@gerrit0/mini-shiki': 3.23.0 lunr: 2.3.9 markdown-it: 14.1.1 minimatch: 10.2.5 - typescript: 5.9.3 + typescript: 6.0.3 yaml: 2.8.3 - typescript-eslint@8.59.0(eslint@9.39.4)(typescript@5.9.3): + typescript-eslint@8.59.0(eslint@9.39.4)(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/parser': 8.59.0(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.59.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.0(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4)(typescript@6.0.3))(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.0(eslint@9.39.4)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.0(eslint@9.39.4)(typescript@6.0.3) eslint: 9.39.4 - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - supports-color typescript@5.9.3: {} + typescript@6.0.3: {} + uc.micro@2.1.0: {} uglify-js@3.19.3: diff --git a/scripts/generate-docs.ts b/scripts/generate-docs.ts index 5668fb5f83..dc34a4a4c9 100644 --- a/scripts/generate-docs.ts +++ b/scripts/generate-docs.ts @@ -12,30 +12,28 @@ const docPath = resolve( JSON.parse(readFileSync('tsconfig.typedoc.json', 'utf8')).typedocOptions.out ); -const isDirectory = entryPath => lstatSync(entryPath).isDirectory(); -const flatten = arr => - arr.reduce( +const isDirectory = (entryPath: string) => lstatSync(entryPath).isDirectory(); +type NestedArray = (T | NestedArray)[]; + +const flatten = (arr: NestedArray): T[] => + arr.reduce( (prev, curr) => - curr instanceof Array ? [...prev, ...flatten(curr)] : [...prev, curr], + Array.isArray(curr) ? [...prev, ...flatten(curr)] : [...prev, curr], [] ); -const inputDirAbsPath = input => resolve(__dirname, input); - -const readDir = input => - pipe(inputDirAbsPath, absPath => - readdirSync(absPath) - .map(file => resolve(absPath, file)) - .map(file => (isDirectory(file) ? readDir(file) : file)) - )(input); +const inputDirAbsPath = (input: string) => resolve(__dirname, input); -const isHtmlFile = fileName => extname(fileName) === '.html'; -const isSearchJs = fileName => basename(fileName) === 'search.js'; -const isNavigationJs = fileName => basename(fileName) === 'navigation.js'; +const readDir = (input: string): NestedArray => { + const absPath = inputDirAbsPath(input); + return readdirSync(absPath) + .map(file => resolve(absPath, file)) + .map(file => (isDirectory(file) ? readDir(file) : file)); +}; -const pipe = - (...fns) => - start => - fns.reduce((state, fn) => fn(state), start); +const isHtmlFile = (fileName: string) => extname(fileName) === '.html'; +const isSearchJs = (fileName: string) => basename(fileName) === 'search.js'; +const isNavigationJs = (fileName: string) => + basename(fileName) === 'navigation.js'; async function adjustForGitHubPages() { const documentationFilePaths = flatten(readDir(resolve(docPath))); @@ -83,13 +81,13 @@ export async function compressJson(data: any) { return gz.toString('base64'); } -async function adjustSearchJs(paths) { +async function adjustSearchJs(paths: string[]) { const filtered = paths.filter(isSearchJs); if (filtered.length !== 1) { throw Error(`Expected one 'search.js', but found: ${filtered.length}.`); } - await transformFile(filtered[0], async file => { + await transformFile(filtered[0], async (file: string) => { const dataRegexResult = /window.searchData = "(.*)";/.exec(file); if (!dataRegexResult) { throw Error( @@ -98,7 +96,7 @@ async function adjustSearchJs(paths) { } const searchItems = await decompressJson(dataRegexResult[1]); - searchItems.rows.forEach(s => { + searchItems.rows.forEach((s: { url: string }) => { s.url = removeUnderlinePrefix(s.url); }); @@ -107,13 +105,13 @@ async function adjustSearchJs(paths) { }); } -async function adjustNavigationJs(paths) { +async function adjustNavigationJs(paths: string[]) { const filtered = paths.filter(isNavigationJs); if (filtered.length !== 1) { throw Error(`Expected one 'navigation.js', but found: ${filtered.length}.`); } - await transformFile(filtered[0], async file => { + await transformFile(filtered[0], async (file: string) => { const dataRegexResult = /window.navigationData = "(.*)"/.exec(file); if (!dataRegexResult) { throw Error( @@ -123,10 +121,10 @@ async function adjustNavigationJs(paths) { const navigationItems = await decompressJson(dataRegexResult[1]); navigationItems - .filter(n => n.path) - .forEach(n => { + .filter((n: { path: string; children: { path: string }[] }) => n.path) + .forEach((n: { path: string; children: { path: string }[] }) => { n.path = removeUnderlinePrefix(n.path); - n.children.forEach(c => { + n.children.forEach((c: { path: string }) => { c.path = removeUnderlinePrefix(c.path); }); }); @@ -136,14 +134,14 @@ async function adjustNavigationJs(paths) { }); } -function removeUnderlinePrefix(str) { +function removeUnderlinePrefix(str: string) { const i = str.indexOf('_'); // Remove the first `_` return str.substring(0, i) + str.substring(i + 1); } -function removeUnderlinePrefixFromFileName(filePath) { - const newPath = filePath.replace(/_.*.html/gi, function (x) { +function removeUnderlinePrefixFromFileName(filePath: string) { + const newPath = filePath.replace(/_.*.html/gi, function (x: string) { return x.substring(1); }); renameSync(filePath, newPath); diff --git a/scripts/util.ts b/scripts/util.ts index f5563517c1..253f996245 100644 --- a/scripts/util.ts +++ b/scripts/util.ts @@ -7,7 +7,7 @@ export const apiDocsDir = resolve('knowledge-base', 'api-reference'); export async function transformFile( filePath: string, - transformFn: CallableFunction + transformFn: (content: string) => string | Promise ): Promise { const file = await readFile(filePath, { encoding: 'utf8' }); const transformedFile = await transformFn(file); diff --git a/test-resources/test/test-util/custom-de-serializers.ts b/test-resources/test/test-util/custom-de-serializers.ts index ac949cdddc..6713be891b 100644 --- a/test-resources/test/test-util/custom-de-serializers.ts +++ b/test-resources/test/test-util/custom-de-serializers.ts @@ -4,6 +4,6 @@ export const customTestDeSerializers = { 'Edm.String': { deserialize: () => customStringPropertyValue, serialize: (value: number) => value.toString(), - serializeToUri: (value: number, serialize) => `'URI(${serialize(value)})'` + serializeToUri: (value: number, serialize: (value: number) => string) => `'URI(${serialize(value)})'` } }; diff --git a/test-resources/test/test-util/keys.ts b/test-resources/test/test-util/keys.ts index 6c892da45a..633e450808 100644 --- a/test-resources/test/test-util/keys.ts +++ b/test-resources/test/test-util/keys.ts @@ -16,13 +16,13 @@ export const { publicKey, privateKey } = generateKeyPairSync('rsa', { const defaultJku = 'https://authentication.sap.hana.ondemand.com/token_keys'; export { defaultJku as jku }; -export function signedJwt(payload, algorithm: Algorithm = 'RS512') { +export function signedJwt(payload: any, algorithm: Algorithm = 'RS512') { return sign(payload, privateKey, { algorithm }); } -export function signedXsuaaJwt(payload, algorithm: Algorithm = 'RS512') { +export function signedXsuaaJwt(payload: any, algorithm: Algorithm = 'RS512') { return sign( { ...payload, ext_attr: { ...payload.ext_attr, enhancer: 'XSUAA' } }, privateKey, diff --git a/test-resources/test/test-util/package.json b/test-resources/test/test-util/package.json index de35435ae8..00507e63a1 100644 --- a/test-resources/test/test-util/package.json +++ b/test-resources/test/test-util/package.json @@ -36,7 +36,7 @@ "devDependencies": { "@jest/globals": "^30.3.0", "memfs": "^4.57.2", - "typescript": "~5.9.3", + "typescript": "~6.0.3", "unionfs": "^4.6.0" } } diff --git a/test-resources/test/test-util/request-mocker.ts b/test-resources/test/test-util/request-mocker.ts index 92159bcf5d..9c8495965c 100644 --- a/test-resources/test/test-util/request-mocker.ts +++ b/test-resources/test/test-util/request-mocker.ts @@ -50,7 +50,7 @@ export const defaultDestination: HttpDestination = { export const defaultHost = defaultDestination.url; -export function mockDestinationsEnv(...destinations) { +export function mockDestinationsEnv(...destinations: any[]) { process.env.destinations = JSON.stringify([...destinations]); } @@ -173,7 +173,7 @@ export function mockGetRequest>( } interface MockHeaderRequestParams { - request; + request: any; host?: string; responseHeaders?: Record; path?: string; @@ -210,7 +210,7 @@ export function mockHeaderRequest({ } export function mockRequest( - requestConfig, + requestConfig: any, { host = defaultHost, destination = defaultDestination, diff --git a/test-resources/test/test-util/testPostRequestOutcome.ts b/test-resources/test/test-util/testPostRequestOutcome.ts index dfb1ab2c6a..5294b6a093 100644 --- a/test-resources/test/test-util/testPostRequestOutcome.ts +++ b/test-resources/test/test-util/testPostRequestOutcome.ts @@ -1,4 +1,4 @@ -export function testPostRequestOutcome(actual, expected) { +export function testPostRequestOutcome(actual: any, expected: any) { expect(actual).toEqual(expected); // Due to non-enumerable property, mocha can not iterate detect "_customFields", we force here matching between both expect(actual['remoteState']).toEqual(expected['remoteState']); diff --git a/test-resources/test/test-util/tsconfig.json b/test-resources/test/test-util/tsconfig.json index cc4642f0cd..ac22540486 100644 --- a/test-resources/test/test-util/tsconfig.json +++ b/test-resources/test/test-util/tsconfig.json @@ -5,7 +5,8 @@ "outDir": "./dist", "tsBuildInfoFile": "./dist/.tsbuildinfo", "composite": true, - "noEmit": true + "noEmit": true, + "types": ["node", "jest"] }, "include": ["./*.ts"], "exclude": ["dist/**/*", "node_modules/**/*"] diff --git a/tsconfig.typedoc.json b/tsconfig.typedoc.json index b39d00b795..d5a2fd8d1c 100644 --- a/tsconfig.typedoc.json +++ b/tsconfig.typedoc.json @@ -15,7 +15,7 @@ "./packages/test-util/**/*", "./packages/temporal-de-serializers/**/*" ], - "exclude": ["**/*.spec.ts"], + "exclude": ["**/*.spec.ts", "**/test/**/*"], "references": [ { "path": "./packages/util"