From 4a27b926e1b7cfbe66fa1b21ceb73b3891bf50b8 Mon Sep 17 00:00:00 2001 From: Roman Date: Fri, 3 Apr 2026 14:07:56 +0100 Subject: [PATCH 1/3] feat: remove `extend` dependency Signed-off-by: Roman --- auth/authenticators/basic-authenticator.ts | 3 +-- .../bearer-token-authenticator.ts | 3 +-- ...n-request-based-authenticator-immutable.ts | 3 +-- auth/token-managers/cp4d-token-manager.ts | 3 +-- .../iam-request-based-token-manager.ts | 3 +-- auth/token-managers/mcsp-token-manager.ts | 3 +-- auth/token-managers/mcspv2-token-manager.ts | 3 +-- lib/base-service.ts | 11 ++++------ lib/cookie-support.ts | 4 +--- lib/request-wrapper.ts | 21 +++++++++---------- package-lock.json | 2 +- package.json | 2 +- 12 files changed, 24 insertions(+), 37 deletions(-) diff --git a/auth/authenticators/basic-authenticator.ts b/auth/authenticators/basic-authenticator.ts index aef1c20ee..357ece785 100644 --- a/auth/authenticators/basic-authenticator.ts +++ b/auth/authenticators/basic-authenticator.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import extend from 'extend'; import { computeBasicAuthHeader, validateInput } from '../utils/helpers'; import { Authenticator } from './authenticator'; import { AuthenticateOptions } from './authenticator-interface'; @@ -72,7 +71,7 @@ export class BasicAuthenticator extends Authenticator { */ public authenticate(requestOptions: AuthenticateOptions): Promise { return new Promise((resolve) => { - requestOptions.headers = extend(true, {}, requestOptions.headers, this.authHeader); + requestOptions.headers = { ...requestOptions.headers, ...this.authHeader }; logger.debug(`Authenticated outbound request (type=${this.authenticationType()})`); resolve(); }); diff --git a/auth/authenticators/bearer-token-authenticator.ts b/auth/authenticators/bearer-token-authenticator.ts index 4fe2faa95..9f4ec6bfa 100644 --- a/auth/authenticators/bearer-token-authenticator.ts +++ b/auth/authenticators/bearer-token-authenticator.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import extend from 'extend'; import { validateInput } from '../utils/helpers'; import { Authenticator } from './authenticator'; import { AuthenticateOptions } from './authenticator-interface'; @@ -76,7 +75,7 @@ export class BearerTokenAuthenticator extends Authenticator { public authenticate(requestOptions: AuthenticateOptions): Promise { return new Promise((resolve) => { const authHeader = { Authorization: `Bearer ${this.bearerToken}` }; - requestOptions.headers = extend(true, {}, requestOptions.headers, authHeader); + requestOptions.headers = { ...requestOptions.headers, ...authHeader }; logger.debug(`Authenticated outbound request (type=${this.authenticationType()})`); resolve(); }); diff --git a/auth/authenticators/token-request-based-authenticator-immutable.ts b/auth/authenticators/token-request-based-authenticator-immutable.ts index 763148f83..7204ad503 100644 --- a/auth/authenticators/token-request-based-authenticator-immutable.ts +++ b/auth/authenticators/token-request-based-authenticator-immutable.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import extend from 'extend'; import { OutgoingHttpHeaders } from 'http'; import { JwtTokenManager } from '../token-managers/jwt-token-manager'; import { Authenticator } from './authenticator'; @@ -89,7 +88,7 @@ export class TokenRequestBasedAuthenticatorImmutable extends Authenticator { public authenticate(requestOptions: AuthenticateOptions): Promise { return this.tokenManager.getToken().then((token) => { const authHeader = { Authorization: `Bearer ${token}` }; - requestOptions.headers = extend(true, {}, requestOptions.headers, authHeader); + requestOptions.headers = { ...requestOptions.headers, ...authHeader }; logger.debug(`Authenticated outbound request (type=${this.authenticationType()})`); }); } diff --git a/auth/token-managers/cp4d-token-manager.ts b/auth/token-managers/cp4d-token-manager.ts index 5f90bdd2c..9d7db0ed6 100644 --- a/auth/token-managers/cp4d-token-manager.ts +++ b/auth/token-managers/cp4d-token-manager.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import extend from 'extend'; import { validateInput } from '../utils/helpers'; import { buildUserAgent } from '../../lib/build-user-agent'; import { JwtTokenManager, JwtTokenManagerOptions } from './jwt-token-manager'; @@ -118,7 +117,7 @@ export class Cp4dTokenManager extends JwtTokenManager { api_key: this.apikey, }, method: 'POST', - headers: extend(true, {}, this.headers, requiredHeaders), + headers: { ...this.headers, ...requiredHeaders }, rejectUnauthorized: !this.disableSslVerification, }, }; diff --git a/auth/token-managers/iam-request-based-token-manager.ts b/auth/token-managers/iam-request-based-token-manager.ts index 8dc4c24bc..588748924 100644 --- a/auth/token-managers/iam-request-based-token-manager.ts +++ b/auth/token-managers/iam-request-based-token-manager.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import extend from 'extend'; import { OutgoingHttpHeaders } from 'http'; import logger from '../../lib/logger'; import { computeBasicAuthHeader, getCurrentTime, onlyOne, removeSuffix } from '../utils/helpers'; @@ -165,7 +164,7 @@ export class IamRequestBasedTokenManager extends JwtTokenManager { options: { url: this.url + OPERATION_PATH, method: 'POST', - headers: extend(true, {}, this.headers, requiredHeaders), + headers: { ...this.headers, ...requiredHeaders }, form: this.formData, rejectUnauthorized: !this.disableSslVerification, }, diff --git a/auth/token-managers/mcsp-token-manager.ts b/auth/token-managers/mcsp-token-manager.ts index 096fe9709..fa7ec3cbb 100644 --- a/auth/token-managers/mcsp-token-manager.ts +++ b/auth/token-managers/mcsp-token-manager.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import extend from 'extend'; import { validateInput } from '../utils/helpers'; import { buildUserAgent } from '../../lib/build-user-agent'; import { JwtTokenManager, JwtTokenManagerOptions } from './jwt-token-manager'; @@ -96,7 +95,7 @@ export class McspTokenManager extends JwtTokenManager { apikey: this.apikey, }, method: 'POST', - headers: extend(true, {}, this.headers, requiredHeaders), + headers: { ...this.headers, ...requiredHeaders }, rejectUnauthorized: !this.disableSslVerification, }, }; diff --git a/auth/token-managers/mcspv2-token-manager.ts b/auth/token-managers/mcspv2-token-manager.ts index 8209e0cbd..421285bb3 100644 --- a/auth/token-managers/mcspv2-token-manager.ts +++ b/auth/token-managers/mcspv2-token-manager.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import extend from 'extend'; import { validateInput } from '../utils/helpers'; import { buildUserAgent } from '../../lib/build-user-agent'; import { JwtTokenManager, JwtTokenManagerOptions } from './jwt-token-manager'; @@ -174,7 +173,7 @@ export class McspV2TokenManager extends JwtTokenManager { 'User-Agent': this.userAgent, }; - const requestHeaders = extend(true, {}, this.headers, requiredHeaders); + const requestHeaders = { ...this.headers, ...requiredHeaders }; // The keys used here must match the path parameter references in PATH_TEMPLATE above. const pathParams = { diff --git a/lib/base-service.ts b/lib/base-service.ts index 515ce2e71..2f0f1883a 100644 --- a/lib/base-service.ts +++ b/lib/base-service.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import extend from 'extend'; import type { CookieJar } from 'tough-cookie'; import { OutgoingHttpHeaders } from 'http'; import { AuthenticatorInterface, checkCredentials, readExternalSources } from '../auth'; @@ -284,12 +283,10 @@ export class BaseService { const userAgent = { 'User-Agent': this.defaultUserAgent, }; - parameters.defaultOptions.headers = extend( - true, - {}, - userAgent, - parameters.defaultOptions.headers - ); + parameters.defaultOptions.headers = { + ...userAgent, + ...parameters.defaultOptions.headers, + }; return this.authenticator.authenticate(parameters.defaultOptions).then(() => // resolve() handles rejection as well, so resolving the result of sendRequest should allow for proper handling later diff --git a/lib/cookie-support.ts b/lib/cookie-support.ts index 4c9343012..5616788d6 100644 --- a/lib/cookie-support.ts +++ b/lib/cookie-support.ts @@ -15,7 +15,6 @@ */ import { Axios, AxiosResponse, InternalAxiosRequestConfig, isAxiosError } from 'axios'; -import extend from 'extend'; import { Cookie, CookieJar } from 'tough-cookie'; import logger from './logger'; @@ -34,8 +33,7 @@ const internalCreateCookieInterceptor = (cookieJar: CookieJar) => { const cookieHeaderValue = await cookieJar.getCookieString(config.url); if (cookieHeaderValue) { logger.debug('CookieInterceptor: setting cookie header'); - const cookieHeader = { cookie: cookieHeaderValue }; - config.headers = extend(true, {}, config.headers, cookieHeader); + config.headers.cookie = cookieHeaderValue; } else { logger.debug(`CookieInterceptor: no cookies for: ${config.url}`); } diff --git a/lib/request-wrapper.ts b/lib/request-wrapper.ts index 7c4682b98..c7d1fc705 100644 --- a/lib/request-wrapper.ts +++ b/lib/request-wrapper.ts @@ -24,7 +24,6 @@ import axios, { InternalAxiosRequestConfig, } from 'axios'; import * as rax from 'retry-axios'; -import extend from 'extend'; import FormData from 'form-data'; import { OutgoingHttpHeaders } from 'http'; import { Agent } from 'https'; @@ -70,18 +69,16 @@ export class RequestWrapper { private raxConfig: rax.RetryConfig; constructor(axiosOptions?) { - axiosOptions = axiosOptions || {}; + axiosOptions ??= {}; this.compressRequestData = Boolean(axiosOptions.enableGzipCompression); - // override a couple axios defaults + // override a couple axios defaults then merge axios config into default const axiosConfig: AxiosRequestConfig = { maxContentLength: -1, maxBodyLength: Infinity, + ...axiosOptions, }; - // merge axios config into default - extend(true, axiosConfig, axiosOptions); - // if the user explicitly sets `disableSslVerification` to true, // `rejectUnauthorized` must be set to false in the https agent if (axiosOptions.disableSslVerification === true) { @@ -248,9 +245,11 @@ export class RequestWrapper { * @throws Error */ public async sendRequest(parameters): Promise { - const options = extend(true, {}, parameters.defaultOptions, parameters.options); - const { path, body, form, formData, qs, method, serviceUrl, axiosOptions } = options; - let { headers, url } = options; + const options = { ...parameters.defaultOptions, ...parameters.options }; + let headers = { ...parameters.defaultOptions?.headers, ...parameters.options?.headers }; + const qs = { ...parameters.defaultOptions?.qs, ...parameters.options?.qs }; + const { path, body, form, formData, method, serviceUrl, axiosOptions } = options; + let { url } = options; const multipartForm = new FormData(); @@ -313,11 +312,11 @@ export class RequestWrapper { if (formData) { data = multipartForm; // form-data generates headers that MUST be included or the request will fail - headers = extend(true, {}, headers, multipartForm.getHeaders()); + headers = { ...headers, ...multipartForm.getHeaders() }; } // accept gzip encoded responses if Accept-Encoding is not already set - headers['Accept-Encoding'] = headers['Accept-Encoding'] || 'gzip'; + headers['Accept-Encoding'] ||= 'gzip'; // compress request body data if enabled if (this.compressRequestData) { diff --git a/package-lock.json b/package-lock.json index 887c9b7fc..edc096abe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,6 @@ "camelcase": "^6.3.0", "debug": "^4.3.4", "dotenv": "^16.4.5", - "extend": "3.0.2", "file-type": "^21.3.2", "form-data": "^4.0.4", "isstream": "0.1.2", @@ -49,6 +48,7 @@ "eslint-plugin-jsdoc": "^34.6.3", "eslint-plugin-node": "^9.0.0", "eslint-plugin-prettier": "^3.0.1", + "extend": "3.0.2", "jest": "^29.7.0", "nock": "^13.5.4", "npm-run-all2": "5.0.0", diff --git a/package.json b/package.json index 241c9bc53..b24eae6d7 100644 --- a/package.json +++ b/package.json @@ -60,6 +60,7 @@ "eslint-plugin-jsdoc": "^34.6.3", "eslint-plugin-node": "^9.0.0", "eslint-plugin-prettier": "^3.0.1", + "extend": "3.0.2", "jest": "^29.7.0", "nock": "^13.5.4", "npm-run-all2": "5.0.0", @@ -76,7 +77,6 @@ "camelcase": "^6.3.0", "debug": "^4.3.4", "dotenv": "^16.4.5", - "extend": "3.0.2", "file-type": "^21.3.2", "form-data": "^4.0.4", "isstream": "0.1.2", From aaa8017599e580fa83620f1a8d326a3b02267197 Mon Sep 17 00:00:00 2001 From: Roman Date: Tue, 28 Apr 2026 10:32:02 +0100 Subject: [PATCH 2/3] fix: use `deepMerge` Signed-off-by: Roman --- lib/helper.ts | 14 ++++++++++++++ lib/request-wrapper.ts | 9 ++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/lib/helper.ts b/lib/helper.ts index 1dc564fa6..286c48af1 100644 --- a/lib/helper.ts +++ b/lib/helper.ts @@ -356,3 +356,17 @@ export function isJsonMimeType(mimeType: string) { logger.debug(`Determining if the mime type '${mimeType}' specifies JSON content.`); return !!mimeType && /^application\/json(\s*;.*)?$/i.test(mimeType); } + +const isObj = (val: unknown) => val && typeof val === 'object' && !Array.isArray(val); + +export function deepMerge(target: any, source: any) { + const result = { ...target }; + Object.keys(source).forEach((key) => { + if (isObj(target[key]) && isObj(source[key])) { + result[key] = deepMerge(target[key], source[key]); + } else { + result[key] = source[key]; + } + }); + return result; +} diff --git a/lib/request-wrapper.ts b/lib/request-wrapper.ts index c7d1fc705..04034c075 100644 --- a/lib/request-wrapper.ts +++ b/lib/request-wrapper.ts @@ -32,6 +32,7 @@ import { stringify } from 'querystring'; import { gzipSync } from 'zlib'; import { buildRequestFileObject, + deepMerge, isEmptyObject, isFileData, isFileWithMetadata, @@ -245,11 +246,9 @@ export class RequestWrapper { * @throws Error */ public async sendRequest(parameters): Promise { - const options = { ...parameters.defaultOptions, ...parameters.options }; - let headers = { ...parameters.defaultOptions?.headers, ...parameters.options?.headers }; - const qs = { ...parameters.defaultOptions?.qs, ...parameters.options?.qs }; - const { path, body, form, formData, method, serviceUrl, axiosOptions } = options; - let { url } = options; + const options = deepMerge(parameters.defaultOptions || {}, parameters.options || {}); + const { path, body, form, formData, qs, method, serviceUrl, axiosOptions } = options; + let { headers, url } = options; const multipartForm = new FormData(); From ed2abd5b68fe489a5409bcbb8403a38859981930 Mon Sep 17 00:00:00 2001 From: Roman Date: Tue, 5 May 2026 18:34:38 +0100 Subject: [PATCH 3/3] chore: fully remove `extend` dependency Signed-off-by: Roman --- package-lock.json | 17 +----- package.json | 2 - test/resources/mockSerDeService.js | 86 ++++++++---------------------- 3 files changed, 23 insertions(+), 82 deletions(-) diff --git a/package-lock.json b/package-lock.json index 22e77c19d..8c484a90d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,11 +29,10 @@ "@commitlint/cli": "12.0.1", "@commitlint/config-conventional": "7.0.1", "@masterodin/publisher": "0.10.0", - "@microsoft/api-documenter": "^7.30.5", + "@microsoft/api-documenter": "7.30.5", "@microsoft/api-extractor": "7.58.7", "@semantic-release/changelog": "6.0.3", "@semantic-release/git": "10.0.1", - "@types/extend": "3.0.4", "@types/file-type": "5.2.1", "@types/isstream": "0.1.0", "@types/mime-types": "2.1.4", @@ -48,7 +47,6 @@ "eslint-plugin-jsdoc": "34.6.3", "eslint-plugin-node": "9.0.0", "eslint-plugin-prettier": "3.0.1", - "extend": "3.0.2", "jest": "29.7.0", "nock": "13.5.4", "npm-run-all2": "5.0.0", @@ -3013,13 +3011,6 @@ "@types/ms": "*" } }, - "node_modules/@types/extend": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/extend/-/extend-3.0.4.tgz", - "integrity": "sha512-ArMouDUTJEz1SQRpFsT2rIw7DeqICFv5aaVzLSIYMYQSLcwcGOfT3VyglQs/p7K3F7fT4zxr0NWxYZIdifD6dA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/file-type": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/@types/file-type/-/file-type-5.2.1.tgz", @@ -6585,12 +6576,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, "node_modules/fast-content-type-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", diff --git a/package.json b/package.json index 79be3cf9f..719fc9400 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,6 @@ "@microsoft/api-extractor": "7.58.7", "@semantic-release/changelog": "6.0.3", "@semantic-release/git": "10.0.1", - "@types/extend": "3.0.4", "@types/file-type": "5.2.1", "@types/isstream": "0.1.0", "@types/mime-types": "2.1.4", @@ -60,7 +59,6 @@ "eslint-plugin-jsdoc": "34.6.3", "eslint-plugin-node": "9.0.0", "eslint-plugin-prettier": "3.0.1", - "extend": "3.0.2", "jest": "29.7.0", "nock": "13.5.4", "npm-run-all2": "5.0.0", diff --git a/test/resources/mockSerDeService.js b/test/resources/mockSerDeService.js index 3864c00ad..5959bf8ac 100644 --- a/test/resources/mockSerDeService.js +++ b/test/resources/mockSerDeService.js @@ -1,7 +1,7 @@ /* eslint-disable no-use-before-define,object-shorthand */ // eslint-disable-next-line max-classes-per-file -const extend = require('extend'); const { BaseService } = require('../../dist/lib/base-service'); +const { deepMerge } = require('../../dist/lib/helper'); // eslint-disable-next-line import/prefer-default-export class MockSerDeService extends BaseService { @@ -16,9 +16,7 @@ class MockSerDeService extends BaseService { url: '/nestedModelSchema', method: 'HEAD', }, - defaultOptions: extend(true, {}, this.baseOptions, { - headers: extend(true, {}, {}, params.headers), - }), + defaultOptions: deepMerge(this.baseOptions, { headers: params.headers }), }; return this.createRequest(parameters); } @@ -31,9 +29,7 @@ class MockSerDeService extends BaseService { method: 'POST', body, }, - defaultOptions: extend(true, {}, this.baseOptions, { - headers: extend(true, {}, params.headers), - }), + defaultOptions: deepMerge(this.baseOptions, { headers: params.headers }), }; return this.createRequest(parameters); } @@ -44,9 +40,7 @@ class MockSerDeService extends BaseService { url: '/anyType', method: 'GET', }, - defaultOptions: extend(true, {}, this.baseOptions, { - headers: extend(true, {}, params.headers), - }), + defaultOptions: deepMerge(this.baseOptions, { headers: params.headers }), }; return this.createRequest(parameters); } @@ -59,9 +53,7 @@ class MockSerDeService extends BaseService { method: 'POST', body, }, - defaultOptions: extend(true, {}, this.baseOptions, { - headers: extend(true, {}, params.headers), - }), + defaultOptions: deepMerge(this.baseOptions, { headers: params.headers }), }; return this.createRequest(parameters); } @@ -72,9 +64,7 @@ class MockSerDeService extends BaseService { url: '/nestedModelSchema', method: 'GET', }, - defaultOptions: extend(true, {}, this.baseOptions, { - headers: extend(true, {}, params.headers), - }), + defaultOptions: deepMerge(this.baseOptions, { headers: params.headers }), }; return this.createRequestAndDeserializeResponse(parameters, NestedModelSchema.deserialize); } @@ -87,9 +77,7 @@ class MockSerDeService extends BaseService { method: 'POST', body, }, - defaultOptions: extend(true, {}, this.baseOptions, { - headers: extend(true, {}, params.headers), - }), + defaultOptions: deepMerge(this.baseOptions, { headers: params.headers }), }; return this.createRequest(parameters); } @@ -100,9 +88,7 @@ class MockSerDeService extends BaseService { url: '/multipartNestedModelSchema', method: 'GET', }, - defaultOptions: extend(true, {}, this.baseOptions, { - headers: extend(true, {}, params.headers), - }), + defaultOptions: deepMerge(this.baseOptions, { headers: params.headers }), }; return this.createRequestAndDeserializeResponse(parameters, NestedModelSchema.deserialize); } @@ -115,9 +101,7 @@ class MockSerDeService extends BaseService { method: 'POST', body, }, - defaultOptions: extend(true, {}, this.baseOptions, { - headers: extend(true, {}, params.headers), - }), + defaultOptions: deepMerge(this.baseOptions, { headers: params.headers }), }; return this.createRequest(parameters); } @@ -128,9 +112,7 @@ class MockSerDeService extends BaseService { url: '/modelSchema', method: 'GET', }, - defaultOptions: extend(true, {}, this.baseOptions, { - headers: extend(true, {}, params.headers), - }), + defaultOptions: deepMerge(this.baseOptions, { headers: params.headers }), }; return this.createRequestAndDeserializeResponse(parameters, ModelSchema.deserialize); } @@ -143,9 +125,7 @@ class MockSerDeService extends BaseService { method: 'POST', body, }, - defaultOptions: extend(true, {}, this.baseOptions, { - headers: extend(true, {}, params.headers), - }), + defaultOptions: deepMerge(this.baseOptions, { headers: params.headers }), }; return this.createRequest(parameters); } @@ -156,9 +136,7 @@ class MockSerDeService extends BaseService { url: '/listOfSchemas', method: 'GET', }, - defaultOptions: extend(true, {}, this.baseOptions, { - headers: extend(true, {}, params.headers), - }), + defaultOptions: deepMerge(this.baseOptions, { headers: params.headers }), }; return this.createRequestAndDeserializeResponse(parameters, ModelSchema.deserialize); } @@ -171,9 +149,7 @@ class MockSerDeService extends BaseService { method: 'POST', body, }, - defaultOptions: extend(true, {}, this.baseOptions, { - headers: extend(true, {}, params.headers), - }), + defaultOptions: deepMerge(this.baseOptions, { headers: params.headers }), }; return this.createRequest(parameters); } @@ -184,9 +160,7 @@ class MockSerDeService extends BaseService { url: '/listOfPrimitives', method: 'GET', }, - defaultOptions: extend(true, {}, this.baseOptions, { - headers: extend(true, {}, params.headers), - }), + defaultOptions: deepMerge(this.baseOptions, { headers: params.headers }), }; return this.createRequest(parameters); } @@ -199,9 +173,7 @@ class MockSerDeService extends BaseService { method: 'POST', body, }, - defaultOptions: extend(true, {}, this.baseOptions, { - headers: extend(true, {}, params.headers), - }), + defaultOptions: deepMerge(this.baseOptions, { headers: params.headers }), }; return this.createRequest(parameters); } @@ -212,9 +184,7 @@ class MockSerDeService extends BaseService { url: '/listOfMapsOfSchemas', method: 'GET', }, - defaultOptions: extend(true, {}, this.baseOptions, { - headers: extend(true, {}, params.headers), - }), + defaultOptions: deepMerge(this.baseOptions, { headers: params.headers }), }; return this.createRequestAndDeserializeResponse(parameters, JsonObject.deserialize); } @@ -227,9 +197,7 @@ class MockSerDeService extends BaseService { method: 'POST', body, }, - defaultOptions: extend(true, {}, this.baseOptions, { - headers: extend(true, {}, params.headers), - }), + defaultOptions: deepMerge(this.baseOptions, { headers: params.headers }), }; return this.createRequest(parameters); } @@ -240,9 +208,7 @@ class MockSerDeService extends BaseService { url: '/mapOfSchemas', method: 'GET', }, - defaultOptions: extend(true, {}, this.baseOptions, { - headers: extend(true, {}, params.headers), - }), + defaultOptions: deepMerge(this.baseOptions, { headers: params.headers }), }; return this.createRequestAndDeserializeResponse(parameters, ModelSchema.deserialize, true); } @@ -255,9 +221,7 @@ class MockSerDeService extends BaseService { method: 'POST', body, }, - defaultOptions: extend(true, {}, this.baseOptions, { - headers: extend(true, {}, params.headers), - }), + defaultOptions: deepMerge(this.baseOptions, { headers: params.headers }), }; return this.createRequest(parameters); } @@ -268,9 +232,7 @@ class MockSerDeService extends BaseService { url: '/mapOfPrimitives', method: 'GET', }, - defaultOptions: extend(true, {}, this.baseOptions, { - headers: extend(true, {}, params.headers), - }), + defaultOptions: deepMerge(this.baseOptions, { headers: params.headers }), }; return this.createRequest(parameters); } @@ -285,9 +247,7 @@ class MockSerDeService extends BaseService { method: 'POST', body, }, - defaultOptions: extend(true, {}, this.baseOptions, { - headers: extend(true, {}, params.headers), - }), + defaultOptions: deepMerge(this.baseOptions, { headers: params.headers }), }; return this.createRequest(parameters); } @@ -298,9 +258,7 @@ class MockSerDeService extends BaseService { url: '/mapOfListOfSchemas', method: 'GET', }, - defaultOptions: extend(true, {}, this.baseOptions, { - headers: extend(true, {}, params.headers), - }), + defaultOptions: deepMerge(this.baseOptions, { headers: params.headers }), }; return this.createRequestAndDeserializeResponse(parameters, MapOfListOfSchemas.deserialize); }