diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index 0c38344..9617cad 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -1,3 +1,12 @@ + +# [v2.1.5](https://github.com/AleksandrRogov/DynamicsWebApi/releases/tag/v2.1.5) - 11 Jul 2024 + +**Fixes** +- Missing authorization token when request with a long URL is converted into a Batch request. [#175](https://github.com/AleksandrRogov/DynamicsWebApi/issues/175) + +[Changes][v2.1.5] + + # [v2.1.4](https://github.com/AleksandrRogov/DynamicsWebApi/releases/tag/v2.1.4) - 11 Apr 2024 @@ -954,6 +963,7 @@ Added: [Changes][v1.2.0] +[v2.1.5]: https://github.com/AleksandrRogov/DynamicsWebApi/compare/v2.1.4...v2.1.5 [v2.1.4]: https://github.com/AleksandrRogov/DynamicsWebApi/compare/v2.1.3...v2.1.4 [v2.1.3]: https://github.com/AleksandrRogov/DynamicsWebApi/compare/v1.7.12...v2.1.3 [v1.7.12]: https://github.com/AleksandrRogov/DynamicsWebApi/compare/v2.1.2...v1.7.12 diff --git a/.github/README.md b/.github/README.md index d819526..6d52b8d 100644 --- a/.github/README.md +++ b/.github/README.md @@ -157,11 +157,16 @@ Once the web file is uploaded, it can be included in a template, a page or a for With CDN, it is a bit easier: no need to create and upload a web file - just include the script in your template, page or a form: ```html - + ``` And you are good to go! DynamicsWebApi will automatically detect if the library is running on Power Pages and will supply an anti-forgery token with each request. +#### Limitations +Currently, there are some ootb limitations in the Power Pages: +1. Batch operations are not supported. Hopefully, Microsoft will add it in the future. +2. Long requests (with URL more than 2000 chars) are not supported. This is because of the 1st limitation. DynamicsWebApi will try to convert it to a Batch operation which will ultimately fail because it's not supported. + ### Node.js To use DynamicsWebApi in Node.js install the `dynamics-web-api` package from NPM: @@ -173,13 +178,13 @@ Then include it in your script: ```ts //CommonJS -const DynamicsWebApi = require("dynamics-web-api"); +const DynamicsWebApi = require("dynamics-web-api").DynamicsWebApi; //ESM import { DynamicsWebApi } from "dynamics-web-api"; ``` -DynamicsWebApi does not fetch authorization tokens, so you will need to acquire them in your code and pass them back to the library. +DynamicsWebApi does not fetch authorization tokens, thus you will need to acquire them in your code and pass them back to the library. Authorization tokens can be acquired using [Microsoft Authentication Library for Node](https://www.npmjs.com/package/@azure/msal-node) or you can write your own logic to retrieve the tokens. Here is an example using `@azure/msal-node`: @@ -288,7 +293,7 @@ timeout | `number` | Sets a number of milliseconds before a request times out. useEntityNames | `boolean` | Indicates whether to use entity logical names instead of collection logical names during requests. **Note!** -`serverUrl` and `onTokenRefresh` are required when DynamicsWebApi used in a Node.js application. +`serverUrl` and `onTokenRefresh` are required when DynamicsWebApi is used in a Node.js application. **Important!** If you are using `DynamicsWebApi` **outside Microsoft Dynamics 365** and set `useEntityNames` to `true` **the first request** to Web Api will fetch `LogicalCollectionName` and `LogicalName` from `EntityMetadata` for all entities. It does not happen when `DynamicsWebApi` is used in Microsoft Dynamics 365 Web Resources (there is no additional request, no impact on perfomance). @@ -319,22 +324,22 @@ Both `dataApi` and `searchApi` can be omitted from a configuration. Their defaul **dataApi** properties: | Property Name | Type | Description | |--------|--------|--------| -| path | `String` | Optional. A path to API, default: "data". | -| version | `String` | Optional. API Version, default: "9.2". | +| path | `string` | Optional. A path to API, default: "data". | +| version | `string` | Optional. API Version, default: "9.2". | **searchApi** properties: | Property Name | Type | Description | |--------|--------|--------| -| path | `String` | Optional. A path to API, default: "search". | -| version | `String` | Optional. API Version, default: "1.0". | +| path | `string` | Optional. A path to API, default: "search". | +| version | `string` | Optional. API Version, default: "1.0". | ## Request Examples Please use [DynamicsWebApi Wiki](../../../wiki/) for an object reference. It is automatically generated and I could not find a better doc generator, pardon me for that. If you know a good ".d.ts -> .md" doc generator - let me know! -The following table describes all __possible__ properties that can be set in `request` object. Some parameters may still be absent in a table, please refer to [DynamicsWebApi Wiki](../../../wiki/). +The following table describes all __possible__ properties that can be set in a `request` object. Some parameters may still be absent in a table, please refer to [DynamicsWebApi Wiki](../../../wiki/). -__Please note!__ Not all operaions accept all properties and if +__Please note!__ Not all operations accept all properties and if by mistake an invalid property has been specified you will receive either an error saying that the request is invalid or the response will not have expected results. Property Name | Type | Operation(s) Supported | Description @@ -351,7 +356,7 @@ continueOnError | `boolean` | `executeBatch` | **BATCH REQUESTS ONLY!** Sets Pre count | `boolean` | `retrieveMultiple`, `retrieveAll` | Boolean that sets the $count system query option with a value of true to include a count of entities that match the filter criteria up to 5000 (per page). Do not use $top with $count! data | `Object` or `ArrayBuffer` / `Buffer` (for node.js) | `create`, `update`, `upsert`, `uploadFile` | A JavaScript object that represents Dynamics 365 entity, action, metadata and etc. duplicateDetection | `boolean` | `create`, `update`, `upsert` | **D365 Web API v9+** Boolean that enables duplicate detection. [More Info](https://docs.microsoft.com/en-us/dynamics365/customer-engagement/developer/webapi/update-delete-entities-using-web-api#check-for-duplicate-records) -expand | `Expand[]` | `retrieve`, `retrieveMultiple`, `create`, `update`, `upsert` | An array of Expand Objects (described below the table) representing the $expand OData System Query Option value to control which related records are also returned. +expand | `Expand[]` | `retrieve`, `retrieveMultiple`, `create`, `update`, `upsert` | An array of `Expand` Objects (described below the table) representing the $expand OData System Query Option value to control which related records are also returned. fetchXml | `string` | `fetch`, `fetchAll` | Property that sets FetchXML - a proprietary query language that provides capabilities to perform aggregation. fieldName | `string` | `uploadFile`, `downloadFile`, `deleteRequest` | **D365 Web API v9.1+** Use this option to specify the name of the file attribute in Dynamics 365. [More Info](https://docs.microsoft.com/en-us/powerapps/developer/common-data-service/file-attributes) fileName | `string` | `uploadFile` | **D365 Web API v9.1+** Specifies the name of the file @@ -388,11 +393,11 @@ top | `number` | `retrieveMultiple`, `retrieveAll` | Limit the number of results trackChanges | `boolean` | `retrieveMultiple`, `retrieveAll` | Sets Prefer header with value 'odata.track-changes' to request that a delta link be returned which can subsequently be used to retrieve entity changes. __Important!__ Change Tracking must be enabled for the entity. [More Info](https://docs.microsoft.com/en-us/powerapps/developer/common-data-service/use-change-tracking-synchronize-data-external-systems#enable-change-tracking-for-an-entity) userQuery | `string` | `retrieve` | A String representing the GUID value of the user query. -The following table describes Expand Object properties: +The following table describes `Expand` Object properties: Property Name | Type | Description ------------ | ------------- | ------------- -expand | `Expand[]` | An array of Expand Objects representing the $expand OData System Query Option value to control which related records are also returned. +expand | `Expand[]` | An array of `Expand` Objects representing the $expand OData System Query Option value to control which related records are also returned. filter | `string` | Use the $filter system query option to set criteria for which related entities will be returned. orderBy | `string[]` | An Array (of strings) representing the order in which related items are returned using the $orderby system query option. Use the asc or desc suffix to specify ascending or descending order respectively. The default is ascending if the suffix isn't applied. property | `string` | A name of a single-valued navigation property which needs to be expanded. @@ -402,6 +407,8 @@ top | `number` | Limit the number of results returned by using the $top system q All requests to Web API that have long URLs (more than 2000 characters) are automatically converted to a Batch Request. This feature is very convenient when you make a call with big Fetch XMLs. No special parameters needed to do a convertation. +**Heads up!** This feature may cause an issue in Microsoft Power Pages because Batch Requests are not supported there out of the box. Please keep your requests short :) + ### Create a table row ```ts @@ -1235,10 +1242,10 @@ The first two requests will be atomic (included in a Change Set) and the last on ```ts dynamicsWebApi.startBatch(); //Change Set A starts -dynamicsWebApi.create({ - data: contact, - collection: "contacts", - contentId: "1", +dynamicsWebApi.create({ + data: contact, + collection: "contacts", + contentId: "1", }); //Change Set A ends dynamicsWebApi.create({ @@ -1247,9 +1254,9 @@ dynamicsWebApi.create({ inChangeSet: false //<--- do not include in a change set }); //Change Set B starts -dynamicsWebApi.create({ - data: order, - collection: "salesorders", +dynamicsWebApi.create({ + data: order, + collection: "salesorders", //"$1" parameter cannot be used here because it is defined in a Change Set A //otherwise, you will get an error }); @@ -1274,6 +1281,7 @@ You will get an error saying that the operation is incompatible with a 'batch mo There are also out of the box Web API limitations for batch operations: * Batch requests can contain up to 1000 individual requests and cannot contain other batch requests. +* Not supported in Microsoft Power Pages. (checked June 2024) You can find an official documentation that covers Web API batch requests here: [Execute batch operations using the Web API](https://docs.microsoft.com/en-us/dynamics365/customer-engagement/developer/webapi/execute-batch-operations-using-web-api). @@ -2181,9 +2189,12 @@ const isDeleted = await dynamicsWebApi.deleteRecord({ ## Work with Dataverse Search API -DynamicsWebApi can be used to call Dataverse Search API and utilize its powerful Search, Suggest and Autocomplete capabilities. Before using, I highly recommend to get familiar with it by reading an [official documentation](https://learn.microsoft.com/en-us/power-apps/developer/data-platform/webapi/relevance-search). +**Important!** Currently only Search API 1.0 is supported. Search API 2.0 is coming with `v.2.2.0`. +If you must use 2.0, you could [use corresponding Actions](#execute-web-api-actions) for now. [more info](https://learn.microsoft.com/en-us/power-apps/developer/data-platform/search/overview?tabs=sdk) + +DynamicsWebApi can be used to call Dataverse Search API and utilize its powerful Search, Suggest and Autocomplete capabilities. Before using, I highly recommend to get familiar with it by reading an [official documentation](https://learn.microsoft.com/en-us/power-apps/developer/data-platform/search/legacy). -To set Search API version use: `new DynamicsWebApi({ searchApi: { version: "2.0" }})`. +To set Search API version use: `new DynamicsWebApi({ searchApi: { version: "1.0" }})`. Search, Suggest and Autocomplete requests have a common property `query`. This is the main property that configures a relevance search request. @@ -2441,7 +2452,7 @@ The declaration file is an ESM module, so if you are not using any bundler, you import { DynamicsWebApi } from "./dynamics-web-api" //make the DynamicsWebApi class available globally export = DynamicsWebApi; -//wrap all other exports with in namespace +//wrap all other exports in a namespace export as namespace DynamicsWebApi; ``` @@ -2472,7 +2483,7 @@ const createRequest: Dwa.CreateRequest = { const id = await dynamicsWebApi.create(createRequest) as string; ``` -**DynamicsWebApi as an external library.** For those who use bundlers, but want to keep DynamicsWebApi as an external library (meaning that you don't want to bundle the library but reference it separately in a script tag somewhere): 1. you will have to make sure that your bundler supports `externals` configuraiton. 2. you will need to set the replacement for the import of `dynamics-web-api` with `_dynamicsWebApiExports`. For example, in webpack's case, you will have something like that: +**DynamicsWebApi as an external library.** For those who use bundlers, but want to keep DynamicsWebApi as an external library (meaning that you don't want to bundle the library but reference it separately in a script tag somewhere): 1. you will have to make sure that your bundler supports `externals` configuraiton. 2. you will need to set the replacement for the import of `dynamics-web-api` with `_dynamicsWebApiExports`. For example, in webpack's case, you will have something like this: ```json { //...your bundle configuration @@ -2482,7 +2493,7 @@ const id = await dynamicsWebApi.create(createRequest) as string; } ``` -This will work __only__ if in your scripts you import the library like this: `import { DynamicsWebApi } from "dynamics-web-api"`. In case if you don't install the package with npm but just keep the declaration files somewhere and import it with relative paths, you can set the [paths](https://www.typescriptlang.org/tsconfig#paths) option in your `tsconfig.json` which will create a consistent alias for all your relative import paths. +This will work __only__ if you import the library like this: `import { DynamicsWebApi } from "dynamics-web-api"`. If you don't install the package with npm but just keep the declaration files somewhere and import it with relative paths, you can set the [paths](https://www.typescriptlang.org/tsconfig#paths) option in your `tsconfig.json` which will create a consistent alias for all your relative import paths. ```json { @@ -2518,11 +2529,12 @@ the config option "formatted" will enable developers to retrieve all information - [X] Impersonate a user based on their Azure Active Directory (AAD) object id. `Added in v.1.6.12` - [X] File upload/download/delete for a File Field. `Added in v.1.7.0` - [X] Full proxy support. `Added in v.1.7.2` -- [X] Full proxy support. `Added in v.1.7.2` - [X] Refactoring and conversion to TypeScript. `Added in v.2.0.0` -- [X] Implement [Dataverse Search API](https://docs.microsoft.com/en-us/power-apps/developer/data-platform/webapi/relevance-search). `Added in v.2.0.0` -- [X] Allow custom headers to be passed to the request. [#151](https://github.com/AleksandrRogov/DynamicsWebApi/issues/151). `Added in v.2.1.0` +- [X] Implement [Dataverse Search API 1.0](https://learn.microsoft.com/en-us/power-apps/developer/data-platform/search/legacy). `Added in v.2.0.0` +- [X] Allow custom headers to be passed to the request [#151](https://github.com/AleksandrRogov/DynamicsWebApi/issues/151). `Added in v.2.1.0` - [X] Support Microsoft Power Pages. `Added in v.2.1.0` +- [ ] Support Search API 2.0 [#174](https://github.com/AleksandrRogov/DynamicsWebApi/issues/174). `Coming with v.2.2.0` +- [ ] Custom requests. Many more features to come! diff --git a/README.md b/README.md index 8304ab4..946ac88 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ Once the web file is uploaded, it can be included in a template, a page or a for With CDN, it is a bit easier: no need to create and upload a web file - just include the script in your template, page or a form: ```html - + ``` And you are good to go! DynamicsWebApi will automatically detect if the library is running on Power Pages and will supply an anti-forgery token with each request. @@ -77,7 +77,7 @@ Then include it in your script: ```ts //CommonJS -const DynamicsWebApi = require("dynamics-web-api"); +const DynamicsWebApi = require("dynamics-web-api").DynamicsWebApi; //ESM import { DynamicsWebApi } from "dynamics-web-api"; diff --git a/dist/browser/esm/dynamics-web-api.js b/dist/browser/esm/dynamics-web-api.js index a605103..0758155 100644 --- a/dist/browser/esm/dynamics-web-api.js +++ b/dist/browser/esm/dynamics-web-api.js @@ -1,4 +1,4 @@ -/*! dynamics-web-api v2.1.4 (c) 2024 Aleksandr Rogov */ +/*! dynamics-web-api v2.1.5 (c) 2024 Aleksandr Rogov */ var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; @@ -683,7 +683,7 @@ function executeRequest(options) { } function _executeRequest(options, successCallback, errorCallback) { const data = options.data; - const additionalHeaders = options.additionalHeaders; + const headers = options.headers; const responseParams = options.responseParams; const signal = options.abortSignal; if (signal?.aborted) { @@ -698,8 +698,8 @@ function _executeRequest(options, successCallback, errorCallback) { } let request = new XMLHttpRequest(); request.open(options.method, options.uri, options.isAsync || false); - for (let key in additionalHeaders) { - request.setRequestHeader(key, additionalHeaders[key]); + for (let key in headers) { + request.setRequestHeader(key, headers[key]); } request.onreadystatechange = function() { if (request.readyState === 4) { @@ -728,10 +728,10 @@ function _executeRequest(options, successCallback, errorCallback) { if (!request) break; let error; - let headers; + let headers2; try { - headers = parseResponseHeaders(request.getAllResponseHeaders()); - const errorParsed = parseResponse(request.responseText, headers, responseParams[options.requestId]); + headers2 = parseResponseHeaders(request.getAllResponseHeaders()); + const errorParsed = parseResponse(request.responseText, headers2, responseParams[options.requestId]); if (Array.isArray(errorParsed)) { errorCallback(errorParsed); break; @@ -747,7 +747,7 @@ function _executeRequest(options, successCallback, errorCallback) { const errorParameters = { status: request.status, statusText: request.statusText, - headers + headers: headers2 }; request = null; errorCallback(ErrorHelper.handleHttpError(error, errorParameters)); @@ -759,26 +759,26 @@ function _executeRequest(options, successCallback, errorCallback) { request.timeout = options.timeout; } request.onerror = function() { - const headers = parseResponseHeaders(request.getAllResponseHeaders()); + const headers2 = parseResponseHeaders(request.getAllResponseHeaders()); errorCallback( ErrorHelper.handleHttpError({ status: request.status, statusText: request.statusText, message: request.responseText || "Network Error", - headers + headers: headers2 }) ); request = null; }; request.ontimeout = function() { - const headers = parseResponseHeaders(request.getAllResponseHeaders()); + const headers2 = parseResponseHeaders(request.getAllResponseHeaders()); errorCallback( ErrorHelper.handleHttpError({ name: "TimeoutError", status: request.status, statusText: request.statusText, message: request.responseText || "Request Timed Out", - headers + headers: headers2 }) ); request = null; @@ -786,13 +786,13 @@ function _executeRequest(options, successCallback, errorCallback) { request.onabort = function() { if (!request) return; - const headers = parseResponseHeaders(request.getAllResponseHeaders()); + const headers2 = parseResponseHeaders(request.getAllResponseHeaders()); errorCallback( ErrorHelper.handleHttpError({ status: request.status, statusText: request.statusText, message: "Request aborted", - headers + headers: headers2 }) ); request = null; @@ -800,7 +800,7 @@ function _executeRequest(options, successCallback, errorCallback) { const abort = () => { if (!request) return; - const headers = parseResponseHeaders(request.getAllResponseHeaders()); + const headers2 = parseResponseHeaders(request.getAllResponseHeaders()); errorCallback( ErrorHelper.handleHttpError({ name: "AbortError", @@ -808,7 +808,7 @@ function _executeRequest(options, successCallback, errorCallback) { status: request.status, statusText: request.statusText, message: "The user aborted a request.", - headers + headers: headers2 }) ); request.abort(); @@ -946,482 +946,449 @@ init_Utility(); // src/utils/Request.ts init_Utility(); init_ErrorHelper(); -var _RequestUtility = class _RequestUtility { - /** - * Converts a request object to URL link - * - * @param {Object} request - Request object - * @param {Object} [config] - DynamicsWebApi config - * @returns {ConvertedRequest} Converted request - */ - static compose(request, config) { - request.path = request.path || ""; - request.functionName = request.functionName || ""; - if (!request.url) { - if (!request._isUnboundRequest && !request.contentId && !request.collection) { - ErrorHelper.parameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, "request.collection"); - } - if (request.collection != null) { - ErrorHelper.stringParameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, "request.collection"); - request.path = request.collection; - if (request.key) { - request.key = ErrorHelper.keyParameterCheck(request.key, `DynamicsWebApi.${request.functionName}`, "request.key"); - request.path += `(${request.key})`; - } - } - if (request.contentId) { - ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, "request.contentId"); - if (request.contentId.startsWith("$")) { - request.path = request.path ? `${request.contentId}/${request.path}` : request.contentId; - } +var entityNames = null; +var setEntityNames = (newEntityNames) => { + entityNames = newEntityNames; +}; +var compose = (request, config) => { + request.path = request.path || ""; + request.functionName = request.functionName || ""; + if (!request.url) { + if (!request._isUnboundRequest && !request.contentId && !request.collection) { + ErrorHelper.parameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, "request.collection"); + } + if (request.collection != null) { + ErrorHelper.stringParameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, "request.collection"); + request.path = request.collection; + if (request.key) { + request.key = ErrorHelper.keyParameterCheck(request.key, `DynamicsWebApi.${request.functionName}`, "request.key"); + request.path += `(${request.key})`; } - if (request._additionalUrl) { - if (request.path) { - request.path += "/"; - } - request.path += request._additionalUrl; + } + if (request.contentId) { + ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, "request.contentId"); + if (request.contentId.startsWith("$")) { + request.path = request.path ? `${request.contentId}/${request.path}` : request.contentId; } - request.path = _RequestUtility.composeUrl(request, config, request.path); - if (request.fetchXml) { - ErrorHelper.stringParameterCheck(request.fetchXml, `DynamicsWebApi.${request.functionName}`, "request.fetchXml"); - let join = request.path.indexOf("?") === -1 ? "?" : "&"; - request.path += `${join}fetchXml=${encodeURIComponent(request.fetchXml)}`; + } + if (request.addPath) { + if (request.path) { + request.path += "/"; } - } else { - ErrorHelper.stringParameterCheck(request.url, `DynamicsWebApi.${request.functionName}`, "request.url"); - request.path = request.url.replace(config.dataApi.url, ""); + request.path += request.addPath; } - if (request.hasOwnProperty("async") && request.async != null) { - ErrorHelper.boolParameterCheck(request.async, `DynamicsWebApi.${request.functionName}`, "request.async"); - } else { - request.async = true; + request.path = composeUrl(request, config, request.path); + if (request.fetchXml) { + ErrorHelper.stringParameterCheck(request.fetchXml, `DynamicsWebApi.${request.functionName}`, "request.fetchXml"); + let join = request.path.indexOf("?") === -1 ? "?" : "&"; + request.path += `${join}fetchXml=${encodeURIComponent(request.fetchXml)}`; } - request.headers = _RequestUtility.composeHeaders(request, config); - return request; + } else { + ErrorHelper.stringParameterCheck(request.url, `DynamicsWebApi.${request.functionName}`, "request.url"); + request.path = request.url.replace(config.dataApi.url, ""); } - /** - * Converts optional parameters of the request to URL. If expand parameter exists this function is called recursively. - * - * @param {Object} request - Request object - * @param {string} request.functionName - Name of the function that converts a request (for Error Handling) - * @param {string} url - URL beginning (with required parameters) - * @param {string} [joinSymbol] - URL beginning (with required parameters) - * @param {Object} [config] - DynamicsWebApi config - * @returns {ConvertedRequestOptions} Additional options in request - */ - static composeUrl(request, config, url = "", joinSymbol = "&") { - const queryArray = []; - if (request) { - if (request.navigationProperty) { - ErrorHelper.stringParameterCheck(request.navigationProperty, `DynamicsWebApi.${request.functionName}`, "request.navigationProperty"); - url += "/" + request.navigationProperty; - if (request.navigationPropertyKey) { - let navigationKey = ErrorHelper.keyParameterCheck( - request.navigationPropertyKey, - `DynamicsWebApi.${request.functionName}`, - "request.navigationPropertyKey" - ); - url += "(" + navigationKey + ")"; - } - if (request.navigationProperty === "Attributes") { - if (request.metadataAttributeType) { - ErrorHelper.stringParameterCheck( - request.metadataAttributeType, - `DynamicsWebApi.${request.functionName}`, - "request.metadataAttributeType" - ); - url += "/" + request.metadataAttributeType; - } - } + if (request.hasOwnProperty("async") && request.async != null) { + ErrorHelper.boolParameterCheck(request.async, `DynamicsWebApi.${request.functionName}`, "request.async"); + } else { + request.async = true; + } + request.headers = composeHeaders(request, config); + return request; +}; +var composeUrl = (request, config, url = "", joinSymbol = "&") => { + const queryArray = []; + if (request) { + if (request.navigationProperty) { + ErrorHelper.stringParameterCheck(request.navigationProperty, `DynamicsWebApi.${request.functionName}`, "request.navigationProperty"); + url += "/" + request.navigationProperty; + if (request.navigationPropertyKey) { + let navigationKey = ErrorHelper.keyParameterCheck( + request.navigationPropertyKey, + `DynamicsWebApi.${request.functionName}`, + "request.navigationPropertyKey" + ); + url += "(" + navigationKey + ")"; } - if (request.select?.length) { - ErrorHelper.arrayParameterCheck(request.select, `DynamicsWebApi.${request.functionName}`, "request.select"); - if (request.functionName == "retrieve" && request.select.length == 1 && request.select[0].endsWith("/$ref")) { - url += "/" + request.select[0]; - } else { - if (request.select[0].startsWith("/") && request.functionName == "retrieve") { - if (request.navigationProperty == null) { - url += request.select.shift(); - } else { - request.select.shift(); - } - } - if (request.select.length) { - queryArray.push("$select=" + request.select.join(",")); - } + if (request.navigationProperty === "Attributes") { + if (request.metadataAttributeType) { + ErrorHelper.stringParameterCheck(request.metadataAttributeType, `DynamicsWebApi.${request.functionName}`, "request.metadataAttributeType"); + url += "/" + request.metadataAttributeType; } } - if (request.filter) { - ErrorHelper.stringParameterCheck(request.filter, `DynamicsWebApi.${request.functionName}`, "request.filter"); - const removeBracketsFromGuidReg = /[^"']{([\w\d]{8}[-]?(?:[\w\d]{4}[-]?){3}[\w\d]{12})}(?:[^"']|$)/g; - let filterResult = request.filter; - let m = null; - while ((m = removeBracketsFromGuidReg.exec(filterResult)) !== null) { - if (m.index === removeBracketsFromGuidReg.lastIndex) { - removeBracketsFromGuidReg.lastIndex++; + } + if (request.select?.length) { + ErrorHelper.arrayParameterCheck(request.select, `DynamicsWebApi.${request.functionName}`, "request.select"); + if (request.functionName == "retrieve" && request.select.length == 1 && request.select[0].endsWith("/$ref")) { + url += "/" + request.select[0]; + } else { + if (request.select[0].startsWith("/") && request.functionName == "retrieve") { + if (request.navigationProperty == null) { + url += request.select.shift(); + } else { + request.select.shift(); } - let replacement = m[0].endsWith(")") ? ")" : " "; - filterResult = filterResult.replace(m[0], " " + m[1] + replacement); } - queryArray.push("$filter=" + encodeURIComponent(filterResult)); - } - if (request.fieldName) { - ErrorHelper.stringParameterCheck(request.fieldName, `DynamicsWebApi.${request.functionName}`, "request.fieldName"); - url += "/" + request.fieldName; - } - if (request.savedQuery) { - queryArray.push( - "savedQuery=" + ErrorHelper.guidParameterCheck(request.savedQuery, `DynamicsWebApi.${request.functionName}`, "request.savedQuery") - ); - } - if (request.userQuery) { - queryArray.push( - "userQuery=" + ErrorHelper.guidParameterCheck(request.userQuery, `DynamicsWebApi.${request.functionName}`, "request.userQuery") - ); - } - if (request.apply) { - ErrorHelper.stringParameterCheck(request.apply, `DynamicsWebApi.${request.functionName}`, "request.apply"); - queryArray.push("$apply=" + request.apply); - } - if (request.count) { - ErrorHelper.boolParameterCheck(request.count, `DynamicsWebApi.${request.functionName}`, "request.count"); - queryArray.push("$count=" + request.count); - } - if (request.top && request.top > 0) { - ErrorHelper.numberParameterCheck(request.top, `DynamicsWebApi.${request.functionName}`, "request.top"); - queryArray.push("$top=" + request.top); - } - if (request.orderBy != null && request.orderBy.length) { - ErrorHelper.arrayParameterCheck(request.orderBy, `DynamicsWebApi.${request.functionName}`, "request.orderBy"); - queryArray.push("$orderby=" + request.orderBy.join(",")); - } - if (request.partitionId) { - ErrorHelper.stringParameterCheck(request.partitionId, `DynamicsWebApi.${request.functionName}`, "request.partitionId"); - queryArray.push("partitionid='" + request.partitionId + "'"); - } - if (request.downloadSize) { - ErrorHelper.stringParameterCheck(request.downloadSize, `DynamicsWebApi.${request.functionName}`, "request.downloadSize"); - queryArray.push("size=" + request.downloadSize); - } - if (request.queryParams?.length) { - ErrorHelper.arrayParameterCheck(request.queryParams, `DynamicsWebApi.${request.functionName}`, "request.queryParams"); - queryArray.push(request.queryParams.join("&")); - } - if (request.fileName) { - ErrorHelper.stringParameterCheck(request.fileName, `DynamicsWebApi.${request.functionName}`, "request.fileName"); - queryArray.push("x-ms-file-name=" + request.fileName); - } - if (request.data) { - ErrorHelper.parameterCheck(request.data, `DynamicsWebApi.${request.functionName}`, "request.data"); - } - if (request.isBatch) { - ErrorHelper.boolParameterCheck(request.isBatch, `DynamicsWebApi.${request.functionName}`, "request.isBatch"); - } - if (!Utility.isNull(request.inChangeSet)) { - ErrorHelper.boolParameterCheck(request.inChangeSet, `DynamicsWebApi.${request.functionName}`, "request.inChangeSet"); - } - if (request.isBatch && Utility.isNull(request.inChangeSet)) - request.inChangeSet = true; - if (request.timeout) { - ErrorHelper.numberParameterCheck(request.timeout, `DynamicsWebApi.${request.functionName}`, "request.timeout"); - } - if (request.expand?.length) { - ErrorHelper.stringOrArrayParameterCheck(request.expand, `DynamicsWebApi.${request.functionName}`, "request.expand"); - if (typeof request.expand === "string") { - queryArray.push("$expand=" + request.expand); - } else { - const expandQueryArray = []; - for (let i = 0; i < request.expand.length; i++) { - if (request.expand[i].property) { - const expand = request.expand[i]; - expand.functionName = `${request.functionName} $expand`; - let expandConverted = _RequestUtility.composeUrl(expand, config, "", ";"); - if (expandConverted) { - expandConverted = `(${expandConverted.substr(1)})`; - } - expandQueryArray.push(request.expand[i].property + expandConverted); - } - } - if (expandQueryArray.length) { - queryArray.push("$expand=" + expandQueryArray.join(",")); - } + if (request.select.length) { + queryArray.push("$select=" + request.select.join(",")); } } } - return !queryArray.length ? url : url + "?" + queryArray.join(joinSymbol); - } - static composeHeaders(request, config) { - const headers = { ...config.headers, ...request.userHeaders }; - const prefer = _RequestUtility.composePreferHeader(request, config); - if (prefer.length) { - headers["Prefer"] = prefer; + if (request.filter) { + ErrorHelper.stringParameterCheck(request.filter, `DynamicsWebApi.${request.functionName}`, "request.filter"); + const removeBracketsFromGuidReg = /[^"']{([\w\d]{8}[-]?(?:[\w\d]{4}[-]?){3}[\w\d]{12})}(?:[^"']|$)/g; + let filterResult = request.filter; + let m = null; + while ((m = removeBracketsFromGuidReg.exec(filterResult)) !== null) { + if (m.index === removeBracketsFromGuidReg.lastIndex) { + removeBracketsFromGuidReg.lastIndex++; + } + let replacement = m[0].endsWith(")") ? ")" : " "; + filterResult = filterResult.replace(m[0], " " + m[1] + replacement); + } + queryArray.push("$filter=" + encodeURIComponent(filterResult)); } - if (request.collection === "$metadata") { - headers["Accept"] = "application/xml"; + if (request.fieldName) { + ErrorHelper.stringParameterCheck(request.fieldName, `DynamicsWebApi.${request.functionName}`, "request.fieldName"); + url += "/" + request.fieldName; } - if (request.transferMode) { - headers["x-ms-transfer-mode"] = request.transferMode; + if (request.savedQuery) { + queryArray.push("savedQuery=" + ErrorHelper.guidParameterCheck(request.savedQuery, `DynamicsWebApi.${request.functionName}`, "request.savedQuery")); } - if (request.ifmatch != null && request.ifnonematch != null) { - throw new Error( - `DynamicsWebApi.${request.functionName}. Either one of request.ifmatch or request.ifnonematch parameters should be used in a call, not both.` - ); + if (request.userQuery) { + queryArray.push("userQuery=" + ErrorHelper.guidParameterCheck(request.userQuery, `DynamicsWebApi.${request.functionName}`, "request.userQuery")); } - if (request.ifmatch) { - ErrorHelper.stringParameterCheck(request.ifmatch, `DynamicsWebApi.${request.functionName}`, "request.ifmatch"); - headers["If-Match"] = request.ifmatch; + if (request.apply) { + ErrorHelper.stringParameterCheck(request.apply, `DynamicsWebApi.${request.functionName}`, "request.apply"); + queryArray.push("$apply=" + request.apply); } - if (request.ifnonematch) { - ErrorHelper.stringParameterCheck(request.ifnonematch, `DynamicsWebApi.${request.functionName}`, "request.ifnonematch"); - headers["If-None-Match"] = request.ifnonematch; + if (request.count) { + ErrorHelper.boolParameterCheck(request.count, `DynamicsWebApi.${request.functionName}`, "request.count"); + queryArray.push("$count=" + request.count); } - if (request.impersonate) { - ErrorHelper.stringParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, "request.impersonate"); - headers["MSCRMCallerID"] = ErrorHelper.guidParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, "request.impersonate"); + if (request.top && request.top > 0) { + ErrorHelper.numberParameterCheck(request.top, `DynamicsWebApi.${request.functionName}`, "request.top"); + queryArray.push("$top=" + request.top); } - if (request.impersonateAAD) { - ErrorHelper.stringParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, "request.impersonateAAD"); - headers["CallerObjectId"] = ErrorHelper.guidParameterCheck( - request.impersonateAAD, - `DynamicsWebApi.${request.functionName}`, - "request.impersonateAAD" - ); + if (request.orderBy != null && request.orderBy.length) { + ErrorHelper.arrayParameterCheck(request.orderBy, `DynamicsWebApi.${request.functionName}`, "request.orderBy"); + queryArray.push("$orderby=" + request.orderBy.join(",")); } - if (request.token) { - ErrorHelper.stringParameterCheck(request.token, `DynamicsWebApi.${request.functionName}`, "request.token"); - headers["Authorization"] = "Bearer " + request.token; + if (request.partitionId) { + ErrorHelper.stringParameterCheck(request.partitionId, `DynamicsWebApi.${request.functionName}`, "request.partitionId"); + queryArray.push("partitionid='" + request.partitionId + "'"); } - if (request.duplicateDetection) { - ErrorHelper.boolParameterCheck(request.duplicateDetection, `DynamicsWebApi.${request.functionName}`, "request.duplicateDetection"); - headers["MSCRM.SuppressDuplicateDetection"] = "false"; + if (request.downloadSize) { + ErrorHelper.stringParameterCheck(request.downloadSize, `DynamicsWebApi.${request.functionName}`, "request.downloadSize"); + queryArray.push("size=" + request.downloadSize); } - if (request.bypassCustomPluginExecution) { - ErrorHelper.boolParameterCheck( - request.bypassCustomPluginExecution, - `DynamicsWebApi.${request.functionName}`, - "request.bypassCustomPluginExecution" - ); - headers["MSCRM.BypassCustomPluginExecution"] = "true"; + if (request.queryParams?.length) { + ErrorHelper.arrayParameterCheck(request.queryParams, `DynamicsWebApi.${request.functionName}`, "request.queryParams"); + queryArray.push(request.queryParams.join("&")); } - if (request.noCache) { - ErrorHelper.boolParameterCheck(request.noCache, `DynamicsWebApi.${request.functionName}`, "request.noCache"); - headers["Cache-Control"] = "no-cache"; + if (request.fileName) { + ErrorHelper.stringParameterCheck(request.fileName, `DynamicsWebApi.${request.functionName}`, "request.fileName"); + queryArray.push("x-ms-file-name=" + request.fileName); } - if (request.mergeLabels) { - ErrorHelper.boolParameterCheck(request.mergeLabels, `DynamicsWebApi.${request.functionName}`, "request.mergeLabels"); - headers["MSCRM.MergeLabels"] = "true"; + if (request.data) { + ErrorHelper.parameterCheck(request.data, `DynamicsWebApi.${request.functionName}`, "request.data"); } - if (request.contentId) { - ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, "request.contentId"); - if (!request.contentId.startsWith("$")) { - headers["Content-ID"] = request.contentId; - } + if (request.isBatch) { + ErrorHelper.boolParameterCheck(request.isBatch, `DynamicsWebApi.${request.functionName}`, "request.isBatch"); } - if (request.contentRange) { - ErrorHelper.stringParameterCheck(request.contentRange, `DynamicsWebApi.${request.functionName}`, "request.contentRange"); - headers["Content-Range"] = request.contentRange; + if (!Utility.isNull(request.inChangeSet)) { + ErrorHelper.boolParameterCheck(request.inChangeSet, `DynamicsWebApi.${request.functionName}`, "request.inChangeSet"); } - if (request.range) { - ErrorHelper.stringParameterCheck(request.range, `DynamicsWebApi.${request.functionName}`, "request.range"); - headers["Range"] = request.range; + if (request.isBatch && Utility.isNull(request.inChangeSet)) + request.inChangeSet = true; + if (request.timeout) { + ErrorHelper.numberParameterCheck(request.timeout, `DynamicsWebApi.${request.functionName}`, "request.timeout"); } - return headers; - } - static composePreferHeader(request, config) { - let returnRepresentation = request.returnRepresentation; - let includeAnnotations = request.includeAnnotations; - let maxPageSize = request.maxPageSize; - let trackChanges = request.trackChanges; - let continueOnError = request.continueOnError; - let prefer = []; - if (request.prefer && request.prefer.length) { - ErrorHelper.stringOrArrayParameterCheck(request.prefer, `DynamicsWebApi.${request.functionName}`, "request.prefer"); - if (typeof request.prefer === "string") { - prefer = request.prefer.split(","); - } - for (let i in prefer) { - let item = prefer[i].trim(); - if (item === "return=representation") { - returnRepresentation = true; - } else if (item.includes("odata.include-annotations=")) { - includeAnnotations = item.replace("odata.include-annotations=", "").replace(/"/g, ""); - } else if (item.startsWith("odata.maxpagesize=")) { - maxPageSize = Number(item.replace("odata.maxpagesize=", "").replace(/"/g, "")) || 0; - } else if (item.includes("odata.track-changes")) { - trackChanges = true; - } else if (item.includes("odata.continue-on-error")) { - continueOnError = true; + if (request.expand?.length) { + ErrorHelper.stringOrArrayParameterCheck(request.expand, `DynamicsWebApi.${request.functionName}`, "request.expand"); + if (typeof request.expand === "string") { + queryArray.push("$expand=" + request.expand); + } else { + const expandQueryArray = []; + for (let i = 0; i < request.expand.length; i++) { + if (request.expand[i].property) { + const expand = request.expand[i]; + expand.functionName = `${request.functionName} $expand`; + let expandConverted = composeUrl(expand, config, "", ";"); + if (expandConverted) { + expandConverted = `(${expandConverted.substr(1)})`; + } + expandQueryArray.push(request.expand[i].property + expandConverted); + } + } + if (expandQueryArray.length) { + queryArray.push("$expand=" + expandQueryArray.join(",")); } } } - prefer = []; - if (config) { - if (returnRepresentation == null) { - returnRepresentation = config.returnRepresentation; - } - includeAnnotations = includeAnnotations ? includeAnnotations : config.includeAnnotations; - maxPageSize = maxPageSize ? maxPageSize : config.maxPageSize; - } - if (returnRepresentation) { - ErrorHelper.boolParameterCheck(returnRepresentation, `DynamicsWebApi.${request.functionName}`, "request.returnRepresentation"); - prefer.push("return=representation"); - } - if (includeAnnotations) { - ErrorHelper.stringParameterCheck(includeAnnotations, `DynamicsWebApi.${request.functionName}`, "request.includeAnnotations"); - prefer.push(`odata.include-annotations="${includeAnnotations}"`); - } - if (maxPageSize && maxPageSize > 0) { - ErrorHelper.numberParameterCheck(maxPageSize, `DynamicsWebApi.${request.functionName}`, "request.maxPageSize"); - prefer.push("odata.maxpagesize=" + maxPageSize); + } + return !queryArray.length ? url : url + "?" + queryArray.join(joinSymbol); +}; +var composeHeaders = (request, config) => { + const headers = { ...config.headers, ...request.userHeaders }; + const prefer = composePreferHeader(request, config); + if (prefer.length) { + headers["Prefer"] = prefer; + } + if (request.collection === "$metadata") { + headers["Accept"] = "application/xml"; + } + if (request.transferMode) { + headers["x-ms-transfer-mode"] = request.transferMode; + } + if (request.ifmatch != null && request.ifnonematch != null) { + throw new Error( + `DynamicsWebApi.${request.functionName}. Either one of request.ifmatch or request.ifnonematch parameters should be used in a call, not both.` + ); + } + if (request.ifmatch) { + ErrorHelper.stringParameterCheck(request.ifmatch, `DynamicsWebApi.${request.functionName}`, "request.ifmatch"); + headers["If-Match"] = request.ifmatch; + } + if (request.ifnonematch) { + ErrorHelper.stringParameterCheck(request.ifnonematch, `DynamicsWebApi.${request.functionName}`, "request.ifnonematch"); + headers["If-None-Match"] = request.ifnonematch; + } + if (request.impersonate) { + ErrorHelper.stringParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, "request.impersonate"); + headers["MSCRMCallerID"] = ErrorHelper.guidParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, "request.impersonate"); + } + if (request.impersonateAAD) { + ErrorHelper.stringParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, "request.impersonateAAD"); + headers["CallerObjectId"] = ErrorHelper.guidParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, "request.impersonateAAD"); + } + if (request.token) { + ErrorHelper.stringParameterCheck(request.token, `DynamicsWebApi.${request.functionName}`, "request.token"); + headers["Authorization"] = "Bearer " + request.token; + } + if (request.duplicateDetection) { + ErrorHelper.boolParameterCheck(request.duplicateDetection, `DynamicsWebApi.${request.functionName}`, "request.duplicateDetection"); + headers["MSCRM.SuppressDuplicateDetection"] = "false"; + } + if (request.bypassCustomPluginExecution) { + ErrorHelper.boolParameterCheck(request.bypassCustomPluginExecution, `DynamicsWebApi.${request.functionName}`, "request.bypassCustomPluginExecution"); + headers["MSCRM.BypassCustomPluginExecution"] = "true"; + } + if (request.noCache) { + ErrorHelper.boolParameterCheck(request.noCache, `DynamicsWebApi.${request.functionName}`, "request.noCache"); + headers["Cache-Control"] = "no-cache"; + } + if (request.mergeLabels) { + ErrorHelper.boolParameterCheck(request.mergeLabels, `DynamicsWebApi.${request.functionName}`, "request.mergeLabels"); + headers["MSCRM.MergeLabels"] = "true"; + } + if (request.contentId) { + ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, "request.contentId"); + if (!request.contentId.startsWith("$")) { + headers["Content-ID"] = request.contentId; } - if (trackChanges) { - ErrorHelper.boolParameterCheck(trackChanges, `DynamicsWebApi.${request.functionName}`, "request.trackChanges"); - prefer.push("odata.track-changes"); + } + if (request.contentRange) { + ErrorHelper.stringParameterCheck(request.contentRange, `DynamicsWebApi.${request.functionName}`, "request.contentRange"); + headers["Content-Range"] = request.contentRange; + } + if (request.range) { + ErrorHelper.stringParameterCheck(request.range, `DynamicsWebApi.${request.functionName}`, "request.range"); + headers["Range"] = request.range; + } + return headers; +}; +var composePreferHeader = (request, config) => { + let returnRepresentation = request.returnRepresentation; + let includeAnnotations = request.includeAnnotations; + let maxPageSize = request.maxPageSize; + let trackChanges = request.trackChanges; + let continueOnError = request.continueOnError; + let prefer = []; + if (request.prefer && request.prefer.length) { + ErrorHelper.stringOrArrayParameterCheck(request.prefer, `DynamicsWebApi.${request.functionName}`, "request.prefer"); + if (typeof request.prefer === "string") { + prefer = request.prefer.split(","); + } + for (let i in prefer) { + let item = prefer[i].trim(); + if (item === "return=representation") { + returnRepresentation = true; + } else if (item.includes("odata.include-annotations=")) { + includeAnnotations = item.replace("odata.include-annotations=", "").replace(/"/g, ""); + } else if (item.startsWith("odata.maxpagesize=")) { + maxPageSize = Number(item.replace("odata.maxpagesize=", "").replace(/"/g, "")) || 0; + } else if (item.includes("odata.track-changes")) { + trackChanges = true; + } else if (item.includes("odata.continue-on-error")) { + continueOnError = true; + } } - if (continueOnError) { - ErrorHelper.boolParameterCheck(continueOnError, `DynamicsWebApi.${request.functionName}`, "request.continueOnError"); - prefer.push("odata.continue-on-error"); + } + prefer = []; + if (config) { + if (returnRepresentation == null) { + returnRepresentation = config.returnRepresentation; } - return prefer.join(","); + includeAnnotations = includeAnnotations ? includeAnnotations : config.includeAnnotations; + maxPageSize = maxPageSize ? maxPageSize : config.maxPageSize; } - static convertToBatch(requests, config, batchRequest) { - const batchBoundary = `dwa_batch_${Utility.generateUUID()}`; - const batchBody = []; - let currentChangeSet = null; - let contentId = 1e5; - requests.forEach((internalRequest) => { - internalRequest.functionName = "executeBatch"; - if (batchRequest?.inChangeSet === false) - internalRequest.inChangeSet = false; - const inChangeSet = internalRequest.method === "GET" ? false : !!internalRequest.inChangeSet; - if (!inChangeSet && currentChangeSet) { - batchBody.push(` + if (returnRepresentation) { + ErrorHelper.boolParameterCheck(returnRepresentation, `DynamicsWebApi.${request.functionName}`, "request.returnRepresentation"); + prefer.push("return=representation"); + } + if (includeAnnotations) { + ErrorHelper.stringParameterCheck(includeAnnotations, `DynamicsWebApi.${request.functionName}`, "request.includeAnnotations"); + prefer.push(`odata.include-annotations="${includeAnnotations}"`); + } + if (maxPageSize && maxPageSize > 0) { + ErrorHelper.numberParameterCheck(maxPageSize, `DynamicsWebApi.${request.functionName}`, "request.maxPageSize"); + prefer.push("odata.maxpagesize=" + maxPageSize); + } + if (trackChanges) { + ErrorHelper.boolParameterCheck(trackChanges, `DynamicsWebApi.${request.functionName}`, "request.trackChanges"); + prefer.push("odata.track-changes"); + } + if (continueOnError) { + ErrorHelper.boolParameterCheck(continueOnError, `DynamicsWebApi.${request.functionName}`, "request.continueOnError"); + prefer.push("odata.continue-on-error"); + } + return prefer.join(","); +}; +var convertToBatch = (requests, config, batchRequest) => { + const batchBoundary = `dwa_batch_${Utility.generateUUID()}`; + const batchBody = []; + let currentChangeSet = null; + let contentId = 1e5; + requests.forEach((internalRequest) => { + internalRequest.functionName = "executeBatch"; + if (batchRequest?.inChangeSet === false) + internalRequest.inChangeSet = false; + const inChangeSet = internalRequest.method === "GET" ? false : !!internalRequest.inChangeSet; + if (!inChangeSet && currentChangeSet) { + batchBody.push(` --${currentChangeSet}--`); - currentChangeSet = null; - contentId = 1e5; - } - if (!currentChangeSet) { - batchBody.push(` + currentChangeSet = null; + contentId = 1e5; + } + if (!currentChangeSet) { + batchBody.push(` --${batchBoundary}`); - if (inChangeSet) { - currentChangeSet = `changeset_${Utility.generateUUID()}`; - batchBody.push("Content-Type: multipart/mixed;boundary=" + currentChangeSet); - } - } if (inChangeSet) { - batchBody.push(` ---${currentChangeSet}`); + currentChangeSet = `changeset_${Utility.generateUUID()}`; + batchBody.push("Content-Type: multipart/mixed;boundary=" + currentChangeSet); } - batchBody.push("Content-Type: application/http"); - batchBody.push("Content-Transfer-Encoding: binary"); - if (inChangeSet) { - const contentIdValue = internalRequest.headers.hasOwnProperty("Content-ID") ? internalRequest.headers["Content-ID"] : ++contentId; - batchBody.push(`Content-ID: ${contentIdValue}`); - } - if (!internalRequest.path?.startsWith("$")) { - batchBody.push(` + } + if (inChangeSet) { + batchBody.push(` +--${currentChangeSet}`); + } + batchBody.push("Content-Type: application/http"); + batchBody.push("Content-Transfer-Encoding: binary"); + if (inChangeSet) { + const contentIdValue = internalRequest.headers.hasOwnProperty("Content-ID") ? internalRequest.headers["Content-ID"] : ++contentId; + batchBody.push(`Content-ID: ${contentIdValue}`); + } + if (!internalRequest.path?.startsWith("$")) { + batchBody.push(` ${internalRequest.method} ${config.dataApi.url}${internalRequest.path} HTTP/1.1`); - } else { - batchBody.push(` + } else { + batchBody.push(` ${internalRequest.method} ${internalRequest.path} HTTP/1.1`); - } - if (internalRequest.method === "GET") { - batchBody.push("Accept: application/json"); - } else { - batchBody.push("Content-Type: application/json"); - } - for (let key in internalRequest.headers) { - if (key === "Authorization" || key === "Content-ID") - continue; - batchBody.push(`${key}: ${internalRequest.headers[key]}`); - } - if (internalRequest.data) { - batchBody.push(` -${_RequestUtility.processData(internalRequest.data, config)}`); - } - }); - if (currentChangeSet) { + } + if (internalRequest.method === "GET") { + batchBody.push("Accept: application/json"); + } else { + batchBody.push("Content-Type: application/json"); + } + for (let key in internalRequest.headers) { + if (key === "Authorization" || key === "Content-ID") + continue; + batchBody.push(`${key}: ${internalRequest.headers[key]}`); + } + if (internalRequest.data) { batchBody.push(` ---${currentChangeSet}--`); +${processData(internalRequest.data, config)}`); } + }); + if (currentChangeSet) { batchBody.push(` +--${currentChangeSet}--`); + } + batchBody.push(` --${batchBoundary}--`); - const headers = _RequestUtility.setStandardHeaders(batchRequest?.userHeaders); - headers["Content-Type"] = `multipart/mixed;boundary=${batchBoundary}`; - return { headers, body: batchBody.join("\n") }; - } - static findCollectionName(entityName) { - let collectionName = null; - if (!Utility.isNull(_RequestUtility.entityNames)) { - collectionName = _RequestUtility.entityNames[entityName]; - if (Utility.isNull(collectionName)) { - for (let key in _RequestUtility.entityNames) { - if (_RequestUtility.entityNames[key] === entityName) { - return entityName; - } + const headers = setStandardHeaders(batchRequest?.userHeaders); + headers["Content-Type"] = `multipart/mixed;boundary=${batchBoundary}`; + return { headers, body: batchBody.join("\n") }; +}; +var findCollectionName = (entityName) => { + let collectionName = null; + if (!Utility.isNull(entityNames)) { + collectionName = entityNames[entityName]; + if (!collectionName) { + for (let key in entityNames) { + if (entityNames[key] === entityName) { + return entityName; } } } - return collectionName; } - static processData(data, config) { - let stringifiedData = null; - if (data) { - if (data instanceof Uint8Array || data instanceof Uint16Array || data instanceof Uint32Array) - return data; - stringifiedData = JSON.stringify(data, (key, value) => { - if (key.endsWith("@odata.bind") || key.endsWith("@odata.id")) { - if (typeof value === "string" && !value.startsWith("$")) { - if (/\(\{[\w\d-]+\}\)/g.test(value)) { - value = value.replace(/(.+)\(\{([\w\d-]+)\}\)/g, "$1($2)"); - } - if (config.useEntityNames) { - const regularExpression = /([\w_]+)(\([\d\w-]+\))$/; - const valueParts = regularExpression.exec(value); - if (valueParts && valueParts.length > 2) { - const collectionName = _RequestUtility.findCollectionName(valueParts[1]); - if (!Utility.isNull(collectionName)) { - value = value.replace(regularExpression, collectionName + "$2"); - } + return collectionName; +}; +var processData = (data, config) => { + let stringifiedData = null; + if (data) { + if (data instanceof Uint8Array || data instanceof Uint16Array || data instanceof Uint32Array) + return data; + stringifiedData = JSON.stringify(data, (key, value) => { + if (key.endsWith("@odata.bind") || key.endsWith("@odata.id")) { + if (typeof value === "string" && !value.startsWith("$")) { + if (/\(\{[\w\d-]+\}\)/g.test(value)) { + value = value.replace(/(.+)\(\{([\w\d-]+)\}\)/g, "$1($2)"); + } + if (config.useEntityNames) { + const regularExpression = /([\w_]+)(\([\d\w-]+\))$/; + const valueParts = regularExpression.exec(value); + if (valueParts && valueParts.length > 2) { + const collectionName = findCollectionName(valueParts[1]); + if (!Utility.isNull(collectionName)) { + value = value.replace(regularExpression, collectionName + "$2"); } } - if (!value.startsWith(config.dataApi.url)) { - if (key.endsWith("@odata.bind")) { - if (!value.startsWith("/")) { - value = "/" + value; - } - } else { - value = config.dataApi.url + value.replace(/^\//, ""); + } + if (!value.startsWith(config.dataApi.url)) { + if (key.endsWith("@odata.bind")) { + if (!value.startsWith("/")) { + value = "/" + value; } + } else { + value = config.dataApi.url + value.replace(/^\//, ""); } } - } else if (key.startsWith("oData") || key.endsWith("_Formatted") || key.endsWith("_NavigationProperty") || key.endsWith("_LogicalName")) { - value = void 0; } - return value; - }); - stringifiedData = stringifiedData.replace(/[\u007F-\uFFFF]/g, function(chr) { - return "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).slice(-4); - }); - } - return stringifiedData; - } - static setStandardHeaders(headers = {}) { - if (!headers["Accept"]) - headers["Accept"] = "application/json"; - if (!headers["OData-MaxVersion"]) - headers["OData-MaxVersion"] = "4.0"; - if (!headers["OData-Version"]) - headers["OData-Version"] = "4.0"; - if (headers["Content-Range"]) - headers["Content-Type"] = "application/octet-stream"; - else if (!headers["Content-Type"]) - headers["Content-Type"] = "application/json; charset=utf-8"; - return headers; + } else if (key.startsWith("oData") || key.endsWith("_Formatted") || key.endsWith("_NavigationProperty") || key.endsWith("_LogicalName")) { + value = void 0; + } + return value; + }); + stringifiedData = stringifiedData.replace(/[\u007F-\uFFFF]/g, function(chr) { + return "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).slice(-4); + }); } + return stringifiedData; +}; +var setStandardHeaders = (headers = {}) => { + if (!headers["Accept"]) + headers["Accept"] = "application/json"; + if (!headers["OData-MaxVersion"]) + headers["OData-MaxVersion"] = "4.0"; + if (!headers["OData-Version"]) + headers["OData-Version"] = "4.0"; + if (headers["Content-Range"]) + headers["Content-Type"] = "application/octet-stream"; + else if (!headers["Content-Type"]) + headers["Content-Type"] = "application/json; charset=utf-8"; + return headers; }; -_RequestUtility.entityNames = null; -var RequestUtility = _RequestUtility; // src/client/RequestClient.ts init_ErrorHelper(); @@ -1463,7 +1430,55 @@ var _runRequest = async (request, config) => { }; var _batchRequestCollection = {}; var _responseParseParams = {}; -var RequestClient = class _RequestClient { +var _nameExceptions = [ + "$metadata", + "EntityDefinitions", + "RelationshipDefinitions", + "GlobalOptionSetDefinitions", + "ManagedPropertyDefinitions", + "query", + "suggest", + "autocomplete" +]; +var _isEntityNameException = (entityName) => { + return _nameExceptions.indexOf(entityName) > -1; +}; +var _getCollectionNames = async (entityName, config) => { + if (!Utility.isNull(entityNames)) { + return findCollectionName(entityName) || entityName; + } + const request = compose( + { + method: "GET", + collection: "EntityDefinitions", + select: ["EntitySetName", "LogicalName"], + noCache: true, + functionName: "retrieveMultiple" + }, + config + ); + const result = await _runRequest(request, config); + setEntityNames({}); + for (let i = 0; i < result.data.value.length; i++) { + entityNames[result.data.value[i].LogicalName] = result.data.value[i].EntitySetName; + } + return findCollectionName(entityName) || entityName; +}; +var _checkCollectionName = async (entityName, config) => { + if (!entityName || _isEntityNameException(entityName)) { + return entityName; + } + entityName = entityName.toLowerCase(); + if (!config.useEntityNames) { + return entityName; + } + try { + return await _getCollectionNames(entityName, config); + } catch (error) { + throw new Error("Unable to fetch Collection Names. Error: " + error.message); + } +}; +var RequestClient = class { /** * Sends a request to given URL with given parameters * @@ -1481,14 +1496,14 @@ var RequestClient = class _RequestClient { const batchRequest = _batchRequestCollection[request.requestId]; if (!batchRequest) throw ErrorHelper.batchIsEmpty(); - const batchResult = RequestUtility.convertToBatch(batchRequest, config, request); + const batchResult = convertToBatch(batchRequest, config, request); processedData = batchResult.body; request.headers = { ...batchResult.headers, ...request.headers }; delete _batchRequestCollection[request.requestId]; } else { - processedData = !isBatchConverted ? RequestUtility.processData(request.data, config) : request.data; + processedData = !isBatchConverted ? processData(request.data, config) : request.data; if (!isBatchConverted) - request.headers = RequestUtility.setStandardHeaders(request.headers); + request.headers = setStandardHeaders(request.headers); } if (config.impersonate && !request.headers["MSCRMCallerID"]) { request.headers["MSCRMCallerID"] = config.impersonate; @@ -1513,74 +1528,29 @@ var RequestClient = class _RequestClient { method: request.method, uri: url.toString() + request.path, data: processedData, - additionalHeaders: request.headers, - responseParams: _responseParseParams, - isAsync: request.async, - timeout: request.timeout || config.timeout, proxy: config.proxy, + isAsync: request.async, + headers: request.headers, requestId: request.requestId, - abortSignal: request.signal + abortSignal: request.signal, + responseParams: _responseParseParams, + timeout: request.timeout || config.timeout }); } - static async _getCollectionNames(entityName, config) { - if (!Utility.isNull(RequestUtility.entityNames)) { - return RequestUtility.findCollectionName(entityName) || entityName; - } - const request = RequestUtility.compose( - { - method: "GET", - collection: "EntityDefinitions", - select: ["EntitySetName", "LogicalName"], - noCache: true, - functionName: "retrieveMultiple" - }, - config - ); - const result = await _runRequest(request, config); - RequestUtility.entityNames = {}; - for (let i = 0; i < result.data.value.length; i++) { - RequestUtility.entityNames[result.data.value[i].LogicalName] = result.data.value[i].EntitySetName; - } - return RequestUtility.findCollectionName(entityName) || entityName; - } - static _isEntityNameException(entityName) { - const exceptions = [ - "$metadata", - "EntityDefinitions", - "RelationshipDefinitions", - "GlobalOptionSetDefinitions", - "ManagedPropertyDefinitions", - "query", - "suggest", - "autocomplete" - ]; - return exceptions.indexOf(entityName) > -1; - } - static async _checkCollectionName(entityName, config) { - if (!entityName || _RequestClient._isEntityNameException(entityName)) { - return entityName; - } - entityName = entityName.toLowerCase(); - if (!config.useEntityNames) { - return entityName; - } - try { - return await _RequestClient._getCollectionNames(entityName, config); - } catch (error) { - throw new Error("Unable to fetch Collection Names. Error: " + error.message); - } - } static async makeRequest(request, config) { request.responseParameters = request.responseParameters || {}; request.userHeaders = request.headers; delete request.headers; if (!request.isBatch) { - const collectionName = await _RequestClient._checkCollectionName(request.collection, config); + const collectionName = await _checkCollectionName(request.collection, config); request.collection = collectionName; - RequestUtility.compose(request, config); + compose(request, config); request.responseParameters.convertedToBatch = false; if (request.path.length > 2e3) { - const batchRequest = RequestUtility.convertToBatch([request], config); + const batchRequest = convertToBatch([request], config); + if (request.headers["Authorization"]) { + batchRequest.headers["Authorization"] = request.headers["Authorization"]; + } request.method = "POST"; request.path = "$batch"; request.data = batchRequest.body; @@ -1589,17 +1559,17 @@ var RequestClient = class _RequestClient { } return _runRequest(request, config); } - RequestUtility.compose(request, config); + compose(request, config); _addResponseParams(request.requestId, request.responseParameters); _addRequestToBatchCollection(request.requestId, request); } static _clearTestData() { - RequestUtility.entityNames = null; + setEntityNames(null); _responseParseParams = {}; _batchRequestCollection = {}; } static getCollectionName(entityName) { - return RequestUtility.findCollectionName(entityName); + return findCollectionName(entityName); } }; @@ -2071,7 +2041,7 @@ var DynamicsWebApi = class _DynamicsWebApi { ErrorHelper.stringParameterCheck(functionName, `DynamicsWebApi.callFunction`, parameterName); const functionParameters = Utility.buildFunctionParameters(internalRequest.parameters); internalRequest.method = "GET"; - internalRequest._additionalUrl = functionName + functionParameters.key; + internalRequest.addPath = functionName + functionParameters.key; internalRequest.queryParams = functionParameters.queryParams; internalRequest._isUnboundRequest = !internalRequest.collection; internalRequest.functionName = "callFunction"; @@ -2090,7 +2060,7 @@ var DynamicsWebApi = class _DynamicsWebApi { const internalRequest = Utility.copyRequest(request, ["action"]); internalRequest.method = "POST"; internalRequest.functionName = "callAction"; - internalRequest._additionalUrl = request.actionName; + internalRequest.addPath = request.actionName; internalRequest._isUnboundRequest = !internalRequest.collection; internalRequest.data = request.action; const response = await this._makeRequest(internalRequest); diff --git a/dist/browser/esm/dynamics-web-api.js.map b/dist/browser/esm/dynamics-web-api.js.map index 5b1ff3f..8beb001 100644 --- a/dist/browser/esm/dynamics-web-api.js.map +++ b/dist/browser/esm/dynamics-web-api.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../../src/helpers/Crypto.ts", "../../../src/helpers/Regex.ts", "../../../src/utils/Utility.ts", "../../../src/helpers/ErrorHelper.ts", "../../../src/dwa.ts", "../../../src/client/helpers/dateReviver.ts", "../../../src/client/helpers/parseResponse.ts", "../../../src/client/helpers/parseResponseHeaders.ts", "../../../src/client/xhr.ts", "../../../src/utils/Config.ts", "../../../src/dynamics-web-api.ts", "../../../src/client/RequestClient.ts", "../../../src/utils/Request.ts", "../../../src/client/helpers/executeRequest.ts"], - "sourcesContent": ["export function getCrypto(): T {\r\n return global.DWA_BROWSER ? global.window.crypto : require(\"./crypto/node\").getCrypto();\r\n}\r\n\r\nexport function generateRandomBytes() {\r\n return global.DWA_BROWSER ? getCrypto().getRandomValues(new Uint8Array(1)) : getCrypto().randomBytes(1);\r\n}\r\n", "const uuid = \"[0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12}\";\r\n\r\nexport function isUuid(value: string): boolean {\r\n const match = new RegExp(uuid, \"i\").exec(value);\r\n return !!match;\r\n}\r\n\r\nexport function extractUuid(value: string): string | null {\r\n const match = new RegExp(\"^{?(\" + uuid + \")}?$\", \"i\").exec(value);\r\n return match ? match[1] : null;\r\n}\r\n\r\nexport function extractUuidFromUrl(url: string): string | null {\r\n const match = new RegExp(\"(\" + uuid + \")\\\\)$\", \"i\").exec(url);\r\n return match ? match[1] : null;\r\n}\r\n", "\uFEFFimport { Core } from \"../types\";\r\nimport { generateRandomBytes } from \"../helpers/Crypto\";\r\nimport { isUuid, extractUuid } from \"../helpers/Regex\";\r\n\r\ndeclare var GetGlobalContext: any;\r\ndeclare var Xrm: any;\r\n\r\n// function isNodeEnv(): boolean {\r\n// // tslint:disable:strict-type-predicates\r\n// return Object.prototype.toString.call(typeof process !== \"undefined\" ? process : 0) === \"[object process]\";\r\n// }\r\n\r\n// function getGlobalObject(): T {\r\n// return (isNodeEnv() ? global : typeof window !== \"undefined\" ? window : typeof self !== \"undefined\" ? self : {}) as T;\r\n// }\r\n\r\nconst downloadChunkSize = 4194304;\r\n\r\nexport class Utility {\r\n /**\r\n * Builds parametes for a funciton. Returns '()' (if no parameters) or '([params])?[query]'\r\n *\r\n * @param {Object} [parameters] - Function's input parameters. Example: { param1: \"test\", param2: 3 }.\r\n * @returns {string}\r\n */\r\n static buildFunctionParameters(parameters?: any): Core.FunctionParameters {\r\n if (parameters) {\r\n const parameterNames = Object.keys(parameters);\r\n const functionParams: string[] = [];\r\n const urlQuery: string[] = [];\r\n\r\n for (let i = 1; i <= parameterNames.length; i++) {\r\n const parameterName = parameterNames[i - 1];\r\n let value = parameters[parameterName];\r\n\r\n if (value == null) continue;\r\n\r\n if (typeof value === \"string\" && !value.startsWith(\"Microsoft.Dynamics.CRM\") && !isUuid(value)) {\r\n value = `'${value}'`;\r\n } else if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n\r\n functionParams.push(`${parameterName}=@p${i}`);\r\n urlQuery.push(`@p${i}=${extractUuid(value) || value}`);\r\n }\r\n\r\n return {\r\n key: `(${functionParams.join(\",\")})`,\r\n queryParams: urlQuery,\r\n };\r\n } else {\r\n return {\r\n key: \"()\",\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Parses a paging cookie returned in response\r\n *\r\n * @param {string} pageCookies - Page cookies returned in @Microsoft.Dynamics.CRM.fetchxmlpagingcookie.\r\n * @param {number} currentPageNumber - A current page number. Fix empty paging-cookie for complex fetch xmls.\r\n * @returns {{cookie: \"\", number: 0, next: 1}}\r\n */\r\n static getFetchXmlPagingCookie(pageCookies: string = \"\", currentPageNumber: number = 1): Core.FetchXmlCookie {\r\n //get the page cokies\r\n pageCookies = decodeURIComponent(decodeURIComponent(pageCookies));\r\n\r\n const info = /pagingcookie=\"()/.exec(pageCookies);\r\n\r\n if (info != null) {\r\n let page = parseInt(info[2]);\r\n return {\r\n cookie: info[1]\r\n .replace(//g, \">\")\r\n .replace(/\\\"/g, \"'\")\r\n .replace(/\\'/g, \"&\" + \"quot;\"),\r\n page: page,\r\n nextPage: page + 1,\r\n };\r\n } else {\r\n //http://stackoverflow.com/questions/41262772/execution-of-fetch-xml-using-web-api-dynamics-365 workaround\r\n return {\r\n cookie: \"\",\r\n page: currentPageNumber,\r\n nextPage: currentPageNumber + 1,\r\n };\r\n }\r\n }\r\n\r\n // static isNodeEnv = isNodeEnv;\r\n\r\n static downloadChunkSize = downloadChunkSize;\r\n\r\n /**\r\n * Converts a response to a reference object\r\n *\r\n * @param {Object} responseData - Response object\r\n * @returns {ReferenceObject}\r\n */\r\n static convertToReferenceObject(responseData: any): Core.ReferenceObject {\r\n const result = /\\/(\\w+)\\(([0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12})/i.exec(responseData[\"@odata.id\"]);\r\n return { id: result![2], collection: result![1], oDataContext: responseData[\"@odata.context\"] };\r\n }\r\n\r\n /**\r\n * Checks whether the value is JS Null.\r\n * @param {Object} value\r\n * @returns {boolean}\r\n */\r\n static isNull(value: any): boolean {\r\n return typeof value === \"undefined\" || value == null;\r\n }\r\n\r\n /** Generates UUID */\r\n static generateUUID(): string {\r\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) => (c ^ (generateRandomBytes()[0] & (15 >> (c / 4)))).toString(16));\r\n }\r\n\r\n static getXrmContext(): any {\r\n if (typeof GetGlobalContext !== \"undefined\") {\r\n return GetGlobalContext();\r\n } else {\r\n if (typeof Xrm !== \"undefined\") {\r\n //d365 v.9.0\r\n if (!Utility.isNull(Xrm.Utility) && !Utility.isNull(Xrm.Utility.getGlobalContext)) {\r\n return Xrm.Utility.getGlobalContext();\r\n } else if (!Utility.isNull(Xrm.Page) && !Utility.isNull(Xrm.Page.context)) {\r\n return Xrm.Page.context;\r\n }\r\n }\r\n }\r\n\r\n throw new Error(\r\n \"Xrm Context is not available. In most cases, it can be resolved by adding a reference to a ClientGlobalContext.js.aspx. Please refer to MSDN documentation for more details.\"\r\n );\r\n }\r\n\r\n // static getXrmUtility(): any {\r\n // return typeof Xrm !== \"undefined\" ? Xrm.Utility : null;\r\n // }\r\n\r\n static getClientUrl(): string {\r\n const context = Utility.getXrmContext();\r\n\r\n let clientUrl = context.getClientUrl();\r\n\r\n if (clientUrl.match(/\\/$/)) {\r\n clientUrl = clientUrl.substring(0, clientUrl.length - 1);\r\n }\r\n return clientUrl;\r\n }\r\n\r\n /**\r\n * Checks whether the app is currently running in a Dynamics Portals Environment.\r\n *\r\n * In that case we switch to the Web API for Dynamics Portals.\r\n * @returns {boolean}\r\n */\r\n static isRunningWithinPortals(): boolean {\r\n return global.DWA_BROWSER ? !!global.window.shell : false;\r\n }\r\n\r\n static isObject(obj: any): boolean {\r\n return typeof obj === \"object\" && !!obj && !Array.isArray(obj) && Object.prototype.toString.call(obj) !== \"[object Date]\";\r\n }\r\n\r\n static copyObject(src: any, excludeProps?: string[]): T {\r\n let target = {};\r\n for (let prop in src) {\r\n if (src.hasOwnProperty(prop) && !excludeProps?.includes(prop)) {\r\n // if the value is a nested object, recursively copy all its properties\r\n if (Utility.isObject(src[prop])) {\r\n target[prop] = Utility.copyObject(src[prop]);\r\n } else if (Array.isArray(src[prop])) {\r\n target[prop] = src[prop].slice();\r\n } else {\r\n target[prop] = src[prop];\r\n }\r\n }\r\n }\r\n return target;\r\n }\r\n\r\n static copyRequest(src: any, excludeProps: string[] = []): Core.InternalRequest {\r\n //todo: do we need to include \"data\" in here?\r\n if (!excludeProps.includes(\"signal\")) excludeProps.push(\"signal\");\r\n\r\n const result = Utility.copyObject(src, excludeProps);\r\n result.signal = src.signal;\r\n\r\n return result;\r\n }\r\n\r\n static setFileChunk(request: Core.InternalRequest, fileBuffer: Uint8Array | Buffer, chunkSize: number, offset: number): void {\r\n offset = offset || 0;\r\n\r\n const count = offset + chunkSize > fileBuffer.length ? fileBuffer.length % chunkSize : chunkSize;\r\n\r\n let content: any;\r\n\r\n if (global.DWA_BROWSER) {\r\n content = new Uint8Array(count);\r\n for (let i = 0; i < count; i++) {\r\n content[i] = fileBuffer[offset + i];\r\n }\r\n } else {\r\n content = fileBuffer.slice(offset, offset + count);\r\n }\r\n\r\n request.data = content;\r\n request.contentRange = \"bytes \" + offset + \"-\" + (offset + count - 1) + \"/\" + fileBuffer.length;\r\n }\r\n\r\n static convertToFileBuffer(binaryString: string): Uint8Array | Buffer {\r\n if (!global.DWA_BROWSER) return Buffer.from(binaryString, \"binary\");\r\n\r\n const bytes = new Uint8Array(binaryString.length);\r\n for (var i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n return bytes;\r\n }\r\n}\r\n", "\uFEFFimport { AccessToken } from \"../dynamics-web-api\";\r\nimport { extractUuid } from \"./Regex\";\r\n\r\nexport interface DynamicsWebApiError extends Error {\r\n status: number;\r\n}\r\n\r\nfunction throwParameterError(functionName: string, parameterName: string, type: string | null | undefined): void {\r\n throw new Error(\r\n type ? `${functionName} requires a ${parameterName} parameter to be of type ${type}.` : `${functionName} requires a ${parameterName} parameter.`\r\n );\r\n}\r\n\r\nexport class ErrorHelper {\r\n static handleErrorResponse(req): void {\r\n throw new Error(`Error: ${req.status}: ${req.message}`);\r\n }\r\n\r\n static parameterCheck(parameter: any, functionName: string, parameterName: string, type?: string): void {\r\n if (typeof parameter === \"undefined\" || parameter === null || parameter === \"\") {\r\n throwParameterError(functionName, parameterName, type);\r\n }\r\n }\r\n\r\n static stringParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter !== \"string\") {\r\n throwParameterError(functionName, parameterName, \"String\");\r\n }\r\n }\r\n\r\n static maxLengthStringParameterCheck(parameter: string | null, functionName: string, parameterName: string, maxLength: number): void {\r\n if (!parameter) return;\r\n\r\n if (parameter.length > maxLength) {\r\n throw new Error(`${parameterName} has a ${maxLength} character limit.`);\r\n }\r\n }\r\n\r\n static arrayParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (parameter.constructor !== Array) {\r\n throwParameterError(functionName, parameterName, \"Array\");\r\n }\r\n }\r\n\r\n static stringOrArrayParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (parameter.constructor !== Array && typeof parameter !== \"string\") {\r\n throwParameterError(functionName, parameterName, \"String or Array\");\r\n }\r\n }\r\n\r\n static numberParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter != \"number\") {\r\n if (typeof parameter === \"string\" && parameter) {\r\n if (!isNaN(parseInt(parameter))) {\r\n return;\r\n }\r\n }\r\n throwParameterError(functionName, parameterName, \"Number\");\r\n }\r\n }\r\n\r\n static batchIsEmpty(): Error[] {\r\n return [\r\n new Error(\r\n \"Payload of the batch operation is empty. Please make that you have other operations in between startBatch() and executeBatch() to successfuly build a batch payload.\"\r\n ),\r\n ];\r\n }\r\n\r\n static handleHttpError(parsedError: any, parameters?: any): DynamicsWebApiError {\r\n const error = new Error();\r\n\r\n Object.keys(parsedError).forEach((k) => {\r\n error[k] = parsedError[k];\r\n });\r\n\r\n if (parameters) {\r\n Object.keys(parameters).forEach((k) => {\r\n error[k] = parameters[k];\r\n });\r\n }\r\n\r\n return error;\r\n }\r\n\r\n static boolParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter != \"boolean\") {\r\n throwParameterError(functionName, parameterName, \"Boolean\");\r\n }\r\n }\r\n\r\n /**\r\n * Private function used to check whether required parameter is a valid GUID\r\n * @param parameter The GUID parameter to check\r\n * @param functionName\r\n * @param parameterName\r\n * @returns\r\n */\r\n static guidParameterCheck(parameter: any, functionName: string, parameterName: string): string {\r\n const match = extractUuid(parameter);\r\n if (!match) throwParameterError(functionName, parameterName, \"GUID String\");\r\n\r\n return match!;\r\n }\r\n\r\n static keyParameterCheck(parameter: any, functionName: string, parameterName: string): string | undefined {\r\n try {\r\n ErrorHelper.stringParameterCheck(parameter, functionName, parameterName);\r\n\r\n //check if the param is a guid\r\n const match = extractUuid(parameter);\r\n if (match) return match;\r\n\r\n //check the alternate key\r\n const alternateKeys = parameter.split(\",\");\r\n\r\n if (alternateKeys.length) {\r\n for (let i = 0; i < alternateKeys.length; i++) {\r\n alternateKeys[i] = alternateKeys[i].trim().replace(/\"/g, \"'\");\r\n /^[\\w\\d\\_]+\\=(.+)$/i.exec(alternateKeys[i])![0];\r\n }\r\n }\r\n\r\n return alternateKeys.join(\",\");\r\n } catch (error) {\r\n throwParameterError(functionName, parameterName, \"String representing GUID or Alternate Key\");\r\n }\r\n }\r\n\r\n static callbackParameterCheck(callbackParameter: () => Promise, functionName: string, parameterName: string): void {\r\n if (typeof callbackParameter != \"function\") {\r\n throwParameterError(functionName, parameterName, \"Function\");\r\n }\r\n }\r\n\r\n static throwBatchIncompatible(functionName: string, isBatch: boolean): void {\r\n if (isBatch) {\r\n isBatch = false;\r\n throw new Error(functionName + \" cannot be used in a BATCH request.\");\r\n }\r\n }\r\n\r\n static throwBatchNotStarted(isBatch: boolean): void {\r\n if (!isBatch) {\r\n throw new Error(\r\n \"Batch operation has not been started. Please call a DynamicsWebApi.startBatch() function prior to calling DynamicsWebApi.executeBatch() to perform a batch request correctly.\"\r\n );\r\n }\r\n }\r\n}\r\n", "class DWA {\r\n\tstatic Prefer = class {\r\n\t\tstatic ReturnRepresentation: string = \"return=representation\";\r\n\t\tstatic Annotations = class {\r\n\t\t\tstatic AssociatedNavigationProperty: string = \"Microsoft.Dynamics.CRM.associatednavigationproperty\";\r\n\t\t\tstatic LookupLogicalName: string = \"Microsoft.Dynamics.CRM.lookuplogicalname\";\r\n\t\t\tstatic All: string = \"*\";\r\n\t\t\tstatic FormattedValue: string = \"OData.Community.Display.V1.FormattedValue\";\r\n\t\t\tstatic FetchXmlPagingCookie: string = \"Microsoft.Dynamics.CRM.fetchxmlpagingcookie\";\r\n\t\t};\r\n\t\tstatic IncludeAnnotations: string = \"odata.include-annotations\";\r\n\t\tstatic get(annotation: string) {\r\n\t\t\treturn `${DWA.Prefer.IncludeAnnotations}=\"${annotation}\"`;\r\n\t\t}\r\n\t};\r\n}\r\n\r\nexport { DWA };\r\n", "\uFEFFexport function dateReviver(key: string, value: any): Date {\r\n\tif (typeof value === \"string\") {\r\n\t\tconst a = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:Z|[-+]\\d{2}:\\d{2})$/.exec(value);\r\n\t\tif (a) {\r\n\t\t\treturn new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));\r\n\t\t}\r\n\t}\r\n\treturn value;\r\n}\r\n", "\uFEFFimport { DWA } from \"../../dwa\";\r\nimport { Utility } from \"../../utils/Utility\";\r\nimport { ErrorHelper, DynamicsWebApiError } from \"../../helpers/ErrorHelper\";\r\nimport { dateReviver } from \"./dateReviver\";\r\nimport { Core } from \"../../types\";\r\nimport { extractUuidFromUrl } from \"../../helpers/Regex\";\r\n\r\nfunction getFormattedKeyValue(keyName: string, value: any): any[] {\r\n let newKey: string | null = null;\r\n if (keyName.indexOf(\"@\") !== -1) {\r\n const format = keyName.split(\"@\");\r\n switch (format[1]) {\r\n case \"odata.context\":\r\n newKey = \"oDataContext\";\r\n break;\r\n case \"odata.count\":\r\n newKey = \"oDataCount\";\r\n value = value != null ? parseInt(value) : 0;\r\n break;\r\n case \"odata.nextLink\":\r\n newKey = \"oDataNextLink\";\r\n break;\r\n case \"odata.deltaLink\":\r\n newKey = \"oDataDeltaLink\";\r\n break;\r\n case DWA.Prefer.Annotations.FormattedValue:\r\n newKey = format[0] + \"_Formatted\";\r\n break;\r\n case DWA.Prefer.Annotations.AssociatedNavigationProperty:\r\n newKey = format[0] + \"_NavigationProperty\";\r\n break;\r\n case DWA.Prefer.Annotations.LookupLogicalName:\r\n newKey = format[0] + \"_LogicalName\";\r\n break;\r\n }\r\n }\r\n\r\n return [newKey, value];\r\n}\r\n\r\n/**\r\n *\r\n * @param {any} object - parsed JSON object\r\n * @param {any} parseParams - parameters for parsing the response\r\n * @returns {any} parsed batch response\r\n */\r\nfunction parseData(object: any, parseParams?: any): any {\r\n if (parseParams) {\r\n if (parseParams.isRef && object[\"@odata.id\"] != null) {\r\n return Utility.convertToReferenceObject(object);\r\n }\r\n\r\n if (parseParams.toCount) {\r\n return getFormattedKeyValue(\"@odata.count\", object[\"@odata.count\"])[1] || 0;\r\n }\r\n }\r\n\r\n const keys = Object.keys(object);\r\n\r\n for (let i = 0; i < keys.length; i++) {\r\n const currentKey = keys[i];\r\n\r\n if (object[currentKey] != null) {\r\n if (object[currentKey].constructor === Array) {\r\n for (var j = 0; j < object[currentKey].length; j++) {\r\n object[currentKey][j] = parseData(object[currentKey][j]);\r\n }\r\n } else if (typeof object[currentKey] === \"object\") {\r\n parseData(object[currentKey]);\r\n }\r\n }\r\n\r\n //parse formatted values\r\n let formattedKeyValue = getFormattedKeyValue(currentKey, object[currentKey]);\r\n if (formattedKeyValue[0]) {\r\n object[formattedKeyValue[0]] = formattedKeyValue[1];\r\n }\r\n\r\n //parse aliased values\r\n if (currentKey.indexOf(\"_x002e_\") !== -1) {\r\n const aliasKeys = currentKey.split(\"_x002e_\");\r\n\r\n if (!object.hasOwnProperty(aliasKeys[0])) {\r\n object[aliasKeys[0]] = { _dwaType: \"alias\" };\r\n }\r\n //throw an error if there is already a property which is not an 'alias'\r\n else if (\r\n typeof object[aliasKeys[0]] !== \"object\" ||\r\n (typeof object[aliasKeys[0]] === \"object\" && !object[aliasKeys[0]].hasOwnProperty(\"_dwaType\"))\r\n ) {\r\n throw new Error(\"The alias name of the linked entity must be unique!\");\r\n }\r\n\r\n object[aliasKeys[0]][aliasKeys[1]] = object[currentKey];\r\n\r\n //aliases also contain formatted values\r\n formattedKeyValue = getFormattedKeyValue(aliasKeys[1], object[currentKey]);\r\n if (formattedKeyValue[0]) {\r\n object[aliasKeys[0]][formattedKeyValue[0]] = formattedKeyValue[1];\r\n }\r\n }\r\n }\r\n\r\n if (parseParams) {\r\n if (parseParams.hasOwnProperty(\"pageNumber\") && object[\"@\" + DWA.Prefer.Annotations.FetchXmlPagingCookie] != null) {\r\n object.PagingInfo = Utility.getFetchXmlPagingCookie(object[\"@\" + DWA.Prefer.Annotations.FetchXmlPagingCookie], parseParams.pageNumber);\r\n }\r\n }\r\n\r\n return object;\r\n}\r\n\r\nconst responseHeaderRegex = /^([^()<>@,;:\\\\\"\\/[\\]?={} \\t]+)\\s?:\\s?(.*)/;\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction parseBatchHeaders(text: string): any {\r\n const ctx = { position: 0 };\r\n const headers = {};\r\n let parts;\r\n let line;\r\n let pos;\r\n\r\n do {\r\n pos = ctx.position;\r\n line = readLine(text, ctx);\r\n parts = responseHeaderRegex.exec(line);\r\n if (parts !== null) {\r\n headers[parts[1].toLowerCase()] = parts[2];\r\n } else {\r\n // Whatever was found is not a header, so reset the context position.\r\n ctx.position = pos;\r\n }\r\n } while (line && parts);\r\n\r\n return headers;\r\n}\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction readLine(text: string, ctx: { position: number }): string | null {\r\n return readTo(text, ctx, \"\\r\\n\");\r\n}\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction readTo(text: string, ctx: { position: number }, str: string): string | null {\r\n const start = ctx.position || 0;\r\n let end = text.length;\r\n if (str) {\r\n end = text.indexOf(str, start);\r\n if (end === -1) {\r\n return null;\r\n }\r\n ctx.position = end + str.length;\r\n } else {\r\n ctx.position = end;\r\n }\r\n\r\n return text.substring(start, end);\r\n}\r\n\r\n//partially taken from https://github.com/emiltholin/google-api-batch-utils\r\n/**\r\n *\r\n * @param {string} response - response that needs to be parsed\r\n * @param {Array} parseParams - parameters for parsing the response\r\n * @param {Number} [requestNumber] - number of the request\r\n * @returns {any} parsed batch response\r\n */\r\nfunction parseBatchResponse(response: string, parseParams: any, requestNumber: number = 0): (string | undefined | DynamicsWebApiError | Number)[] {\r\n // Not the same delimiter in the response as we specify ourselves in the request,\r\n // so we have to extract it.\r\n const delimiter = response.substr(0, response.indexOf(\"\\r\\n\"));\r\n const batchResponseParts = response.split(delimiter);\r\n // The first part will always be an empty string. Just remove it.\r\n batchResponseParts.shift();\r\n // The last part will be the \"--\". Just remove it.\r\n batchResponseParts.pop();\r\n\r\n let result: (string | undefined | DynamicsWebApiError | Number)[] = [];\r\n for (let i = 0; i < batchResponseParts.length; i++) {\r\n let batchResponse = batchResponseParts[i];\r\n if (batchResponse.indexOf(\"--changesetresponse_\") > -1) {\r\n batchResponse = batchResponse.trim();\r\n const batchToProcess = batchResponse.substring(batchResponse.indexOf(\"\\r\\n\") + 1).trim();\r\n\r\n result = result.concat(parseBatchResponse(batchToProcess, parseParams, requestNumber));\r\n } else {\r\n //check http status\r\n const httpStatusReg = /HTTP\\/?\\s*[\\d.]*\\s+(\\d{3})\\s+([\\w\\s]*)$/gm.exec(batchResponse);\r\n //todo: add error handler for httpStatus and httpStatusMessage; remove \"!\" operator\r\n const httpStatus = parseInt(httpStatusReg![1]);\r\n const httpStatusMessage = httpStatusReg![2].trim();\r\n\r\n const responseData = batchResponse.substring(batchResponse.indexOf(\"{\"), batchResponse.lastIndexOf(\"}\") + 1);\r\n\r\n if (!responseData) {\r\n if (/Content-Type: text\\/plain/i.test(batchResponse)) {\r\n const plainContentReg = /\\w+$/gi.exec(batchResponse.trim());\r\n const plainContent = plainContentReg && plainContentReg.length ? plainContentReg[0] : undefined;\r\n\r\n //check if a plain content is a number or not\r\n result.push(isNaN(Number(plainContent)) ? plainContent : Number(plainContent));\r\n } else {\r\n if (parseParams.length && parseParams[requestNumber] && parseParams[requestNumber].hasOwnProperty(\"valueIfEmpty\")) {\r\n result.push(parseParams[requestNumber].valueIfEmpty);\r\n } else {\r\n const entityUrl = /OData-EntityId.+/i.exec(batchResponse);\r\n\r\n if (entityUrl && entityUrl.length) {\r\n const guidResult = extractUuidFromUrl(entityUrl[0]);\r\n result.push(guidResult ? guidResult : undefined);\r\n } else {\r\n result.push(undefined);\r\n }\r\n }\r\n }\r\n } else {\r\n const parsedResponse = parseData(JSON.parse(responseData, dateReviver), parseParams[requestNumber]);\r\n\r\n if (httpStatus >= 400) {\r\n const responseHeaders = parseBatchHeaders(\r\n //todo: add error handler for httpStatusReg; remove \"!\" operator\r\n batchResponse.substring(batchResponse.indexOf(httpStatusReg![0]) + httpStatusReg![0].length + 1, batchResponse.indexOf(\"{\"))\r\n );\r\n\r\n result.push(\r\n ErrorHelper.handleHttpError(parsedResponse, {\r\n status: httpStatus,\r\n statusText: httpStatusMessage,\r\n statusMessage: httpStatusMessage,\r\n headers: responseHeaders,\r\n })\r\n );\r\n } else {\r\n result.push(parsedResponse);\r\n }\r\n }\r\n }\r\n\r\n requestNumber++;\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction base64ToString(base64: string): string {\r\n return global.DWA_BROWSER ? global.window.atob(base64) : Buffer.from(base64, \"base64\").toString(\"binary\");\r\n}\r\n\r\nfunction parseFileResponse(response: any, responseHeaders: any, parseParams: any): Core.FileParseResult {\r\n let data = response;\r\n\r\n if (parseParams.hasOwnProperty(\"parse\")) {\r\n data = JSON.parse(data).value;\r\n data = base64ToString(data);\r\n }\r\n\r\n var parseResult: Core.FileParseResult = {\r\n value: data,\r\n };\r\n\r\n if (responseHeaders[\"x-ms-file-name\"]) parseResult.fileName = responseHeaders[\"x-ms-file-name\"];\r\n\r\n if (responseHeaders[\"x-ms-file-size\"]) parseResult.fileSize = parseInt(responseHeaders[\"x-ms-file-size\"]);\r\n\r\n if (hasHeader(responseHeaders, \"Location\")) parseResult.location = getHeader(responseHeaders, \"Location\");\r\n\r\n return parseResult;\r\n}\r\n\r\nfunction hasHeader(headers: any, name: string): boolean {\r\n return headers.hasOwnProperty(name) || headers.hasOwnProperty(name.toLowerCase());\r\n}\r\n\r\nfunction getHeader(headers: any, name: string): string {\r\n if (headers[name]) return headers[name];\r\n\r\n return headers[name.toLowerCase()];\r\n}\r\n\r\n/**\r\n *\r\n * @param {string} response - response that needs to be parsed\r\n * @param {Array} responseHeaders - response headers\r\n * @param {Array} parseParams - parameters for parsing the response\r\n * @returns {any} parsed response\r\n */\r\nexport function parseResponse(response: string, responseHeaders: any, parseParams: any[]): any {\r\n let parseResult: any = undefined;\r\n if (response.length) {\r\n if (response.indexOf(\"--batchresponse_\") > -1) {\r\n const batch = parseBatchResponse(response, parseParams);\r\n\r\n parseResult = parseParams.length === 1 && parseParams[0].convertedToBatch ? batch[0] : batch;\r\n } else {\r\n if (hasHeader(responseHeaders, \"Content-Disposition\")) {\r\n parseResult = parseFileResponse(response, responseHeaders, parseParams[0]);\r\n } else {\r\n const contentType = getHeader(responseHeaders, \"Content-Type\");\r\n if (contentType.startsWith(\"application/json\")) {\r\n parseResult = parseData(JSON.parse(response, dateReviver), parseParams[0]);\r\n } else {\r\n parseResult = isNaN(Number(response)) ? response : Number(response);\r\n }\r\n }\r\n }\r\n } else {\r\n if (parseParams.length && parseParams[0].hasOwnProperty(\"valueIfEmpty\")) {\r\n parseResult = parseParams[0].valueIfEmpty;\r\n } else if (hasHeader(responseHeaders, \"OData-EntityId\")) {\r\n const entityUrl = getHeader(responseHeaders, \"OData-EntityId\");\r\n\r\n const guidResult = extractUuidFromUrl(entityUrl);\r\n\r\n if (guidResult) {\r\n parseResult = guidResult;\r\n }\r\n } else if (hasHeader(responseHeaders, \"Location\")) {\r\n parseResult = {\r\n location: getHeader(responseHeaders, \"Location\"),\r\n };\r\n\r\n if (responseHeaders[\"x-ms-chunk-size\"]) parseResult.chunkSize = parseInt(responseHeaders[\"x-ms-chunk-size\"]);\r\n }\r\n }\r\n\r\n return parseResult;\r\n}\r\n", "\uFEFFexport function parseResponseHeaders(headerStr: string): any {\r\n\tconst headers = {};\r\n\tif (!headerStr) {\r\n\t\treturn headers;\r\n\t}\r\n\tconst headerPairs = headerStr.split(\"\\u000d\\u000a\");\r\n\tfor (let i = 0, ilen = headerPairs.length; i < ilen; i++) {\r\n\t\tconst headerPair = headerPairs[i];\r\n\t\tconst index = headerPair.indexOf(\"\\u003a\\u0020\");\r\n\t\tif (index > 0) {\r\n\t\t\theaders[headerPair.substring(0, index)] = headerPair.substring(index + 2);\r\n\t\t}\r\n\t}\r\n\treturn headers;\r\n}\r\n", "\uFEFFimport { Core } from \"../types\";\r\nimport { ErrorHelper } from \"./../helpers/ErrorHelper\";\r\nimport { parseResponse } from \"./helpers/parseResponse\";\r\nimport { parseResponseHeaders } from \"./helpers/parseResponseHeaders\";\r\n\r\nexport function executeRequest(options: Core.RequestOptions): Promise {\r\n return new Promise((resolve, reject) => {\r\n _executeRequest(options, resolve, reject);\r\n });\r\n}\r\n\r\nfunction _executeRequest(\r\n options: Core.RequestOptions,\r\n successCallback: (response: Core.WebApiResponse) => void,\r\n errorCallback: (error: Core.WebApiErrorResponse | Core.WebApiErrorResponse[]) => void\r\n) {\r\n const data = options.data;\r\n const additionalHeaders = options.additionalHeaders;\r\n const responseParams = options.responseParams;\r\n const signal = options.abortSignal;\r\n\r\n if (signal?.aborted) {\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n name: \"AbortError\",\r\n code: 20,\r\n message: \"The user aborted a request.\",\r\n })\r\n );\r\n\r\n return;\r\n }\r\n\r\n let request = new XMLHttpRequest();\r\n request.open(options.method, options.uri, options.isAsync || false);\r\n\r\n //set additional headers\r\n for (let key in additionalHeaders) {\r\n request.setRequestHeader(key, additionalHeaders[key]);\r\n }\r\n\r\n request.onreadystatechange = function () {\r\n if (request.readyState === 4) {\r\n if (signal) signal.removeEventListener(\"abort\", abort);\r\n\r\n switch (request.status) {\r\n case 200: // Success with content returned in response body.\r\n case 201: // Success with content returned in response body.\r\n case 204: // Success with no content returned in response body.\r\n case 206: // Success with partial content.\r\n case 304: {\r\n // Success with Not Modified\r\n const responseHeaders = parseResponseHeaders(request.getAllResponseHeaders());\r\n const responseData = parseResponse(request.responseText, responseHeaders, responseParams[options.requestId]);\r\n\r\n const response = {\r\n data: responseData,\r\n headers: responseHeaders,\r\n status: request.status,\r\n };\r\n\r\n request = null as any;\r\n\r\n successCallback(response);\r\n break;\r\n }\r\n case 0:\r\n break; //response will be handled by onerror\r\n default:\r\n if (!request) break; //response was handled somewhere else\r\n\r\n // All other statuses are error cases.\r\n let error;\r\n let headers;\r\n try {\r\n headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n const errorParsed = parseResponse(request.responseText, headers, responseParams[options.requestId]);\r\n\r\n if (Array.isArray(errorParsed)) {\r\n errorCallback(errorParsed);\r\n break;\r\n }\r\n\r\n error = errorParsed.error;\r\n } catch (e) {\r\n if (request.response.length > 0) {\r\n error = { message: request.response };\r\n } else {\r\n error = { message: \"Unexpected Error\" };\r\n }\r\n }\r\n\r\n const errorParameters = {\r\n status: request.status,\r\n statusText: request.statusText,\r\n headers: headers,\r\n };\r\n\r\n request = null as any;\r\n\r\n errorCallback(ErrorHelper.handleHttpError(error, errorParameters));\r\n\r\n break;\r\n }\r\n }\r\n };\r\n\r\n if (options.timeout) {\r\n request.timeout = options.timeout;\r\n }\r\n\r\n request.onerror = function () {\r\n const headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n status: request.status,\r\n statusText: request.statusText,\r\n message: request.responseText || \"Network Error\",\r\n headers: headers,\r\n })\r\n );\r\n request = null as any;\r\n };\r\n\r\n request.ontimeout = function () {\r\n const headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n name: \"TimeoutError\",\r\n status: request.status,\r\n statusText: request.statusText,\r\n message: request.responseText || \"Request Timed Out\",\r\n headers: headers,\r\n })\r\n );\r\n request = null as any;\r\n };\r\n\r\n //browser abort\r\n request.onabort = function () {\r\n if (!request) return;\r\n\r\n const headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n status: request.status,\r\n statusText: request.statusText,\r\n message: \"Request aborted\",\r\n headers: headers,\r\n })\r\n );\r\n request = null as any;\r\n };\r\n\r\n //manual abort/cancellation\r\n const abort = () => {\r\n if (!request) return;\r\n\r\n const headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n name: \"AbortError\",\r\n code: 20,\r\n status: request.status,\r\n statusText: request.statusText,\r\n message: \"The user aborted a request.\",\r\n headers: headers,\r\n })\r\n );\r\n\r\n request.abort();\r\n\r\n request = null as any;\r\n };\r\n\r\n if (signal) {\r\n signal.addEventListener(\"abort\", abort);\r\n }\r\n\r\n data ? request.send(data) : request.send();\r\n\r\n //called for testing\r\n if (XhrWrapper.afterSendEvent) XhrWrapper.afterSendEvent();\r\n}\r\n\r\n/**\r\n * Sends a request to given URL with given parameters\r\n */\r\nexport class XhrWrapper {\r\n //for testing\r\n static afterSendEvent: () => void;\r\n}\r\n", "import { Utility } from \"./Utility\";\r\nimport { ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { ApiConfig, Config } from \"../dynamics-web-api\";\r\n\r\ntype ApiType = \"dataApi\" | \"searchApi\";\r\n\r\nexport interface InternalApiConfig extends ApiConfig {\r\n url: string;\r\n}\r\n\r\nexport interface InternalConfig extends Config {\r\n dataApi: InternalApiConfig;\r\n searchApi: InternalApiConfig;\r\n}\r\n\r\nconst getApiUrl = (serverUrl: string | undefined | null, apiConfig: ApiConfig): string => {\r\n if (Utility.isRunningWithinPortals()) {\r\n return new URL(\"_api\", global.window.location.origin).toString() + \"/\";\r\n } else {\r\n if (!serverUrl) serverUrl = Utility.getClientUrl();\r\n return new URL(`api/${apiConfig.path}/v${apiConfig.version}`, serverUrl).toString() + \"/\";\r\n }\r\n};\r\n\r\nconst mergeApiConfigs = (apiConfig: ApiConfig | undefined, apiType: ApiType, internalConfig: InternalConfig): void => {\r\n const internalApiConfig = internalConfig[apiType] as InternalApiConfig;\r\n\r\n if (apiConfig?.version) {\r\n ErrorHelper.stringParameterCheck(apiConfig.version, \"DynamicsWebApi.setConfig\", `config.${apiType}.version`);\r\n internalApiConfig.version = apiConfig.version;\r\n }\r\n\r\n if (apiConfig?.path) {\r\n ErrorHelper.stringParameterCheck(apiConfig.path, \"DynamicsWebApi.setConfig\", `config.${apiType}.path`);\r\n internalApiConfig.path = apiConfig.path;\r\n }\r\n\r\n internalApiConfig.url = getApiUrl(internalConfig.serverUrl, internalApiConfig);\r\n};\r\n\r\nexport class ConfigurationUtility {\r\n static mergeApiConfigs = mergeApiConfigs;\r\n\r\n static merge(internalConfig: InternalConfig, config?: Config): void {\r\n if (config?.serverUrl) {\r\n ErrorHelper.stringParameterCheck(config.serverUrl, \"DynamicsWebApi.setConfig\", \"config.serverUrl\");\r\n internalConfig.serverUrl = config.serverUrl;\r\n }\r\n\r\n mergeApiConfigs(config?.dataApi, \"dataApi\", internalConfig);\r\n mergeApiConfigs(config?.searchApi, \"searchApi\", internalConfig);\r\n\r\n if (config?.impersonate) {\r\n internalConfig.impersonate = ErrorHelper.guidParameterCheck(config.impersonate, \"DynamicsWebApi.setConfig\", \"config.impersonate\");\r\n }\r\n\r\n if (config?.impersonateAAD) {\r\n internalConfig.impersonateAAD = ErrorHelper.guidParameterCheck(config.impersonateAAD, \"DynamicsWebApi.setConfig\", \"config.impersonateAAD\");\r\n }\r\n\r\n if (config?.onTokenRefresh) {\r\n ErrorHelper.callbackParameterCheck(config.onTokenRefresh, \"DynamicsWebApi.setConfig\", \"config.onTokenRefresh\");\r\n internalConfig.onTokenRefresh = config.onTokenRefresh;\r\n }\r\n\r\n if (config?.includeAnnotations) {\r\n ErrorHelper.stringParameterCheck(config.includeAnnotations, \"DynamicsWebApi.setConfig\", \"config.includeAnnotations\");\r\n internalConfig.includeAnnotations = config.includeAnnotations;\r\n }\r\n\r\n if (config?.timeout) {\r\n ErrorHelper.numberParameterCheck(config.timeout, \"DynamicsWebApi.setConfig\", \"config.timeout\");\r\n internalConfig.timeout = config.timeout;\r\n }\r\n\r\n if (config?.maxPageSize) {\r\n ErrorHelper.numberParameterCheck(config.maxPageSize, \"DynamicsWebApi.setConfig\", \"config.maxPageSize\");\r\n internalConfig.maxPageSize = config.maxPageSize;\r\n }\r\n\r\n if (config?.returnRepresentation) {\r\n ErrorHelper.boolParameterCheck(config.returnRepresentation, \"DynamicsWebApi.setConfig\", \"config.returnRepresentation\");\r\n internalConfig.returnRepresentation = config.returnRepresentation;\r\n }\r\n\r\n if (config?.useEntityNames) {\r\n ErrorHelper.boolParameterCheck(config.useEntityNames, \"DynamicsWebApi.setConfig\", \"config.useEntityNames\");\r\n internalConfig.useEntityNames = config.useEntityNames;\r\n }\r\n\r\n if (config?.headers) {\r\n internalConfig.headers = config.headers;\r\n }\r\n\r\n if (!global.DWA_BROWSER && config?.proxy) {\r\n ErrorHelper.parameterCheck(config.proxy, \"DynamicsWebApi.setConfig\", \"config.proxy\");\r\n\r\n if (config.proxy.url) {\r\n ErrorHelper.stringParameterCheck(config.proxy.url, \"DynamicsWebApi.setConfig\", \"config.proxy.url\");\r\n\r\n if (config.proxy.auth) {\r\n ErrorHelper.parameterCheck(config.proxy.auth, \"DynamicsWebApi.setConfig\", \"config.proxy.auth\");\r\n ErrorHelper.stringParameterCheck(config.proxy.auth.username, \"DynamicsWebApi.setConfig\", \"config.proxy.auth.username\");\r\n ErrorHelper.stringParameterCheck(config.proxy.auth.password, \"DynamicsWebApi.setConfig\", \"config.proxy.auth.password\");\r\n }\r\n }\r\n\r\n internalConfig.proxy = config.proxy;\r\n }\r\n }\r\n\r\n static default(): InternalConfig {\r\n return {\r\n serverUrl: null,\r\n impersonate: null,\r\n impersonateAAD: null,\r\n onTokenRefresh: null,\r\n includeAnnotations: null,\r\n maxPageSize: null,\r\n returnRepresentation: null,\r\n proxy: null,\r\n dataApi: {\r\n path: \"data\",\r\n version: \"9.2\",\r\n url: \"\"\r\n },\r\n searchApi: {\r\n path: \"search\",\r\n version: \"1.0\",\r\n url: \"\"\r\n },\r\n };\r\n }\r\n}\r\n", "\uFEFFimport { ConfigurationUtility } from \"./utils/Config\";\r\nimport { Utility } from \"./utils/Utility\";\r\nimport { ErrorHelper } from \"./helpers/ErrorHelper\";\r\nimport { RequestClient } from \"./client/RequestClient\";\r\nimport type { Core } from \"./types\";\r\n\r\n/**\r\n * Microsoft Dynamics CRM Web API helper library written in JavaScript.\r\n * It is compatible with: Dynamics 365 (online), Dynamics 365 (on-premise), Dynamics CRM 2016, Dynamics CRM Online.\r\n */\r\nexport class DynamicsWebApi {\r\n private _config = ConfigurationUtility.default();\r\n private _isBatch = false;\r\n private _batchRequestId: string | null = null;\r\n\r\n /**\r\n * Initializes a new instance of DynamicsWebApi\r\n * @param config - Configuration object\r\n */\r\n constructor(config?: Config) {\r\n ConfigurationUtility.merge(this._config, config);\r\n }\r\n\r\n /**\r\n\t * Merges provided configuration properties with an existing one.\r\n\t *\r\n\t * @param {DynamicsWebApi.Config} config - Configuration\r\n\t * @example\r\n\t dynamicsWebApi.setConfig({ serverUrl: 'https://contoso.api.crm.dynamics.com/' });\r\n\t */\r\n setConfig = (config: Config) => ConfigurationUtility.merge(this._config, config);\r\n\r\n private _makeRequest = async (request: Core.InternalRequest): Promise => {\r\n request.isBatch = this._isBatch;\r\n if (this._batchRequestId) request.requestId = this._batchRequestId;\r\n return RequestClient.makeRequest(request, this._config);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a new record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n * @example\r\n *const lead = {\r\n * subject: \"Test WebAPI\",\r\n * firstname: \"Test\",\r\n * lastname: \"WebAPI\",\r\n * jobtitle: \"Title\"\r\n *};\r\n *\r\n *const request = {\r\n * data: lead,\r\n * collection: \"leads\",\r\n * returnRepresentation: true\r\n *}\r\n *\r\n *const response = await dynamicsWebApi.create(request);\r\n *\r\n */\r\n create = async (request: CreateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.create\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"create\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"POST\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n * @example\r\n *const request = {\r\n * key: '7d577253-3ef0-4a0a-bb7f-8335c2596e70',\r\n * collection: \"leads\",\r\n * select: [\"fullname\", \"subject\"],\r\n * ifnonematch: 'W/\"468026\"',\r\n * includeAnnotations: \"OData.Community.Display.V1.FormattedValue\"\r\n *};\r\n *\r\n *const response = await dynamicsWebApi.retrieve(request);\r\n */\r\n retrieve = async (request: RetrieveRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieve\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"retrieve\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"GET\";\r\n internalRequest.responseParameters = {\r\n isRef: internalRequest.select?.length === 1 && internalRequest.select[0].endsWith(\"/$ref\"),\r\n };\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n update = async (request: UpdateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.update\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"update\";\r\n } else internalRequest = request;\r\n\r\n //Metadata definitions, cannot be updated using \"PATCH\" method\r\n if (!internalRequest.method)\r\n internalRequest.method = /EntityDefinitions|RelationshipDefinitions|GlobalOptionSetDefinitions/.test(internalRequest.collection || \"\")\r\n ? \"PUT\"\r\n : \"PATCH\";\r\n\r\n internalRequest.responseParameters = { valueIfEmpty: true };\r\n\r\n if (internalRequest.ifmatch == null) {\r\n internalRequest.ifmatch = \"*\"; //to prevent upsert\r\n }\r\n\r\n //copy locally\r\n const ifmatch = internalRequest.ifmatch;\r\n\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifmatch && error.status === 412) {\r\n //precondition failed - not updated\r\n return false; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a single value in the record.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateSingleProperty = async (request: UpdateSinglePropertyRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateSingleProperty\", \"request\");\r\n ErrorHelper.parameterCheck(request.fieldValuePair, \"DynamicsWebApi.updateSingleProperty\", \"request.fieldValuePair\");\r\n\r\n var field = Object.keys(request.fieldValuePair)[0];\r\n var fieldValue = request.fieldValuePair[field];\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.navigationProperty = field;\r\n internalRequest.data = { value: fieldValue };\r\n internalRequest.functionName = \"updateSingleProperty\";\r\n internalRequest.method = \"PUT\";\r\n\r\n delete internalRequest[\"fieldValuePair\"];\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a record.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteRecord = async (request: DeleteRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteRecord\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"deleteRecord\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.responseParameters = { valueIfEmpty: true };\r\n\r\n //copy locally\r\n const ifmatch = internalRequest.ifmatch;\r\n\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifmatch && error.status === 412) {\r\n //precondition failed - not updated\r\n return false; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to upsert a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n upsert = async (request: UpsertRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.upsert\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"PATCH\";\r\n internalRequest.functionName = \"upsert\";\r\n\r\n //copy locally\r\n const ifnonematch = internalRequest.ifnonematch;\r\n const ifmatch = internalRequest.ifmatch;\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifnonematch && error.status === 412) {\r\n //if prevent update\r\n return null; //todo: check this\r\n } else if (ifmatch && error.status === 404) {\r\n //if prevent create\r\n return null; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n private _uploadFileChunk = async (request: Core.InternalRequest, fileBytes: Uint8Array | Buffer, chunkSize: number, offset: number = 0): Promise => {\r\n // offset = offset || 0;\r\n Utility.setFileChunk(request, fileBytes, chunkSize, offset);\r\n\r\n await this._makeRequest(request);\r\n\r\n offset += chunkSize;\r\n if (offset <= fileBytes.length) {\r\n return this._uploadFileChunk(request, fileBytes, chunkSize, offset);\r\n }\r\n };\r\n\r\n /**\r\n * Upload file to a File Attribute\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n */\r\n uploadFile = async (request: UploadRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.uploadFile\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.uploadFile\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request, [\"data\"]);\r\n internalRequest.method = \"PATCH\";\r\n internalRequest.functionName = \"uploadFile\";\r\n internalRequest.transferMode = \"chunked\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n internalRequest.url = response?.data.location;\r\n delete internalRequest.transferMode;\r\n delete internalRequest.fieldName;\r\n delete internalRequest.fileName;\r\n return this._uploadFileChunk(internalRequest, request.data, response?.data.chunkSize);\r\n };\r\n\r\n private _downloadFileChunk = async (\r\n request: Core.InternalRequest,\r\n bytesDownloaded: number = 0,\r\n // fileSize: number = 0,\r\n data: string = \"\"\r\n ): Promise => {\r\n // bytesDownloaded = bytesDownloaded || 0;\r\n // fileSize = fileSize || 0;\r\n // data = data || \"\";\r\n\r\n request.range = \"bytes=\" + bytesDownloaded + \"-\" + (bytesDownloaded + Utility.downloadChunkSize - 1);\r\n request.downloadSize = \"full\";\r\n\r\n const response = await this._makeRequest(request);\r\n\r\n request.url = response?.data.location;\r\n data += response?.data.value;\r\n\r\n bytesDownloaded += Utility.downloadChunkSize;\r\n\r\n if (bytesDownloaded <= response?.data.fileSize) {\r\n return this._downloadFileChunk(request, bytesDownloaded, data);\r\n }\r\n\r\n return {\r\n fileName: response?.data.fileName,\r\n fileSize: response?.data.fileSize,\r\n data: Utility.convertToFileBuffer(data),\r\n };\r\n };\r\n\r\n /**\r\n * Download a file from a File Attribute\r\n * @param request - An object that represents all possible options for a current request.\r\n */\r\n downloadFile = (request: DownloadRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.downloadFile\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.downloadFile\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"downloadFile\";\r\n internalRequest.responseParameters = { parse: true };\r\n\r\n return this._downloadFileChunk(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve records.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @param {string} [nextPageLink] - Use the value of the @odata.nextLink property with a new GET request to return the next page of data. Pass null to retrieveMultipleOptions.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveMultiple = async (request: RetrieveMultipleRequest, nextPageLink?: string): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveMultiple\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"retrieveMultiple\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"GET\";\r\n\r\n if (nextPageLink) {\r\n ErrorHelper.stringParameterCheck(nextPageLink, \"DynamicsWebApi.retrieveMultiple\", \"nextPageLink\");\r\n internalRequest.url = nextPageLink;\r\n }\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n return response?.data;\r\n };\r\n\r\n private _retrieveAllRequest = async (request: RetrieveMultipleRequest, nextPageLink?: string, records: any[] = []): Promise> => {\r\n const response = await this.retrieveMultiple(request, nextPageLink);\r\n records = records.concat(response.value);\r\n\r\n const pageLink = response.oDataNextLink;\r\n\r\n if (pageLink) {\r\n return this._retrieveAllRequest(request, pageLink, records);\r\n }\r\n\r\n const result: AllResponse = { value: records };\r\n\r\n if (response.oDataDeltaLink) {\r\n result[\"@odata.deltaLink\"] = response.oDataDeltaLink;\r\n result.oDataDeltaLink = response.oDataDeltaLink;\r\n }\r\n\r\n return result;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve all records.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAll = (request: RetrieveMultipleRequest): Promise> => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.retrieveAll\", this._isBatch);\r\n return this._retrieveAllRequest(request);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to count records. IMPORTANT! The count value does not represent the total number of entities in the system. It is limited by the maximum number of entities that can be returned. Returns: Number\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n count = async (request: CountRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.count\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"count\";\r\n\r\n if (internalRequest.filter?.length) {\r\n internalRequest.count = true;\r\n } else {\r\n internalRequest.navigationProperty = \"$count\";\r\n }\r\n\r\n internalRequest.responseParameters = { toCount: internalRequest.count };\r\n\r\n //if filter has not been specified then simplify the request\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to count records. Returns: Number\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n countAll = async (request: CountAllRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.countAll\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.countAll\", \"request\");\r\n\r\n const response = await this._retrieveAllRequest(request);\r\n\r\n return response ? (response.value ? response.value.length : 0) : 0;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to execute FetchXml to retrieve records. Returns: DWA.Types.FetchXmlResponse\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n fetch = async (request: FetchXmlRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.fetch\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"fetch\";\r\n\r\n ErrorHelper.stringParameterCheck(internalRequest.fetchXml, \"DynamicsWebApi.fetch\", \"request.fetchXml\");\r\n\r\n //only add paging if there is no top\r\n if (internalRequest.fetchXml && !/^(request: FetchAllRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.fetchAll\", \"request\");\r\n\r\n const _executeFetchXmlAll = async (request: FetchXmlRequest, records: any[] = []): Promise> => {\r\n // records = records || [];\r\n\r\n const response = await this.fetch(request);\r\n\r\n records = records.concat(response.value);\r\n\r\n if (response.PagingInfo) {\r\n request.pageNumber = response.PagingInfo.nextPage;\r\n request.pagingCookie = response.PagingInfo.cookie;\r\n\r\n return _executeFetchXmlAll(request, records);\r\n }\r\n\r\n return { value: records };\r\n };\r\n\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.fetchAll\", this._isBatch);\r\n return _executeFetchXmlAll(request);\r\n };\r\n\r\n /**\r\n * Associate for a collection-valued navigation property. (1:N or N:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n associate = async (request: AssociateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.associate\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"associate\";\r\n\r\n ErrorHelper.stringParameterCheck(request.relatedCollection, \"DynamicsWebApi.associate\", \"request.relatedcollection\");\r\n ErrorHelper.stringParameterCheck(request.relationshipName, \"DynamicsWebApi.associate\", \"request.relationshipName\");\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.associate\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.associate\", \"request.relatedKey\");\r\n\r\n internalRequest.navigationProperty = request.relationshipName + \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n internalRequest.data = { \"@odata.id\": `${request.relatedCollection}(${relatedKey})` };\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Disassociate for a collection-valued navigation property.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n disassociate = async (request: DisassociateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.disassociate\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.functionName = \"disassociate\";\r\n\r\n ErrorHelper.stringParameterCheck(request.relationshipName, \"DynamicsWebApi.disassociate\", \"request.relationshipName\");\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.disassociate\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.disassociate\", \"request.relatedId\");\r\n\r\n internalRequest.key = primaryKey;\r\n internalRequest.navigationProperty = `${request.relationshipName}(${relatedKey})/$ref`;\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Associate for a single-valued navigation property. (1:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n associateSingleValued = async (request: AssociateSingleValuedRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.associateSingleValued\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"PUT\";\r\n internalRequest.functionName = \"associateSingleValued\";\r\n\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.associateSingleValued\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.associateSingleValued\", \"request.relatedKey\");\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, \"DynamicsWebApi.associateSingleValued\", \"request.navigationProperty\");\r\n ErrorHelper.stringParameterCheck(request.relatedCollection, \"DynamicsWebApi.associateSingleValued\", \"request.relatedcollection\");\r\n\r\n internalRequest.navigationProperty += \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n internalRequest.data = { \"@odata.id\": `${request.relatedCollection}(${relatedKey})` };\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Removes a reference to an entity for a single-valued navigation property. (1:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n disassociateSingleValued = async (request: DisassociateSingleValuedRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.disassociateSingleValued\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.functionName = \"disassociateSingleValued\";\r\n\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.disassociateSingleValued\", \"request.primaryKey\");\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, \"DynamicsWebApi.disassociateSingleValued\", \"request.navigationProperty\");\r\n\r\n internalRequest.navigationProperty += \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Calls a Web API function\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n callFunction: CallFunction = async (request: string | BoundFunctionRequest | UnboundFunctionRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.callFunction`, \"request\");\r\n\r\n const getFunctionName = (request: BoundFunctionRequest | UnboundFunctionRequest) => request.name || request.functionName;\r\n\r\n const isObject = typeof request !== \"string\";\r\n const functionName = isObject ? getFunctionName(request) : request;\r\n const parameterName = isObject ? \"request.name\" : \"name\";\r\n const internalRequest: Core.InternalRequest = isObject ? Utility.copyObject(request, [\"name\"]) : { functionName: functionName };\r\n\r\n ErrorHelper.stringParameterCheck(functionName, `DynamicsWebApi.callFunction`, parameterName);\r\n\r\n const functionParameters = Utility.buildFunctionParameters(internalRequest.parameters);\r\n\r\n internalRequest.method = \"GET\";\r\n internalRequest._additionalUrl = functionName + functionParameters.key;\r\n internalRequest.queryParams = functionParameters.queryParams;\r\n internalRequest._isUnboundRequest = !internalRequest.collection;\r\n internalRequest.functionName = \"callFunction\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Calls a Web API action\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n callAction: CallAction = async (\r\n request: BoundActionRequest | UnboundActionRequest\r\n ): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.callAction`, \"request\");\r\n ErrorHelper.stringParameterCheck(request.actionName, `DynamicsWebApi.callAction`, \"request.actionName\");\r\n\r\n const internalRequest = Utility.copyRequest(request, [\"action\"]);\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"callAction\";\r\n\r\n internalRequest._additionalUrl = request.actionName;\r\n internalRequest._isUnboundRequest = !internalRequest.collection;\r\n internalRequest.data = request.action;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n /**\r\n * Sends an asynchronous request to create an entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createEntity = (request: CreateEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.createEntity`, \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createEntity\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"createEntity\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update an entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateEntity = (request: UpdateEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateEntity\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateEntity\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateEntity\", \"request.data.MetadataId\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.key = internalRequest.data.MetadataId;\r\n internalRequest.functionName = \"updateEntity\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveEntity = (request: RetrieveEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveEntity\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.retrieveEntity\", \"request.key\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntity\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve entity definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveEntities = (request?: RetrieveEntitiesRequest): Promise> => {\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntities\";\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create an attribute.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createAttribute = (request: CreateAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createAttribute\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createAttribute\", \"request.data\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.createAttribute\", \"request.entityKey\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntity\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.key = request.entityKey;\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update an attribute.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateAttribute = (request: UpdateAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateAttribute\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateAttribute\", \"request.data\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.updateAttribute\", \"request.entityKey\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateAttribute\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateAttribute\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.navigationPropertyKey = request.data.MetadataId;\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"updateAttribute\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve attribute metadata for a specified entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAttributes = (request: RetrieveAttributesRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveAttributes\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.retrieveAttributes\", \"request.entityKey\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveAttributes\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"retrieveAttributes\";\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific attribute metadata for a specified entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAttribute = (request: RetrieveAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveAttributes\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.retrieveAttribute\", \"request.entityKey\");\r\n ErrorHelper.keyParameterCheck(request.attributeKey, \"DynamicsWebApi.retrieveAttribute\", \"request.attributeKey\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveAttribute\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.navigationPropertyKey = request.attributeKey;\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"retrieveAttribute\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createRelationship = (request: CreateRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createRelationship\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createRelationship\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"createRelationship\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateRelationship = (request: UpdateRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateRelationship\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateRelationship\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateRelationship\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateRelationship\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.key = request.data.MetadataId;\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"updateRelationship\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteRelationship = (request: DeleteRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteRelationship\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.deleteRelationship\", \"request.key\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"deleteRelationship\";\r\n\r\n return this.deleteRecord(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve relationship definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveRelationships = (request?: RetrieveRelationshipsRequest): Promise> => {\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"retrieveRelationships\";\r\n\r\n if (request) {\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveRelationships\", \"request.castType\");\r\n internalRequest.navigationProperty = request.castType;\r\n }\r\n }\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveRelationship = (request: RetrieveRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveRelationship\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.retrieveRelationship\", \"request.key\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveRelationship\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"retrieveRelationship\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a Global Option Set definition\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createGlobalOptionSet = (request: CreateGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createGlobalOptionSet\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createGlobalOptionSet\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"createGlobalOptionSet\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a Global Option Set.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateGlobalOptionSet = (request: UpdateGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateGlobalOptionSet\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.key = request.data.MetadataId;\r\n internalRequest.functionName = \"updateGlobalOptionSet\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a Global Option Set.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteGlobalOptionSet = (request: DeleteGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteGlobalOptionSet\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"deleteGlobalOptionSet\";\r\n\r\n return this.deleteRecord(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve Global Option Set definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveGlobalOptionSet = (request: RetrieveGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveGlobalOptionSet\", \"request\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveGlobalOptionSet\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"retrieveGlobalOptionSet\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve Global Option Set definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveGlobalOptionSets = (request?: RetrieveGlobalOptionSetsRequest): Promise> => {\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"retrieveGlobalOptionSets\";\r\n\r\n if (request?.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveGlobalOptionSets\", \"request.castType\");\r\n internalRequest.navigationProperty = request.castType;\r\n }\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Retrieves a CSDL Document Metadata\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} A raw CSDL $metadata document.\r\n */\r\n retrieveCsdlMetadata = async (request?: CsdlMetadataRequest): Promise => {\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"$metadata\";\r\n internalRequest.functionName = \"retrieveCsdlMetadata\";\r\n\r\n if (request?.addAnnotations) {\r\n ErrorHelper.boolParameterCheck(request.addAnnotations, \"DynamicsWebApi.retrieveCsdlMetadata\", \"request.addAnnotations\");\r\n internalRequest.includeAnnotations = \"*\";\r\n }\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides a search results page.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Search result\r\n */\r\n search: SearchFunction = async (request: string | SearchRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.search\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: Core.InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.search\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.search\", parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.search\", parameterName, 100);\r\n\r\n internalRequest.collection = \"query\";\r\n internalRequest.functionName = \"search\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Suggestions result\r\n */\r\n suggest: SuggestFunction = async (request: string | SuggestRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.suggest\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: Core.InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.suggest\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.suggest\", parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.suggest\", parameterName, 100);\r\n\r\n internalRequest.functionName = internalRequest.collection = \"suggest\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n autocomplete: AutocompleteFunction = async (request: string | AutocompleteRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.autocomplete\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: Core.InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n if (isObject) ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.autocomplete\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, `DynamicsWebApi.autocomplete`, parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.autocomplete\", parameterName, 100);\r\n\r\n internalRequest.functionName = internalRequest.collection = \"autocomplete\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Starts/executes a batch request.\r\n */\r\n startBatch = (): void => {\r\n this._isBatch = true;\r\n this._batchRequestId = Utility.generateUUID();\r\n };\r\n\r\n /**\r\n * Executes a batch request. Please call DynamicsWebApi.startBatch() first to start a batch request.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n executeBatch = async (request?: BatchRequest): Promise => {\r\n ErrorHelper.throwBatchNotStarted(this._isBatch);\r\n\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"$batch\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"executeBatch\";\r\n internalRequest.requestId = this._batchRequestId;\r\n\r\n this._batchRequestId = null;\r\n this._isBatch = false;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Creates a new instance of DynamicsWebApi. If config is not provided, it is copied from a current instance.\r\n *\r\n * @param {Config} config configuration object.\r\n * @returns {DynamicsWebApi} A new instance of DynamicsWebApi\r\n */\r\n initializeInstance = (config?: Config): DynamicsWebApi => new DynamicsWebApi(config || this._config);\r\n\r\n Utility = {\r\n /**\r\n * Searches for a collection name by provided entity name in a cached entity metadata.\r\n * The returned collection name can be null.\r\n *\r\n * @param {string} entityName entity name\r\n * @returns {string | null} collection name\r\n */\r\n getCollectionName: (entityName: string): string | null => RequestClient.getCollectionName(entityName),\r\n };\r\n}\r\n\r\nexport interface Expand {\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**Limit the number of results returned by using the $top system query option.Do not use $top with $count! */\r\n top?: number;\r\n /**An Array(of Strings) representing the order in which items are returned using the $orderby system query option.Use the asc or desc suffix to specify ascending or descending order respectively.The default is ascending if the suffix isn't applied. */\r\n orderBy?: string[];\r\n /**A name of a single-valued navigation property which needs to be expanded. */\r\n property?: string;\r\n /**An Array of Expand Objects representing the $expand Query Option value to control which related records need to be returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface BaseRequest {\r\n /**XHR requests only! Indicates whether the requests should be made synchronously or asynchronously.Default value is 'true'(asynchronously). */\r\n async?: boolean;\r\n /**Impersonates a user based on their systemuserid by adding \"MSCRMCallerID\" header. A String representing the GUID value for the Dynamics 365 systemuserid. */\r\n impersonate?: string;\r\n /**Impersonates a user based on their Azure Active Directory (AAD) object id by passing that value along with the header \"CallerObjectId\". A String should represent a GUID value. */\r\n impersonateAAD?: string;\r\n /**If set to 'true', DynamicsWebApi adds a request header 'Cache-Control: no-cache'.Default value is 'false'. */\r\n noCache?: boolean;\r\n /** Authorization Token. If set, onTokenRefresh will not be called. */\r\n token?: string;\r\n /**Sets a number of milliseconds before a request times out. */\r\n timeout?: number;\r\n /**The AbortSignal interface represents a signal object that allows you to communicate with a DOM request and abort it if required via an AbortController object. */\r\n signal?: AbortSignal;\r\n /**Indicates if an operation must be included in a Change Set or not. Works in Batch Operations only. By default, it's \"true\", except for GET operations - they are not allowed in Change Sets. */\r\n inChangeSet?: boolean;\r\n /**Headers to supply with a request. These headers will override configuraiton headers if the identical ones were set. */\r\n headers?: HeaderCollection;\r\n /**Custom query parameters. Can be used to set parameter aliases for \"$filter\" and \"$orderBy\". Important! These parameters ARE NOT URI encoded! */\r\n queryParams?: string[];\r\n}\r\n\r\nexport interface BatchRequest extends BaseRequest {\r\n /** Sets Prefer header to \"odata.continue-on-error\" that allows more requests be processed when errors occur. The batch request will return '200 OK' and individual response errors will be returned in the batch response body. */\r\n continueOnError?: boolean;\r\n}\r\n\r\nexport interface Request extends BaseRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection?: string;\r\n}\r\n\r\nexport interface CRUDRequest extends Request {\r\n /**A String representing collection record's Primary Key (GUID) or Alternate Key(s). */\r\n key?: string;\r\n}\r\n\r\nexport interface CountRequest extends Request {\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n}\r\n\r\nexport interface CountAllRequest extends CountRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**An Array (of strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n}\r\n\r\nexport interface FetchAllRequest extends Request {\r\n /**Sets FetchXML - a proprietary query language that provides capabilities to perform aggregation. */\r\n fetchXml: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation. Annotations provide additional information about lookups, options sets and other complex attribute types. For example: * or Microsoft.Dynamics.CRM.fetchxmlpagingcookie */\r\n includeAnnotations?: string;\r\n}\r\n\r\nexport interface FetchXmlRequest extends FetchAllRequest {\r\n /**Page number. */\r\n pageNumber?: number;\r\n /**Paging cookie. To retrive the first page, pagingCookie must be null. */\r\n pagingCookie?: string;\r\n}\r\n\r\nexport interface CreateRequest extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Web API v9+ only! Boolean that enables duplicate detection. */\r\n duplicateDetection?: boolean;\r\n /**A JavaScript object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data?: T;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface UpdateRequestBase extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Web API v9+ only! Boolean that enables duplicate detection. */\r\n duplicateDetection?: boolean;\r\n /**A JavaScript object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data?: T;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**Casts the AttributeMetadata to a specific type. (Used in requests to Attribute Metadata). */\r\n metadataAttributeType?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface UpdateRequest extends UpdateRequestBase {\r\n /**If set to 'true', DynamicsWebApi adds a request header 'MSCRM.MergeLabels: true'. Default value is 'false' */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface UpdateSinglePropertyRequest extends CRUDRequest {\r\n /**Object with a logical name of the field as a key and a value to update with. Example: {subject: \"Update Record\"} */\r\n fieldValuePair: { [key: string]: any };\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n}\r\n\r\nexport interface UpsertRequest extends UpdateRequestBase {\r\n /**Sets If-None-Match header value that enables to use conditional retrieval in applicable requests. */\r\n ifnonematch?: string;\r\n}\r\n\r\nexport interface DeleteRequest extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**Field name that needs to be cleared (for example File Field) */\r\n fieldName?: string;\r\n}\r\n\r\nexport interface RetrieveRequest extends CRUDRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets If-None-Match header value that enables to use conditional retrieval in applicable requests. */\r\n ifnonematch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Casts the AttributeMetadata to a specific type. (Used in requests to Attribute Metadata). */\r\n metadataAttributeType?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**A String representing the GUID value of the saved query. */\r\n savedQuery?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**A String representing the GUID value of the user query. */\r\n userQuery?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface RetrieveMultipleRequest extends Request {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**Use the $apply to aggregate and group your data dynamically */\r\n apply?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Boolean that sets the $count system query option with a value of true to include a count of entities that match the filter criteria up to 5000(per page).Do not use $top with $count! */\r\n count?: boolean;\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets the odata.maxpagesize preference value to request the number of entities returned in the response. */\r\n maxPageSize?: number;\r\n /**An Array(of string) representing the order in which items are returned using the $orderby system query option.Use the asc or desc suffix to specify ascending or descending order respectively.The default is ascending if the suffix isn't applied. */\r\n orderBy?: string[];\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Limit the number of results returned by using the $top system query option.Do not use $top with $count! */\r\n top?: number;\r\n /**Sets Prefer header with value 'odata.track-changes' to request that a delta link be returned which can subsequently be used to retrieve entity changes. */\r\n trackChanges?: boolean;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface AssociateRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Relationship name. */\r\n relationshipName: string;\r\n /**Related name of the Entity Collection or Entity Logical name. */\r\n relatedCollection: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface AssociateSingleValuedRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Navigation property name. */\r\n navigationProperty: string;\r\n /**Related name of the Entity Collection or Entity Logical name. */\r\n relatedCollection: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface DisassociateRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Relationship name. */\r\n relationshipName: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface DisassociateSingleValuedRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Navigation property name. */\r\n navigationProperty: string;\r\n}\r\n\r\nexport interface UnboundFunctionRequest extends BaseRequest {\r\n /**\r\n * Name of the function.\r\n */\r\n name?: string;\r\n /**\r\n * Name of the function. \r\n * @deprecated Use \"name\" parameter.\r\n */\r\n functionName?: string;\r\n /**Function's input parameters. Example: { param1: \"test\", param2: 3 }. */\r\n parameters?: any;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n}\r\n\r\nexport interface BoundFunctionRequest extends UnboundFunctionRequest, Request {\r\n /**A String representing the GUID value for the record. */\r\n key?: string;\r\n}\r\n\r\nexport interface UnboundActionRequest extends BaseRequest {\r\n /**A name of the Web API action. */\r\n actionName: string;\r\n /**An object that represents a Dynamics 365 action. */\r\n action?: TAction;\r\n}\r\n\r\nexport interface BoundActionRequest extends UnboundActionRequest, Request {\r\n /**A String representing the GUID value for the record. */\r\n key?: string;\r\n}\r\n\r\nexport interface CreateEntityRequest extends BaseRequest {\r\n /**An object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateEntityRequest extends CRUDRequest {\r\n /**An object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data: any;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface RetrieveEntityRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveEntitiesRequest extends BaseRequest {\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateAttributeRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Attribute metadata object. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateAttributeRequest extends CreateAttributeRequest {\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface RetrieveAttributesRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveAttributeRequest extends BaseRequest {\r\n /**An Attribute MetadataId or Alternate Key (such as LogicalName). */\r\n attributeKey: string;\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateRelationshipRequest extends BaseRequest {\r\n /**Relationship Definition. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateRelationshipRequest extends CreateRelationshipRequest {\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface DeleteRelationshipRequest extends BaseRequest {\r\n /**A Relationship MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n}\r\n\r\nexport interface RetrieveRelationshipsRequest extends BaseRequest {\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveRelationshipRequest extends BaseRequest {\r\n /**A Relationship MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateGlobalOptionSetRequest extends BaseRequest {\r\n /**Global Option Set Definition. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateGlobalOptionSetRequest extends CreateRelationshipRequest {\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface DeleteGlobalOptionSetRequest extends BaseRequest {\r\n /**A Global Option Set MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n}\r\n\r\nexport interface RetrieveGlobalOptionSetsRequest extends BaseRequest {\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveGlobalOptionSetRequest extends BaseRequest {\r\n /**A Global Option Set MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface UploadRequest extends CRUDRequest {\r\n /**Binary Buffer*/\r\n data: Uint8Array | Buffer;\r\n /**Name of the file */\r\n fileName: string;\r\n /**File Field Name */\r\n fieldName: string;\r\n}\r\n\r\nexport interface DownloadRequest extends CRUDRequest {\r\n /**File Field Name */\r\n fieldName: string;\r\n}\r\n\r\nexport interface CsdlMetadataRequest extends BaseRequest {\r\n /**If set to \"true\" the document will include many different kinds of annotations that can be useful. Most annotations are not included by default because they increase the total size of the document. */\r\n addAnnotations?: boolean;\r\n}\r\n\r\nexport type SearchMode = \"any\" | \"all\";\r\nexport type SearchType = \"simple\" | \"full\";\r\n\r\nexport interface SearchQueryBase {\r\n /**The search parameter value contains the term to be searched for and has a 100-character limit. For suggestions, min 3 characters in addition. */\r\n search: string;\r\n /**The default table list searches across all Dataverse search\u2013configured tables and columns. The default list is configured by your administrator when Dataverse search is enabled. */\r\n entities?: string[];\r\n /**Filters are applied while searching data and are specified in standard OData syntax. */\r\n filter?: string;\r\n}\r\n\r\nexport interface Search extends SearchQueryBase {\r\n /**Facets support the ability to drill down into data results after they've been retrieved. */\r\n facets?: string[];\r\n /**Specify true to return the total record count; otherwise false. The default is false. */\r\n returnTotalRecordCount?: boolean;\r\n /**Specifies the number of search results to skip. */\r\n skip?: number;\r\n /**Specifies the number of search results to retrieve. The default is 50, and the maximum value is 100. */\r\n top?: number;\r\n /**A list of comma-separated clauses where each clause consists of a column name followed by 'asc' (ascending, which is the default) or 'desc' (descending). This list specifies how to order the results in order of precedence. */\r\n orderBy?: string[];\r\n /**Specifies whether any or all the search terms must be matched to count the document as a match. The default is 'any'. */\r\n searchMode?: SearchMode;\r\n /**The search type specifies the syntax of a search query. Using 'simple' selects simple query syntax and 'full' selects Lucene query syntax. The default is 'simple'. */\r\n searchType?: SearchType;\r\n}\r\n\r\nexport interface Suggest extends SearchQueryBase {\r\n /**Use fuzzy search to aid with misspellings. The default is false. */\r\n useFuzzy?: boolean;\r\n /**Number of suggestions to retrieve. The default is 5. */\r\n top?: number;\r\n /**A list of comma-separated clauses where each clause consists of a column name followed by 'asc' (ascending, which is the default) or 'desc' (descending). This list specifies how to order the results in order of precedence. */\r\n orderBy?: string[];\r\n}\r\n\r\nexport interface Autocomplete extends SearchQueryBase {\r\n /**Use fuzzy search to aid with misspellings. The default is false. */\r\n useFuzzy?: boolean;\r\n}\r\n\r\nexport interface SearchRequest extends BaseRequest {\r\n /**Search query object */\r\n query: Search;\r\n}\r\n\r\nexport interface SuggestRequest extends BaseRequest {\r\n /**Suggestion query object */\r\n query: Suggest;\r\n}\r\n\r\nexport interface AutocompleteRequest extends BaseRequest {\r\n /**Autocomplete query object */\r\n query: Autocomplete;\r\n}\r\n\r\nexport interface ApiConfig {\r\n /** API Version to use, for example: \"9.2\" or \"1.0\" */\r\n version?: string;\r\n /** API Path, for example: \"data\" or \"search\" */\r\n path?: string;\r\n}\r\n\r\nexport interface AccessToken {\r\n /** Access Token */\r\n accessToken: string;\r\n}\r\n\r\nexport interface Config {\r\n /**The url to Dataverse API server, for example: https://contoso.api.crm.dynamics.com/. It is required when used in Node.js application. */\r\n serverUrl?: string | null;\r\n /**Impersonates a user based on their systemuserid by adding \"MSCRMCallerID\" header. A String representing the GUID value for the Dynamics 365 systemuserid. */\r\n impersonate?: string | null;\r\n /**Impersonates a user based on their Azure Active Directory (AAD) object id by passing that value along with the header \"CallerObjectId\". A String should represent a GUID value. */\r\n impersonateAAD?: string | null;\r\n /**A function that is called when a security token needs to be refreshed. */\r\n onTokenRefresh?: (() => Promise) | null;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types.*/\r\n includeAnnotations?: string | null;\r\n /**Sets the odata.maxpagesize preference value to request the number of entities returned in the response. */\r\n maxPageSize?: number | null;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request.*/\r\n returnRepresentation?: boolean | null;\r\n /**Indicates whether to use Entity Logical Names instead of Collection Logical Names.*/\r\n useEntityNames?: boolean | null;\r\n /**Sets a number of milliseconds before a request times out. */\r\n timeout?: number | null;\r\n /**Proxy configuration object. */\r\n proxy?: ProxyConfig | null;\r\n /**Configuration object for Dataverse Web API (with path \"data\"). */\r\n dataApi?: ApiConfig;\r\n /**Configuration object for Dataverse Search API (with path \"search\"). */\r\n searchApi?: ApiConfig;\r\n /**Default headers to supply with each request. */\r\n headers?: HeaderCollection;\r\n}\r\n\r\n/**Header collection type */\r\nexport type HeaderCollection = {\r\n /**key-value */\r\n [key: string]: string;\r\n};\r\n\r\nexport interface ProxyConfig {\r\n /**Proxy server url */\r\n url: string;\r\n /**Basic authentication credentials */\r\n auth?: {\r\n /**Username */\r\n username: string;\r\n /**Password */\r\n password: string;\r\n };\r\n}\r\n\r\n/** Callback with an acquired token called by DynamicsWebApi; \"token\" argument can be a string or an object with a property {accessToken: } */\r\n// export interface OnTokenAcquiredCallback {\r\n// (token: any): void;\r\n// }\r\n\r\nexport interface RequestError extends Error {\r\n /**The name of the error */\r\n name: string;\r\n /**This code is not related to the http status code and is frequently empty */\r\n code?: string;\r\n /**A message describing the error */\r\n message: string;\r\n /**HTTP status code */\r\n status?: number;\r\n /**HTTP status text. Frequently empty */\r\n statusText?: string;\r\n /**HTTP Response headers */\r\n headers?: any;\r\n /**Details about an error */\r\n innererror?: {\r\n /**A message describing the error, this is frequently the same as the outer message */\r\n message?: string;\r\n /**Microsoft.Crm.CrmHttpException */\r\n type?: string;\r\n /**Details from the server about where the error occurred */\r\n stacktrace?: string;\r\n };\r\n}\r\n\r\nexport interface MultipleResponse {\r\n /**Multiple respone entities */\r\n value: T[];\r\n oDataCount?: number;\r\n \"@odata.count\"?: number;\r\n oDataContext?: string;\r\n \"@odata.context\"?: number;\r\n}\r\n\r\nexport interface AllResponse extends MultipleResponse {\r\n /**@odata.deltaLink value */\r\n oDataDeltaLink?: string;\r\n}\r\n\r\nexport interface RetrieveMultipleResponse extends MultipleResponse {\r\n \"@Microsoft.Dynamics.CRM.totalrecordcount\"?: number;\r\n \"@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded\"?: boolean;\r\n /**@odata.nextLink value */\r\n oDataNextLink?: string;\r\n /**@odata.deltaLink value */\r\n oDataDeltaLink?: string;\r\n \"@odata.deltaLink\"?: string;\r\n \"@odata.nextLink\"?: string;\r\n}\r\n\r\nexport interface FetchXmlResponse extends MultipleResponse {\r\n \"@Microsoft.Dynamics.CRM.totalrecordcount\"?: number;\r\n \"@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded\"?: boolean;\r\n /**Paging information */\r\n PagingInfo?: {\r\n /**Number of the next page */\r\n nextPage?: number;\r\n /**Next page cookie */\r\n cookie?: string;\r\n };\r\n}\r\n\r\nexport interface DownloadResponse {\r\n /**The name of the file */\r\n fileName: string;\r\n /**File size */\r\n fileSize: number;\r\n /**File Data */\r\n data: Uint8Array | Buffer;\r\n}\r\n\r\nexport interface SearchResponse {\r\n /**Search results*/\r\n value: TValue[];\r\n facets: any | null;\r\n totalrecordcount: number;\r\n querycontext: any | null;\r\n}\r\n\r\nexport interface SuggestResponseValue {\r\n text: string;\r\n document: TDocument;\r\n}\r\n\r\nexport interface SuggestResponse {\r\n /**Suggestions*/\r\n value: SuggestResponseValue[];\r\n querycontext: any | null;\r\n}\r\n\r\nexport interface AutocompleteResponse {\r\n /**Autocomplete result*/\r\n value: string | null;\r\n querycontext: any | null;\r\n}\r\n\r\n//function overloads\r\n\r\ntype CallFunction = {\r\n /**\r\n * Calls a Web API function\r\n *\r\n * @param name - The name of a function.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (name: string): Promise;\r\n /**\r\n * Calls a bound Web API function\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundFunctionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API function (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundFunctionRequest): Promise;\r\n};\r\n\r\ntype CallAction = {\r\n /**\r\n * Calls a bound Web API action (bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {T} Type of the value in a response\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundActionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API action (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {T} Type of the value in a response\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundActionRequest): Promise;\r\n /**\r\n * Calls a bound Web API action (bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {TResponse} Type of the value in a response\r\n * @type {TAction} Type of an action object\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundActionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API action (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {TResponse} Type of the value in a response\r\n * @type {TAction} Type of an action object\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundActionRequest): Promise;\r\n};\r\n\r\ntype SearchFunction = {\r\n /**\r\n * Provides a search results page.\r\n * @param term - The term to be searched for and has a max 100-character limit.\r\n * @returns {Promise} Search result\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides a search results page.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Search result\r\n */\r\n (request: SearchRequest): Promise>;\r\n};\r\n\r\ntype SuggestFunction = {\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param term - The term to be searched for and has min 3 characters to a max 100-character limit.\r\n * @returns {Promise} Suggestions result\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Suggestions result\r\n */\r\n (request: SuggestRequest): Promise>;\r\n};\r\n\r\ntype AutocompleteFunction = {\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param term - The term to be searched for and has a 100-character limit.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n (request: AutocompleteRequest): Promise;\r\n};\r\n", "import { Utility } from \"../utils/Utility\";\r\nimport { InternalConfig } from \"../utils/Config\";\r\nimport { RequestUtility } from \"../utils/Request\";\r\nimport { DynamicsWebApiError, ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { Core } from \"../types\";\r\nimport { executeRequest } from \"./helpers/executeRequest\";\r\nimport { AccessToken } from \"../dynamics-web-api\";\r\n\r\nconst _addResponseParams = (requestId, responseParams) => {\r\n if (_responseParseParams[requestId]) _responseParseParams[requestId].push(responseParams);\r\n else _responseParseParams[requestId] = [responseParams];\r\n};\r\n\r\nconst _addRequestToBatchCollection = (requestId, request) => {\r\n if (_batchRequestCollection[requestId]) _batchRequestCollection[requestId].push(request);\r\n else _batchRequestCollection[requestId] = [request];\r\n};\r\n\r\nconst _clearRequestData = (requestId: string): void => {\r\n delete _responseParseParams[requestId];\r\n if (_batchRequestCollection.hasOwnProperty(requestId)) delete _batchRequestCollection[requestId];\r\n};\r\n\r\nconst _runRequest = async (request: Core.InternalRequest, config: InternalConfig): Promise => {\r\n try {\r\n const result = await RequestClient.sendRequest(request, config);\r\n _clearRequestData(request.requestId!);\r\n\r\n return result;\r\n } catch (error) {\r\n _clearRequestData(request.requestId!);\r\n throw error;\r\n } finally {\r\n _clearRequestData(request.requestId!);\r\n }\r\n};\r\n\r\nlet _batchRequestCollection: Core.BatchRequestCollection = {};\r\nlet _responseParseParams: { [key: string]: any[] } = {};\r\n\r\nexport class RequestClient {\r\n /**\r\n * Sends a request to given URL with given parameters\r\n *\r\n * @param {InternalRequest} request - Composed request to D365 Web Api\r\n * @param {InternalConfig} config - DynamicsWebApi config.\r\n */\r\n static async sendRequest(request: Core.InternalRequest, config: InternalConfig): Promise {\r\n request.headers = request.headers || {};\r\n request.responseParameters = request.responseParameters || {};\r\n request.requestId = request.requestId || Utility.generateUUID();\r\n\r\n //add response parameters to parse\r\n _addResponseParams(request.requestId, request.responseParameters);\r\n\r\n //stringify passed data\r\n let processedData = null;\r\n\r\n const isBatchConverted = request.responseParameters?.convertedToBatch;\r\n\r\n if (request.path === \"$batch\" && !isBatchConverted) {\r\n const batchRequest = _batchRequestCollection[request.requestId];\r\n\r\n if (!batchRequest) throw ErrorHelper.batchIsEmpty();\r\n\r\n const batchResult = RequestUtility.convertToBatch(batchRequest, config, request);\r\n\r\n processedData = batchResult.body;\r\n request.headers = { ...batchResult.headers, ...request.headers };\r\n\r\n //clear an array of requests\r\n delete _batchRequestCollection[request.requestId];\r\n } else {\r\n processedData = !isBatchConverted ? RequestUtility.processData(request.data, config) : request.data;\r\n\r\n if (!isBatchConverted) request.headers = RequestUtility.setStandardHeaders(request.headers);\r\n }\r\n\r\n if (config.impersonate && !request.headers![\"MSCRMCallerID\"]) {\r\n request.headers![\"MSCRMCallerID\"] = config.impersonate;\r\n }\r\n\r\n if (config.impersonateAAD && !request.headers![\"CallerObjectId\"]) {\r\n request.headers![\"CallerObjectId\"] = config.impersonateAAD;\r\n }\r\n\r\n let token: AccessToken | string | null = null;\r\n\r\n //call a token refresh callback only if it is set and there is no \"Authorization\" header set yet\r\n if (config.onTokenRefresh && (!request.headers || (request.headers && !request.headers[\"Authorization\"]))) {\r\n token = await config.onTokenRefresh();\r\n if (!token) throw new Error(\"Token is empty. Request is aborted.\");\r\n }\r\n\r\n if (token) {\r\n request.headers![\"Authorization\"] = \"Bearer \" + (token.hasOwnProperty(\"accessToken\") ? (token as AccessToken).accessToken : token);\r\n }\r\n\r\n if (Utility.isRunningWithinPortals()) {\r\n request.headers![\"__RequestVerificationToken\"] = await global.window.shell!.getTokenDeferred();\r\n }\r\n\r\n const url = request.apiConfig ? request.apiConfig.url : config.dataApi.url;\r\n\r\n return await executeRequest({\r\n method: request.method!,\r\n uri: url!.toString() + request.path,\r\n data: processedData,\r\n additionalHeaders: request.headers,\r\n responseParams: _responseParseParams,\r\n isAsync: request.async,\r\n timeout: request.timeout || config.timeout,\r\n proxy: config.proxy,\r\n requestId: request.requestId!,\r\n abortSignal: request.signal,\r\n });\r\n }\r\n\r\n private static async _getCollectionNames(entityName: string, config: InternalConfig): Promise {\r\n if (!Utility.isNull(RequestUtility.entityNames)) {\r\n return RequestUtility.findCollectionName(entityName) || entityName;\r\n }\r\n\r\n const request = RequestUtility.compose(\r\n {\r\n method: \"GET\",\r\n collection: \"EntityDefinitions\",\r\n select: [\"EntitySetName\", \"LogicalName\"],\r\n noCache: true,\r\n functionName: \"retrieveMultiple\",\r\n },\r\n config\r\n );\r\n\r\n const result = await _runRequest(request, config);\r\n RequestUtility.entityNames = {};\r\n for (let i = 0; i < result.data.value.length; i++) {\r\n RequestUtility.entityNames[result.data.value[i].LogicalName] = result.data.value[i].EntitySetName;\r\n }\r\n\r\n return RequestUtility.findCollectionName(entityName) || entityName;\r\n }\r\n\r\n private static _isEntityNameException(entityName: string): boolean {\r\n const exceptions = [\r\n \"$metadata\",\r\n \"EntityDefinitions\",\r\n \"RelationshipDefinitions\",\r\n \"GlobalOptionSetDefinitions\",\r\n \"ManagedPropertyDefinitions\",\r\n \"query\",\r\n \"suggest\",\r\n \"autocomplete\",\r\n ];\r\n\r\n return exceptions.indexOf(entityName) > -1;\r\n }\r\n\r\n private static async _checkCollectionName(entityName: string | null | undefined, config: InternalConfig): Promise {\r\n if (!entityName || RequestClient._isEntityNameException(entityName)) {\r\n return entityName;\r\n }\r\n\r\n entityName = entityName.toLowerCase();\r\n\r\n if (!config.useEntityNames) {\r\n return entityName;\r\n }\r\n\r\n try {\r\n return await RequestClient._getCollectionNames(entityName, config);\r\n } catch (error: any) {\r\n throw new Error(\"Unable to fetch Collection Names. Error: \" + (error as DynamicsWebApiError).message);\r\n }\r\n }\r\n\r\n static async makeRequest(request: Core.InternalRequest, config: InternalConfig): Promise {\r\n request.responseParameters = request.responseParameters || {};\r\n //we don't want to mix headers set by the library and by the user\r\n request.userHeaders = request.headers;\r\n delete request.headers;\r\n\r\n if (!request.isBatch) {\r\n const collectionName = await RequestClient._checkCollectionName(request.collection, config);\r\n\r\n request.collection = collectionName;\r\n RequestUtility.compose(request, config);\r\n request.responseParameters.convertedToBatch = false;\r\n\r\n //the URL contains more characters than max possible limit, convert the request to a batch request\r\n if (request.path!.length > 2000) {\r\n const batchRequest = RequestUtility.convertToBatch([request], config);\r\n\r\n request.method = \"POST\";\r\n request.path = \"$batch\";\r\n request.data = batchRequest.body;\r\n request.headers = { ...batchRequest.headers, ...request.userHeaders };\r\n request.responseParameters.convertedToBatch = true;\r\n }\r\n\r\n return _runRequest(request, config);\r\n }\r\n\r\n //no need to make a request to web api if it's a part of batch\r\n RequestUtility.compose(request, config);\r\n //add response parameters to parse\r\n _addResponseParams(request.requestId, request.responseParameters);\r\n _addRequestToBatchCollection(request.requestId, request);\r\n }\r\n\r\n static _clearTestData(): void {\r\n RequestUtility.entityNames = null;\r\n _responseParseParams = {};\r\n _batchRequestCollection = {};\r\n }\r\n\r\n static getCollectionName(entityName: string): string | null {\r\n return RequestUtility.findCollectionName(entityName);\r\n }\r\n}\r\n", "import { Utility } from \"./Utility\";\r\nimport { Config, HeaderCollection } from \"../dynamics-web-api\";\r\nimport { ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { Core } from \"../types\";\r\nimport { InternalConfig } from \"./Config\";\r\n\r\n/**\r\n * @typedef {Object} ConvertedRequestOptions\r\n * @property {string} url URL (without query)\r\n * @property {string} query Query String\r\n * @property {Object} headers Heades object (always an Object; can be empty: {})\r\n */\r\n\r\n/**\r\n * @typedef {Object} ConvertedRequest\r\n * @property {string} url URL (including Query String)\r\n * @property {Object} headers Heades object (always an Object; can be empty: {})\r\n * @property {boolean} async\r\n */\r\n\r\nexport class RequestUtility {\r\n /**\r\n * Converts a request object to URL link\r\n *\r\n * @param {Object} request - Request object\r\n * @param {Object} [config] - DynamicsWebApi config\r\n * @returns {ConvertedRequest} Converted request\r\n */\r\n static compose(request: Core.InternalRequest, config: InternalConfig): Core.InternalRequest {\r\n request.path = request.path || \"\";\r\n request.functionName = request.functionName || \"\";\r\n if (!request.url) {\r\n if (!request._isUnboundRequest && !request.contentId && !request.collection) {\r\n ErrorHelper.parameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, \"request.collection\");\r\n }\r\n if (request.collection != null) {\r\n ErrorHelper.stringParameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, \"request.collection\");\r\n request.path = request.collection;\r\n\r\n //add alternate key feature\r\n if (request.key) {\r\n request.key = ErrorHelper.keyParameterCheck(request.key, `DynamicsWebApi.${request.functionName}`, \"request.key\");\r\n request.path += `(${request.key})`;\r\n }\r\n }\r\n\r\n if (request.contentId) {\r\n ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, \"request.contentId\");\r\n if (request.contentId.startsWith(\"$\")) {\r\n request.path = request.path ? `${request.contentId}/${request.path}` : request.contentId;\r\n }\r\n }\r\n\r\n if (request._additionalUrl) {\r\n if (request.path) {\r\n request.path += \"/\";\r\n }\r\n request.path += request._additionalUrl;\r\n }\r\n\r\n request.path = RequestUtility.composeUrl(request, config, request.path);\r\n\r\n if (request.fetchXml) {\r\n ErrorHelper.stringParameterCheck(request.fetchXml, `DynamicsWebApi.${request.functionName}`, \"request.fetchXml\");\r\n let join = request.path.indexOf(\"?\") === -1 ? \"?\" : \"&\";\r\n request.path += `${join}fetchXml=${encodeURIComponent(request.fetchXml)}`;\r\n }\r\n } else {\r\n ErrorHelper.stringParameterCheck(request.url, `DynamicsWebApi.${request.functionName}`, \"request.url\");\r\n request.path = request.url.replace(config.dataApi.url, \"\");\r\n }\r\n\r\n if (request.hasOwnProperty(\"async\") && request.async != null) {\r\n ErrorHelper.boolParameterCheck(request.async, `DynamicsWebApi.${request.functionName}`, \"request.async\");\r\n } else {\r\n request.async = true;\r\n }\r\n\r\n request.headers = RequestUtility.composeHeaders(request, config);\r\n\r\n return request;\r\n }\r\n\r\n /**\r\n * Converts optional parameters of the request to URL. If expand parameter exists this function is called recursively.\r\n *\r\n * @param {Object} request - Request object\r\n * @param {string} request.functionName - Name of the function that converts a request (for Error Handling)\r\n * @param {string} url - URL beginning (with required parameters)\r\n * @param {string} [joinSymbol] - URL beginning (with required parameters)\r\n * @param {Object} [config] - DynamicsWebApi config\r\n * @returns {ConvertedRequestOptions} Additional options in request\r\n */\r\n static composeUrl(request: Core.InternalRequest, config: Config, url: string = \"\", joinSymbol: string = \"&\"): string {\r\n const queryArray: string[] = [];\r\n\r\n if (request) {\r\n if (request.navigationProperty) {\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, `DynamicsWebApi.${request.functionName}`, \"request.navigationProperty\");\r\n url += \"/\" + request.navigationProperty;\r\n\r\n if (request.navigationPropertyKey) {\r\n let navigationKey = ErrorHelper.keyParameterCheck(\r\n request.navigationPropertyKey,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.navigationPropertyKey\"\r\n );\r\n url += \"(\" + navigationKey + \")\";\r\n }\r\n\r\n if (request.navigationProperty === \"Attributes\") {\r\n if (request.metadataAttributeType) {\r\n ErrorHelper.stringParameterCheck(\r\n request.metadataAttributeType,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.metadataAttributeType\"\r\n );\r\n url += \"/\" + request.metadataAttributeType;\r\n }\r\n }\r\n }\r\n\r\n if (request.select?.length) {\r\n ErrorHelper.arrayParameterCheck(request.select, `DynamicsWebApi.${request.functionName}`, \"request.select\");\r\n\r\n if (request.functionName == \"retrieve\" && request.select.length == 1 && request.select[0].endsWith(\"/$ref\")) {\r\n url += \"/\" + request.select[0];\r\n } else {\r\n if (request.select[0].startsWith(\"/\") && request.functionName == \"retrieve\") {\r\n if (request.navigationProperty == null) {\r\n url += request.select.shift();\r\n } else {\r\n request.select.shift();\r\n }\r\n }\r\n\r\n //check if anything left in the array\r\n if (request.select.length) {\r\n queryArray.push(\"$select=\" + request.select.join(\",\"));\r\n }\r\n }\r\n }\r\n\r\n if (request.filter) {\r\n ErrorHelper.stringParameterCheck(request.filter, `DynamicsWebApi.${request.functionName}`, \"request.filter\");\r\n const removeBracketsFromGuidReg = /[^\"']{([\\w\\d]{8}[-]?(?:[\\w\\d]{4}[-]?){3}[\\w\\d]{12})}(?:[^\"']|$)/g;\r\n let filterResult = request.filter;\r\n\r\n //fix bug 2018-06-11\r\n let m: RegExpExecArray | null = null;\r\n while ((m = removeBracketsFromGuidReg.exec(filterResult)) !== null) {\r\n if (m.index === removeBracketsFromGuidReg.lastIndex) {\r\n removeBracketsFromGuidReg.lastIndex++;\r\n }\r\n\r\n let replacement = m[0].endsWith(\")\") ? \")\" : \" \";\r\n filterResult = filterResult.replace(m[0], \" \" + m[1] + replacement);\r\n }\r\n\r\n queryArray.push(\"$filter=\" + encodeURIComponent(filterResult));\r\n }\r\n\r\n if (request.fieldName) {\r\n ErrorHelper.stringParameterCheck(request.fieldName, `DynamicsWebApi.${request.functionName}`, \"request.fieldName\");\r\n url += \"/\" + request.fieldName;\r\n }\r\n\r\n if (request.savedQuery) {\r\n queryArray.push(\r\n \"savedQuery=\" + ErrorHelper.guidParameterCheck(request.savedQuery, `DynamicsWebApi.${request.functionName}`, \"request.savedQuery\")\r\n );\r\n }\r\n\r\n if (request.userQuery) {\r\n queryArray.push(\r\n \"userQuery=\" + ErrorHelper.guidParameterCheck(request.userQuery, `DynamicsWebApi.${request.functionName}`, \"request.userQuery\")\r\n );\r\n }\r\n\r\n if (request.apply) {\r\n ErrorHelper.stringParameterCheck(request.apply, `DynamicsWebApi.${request.functionName}`, \"request.apply\");\r\n queryArray.push(\"$apply=\" + request.apply);\r\n }\r\n\r\n if (request.count) {\r\n ErrorHelper.boolParameterCheck(request.count, `DynamicsWebApi.${request.functionName}`, \"request.count\");\r\n queryArray.push(\"$count=\" + request.count);\r\n }\r\n\r\n if (request.top && request.top > 0) {\r\n ErrorHelper.numberParameterCheck(request.top, `DynamicsWebApi.${request.functionName}`, \"request.top\");\r\n queryArray.push(\"$top=\" + request.top);\r\n }\r\n\r\n if (request.orderBy != null && request.orderBy.length) {\r\n ErrorHelper.arrayParameterCheck(request.orderBy, `DynamicsWebApi.${request.functionName}`, \"request.orderBy\");\r\n queryArray.push(\"$orderby=\" + request.orderBy.join(\",\"));\r\n }\r\n\r\n if (request.partitionId) {\r\n ErrorHelper.stringParameterCheck(request.partitionId, `DynamicsWebApi.${request.functionName}`, \"request.partitionId\");\r\n queryArray.push(\"partitionid='\" + request.partitionId + \"'\");\r\n }\r\n\r\n if (request.downloadSize) {\r\n ErrorHelper.stringParameterCheck(request.downloadSize, `DynamicsWebApi.${request.functionName}`, \"request.downloadSize\");\r\n queryArray.push(\"size=\" + request.downloadSize);\r\n }\r\n\r\n if (request.queryParams?.length) {\r\n ErrorHelper.arrayParameterCheck(request.queryParams, `DynamicsWebApi.${request.functionName}`, \"request.queryParams\");\r\n queryArray.push(request.queryParams.join(\"&\"));\r\n }\r\n\r\n if (request.fileName) {\r\n ErrorHelper.stringParameterCheck(request.fileName, `DynamicsWebApi.${request.functionName}`, \"request.fileName\");\r\n queryArray.push(\"x-ms-file-name=\" + request.fileName);\r\n }\r\n\r\n if (request.data) {\r\n ErrorHelper.parameterCheck(request.data, `DynamicsWebApi.${request.functionName}`, \"request.data\");\r\n }\r\n\r\n if (request.isBatch) {\r\n ErrorHelper.boolParameterCheck(request.isBatch, `DynamicsWebApi.${request.functionName}`, \"request.isBatch\");\r\n }\r\n\r\n if (!Utility.isNull(request.inChangeSet)) {\r\n ErrorHelper.boolParameterCheck(request.inChangeSet, `DynamicsWebApi.${request.functionName}`, \"request.inChangeSet\");\r\n }\r\n\r\n if (request.isBatch && Utility.isNull(request.inChangeSet)) request.inChangeSet = true;\r\n\r\n if (request.timeout) {\r\n ErrorHelper.numberParameterCheck(request.timeout, `DynamicsWebApi.${request.functionName}`, \"request.timeout\");\r\n }\r\n\r\n if (request.expand?.length) {\r\n ErrorHelper.stringOrArrayParameterCheck(request.expand, `DynamicsWebApi.${request.functionName}`, \"request.expand\");\r\n if (typeof request.expand === \"string\") {\r\n queryArray.push(\"$expand=\" + request.expand);\r\n } else {\r\n const expandQueryArray: string[] = [];\r\n for (let i = 0; i < request.expand.length; i++) {\r\n if (request.expand[i].property) {\r\n const expand = request.expand[i];\r\n expand.functionName = `${request.functionName} $expand`;\r\n let expandConverted = RequestUtility.composeUrl(expand, config, \"\", \";\");\r\n if (expandConverted) {\r\n expandConverted = `(${expandConverted.substr(1)})`;\r\n }\r\n expandQueryArray.push(request.expand[i].property + expandConverted);\r\n }\r\n }\r\n if (expandQueryArray.length) {\r\n queryArray.push(\"$expand=\" + expandQueryArray.join(\",\"));\r\n }\r\n }\r\n }\r\n }\r\n\r\n return !queryArray.length ? url : url + \"?\" + queryArray.join(joinSymbol);\r\n }\r\n\r\n static composeHeaders(request: Core.InternalRequest, config: Config): HeaderCollection {\r\n const headers: HeaderCollection = { ...config.headers, ...request.userHeaders };\r\n\r\n const prefer = RequestUtility.composePreferHeader(request, config);\r\n if (prefer.length) {\r\n headers[\"Prefer\"] = prefer;\r\n }\r\n\r\n if (request.collection === \"$metadata\") {\r\n headers[\"Accept\"] = \"application/xml\";\r\n }\r\n\r\n if (request.transferMode) {\r\n headers[\"x-ms-transfer-mode\"] = request.transferMode;\r\n }\r\n\r\n if (request.ifmatch != null && request.ifnonematch != null) {\r\n throw new Error(\r\n `DynamicsWebApi.${request.functionName}. Either one of request.ifmatch or request.ifnonematch parameters should be used in a call, not both.`\r\n );\r\n }\r\n\r\n if (request.ifmatch) {\r\n ErrorHelper.stringParameterCheck(request.ifmatch, `DynamicsWebApi.${request.functionName}`, \"request.ifmatch\");\r\n headers[\"If-Match\"] = request.ifmatch;\r\n }\r\n\r\n if (request.ifnonematch) {\r\n ErrorHelper.stringParameterCheck(request.ifnonematch, `DynamicsWebApi.${request.functionName}`, \"request.ifnonematch\");\r\n headers[\"If-None-Match\"] = request.ifnonematch;\r\n }\r\n\r\n if (request.impersonate) {\r\n ErrorHelper.stringParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, \"request.impersonate\");\r\n headers[\"MSCRMCallerID\"] = ErrorHelper.guidParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, \"request.impersonate\");\r\n }\r\n\r\n if (request.impersonateAAD) {\r\n ErrorHelper.stringParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, \"request.impersonateAAD\");\r\n headers[\"CallerObjectId\"] = ErrorHelper.guidParameterCheck(\r\n request.impersonateAAD,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.impersonateAAD\"\r\n );\r\n }\r\n\r\n if (request.token) {\r\n ErrorHelper.stringParameterCheck(request.token, `DynamicsWebApi.${request.functionName}`, \"request.token\");\r\n headers[\"Authorization\"] = \"Bearer \" + request.token;\r\n }\r\n\r\n if (request.duplicateDetection) {\r\n ErrorHelper.boolParameterCheck(request.duplicateDetection, `DynamicsWebApi.${request.functionName}`, \"request.duplicateDetection\");\r\n headers[\"MSCRM.SuppressDuplicateDetection\"] = \"false\";\r\n }\r\n\r\n if (request.bypassCustomPluginExecution) {\r\n ErrorHelper.boolParameterCheck(\r\n request.bypassCustomPluginExecution,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.bypassCustomPluginExecution\"\r\n );\r\n headers[\"MSCRM.BypassCustomPluginExecution\"] = \"true\";\r\n }\r\n\r\n if (request.noCache) {\r\n ErrorHelper.boolParameterCheck(request.noCache, `DynamicsWebApi.${request.functionName}`, \"request.noCache\");\r\n headers[\"Cache-Control\"] = \"no-cache\";\r\n }\r\n\r\n if (request.mergeLabels) {\r\n ErrorHelper.boolParameterCheck(request.mergeLabels, `DynamicsWebApi.${request.functionName}`, \"request.mergeLabels\");\r\n headers[\"MSCRM.MergeLabels\"] = \"true\";\r\n }\r\n\r\n if (request.contentId) {\r\n ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, \"request.contentId\");\r\n if (!request.contentId.startsWith(\"$\")) {\r\n headers[\"Content-ID\"] = request.contentId;\r\n }\r\n }\r\n\r\n if (request.contentRange) {\r\n ErrorHelper.stringParameterCheck(request.contentRange, `DynamicsWebApi.${request.functionName}`, \"request.contentRange\");\r\n headers[\"Content-Range\"] = request.contentRange;\r\n }\r\n\r\n if (request.range) {\r\n ErrorHelper.stringParameterCheck(request.range, `DynamicsWebApi.${request.functionName}`, \"request.range\");\r\n headers[\"Range\"] = request.range;\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n static composePreferHeader(request: Core.InternalRequest, config: Config): string {\r\n let returnRepresentation: boolean | null | undefined = request.returnRepresentation;\r\n let includeAnnotations: string | null | undefined = request.includeAnnotations;\r\n let maxPageSize: number | null | undefined = request.maxPageSize;\r\n let trackChanges: boolean | null | undefined = request.trackChanges;\r\n let continueOnError: boolean | null | undefined = request.continueOnError;\r\n\r\n let prefer: string[] = [];\r\n\r\n if (request.prefer && request.prefer.length) {\r\n ErrorHelper.stringOrArrayParameterCheck(request.prefer, `DynamicsWebApi.${request.functionName}`, \"request.prefer\");\r\n if (typeof request.prefer === \"string\") {\r\n prefer = request.prefer.split(\",\");\r\n }\r\n for (let i in prefer) {\r\n let item = prefer[i].trim();\r\n if (item === \"return=representation\") {\r\n returnRepresentation = true;\r\n } else if (item.includes(\"odata.include-annotations=\")) {\r\n includeAnnotations = item.replace(\"odata.include-annotations=\", \"\").replace(/\"/g, \"\");\r\n } else if (item.startsWith(\"odata.maxpagesize=\")) {\r\n maxPageSize = Number(item.replace(\"odata.maxpagesize=\", \"\").replace(/\"/g, \"\")) || 0;\r\n } else if (item.includes(\"odata.track-changes\")) {\r\n trackChanges = true;\r\n } else if (item.includes(\"odata.continue-on-error\")) {\r\n continueOnError = true;\r\n }\r\n }\r\n }\r\n\r\n //clear array\r\n prefer = [];\r\n\r\n if (config) {\r\n if (returnRepresentation == null) {\r\n returnRepresentation = config.returnRepresentation;\r\n }\r\n includeAnnotations = includeAnnotations ? includeAnnotations : config.includeAnnotations;\r\n maxPageSize = maxPageSize ? maxPageSize : config.maxPageSize;\r\n }\r\n\r\n if (returnRepresentation) {\r\n ErrorHelper.boolParameterCheck(returnRepresentation, `DynamicsWebApi.${request.functionName}`, \"request.returnRepresentation\");\r\n prefer.push(\"return=representation\");\r\n }\r\n\r\n if (includeAnnotations) {\r\n ErrorHelper.stringParameterCheck(includeAnnotations, `DynamicsWebApi.${request.functionName}`, \"request.includeAnnotations\");\r\n prefer.push(`odata.include-annotations=\"${includeAnnotations}\"`);\r\n }\r\n\r\n if (maxPageSize && maxPageSize > 0) {\r\n ErrorHelper.numberParameterCheck(maxPageSize, `DynamicsWebApi.${request.functionName}`, \"request.maxPageSize\");\r\n prefer.push(\"odata.maxpagesize=\" + maxPageSize);\r\n }\r\n\r\n if (trackChanges) {\r\n ErrorHelper.boolParameterCheck(trackChanges, `DynamicsWebApi.${request.functionName}`, \"request.trackChanges\");\r\n prefer.push(\"odata.track-changes\");\r\n }\r\n\r\n if (continueOnError) {\r\n ErrorHelper.boolParameterCheck(continueOnError, `DynamicsWebApi.${request.functionName}`, \"request.continueOnError\");\r\n prefer.push(\"odata.continue-on-error\");\r\n }\r\n\r\n return prefer.join(\",\");\r\n }\r\n\r\n static convertToBatch(requests: Core.InternalRequest[], config: InternalConfig, batchRequest?: Core.InternalRequest): Core.InternalBatchRequest {\r\n const batchBoundary = `dwa_batch_${Utility.generateUUID()}`;\r\n\r\n const batchBody: string[] = [];\r\n let currentChangeSet: string | null = null;\r\n let contentId = 100000;\r\n\r\n requests.forEach((internalRequest) => {\r\n internalRequest.functionName = \"executeBatch\";\r\n if (batchRequest?.inChangeSet === false) internalRequest.inChangeSet = false;\r\n const inChangeSet = internalRequest.method === \"GET\" ? false : !!internalRequest.inChangeSet;\r\n\r\n if (!inChangeSet && currentChangeSet) {\r\n //end current change set\r\n batchBody.push(`\\n--${currentChangeSet}--`);\r\n\r\n currentChangeSet = null;\r\n contentId = 100000;\r\n }\r\n\r\n if (!currentChangeSet) {\r\n batchBody.push(`\\n--${batchBoundary}`);\r\n\r\n if (inChangeSet) {\r\n currentChangeSet = `changeset_${Utility.generateUUID()}`;\r\n batchBody.push(\"Content-Type: multipart/mixed;boundary=\" + currentChangeSet);\r\n }\r\n }\r\n\r\n if (inChangeSet) {\r\n batchBody.push(`\\n--${currentChangeSet}`);\r\n }\r\n\r\n batchBody.push(\"Content-Type: application/http\");\r\n batchBody.push(\"Content-Transfer-Encoding: binary\");\r\n\r\n if (inChangeSet) {\r\n const contentIdValue = internalRequest.headers!.hasOwnProperty(\"Content-ID\") ? internalRequest.headers![\"Content-ID\"] : ++contentId;\r\n\r\n batchBody.push(`Content-ID: ${contentIdValue}`);\r\n }\r\n\r\n if (!internalRequest.path?.startsWith(\"$\")) {\r\n batchBody.push(`\\n${internalRequest.method} ${config.dataApi.url}${internalRequest.path} HTTP/1.1`);\r\n } else {\r\n batchBody.push(`\\n${internalRequest.method} ${internalRequest.path} HTTP/1.1`);\r\n }\r\n\r\n if (internalRequest.method === \"GET\") {\r\n batchBody.push(\"Accept: application/json\");\r\n } else {\r\n batchBody.push(\"Content-Type: application/json\");\r\n }\r\n\r\n for (let key in internalRequest.headers) {\r\n if (key === \"Authorization\" || key === \"Content-ID\") continue;\r\n\r\n batchBody.push(`${key}: ${internalRequest.headers[key]}`);\r\n }\r\n\r\n if (internalRequest.data) {\r\n batchBody.push(`\\n${RequestUtility.processData(internalRequest.data, config)}`);\r\n }\r\n });\r\n\r\n if (currentChangeSet) {\r\n batchBody.push(`\\n--${currentChangeSet}--`);\r\n }\r\n\r\n batchBody.push(`\\n--${batchBoundary}--`);\r\n\r\n const headers = RequestUtility.setStandardHeaders(batchRequest?.userHeaders);\r\n headers[\"Content-Type\"] = `multipart/mixed;boundary=${batchBoundary}`;\r\n\r\n return { headers: headers, body: batchBody.join(\"\\n\") };\r\n }\r\n\r\n static entityNames: any = null;\r\n\r\n static findCollectionName(entityName: string): string | null {\r\n let collectionName = null;\r\n\r\n if (!Utility.isNull(RequestUtility.entityNames)) {\r\n collectionName = RequestUtility.entityNames[entityName];\r\n if (Utility.isNull(collectionName)) {\r\n for (let key in RequestUtility.entityNames) {\r\n if (RequestUtility.entityNames[key] === entityName) {\r\n return entityName;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return collectionName;\r\n }\r\n\r\n static processData(data: any, config: InternalConfig): string | Uint8Array | Uint16Array | Uint32Array | null {\r\n let stringifiedData: string | null = null;\r\n if (data) {\r\n if (data instanceof Uint8Array || data instanceof Uint16Array || data instanceof Uint32Array) return data;\r\n\r\n stringifiedData = JSON.stringify(data, (key, value) => {\r\n if (key.endsWith(\"@odata.bind\") || key.endsWith(\"@odata.id\")) {\r\n if (typeof value === \"string\" && !value.startsWith(\"$\")) {\r\n //remove brackets in guid\r\n if (/\\(\\{[\\w\\d-]+\\}\\)/g.test(value)) {\r\n value = value.replace(/(.+)\\(\\{([\\w\\d-]+)\\}\\)/g, \"$1($2)\");\r\n }\r\n\r\n if (config.useEntityNames) {\r\n //replace entity name with collection name\r\n const regularExpression = /([\\w_]+)(\\([\\d\\w-]+\\))$/;\r\n const valueParts = regularExpression.exec(value);\r\n if (valueParts && valueParts.length > 2) {\r\n const collectionName = RequestUtility.findCollectionName(valueParts[1]);\r\n\r\n if (!Utility.isNull(collectionName)) {\r\n value = value.replace(regularExpression, collectionName + \"$2\");\r\n }\r\n }\r\n }\r\n\r\n if (!value.startsWith(config.dataApi.url)) {\r\n //add full web api url if it's not set\r\n if (key.endsWith(\"@odata.bind\")) {\r\n if (!value.startsWith(\"/\")) {\r\n value = \"/\" + value;\r\n }\r\n } else {\r\n value = config.dataApi.url + value.replace(/^\\//, \"\");\r\n }\r\n }\r\n }\r\n } else if (key.startsWith(\"oData\") || key.endsWith(\"_Formatted\") || key.endsWith(\"_NavigationProperty\") || key.endsWith(\"_LogicalName\")) {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n });\r\n\r\n stringifiedData = stringifiedData.replace(/[\\u007F-\\uFFFF]/g, function (chr: string) {\r\n return \"\\\\u\" + (\"0000\" + chr.charCodeAt(0).toString(16)).slice(-4);\r\n });\r\n }\r\n\r\n return stringifiedData;\r\n }\r\n\r\n static setStandardHeaders(headers: HeaderCollection = {}): any {\r\n if (!headers[\"Accept\"]) headers[\"Accept\"] = \"application/json\";\r\n if (!headers[\"OData-MaxVersion\"]) headers[\"OData-MaxVersion\"] = \"4.0\";\r\n if (!headers[\"OData-Version\"]) headers[\"OData-Version\"] = \"4.0\";\r\n if (headers[\"Content-Range\"]) headers[\"Content-Type\"] = \"application/octet-stream\";\r\n else if (!headers[\"Content-Type\"]) headers[\"Content-Type\"] = \"application/json; charset=utf-8\";\r\n\r\n return headers;\r\n }\r\n}\r\n", "import { Core } from \"../../types\";\r\n\r\nexport async function executeRequest(options: Core.RequestOptions): Promise {\r\n return global.DWA_BROWSER ? require(\"../xhr\").executeRequest(options) : require(\"../http\").executeRequest(options);\r\n}\r\n"], - "mappings": "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", - "names": ["executeRequest", "executeRequest", "request"] + "sourcesContent": ["export function getCrypto(): T {\r\n return global.DWA_BROWSER ? global.window.crypto : require(\"./crypto/node\").getCrypto();\r\n}\r\n\r\nexport function generateRandomBytes() {\r\n return global.DWA_BROWSER ? getCrypto().getRandomValues(new Uint8Array(1)) : getCrypto().randomBytes(1);\r\n}\r\n", "const uuid = \"[0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12}\";\r\n\r\nexport function isUuid(value: string): boolean {\r\n const match = new RegExp(uuid, \"i\").exec(value);\r\n return !!match;\r\n}\r\n\r\nexport function extractUuid(value: string): string | null {\r\n const match = new RegExp(\"^{?(\" + uuid + \")}?$\", \"i\").exec(value);\r\n return match ? match[1] : null;\r\n}\r\n\r\nexport function extractUuidFromUrl(url: string): string | null {\r\n const match = new RegExp(\"(\" + uuid + \")\\\\)$\", \"i\").exec(url);\r\n return match ? match[1] : null;\r\n}\r\n", "\uFEFFimport type * as Core from \"../types\";\r\nimport { generateRandomBytes } from \"../helpers/Crypto\";\r\nimport { isUuid, extractUuid } from \"../helpers/Regex\";\r\n\r\ndeclare var GetGlobalContext: any;\r\ndeclare var Xrm: any;\r\n\r\n// function isNodeEnv(): boolean {\r\n// // tslint:disable:strict-type-predicates\r\n// return Object.prototype.toString.call(typeof process !== \"undefined\" ? process : 0) === \"[object process]\";\r\n// }\r\n\r\n// function getGlobalObject(): T {\r\n// return (isNodeEnv() ? global : typeof window !== \"undefined\" ? window : typeof self !== \"undefined\" ? self : {}) as T;\r\n// }\r\n\r\nconst downloadChunkSize = 4194304;\r\n\r\nexport class Utility {\r\n /**\r\n * Builds parametes for a funciton. Returns '()' (if no parameters) or '([params])?[query]'\r\n *\r\n * @param {Object} [parameters] - Function's input parameters. Example: { param1: \"test\", param2: 3 }.\r\n * @returns {string}\r\n */\r\n static buildFunctionParameters(parameters?: any): Core.FunctionParameters {\r\n if (parameters) {\r\n const parameterNames = Object.keys(parameters);\r\n const functionParams: string[] = [];\r\n const urlQuery: string[] = [];\r\n\r\n for (let i = 1; i <= parameterNames.length; i++) {\r\n const parameterName = parameterNames[i - 1];\r\n let value = parameters[parameterName];\r\n\r\n if (value == null) continue;\r\n\r\n if (typeof value === \"string\" && !value.startsWith(\"Microsoft.Dynamics.CRM\") && !isUuid(value)) {\r\n value = `'${value}'`;\r\n } else if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n\r\n functionParams.push(`${parameterName}=@p${i}`);\r\n urlQuery.push(`@p${i}=${extractUuid(value) || value}`);\r\n }\r\n\r\n return {\r\n key: `(${functionParams.join(\",\")})`,\r\n queryParams: urlQuery,\r\n };\r\n } else {\r\n return {\r\n key: \"()\",\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Parses a paging cookie returned in response\r\n *\r\n * @param {string} pageCookies - Page cookies returned in @Microsoft.Dynamics.CRM.fetchxmlpagingcookie.\r\n * @param {number} currentPageNumber - A current page number. Fix empty paging-cookie for complex fetch xmls.\r\n * @returns {{cookie: \"\", number: 0, next: 1}}\r\n */\r\n static getFetchXmlPagingCookie(pageCookies: string = \"\", currentPageNumber: number = 1): Core.FetchXmlCookie {\r\n //get the page cokies\r\n pageCookies = decodeURIComponent(decodeURIComponent(pageCookies));\r\n\r\n const info = /pagingcookie=\"()/.exec(pageCookies);\r\n\r\n if (info != null) {\r\n let page = parseInt(info[2]);\r\n return {\r\n cookie: info[1]\r\n .replace(//g, \">\")\r\n .replace(/\\\"/g, \"'\")\r\n .replace(/\\'/g, \"&\" + \"quot;\"),\r\n page: page,\r\n nextPage: page + 1,\r\n };\r\n } else {\r\n //http://stackoverflow.com/questions/41262772/execution-of-fetch-xml-using-web-api-dynamics-365 workaround\r\n return {\r\n cookie: \"\",\r\n page: currentPageNumber,\r\n nextPage: currentPageNumber + 1,\r\n };\r\n }\r\n }\r\n\r\n // static isNodeEnv = isNodeEnv;\r\n\r\n static downloadChunkSize = downloadChunkSize;\r\n\r\n /**\r\n * Converts a response to a reference object\r\n *\r\n * @param {Object} responseData - Response object\r\n * @returns {ReferenceObject}\r\n */\r\n static convertToReferenceObject(responseData: any): Core.ReferenceObject {\r\n const result = /\\/(\\w+)\\(([0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12})/i.exec(responseData[\"@odata.id\"]);\r\n return { id: result![2], collection: result![1], oDataContext: responseData[\"@odata.context\"] };\r\n }\r\n\r\n /**\r\n * Checks whether the value is JS Null.\r\n * @param {Object} value\r\n * @returns {boolean}\r\n */\r\n static isNull(value: any): boolean {\r\n return typeof value === \"undefined\" || value == null;\r\n }\r\n\r\n /** Generates UUID */\r\n static generateUUID(): string {\r\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) => (c ^ (generateRandomBytes()[0] & (15 >> (c / 4)))).toString(16));\r\n }\r\n\r\n static getXrmContext(): any {\r\n if (typeof GetGlobalContext !== \"undefined\") {\r\n return GetGlobalContext();\r\n } else {\r\n if (typeof Xrm !== \"undefined\") {\r\n //d365 v.9.0\r\n if (!Utility.isNull(Xrm.Utility) && !Utility.isNull(Xrm.Utility.getGlobalContext)) {\r\n return Xrm.Utility.getGlobalContext();\r\n } else if (!Utility.isNull(Xrm.Page) && !Utility.isNull(Xrm.Page.context)) {\r\n return Xrm.Page.context;\r\n }\r\n }\r\n }\r\n\r\n throw new Error(\r\n \"Xrm Context is not available. In most cases, it can be resolved by adding a reference to a ClientGlobalContext.js.aspx. Please refer to MSDN documentation for more details.\"\r\n );\r\n }\r\n\r\n // static getXrmUtility(): any {\r\n // return typeof Xrm !== \"undefined\" ? Xrm.Utility : null;\r\n // }\r\n\r\n static getClientUrl(): string {\r\n const context = Utility.getXrmContext();\r\n\r\n let clientUrl = context.getClientUrl();\r\n\r\n if (clientUrl.match(/\\/$/)) {\r\n clientUrl = clientUrl.substring(0, clientUrl.length - 1);\r\n }\r\n return clientUrl;\r\n }\r\n\r\n /**\r\n * Checks whether the app is currently running in a Dynamics Portals Environment.\r\n *\r\n * In that case we switch to the Web API for Dynamics Portals.\r\n * @returns {boolean}\r\n */\r\n static isRunningWithinPortals(): boolean {\r\n return global.DWA_BROWSER ? !!global.window.shell : false;\r\n }\r\n\r\n static isObject(obj: any): boolean {\r\n return typeof obj === \"object\" && !!obj && !Array.isArray(obj) && Object.prototype.toString.call(obj) !== \"[object Date]\";\r\n }\r\n\r\n static copyObject(src: any, excludeProps?: string[]): T {\r\n let target = {};\r\n for (let prop in src) {\r\n if (src.hasOwnProperty(prop) && !excludeProps?.includes(prop)) {\r\n // if the value is a nested object, recursively copy all its properties\r\n if (Utility.isObject(src[prop])) {\r\n target[prop] = Utility.copyObject(src[prop]);\r\n } else if (Array.isArray(src[prop])) {\r\n target[prop] = src[prop].slice();\r\n } else {\r\n target[prop] = src[prop];\r\n }\r\n }\r\n }\r\n return target;\r\n }\r\n\r\n static copyRequest(src: any, excludeProps: string[] = []): Core.InternalRequest {\r\n //todo: do we need to include \"data\" in here?\r\n if (!excludeProps.includes(\"signal\")) excludeProps.push(\"signal\");\r\n\r\n const result = Utility.copyObject(src, excludeProps);\r\n result.signal = src.signal;\r\n\r\n return result;\r\n }\r\n\r\n static setFileChunk(request: Core.InternalRequest, fileBuffer: Uint8Array | Buffer, chunkSize: number, offset: number): void {\r\n offset = offset || 0;\r\n\r\n const count = offset + chunkSize > fileBuffer.length ? fileBuffer.length % chunkSize : chunkSize;\r\n\r\n let content: any;\r\n\r\n if (global.DWA_BROWSER) {\r\n content = new Uint8Array(count);\r\n for (let i = 0; i < count; i++) {\r\n content[i] = fileBuffer[offset + i];\r\n }\r\n } else {\r\n content = fileBuffer.slice(offset, offset + count);\r\n }\r\n\r\n request.data = content;\r\n request.contentRange = \"bytes \" + offset + \"-\" + (offset + count - 1) + \"/\" + fileBuffer.length;\r\n }\r\n\r\n static convertToFileBuffer(binaryString: string): Uint8Array | Buffer {\r\n if (!global.DWA_BROWSER) return Buffer.from(binaryString, \"binary\");\r\n\r\n const bytes = new Uint8Array(binaryString.length);\r\n for (var i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n return bytes;\r\n }\r\n}\r\n", "\uFEFFimport { AccessToken } from \"../dynamics-web-api\";\r\nimport { extractUuid } from \"./Regex\";\r\n\r\nexport interface DynamicsWebApiError extends Error {\r\n status: number;\r\n}\r\n\r\nfunction throwParameterError(functionName: string, parameterName: string, type: string | null | undefined): void {\r\n throw new Error(\r\n type ? `${functionName} requires a ${parameterName} parameter to be of type ${type}.` : `${functionName} requires a ${parameterName} parameter.`\r\n );\r\n}\r\n\r\nexport class ErrorHelper {\r\n static handleErrorResponse(req): void {\r\n throw new Error(`Error: ${req.status}: ${req.message}`);\r\n }\r\n\r\n static parameterCheck(parameter: any, functionName: string, parameterName: string, type?: string): void {\r\n if (typeof parameter === \"undefined\" || parameter === null || parameter === \"\") {\r\n throwParameterError(functionName, parameterName, type);\r\n }\r\n }\r\n\r\n static stringParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter !== \"string\") {\r\n throwParameterError(functionName, parameterName, \"String\");\r\n }\r\n }\r\n\r\n static maxLengthStringParameterCheck(parameter: string | null, functionName: string, parameterName: string, maxLength: number): void {\r\n if (!parameter) return;\r\n\r\n if (parameter.length > maxLength) {\r\n throw new Error(`${parameterName} has a ${maxLength} character limit.`);\r\n }\r\n }\r\n\r\n static arrayParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (parameter.constructor !== Array) {\r\n throwParameterError(functionName, parameterName, \"Array\");\r\n }\r\n }\r\n\r\n static stringOrArrayParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (parameter.constructor !== Array && typeof parameter !== \"string\") {\r\n throwParameterError(functionName, parameterName, \"String or Array\");\r\n }\r\n }\r\n\r\n static numberParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter != \"number\") {\r\n if (typeof parameter === \"string\" && parameter) {\r\n if (!isNaN(parseInt(parameter))) {\r\n return;\r\n }\r\n }\r\n throwParameterError(functionName, parameterName, \"Number\");\r\n }\r\n }\r\n\r\n static batchIsEmpty(): Error[] {\r\n return [\r\n new Error(\r\n \"Payload of the batch operation is empty. Please make that you have other operations in between startBatch() and executeBatch() to successfuly build a batch payload.\"\r\n ),\r\n ];\r\n }\r\n\r\n static handleHttpError(parsedError: any, parameters?: any): DynamicsWebApiError {\r\n const error = new Error();\r\n\r\n Object.keys(parsedError).forEach((k) => {\r\n error[k] = parsedError[k];\r\n });\r\n\r\n if (parameters) {\r\n Object.keys(parameters).forEach((k) => {\r\n error[k] = parameters[k];\r\n });\r\n }\r\n\r\n return error;\r\n }\r\n\r\n static boolParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter != \"boolean\") {\r\n throwParameterError(functionName, parameterName, \"Boolean\");\r\n }\r\n }\r\n\r\n /**\r\n * Private function used to check whether required parameter is a valid GUID\r\n * @param parameter The GUID parameter to check\r\n * @param functionName\r\n * @param parameterName\r\n * @returns\r\n */\r\n static guidParameterCheck(parameter: any, functionName: string, parameterName: string): string {\r\n const match = extractUuid(parameter);\r\n if (!match) throwParameterError(functionName, parameterName, \"GUID String\");\r\n\r\n return match!;\r\n }\r\n\r\n static keyParameterCheck(parameter: any, functionName: string, parameterName: string): string | undefined {\r\n try {\r\n ErrorHelper.stringParameterCheck(parameter, functionName, parameterName);\r\n\r\n //check if the param is a guid\r\n const match = extractUuid(parameter);\r\n if (match) return match;\r\n\r\n //check the alternate key\r\n const alternateKeys = parameter.split(\",\");\r\n\r\n if (alternateKeys.length) {\r\n for (let i = 0; i < alternateKeys.length; i++) {\r\n alternateKeys[i] = alternateKeys[i].trim().replace(/\"/g, \"'\");\r\n /^[\\w\\d\\_]+\\=(.+)$/i.exec(alternateKeys[i])![0];\r\n }\r\n }\r\n\r\n return alternateKeys.join(\",\");\r\n } catch (error) {\r\n throwParameterError(functionName, parameterName, \"String representing GUID or Alternate Key\");\r\n }\r\n }\r\n\r\n static callbackParameterCheck(callbackParameter: () => Promise, functionName: string, parameterName: string): void {\r\n if (typeof callbackParameter != \"function\") {\r\n throwParameterError(functionName, parameterName, \"Function\");\r\n }\r\n }\r\n\r\n static throwBatchIncompatible(functionName: string, isBatch: boolean): void {\r\n if (isBatch) {\r\n isBatch = false;\r\n throw new Error(functionName + \" cannot be used in a BATCH request.\");\r\n }\r\n }\r\n\r\n static throwBatchNotStarted(isBatch: boolean): void {\r\n if (!isBatch) {\r\n throw new Error(\r\n \"Batch operation has not been started. Please call a DynamicsWebApi.startBatch() function prior to calling DynamicsWebApi.executeBatch() to perform a batch request correctly.\"\r\n );\r\n }\r\n }\r\n}\r\n", "class DWA {\r\n\tstatic Prefer = class {\r\n\t\tstatic ReturnRepresentation: string = \"return=representation\";\r\n\t\tstatic Annotations = class {\r\n\t\t\tstatic AssociatedNavigationProperty: string = \"Microsoft.Dynamics.CRM.associatednavigationproperty\";\r\n\t\t\tstatic LookupLogicalName: string = \"Microsoft.Dynamics.CRM.lookuplogicalname\";\r\n\t\t\tstatic All: string = \"*\";\r\n\t\t\tstatic FormattedValue: string = \"OData.Community.Display.V1.FormattedValue\";\r\n\t\t\tstatic FetchXmlPagingCookie: string = \"Microsoft.Dynamics.CRM.fetchxmlpagingcookie\";\r\n\t\t};\r\n\t\tstatic IncludeAnnotations: string = \"odata.include-annotations\";\r\n\t\tstatic get(annotation: string) {\r\n\t\t\treturn `${DWA.Prefer.IncludeAnnotations}=\"${annotation}\"`;\r\n\t\t}\r\n\t};\r\n}\r\n\r\nexport { DWA };\r\n", "\uFEFFexport function dateReviver(key: string, value: any): Date {\r\n\tif (typeof value === \"string\") {\r\n\t\tconst a = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:Z|[-+]\\d{2}:\\d{2})$/.exec(value);\r\n\t\tif (a) {\r\n\t\t\treturn new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));\r\n\t\t}\r\n\t}\r\n\treturn value;\r\n}\r\n", "\uFEFFimport { DWA } from \"../../dwa\";\r\nimport { Utility } from \"../../utils/Utility\";\r\nimport { ErrorHelper, DynamicsWebApiError } from \"../../helpers/ErrorHelper\";\r\nimport { dateReviver } from \"./dateReviver\";\r\nimport type * as Core from \"../../types\";\r\nimport { extractUuidFromUrl } from \"../../helpers/Regex\";\r\n\r\nfunction getFormattedKeyValue(keyName: string, value: any): any[] {\r\n let newKey: string | null = null;\r\n if (keyName.indexOf(\"@\") !== -1) {\r\n const format = keyName.split(\"@\");\r\n switch (format[1]) {\r\n case \"odata.context\":\r\n newKey = \"oDataContext\";\r\n break;\r\n case \"odata.count\":\r\n newKey = \"oDataCount\";\r\n value = value != null ? parseInt(value) : 0;\r\n break;\r\n case \"odata.nextLink\":\r\n newKey = \"oDataNextLink\";\r\n break;\r\n case \"odata.deltaLink\":\r\n newKey = \"oDataDeltaLink\";\r\n break;\r\n case DWA.Prefer.Annotations.FormattedValue:\r\n newKey = format[0] + \"_Formatted\";\r\n break;\r\n case DWA.Prefer.Annotations.AssociatedNavigationProperty:\r\n newKey = format[0] + \"_NavigationProperty\";\r\n break;\r\n case DWA.Prefer.Annotations.LookupLogicalName:\r\n newKey = format[0] + \"_LogicalName\";\r\n break;\r\n }\r\n }\r\n\r\n return [newKey, value];\r\n}\r\n\r\n/**\r\n *\r\n * @param {any} object - parsed JSON object\r\n * @param {any} parseParams - parameters for parsing the response\r\n * @returns {any} parsed batch response\r\n */\r\nfunction parseData(object: any, parseParams?: any): any {\r\n if (parseParams) {\r\n if (parseParams.isRef && object[\"@odata.id\"] != null) {\r\n return Utility.convertToReferenceObject(object);\r\n }\r\n\r\n if (parseParams.toCount) {\r\n return getFormattedKeyValue(\"@odata.count\", object[\"@odata.count\"])[1] || 0;\r\n }\r\n }\r\n\r\n const keys = Object.keys(object);\r\n\r\n for (let i = 0; i < keys.length; i++) {\r\n const currentKey = keys[i];\r\n\r\n if (object[currentKey] != null) {\r\n if (object[currentKey].constructor === Array) {\r\n for (var j = 0; j < object[currentKey].length; j++) {\r\n object[currentKey][j] = parseData(object[currentKey][j]);\r\n }\r\n } else if (typeof object[currentKey] === \"object\") {\r\n parseData(object[currentKey]);\r\n }\r\n }\r\n\r\n //parse formatted values\r\n let formattedKeyValue = getFormattedKeyValue(currentKey, object[currentKey]);\r\n if (formattedKeyValue[0]) {\r\n object[formattedKeyValue[0]] = formattedKeyValue[1];\r\n }\r\n\r\n //parse aliased values\r\n if (currentKey.indexOf(\"_x002e_\") !== -1) {\r\n const aliasKeys = currentKey.split(\"_x002e_\");\r\n\r\n if (!object.hasOwnProperty(aliasKeys[0])) {\r\n object[aliasKeys[0]] = { _dwaType: \"alias\" };\r\n }\r\n //throw an error if there is already a property which is not an 'alias'\r\n else if (\r\n typeof object[aliasKeys[0]] !== \"object\" ||\r\n (typeof object[aliasKeys[0]] === \"object\" && !object[aliasKeys[0]].hasOwnProperty(\"_dwaType\"))\r\n ) {\r\n throw new Error(\"The alias name of the linked entity must be unique!\");\r\n }\r\n\r\n object[aliasKeys[0]][aliasKeys[1]] = object[currentKey];\r\n\r\n //aliases also contain formatted values\r\n formattedKeyValue = getFormattedKeyValue(aliasKeys[1], object[currentKey]);\r\n if (formattedKeyValue[0]) {\r\n object[aliasKeys[0]][formattedKeyValue[0]] = formattedKeyValue[1];\r\n }\r\n }\r\n }\r\n\r\n if (parseParams) {\r\n if (parseParams.hasOwnProperty(\"pageNumber\") && object[\"@\" + DWA.Prefer.Annotations.FetchXmlPagingCookie] != null) {\r\n object.PagingInfo = Utility.getFetchXmlPagingCookie(object[\"@\" + DWA.Prefer.Annotations.FetchXmlPagingCookie], parseParams.pageNumber);\r\n }\r\n }\r\n\r\n return object;\r\n}\r\n\r\nconst responseHeaderRegex = /^([^()<>@,;:\\\\\"\\/[\\]?={} \\t]+)\\s?:\\s?(.*)/;\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction parseBatchHeaders(text: string): any {\r\n const ctx = { position: 0 };\r\n const headers = {};\r\n let parts;\r\n let line;\r\n let pos;\r\n\r\n do {\r\n pos = ctx.position;\r\n line = readLine(text, ctx);\r\n parts = responseHeaderRegex.exec(line);\r\n if (parts !== null) {\r\n headers[parts[1].toLowerCase()] = parts[2];\r\n } else {\r\n // Whatever was found is not a header, so reset the context position.\r\n ctx.position = pos;\r\n }\r\n } while (line && parts);\r\n\r\n return headers;\r\n}\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction readLine(text: string, ctx: { position: number }): string | null {\r\n return readTo(text, ctx, \"\\r\\n\");\r\n}\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction readTo(text: string, ctx: { position: number }, str: string): string | null {\r\n const start = ctx.position || 0;\r\n let end = text.length;\r\n if (str) {\r\n end = text.indexOf(str, start);\r\n if (end === -1) {\r\n return null;\r\n }\r\n ctx.position = end + str.length;\r\n } else {\r\n ctx.position = end;\r\n }\r\n\r\n return text.substring(start, end);\r\n}\r\n\r\n//partially taken from https://github.com/emiltholin/google-api-batch-utils\r\n/**\r\n *\r\n * @param {string} response - response that needs to be parsed\r\n * @param {Array} parseParams - parameters for parsing the response\r\n * @param {Number} [requestNumber] - number of the request\r\n * @returns {any} parsed batch response\r\n */\r\nfunction parseBatchResponse(response: string, parseParams: any, requestNumber: number = 0): (string | undefined | DynamicsWebApiError | Number)[] {\r\n // Not the same delimiter in the response as we specify ourselves in the request,\r\n // so we have to extract it.\r\n const delimiter = response.substr(0, response.indexOf(\"\\r\\n\"));\r\n const batchResponseParts = response.split(delimiter);\r\n // The first part will always be an empty string. Just remove it.\r\n batchResponseParts.shift();\r\n // The last part will be the \"--\". Just remove it.\r\n batchResponseParts.pop();\r\n\r\n let result: (string | undefined | DynamicsWebApiError | Number)[] = [];\r\n for (let i = 0; i < batchResponseParts.length; i++) {\r\n let batchResponse = batchResponseParts[i];\r\n if (batchResponse.indexOf(\"--changesetresponse_\") > -1) {\r\n batchResponse = batchResponse.trim();\r\n const batchToProcess = batchResponse.substring(batchResponse.indexOf(\"\\r\\n\") + 1).trim();\r\n\r\n result = result.concat(parseBatchResponse(batchToProcess, parseParams, requestNumber));\r\n } else {\r\n //check http status\r\n const httpStatusReg = /HTTP\\/?\\s*[\\d.]*\\s+(\\d{3})\\s+([\\w\\s]*)$/gm.exec(batchResponse);\r\n //todo: add error handler for httpStatus and httpStatusMessage; remove \"!\" operator\r\n const httpStatus = parseInt(httpStatusReg![1]);\r\n const httpStatusMessage = httpStatusReg![2].trim();\r\n\r\n const responseData = batchResponse.substring(batchResponse.indexOf(\"{\"), batchResponse.lastIndexOf(\"}\") + 1);\r\n\r\n if (!responseData) {\r\n if (/Content-Type: text\\/plain/i.test(batchResponse)) {\r\n const plainContentReg = /\\w+$/gi.exec(batchResponse.trim());\r\n const plainContent = plainContentReg && plainContentReg.length ? plainContentReg[0] : undefined;\r\n\r\n //check if a plain content is a number or not\r\n result.push(isNaN(Number(plainContent)) ? plainContent : Number(plainContent));\r\n } else {\r\n if (parseParams.length && parseParams[requestNumber] && parseParams[requestNumber].hasOwnProperty(\"valueIfEmpty\")) {\r\n result.push(parseParams[requestNumber].valueIfEmpty);\r\n } else {\r\n const entityUrl = /OData-EntityId.+/i.exec(batchResponse);\r\n\r\n if (entityUrl && entityUrl.length) {\r\n const guidResult = extractUuidFromUrl(entityUrl[0]);\r\n result.push(guidResult ? guidResult : undefined);\r\n } else {\r\n result.push(undefined);\r\n }\r\n }\r\n }\r\n } else {\r\n const parsedResponse = parseData(JSON.parse(responseData, dateReviver), parseParams[requestNumber]);\r\n\r\n if (httpStatus >= 400) {\r\n const responseHeaders = parseBatchHeaders(\r\n //todo: add error handler for httpStatusReg; remove \"!\" operator\r\n batchResponse.substring(batchResponse.indexOf(httpStatusReg![0]) + httpStatusReg![0].length + 1, batchResponse.indexOf(\"{\"))\r\n );\r\n\r\n result.push(\r\n ErrorHelper.handleHttpError(parsedResponse, {\r\n status: httpStatus,\r\n statusText: httpStatusMessage,\r\n statusMessage: httpStatusMessage,\r\n headers: responseHeaders,\r\n })\r\n );\r\n } else {\r\n result.push(parsedResponse);\r\n }\r\n }\r\n }\r\n\r\n requestNumber++;\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction base64ToString(base64: string): string {\r\n return global.DWA_BROWSER ? global.window.atob(base64) : Buffer.from(base64, \"base64\").toString(\"binary\");\r\n}\r\n\r\nfunction parseFileResponse(response: any, responseHeaders: any, parseParams: any): Core.FileParseResult {\r\n let data = response;\r\n\r\n if (parseParams.hasOwnProperty(\"parse\")) {\r\n data = JSON.parse(data).value;\r\n data = base64ToString(data);\r\n }\r\n\r\n var parseResult: Core.FileParseResult = {\r\n value: data,\r\n };\r\n\r\n if (responseHeaders[\"x-ms-file-name\"]) parseResult.fileName = responseHeaders[\"x-ms-file-name\"];\r\n\r\n if (responseHeaders[\"x-ms-file-size\"]) parseResult.fileSize = parseInt(responseHeaders[\"x-ms-file-size\"]);\r\n\r\n if (hasHeader(responseHeaders, \"Location\")) parseResult.location = getHeader(responseHeaders, \"Location\");\r\n\r\n return parseResult;\r\n}\r\n\r\nfunction hasHeader(headers: any, name: string): boolean {\r\n return headers.hasOwnProperty(name) || headers.hasOwnProperty(name.toLowerCase());\r\n}\r\n\r\nfunction getHeader(headers: any, name: string): string {\r\n if (headers[name]) return headers[name];\r\n\r\n return headers[name.toLowerCase()];\r\n}\r\n\r\n/**\r\n *\r\n * @param {string} response - response that needs to be parsed\r\n * @param {Array} responseHeaders - response headers\r\n * @param {Array} parseParams - parameters for parsing the response\r\n * @returns {any} parsed response\r\n */\r\nexport function parseResponse(response: string, responseHeaders: any, parseParams: any[]): any {\r\n let parseResult: any = undefined;\r\n if (response.length) {\r\n if (response.indexOf(\"--batchresponse_\") > -1) {\r\n const batch = parseBatchResponse(response, parseParams);\r\n\r\n parseResult = parseParams.length === 1 && parseParams[0].convertedToBatch ? batch[0] : batch;\r\n } else {\r\n if (hasHeader(responseHeaders, \"Content-Disposition\")) {\r\n parseResult = parseFileResponse(response, responseHeaders, parseParams[0]);\r\n } else {\r\n const contentType = getHeader(responseHeaders, \"Content-Type\");\r\n if (contentType.startsWith(\"application/json\")) {\r\n parseResult = parseData(JSON.parse(response, dateReviver), parseParams[0]);\r\n } else {\r\n parseResult = isNaN(Number(response)) ? response : Number(response);\r\n }\r\n }\r\n }\r\n } else {\r\n if (parseParams.length && parseParams[0].hasOwnProperty(\"valueIfEmpty\")) {\r\n parseResult = parseParams[0].valueIfEmpty;\r\n } else if (hasHeader(responseHeaders, \"OData-EntityId\")) {\r\n const entityUrl = getHeader(responseHeaders, \"OData-EntityId\");\r\n\r\n const guidResult = extractUuidFromUrl(entityUrl);\r\n\r\n if (guidResult) {\r\n parseResult = guidResult;\r\n }\r\n } else if (hasHeader(responseHeaders, \"Location\")) {\r\n parseResult = {\r\n location: getHeader(responseHeaders, \"Location\"),\r\n };\r\n\r\n if (responseHeaders[\"x-ms-chunk-size\"]) parseResult.chunkSize = parseInt(responseHeaders[\"x-ms-chunk-size\"]);\r\n }\r\n }\r\n\r\n return parseResult;\r\n}\r\n", "\uFEFFexport function parseResponseHeaders(headerStr: string): any {\r\n\tconst headers = {};\r\n\tif (!headerStr) {\r\n\t\treturn headers;\r\n\t}\r\n\tconst headerPairs = headerStr.split(\"\\u000d\\u000a\");\r\n\tfor (let i = 0, ilen = headerPairs.length; i < ilen; i++) {\r\n\t\tconst headerPair = headerPairs[i];\r\n\t\tconst index = headerPair.indexOf(\"\\u003a\\u0020\");\r\n\t\tif (index > 0) {\r\n\t\t\theaders[headerPair.substring(0, index)] = headerPair.substring(index + 2);\r\n\t\t}\r\n\t}\r\n\treturn headers;\r\n}\r\n", "\uFEFFimport type * as Core from \"../types\";\r\nimport { ErrorHelper } from \"./../helpers/ErrorHelper\";\r\nimport { parseResponse } from \"./helpers/parseResponse\";\r\nimport { parseResponseHeaders } from \"./helpers/parseResponseHeaders\";\r\n\r\nexport function executeRequest(options: Core.RequestOptions): Promise {\r\n return new Promise((resolve, reject) => {\r\n _executeRequest(options, resolve, reject);\r\n });\r\n}\r\n\r\nfunction _executeRequest(\r\n options: Core.RequestOptions,\r\n successCallback: (response: Core.WebApiResponse) => void,\r\n errorCallback: (error: Core.WebApiErrorResponse | Core.WebApiErrorResponse[]) => void\r\n) {\r\n const data = options.data;\r\n const headers = options.headers;\r\n const responseParams = options.responseParams;\r\n const signal = options.abortSignal;\r\n\r\n if (signal?.aborted) {\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n name: \"AbortError\",\r\n code: 20,\r\n message: \"The user aborted a request.\",\r\n })\r\n );\r\n\r\n return;\r\n }\r\n\r\n let request = new XMLHttpRequest();\r\n request.open(options.method, options.uri, options.isAsync || false);\r\n\r\n //set additional headers\r\n for (let key in headers) {\r\n request.setRequestHeader(key, headers[key]);\r\n }\r\n\r\n request.onreadystatechange = function () {\r\n if (request.readyState === 4) {\r\n if (signal) signal.removeEventListener(\"abort\", abort);\r\n\r\n switch (request.status) {\r\n case 200: // Success with content returned in response body.\r\n case 201: // Success with content returned in response body.\r\n case 204: // Success with no content returned in response body.\r\n case 206: // Success with partial content.\r\n case 304: {\r\n // Success with Not Modified\r\n const responseHeaders = parseResponseHeaders(request.getAllResponseHeaders());\r\n const responseData = parseResponse(request.responseText, responseHeaders, responseParams[options.requestId]);\r\n\r\n const response = {\r\n data: responseData,\r\n headers: responseHeaders,\r\n status: request.status,\r\n };\r\n\r\n request = null as any;\r\n\r\n successCallback(response);\r\n break;\r\n }\r\n case 0:\r\n break; //response will be handled by onerror\r\n default:\r\n if (!request) break; //response was handled somewhere else\r\n\r\n // All other statuses are error cases.\r\n let error;\r\n let headers;\r\n try {\r\n headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n const errorParsed = parseResponse(request.responseText, headers, responseParams[options.requestId]);\r\n\r\n if (Array.isArray(errorParsed)) {\r\n errorCallback(errorParsed);\r\n break;\r\n }\r\n\r\n error = errorParsed.error;\r\n } catch (e) {\r\n if (request.response.length > 0) {\r\n error = { message: request.response };\r\n } else {\r\n error = { message: \"Unexpected Error\" };\r\n }\r\n }\r\n\r\n const errorParameters = {\r\n status: request.status,\r\n statusText: request.statusText,\r\n headers: headers,\r\n };\r\n\r\n request = null as any;\r\n\r\n errorCallback(ErrorHelper.handleHttpError(error, errorParameters));\r\n\r\n break;\r\n }\r\n }\r\n };\r\n\r\n if (options.timeout) {\r\n request.timeout = options.timeout;\r\n }\r\n\r\n request.onerror = function () {\r\n const headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n status: request.status,\r\n statusText: request.statusText,\r\n message: request.responseText || \"Network Error\",\r\n headers: headers,\r\n })\r\n );\r\n request = null as any;\r\n };\r\n\r\n request.ontimeout = function () {\r\n const headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n name: \"TimeoutError\",\r\n status: request.status,\r\n statusText: request.statusText,\r\n message: request.responseText || \"Request Timed Out\",\r\n headers: headers,\r\n })\r\n );\r\n request = null as any;\r\n };\r\n\r\n //browser abort\r\n request.onabort = function () {\r\n if (!request) return;\r\n\r\n const headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n status: request.status,\r\n statusText: request.statusText,\r\n message: \"Request aborted\",\r\n headers: headers,\r\n })\r\n );\r\n request = null as any;\r\n };\r\n\r\n //manual abort/cancellation\r\n const abort = () => {\r\n if (!request) return;\r\n\r\n const headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n name: \"AbortError\",\r\n code: 20,\r\n status: request.status,\r\n statusText: request.statusText,\r\n message: \"The user aborted a request.\",\r\n headers: headers,\r\n })\r\n );\r\n\r\n request.abort();\r\n\r\n request = null as any;\r\n };\r\n\r\n if (signal) {\r\n signal.addEventListener(\"abort\", abort);\r\n }\r\n\r\n data ? request.send(data) : request.send();\r\n\r\n //called for testing\r\n if (XhrWrapper.afterSendEvent) XhrWrapper.afterSendEvent();\r\n}\r\n\r\n/**\r\n * Sends a request to given URL with given parameters\r\n */\r\nexport class XhrWrapper {\r\n //for testing\r\n static afterSendEvent: () => void;\r\n}\r\n", "import { Utility } from \"./Utility\";\r\nimport { ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { ApiConfig, Config } from \"../dynamics-web-api\";\r\n\r\ntype ApiType = \"dataApi\" | \"searchApi\";\r\n\r\nexport interface InternalApiConfig extends ApiConfig {\r\n url: string;\r\n}\r\n\r\nexport interface InternalConfig extends Config {\r\n dataApi: InternalApiConfig;\r\n searchApi: InternalApiConfig;\r\n}\r\n\r\nconst getApiUrl = (serverUrl: string | undefined | null, apiConfig: ApiConfig): string => {\r\n if (Utility.isRunningWithinPortals()) {\r\n return new URL(\"_api\", global.window.location.origin).toString() + \"/\";\r\n } else {\r\n if (!serverUrl) serverUrl = Utility.getClientUrl();\r\n return new URL(`api/${apiConfig.path}/v${apiConfig.version}`, serverUrl).toString() + \"/\";\r\n }\r\n};\r\n\r\nconst mergeApiConfigs = (apiConfig: ApiConfig | undefined, apiType: ApiType, internalConfig: InternalConfig): void => {\r\n const internalApiConfig = internalConfig[apiType] as InternalApiConfig;\r\n\r\n if (apiConfig?.version) {\r\n ErrorHelper.stringParameterCheck(apiConfig.version, \"DynamicsWebApi.setConfig\", `config.${apiType}.version`);\r\n internalApiConfig.version = apiConfig.version;\r\n }\r\n\r\n if (apiConfig?.path) {\r\n ErrorHelper.stringParameterCheck(apiConfig.path, \"DynamicsWebApi.setConfig\", `config.${apiType}.path`);\r\n internalApiConfig.path = apiConfig.path;\r\n }\r\n\r\n internalApiConfig.url = getApiUrl(internalConfig.serverUrl, internalApiConfig);\r\n};\r\n\r\nexport class ConfigurationUtility {\r\n static mergeApiConfigs = mergeApiConfigs;\r\n\r\n static merge(internalConfig: InternalConfig, config?: Config): void {\r\n if (config?.serverUrl) {\r\n ErrorHelper.stringParameterCheck(config.serverUrl, \"DynamicsWebApi.setConfig\", \"config.serverUrl\");\r\n internalConfig.serverUrl = config.serverUrl;\r\n }\r\n\r\n mergeApiConfigs(config?.dataApi, \"dataApi\", internalConfig);\r\n mergeApiConfigs(config?.searchApi, \"searchApi\", internalConfig);\r\n\r\n if (config?.impersonate) {\r\n internalConfig.impersonate = ErrorHelper.guidParameterCheck(config.impersonate, \"DynamicsWebApi.setConfig\", \"config.impersonate\");\r\n }\r\n\r\n if (config?.impersonateAAD) {\r\n internalConfig.impersonateAAD = ErrorHelper.guidParameterCheck(config.impersonateAAD, \"DynamicsWebApi.setConfig\", \"config.impersonateAAD\");\r\n }\r\n\r\n if (config?.onTokenRefresh) {\r\n ErrorHelper.callbackParameterCheck(config.onTokenRefresh, \"DynamicsWebApi.setConfig\", \"config.onTokenRefresh\");\r\n internalConfig.onTokenRefresh = config.onTokenRefresh;\r\n }\r\n\r\n if (config?.includeAnnotations) {\r\n ErrorHelper.stringParameterCheck(config.includeAnnotations, \"DynamicsWebApi.setConfig\", \"config.includeAnnotations\");\r\n internalConfig.includeAnnotations = config.includeAnnotations;\r\n }\r\n\r\n if (config?.timeout) {\r\n ErrorHelper.numberParameterCheck(config.timeout, \"DynamicsWebApi.setConfig\", \"config.timeout\");\r\n internalConfig.timeout = config.timeout;\r\n }\r\n\r\n if (config?.maxPageSize) {\r\n ErrorHelper.numberParameterCheck(config.maxPageSize, \"DynamicsWebApi.setConfig\", \"config.maxPageSize\");\r\n internalConfig.maxPageSize = config.maxPageSize;\r\n }\r\n\r\n if (config?.returnRepresentation) {\r\n ErrorHelper.boolParameterCheck(config.returnRepresentation, \"DynamicsWebApi.setConfig\", \"config.returnRepresentation\");\r\n internalConfig.returnRepresentation = config.returnRepresentation;\r\n }\r\n\r\n if (config?.useEntityNames) {\r\n ErrorHelper.boolParameterCheck(config.useEntityNames, \"DynamicsWebApi.setConfig\", \"config.useEntityNames\");\r\n internalConfig.useEntityNames = config.useEntityNames;\r\n }\r\n\r\n if (config?.headers) {\r\n internalConfig.headers = config.headers;\r\n }\r\n\r\n if (!global.DWA_BROWSER && config?.proxy) {\r\n ErrorHelper.parameterCheck(config.proxy, \"DynamicsWebApi.setConfig\", \"config.proxy\");\r\n\r\n if (config.proxy.url) {\r\n ErrorHelper.stringParameterCheck(config.proxy.url, \"DynamicsWebApi.setConfig\", \"config.proxy.url\");\r\n\r\n if (config.proxy.auth) {\r\n ErrorHelper.parameterCheck(config.proxy.auth, \"DynamicsWebApi.setConfig\", \"config.proxy.auth\");\r\n ErrorHelper.stringParameterCheck(config.proxy.auth.username, \"DynamicsWebApi.setConfig\", \"config.proxy.auth.username\");\r\n ErrorHelper.stringParameterCheck(config.proxy.auth.password, \"DynamicsWebApi.setConfig\", \"config.proxy.auth.password\");\r\n }\r\n }\r\n\r\n internalConfig.proxy = config.proxy;\r\n }\r\n }\r\n\r\n static default(): InternalConfig {\r\n return {\r\n serverUrl: null,\r\n impersonate: null,\r\n impersonateAAD: null,\r\n onTokenRefresh: null,\r\n includeAnnotations: null,\r\n maxPageSize: null,\r\n returnRepresentation: null,\r\n proxy: null,\r\n dataApi: {\r\n path: \"data\",\r\n version: \"9.2\",\r\n url: \"\"\r\n },\r\n searchApi: {\r\n path: \"search\",\r\n version: \"1.0\",\r\n url: \"\"\r\n },\r\n };\r\n }\r\n}\r\n", "\uFEFFimport { ConfigurationUtility } from \"./utils/Config\";\r\nimport { Utility } from \"./utils/Utility\";\r\nimport { ErrorHelper } from \"./helpers/ErrorHelper\";\r\nimport { RequestClient } from \"./client/RequestClient\";\r\nimport type { InternalRequest, WebApiResponse } from \"./types\";\r\n\r\n/**\r\n * Microsoft Dynamics CRM Web API helper library written in JavaScript.\r\n * It is compatible with: Dynamics 365 (online), Dynamics 365 (on-premise), Dynamics CRM 2016, Dynamics CRM Online.\r\n */\r\nexport class DynamicsWebApi {\r\n private _config = ConfigurationUtility.default();\r\n private _isBatch = false;\r\n private _batchRequestId: string | null = null;\r\n\r\n /**\r\n * Initializes a new instance of DynamicsWebApi\r\n * @param config - Configuration object\r\n */\r\n constructor(config?: Config) {\r\n ConfigurationUtility.merge(this._config, config);\r\n }\r\n\r\n /**\r\n\t * Merges provided configuration properties with an existing one.\r\n\t *\r\n\t * @param {DynamicsWebApi.Config} config - Configuration\r\n\t * @example\r\n\t dynamicsWebApi.setConfig({ serverUrl: 'https://contoso.api.crm.dynamics.com/' });\r\n\t */\r\n setConfig = (config: Config) => ConfigurationUtility.merge(this._config, config);\r\n\r\n private _makeRequest = async (request: InternalRequest): Promise => {\r\n request.isBatch = this._isBatch;\r\n if (this._batchRequestId) request.requestId = this._batchRequestId;\r\n return RequestClient.makeRequest(request, this._config);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a new record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n * @example\r\n *const lead = {\r\n * subject: \"Test WebAPI\",\r\n * firstname: \"Test\",\r\n * lastname: \"WebAPI\",\r\n * jobtitle: \"Title\"\r\n *};\r\n *\r\n *const request = {\r\n * data: lead,\r\n * collection: \"leads\",\r\n * returnRepresentation: true\r\n *}\r\n *\r\n *const response = await dynamicsWebApi.create(request);\r\n *\r\n */\r\n create = async (request: CreateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.create\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"create\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"POST\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n * @example\r\n *const request = {\r\n * key: '7d577253-3ef0-4a0a-bb7f-8335c2596e70',\r\n * collection: \"leads\",\r\n * select: [\"fullname\", \"subject\"],\r\n * ifnonematch: 'W/\"468026\"',\r\n * includeAnnotations: \"OData.Community.Display.V1.FormattedValue\"\r\n *};\r\n *\r\n *const response = await dynamicsWebApi.retrieve(request);\r\n */\r\n retrieve = async (request: RetrieveRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieve\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"retrieve\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"GET\";\r\n internalRequest.responseParameters = {\r\n isRef: internalRequest.select?.length === 1 && internalRequest.select[0].endsWith(\"/$ref\"),\r\n };\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n update = async (request: UpdateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.update\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"update\";\r\n } else internalRequest = request;\r\n\r\n //Metadata definitions, cannot be updated using \"PATCH\" method\r\n if (!internalRequest.method)\r\n internalRequest.method = /EntityDefinitions|RelationshipDefinitions|GlobalOptionSetDefinitions/.test(internalRequest.collection || \"\")\r\n ? \"PUT\"\r\n : \"PATCH\";\r\n\r\n internalRequest.responseParameters = { valueIfEmpty: true };\r\n\r\n if (internalRequest.ifmatch == null) {\r\n internalRequest.ifmatch = \"*\"; //to prevent upsert\r\n }\r\n\r\n //copy locally\r\n const ifmatch = internalRequest.ifmatch;\r\n\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifmatch && error.status === 412) {\r\n //precondition failed - not updated\r\n return false; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a single value in the record.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateSingleProperty = async (request: UpdateSinglePropertyRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateSingleProperty\", \"request\");\r\n ErrorHelper.parameterCheck(request.fieldValuePair, \"DynamicsWebApi.updateSingleProperty\", \"request.fieldValuePair\");\r\n\r\n var field = Object.keys(request.fieldValuePair)[0];\r\n var fieldValue = request.fieldValuePair[field];\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.navigationProperty = field;\r\n internalRequest.data = { value: fieldValue };\r\n internalRequest.functionName = \"updateSingleProperty\";\r\n internalRequest.method = \"PUT\";\r\n\r\n delete internalRequest[\"fieldValuePair\"];\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a record.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteRecord = async (request: DeleteRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteRecord\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"deleteRecord\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.responseParameters = { valueIfEmpty: true };\r\n\r\n //copy locally\r\n const ifmatch = internalRequest.ifmatch;\r\n\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifmatch && error.status === 412) {\r\n //precondition failed - not updated\r\n return false; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to upsert a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n upsert = async (request: UpsertRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.upsert\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"PATCH\";\r\n internalRequest.functionName = \"upsert\";\r\n\r\n //copy locally\r\n const ifnonematch = internalRequest.ifnonematch;\r\n const ifmatch = internalRequest.ifmatch;\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifnonematch && error.status === 412) {\r\n //if prevent update\r\n return null; //todo: check this\r\n } else if (ifmatch && error.status === 404) {\r\n //if prevent create\r\n return null; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n private _uploadFileChunk = async (request: InternalRequest, fileBytes: Uint8Array | Buffer, chunkSize: number, offset: number = 0): Promise => {\r\n // offset = offset || 0;\r\n Utility.setFileChunk(request, fileBytes, chunkSize, offset);\r\n\r\n await this._makeRequest(request);\r\n\r\n offset += chunkSize;\r\n if (offset <= fileBytes.length) {\r\n return this._uploadFileChunk(request, fileBytes, chunkSize, offset);\r\n }\r\n };\r\n\r\n /**\r\n * Upload file to a File Attribute\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n */\r\n uploadFile = async (request: UploadRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.uploadFile\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.uploadFile\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request, [\"data\"]);\r\n internalRequest.method = \"PATCH\";\r\n internalRequest.functionName = \"uploadFile\";\r\n internalRequest.transferMode = \"chunked\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n internalRequest.url = response?.data.location;\r\n delete internalRequest.transferMode;\r\n delete internalRequest.fieldName;\r\n delete internalRequest.fileName;\r\n return this._uploadFileChunk(internalRequest, request.data, response?.data.chunkSize);\r\n };\r\n\r\n private _downloadFileChunk = async (\r\n request: InternalRequest,\r\n bytesDownloaded: number = 0,\r\n // fileSize: number = 0,\r\n data: string = \"\"\r\n ): Promise => {\r\n // bytesDownloaded = bytesDownloaded || 0;\r\n // fileSize = fileSize || 0;\r\n // data = data || \"\";\r\n\r\n request.range = \"bytes=\" + bytesDownloaded + \"-\" + (bytesDownloaded + Utility.downloadChunkSize - 1);\r\n request.downloadSize = \"full\";\r\n\r\n const response = await this._makeRequest(request);\r\n\r\n request.url = response?.data.location;\r\n data += response?.data.value;\r\n\r\n bytesDownloaded += Utility.downloadChunkSize;\r\n\r\n if (bytesDownloaded <= response?.data.fileSize) {\r\n return this._downloadFileChunk(request, bytesDownloaded, data);\r\n }\r\n\r\n return {\r\n fileName: response?.data.fileName,\r\n fileSize: response?.data.fileSize,\r\n data: Utility.convertToFileBuffer(data),\r\n };\r\n };\r\n\r\n /**\r\n * Download a file from a File Attribute\r\n * @param request - An object that represents all possible options for a current request.\r\n */\r\n downloadFile = (request: DownloadRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.downloadFile\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.downloadFile\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"downloadFile\";\r\n internalRequest.responseParameters = { parse: true };\r\n\r\n return this._downloadFileChunk(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve records.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @param {string} [nextPageLink] - Use the value of the @odata.nextLink property with a new GET request to return the next page of data. Pass null to retrieveMultipleOptions.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveMultiple = async (request: RetrieveMultipleRequest, nextPageLink?: string): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveMultiple\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"retrieveMultiple\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"GET\";\r\n\r\n if (nextPageLink) {\r\n ErrorHelper.stringParameterCheck(nextPageLink, \"DynamicsWebApi.retrieveMultiple\", \"nextPageLink\");\r\n internalRequest.url = nextPageLink;\r\n }\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n return response?.data;\r\n };\r\n\r\n private _retrieveAllRequest = async (request: RetrieveMultipleRequest, nextPageLink?: string, records: any[] = []): Promise> => {\r\n const response = await this.retrieveMultiple(request, nextPageLink);\r\n records = records.concat(response.value);\r\n\r\n const pageLink = response.oDataNextLink;\r\n\r\n if (pageLink) {\r\n return this._retrieveAllRequest(request, pageLink, records);\r\n }\r\n\r\n const result: AllResponse = { value: records };\r\n\r\n if (response.oDataDeltaLink) {\r\n result[\"@odata.deltaLink\"] = response.oDataDeltaLink;\r\n result.oDataDeltaLink = response.oDataDeltaLink;\r\n }\r\n\r\n return result;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve all records.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAll = (request: RetrieveMultipleRequest): Promise> => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.retrieveAll\", this._isBatch);\r\n return this._retrieveAllRequest(request);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to count records. IMPORTANT! The count value does not represent the total number of entities in the system. It is limited by the maximum number of entities that can be returned. Returns: Number\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n count = async (request: CountRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.count\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"count\";\r\n\r\n if (internalRequest.filter?.length) {\r\n internalRequest.count = true;\r\n } else {\r\n internalRequest.navigationProperty = \"$count\";\r\n }\r\n\r\n internalRequest.responseParameters = { toCount: internalRequest.count };\r\n\r\n //if filter has not been specified then simplify the request\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to count records. Returns: Number\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n countAll = async (request: CountAllRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.countAll\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.countAll\", \"request\");\r\n\r\n const response = await this._retrieveAllRequest(request);\r\n\r\n return response ? (response.value ? response.value.length : 0) : 0;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to execute FetchXml to retrieve records. Returns: DWA.Types.FetchXmlResponse\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n fetch = async (request: FetchXmlRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.fetch\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"fetch\";\r\n\r\n ErrorHelper.stringParameterCheck(internalRequest.fetchXml, \"DynamicsWebApi.fetch\", \"request.fetchXml\");\r\n\r\n //only add paging if there is no top\r\n if (internalRequest.fetchXml && !/^(request: FetchAllRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.fetchAll\", \"request\");\r\n\r\n const _executeFetchXmlAll = async (request: FetchXmlRequest, records: any[] = []): Promise> => {\r\n // records = records || [];\r\n\r\n const response = await this.fetch(request);\r\n\r\n records = records.concat(response.value);\r\n\r\n if (response.PagingInfo) {\r\n request.pageNumber = response.PagingInfo.nextPage;\r\n request.pagingCookie = response.PagingInfo.cookie;\r\n\r\n return _executeFetchXmlAll(request, records);\r\n }\r\n\r\n return { value: records };\r\n };\r\n\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.fetchAll\", this._isBatch);\r\n return _executeFetchXmlAll(request);\r\n };\r\n\r\n /**\r\n * Associate for a collection-valued navigation property. (1:N or N:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n associate = async (request: AssociateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.associate\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"associate\";\r\n\r\n ErrorHelper.stringParameterCheck(request.relatedCollection, \"DynamicsWebApi.associate\", \"request.relatedcollection\");\r\n ErrorHelper.stringParameterCheck(request.relationshipName, \"DynamicsWebApi.associate\", \"request.relationshipName\");\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.associate\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.associate\", \"request.relatedKey\");\r\n\r\n internalRequest.navigationProperty = request.relationshipName + \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n internalRequest.data = { \"@odata.id\": `${request.relatedCollection}(${relatedKey})` };\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Disassociate for a collection-valued navigation property.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n disassociate = async (request: DisassociateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.disassociate\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.functionName = \"disassociate\";\r\n\r\n ErrorHelper.stringParameterCheck(request.relationshipName, \"DynamicsWebApi.disassociate\", \"request.relationshipName\");\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.disassociate\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.disassociate\", \"request.relatedId\");\r\n\r\n internalRequest.key = primaryKey;\r\n internalRequest.navigationProperty = `${request.relationshipName}(${relatedKey})/$ref`;\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Associate for a single-valued navigation property. (1:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n associateSingleValued = async (request: AssociateSingleValuedRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.associateSingleValued\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"PUT\";\r\n internalRequest.functionName = \"associateSingleValued\";\r\n\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.associateSingleValued\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.associateSingleValued\", \"request.relatedKey\");\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, \"DynamicsWebApi.associateSingleValued\", \"request.navigationProperty\");\r\n ErrorHelper.stringParameterCheck(request.relatedCollection, \"DynamicsWebApi.associateSingleValued\", \"request.relatedcollection\");\r\n\r\n internalRequest.navigationProperty += \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n internalRequest.data = { \"@odata.id\": `${request.relatedCollection}(${relatedKey})` };\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Removes a reference to an entity for a single-valued navigation property. (1:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n disassociateSingleValued = async (request: DisassociateSingleValuedRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.disassociateSingleValued\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.functionName = \"disassociateSingleValued\";\r\n\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.disassociateSingleValued\", \"request.primaryKey\");\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, \"DynamicsWebApi.disassociateSingleValued\", \"request.navigationProperty\");\r\n\r\n internalRequest.navigationProperty += \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Calls a Web API function\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n callFunction: CallFunction = async (request: string | BoundFunctionRequest | UnboundFunctionRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.callFunction`, \"request\");\r\n\r\n const getFunctionName = (request: BoundFunctionRequest | UnboundFunctionRequest) => request.name || request.functionName;\r\n\r\n const isObject = typeof request !== \"string\";\r\n const functionName = isObject ? getFunctionName(request) : request;\r\n const parameterName = isObject ? \"request.name\" : \"name\";\r\n const internalRequest: InternalRequest = isObject ? Utility.copyObject(request, [\"name\"]) : { functionName: functionName };\r\n\r\n ErrorHelper.stringParameterCheck(functionName, `DynamicsWebApi.callFunction`, parameterName);\r\n\r\n const functionParameters = Utility.buildFunctionParameters(internalRequest.parameters);\r\n\r\n internalRequest.method = \"GET\";\r\n internalRequest.addPath = functionName + functionParameters.key;\r\n internalRequest.queryParams = functionParameters.queryParams;\r\n internalRequest._isUnboundRequest = !internalRequest.collection;\r\n internalRequest.functionName = \"callFunction\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Calls a Web API action\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n callAction: CallAction = async (\r\n request: BoundActionRequest | UnboundActionRequest\r\n ): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.callAction`, \"request\");\r\n ErrorHelper.stringParameterCheck(request.actionName, `DynamicsWebApi.callAction`, \"request.actionName\");\r\n\r\n const internalRequest = Utility.copyRequest(request, [\"action\"]);\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"callAction\";\r\n\r\n internalRequest.addPath = request.actionName;\r\n internalRequest._isUnboundRequest = !internalRequest.collection;\r\n internalRequest.data = request.action;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n /**\r\n * Sends an asynchronous request to create an entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createEntity = (request: CreateEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.createEntity`, \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createEntity\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"createEntity\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update an entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateEntity = (request: UpdateEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateEntity\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateEntity\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateEntity\", \"request.data.MetadataId\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.key = internalRequest.data.MetadataId;\r\n internalRequest.functionName = \"updateEntity\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveEntity = (request: RetrieveEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveEntity\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.retrieveEntity\", \"request.key\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntity\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve entity definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveEntities = (request?: RetrieveEntitiesRequest): Promise> => {\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntities\";\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create an attribute.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createAttribute = (request: CreateAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createAttribute\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createAttribute\", \"request.data\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.createAttribute\", \"request.entityKey\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntity\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.key = request.entityKey;\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update an attribute.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateAttribute = (request: UpdateAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateAttribute\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateAttribute\", \"request.data\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.updateAttribute\", \"request.entityKey\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateAttribute\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateAttribute\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.navigationPropertyKey = request.data.MetadataId;\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"updateAttribute\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve attribute metadata for a specified entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAttributes = (request: RetrieveAttributesRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveAttributes\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.retrieveAttributes\", \"request.entityKey\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveAttributes\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"retrieveAttributes\";\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific attribute metadata for a specified entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAttribute = (request: RetrieveAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveAttributes\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.retrieveAttribute\", \"request.entityKey\");\r\n ErrorHelper.keyParameterCheck(request.attributeKey, \"DynamicsWebApi.retrieveAttribute\", \"request.attributeKey\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveAttribute\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.navigationPropertyKey = request.attributeKey;\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"retrieveAttribute\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createRelationship = (request: CreateRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createRelationship\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createRelationship\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"createRelationship\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateRelationship = (request: UpdateRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateRelationship\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateRelationship\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateRelationship\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateRelationship\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.key = request.data.MetadataId;\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"updateRelationship\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteRelationship = (request: DeleteRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteRelationship\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.deleteRelationship\", \"request.key\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"deleteRelationship\";\r\n\r\n return this.deleteRecord(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve relationship definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveRelationships = (request?: RetrieveRelationshipsRequest): Promise> => {\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"retrieveRelationships\";\r\n\r\n if (request) {\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveRelationships\", \"request.castType\");\r\n internalRequest.navigationProperty = request.castType;\r\n }\r\n }\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveRelationship = (request: RetrieveRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveRelationship\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.retrieveRelationship\", \"request.key\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveRelationship\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"retrieveRelationship\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a Global Option Set definition\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createGlobalOptionSet = (request: CreateGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createGlobalOptionSet\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createGlobalOptionSet\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"createGlobalOptionSet\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a Global Option Set.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateGlobalOptionSet = (request: UpdateGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateGlobalOptionSet\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.key = request.data.MetadataId;\r\n internalRequest.functionName = \"updateGlobalOptionSet\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a Global Option Set.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteGlobalOptionSet = (request: DeleteGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteGlobalOptionSet\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"deleteGlobalOptionSet\";\r\n\r\n return this.deleteRecord(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve Global Option Set definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveGlobalOptionSet = (request: RetrieveGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveGlobalOptionSet\", \"request\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveGlobalOptionSet\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"retrieveGlobalOptionSet\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve Global Option Set definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveGlobalOptionSets = (request?: RetrieveGlobalOptionSetsRequest): Promise> => {\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"retrieveGlobalOptionSets\";\r\n\r\n if (request?.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveGlobalOptionSets\", \"request.castType\");\r\n internalRequest.navigationProperty = request.castType;\r\n }\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Retrieves a CSDL Document Metadata\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} A raw CSDL $metadata document.\r\n */\r\n retrieveCsdlMetadata = async (request?: CsdlMetadataRequest): Promise => {\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"$metadata\";\r\n internalRequest.functionName = \"retrieveCsdlMetadata\";\r\n\r\n if (request?.addAnnotations) {\r\n ErrorHelper.boolParameterCheck(request.addAnnotations, \"DynamicsWebApi.retrieveCsdlMetadata\", \"request.addAnnotations\");\r\n internalRequest.includeAnnotations = \"*\";\r\n }\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides a search results page.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Search result\r\n */\r\n search: SearchFunction = async (request: string | SearchRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.search\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.search\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.search\", parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.search\", parameterName, 100);\r\n\r\n internalRequest.collection = \"query\";\r\n internalRequest.functionName = \"search\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Suggestions result\r\n */\r\n suggest: SuggestFunction = async (request: string | SuggestRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.suggest\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.suggest\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.suggest\", parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.suggest\", parameterName, 100);\r\n\r\n internalRequest.functionName = internalRequest.collection = \"suggest\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n autocomplete: AutocompleteFunction = async (request: string | AutocompleteRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.autocomplete\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n if (isObject) ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.autocomplete\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, `DynamicsWebApi.autocomplete`, parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.autocomplete\", parameterName, 100);\r\n\r\n internalRequest.functionName = internalRequest.collection = \"autocomplete\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Starts/executes a batch request.\r\n */\r\n startBatch = (): void => {\r\n this._isBatch = true;\r\n this._batchRequestId = Utility.generateUUID();\r\n };\r\n\r\n /**\r\n * Executes a batch request. Please call DynamicsWebApi.startBatch() first to start a batch request.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n executeBatch = async (request?: BatchRequest): Promise => {\r\n ErrorHelper.throwBatchNotStarted(this._isBatch);\r\n\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"$batch\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"executeBatch\";\r\n internalRequest.requestId = this._batchRequestId;\r\n\r\n this._batchRequestId = null;\r\n this._isBatch = false;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Creates a new instance of DynamicsWebApi. If config is not provided, it is copied from a current instance.\r\n *\r\n * @param {Config} config configuration object.\r\n * @returns {DynamicsWebApi} A new instance of DynamicsWebApi\r\n */\r\n initializeInstance = (config?: Config): DynamicsWebApi => new DynamicsWebApi(config || this._config);\r\n\r\n Utility = {\r\n /**\r\n * Searches for a collection name by provided entity name in a cached entity metadata.\r\n * The returned collection name can be null.\r\n *\r\n * @param {string} entityName entity name\r\n * @returns {string | null} collection name\r\n */\r\n getCollectionName: (entityName: string): string | null => RequestClient.getCollectionName(entityName),\r\n };\r\n}\r\n\r\nexport interface Expand {\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**Limit the number of results returned by using the $top system query option.Do not use $top with $count! */\r\n top?: number;\r\n /**An Array(of Strings) representing the order in which items are returned using the $orderby system query option.Use the asc or desc suffix to specify ascending or descending order respectively.The default is ascending if the suffix isn't applied. */\r\n orderBy?: string[];\r\n /**A name of a single-valued navigation property which needs to be expanded. */\r\n property?: string;\r\n /**An Array of Expand Objects representing the $expand Query Option value to control which related records need to be returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface BaseRequest {\r\n /**XHR requests only! Indicates whether the requests should be made synchronously or asynchronously.Default value is 'true'(asynchronously). */\r\n async?: boolean;\r\n /**Impersonates a user based on their systemuserid by adding \"MSCRMCallerID\" header. A String representing the GUID value for the Dynamics 365 systemuserid. */\r\n impersonate?: string;\r\n /**Impersonates a user based on their Azure Active Directory (AAD) object id by passing that value along with the header \"CallerObjectId\". A String should represent a GUID value. */\r\n impersonateAAD?: string;\r\n /**If set to 'true', DynamicsWebApi adds a request header 'Cache-Control: no-cache'.Default value is 'false'. */\r\n noCache?: boolean;\r\n /** Authorization Token. If set, onTokenRefresh will not be called. */\r\n token?: string;\r\n /**Sets a number of milliseconds before a request times out. */\r\n timeout?: number;\r\n /**The AbortSignal interface represents a signal object that allows you to communicate with a DOM request and abort it if required via an AbortController object. */\r\n signal?: AbortSignal;\r\n /**Indicates if an operation must be included in a Change Set or not. Works in Batch Operations only. By default, it's \"true\", except for GET operations - they are not allowed in Change Sets. */\r\n inChangeSet?: boolean;\r\n /**Headers to supply with a request. These headers will override configuraiton headers if the identical ones were set. */\r\n headers?: HeaderCollection;\r\n /**Custom query parameters. Can be used to set parameter aliases for \"$filter\" and \"$orderBy\". Important! These parameters ARE NOT URI encoded! */\r\n queryParams?: string[];\r\n}\r\n\r\nexport interface BatchRequest extends BaseRequest {\r\n /** Sets Prefer header to \"odata.continue-on-error\" that allows more requests be processed when errors occur. The batch request will return '200 OK' and individual response errors will be returned in the batch response body. */\r\n continueOnError?: boolean;\r\n}\r\n\r\nexport interface Request extends BaseRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection?: string;\r\n}\r\n\r\nexport interface CRUDRequest extends Request {\r\n /**A String representing collection record's Primary Key (GUID) or Alternate Key(s). */\r\n key?: string;\r\n}\r\n\r\nexport interface CountRequest extends Request {\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n}\r\n\r\nexport interface CountAllRequest extends CountRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**An Array (of strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n}\r\n\r\nexport interface FetchAllRequest extends Request {\r\n /**Sets FetchXML - a proprietary query language that provides capabilities to perform aggregation. */\r\n fetchXml: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation. Annotations provide additional information about lookups, options sets and other complex attribute types. For example: * or Microsoft.Dynamics.CRM.fetchxmlpagingcookie */\r\n includeAnnotations?: string;\r\n}\r\n\r\nexport interface FetchXmlRequest extends FetchAllRequest {\r\n /**Page number. */\r\n pageNumber?: number;\r\n /**Paging cookie. To retrive the first page, pagingCookie must be null. */\r\n pagingCookie?: string;\r\n}\r\n\r\nexport interface CreateRequest extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Web API v9+ only! Boolean that enables duplicate detection. */\r\n duplicateDetection?: boolean;\r\n /**A JavaScript object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data?: T;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface UpdateRequestBase extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Web API v9+ only! Boolean that enables duplicate detection. */\r\n duplicateDetection?: boolean;\r\n /**A JavaScript object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data?: T;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**Casts the AttributeMetadata to a specific type. (Used in requests to Attribute Metadata). */\r\n metadataAttributeType?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface UpdateRequest extends UpdateRequestBase {\r\n /**If set to 'true', DynamicsWebApi adds a request header 'MSCRM.MergeLabels: true'. Default value is 'false' */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface UpdateSinglePropertyRequest extends CRUDRequest {\r\n /**Object with a logical name of the field as a key and a value to update with. Example: {subject: \"Update Record\"} */\r\n fieldValuePair: { [key: string]: any };\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n}\r\n\r\nexport interface UpsertRequest extends UpdateRequestBase {\r\n /**Sets If-None-Match header value that enables to use conditional retrieval in applicable requests. */\r\n ifnonematch?: string;\r\n}\r\n\r\nexport interface DeleteRequest extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**Field name that needs to be cleared (for example File Field) */\r\n fieldName?: string;\r\n}\r\n\r\nexport interface RetrieveRequest extends CRUDRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets If-None-Match header value that enables to use conditional retrieval in applicable requests. */\r\n ifnonematch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Casts the AttributeMetadata to a specific type. (Used in requests to Attribute Metadata). */\r\n metadataAttributeType?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**A String representing the GUID value of the saved query. */\r\n savedQuery?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**A String representing the GUID value of the user query. */\r\n userQuery?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface RetrieveMultipleRequest extends Request {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**Use the $apply to aggregate and group your data dynamically */\r\n apply?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Boolean that sets the $count system query option with a value of true to include a count of entities that match the filter criteria up to 5000(per page).Do not use $top with $count! */\r\n count?: boolean;\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets the odata.maxpagesize preference value to request the number of entities returned in the response. */\r\n maxPageSize?: number;\r\n /**An Array(of string) representing the order in which items are returned using the $orderby system query option.Use the asc or desc suffix to specify ascending or descending order respectively.The default is ascending if the suffix isn't applied. */\r\n orderBy?: string[];\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Limit the number of results returned by using the $top system query option.Do not use $top with $count! */\r\n top?: number;\r\n /**Sets Prefer header with value 'odata.track-changes' to request that a delta link be returned which can subsequently be used to retrieve entity changes. */\r\n trackChanges?: boolean;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface AssociateRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Relationship name. */\r\n relationshipName: string;\r\n /**Related name of the Entity Collection or Entity Logical name. */\r\n relatedCollection: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface AssociateSingleValuedRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Navigation property name. */\r\n navigationProperty: string;\r\n /**Related name of the Entity Collection or Entity Logical name. */\r\n relatedCollection: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface DisassociateRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Relationship name. */\r\n relationshipName: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface DisassociateSingleValuedRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Navigation property name. */\r\n navigationProperty: string;\r\n}\r\n\r\nexport interface UnboundFunctionRequest extends BaseRequest {\r\n /**\r\n * Name of the function.\r\n */\r\n name?: string;\r\n /**\r\n * Name of the function. \r\n * @deprecated Use \"name\" parameter.\r\n */\r\n functionName?: string;\r\n /**Function's input parameters. Example: { param1: \"test\", param2: 3 }. */\r\n parameters?: any;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n}\r\n\r\nexport interface BoundFunctionRequest extends UnboundFunctionRequest, Request {\r\n /**A String representing the GUID value for the record. */\r\n key?: string;\r\n}\r\n\r\nexport interface UnboundActionRequest extends BaseRequest {\r\n /**A name of the Web API action. */\r\n actionName: string;\r\n /**An object that represents a Dynamics 365 action. */\r\n action?: TAction;\r\n}\r\n\r\nexport interface BoundActionRequest extends UnboundActionRequest, Request {\r\n /**A String representing the GUID value for the record. */\r\n key?: string;\r\n}\r\n\r\nexport interface CreateEntityRequest extends BaseRequest {\r\n /**An object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateEntityRequest extends CRUDRequest {\r\n /**An object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data: any;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface RetrieveEntityRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveEntitiesRequest extends BaseRequest {\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateAttributeRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Attribute metadata object. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateAttributeRequest extends CreateAttributeRequest {\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface RetrieveAttributesRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveAttributeRequest extends BaseRequest {\r\n /**An Attribute MetadataId or Alternate Key (such as LogicalName). */\r\n attributeKey: string;\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateRelationshipRequest extends BaseRequest {\r\n /**Relationship Definition. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateRelationshipRequest extends CreateRelationshipRequest {\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface DeleteRelationshipRequest extends BaseRequest {\r\n /**A Relationship MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n}\r\n\r\nexport interface RetrieveRelationshipsRequest extends BaseRequest {\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveRelationshipRequest extends BaseRequest {\r\n /**A Relationship MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateGlobalOptionSetRequest extends BaseRequest {\r\n /**Global Option Set Definition. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateGlobalOptionSetRequest extends CreateRelationshipRequest {\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface DeleteGlobalOptionSetRequest extends BaseRequest {\r\n /**A Global Option Set MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n}\r\n\r\nexport interface RetrieveGlobalOptionSetsRequest extends BaseRequest {\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveGlobalOptionSetRequest extends BaseRequest {\r\n /**A Global Option Set MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface UploadRequest extends CRUDRequest {\r\n /**Binary Buffer*/\r\n data: Uint8Array | Buffer;\r\n /**Name of the file */\r\n fileName: string;\r\n /**File Field Name */\r\n fieldName: string;\r\n}\r\n\r\nexport interface DownloadRequest extends CRUDRequest {\r\n /**File Field Name */\r\n fieldName: string;\r\n}\r\n\r\nexport interface CsdlMetadataRequest extends BaseRequest {\r\n /**If set to \"true\" the document will include many different kinds of annotations that can be useful. Most annotations are not included by default because they increase the total size of the document. */\r\n addAnnotations?: boolean;\r\n}\r\n\r\nexport type SearchMode = \"any\" | \"all\";\r\nexport type SearchType = \"simple\" | \"full\";\r\n\r\nexport interface SearchQueryBase {\r\n /**The search parameter value contains the term to be searched for and has a 100-character limit. For suggestions, min 3 characters in addition. */\r\n search: string;\r\n /**The default table list searches across all Dataverse search\u2013configured tables and columns. The default list is configured by your administrator when Dataverse search is enabled. */\r\n entities?: string[];\r\n /**Filters are applied while searching data and are specified in standard OData syntax. */\r\n filter?: string;\r\n}\r\n\r\nexport interface Search extends SearchQueryBase {\r\n /**Facets support the ability to drill down into data results after they've been retrieved. */\r\n facets?: string[];\r\n /**Specify true to return the total record count; otherwise false. The default is false. */\r\n returnTotalRecordCount?: boolean;\r\n /**Specifies the number of search results to skip. */\r\n skip?: number;\r\n /**Specifies the number of search results to retrieve. The default is 50, and the maximum value is 100. */\r\n top?: number;\r\n /**A list of comma-separated clauses where each clause consists of a column name followed by 'asc' (ascending, which is the default) or 'desc' (descending). This list specifies how to order the results in order of precedence. */\r\n orderBy?: string[];\r\n /**Specifies whether any or all the search terms must be matched to count the document as a match. The default is 'any'. */\r\n searchMode?: SearchMode;\r\n /**The search type specifies the syntax of a search query. Using 'simple' selects simple query syntax and 'full' selects Lucene query syntax. The default is 'simple'. */\r\n searchType?: SearchType;\r\n}\r\n\r\nexport interface Suggest extends SearchQueryBase {\r\n /**Use fuzzy search to aid with misspellings. The default is false. */\r\n useFuzzy?: boolean;\r\n /**Number of suggestions to retrieve. The default is 5. */\r\n top?: number;\r\n /**A list of comma-separated clauses where each clause consists of a column name followed by 'asc' (ascending, which is the default) or 'desc' (descending). This list specifies how to order the results in order of precedence. */\r\n orderBy?: string[];\r\n}\r\n\r\nexport interface Autocomplete extends SearchQueryBase {\r\n /**Use fuzzy search to aid with misspellings. The default is false. */\r\n useFuzzy?: boolean;\r\n}\r\n\r\nexport interface SearchRequest extends BaseRequest {\r\n /**Search query object */\r\n query: Search;\r\n}\r\n\r\nexport interface SuggestRequest extends BaseRequest {\r\n /**Suggestion query object */\r\n query: Suggest;\r\n}\r\n\r\nexport interface AutocompleteRequest extends BaseRequest {\r\n /**Autocomplete query object */\r\n query: Autocomplete;\r\n}\r\n\r\nexport interface ApiConfig {\r\n /** API Version to use, for example: \"9.2\" or \"1.0\" */\r\n version?: string;\r\n /** API Path, for example: \"data\" or \"search\" */\r\n path?: string;\r\n}\r\n\r\nexport interface AccessToken {\r\n /** Access Token */\r\n accessToken: string;\r\n}\r\n\r\nexport interface Config {\r\n /**The url to Dataverse API server, for example: https://contoso.api.crm.dynamics.com/. It is required when used in Node.js application. */\r\n serverUrl?: string | null;\r\n /**Impersonates a user based on their systemuserid by adding \"MSCRMCallerID\" header. A String representing the GUID value for the Dynamics 365 systemuserid. */\r\n impersonate?: string | null;\r\n /**Impersonates a user based on their Azure Active Directory (AAD) object id by passing that value along with the header \"CallerObjectId\". A String should represent a GUID value. */\r\n impersonateAAD?: string | null;\r\n /**A function that is called when a security token needs to be refreshed. */\r\n onTokenRefresh?: (() => Promise) | null;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types.*/\r\n includeAnnotations?: string | null;\r\n /**Sets the odata.maxpagesize preference value to request the number of entities returned in the response. */\r\n maxPageSize?: number | null;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request.*/\r\n returnRepresentation?: boolean | null;\r\n /**Indicates whether to use Entity Logical Names instead of Collection Logical Names.*/\r\n useEntityNames?: boolean | null;\r\n /**Sets a number of milliseconds before a request times out. */\r\n timeout?: number | null;\r\n /**Proxy configuration object. */\r\n proxy?: ProxyConfig | null;\r\n /**Configuration object for Dataverse Web API (with path \"data\"). */\r\n dataApi?: ApiConfig;\r\n /**Configuration object for Dataverse Search API (with path \"search\"). */\r\n searchApi?: ApiConfig;\r\n /**Default headers to supply with each request. */\r\n headers?: HeaderCollection;\r\n}\r\n\r\n/**Header collection type */\r\nexport type HeaderCollection = Record;\r\n\r\nexport interface ProxyConfig {\r\n /**Proxy server url */\r\n url: string;\r\n /**Basic authentication credentials */\r\n auth?: {\r\n /**Username */\r\n username: string;\r\n /**Password */\r\n password: string;\r\n };\r\n}\r\n\r\n/** Callback with an acquired token called by DynamicsWebApi; \"token\" argument can be a string or an object with a property {accessToken: } */\r\n// export interface OnTokenAcquiredCallback {\r\n// (token: any): void;\r\n// }\r\n\r\nexport interface RequestError extends Error {\r\n /**The name of the error */\r\n name: string;\r\n /**This code is not related to the http status code and is frequently empty */\r\n code?: string;\r\n /**A message describing the error */\r\n message: string;\r\n /**HTTP status code */\r\n status?: number;\r\n /**HTTP status text. Frequently empty */\r\n statusText?: string;\r\n /**HTTP Response headers */\r\n headers?: any;\r\n /**Details about an error */\r\n innererror?: {\r\n /**A message describing the error, this is frequently the same as the outer message */\r\n message?: string;\r\n /**Microsoft.Crm.CrmHttpException */\r\n type?: string;\r\n /**Details from the server about where the error occurred */\r\n stacktrace?: string;\r\n };\r\n}\r\n\r\nexport interface MultipleResponse {\r\n /**Multiple respone entities */\r\n value: T[];\r\n oDataCount?: number;\r\n \"@odata.count\"?: number;\r\n oDataContext?: string;\r\n \"@odata.context\"?: number;\r\n}\r\n\r\nexport interface AllResponse extends MultipleResponse {\r\n /**@odata.deltaLink value */\r\n oDataDeltaLink?: string;\r\n}\r\n\r\nexport interface RetrieveMultipleResponse extends MultipleResponse {\r\n \"@Microsoft.Dynamics.CRM.totalrecordcount\"?: number;\r\n \"@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded\"?: boolean;\r\n /**@odata.nextLink value */\r\n oDataNextLink?: string;\r\n /**@odata.deltaLink value */\r\n oDataDeltaLink?: string;\r\n \"@odata.deltaLink\"?: string;\r\n \"@odata.nextLink\"?: string;\r\n}\r\n\r\nexport interface FetchXmlResponse extends MultipleResponse {\r\n \"@Microsoft.Dynamics.CRM.totalrecordcount\"?: number;\r\n \"@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded\"?: boolean;\r\n /**Paging information */\r\n PagingInfo?: {\r\n /**Number of the next page */\r\n nextPage?: number;\r\n /**Next page cookie */\r\n cookie?: string;\r\n };\r\n}\r\n\r\nexport interface DownloadResponse {\r\n /**The name of the file */\r\n fileName: string;\r\n /**File size */\r\n fileSize: number;\r\n /**File Data */\r\n data: Uint8Array | Buffer;\r\n}\r\n\r\nexport interface SearchResponse {\r\n /**Search results*/\r\n value: TValue[];\r\n facets: any | null;\r\n totalrecordcount: number;\r\n querycontext: any | null;\r\n}\r\n\r\nexport interface SuggestResponseValue {\r\n text: string;\r\n document: TDocument;\r\n}\r\n\r\nexport interface SuggestResponse {\r\n /**Suggestions*/\r\n value: SuggestResponseValue[];\r\n querycontext: any | null;\r\n}\r\n\r\nexport interface AutocompleteResponse {\r\n /**Autocomplete result*/\r\n value: string | null;\r\n querycontext: any | null;\r\n}\r\n\r\n//function overloads\r\n\r\ntype CallFunction = {\r\n /**\r\n * Calls a Web API function\r\n *\r\n * @param name - The name of a function.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (name: string): Promise;\r\n /**\r\n * Calls a bound Web API function\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundFunctionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API function (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundFunctionRequest): Promise;\r\n};\r\n\r\ntype CallAction = {\r\n /**\r\n * Calls a bound Web API action (bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {T} Type of the value in a response\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundActionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API action (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {T} Type of the value in a response\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundActionRequest): Promise;\r\n /**\r\n * Calls a bound Web API action (bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {TResponse} Type of the value in a response\r\n * @type {TAction} Type of an action object\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundActionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API action (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {TResponse} Type of the value in a response\r\n * @type {TAction} Type of an action object\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundActionRequest): Promise;\r\n};\r\n\r\ntype SearchFunction = {\r\n /**\r\n * Provides a search results page.\r\n * @param term - The term to be searched for and has a max 100-character limit.\r\n * @returns {Promise} Search result\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides a search results page.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Search result\r\n */\r\n (request: SearchRequest): Promise>;\r\n};\r\n\r\ntype SuggestFunction = {\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param term - The term to be searched for and has min 3 characters to a max 100-character limit.\r\n * @returns {Promise} Suggestions result\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Suggestions result\r\n */\r\n (request: SuggestRequest): Promise>;\r\n};\r\n\r\ntype AutocompleteFunction = {\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param term - The term to be searched for and has a 100-character limit.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n (request: AutocompleteRequest): Promise;\r\n};\r\n", "import type * as Core from \"../types\";\r\nimport { Utility } from \"../utils/Utility\";\r\nimport { InternalConfig } from \"../utils/Config\";\r\nimport * as RequestUtility from \"../utils/Request\";\r\nimport { DynamicsWebApiError, ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { executeRequest } from \"./helpers/executeRequest\";\r\nimport { AccessToken } from \"../dynamics-web-api\";\r\n\r\nconst _addResponseParams = (requestId: string, responseParams: Record) => {\r\n if (_responseParseParams[requestId]) _responseParseParams[requestId].push(responseParams);\r\n else _responseParseParams[requestId] = [responseParams];\r\n};\r\n\r\nconst _addRequestToBatchCollection = (requestId: string, request: Core.InternalRequest) => {\r\n if (_batchRequestCollection[requestId]) _batchRequestCollection[requestId].push(request);\r\n else _batchRequestCollection[requestId] = [request];\r\n};\r\n\r\nconst _clearRequestData = (requestId: string): void => {\r\n delete _responseParseParams[requestId];\r\n if (_batchRequestCollection.hasOwnProperty(requestId)) delete _batchRequestCollection[requestId];\r\n};\r\n\r\nconst _runRequest = async (request: Core.InternalRequest, config: InternalConfig): Promise => {\r\n try {\r\n const result = await RequestClient.sendRequest(request, config);\r\n _clearRequestData(request.requestId!);\r\n\r\n return result;\r\n } catch (error) {\r\n _clearRequestData(request.requestId!);\r\n throw error;\r\n } finally {\r\n _clearRequestData(request.requestId!);\r\n }\r\n};\r\n\r\nlet _batchRequestCollection: Core.BatchRequestCollection = {};\r\nlet _responseParseParams: { [key: string]: any[] } = {};\r\n\r\nconst _nameExceptions = [\r\n \"$metadata\",\r\n \"EntityDefinitions\",\r\n \"RelationshipDefinitions\",\r\n \"GlobalOptionSetDefinitions\",\r\n \"ManagedPropertyDefinitions\",\r\n \"query\",\r\n \"suggest\",\r\n \"autocomplete\",\r\n];\r\n\r\nconst _isEntityNameException = (entityName: string): boolean => {\r\n return _nameExceptions.indexOf(entityName) > -1;\r\n};\r\n\r\nconst _getCollectionNames = async (entityName: string, config: InternalConfig): Promise => {\r\n if (!Utility.isNull(RequestUtility.entityNames)) {\r\n return RequestUtility.findCollectionName(entityName) || entityName;\r\n }\r\n\r\n const request = RequestUtility.compose(\r\n {\r\n method: \"GET\",\r\n collection: \"EntityDefinitions\",\r\n select: [\"EntitySetName\", \"LogicalName\"],\r\n noCache: true,\r\n functionName: \"retrieveMultiple\",\r\n },\r\n config\r\n );\r\n\r\n const result = await _runRequest(request, config);\r\n RequestUtility.setEntityNames({});\r\n for (let i = 0; i < result.data.value.length; i++) {\r\n RequestUtility.entityNames![result.data.value[i].LogicalName] = result.data.value[i].EntitySetName;\r\n }\r\n\r\n return RequestUtility.findCollectionName(entityName) || entityName;\r\n};\r\n\r\nconst _checkCollectionName = async (entityName: string | null | undefined, config: InternalConfig): Promise => {\r\n if (!entityName || _isEntityNameException(entityName)) {\r\n return entityName;\r\n }\r\n\r\n entityName = entityName.toLowerCase();\r\n\r\n if (!config.useEntityNames) {\r\n return entityName;\r\n }\r\n\r\n try {\r\n return await _getCollectionNames(entityName, config);\r\n } catch (error: any) {\r\n throw new Error(\"Unable to fetch Collection Names. Error: \" + (error as DynamicsWebApiError).message);\r\n }\r\n};\r\n\r\nexport class RequestClient {\r\n /**\r\n * Sends a request to given URL with given parameters\r\n *\r\n * @param {InternalRequest} request - Composed request to D365 Web Api\r\n * @param {InternalConfig} config - DynamicsWebApi config.\r\n */\r\n static async sendRequest(request: Core.InternalRequest, config: InternalConfig): Promise {\r\n request.headers = request.headers || {};\r\n request.responseParameters = request.responseParameters || {};\r\n request.requestId = request.requestId || Utility.generateUUID();\r\n\r\n //add response parameters to parse\r\n _addResponseParams(request.requestId, request.responseParameters);\r\n\r\n //stringify passed data\r\n let processedData = null;\r\n\r\n const isBatchConverted = request.responseParameters?.convertedToBatch;\r\n\r\n if (request.path === \"$batch\" && !isBatchConverted) {\r\n const batchRequest = _batchRequestCollection[request.requestId];\r\n\r\n if (!batchRequest) throw ErrorHelper.batchIsEmpty();\r\n\r\n const batchResult = RequestUtility.convertToBatch(batchRequest, config, request);\r\n\r\n processedData = batchResult.body;\r\n request.headers = { ...batchResult.headers, ...request.headers };\r\n\r\n //clear an array of requests\r\n delete _batchRequestCollection[request.requestId];\r\n } else {\r\n processedData = !isBatchConverted ? RequestUtility.processData(request.data, config) : request.data;\r\n\r\n if (!isBatchConverted) request.headers = RequestUtility.setStandardHeaders(request.headers);\r\n }\r\n\r\n if (config.impersonate && !request.headers![\"MSCRMCallerID\"]) {\r\n request.headers![\"MSCRMCallerID\"] = config.impersonate;\r\n }\r\n\r\n if (config.impersonateAAD && !request.headers![\"CallerObjectId\"]) {\r\n request.headers![\"CallerObjectId\"] = config.impersonateAAD;\r\n }\r\n\r\n let token: AccessToken | string | null = null;\r\n\r\n //call a token refresh callback only if it is set and there is no \"Authorization\" header set yet\r\n if (config.onTokenRefresh && (!request.headers || (request.headers && !request.headers[\"Authorization\"]))) {\r\n token = await config.onTokenRefresh();\r\n if (!token) throw new Error(\"Token is empty. Request is aborted.\");\r\n }\r\n\r\n if (token) {\r\n request.headers![\"Authorization\"] = \"Bearer \" + (token.hasOwnProperty(\"accessToken\") ? (token as AccessToken).accessToken : token);\r\n }\r\n\r\n if (Utility.isRunningWithinPortals()) {\r\n request.headers![\"__RequestVerificationToken\"] = await global.window.shell!.getTokenDeferred();\r\n }\r\n\r\n const url = request.apiConfig ? request.apiConfig.url : config.dataApi.url;\r\n\r\n return await executeRequest({\r\n method: request.method!,\r\n uri: url!.toString() + request.path,\r\n data: processedData,\r\n proxy: config.proxy,\r\n isAsync: request.async,\r\n headers: request.headers!,\r\n requestId: request.requestId!,\r\n abortSignal: request.signal,\r\n responseParams: _responseParseParams,\r\n timeout: request.timeout || config.timeout,\r\n });\r\n }\r\n\r\n static async makeRequest(request: Core.InternalRequest, config: InternalConfig): Promise {\r\n request.responseParameters = request.responseParameters || {};\r\n //we don't want to mix headers set by the library and by the user\r\n request.userHeaders = request.headers;\r\n delete request.headers;\r\n\r\n if (!request.isBatch) {\r\n const collectionName = await _checkCollectionName(request.collection, config);\r\n\r\n request.collection = collectionName;\r\n RequestUtility.compose(request, config);\r\n request.responseParameters.convertedToBatch = false;\r\n\r\n //the URL contains more characters than max possible limit, convert the request to a batch request\r\n if (request.path!.length > 2000) {\r\n const batchRequest = RequestUtility.convertToBatch([request], config);\r\n\r\n //#175 authorization header must be copied as well. \r\n //todo: is it the only one that needs to be copied?\r\n if (request.headers![\"Authorization\"]) {\r\n batchRequest.headers[\"Authorization\"] = request.headers![\"Authorization\"];\r\n }\r\n\r\n request.method = \"POST\";\r\n request.path = \"$batch\";\r\n request.data = batchRequest.body;\r\n request.headers = { ...batchRequest.headers, ...request.userHeaders };\r\n request.responseParameters.convertedToBatch = true;\r\n }\r\n\r\n return _runRequest(request, config);\r\n }\r\n\r\n //no need to make a request to web api if it's a part of batch\r\n RequestUtility.compose(request, config);\r\n //add response parameters to parse\r\n _addResponseParams(request.requestId!, request.responseParameters);\r\n _addRequestToBatchCollection(request.requestId!, request);\r\n }\r\n\r\n static _clearTestData(): void {\r\n RequestUtility.setEntityNames(null);\r\n _responseParseParams = {};\r\n _batchRequestCollection = {};\r\n }\r\n\r\n static getCollectionName(entityName: string): string | null {\r\n return RequestUtility.findCollectionName(entityName);\r\n }\r\n}\r\n", "import type { InternalRequest, InternalBatchRequest } from \"../types\";\r\n\r\nimport { Utility } from \"./Utility\";\r\nimport { Config, HeaderCollection } from \"../dynamics-web-api\";\r\nimport { ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { InternalConfig } from \"./Config\";\r\n\r\nexport let entityNames: Record | null = null;\r\n\r\nexport const setEntityNames = (newEntityNames: Record | null) => {\r\n entityNames = newEntityNames;\r\n};\r\n\r\n/**\r\n * Converts a request object to URL link\r\n * @param request Internal request object\r\n * @param config Internal configuration object\r\n * @returns Modified internal request object\r\n */\r\nexport const compose = (request: InternalRequest, config: InternalConfig): InternalRequest => {\r\n request.path = request.path || \"\";\r\n request.functionName = request.functionName || \"\";\r\n if (!request.url) {\r\n if (!request._isUnboundRequest && !request.contentId && !request.collection) {\r\n ErrorHelper.parameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, \"request.collection\");\r\n }\r\n if (request.collection != null) {\r\n ErrorHelper.stringParameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, \"request.collection\");\r\n request.path = request.collection;\r\n\r\n //add alternate key feature\r\n if (request.key) {\r\n request.key = ErrorHelper.keyParameterCheck(request.key, `DynamicsWebApi.${request.functionName}`, \"request.key\");\r\n request.path += `(${request.key})`;\r\n }\r\n }\r\n\r\n if (request.contentId) {\r\n ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, \"request.contentId\");\r\n if (request.contentId.startsWith(\"$\")) {\r\n request.path = request.path ? `${request.contentId}/${request.path}` : request.contentId;\r\n }\r\n }\r\n\r\n if (request.addPath) {\r\n if (request.path) {\r\n request.path += \"/\";\r\n }\r\n request.path += request.addPath;\r\n }\r\n\r\n request.path = composeUrl(request, config, request.path);\r\n\r\n if (request.fetchXml) {\r\n ErrorHelper.stringParameterCheck(request.fetchXml, `DynamicsWebApi.${request.functionName}`, \"request.fetchXml\");\r\n let join = request.path.indexOf(\"?\") === -1 ? \"?\" : \"&\";\r\n request.path += `${join}fetchXml=${encodeURIComponent(request.fetchXml)}`;\r\n }\r\n } else {\r\n ErrorHelper.stringParameterCheck(request.url, `DynamicsWebApi.${request.functionName}`, \"request.url\");\r\n request.path = request.url.replace(config.dataApi.url, \"\");\r\n }\r\n\r\n if (request.hasOwnProperty(\"async\") && request.async != null) {\r\n ErrorHelper.boolParameterCheck(request.async, `DynamicsWebApi.${request.functionName}`, \"request.async\");\r\n } else {\r\n request.async = true;\r\n }\r\n\r\n request.headers = composeHeaders(request, config);\r\n\r\n return request;\r\n};\r\n\r\n/**\r\n * Converts optional parameters of the request to URL. If expand parameter exists this function is called recursively.\r\n * @param request Internal request object\r\n * @param config Internal configuration object\r\n * @param url Starting url\r\n * @param joinSymbol Join symbol. \"&\" by default and \";\" inside an expand query parameter\r\n * @returns Request URL\r\n */\r\nexport const composeUrl = (request: InternalRequest, config: Config, url: string = \"\", joinSymbol: \"&\" | \";\" = \"&\"): string => {\r\n const queryArray: string[] = [];\r\n\r\n if (request) {\r\n if (request.navigationProperty) {\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, `DynamicsWebApi.${request.functionName}`, \"request.navigationProperty\");\r\n url += \"/\" + request.navigationProperty;\r\n\r\n if (request.navigationPropertyKey) {\r\n let navigationKey = ErrorHelper.keyParameterCheck(\r\n request.navigationPropertyKey,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.navigationPropertyKey\"\r\n );\r\n url += \"(\" + navigationKey + \")\";\r\n }\r\n\r\n if (request.navigationProperty === \"Attributes\") {\r\n if (request.metadataAttributeType) {\r\n ErrorHelper.stringParameterCheck(request.metadataAttributeType, `DynamicsWebApi.${request.functionName}`, \"request.metadataAttributeType\");\r\n url += \"/\" + request.metadataAttributeType;\r\n }\r\n }\r\n }\r\n\r\n if (request.select?.length) {\r\n ErrorHelper.arrayParameterCheck(request.select, `DynamicsWebApi.${request.functionName}`, \"request.select\");\r\n\r\n if (request.functionName == \"retrieve\" && request.select.length == 1 && request.select[0].endsWith(\"/$ref\")) {\r\n url += \"/\" + request.select[0];\r\n } else {\r\n if (request.select[0].startsWith(\"/\") && request.functionName == \"retrieve\") {\r\n if (request.navigationProperty == null) {\r\n url += request.select.shift();\r\n } else {\r\n request.select.shift();\r\n }\r\n }\r\n\r\n //check if anything left in the array\r\n if (request.select.length) {\r\n queryArray.push(\"$select=\" + request.select.join(\",\"));\r\n }\r\n }\r\n }\r\n\r\n if (request.filter) {\r\n ErrorHelper.stringParameterCheck(request.filter, `DynamicsWebApi.${request.functionName}`, \"request.filter\");\r\n const removeBracketsFromGuidReg = /[^\"']{([\\w\\d]{8}[-]?(?:[\\w\\d]{4}[-]?){3}[\\w\\d]{12})}(?:[^\"']|$)/g;\r\n let filterResult = request.filter;\r\n\r\n //fix bug 2018-06-11\r\n let m: RegExpExecArray | null = null;\r\n while ((m = removeBracketsFromGuidReg.exec(filterResult)) !== null) {\r\n if (m.index === removeBracketsFromGuidReg.lastIndex) {\r\n removeBracketsFromGuidReg.lastIndex++;\r\n }\r\n\r\n let replacement = m[0].endsWith(\")\") ? \")\" : \" \";\r\n filterResult = filterResult.replace(m[0], \" \" + m[1] + replacement);\r\n }\r\n\r\n queryArray.push(\"$filter=\" + encodeURIComponent(filterResult));\r\n }\r\n\r\n if (request.fieldName) {\r\n ErrorHelper.stringParameterCheck(request.fieldName, `DynamicsWebApi.${request.functionName}`, \"request.fieldName\");\r\n url += \"/\" + request.fieldName;\r\n }\r\n\r\n if (request.savedQuery) {\r\n queryArray.push(\"savedQuery=\" + ErrorHelper.guidParameterCheck(request.savedQuery, `DynamicsWebApi.${request.functionName}`, \"request.savedQuery\"));\r\n }\r\n\r\n if (request.userQuery) {\r\n queryArray.push(\"userQuery=\" + ErrorHelper.guidParameterCheck(request.userQuery, `DynamicsWebApi.${request.functionName}`, \"request.userQuery\"));\r\n }\r\n\r\n if (request.apply) {\r\n ErrorHelper.stringParameterCheck(request.apply, `DynamicsWebApi.${request.functionName}`, \"request.apply\");\r\n queryArray.push(\"$apply=\" + request.apply);\r\n }\r\n\r\n if (request.count) {\r\n ErrorHelper.boolParameterCheck(request.count, `DynamicsWebApi.${request.functionName}`, \"request.count\");\r\n queryArray.push(\"$count=\" + request.count);\r\n }\r\n\r\n if (request.top && request.top > 0) {\r\n ErrorHelper.numberParameterCheck(request.top, `DynamicsWebApi.${request.functionName}`, \"request.top\");\r\n queryArray.push(\"$top=\" + request.top);\r\n }\r\n\r\n if (request.orderBy != null && request.orderBy.length) {\r\n ErrorHelper.arrayParameterCheck(request.orderBy, `DynamicsWebApi.${request.functionName}`, \"request.orderBy\");\r\n queryArray.push(\"$orderby=\" + request.orderBy.join(\",\"));\r\n }\r\n\r\n if (request.partitionId) {\r\n ErrorHelper.stringParameterCheck(request.partitionId, `DynamicsWebApi.${request.functionName}`, \"request.partitionId\");\r\n queryArray.push(\"partitionid='\" + request.partitionId + \"'\");\r\n }\r\n\r\n if (request.downloadSize) {\r\n ErrorHelper.stringParameterCheck(request.downloadSize, `DynamicsWebApi.${request.functionName}`, \"request.downloadSize\");\r\n queryArray.push(\"size=\" + request.downloadSize);\r\n }\r\n\r\n if (request.queryParams?.length) {\r\n ErrorHelper.arrayParameterCheck(request.queryParams, `DynamicsWebApi.${request.functionName}`, \"request.queryParams\");\r\n queryArray.push(request.queryParams.join(\"&\"));\r\n }\r\n\r\n if (request.fileName) {\r\n ErrorHelper.stringParameterCheck(request.fileName, `DynamicsWebApi.${request.functionName}`, \"request.fileName\");\r\n queryArray.push(\"x-ms-file-name=\" + request.fileName);\r\n }\r\n\r\n if (request.data) {\r\n ErrorHelper.parameterCheck(request.data, `DynamicsWebApi.${request.functionName}`, \"request.data\");\r\n }\r\n\r\n if (request.isBatch) {\r\n ErrorHelper.boolParameterCheck(request.isBatch, `DynamicsWebApi.${request.functionName}`, \"request.isBatch\");\r\n }\r\n\r\n if (!Utility.isNull(request.inChangeSet)) {\r\n ErrorHelper.boolParameterCheck(request.inChangeSet, `DynamicsWebApi.${request.functionName}`, \"request.inChangeSet\");\r\n }\r\n\r\n if (request.isBatch && Utility.isNull(request.inChangeSet)) request.inChangeSet = true;\r\n\r\n if (request.timeout) {\r\n ErrorHelper.numberParameterCheck(request.timeout, `DynamicsWebApi.${request.functionName}`, \"request.timeout\");\r\n }\r\n\r\n if (request.expand?.length) {\r\n ErrorHelper.stringOrArrayParameterCheck(request.expand, `DynamicsWebApi.${request.functionName}`, \"request.expand\");\r\n if (typeof request.expand === \"string\") {\r\n queryArray.push(\"$expand=\" + request.expand);\r\n } else {\r\n const expandQueryArray: string[] = [];\r\n for (let i = 0; i < request.expand.length; i++) {\r\n if (request.expand[i].property) {\r\n const expand = request.expand[i];\r\n expand.functionName = `${request.functionName} $expand`;\r\n let expandConverted = composeUrl(expand, config, \"\", \";\");\r\n if (expandConverted) {\r\n expandConverted = `(${expandConverted.substr(1)})`;\r\n }\r\n expandQueryArray.push(request.expand[i].property + expandConverted);\r\n }\r\n }\r\n if (expandQueryArray.length) {\r\n queryArray.push(\"$expand=\" + expandQueryArray.join(\",\"));\r\n }\r\n }\r\n }\r\n }\r\n\r\n return !queryArray.length ? url : url + \"?\" + queryArray.join(joinSymbol);\r\n};\r\n\r\nexport const composeHeaders = (request: InternalRequest, config: Config): HeaderCollection => {\r\n const headers: HeaderCollection = { ...config.headers, ...request.userHeaders };\r\n\r\n const prefer = composePreferHeader(request, config);\r\n if (prefer.length) {\r\n headers[\"Prefer\"] = prefer;\r\n }\r\n\r\n if (request.collection === \"$metadata\") {\r\n headers[\"Accept\"] = \"application/xml\";\r\n }\r\n\r\n if (request.transferMode) {\r\n headers[\"x-ms-transfer-mode\"] = request.transferMode;\r\n }\r\n\r\n if (request.ifmatch != null && request.ifnonematch != null) {\r\n throw new Error(\r\n `DynamicsWebApi.${request.functionName}. Either one of request.ifmatch or request.ifnonematch parameters should be used in a call, not both.`\r\n );\r\n }\r\n\r\n if (request.ifmatch) {\r\n ErrorHelper.stringParameterCheck(request.ifmatch, `DynamicsWebApi.${request.functionName}`, \"request.ifmatch\");\r\n headers[\"If-Match\"] = request.ifmatch;\r\n }\r\n\r\n if (request.ifnonematch) {\r\n ErrorHelper.stringParameterCheck(request.ifnonematch, `DynamicsWebApi.${request.functionName}`, \"request.ifnonematch\");\r\n headers[\"If-None-Match\"] = request.ifnonematch;\r\n }\r\n\r\n if (request.impersonate) {\r\n ErrorHelper.stringParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, \"request.impersonate\");\r\n headers[\"MSCRMCallerID\"] = ErrorHelper.guidParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, \"request.impersonate\");\r\n }\r\n\r\n if (request.impersonateAAD) {\r\n ErrorHelper.stringParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, \"request.impersonateAAD\");\r\n headers[\"CallerObjectId\"] = ErrorHelper.guidParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, \"request.impersonateAAD\");\r\n }\r\n\r\n if (request.token) {\r\n ErrorHelper.stringParameterCheck(request.token, `DynamicsWebApi.${request.functionName}`, \"request.token\");\r\n headers[\"Authorization\"] = \"Bearer \" + request.token;\r\n }\r\n\r\n if (request.duplicateDetection) {\r\n ErrorHelper.boolParameterCheck(request.duplicateDetection, `DynamicsWebApi.${request.functionName}`, \"request.duplicateDetection\");\r\n headers[\"MSCRM.SuppressDuplicateDetection\"] = \"false\";\r\n }\r\n\r\n if (request.bypassCustomPluginExecution) {\r\n ErrorHelper.boolParameterCheck(request.bypassCustomPluginExecution, `DynamicsWebApi.${request.functionName}`, \"request.bypassCustomPluginExecution\");\r\n headers[\"MSCRM.BypassCustomPluginExecution\"] = \"true\";\r\n }\r\n\r\n if (request.noCache) {\r\n ErrorHelper.boolParameterCheck(request.noCache, `DynamicsWebApi.${request.functionName}`, \"request.noCache\");\r\n headers[\"Cache-Control\"] = \"no-cache\";\r\n }\r\n\r\n if (request.mergeLabels) {\r\n ErrorHelper.boolParameterCheck(request.mergeLabels, `DynamicsWebApi.${request.functionName}`, \"request.mergeLabels\");\r\n headers[\"MSCRM.MergeLabels\"] = \"true\";\r\n }\r\n\r\n if (request.contentId) {\r\n ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, \"request.contentId\");\r\n if (!request.contentId.startsWith(\"$\")) {\r\n headers[\"Content-ID\"] = request.contentId;\r\n }\r\n }\r\n\r\n if (request.contentRange) {\r\n ErrorHelper.stringParameterCheck(request.contentRange, `DynamicsWebApi.${request.functionName}`, \"request.contentRange\");\r\n headers[\"Content-Range\"] = request.contentRange;\r\n }\r\n\r\n if (request.range) {\r\n ErrorHelper.stringParameterCheck(request.range, `DynamicsWebApi.${request.functionName}`, \"request.range\");\r\n headers[\"Range\"] = request.range;\r\n }\r\n\r\n return headers;\r\n};\r\n\r\nexport const composePreferHeader = (request: InternalRequest, config: Config): string => {\r\n let returnRepresentation: boolean | null | undefined = request.returnRepresentation;\r\n let includeAnnotations: string | null | undefined = request.includeAnnotations;\r\n let maxPageSize: number | null | undefined = request.maxPageSize;\r\n let trackChanges: boolean | null | undefined = request.trackChanges;\r\n let continueOnError: boolean | null | undefined = request.continueOnError;\r\n\r\n let prefer: string[] = [];\r\n\r\n if (request.prefer && request.prefer.length) {\r\n ErrorHelper.stringOrArrayParameterCheck(request.prefer, `DynamicsWebApi.${request.functionName}`, \"request.prefer\");\r\n if (typeof request.prefer === \"string\") {\r\n prefer = request.prefer.split(\",\");\r\n }\r\n for (let i in prefer) {\r\n let item = prefer[i].trim();\r\n if (item === \"return=representation\") {\r\n returnRepresentation = true;\r\n } else if (item.includes(\"odata.include-annotations=\")) {\r\n includeAnnotations = item.replace(\"odata.include-annotations=\", \"\").replace(/\"/g, \"\");\r\n } else if (item.startsWith(\"odata.maxpagesize=\")) {\r\n maxPageSize = Number(item.replace(\"odata.maxpagesize=\", \"\").replace(/\"/g, \"\")) || 0;\r\n } else if (item.includes(\"odata.track-changes\")) {\r\n trackChanges = true;\r\n } else if (item.includes(\"odata.continue-on-error\")) {\r\n continueOnError = true;\r\n }\r\n }\r\n }\r\n\r\n //clear array\r\n prefer = [];\r\n\r\n if (config) {\r\n if (returnRepresentation == null) {\r\n returnRepresentation = config.returnRepresentation;\r\n }\r\n includeAnnotations = includeAnnotations ? includeAnnotations : config.includeAnnotations;\r\n maxPageSize = maxPageSize ? maxPageSize : config.maxPageSize;\r\n }\r\n\r\n if (returnRepresentation) {\r\n ErrorHelper.boolParameterCheck(returnRepresentation, `DynamicsWebApi.${request.functionName}`, \"request.returnRepresentation\");\r\n prefer.push(\"return=representation\");\r\n }\r\n\r\n if (includeAnnotations) {\r\n ErrorHelper.stringParameterCheck(includeAnnotations, `DynamicsWebApi.${request.functionName}`, \"request.includeAnnotations\");\r\n prefer.push(`odata.include-annotations=\"${includeAnnotations}\"`);\r\n }\r\n\r\n if (maxPageSize && maxPageSize > 0) {\r\n ErrorHelper.numberParameterCheck(maxPageSize, `DynamicsWebApi.${request.functionName}`, \"request.maxPageSize\");\r\n prefer.push(\"odata.maxpagesize=\" + maxPageSize);\r\n }\r\n\r\n if (trackChanges) {\r\n ErrorHelper.boolParameterCheck(trackChanges, `DynamicsWebApi.${request.functionName}`, \"request.trackChanges\");\r\n prefer.push(\"odata.track-changes\");\r\n }\r\n\r\n if (continueOnError) {\r\n ErrorHelper.boolParameterCheck(continueOnError, `DynamicsWebApi.${request.functionName}`, \"request.continueOnError\");\r\n prefer.push(\"odata.continue-on-error\");\r\n }\r\n\r\n return prefer.join(\",\");\r\n};\r\n\r\nexport const convertToBatch = (requests: InternalRequest[], config: InternalConfig, batchRequest?: InternalRequest): InternalBatchRequest => {\r\n const batchBoundary = `dwa_batch_${Utility.generateUUID()}`;\r\n\r\n const batchBody: string[] = [];\r\n let currentChangeSet: string | null = null;\r\n let contentId = 100000;\r\n\r\n requests.forEach((internalRequest) => {\r\n internalRequest.functionName = \"executeBatch\";\r\n if (batchRequest?.inChangeSet === false) internalRequest.inChangeSet = false;\r\n const inChangeSet = internalRequest.method === \"GET\" ? false : !!internalRequest.inChangeSet;\r\n\r\n if (!inChangeSet && currentChangeSet) {\r\n //end current change set\r\n batchBody.push(`\\n--${currentChangeSet}--`);\r\n\r\n currentChangeSet = null;\r\n contentId = 100000;\r\n }\r\n\r\n if (!currentChangeSet) {\r\n batchBody.push(`\\n--${batchBoundary}`);\r\n\r\n if (inChangeSet) {\r\n currentChangeSet = `changeset_${Utility.generateUUID()}`;\r\n batchBody.push(\"Content-Type: multipart/mixed;boundary=\" + currentChangeSet);\r\n }\r\n }\r\n\r\n if (inChangeSet) {\r\n batchBody.push(`\\n--${currentChangeSet}`);\r\n }\r\n\r\n batchBody.push(\"Content-Type: application/http\");\r\n batchBody.push(\"Content-Transfer-Encoding: binary\");\r\n\r\n if (inChangeSet) {\r\n const contentIdValue = internalRequest.headers!.hasOwnProperty(\"Content-ID\") ? internalRequest.headers![\"Content-ID\"] : ++contentId;\r\n\r\n batchBody.push(`Content-ID: ${contentIdValue}`);\r\n }\r\n\r\n if (!internalRequest.path?.startsWith(\"$\")) {\r\n batchBody.push(`\\n${internalRequest.method} ${config.dataApi.url}${internalRequest.path} HTTP/1.1`);\r\n } else {\r\n batchBody.push(`\\n${internalRequest.method} ${internalRequest.path} HTTP/1.1`);\r\n }\r\n\r\n if (internalRequest.method === \"GET\") {\r\n batchBody.push(\"Accept: application/json\");\r\n } else {\r\n batchBody.push(\"Content-Type: application/json\");\r\n }\r\n\r\n for (let key in internalRequest.headers) {\r\n if (key === \"Authorization\" || key === \"Content-ID\") continue;\r\n\r\n batchBody.push(`${key}: ${internalRequest.headers[key]}`);\r\n }\r\n\r\n if (internalRequest.data) {\r\n batchBody.push(`\\n${processData(internalRequest.data, config)}`);\r\n }\r\n });\r\n\r\n if (currentChangeSet) {\r\n batchBody.push(`\\n--${currentChangeSet}--`);\r\n }\r\n\r\n batchBody.push(`\\n--${batchBoundary}--`);\r\n\r\n const headers = setStandardHeaders(batchRequest?.userHeaders);\r\n headers[\"Content-Type\"] = `multipart/mixed;boundary=${batchBoundary}`;\r\n\r\n return { headers: headers, body: batchBody.join(\"\\n\") };\r\n};\r\n\r\nexport const findCollectionName = (entityName: string): string | null => {\r\n let collectionName: string | null = null;\r\n\r\n if (!Utility.isNull(entityNames)) {\r\n collectionName = entityNames![entityName];\r\n if (!collectionName) {\r\n for (let key in entityNames!) {\r\n if (entityNames[key] === entityName) {\r\n return entityName;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return collectionName;\r\n};\r\n\r\nexport const processData = (data: any, config: InternalConfig): string | Uint8Array | Uint16Array | Uint32Array | null => {\r\n let stringifiedData: string | null = null;\r\n if (data) {\r\n if (data instanceof Uint8Array || data instanceof Uint16Array || data instanceof Uint32Array) return data;\r\n\r\n stringifiedData = JSON.stringify(data, (key, value) => {\r\n if (key.endsWith(\"@odata.bind\") || key.endsWith(\"@odata.id\")) {\r\n if (typeof value === \"string\" && !value.startsWith(\"$\")) {\r\n //remove brackets in guid\r\n if (/\\(\\{[\\w\\d-]+\\}\\)/g.test(value)) {\r\n value = value.replace(/(.+)\\(\\{([\\w\\d-]+)\\}\\)/g, \"$1($2)\");\r\n }\r\n\r\n if (config.useEntityNames) {\r\n //replace entity name with collection name\r\n const regularExpression = /([\\w_]+)(\\([\\d\\w-]+\\))$/;\r\n const valueParts = regularExpression.exec(value);\r\n if (valueParts && valueParts.length > 2) {\r\n const collectionName = findCollectionName(valueParts[1]);\r\n\r\n if (!Utility.isNull(collectionName)) {\r\n value = value.replace(regularExpression, collectionName + \"$2\");\r\n }\r\n }\r\n }\r\n\r\n if (!value.startsWith(config.dataApi.url)) {\r\n //add full web api url if it's not set\r\n if (key.endsWith(\"@odata.bind\")) {\r\n if (!value.startsWith(\"/\")) {\r\n value = \"/\" + value;\r\n }\r\n } else {\r\n value = config.dataApi.url + value.replace(/^\\//, \"\");\r\n }\r\n }\r\n }\r\n } else if (key.startsWith(\"oData\") || key.endsWith(\"_Formatted\") || key.endsWith(\"_NavigationProperty\") || key.endsWith(\"_LogicalName\")) {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n });\r\n\r\n stringifiedData = stringifiedData.replace(/[\\u007F-\\uFFFF]/g, function (chr: string) {\r\n return \"\\\\u\" + (\"0000\" + chr.charCodeAt(0).toString(16)).slice(-4);\r\n });\r\n }\r\n\r\n return stringifiedData;\r\n};\r\n\r\nexport const setStandardHeaders = (headers: HeaderCollection = {}): HeaderCollection => {\r\n if (!headers[\"Accept\"]) headers[\"Accept\"] = \"application/json\";\r\n if (!headers[\"OData-MaxVersion\"]) headers[\"OData-MaxVersion\"] = \"4.0\";\r\n if (!headers[\"OData-Version\"]) headers[\"OData-Version\"] = \"4.0\";\r\n if (headers[\"Content-Range\"]) headers[\"Content-Type\"] = \"application/octet-stream\";\r\n else if (!headers[\"Content-Type\"]) headers[\"Content-Type\"] = \"application/json; charset=utf-8\";\r\n\r\n return headers;\r\n};\r\n", "import type { RequestOptions, WebApiResponse } from \"../../types\";\r\n\r\nexport async function executeRequest(options: RequestOptions): Promise {\r\n return global.DWA_BROWSER ? require(\"../xhr\").executeRequest(options) : require(\"../http\").executeRequest(options);\r\n}\r\n"], + "mappings": "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", + "names": ["headers", "executeRequest", "executeRequest", "request"] } diff --git a/dist/cjs/dynamics-web-api.js b/dist/cjs/dynamics-web-api.js index 9dd56fe..a38f45f 100644 --- a/dist/cjs/dynamics-web-api.js +++ b/dist/cjs/dynamics-web-api.js @@ -1,4 +1,4 @@ -/*! dynamics-web-api v2.1.4 (c) 2024 Aleksandr Rogov */ +/*! dynamics-web-api v2.1.5 (c) 2024 Aleksandr Rogov */ "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; @@ -688,17 +688,17 @@ function executeRequest(options) { function _executeRequest(options, successCallback, errorCallback) { var _a2; const data = options.data; - const additionalHeaders = options.additionalHeaders; + const headers = options.headers; const responseParams = options.responseParams; const signal = options.abortSignal; - const headers = {}; + const httpHeaders = {}; if (data) { - headers["Content-Type"] = additionalHeaders["Content-Type"]; - headers["Content-Length"] = data.length; - delete additionalHeaders["Content-Type"]; + httpHeaders["Content-Type"] = headers["Content-Type"]; + httpHeaders["Content-Length"] = data.length; + delete headers["Content-Type"]; } - for (let key in additionalHeaders) { - headers[key] = additionalHeaders[key]; + for (let key in headers) { + httpHeaders[key] = headers[key]; } const parsedUrl = new URL(options.uri); const protocol = ((_a2 = parsedUrl.protocol) == null ? void 0 : _a2.slice(0, -1)) || "https"; @@ -709,7 +709,7 @@ function _executeRequest(options, successCallback, errorCallback) { path: parsedUrl.pathname + parsedUrl.search, method: options.method, timeout: options.timeout || 0, - headers, + headers: httpHeaders, signal }; if (!options.proxy && process.env[`${protocol}_proxy`]) { @@ -721,7 +721,7 @@ function _executeRequest(options, successCallback, errorCallback) { if (options.proxy) { const hostHeader = new URL(options.proxy.url).host; if (hostHeader) - headers.host = hostHeader; + httpHeaders.host = hostHeader; } const request = protocolInterface.request(internalOptions, function(res) { let rawData = ""; @@ -948,484 +948,451 @@ init_Utility(); // src/utils/Request.ts init_Utility(); init_ErrorHelper(); -var _RequestUtility = class _RequestUtility { - /** - * Converts a request object to URL link - * - * @param {Object} request - Request object - * @param {Object} [config] - DynamicsWebApi config - * @returns {ConvertedRequest} Converted request - */ - static compose(request, config) { - request.path = request.path || ""; - request.functionName = request.functionName || ""; - if (!request.url) { - if (!request._isUnboundRequest && !request.contentId && !request.collection) { - ErrorHelper.parameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, "request.collection"); - } - if (request.collection != null) { - ErrorHelper.stringParameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, "request.collection"); - request.path = request.collection; - if (request.key) { - request.key = ErrorHelper.keyParameterCheck(request.key, `DynamicsWebApi.${request.functionName}`, "request.key"); - request.path += `(${request.key})`; - } - } - if (request.contentId) { - ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, "request.contentId"); - if (request.contentId.startsWith("$")) { - request.path = request.path ? `${request.contentId}/${request.path}` : request.contentId; - } +var entityNames = null; +var setEntityNames = (newEntityNames) => { + entityNames = newEntityNames; +}; +var compose = (request, config) => { + request.path = request.path || ""; + request.functionName = request.functionName || ""; + if (!request.url) { + if (!request._isUnboundRequest && !request.contentId && !request.collection) { + ErrorHelper.parameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, "request.collection"); + } + if (request.collection != null) { + ErrorHelper.stringParameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, "request.collection"); + request.path = request.collection; + if (request.key) { + request.key = ErrorHelper.keyParameterCheck(request.key, `DynamicsWebApi.${request.functionName}`, "request.key"); + request.path += `(${request.key})`; } - if (request._additionalUrl) { - if (request.path) { - request.path += "/"; - } - request.path += request._additionalUrl; + } + if (request.contentId) { + ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, "request.contentId"); + if (request.contentId.startsWith("$")) { + request.path = request.path ? `${request.contentId}/${request.path}` : request.contentId; } - request.path = _RequestUtility.composeUrl(request, config, request.path); - if (request.fetchXml) { - ErrorHelper.stringParameterCheck(request.fetchXml, `DynamicsWebApi.${request.functionName}`, "request.fetchXml"); - let join = request.path.indexOf("?") === -1 ? "?" : "&"; - request.path += `${join}fetchXml=${encodeURIComponent(request.fetchXml)}`; + } + if (request.addPath) { + if (request.path) { + request.path += "/"; } - } else { - ErrorHelper.stringParameterCheck(request.url, `DynamicsWebApi.${request.functionName}`, "request.url"); - request.path = request.url.replace(config.dataApi.url, ""); + request.path += request.addPath; } - if (request.hasOwnProperty("async") && request.async != null) { - ErrorHelper.boolParameterCheck(request.async, `DynamicsWebApi.${request.functionName}`, "request.async"); - } else { - request.async = true; + request.path = composeUrl(request, config, request.path); + if (request.fetchXml) { + ErrorHelper.stringParameterCheck(request.fetchXml, `DynamicsWebApi.${request.functionName}`, "request.fetchXml"); + let join = request.path.indexOf("?") === -1 ? "?" : "&"; + request.path += `${join}fetchXml=${encodeURIComponent(request.fetchXml)}`; } - request.headers = _RequestUtility.composeHeaders(request, config); - return request; + } else { + ErrorHelper.stringParameterCheck(request.url, `DynamicsWebApi.${request.functionName}`, "request.url"); + request.path = request.url.replace(config.dataApi.url, ""); } - /** - * Converts optional parameters of the request to URL. If expand parameter exists this function is called recursively. - * - * @param {Object} request - Request object - * @param {string} request.functionName - Name of the function that converts a request (for Error Handling) - * @param {string} url - URL beginning (with required parameters) - * @param {string} [joinSymbol] - URL beginning (with required parameters) - * @param {Object} [config] - DynamicsWebApi config - * @returns {ConvertedRequestOptions} Additional options in request - */ - static composeUrl(request, config, url = "", joinSymbol = "&") { - var _a2, _b2, _c; - const queryArray = []; - if (request) { - if (request.navigationProperty) { - ErrorHelper.stringParameterCheck(request.navigationProperty, `DynamicsWebApi.${request.functionName}`, "request.navigationProperty"); - url += "/" + request.navigationProperty; - if (request.navigationPropertyKey) { - let navigationKey = ErrorHelper.keyParameterCheck( - request.navigationPropertyKey, - `DynamicsWebApi.${request.functionName}`, - "request.navigationPropertyKey" - ); - url += "(" + navigationKey + ")"; - } - if (request.navigationProperty === "Attributes") { - if (request.metadataAttributeType) { - ErrorHelper.stringParameterCheck( - request.metadataAttributeType, - `DynamicsWebApi.${request.functionName}`, - "request.metadataAttributeType" - ); - url += "/" + request.metadataAttributeType; - } - } + if (request.hasOwnProperty("async") && request.async != null) { + ErrorHelper.boolParameterCheck(request.async, `DynamicsWebApi.${request.functionName}`, "request.async"); + } else { + request.async = true; + } + request.headers = composeHeaders(request, config); + return request; +}; +var composeUrl = (request, config, url = "", joinSymbol = "&") => { + var _a2, _b2, _c; + const queryArray = []; + if (request) { + if (request.navigationProperty) { + ErrorHelper.stringParameterCheck(request.navigationProperty, `DynamicsWebApi.${request.functionName}`, "request.navigationProperty"); + url += "/" + request.navigationProperty; + if (request.navigationPropertyKey) { + let navigationKey = ErrorHelper.keyParameterCheck( + request.navigationPropertyKey, + `DynamicsWebApi.${request.functionName}`, + "request.navigationPropertyKey" + ); + url += "(" + navigationKey + ")"; } - if ((_a2 = request.select) == null ? void 0 : _a2.length) { - ErrorHelper.arrayParameterCheck(request.select, `DynamicsWebApi.${request.functionName}`, "request.select"); - if (request.functionName == "retrieve" && request.select.length == 1 && request.select[0].endsWith("/$ref")) { - url += "/" + request.select[0]; - } else { - if (request.select[0].startsWith("/") && request.functionName == "retrieve") { - if (request.navigationProperty == null) { - url += request.select.shift(); - } else { - request.select.shift(); - } - } - if (request.select.length) { - queryArray.push("$select=" + request.select.join(",")); - } + if (request.navigationProperty === "Attributes") { + if (request.metadataAttributeType) { + ErrorHelper.stringParameterCheck(request.metadataAttributeType, `DynamicsWebApi.${request.functionName}`, "request.metadataAttributeType"); + url += "/" + request.metadataAttributeType; } } - if (request.filter) { - ErrorHelper.stringParameterCheck(request.filter, `DynamicsWebApi.${request.functionName}`, "request.filter"); - const removeBracketsFromGuidReg = /[^"']{([\w\d]{8}[-]?(?:[\w\d]{4}[-]?){3}[\w\d]{12})}(?:[^"']|$)/g; - let filterResult = request.filter; - let m = null; - while ((m = removeBracketsFromGuidReg.exec(filterResult)) !== null) { - if (m.index === removeBracketsFromGuidReg.lastIndex) { - removeBracketsFromGuidReg.lastIndex++; + } + if ((_a2 = request.select) == null ? void 0 : _a2.length) { + ErrorHelper.arrayParameterCheck(request.select, `DynamicsWebApi.${request.functionName}`, "request.select"); + if (request.functionName == "retrieve" && request.select.length == 1 && request.select[0].endsWith("/$ref")) { + url += "/" + request.select[0]; + } else { + if (request.select[0].startsWith("/") && request.functionName == "retrieve") { + if (request.navigationProperty == null) { + url += request.select.shift(); + } else { + request.select.shift(); } - let replacement = m[0].endsWith(")") ? ")" : " "; - filterResult = filterResult.replace(m[0], " " + m[1] + replacement); } - queryArray.push("$filter=" + encodeURIComponent(filterResult)); - } - if (request.fieldName) { - ErrorHelper.stringParameterCheck(request.fieldName, `DynamicsWebApi.${request.functionName}`, "request.fieldName"); - url += "/" + request.fieldName; - } - if (request.savedQuery) { - queryArray.push( - "savedQuery=" + ErrorHelper.guidParameterCheck(request.savedQuery, `DynamicsWebApi.${request.functionName}`, "request.savedQuery") - ); - } - if (request.userQuery) { - queryArray.push( - "userQuery=" + ErrorHelper.guidParameterCheck(request.userQuery, `DynamicsWebApi.${request.functionName}`, "request.userQuery") - ); - } - if (request.apply) { - ErrorHelper.stringParameterCheck(request.apply, `DynamicsWebApi.${request.functionName}`, "request.apply"); - queryArray.push("$apply=" + request.apply); - } - if (request.count) { - ErrorHelper.boolParameterCheck(request.count, `DynamicsWebApi.${request.functionName}`, "request.count"); - queryArray.push("$count=" + request.count); - } - if (request.top && request.top > 0) { - ErrorHelper.numberParameterCheck(request.top, `DynamicsWebApi.${request.functionName}`, "request.top"); - queryArray.push("$top=" + request.top); - } - if (request.orderBy != null && request.orderBy.length) { - ErrorHelper.arrayParameterCheck(request.orderBy, `DynamicsWebApi.${request.functionName}`, "request.orderBy"); - queryArray.push("$orderby=" + request.orderBy.join(",")); - } - if (request.partitionId) { - ErrorHelper.stringParameterCheck(request.partitionId, `DynamicsWebApi.${request.functionName}`, "request.partitionId"); - queryArray.push("partitionid='" + request.partitionId + "'"); - } - if (request.downloadSize) { - ErrorHelper.stringParameterCheck(request.downloadSize, `DynamicsWebApi.${request.functionName}`, "request.downloadSize"); - queryArray.push("size=" + request.downloadSize); - } - if ((_b2 = request.queryParams) == null ? void 0 : _b2.length) { - ErrorHelper.arrayParameterCheck(request.queryParams, `DynamicsWebApi.${request.functionName}`, "request.queryParams"); - queryArray.push(request.queryParams.join("&")); - } - if (request.fileName) { - ErrorHelper.stringParameterCheck(request.fileName, `DynamicsWebApi.${request.functionName}`, "request.fileName"); - queryArray.push("x-ms-file-name=" + request.fileName); - } - if (request.data) { - ErrorHelper.parameterCheck(request.data, `DynamicsWebApi.${request.functionName}`, "request.data"); - } - if (request.isBatch) { - ErrorHelper.boolParameterCheck(request.isBatch, `DynamicsWebApi.${request.functionName}`, "request.isBatch"); - } - if (!Utility.isNull(request.inChangeSet)) { - ErrorHelper.boolParameterCheck(request.inChangeSet, `DynamicsWebApi.${request.functionName}`, "request.inChangeSet"); - } - if (request.isBatch && Utility.isNull(request.inChangeSet)) - request.inChangeSet = true; - if (request.timeout) { - ErrorHelper.numberParameterCheck(request.timeout, `DynamicsWebApi.${request.functionName}`, "request.timeout"); - } - if ((_c = request.expand) == null ? void 0 : _c.length) { - ErrorHelper.stringOrArrayParameterCheck(request.expand, `DynamicsWebApi.${request.functionName}`, "request.expand"); - if (typeof request.expand === "string") { - queryArray.push("$expand=" + request.expand); - } else { - const expandQueryArray = []; - for (let i = 0; i < request.expand.length; i++) { - if (request.expand[i].property) { - const expand = request.expand[i]; - expand.functionName = `${request.functionName} $expand`; - let expandConverted = _RequestUtility.composeUrl(expand, config, "", ";"); - if (expandConverted) { - expandConverted = `(${expandConverted.substr(1)})`; - } - expandQueryArray.push(request.expand[i].property + expandConverted); - } - } - if (expandQueryArray.length) { - queryArray.push("$expand=" + expandQueryArray.join(",")); - } + if (request.select.length) { + queryArray.push("$select=" + request.select.join(",")); } } } - return !queryArray.length ? url : url + "?" + queryArray.join(joinSymbol); - } - static composeHeaders(request, config) { - const headers = { ...config.headers, ...request.userHeaders }; - const prefer = _RequestUtility.composePreferHeader(request, config); - if (prefer.length) { - headers["Prefer"] = prefer; + if (request.filter) { + ErrorHelper.stringParameterCheck(request.filter, `DynamicsWebApi.${request.functionName}`, "request.filter"); + const removeBracketsFromGuidReg = /[^"']{([\w\d]{8}[-]?(?:[\w\d]{4}[-]?){3}[\w\d]{12})}(?:[^"']|$)/g; + let filterResult = request.filter; + let m = null; + while ((m = removeBracketsFromGuidReg.exec(filterResult)) !== null) { + if (m.index === removeBracketsFromGuidReg.lastIndex) { + removeBracketsFromGuidReg.lastIndex++; + } + let replacement = m[0].endsWith(")") ? ")" : " "; + filterResult = filterResult.replace(m[0], " " + m[1] + replacement); + } + queryArray.push("$filter=" + encodeURIComponent(filterResult)); } - if (request.collection === "$metadata") { - headers["Accept"] = "application/xml"; + if (request.fieldName) { + ErrorHelper.stringParameterCheck(request.fieldName, `DynamicsWebApi.${request.functionName}`, "request.fieldName"); + url += "/" + request.fieldName; } - if (request.transferMode) { - headers["x-ms-transfer-mode"] = request.transferMode; + if (request.savedQuery) { + queryArray.push("savedQuery=" + ErrorHelper.guidParameterCheck(request.savedQuery, `DynamicsWebApi.${request.functionName}`, "request.savedQuery")); } - if (request.ifmatch != null && request.ifnonematch != null) { - throw new Error( - `DynamicsWebApi.${request.functionName}. Either one of request.ifmatch or request.ifnonematch parameters should be used in a call, not both.` - ); + if (request.userQuery) { + queryArray.push("userQuery=" + ErrorHelper.guidParameterCheck(request.userQuery, `DynamicsWebApi.${request.functionName}`, "request.userQuery")); } - if (request.ifmatch) { - ErrorHelper.stringParameterCheck(request.ifmatch, `DynamicsWebApi.${request.functionName}`, "request.ifmatch"); - headers["If-Match"] = request.ifmatch; + if (request.apply) { + ErrorHelper.stringParameterCheck(request.apply, `DynamicsWebApi.${request.functionName}`, "request.apply"); + queryArray.push("$apply=" + request.apply); } - if (request.ifnonematch) { - ErrorHelper.stringParameterCheck(request.ifnonematch, `DynamicsWebApi.${request.functionName}`, "request.ifnonematch"); - headers["If-None-Match"] = request.ifnonematch; + if (request.count) { + ErrorHelper.boolParameterCheck(request.count, `DynamicsWebApi.${request.functionName}`, "request.count"); + queryArray.push("$count=" + request.count); } - if (request.impersonate) { - ErrorHelper.stringParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, "request.impersonate"); - headers["MSCRMCallerID"] = ErrorHelper.guidParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, "request.impersonate"); + if (request.top && request.top > 0) { + ErrorHelper.numberParameterCheck(request.top, `DynamicsWebApi.${request.functionName}`, "request.top"); + queryArray.push("$top=" + request.top); } - if (request.impersonateAAD) { - ErrorHelper.stringParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, "request.impersonateAAD"); - headers["CallerObjectId"] = ErrorHelper.guidParameterCheck( - request.impersonateAAD, - `DynamicsWebApi.${request.functionName}`, - "request.impersonateAAD" - ); + if (request.orderBy != null && request.orderBy.length) { + ErrorHelper.arrayParameterCheck(request.orderBy, `DynamicsWebApi.${request.functionName}`, "request.orderBy"); + queryArray.push("$orderby=" + request.orderBy.join(",")); } - if (request.token) { - ErrorHelper.stringParameterCheck(request.token, `DynamicsWebApi.${request.functionName}`, "request.token"); - headers["Authorization"] = "Bearer " + request.token; + if (request.partitionId) { + ErrorHelper.stringParameterCheck(request.partitionId, `DynamicsWebApi.${request.functionName}`, "request.partitionId"); + queryArray.push("partitionid='" + request.partitionId + "'"); } - if (request.duplicateDetection) { - ErrorHelper.boolParameterCheck(request.duplicateDetection, `DynamicsWebApi.${request.functionName}`, "request.duplicateDetection"); - headers["MSCRM.SuppressDuplicateDetection"] = "false"; + if (request.downloadSize) { + ErrorHelper.stringParameterCheck(request.downloadSize, `DynamicsWebApi.${request.functionName}`, "request.downloadSize"); + queryArray.push("size=" + request.downloadSize); } - if (request.bypassCustomPluginExecution) { - ErrorHelper.boolParameterCheck( - request.bypassCustomPluginExecution, - `DynamicsWebApi.${request.functionName}`, - "request.bypassCustomPluginExecution" - ); - headers["MSCRM.BypassCustomPluginExecution"] = "true"; + if ((_b2 = request.queryParams) == null ? void 0 : _b2.length) { + ErrorHelper.arrayParameterCheck(request.queryParams, `DynamicsWebApi.${request.functionName}`, "request.queryParams"); + queryArray.push(request.queryParams.join("&")); } - if (request.noCache) { - ErrorHelper.boolParameterCheck(request.noCache, `DynamicsWebApi.${request.functionName}`, "request.noCache"); - headers["Cache-Control"] = "no-cache"; + if (request.fileName) { + ErrorHelper.stringParameterCheck(request.fileName, `DynamicsWebApi.${request.functionName}`, "request.fileName"); + queryArray.push("x-ms-file-name=" + request.fileName); } - if (request.mergeLabels) { - ErrorHelper.boolParameterCheck(request.mergeLabels, `DynamicsWebApi.${request.functionName}`, "request.mergeLabels"); - headers["MSCRM.MergeLabels"] = "true"; + if (request.data) { + ErrorHelper.parameterCheck(request.data, `DynamicsWebApi.${request.functionName}`, "request.data"); } - if (request.contentId) { - ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, "request.contentId"); - if (!request.contentId.startsWith("$")) { - headers["Content-ID"] = request.contentId; - } - } - if (request.contentRange) { - ErrorHelper.stringParameterCheck(request.contentRange, `DynamicsWebApi.${request.functionName}`, "request.contentRange"); - headers["Content-Range"] = request.contentRange; - } - if (request.range) { - ErrorHelper.stringParameterCheck(request.range, `DynamicsWebApi.${request.functionName}`, "request.range"); - headers["Range"] = request.range; - } - return headers; - } - static composePreferHeader(request, config) { - let returnRepresentation = request.returnRepresentation; - let includeAnnotations = request.includeAnnotations; - let maxPageSize = request.maxPageSize; - let trackChanges = request.trackChanges; - let continueOnError = request.continueOnError; - let prefer = []; - if (request.prefer && request.prefer.length) { - ErrorHelper.stringOrArrayParameterCheck(request.prefer, `DynamicsWebApi.${request.functionName}`, "request.prefer"); - if (typeof request.prefer === "string") { - prefer = request.prefer.split(","); - } - for (let i in prefer) { - let item = prefer[i].trim(); - if (item === "return=representation") { - returnRepresentation = true; - } else if (item.includes("odata.include-annotations=")) { - includeAnnotations = item.replace("odata.include-annotations=", "").replace(/"/g, ""); - } else if (item.startsWith("odata.maxpagesize=")) { - maxPageSize = Number(item.replace("odata.maxpagesize=", "").replace(/"/g, "")) || 0; - } else if (item.includes("odata.track-changes")) { - trackChanges = true; - } else if (item.includes("odata.continue-on-error")) { - continueOnError = true; - } - } + if (request.isBatch) { + ErrorHelper.boolParameterCheck(request.isBatch, `DynamicsWebApi.${request.functionName}`, "request.isBatch"); } - prefer = []; - if (config) { - if (returnRepresentation == null) { - returnRepresentation = config.returnRepresentation; - } - includeAnnotations = includeAnnotations ? includeAnnotations : config.includeAnnotations; - maxPageSize = maxPageSize ? maxPageSize : config.maxPageSize; + if (!Utility.isNull(request.inChangeSet)) { + ErrorHelper.boolParameterCheck(request.inChangeSet, `DynamicsWebApi.${request.functionName}`, "request.inChangeSet"); } - if (returnRepresentation) { - ErrorHelper.boolParameterCheck(returnRepresentation, `DynamicsWebApi.${request.functionName}`, "request.returnRepresentation"); - prefer.push("return=representation"); + if (request.isBatch && Utility.isNull(request.inChangeSet)) + request.inChangeSet = true; + if (request.timeout) { + ErrorHelper.numberParameterCheck(request.timeout, `DynamicsWebApi.${request.functionName}`, "request.timeout"); } - if (includeAnnotations) { - ErrorHelper.stringParameterCheck(includeAnnotations, `DynamicsWebApi.${request.functionName}`, "request.includeAnnotations"); - prefer.push(`odata.include-annotations="${includeAnnotations}"`); + if ((_c = request.expand) == null ? void 0 : _c.length) { + ErrorHelper.stringOrArrayParameterCheck(request.expand, `DynamicsWebApi.${request.functionName}`, "request.expand"); + if (typeof request.expand === "string") { + queryArray.push("$expand=" + request.expand); + } else { + const expandQueryArray = []; + for (let i = 0; i < request.expand.length; i++) { + if (request.expand[i].property) { + const expand = request.expand[i]; + expand.functionName = `${request.functionName} $expand`; + let expandConverted = composeUrl(expand, config, "", ";"); + if (expandConverted) { + expandConverted = `(${expandConverted.substr(1)})`; + } + expandQueryArray.push(request.expand[i].property + expandConverted); + } + } + if (expandQueryArray.length) { + queryArray.push("$expand=" + expandQueryArray.join(",")); + } + } } - if (maxPageSize && maxPageSize > 0) { - ErrorHelper.numberParameterCheck(maxPageSize, `DynamicsWebApi.${request.functionName}`, "request.maxPageSize"); - prefer.push("odata.maxpagesize=" + maxPageSize); + } + return !queryArray.length ? url : url + "?" + queryArray.join(joinSymbol); +}; +var composeHeaders = (request, config) => { + const headers = { ...config.headers, ...request.userHeaders }; + const prefer = composePreferHeader(request, config); + if (prefer.length) { + headers["Prefer"] = prefer; + } + if (request.collection === "$metadata") { + headers["Accept"] = "application/xml"; + } + if (request.transferMode) { + headers["x-ms-transfer-mode"] = request.transferMode; + } + if (request.ifmatch != null && request.ifnonematch != null) { + throw new Error( + `DynamicsWebApi.${request.functionName}. Either one of request.ifmatch or request.ifnonematch parameters should be used in a call, not both.` + ); + } + if (request.ifmatch) { + ErrorHelper.stringParameterCheck(request.ifmatch, `DynamicsWebApi.${request.functionName}`, "request.ifmatch"); + headers["If-Match"] = request.ifmatch; + } + if (request.ifnonematch) { + ErrorHelper.stringParameterCheck(request.ifnonematch, `DynamicsWebApi.${request.functionName}`, "request.ifnonematch"); + headers["If-None-Match"] = request.ifnonematch; + } + if (request.impersonate) { + ErrorHelper.stringParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, "request.impersonate"); + headers["MSCRMCallerID"] = ErrorHelper.guidParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, "request.impersonate"); + } + if (request.impersonateAAD) { + ErrorHelper.stringParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, "request.impersonateAAD"); + headers["CallerObjectId"] = ErrorHelper.guidParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, "request.impersonateAAD"); + } + if (request.token) { + ErrorHelper.stringParameterCheck(request.token, `DynamicsWebApi.${request.functionName}`, "request.token"); + headers["Authorization"] = "Bearer " + request.token; + } + if (request.duplicateDetection) { + ErrorHelper.boolParameterCheck(request.duplicateDetection, `DynamicsWebApi.${request.functionName}`, "request.duplicateDetection"); + headers["MSCRM.SuppressDuplicateDetection"] = "false"; + } + if (request.bypassCustomPluginExecution) { + ErrorHelper.boolParameterCheck(request.bypassCustomPluginExecution, `DynamicsWebApi.${request.functionName}`, "request.bypassCustomPluginExecution"); + headers["MSCRM.BypassCustomPluginExecution"] = "true"; + } + if (request.noCache) { + ErrorHelper.boolParameterCheck(request.noCache, `DynamicsWebApi.${request.functionName}`, "request.noCache"); + headers["Cache-Control"] = "no-cache"; + } + if (request.mergeLabels) { + ErrorHelper.boolParameterCheck(request.mergeLabels, `DynamicsWebApi.${request.functionName}`, "request.mergeLabels"); + headers["MSCRM.MergeLabels"] = "true"; + } + if (request.contentId) { + ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, "request.contentId"); + if (!request.contentId.startsWith("$")) { + headers["Content-ID"] = request.contentId; } - if (trackChanges) { - ErrorHelper.boolParameterCheck(trackChanges, `DynamicsWebApi.${request.functionName}`, "request.trackChanges"); - prefer.push("odata.track-changes"); + } + if (request.contentRange) { + ErrorHelper.stringParameterCheck(request.contentRange, `DynamicsWebApi.${request.functionName}`, "request.contentRange"); + headers["Content-Range"] = request.contentRange; + } + if (request.range) { + ErrorHelper.stringParameterCheck(request.range, `DynamicsWebApi.${request.functionName}`, "request.range"); + headers["Range"] = request.range; + } + return headers; +}; +var composePreferHeader = (request, config) => { + let returnRepresentation = request.returnRepresentation; + let includeAnnotations = request.includeAnnotations; + let maxPageSize = request.maxPageSize; + let trackChanges = request.trackChanges; + let continueOnError = request.continueOnError; + let prefer = []; + if (request.prefer && request.prefer.length) { + ErrorHelper.stringOrArrayParameterCheck(request.prefer, `DynamicsWebApi.${request.functionName}`, "request.prefer"); + if (typeof request.prefer === "string") { + prefer = request.prefer.split(","); + } + for (let i in prefer) { + let item = prefer[i].trim(); + if (item === "return=representation") { + returnRepresentation = true; + } else if (item.includes("odata.include-annotations=")) { + includeAnnotations = item.replace("odata.include-annotations=", "").replace(/"/g, ""); + } else if (item.startsWith("odata.maxpagesize=")) { + maxPageSize = Number(item.replace("odata.maxpagesize=", "").replace(/"/g, "")) || 0; + } else if (item.includes("odata.track-changes")) { + trackChanges = true; + } else if (item.includes("odata.continue-on-error")) { + continueOnError = true; + } } - if (continueOnError) { - ErrorHelper.boolParameterCheck(continueOnError, `DynamicsWebApi.${request.functionName}`, "request.continueOnError"); - prefer.push("odata.continue-on-error"); + } + prefer = []; + if (config) { + if (returnRepresentation == null) { + returnRepresentation = config.returnRepresentation; } - return prefer.join(","); + includeAnnotations = includeAnnotations ? includeAnnotations : config.includeAnnotations; + maxPageSize = maxPageSize ? maxPageSize : config.maxPageSize; } - static convertToBatch(requests, config, batchRequest) { - const batchBoundary = `dwa_batch_${Utility.generateUUID()}`; - const batchBody = []; - let currentChangeSet = null; - let contentId = 1e5; - requests.forEach((internalRequest) => { - var _a2; - internalRequest.functionName = "executeBatch"; - if ((batchRequest == null ? void 0 : batchRequest.inChangeSet) === false) - internalRequest.inChangeSet = false; - const inChangeSet = internalRequest.method === "GET" ? false : !!internalRequest.inChangeSet; - if (!inChangeSet && currentChangeSet) { - batchBody.push(` + if (returnRepresentation) { + ErrorHelper.boolParameterCheck(returnRepresentation, `DynamicsWebApi.${request.functionName}`, "request.returnRepresentation"); + prefer.push("return=representation"); + } + if (includeAnnotations) { + ErrorHelper.stringParameterCheck(includeAnnotations, `DynamicsWebApi.${request.functionName}`, "request.includeAnnotations"); + prefer.push(`odata.include-annotations="${includeAnnotations}"`); + } + if (maxPageSize && maxPageSize > 0) { + ErrorHelper.numberParameterCheck(maxPageSize, `DynamicsWebApi.${request.functionName}`, "request.maxPageSize"); + prefer.push("odata.maxpagesize=" + maxPageSize); + } + if (trackChanges) { + ErrorHelper.boolParameterCheck(trackChanges, `DynamicsWebApi.${request.functionName}`, "request.trackChanges"); + prefer.push("odata.track-changes"); + } + if (continueOnError) { + ErrorHelper.boolParameterCheck(continueOnError, `DynamicsWebApi.${request.functionName}`, "request.continueOnError"); + prefer.push("odata.continue-on-error"); + } + return prefer.join(","); +}; +var convertToBatch = (requests, config, batchRequest) => { + const batchBoundary = `dwa_batch_${Utility.generateUUID()}`; + const batchBody = []; + let currentChangeSet = null; + let contentId = 1e5; + requests.forEach((internalRequest) => { + var _a2; + internalRequest.functionName = "executeBatch"; + if ((batchRequest == null ? void 0 : batchRequest.inChangeSet) === false) + internalRequest.inChangeSet = false; + const inChangeSet = internalRequest.method === "GET" ? false : !!internalRequest.inChangeSet; + if (!inChangeSet && currentChangeSet) { + batchBody.push(` --${currentChangeSet}--`); - currentChangeSet = null; - contentId = 1e5; - } - if (!currentChangeSet) { - batchBody.push(` + currentChangeSet = null; + contentId = 1e5; + } + if (!currentChangeSet) { + batchBody.push(` --${batchBoundary}`); - if (inChangeSet) { - currentChangeSet = `changeset_${Utility.generateUUID()}`; - batchBody.push("Content-Type: multipart/mixed;boundary=" + currentChangeSet); - } - } if (inChangeSet) { - batchBody.push(` ---${currentChangeSet}`); + currentChangeSet = `changeset_${Utility.generateUUID()}`; + batchBody.push("Content-Type: multipart/mixed;boundary=" + currentChangeSet); } - batchBody.push("Content-Type: application/http"); - batchBody.push("Content-Transfer-Encoding: binary"); - if (inChangeSet) { - const contentIdValue = internalRequest.headers.hasOwnProperty("Content-ID") ? internalRequest.headers["Content-ID"] : ++contentId; - batchBody.push(`Content-ID: ${contentIdValue}`); - } - if (!((_a2 = internalRequest.path) == null ? void 0 : _a2.startsWith("$"))) { - batchBody.push(` + } + if (inChangeSet) { + batchBody.push(` +--${currentChangeSet}`); + } + batchBody.push("Content-Type: application/http"); + batchBody.push("Content-Transfer-Encoding: binary"); + if (inChangeSet) { + const contentIdValue = internalRequest.headers.hasOwnProperty("Content-ID") ? internalRequest.headers["Content-ID"] : ++contentId; + batchBody.push(`Content-ID: ${contentIdValue}`); + } + if (!((_a2 = internalRequest.path) == null ? void 0 : _a2.startsWith("$"))) { + batchBody.push(` ${internalRequest.method} ${config.dataApi.url}${internalRequest.path} HTTP/1.1`); - } else { - batchBody.push(` + } else { + batchBody.push(` ${internalRequest.method} ${internalRequest.path} HTTP/1.1`); - } - if (internalRequest.method === "GET") { - batchBody.push("Accept: application/json"); - } else { - batchBody.push("Content-Type: application/json"); - } - for (let key in internalRequest.headers) { - if (key === "Authorization" || key === "Content-ID") - continue; - batchBody.push(`${key}: ${internalRequest.headers[key]}`); - } - if (internalRequest.data) { - batchBody.push(` -${_RequestUtility.processData(internalRequest.data, config)}`); - } - }); - if (currentChangeSet) { + } + if (internalRequest.method === "GET") { + batchBody.push("Accept: application/json"); + } else { + batchBody.push("Content-Type: application/json"); + } + for (let key in internalRequest.headers) { + if (key === "Authorization" || key === "Content-ID") + continue; + batchBody.push(`${key}: ${internalRequest.headers[key]}`); + } + if (internalRequest.data) { batchBody.push(` ---${currentChangeSet}--`); +${processData(internalRequest.data, config)}`); } + }); + if (currentChangeSet) { batchBody.push(` +--${currentChangeSet}--`); + } + batchBody.push(` --${batchBoundary}--`); - const headers = _RequestUtility.setStandardHeaders(batchRequest == null ? void 0 : batchRequest.userHeaders); - headers["Content-Type"] = `multipart/mixed;boundary=${batchBoundary}`; - return { headers, body: batchBody.join("\n") }; - } - static findCollectionName(entityName) { - let collectionName = null; - if (!Utility.isNull(_RequestUtility.entityNames)) { - collectionName = _RequestUtility.entityNames[entityName]; - if (Utility.isNull(collectionName)) { - for (let key in _RequestUtility.entityNames) { - if (_RequestUtility.entityNames[key] === entityName) { - return entityName; - } + const headers = setStandardHeaders(batchRequest == null ? void 0 : batchRequest.userHeaders); + headers["Content-Type"] = `multipart/mixed;boundary=${batchBoundary}`; + return { headers, body: batchBody.join("\n") }; +}; +var findCollectionName = (entityName) => { + let collectionName = null; + if (!Utility.isNull(entityNames)) { + collectionName = entityNames[entityName]; + if (!collectionName) { + for (let key in entityNames) { + if (entityNames[key] === entityName) { + return entityName; } } } - return collectionName; } - static processData(data, config) { - let stringifiedData = null; - if (data) { - if (data instanceof Uint8Array || data instanceof Uint16Array || data instanceof Uint32Array) - return data; - stringifiedData = JSON.stringify(data, (key, value) => { - if (key.endsWith("@odata.bind") || key.endsWith("@odata.id")) { - if (typeof value === "string" && !value.startsWith("$")) { - if (/\(\{[\w\d-]+\}\)/g.test(value)) { - value = value.replace(/(.+)\(\{([\w\d-]+)\}\)/g, "$1($2)"); - } - if (config.useEntityNames) { - const regularExpression = /([\w_]+)(\([\d\w-]+\))$/; - const valueParts = regularExpression.exec(value); - if (valueParts && valueParts.length > 2) { - const collectionName = _RequestUtility.findCollectionName(valueParts[1]); - if (!Utility.isNull(collectionName)) { - value = value.replace(regularExpression, collectionName + "$2"); - } + return collectionName; +}; +var processData = (data, config) => { + let stringifiedData = null; + if (data) { + if (data instanceof Uint8Array || data instanceof Uint16Array || data instanceof Uint32Array) + return data; + stringifiedData = JSON.stringify(data, (key, value) => { + if (key.endsWith("@odata.bind") || key.endsWith("@odata.id")) { + if (typeof value === "string" && !value.startsWith("$")) { + if (/\(\{[\w\d-]+\}\)/g.test(value)) { + value = value.replace(/(.+)\(\{([\w\d-]+)\}\)/g, "$1($2)"); + } + if (config.useEntityNames) { + const regularExpression = /([\w_]+)(\([\d\w-]+\))$/; + const valueParts = regularExpression.exec(value); + if (valueParts && valueParts.length > 2) { + const collectionName = findCollectionName(valueParts[1]); + if (!Utility.isNull(collectionName)) { + value = value.replace(regularExpression, collectionName + "$2"); } } - if (!value.startsWith(config.dataApi.url)) { - if (key.endsWith("@odata.bind")) { - if (!value.startsWith("/")) { - value = "/" + value; - } - } else { - value = config.dataApi.url + value.replace(/^\//, ""); + } + if (!value.startsWith(config.dataApi.url)) { + if (key.endsWith("@odata.bind")) { + if (!value.startsWith("/")) { + value = "/" + value; } + } else { + value = config.dataApi.url + value.replace(/^\//, ""); } } - } else if (key.startsWith("oData") || key.endsWith("_Formatted") || key.endsWith("_NavigationProperty") || key.endsWith("_LogicalName")) { - value = void 0; } - return value; - }); - stringifiedData = stringifiedData.replace(/[\u007F-\uFFFF]/g, function(chr) { - return "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).slice(-4); - }); - } - return stringifiedData; - } - static setStandardHeaders(headers = {}) { - if (!headers["Accept"]) - headers["Accept"] = "application/json"; - if (!headers["OData-MaxVersion"]) - headers["OData-MaxVersion"] = "4.0"; - if (!headers["OData-Version"]) - headers["OData-Version"] = "4.0"; - if (headers["Content-Range"]) - headers["Content-Type"] = "application/octet-stream"; - else if (!headers["Content-Type"]) - headers["Content-Type"] = "application/json; charset=utf-8"; - return headers; + } else if (key.startsWith("oData") || key.endsWith("_Formatted") || key.endsWith("_NavigationProperty") || key.endsWith("_LogicalName")) { + value = void 0; + } + return value; + }); + stringifiedData = stringifiedData.replace(/[\u007F-\uFFFF]/g, function(chr) { + return "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).slice(-4); + }); } + return stringifiedData; +}; +var setStandardHeaders = (headers = {}) => { + if (!headers["Accept"]) + headers["Accept"] = "application/json"; + if (!headers["OData-MaxVersion"]) + headers["OData-MaxVersion"] = "4.0"; + if (!headers["OData-Version"]) + headers["OData-Version"] = "4.0"; + if (headers["Content-Range"]) + headers["Content-Type"] = "application/octet-stream"; + else if (!headers["Content-Type"]) + headers["Content-Type"] = "application/json; charset=utf-8"; + return headers; }; -_RequestUtility.entityNames = null; -var RequestUtility = _RequestUtility; // src/client/RequestClient.ts init_ErrorHelper(); @@ -1467,7 +1434,55 @@ var _runRequest = async (request, config) => { }; var _batchRequestCollection = {}; var _responseParseParams = {}; -var RequestClient = class _RequestClient { +var _nameExceptions = [ + "$metadata", + "EntityDefinitions", + "RelationshipDefinitions", + "GlobalOptionSetDefinitions", + "ManagedPropertyDefinitions", + "query", + "suggest", + "autocomplete" +]; +var _isEntityNameException = (entityName) => { + return _nameExceptions.indexOf(entityName) > -1; +}; +var _getCollectionNames = async (entityName, config) => { + if (!Utility.isNull(entityNames)) { + return findCollectionName(entityName) || entityName; + } + const request = compose( + { + method: "GET", + collection: "EntityDefinitions", + select: ["EntitySetName", "LogicalName"], + noCache: true, + functionName: "retrieveMultiple" + }, + config + ); + const result = await _runRequest(request, config); + setEntityNames({}); + for (let i = 0; i < result.data.value.length; i++) { + entityNames[result.data.value[i].LogicalName] = result.data.value[i].EntitySetName; + } + return findCollectionName(entityName) || entityName; +}; +var _checkCollectionName = async (entityName, config) => { + if (!entityName || _isEntityNameException(entityName)) { + return entityName; + } + entityName = entityName.toLowerCase(); + if (!config.useEntityNames) { + return entityName; + } + try { + return await _getCollectionNames(entityName, config); + } catch (error) { + throw new Error("Unable to fetch Collection Names. Error: " + error.message); + } +}; +var RequestClient = class { /** * Sends a request to given URL with given parameters * @@ -1486,14 +1501,14 @@ var RequestClient = class _RequestClient { const batchRequest = _batchRequestCollection[request.requestId]; if (!batchRequest) throw ErrorHelper.batchIsEmpty(); - const batchResult = RequestUtility.convertToBatch(batchRequest, config, request); + const batchResult = convertToBatch(batchRequest, config, request); processedData = batchResult.body; request.headers = { ...batchResult.headers, ...request.headers }; delete _batchRequestCollection[request.requestId]; } else { - processedData = !isBatchConverted ? RequestUtility.processData(request.data, config) : request.data; + processedData = !isBatchConverted ? processData(request.data, config) : request.data; if (!isBatchConverted) - request.headers = RequestUtility.setStandardHeaders(request.headers); + request.headers = setStandardHeaders(request.headers); } if (config.impersonate && !request.headers["MSCRMCallerID"]) { request.headers["MSCRMCallerID"] = config.impersonate; @@ -1518,74 +1533,29 @@ var RequestClient = class _RequestClient { method: request.method, uri: url.toString() + request.path, data: processedData, - additionalHeaders: request.headers, - responseParams: _responseParseParams, - isAsync: request.async, - timeout: request.timeout || config.timeout, proxy: config.proxy, + isAsync: request.async, + headers: request.headers, requestId: request.requestId, - abortSignal: request.signal + abortSignal: request.signal, + responseParams: _responseParseParams, + timeout: request.timeout || config.timeout }); } - static async _getCollectionNames(entityName, config) { - if (!Utility.isNull(RequestUtility.entityNames)) { - return RequestUtility.findCollectionName(entityName) || entityName; - } - const request = RequestUtility.compose( - { - method: "GET", - collection: "EntityDefinitions", - select: ["EntitySetName", "LogicalName"], - noCache: true, - functionName: "retrieveMultiple" - }, - config - ); - const result = await _runRequest(request, config); - RequestUtility.entityNames = {}; - for (let i = 0; i < result.data.value.length; i++) { - RequestUtility.entityNames[result.data.value[i].LogicalName] = result.data.value[i].EntitySetName; - } - return RequestUtility.findCollectionName(entityName) || entityName; - } - static _isEntityNameException(entityName) { - const exceptions = [ - "$metadata", - "EntityDefinitions", - "RelationshipDefinitions", - "GlobalOptionSetDefinitions", - "ManagedPropertyDefinitions", - "query", - "suggest", - "autocomplete" - ]; - return exceptions.indexOf(entityName) > -1; - } - static async _checkCollectionName(entityName, config) { - if (!entityName || _RequestClient._isEntityNameException(entityName)) { - return entityName; - } - entityName = entityName.toLowerCase(); - if (!config.useEntityNames) { - return entityName; - } - try { - return await _RequestClient._getCollectionNames(entityName, config); - } catch (error) { - throw new Error("Unable to fetch Collection Names. Error: " + error.message); - } - } static async makeRequest(request, config) { request.responseParameters = request.responseParameters || {}; request.userHeaders = request.headers; delete request.headers; if (!request.isBatch) { - const collectionName = await _RequestClient._checkCollectionName(request.collection, config); + const collectionName = await _checkCollectionName(request.collection, config); request.collection = collectionName; - RequestUtility.compose(request, config); + compose(request, config); request.responseParameters.convertedToBatch = false; if (request.path.length > 2e3) { - const batchRequest = RequestUtility.convertToBatch([request], config); + const batchRequest = convertToBatch([request], config); + if (request.headers["Authorization"]) { + batchRequest.headers["Authorization"] = request.headers["Authorization"]; + } request.method = "POST"; request.path = "$batch"; request.data = batchRequest.body; @@ -1594,17 +1564,17 @@ var RequestClient = class _RequestClient { } return _runRequest(request, config); } - RequestUtility.compose(request, config); + compose(request, config); _addResponseParams(request.requestId, request.responseParameters); _addRequestToBatchCollection(request.requestId, request); } static _clearTestData() { - RequestUtility.entityNames = null; + setEntityNames(null); _responseParseParams = {}; _batchRequestCollection = {}; } static getCollectionName(entityName) { - return RequestUtility.findCollectionName(entityName); + return findCollectionName(entityName); } }; @@ -2078,7 +2048,7 @@ var DynamicsWebApi = class _DynamicsWebApi { ErrorHelper.stringParameterCheck(functionName, `DynamicsWebApi.callFunction`, parameterName); const functionParameters = Utility.buildFunctionParameters(internalRequest.parameters); internalRequest.method = "GET"; - internalRequest._additionalUrl = functionName + functionParameters.key; + internalRequest.addPath = functionName + functionParameters.key; internalRequest.queryParams = functionParameters.queryParams; internalRequest._isUnboundRequest = !internalRequest.collection; internalRequest.functionName = "callFunction"; @@ -2097,7 +2067,7 @@ var DynamicsWebApi = class _DynamicsWebApi { const internalRequest = Utility.copyRequest(request, ["action"]); internalRequest.method = "POST"; internalRequest.functionName = "callAction"; - internalRequest._additionalUrl = request.actionName; + internalRequest.addPath = request.actionName; internalRequest._isUnboundRequest = !internalRequest.collection; internalRequest.data = request.action; const response = await this._makeRequest(internalRequest); diff --git a/dist/cjs/dynamics-web-api.js.map b/dist/cjs/dynamics-web-api.js.map index d408559..201e1a0 100644 --- a/dist/cjs/dynamics-web-api.js.map +++ b/dist/cjs/dynamics-web-api.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../src/helpers/crypto/node.ts", "../../src/helpers/Crypto.ts", "../../src/helpers/Regex.ts", "../../src/utils/Utility.ts", "../../src/helpers/ErrorHelper.ts", "../../src/dwa.ts", "../../src/client/helpers/dateReviver.ts", "../../src/client/helpers/parseResponse.ts", "../../src/client/http.ts", "../../src/dynamics-web-api.ts", "../../src/utils/Config.ts", "../../src/client/RequestClient.ts", "../../src/utils/Request.ts", "../../src/client/helpers/executeRequest.ts"], - "sourcesContent": ["//had to move getCrypto for node to a different local module,\r\n//because esbuild does not support external require in esm format\r\nimport nCrypto from \"node:crypto\";\r\n\r\nexport function getCrypto () {\r\n return nCrypto;\r\n}", "export function getCrypto(): T {\r\n return global.DWA_BROWSER ? global.window.crypto : require(\"./crypto/node\").getCrypto();\r\n}\r\n\r\nexport function generateRandomBytes() {\r\n return global.DWA_BROWSER ? getCrypto().getRandomValues(new Uint8Array(1)) : getCrypto().randomBytes(1);\r\n}\r\n", "const uuid = \"[0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12}\";\r\n\r\nexport function isUuid(value: string): boolean {\r\n const match = new RegExp(uuid, \"i\").exec(value);\r\n return !!match;\r\n}\r\n\r\nexport function extractUuid(value: string): string | null {\r\n const match = new RegExp(\"^{?(\" + uuid + \")}?$\", \"i\").exec(value);\r\n return match ? match[1] : null;\r\n}\r\n\r\nexport function extractUuidFromUrl(url: string): string | null {\r\n const match = new RegExp(\"(\" + uuid + \")\\\\)$\", \"i\").exec(url);\r\n return match ? match[1] : null;\r\n}\r\n", "\uFEFFimport { Core } from \"../types\";\r\nimport { generateRandomBytes } from \"../helpers/Crypto\";\r\nimport { isUuid, extractUuid } from \"../helpers/Regex\";\r\n\r\ndeclare var GetGlobalContext: any;\r\ndeclare var Xrm: any;\r\n\r\n// function isNodeEnv(): boolean {\r\n// // tslint:disable:strict-type-predicates\r\n// return Object.prototype.toString.call(typeof process !== \"undefined\" ? process : 0) === \"[object process]\";\r\n// }\r\n\r\n// function getGlobalObject(): T {\r\n// return (isNodeEnv() ? global : typeof window !== \"undefined\" ? window : typeof self !== \"undefined\" ? self : {}) as T;\r\n// }\r\n\r\nconst downloadChunkSize = 4194304;\r\n\r\nexport class Utility {\r\n /**\r\n * Builds parametes for a funciton. Returns '()' (if no parameters) or '([params])?[query]'\r\n *\r\n * @param {Object} [parameters] - Function's input parameters. Example: { param1: \"test\", param2: 3 }.\r\n * @returns {string}\r\n */\r\n static buildFunctionParameters(parameters?: any): Core.FunctionParameters {\r\n if (parameters) {\r\n const parameterNames = Object.keys(parameters);\r\n const functionParams: string[] = [];\r\n const urlQuery: string[] = [];\r\n\r\n for (let i = 1; i <= parameterNames.length; i++) {\r\n const parameterName = parameterNames[i - 1];\r\n let value = parameters[parameterName];\r\n\r\n if (value == null) continue;\r\n\r\n if (typeof value === \"string\" && !value.startsWith(\"Microsoft.Dynamics.CRM\") && !isUuid(value)) {\r\n value = `'${value}'`;\r\n } else if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n\r\n functionParams.push(`${parameterName}=@p${i}`);\r\n urlQuery.push(`@p${i}=${extractUuid(value) || value}`);\r\n }\r\n\r\n return {\r\n key: `(${functionParams.join(\",\")})`,\r\n queryParams: urlQuery,\r\n };\r\n } else {\r\n return {\r\n key: \"()\",\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Parses a paging cookie returned in response\r\n *\r\n * @param {string} pageCookies - Page cookies returned in @Microsoft.Dynamics.CRM.fetchxmlpagingcookie.\r\n * @param {number} currentPageNumber - A current page number. Fix empty paging-cookie for complex fetch xmls.\r\n * @returns {{cookie: \"\", number: 0, next: 1}}\r\n */\r\n static getFetchXmlPagingCookie(pageCookies: string = \"\", currentPageNumber: number = 1): Core.FetchXmlCookie {\r\n //get the page cokies\r\n pageCookies = decodeURIComponent(decodeURIComponent(pageCookies));\r\n\r\n const info = /pagingcookie=\"()/.exec(pageCookies);\r\n\r\n if (info != null) {\r\n let page = parseInt(info[2]);\r\n return {\r\n cookie: info[1]\r\n .replace(//g, \">\")\r\n .replace(/\\\"/g, \"'\")\r\n .replace(/\\'/g, \"&\" + \"quot;\"),\r\n page: page,\r\n nextPage: page + 1,\r\n };\r\n } else {\r\n //http://stackoverflow.com/questions/41262772/execution-of-fetch-xml-using-web-api-dynamics-365 workaround\r\n return {\r\n cookie: \"\",\r\n page: currentPageNumber,\r\n nextPage: currentPageNumber + 1,\r\n };\r\n }\r\n }\r\n\r\n // static isNodeEnv = isNodeEnv;\r\n\r\n static downloadChunkSize = downloadChunkSize;\r\n\r\n /**\r\n * Converts a response to a reference object\r\n *\r\n * @param {Object} responseData - Response object\r\n * @returns {ReferenceObject}\r\n */\r\n static convertToReferenceObject(responseData: any): Core.ReferenceObject {\r\n const result = /\\/(\\w+)\\(([0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12})/i.exec(responseData[\"@odata.id\"]);\r\n return { id: result![2], collection: result![1], oDataContext: responseData[\"@odata.context\"] };\r\n }\r\n\r\n /**\r\n * Checks whether the value is JS Null.\r\n * @param {Object} value\r\n * @returns {boolean}\r\n */\r\n static isNull(value: any): boolean {\r\n return typeof value === \"undefined\" || value == null;\r\n }\r\n\r\n /** Generates UUID */\r\n static generateUUID(): string {\r\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) => (c ^ (generateRandomBytes()[0] & (15 >> (c / 4)))).toString(16));\r\n }\r\n\r\n static getXrmContext(): any {\r\n if (typeof GetGlobalContext !== \"undefined\") {\r\n return GetGlobalContext();\r\n } else {\r\n if (typeof Xrm !== \"undefined\") {\r\n //d365 v.9.0\r\n if (!Utility.isNull(Xrm.Utility) && !Utility.isNull(Xrm.Utility.getGlobalContext)) {\r\n return Xrm.Utility.getGlobalContext();\r\n } else if (!Utility.isNull(Xrm.Page) && !Utility.isNull(Xrm.Page.context)) {\r\n return Xrm.Page.context;\r\n }\r\n }\r\n }\r\n\r\n throw new Error(\r\n \"Xrm Context is not available. In most cases, it can be resolved by adding a reference to a ClientGlobalContext.js.aspx. Please refer to MSDN documentation for more details.\"\r\n );\r\n }\r\n\r\n // static getXrmUtility(): any {\r\n // return typeof Xrm !== \"undefined\" ? Xrm.Utility : null;\r\n // }\r\n\r\n static getClientUrl(): string {\r\n const context = Utility.getXrmContext();\r\n\r\n let clientUrl = context.getClientUrl();\r\n\r\n if (clientUrl.match(/\\/$/)) {\r\n clientUrl = clientUrl.substring(0, clientUrl.length - 1);\r\n }\r\n return clientUrl;\r\n }\r\n\r\n /**\r\n * Checks whether the app is currently running in a Dynamics Portals Environment.\r\n *\r\n * In that case we switch to the Web API for Dynamics Portals.\r\n * @returns {boolean}\r\n */\r\n static isRunningWithinPortals(): boolean {\r\n return global.DWA_BROWSER ? !!global.window.shell : false;\r\n }\r\n\r\n static isObject(obj: any): boolean {\r\n return typeof obj === \"object\" && !!obj && !Array.isArray(obj) && Object.prototype.toString.call(obj) !== \"[object Date]\";\r\n }\r\n\r\n static copyObject(src: any, excludeProps?: string[]): T {\r\n let target = {};\r\n for (let prop in src) {\r\n if (src.hasOwnProperty(prop) && !excludeProps?.includes(prop)) {\r\n // if the value is a nested object, recursively copy all its properties\r\n if (Utility.isObject(src[prop])) {\r\n target[prop] = Utility.copyObject(src[prop]);\r\n } else if (Array.isArray(src[prop])) {\r\n target[prop] = src[prop].slice();\r\n } else {\r\n target[prop] = src[prop];\r\n }\r\n }\r\n }\r\n return target;\r\n }\r\n\r\n static copyRequest(src: any, excludeProps: string[] = []): Core.InternalRequest {\r\n //todo: do we need to include \"data\" in here?\r\n if (!excludeProps.includes(\"signal\")) excludeProps.push(\"signal\");\r\n\r\n const result = Utility.copyObject(src, excludeProps);\r\n result.signal = src.signal;\r\n\r\n return result;\r\n }\r\n\r\n static setFileChunk(request: Core.InternalRequest, fileBuffer: Uint8Array | Buffer, chunkSize: number, offset: number): void {\r\n offset = offset || 0;\r\n\r\n const count = offset + chunkSize > fileBuffer.length ? fileBuffer.length % chunkSize : chunkSize;\r\n\r\n let content: any;\r\n\r\n if (global.DWA_BROWSER) {\r\n content = new Uint8Array(count);\r\n for (let i = 0; i < count; i++) {\r\n content[i] = fileBuffer[offset + i];\r\n }\r\n } else {\r\n content = fileBuffer.slice(offset, offset + count);\r\n }\r\n\r\n request.data = content;\r\n request.contentRange = \"bytes \" + offset + \"-\" + (offset + count - 1) + \"/\" + fileBuffer.length;\r\n }\r\n\r\n static convertToFileBuffer(binaryString: string): Uint8Array | Buffer {\r\n if (!global.DWA_BROWSER) return Buffer.from(binaryString, \"binary\");\r\n\r\n const bytes = new Uint8Array(binaryString.length);\r\n for (var i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n return bytes;\r\n }\r\n}\r\n", "\uFEFFimport { AccessToken } from \"../dynamics-web-api\";\r\nimport { extractUuid } from \"./Regex\";\r\n\r\nexport interface DynamicsWebApiError extends Error {\r\n status: number;\r\n}\r\n\r\nfunction throwParameterError(functionName: string, parameterName: string, type: string | null | undefined): void {\r\n throw new Error(\r\n type ? `${functionName} requires a ${parameterName} parameter to be of type ${type}.` : `${functionName} requires a ${parameterName} parameter.`\r\n );\r\n}\r\n\r\nexport class ErrorHelper {\r\n static handleErrorResponse(req): void {\r\n throw new Error(`Error: ${req.status}: ${req.message}`);\r\n }\r\n\r\n static parameterCheck(parameter: any, functionName: string, parameterName: string, type?: string): void {\r\n if (typeof parameter === \"undefined\" || parameter === null || parameter === \"\") {\r\n throwParameterError(functionName, parameterName, type);\r\n }\r\n }\r\n\r\n static stringParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter !== \"string\") {\r\n throwParameterError(functionName, parameterName, \"String\");\r\n }\r\n }\r\n\r\n static maxLengthStringParameterCheck(parameter: string | null, functionName: string, parameterName: string, maxLength: number): void {\r\n if (!parameter) return;\r\n\r\n if (parameter.length > maxLength) {\r\n throw new Error(`${parameterName} has a ${maxLength} character limit.`);\r\n }\r\n }\r\n\r\n static arrayParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (parameter.constructor !== Array) {\r\n throwParameterError(functionName, parameterName, \"Array\");\r\n }\r\n }\r\n\r\n static stringOrArrayParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (parameter.constructor !== Array && typeof parameter !== \"string\") {\r\n throwParameterError(functionName, parameterName, \"String or Array\");\r\n }\r\n }\r\n\r\n static numberParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter != \"number\") {\r\n if (typeof parameter === \"string\" && parameter) {\r\n if (!isNaN(parseInt(parameter))) {\r\n return;\r\n }\r\n }\r\n throwParameterError(functionName, parameterName, \"Number\");\r\n }\r\n }\r\n\r\n static batchIsEmpty(): Error[] {\r\n return [\r\n new Error(\r\n \"Payload of the batch operation is empty. Please make that you have other operations in between startBatch() and executeBatch() to successfuly build a batch payload.\"\r\n ),\r\n ];\r\n }\r\n\r\n static handleHttpError(parsedError: any, parameters?: any): DynamicsWebApiError {\r\n const error = new Error();\r\n\r\n Object.keys(parsedError).forEach((k) => {\r\n error[k] = parsedError[k];\r\n });\r\n\r\n if (parameters) {\r\n Object.keys(parameters).forEach((k) => {\r\n error[k] = parameters[k];\r\n });\r\n }\r\n\r\n return error;\r\n }\r\n\r\n static boolParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter != \"boolean\") {\r\n throwParameterError(functionName, parameterName, \"Boolean\");\r\n }\r\n }\r\n\r\n /**\r\n * Private function used to check whether required parameter is a valid GUID\r\n * @param parameter The GUID parameter to check\r\n * @param functionName\r\n * @param parameterName\r\n * @returns\r\n */\r\n static guidParameterCheck(parameter: any, functionName: string, parameterName: string): string {\r\n const match = extractUuid(parameter);\r\n if (!match) throwParameterError(functionName, parameterName, \"GUID String\");\r\n\r\n return match!;\r\n }\r\n\r\n static keyParameterCheck(parameter: any, functionName: string, parameterName: string): string | undefined {\r\n try {\r\n ErrorHelper.stringParameterCheck(parameter, functionName, parameterName);\r\n\r\n //check if the param is a guid\r\n const match = extractUuid(parameter);\r\n if (match) return match;\r\n\r\n //check the alternate key\r\n const alternateKeys = parameter.split(\",\");\r\n\r\n if (alternateKeys.length) {\r\n for (let i = 0; i < alternateKeys.length; i++) {\r\n alternateKeys[i] = alternateKeys[i].trim().replace(/\"/g, \"'\");\r\n /^[\\w\\d\\_]+\\=(.+)$/i.exec(alternateKeys[i])![0];\r\n }\r\n }\r\n\r\n return alternateKeys.join(\",\");\r\n } catch (error) {\r\n throwParameterError(functionName, parameterName, \"String representing GUID or Alternate Key\");\r\n }\r\n }\r\n\r\n static callbackParameterCheck(callbackParameter: () => Promise, functionName: string, parameterName: string): void {\r\n if (typeof callbackParameter != \"function\") {\r\n throwParameterError(functionName, parameterName, \"Function\");\r\n }\r\n }\r\n\r\n static throwBatchIncompatible(functionName: string, isBatch: boolean): void {\r\n if (isBatch) {\r\n isBatch = false;\r\n throw new Error(functionName + \" cannot be used in a BATCH request.\");\r\n }\r\n }\r\n\r\n static throwBatchNotStarted(isBatch: boolean): void {\r\n if (!isBatch) {\r\n throw new Error(\r\n \"Batch operation has not been started. Please call a DynamicsWebApi.startBatch() function prior to calling DynamicsWebApi.executeBatch() to perform a batch request correctly.\"\r\n );\r\n }\r\n }\r\n}\r\n", "class DWA {\r\n\tstatic Prefer = class {\r\n\t\tstatic ReturnRepresentation: string = \"return=representation\";\r\n\t\tstatic Annotations = class {\r\n\t\t\tstatic AssociatedNavigationProperty: string = \"Microsoft.Dynamics.CRM.associatednavigationproperty\";\r\n\t\t\tstatic LookupLogicalName: string = \"Microsoft.Dynamics.CRM.lookuplogicalname\";\r\n\t\t\tstatic All: string = \"*\";\r\n\t\t\tstatic FormattedValue: string = \"OData.Community.Display.V1.FormattedValue\";\r\n\t\t\tstatic FetchXmlPagingCookie: string = \"Microsoft.Dynamics.CRM.fetchxmlpagingcookie\";\r\n\t\t};\r\n\t\tstatic IncludeAnnotations: string = \"odata.include-annotations\";\r\n\t\tstatic get(annotation: string) {\r\n\t\t\treturn `${DWA.Prefer.IncludeAnnotations}=\"${annotation}\"`;\r\n\t\t}\r\n\t};\r\n}\r\n\r\nexport { DWA };\r\n", "\uFEFFexport function dateReviver(key: string, value: any): Date {\r\n\tif (typeof value === \"string\") {\r\n\t\tconst a = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:Z|[-+]\\d{2}:\\d{2})$/.exec(value);\r\n\t\tif (a) {\r\n\t\t\treturn new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));\r\n\t\t}\r\n\t}\r\n\treturn value;\r\n}\r\n", "\uFEFFimport { DWA } from \"../../dwa\";\r\nimport { Utility } from \"../../utils/Utility\";\r\nimport { ErrorHelper, DynamicsWebApiError } from \"../../helpers/ErrorHelper\";\r\nimport { dateReviver } from \"./dateReviver\";\r\nimport { Core } from \"../../types\";\r\nimport { extractUuidFromUrl } from \"../../helpers/Regex\";\r\n\r\nfunction getFormattedKeyValue(keyName: string, value: any): any[] {\r\n let newKey: string | null = null;\r\n if (keyName.indexOf(\"@\") !== -1) {\r\n const format = keyName.split(\"@\");\r\n switch (format[1]) {\r\n case \"odata.context\":\r\n newKey = \"oDataContext\";\r\n break;\r\n case \"odata.count\":\r\n newKey = \"oDataCount\";\r\n value = value != null ? parseInt(value) : 0;\r\n break;\r\n case \"odata.nextLink\":\r\n newKey = \"oDataNextLink\";\r\n break;\r\n case \"odata.deltaLink\":\r\n newKey = \"oDataDeltaLink\";\r\n break;\r\n case DWA.Prefer.Annotations.FormattedValue:\r\n newKey = format[0] + \"_Formatted\";\r\n break;\r\n case DWA.Prefer.Annotations.AssociatedNavigationProperty:\r\n newKey = format[0] + \"_NavigationProperty\";\r\n break;\r\n case DWA.Prefer.Annotations.LookupLogicalName:\r\n newKey = format[0] + \"_LogicalName\";\r\n break;\r\n }\r\n }\r\n\r\n return [newKey, value];\r\n}\r\n\r\n/**\r\n *\r\n * @param {any} object - parsed JSON object\r\n * @param {any} parseParams - parameters for parsing the response\r\n * @returns {any} parsed batch response\r\n */\r\nfunction parseData(object: any, parseParams?: any): any {\r\n if (parseParams) {\r\n if (parseParams.isRef && object[\"@odata.id\"] != null) {\r\n return Utility.convertToReferenceObject(object);\r\n }\r\n\r\n if (parseParams.toCount) {\r\n return getFormattedKeyValue(\"@odata.count\", object[\"@odata.count\"])[1] || 0;\r\n }\r\n }\r\n\r\n const keys = Object.keys(object);\r\n\r\n for (let i = 0; i < keys.length; i++) {\r\n const currentKey = keys[i];\r\n\r\n if (object[currentKey] != null) {\r\n if (object[currentKey].constructor === Array) {\r\n for (var j = 0; j < object[currentKey].length; j++) {\r\n object[currentKey][j] = parseData(object[currentKey][j]);\r\n }\r\n } else if (typeof object[currentKey] === \"object\") {\r\n parseData(object[currentKey]);\r\n }\r\n }\r\n\r\n //parse formatted values\r\n let formattedKeyValue = getFormattedKeyValue(currentKey, object[currentKey]);\r\n if (formattedKeyValue[0]) {\r\n object[formattedKeyValue[0]] = formattedKeyValue[1];\r\n }\r\n\r\n //parse aliased values\r\n if (currentKey.indexOf(\"_x002e_\") !== -1) {\r\n const aliasKeys = currentKey.split(\"_x002e_\");\r\n\r\n if (!object.hasOwnProperty(aliasKeys[0])) {\r\n object[aliasKeys[0]] = { _dwaType: \"alias\" };\r\n }\r\n //throw an error if there is already a property which is not an 'alias'\r\n else if (\r\n typeof object[aliasKeys[0]] !== \"object\" ||\r\n (typeof object[aliasKeys[0]] === \"object\" && !object[aliasKeys[0]].hasOwnProperty(\"_dwaType\"))\r\n ) {\r\n throw new Error(\"The alias name of the linked entity must be unique!\");\r\n }\r\n\r\n object[aliasKeys[0]][aliasKeys[1]] = object[currentKey];\r\n\r\n //aliases also contain formatted values\r\n formattedKeyValue = getFormattedKeyValue(aliasKeys[1], object[currentKey]);\r\n if (formattedKeyValue[0]) {\r\n object[aliasKeys[0]][formattedKeyValue[0]] = formattedKeyValue[1];\r\n }\r\n }\r\n }\r\n\r\n if (parseParams) {\r\n if (parseParams.hasOwnProperty(\"pageNumber\") && object[\"@\" + DWA.Prefer.Annotations.FetchXmlPagingCookie] != null) {\r\n object.PagingInfo = Utility.getFetchXmlPagingCookie(object[\"@\" + DWA.Prefer.Annotations.FetchXmlPagingCookie], parseParams.pageNumber);\r\n }\r\n }\r\n\r\n return object;\r\n}\r\n\r\nconst responseHeaderRegex = /^([^()<>@,;:\\\\\"\\/[\\]?={} \\t]+)\\s?:\\s?(.*)/;\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction parseBatchHeaders(text: string): any {\r\n const ctx = { position: 0 };\r\n const headers = {};\r\n let parts;\r\n let line;\r\n let pos;\r\n\r\n do {\r\n pos = ctx.position;\r\n line = readLine(text, ctx);\r\n parts = responseHeaderRegex.exec(line);\r\n if (parts !== null) {\r\n headers[parts[1].toLowerCase()] = parts[2];\r\n } else {\r\n // Whatever was found is not a header, so reset the context position.\r\n ctx.position = pos;\r\n }\r\n } while (line && parts);\r\n\r\n return headers;\r\n}\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction readLine(text: string, ctx: { position: number }): string | null {\r\n return readTo(text, ctx, \"\\r\\n\");\r\n}\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction readTo(text: string, ctx: { position: number }, str: string): string | null {\r\n const start = ctx.position || 0;\r\n let end = text.length;\r\n if (str) {\r\n end = text.indexOf(str, start);\r\n if (end === -1) {\r\n return null;\r\n }\r\n ctx.position = end + str.length;\r\n } else {\r\n ctx.position = end;\r\n }\r\n\r\n return text.substring(start, end);\r\n}\r\n\r\n//partially taken from https://github.com/emiltholin/google-api-batch-utils\r\n/**\r\n *\r\n * @param {string} response - response that needs to be parsed\r\n * @param {Array} parseParams - parameters for parsing the response\r\n * @param {Number} [requestNumber] - number of the request\r\n * @returns {any} parsed batch response\r\n */\r\nfunction parseBatchResponse(response: string, parseParams: any, requestNumber: number = 0): (string | undefined | DynamicsWebApiError | Number)[] {\r\n // Not the same delimiter in the response as we specify ourselves in the request,\r\n // so we have to extract it.\r\n const delimiter = response.substr(0, response.indexOf(\"\\r\\n\"));\r\n const batchResponseParts = response.split(delimiter);\r\n // The first part will always be an empty string. Just remove it.\r\n batchResponseParts.shift();\r\n // The last part will be the \"--\". Just remove it.\r\n batchResponseParts.pop();\r\n\r\n let result: (string | undefined | DynamicsWebApiError | Number)[] = [];\r\n for (let i = 0; i < batchResponseParts.length; i++) {\r\n let batchResponse = batchResponseParts[i];\r\n if (batchResponse.indexOf(\"--changesetresponse_\") > -1) {\r\n batchResponse = batchResponse.trim();\r\n const batchToProcess = batchResponse.substring(batchResponse.indexOf(\"\\r\\n\") + 1).trim();\r\n\r\n result = result.concat(parseBatchResponse(batchToProcess, parseParams, requestNumber));\r\n } else {\r\n //check http status\r\n const httpStatusReg = /HTTP\\/?\\s*[\\d.]*\\s+(\\d{3})\\s+([\\w\\s]*)$/gm.exec(batchResponse);\r\n //todo: add error handler for httpStatus and httpStatusMessage; remove \"!\" operator\r\n const httpStatus = parseInt(httpStatusReg![1]);\r\n const httpStatusMessage = httpStatusReg![2].trim();\r\n\r\n const responseData = batchResponse.substring(batchResponse.indexOf(\"{\"), batchResponse.lastIndexOf(\"}\") + 1);\r\n\r\n if (!responseData) {\r\n if (/Content-Type: text\\/plain/i.test(batchResponse)) {\r\n const plainContentReg = /\\w+$/gi.exec(batchResponse.trim());\r\n const plainContent = plainContentReg && plainContentReg.length ? plainContentReg[0] : undefined;\r\n\r\n //check if a plain content is a number or not\r\n result.push(isNaN(Number(plainContent)) ? plainContent : Number(plainContent));\r\n } else {\r\n if (parseParams.length && parseParams[requestNumber] && parseParams[requestNumber].hasOwnProperty(\"valueIfEmpty\")) {\r\n result.push(parseParams[requestNumber].valueIfEmpty);\r\n } else {\r\n const entityUrl = /OData-EntityId.+/i.exec(batchResponse);\r\n\r\n if (entityUrl && entityUrl.length) {\r\n const guidResult = extractUuidFromUrl(entityUrl[0]);\r\n result.push(guidResult ? guidResult : undefined);\r\n } else {\r\n result.push(undefined);\r\n }\r\n }\r\n }\r\n } else {\r\n const parsedResponse = parseData(JSON.parse(responseData, dateReviver), parseParams[requestNumber]);\r\n\r\n if (httpStatus >= 400) {\r\n const responseHeaders = parseBatchHeaders(\r\n //todo: add error handler for httpStatusReg; remove \"!\" operator\r\n batchResponse.substring(batchResponse.indexOf(httpStatusReg![0]) + httpStatusReg![0].length + 1, batchResponse.indexOf(\"{\"))\r\n );\r\n\r\n result.push(\r\n ErrorHelper.handleHttpError(parsedResponse, {\r\n status: httpStatus,\r\n statusText: httpStatusMessage,\r\n statusMessage: httpStatusMessage,\r\n headers: responseHeaders,\r\n })\r\n );\r\n } else {\r\n result.push(parsedResponse);\r\n }\r\n }\r\n }\r\n\r\n requestNumber++;\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction base64ToString(base64: string): string {\r\n return global.DWA_BROWSER ? global.window.atob(base64) : Buffer.from(base64, \"base64\").toString(\"binary\");\r\n}\r\n\r\nfunction parseFileResponse(response: any, responseHeaders: any, parseParams: any): Core.FileParseResult {\r\n let data = response;\r\n\r\n if (parseParams.hasOwnProperty(\"parse\")) {\r\n data = JSON.parse(data).value;\r\n data = base64ToString(data);\r\n }\r\n\r\n var parseResult: Core.FileParseResult = {\r\n value: data,\r\n };\r\n\r\n if (responseHeaders[\"x-ms-file-name\"]) parseResult.fileName = responseHeaders[\"x-ms-file-name\"];\r\n\r\n if (responseHeaders[\"x-ms-file-size\"]) parseResult.fileSize = parseInt(responseHeaders[\"x-ms-file-size\"]);\r\n\r\n if (hasHeader(responseHeaders, \"Location\")) parseResult.location = getHeader(responseHeaders, \"Location\");\r\n\r\n return parseResult;\r\n}\r\n\r\nfunction hasHeader(headers: any, name: string): boolean {\r\n return headers.hasOwnProperty(name) || headers.hasOwnProperty(name.toLowerCase());\r\n}\r\n\r\nfunction getHeader(headers: any, name: string): string {\r\n if (headers[name]) return headers[name];\r\n\r\n return headers[name.toLowerCase()];\r\n}\r\n\r\n/**\r\n *\r\n * @param {string} response - response that needs to be parsed\r\n * @param {Array} responseHeaders - response headers\r\n * @param {Array} parseParams - parameters for parsing the response\r\n * @returns {any} parsed response\r\n */\r\nexport function parseResponse(response: string, responseHeaders: any, parseParams: any[]): any {\r\n let parseResult: any = undefined;\r\n if (response.length) {\r\n if (response.indexOf(\"--batchresponse_\") > -1) {\r\n const batch = parseBatchResponse(response, parseParams);\r\n\r\n parseResult = parseParams.length === 1 && parseParams[0].convertedToBatch ? batch[0] : batch;\r\n } else {\r\n if (hasHeader(responseHeaders, \"Content-Disposition\")) {\r\n parseResult = parseFileResponse(response, responseHeaders, parseParams[0]);\r\n } else {\r\n const contentType = getHeader(responseHeaders, \"Content-Type\");\r\n if (contentType.startsWith(\"application/json\")) {\r\n parseResult = parseData(JSON.parse(response, dateReviver), parseParams[0]);\r\n } else {\r\n parseResult = isNaN(Number(response)) ? response : Number(response);\r\n }\r\n }\r\n }\r\n } else {\r\n if (parseParams.length && parseParams[0].hasOwnProperty(\"valueIfEmpty\")) {\r\n parseResult = parseParams[0].valueIfEmpty;\r\n } else if (hasHeader(responseHeaders, \"OData-EntityId\")) {\r\n const entityUrl = getHeader(responseHeaders, \"OData-EntityId\");\r\n\r\n const guidResult = extractUuidFromUrl(entityUrl);\r\n\r\n if (guidResult) {\r\n parseResult = guidResult;\r\n }\r\n } else if (hasHeader(responseHeaders, \"Location\")) {\r\n parseResult = {\r\n location: getHeader(responseHeaders, \"Location\"),\r\n };\r\n\r\n if (responseHeaders[\"x-ms-chunk-size\"]) parseResult.chunkSize = parseInt(responseHeaders[\"x-ms-chunk-size\"]);\r\n }\r\n }\r\n\r\n return parseResult;\r\n}\r\n", "\uFEFFimport * as http from \"http\";\r\nimport * as https from \"https\";\r\nimport HttpProxyAgent from \"http-proxy-agent\";\r\nimport HttpsProxyAgent from \"https-proxy-agent\";\r\nimport { Core } from \"../types\";\r\nimport { ErrorHelper } from \"./../helpers/ErrorHelper\";\r\nimport { parseResponse } from \"./helpers/parseResponse\";\r\n\r\nconst agents: { [key: string]: http.Agent } = {};\r\n\r\nconst getAgent = (options: Core.RequestOptions, protocol: string): http.Agent => {\r\n const isHttp = protocol === \"http\";\r\n const proxy = options.proxy;\r\n const agentName = proxy ? proxy.url : protocol;\r\n\r\n if (!agents[agentName]) {\r\n if (proxy) {\r\n const parsedProxyUrl = new URL(proxy.url);\r\n const proxyAgent = isHttp ? HttpProxyAgent.HttpProxyAgent : HttpsProxyAgent.HttpsProxyAgent;\r\n\r\n const proxyOptions: HttpProxyAgent.HttpProxyAgentOptions | HttpsProxyAgent.HttpsProxyAgentOptions = {\r\n host: parsedProxyUrl.hostname,\r\n port: parsedProxyUrl.port,\r\n protocol: parsedProxyUrl.protocol,\r\n };\r\n\r\n if (proxy.auth) proxyOptions.auth = proxy.auth.username + \":\" + proxy.auth.password;\r\n else if (parsedProxyUrl.username && parsedProxyUrl.password) proxyOptions.auth = `${parsedProxyUrl.username}:${parsedProxyUrl.password}`;\r\n\r\n agents[agentName] = new proxyAgent(proxyOptions);\r\n } else {\r\n const protocolInterface = isHttp ? http : https;\r\n\r\n agents[agentName] = new protocolInterface.Agent({\r\n keepAlive: true,\r\n maxSockets: Infinity,\r\n });\r\n }\r\n }\r\n\r\n return agents[agentName];\r\n};\r\n\r\nexport function executeRequest(options: Core.RequestOptions): Promise {\r\n return new Promise((resolve, reject) => {\r\n _executeRequest(options, resolve, reject);\r\n });\r\n}\r\n\r\n/**\r\n * Sends a request to given URL with given parameters\r\n *\r\n */\r\nfunction _executeRequest(\r\n options: Core.RequestOptions,\r\n successCallback: (response: Core.WebApiResponse) => void,\r\n errorCallback: (error: Core.WebApiErrorResponse | Core.WebApiErrorResponse[]) => void\r\n) {\r\n const data = options.data;\r\n const additionalHeaders = options.additionalHeaders;\r\n const responseParams = options.responseParams;\r\n const signal = options.abortSignal;\r\n\r\n const headers: http.OutgoingHttpHeaders = {};\r\n\r\n if (data) {\r\n headers[\"Content-Type\"] = additionalHeaders[\"Content-Type\"];\r\n headers[\"Content-Length\"] = data.length;\r\n\r\n delete additionalHeaders[\"Content-Type\"];\r\n }\r\n\r\n //set additional headers\r\n for (let key in additionalHeaders) {\r\n headers[key] = additionalHeaders[key];\r\n }\r\n const parsedUrl = new URL(options.uri);\r\n const protocol = parsedUrl.protocol?.slice(0, -1) || \"https\";\r\n const protocolInterface = protocol === \"http\" ? http : https;\r\n\r\n const internalOptions: http.RequestOptions = {\r\n hostname: parsedUrl.hostname,\r\n port: parsedUrl.port,\r\n path: parsedUrl.pathname + parsedUrl.search,\r\n method: options.method,\r\n timeout: options.timeout || 0,\r\n headers: headers,\r\n signal: signal,\r\n };\r\n\r\n //support environment variables\r\n if (!options.proxy && process.env[`${protocol}_proxy`]) {\r\n options.proxy = {\r\n url: process.env[`${protocol}_proxy`]!,\r\n };\r\n }\r\n\r\n internalOptions.agent = getAgent(options, protocol);\r\n\r\n if (options.proxy) {\r\n const hostHeader = new URL(options.proxy.url).host;\r\n if (hostHeader) headers.host = hostHeader;\r\n }\r\n\r\n const request = protocolInterface.request(internalOptions, function (res) {\r\n let rawData = \"\";\r\n res.setEncoding(\"utf8\");\r\n res.on(\"data\", function (chunk) {\r\n rawData += chunk;\r\n });\r\n res.on(\"end\", function () {\r\n switch (res.statusCode) {\r\n case 200: // Success with content returned in response body.\r\n case 201: // Success with content returned in response body.\r\n case 204: // Success with no content returned in response body.\r\n case 206: //Success with partial content\r\n case 304: {\r\n // Success with Not Modified\r\n let responseData = parseResponse(rawData, res.headers, responseParams[options.requestId]);\r\n\r\n let response = {\r\n data: responseData,\r\n headers: res.headers as any,\r\n status: res.statusCode,\r\n };\r\n\r\n successCallback(response);\r\n break;\r\n }\r\n default:\r\n // All other statuses are error cases.\r\n let crmError;\r\n try {\r\n var errorParsed = parseResponse(rawData, res.headers, responseParams[options.requestId]);\r\n\r\n if (Array.isArray(errorParsed)) {\r\n errorCallback(errorParsed);\r\n break;\r\n }\r\n\r\n crmError = errorParsed.hasOwnProperty(\"error\") && errorParsed.error ? errorParsed.error : { message: errorParsed.Message };\r\n } catch (e) {\r\n if (rawData.length > 0) {\r\n crmError = { message: rawData };\r\n } else {\r\n crmError = { message: \"Unexpected Error\" };\r\n }\r\n }\r\n\r\n errorCallback(\r\n ErrorHelper.handleHttpError(crmError, {\r\n status: res.statusCode,\r\n statusText: \"\",\r\n statusMessage: res.statusMessage,\r\n headers: res.headers,\r\n })\r\n );\r\n break;\r\n }\r\n });\r\n });\r\n\r\n if (internalOptions.timeout) {\r\n request.setTimeout(internalOptions.timeout, function () {\r\n request.destroy();\r\n });\r\n }\r\n\r\n request.on(\"error\", function (error) {\r\n errorCallback(error);\r\n });\r\n\r\n if (data) {\r\n request.write(data);\r\n }\r\n\r\n request.end();\r\n}\r\n", "\uFEFFimport { ConfigurationUtility } from \"./utils/Config\";\r\nimport { Utility } from \"./utils/Utility\";\r\nimport { ErrorHelper } from \"./helpers/ErrorHelper\";\r\nimport { RequestClient } from \"./client/RequestClient\";\r\nimport type { Core } from \"./types\";\r\n\r\n/**\r\n * Microsoft Dynamics CRM Web API helper library written in JavaScript.\r\n * It is compatible with: Dynamics 365 (online), Dynamics 365 (on-premise), Dynamics CRM 2016, Dynamics CRM Online.\r\n */\r\nexport class DynamicsWebApi {\r\n private _config = ConfigurationUtility.default();\r\n private _isBatch = false;\r\n private _batchRequestId: string | null = null;\r\n\r\n /**\r\n * Initializes a new instance of DynamicsWebApi\r\n * @param config - Configuration object\r\n */\r\n constructor(config?: Config) {\r\n ConfigurationUtility.merge(this._config, config);\r\n }\r\n\r\n /**\r\n\t * Merges provided configuration properties with an existing one.\r\n\t *\r\n\t * @param {DynamicsWebApi.Config} config - Configuration\r\n\t * @example\r\n\t dynamicsWebApi.setConfig({ serverUrl: 'https://contoso.api.crm.dynamics.com/' });\r\n\t */\r\n setConfig = (config: Config) => ConfigurationUtility.merge(this._config, config);\r\n\r\n private _makeRequest = async (request: Core.InternalRequest): Promise => {\r\n request.isBatch = this._isBatch;\r\n if (this._batchRequestId) request.requestId = this._batchRequestId;\r\n return RequestClient.makeRequest(request, this._config);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a new record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n * @example\r\n *const lead = {\r\n * subject: \"Test WebAPI\",\r\n * firstname: \"Test\",\r\n * lastname: \"WebAPI\",\r\n * jobtitle: \"Title\"\r\n *};\r\n *\r\n *const request = {\r\n * data: lead,\r\n * collection: \"leads\",\r\n * returnRepresentation: true\r\n *}\r\n *\r\n *const response = await dynamicsWebApi.create(request);\r\n *\r\n */\r\n create = async (request: CreateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.create\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"create\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"POST\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n * @example\r\n *const request = {\r\n * key: '7d577253-3ef0-4a0a-bb7f-8335c2596e70',\r\n * collection: \"leads\",\r\n * select: [\"fullname\", \"subject\"],\r\n * ifnonematch: 'W/\"468026\"',\r\n * includeAnnotations: \"OData.Community.Display.V1.FormattedValue\"\r\n *};\r\n *\r\n *const response = await dynamicsWebApi.retrieve(request);\r\n */\r\n retrieve = async (request: RetrieveRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieve\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"retrieve\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"GET\";\r\n internalRequest.responseParameters = {\r\n isRef: internalRequest.select?.length === 1 && internalRequest.select[0].endsWith(\"/$ref\"),\r\n };\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n update = async (request: UpdateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.update\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"update\";\r\n } else internalRequest = request;\r\n\r\n //Metadata definitions, cannot be updated using \"PATCH\" method\r\n if (!internalRequest.method)\r\n internalRequest.method = /EntityDefinitions|RelationshipDefinitions|GlobalOptionSetDefinitions/.test(internalRequest.collection || \"\")\r\n ? \"PUT\"\r\n : \"PATCH\";\r\n\r\n internalRequest.responseParameters = { valueIfEmpty: true };\r\n\r\n if (internalRequest.ifmatch == null) {\r\n internalRequest.ifmatch = \"*\"; //to prevent upsert\r\n }\r\n\r\n //copy locally\r\n const ifmatch = internalRequest.ifmatch;\r\n\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifmatch && error.status === 412) {\r\n //precondition failed - not updated\r\n return false; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a single value in the record.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateSingleProperty = async (request: UpdateSinglePropertyRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateSingleProperty\", \"request\");\r\n ErrorHelper.parameterCheck(request.fieldValuePair, \"DynamicsWebApi.updateSingleProperty\", \"request.fieldValuePair\");\r\n\r\n var field = Object.keys(request.fieldValuePair)[0];\r\n var fieldValue = request.fieldValuePair[field];\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.navigationProperty = field;\r\n internalRequest.data = { value: fieldValue };\r\n internalRequest.functionName = \"updateSingleProperty\";\r\n internalRequest.method = \"PUT\";\r\n\r\n delete internalRequest[\"fieldValuePair\"];\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a record.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteRecord = async (request: DeleteRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteRecord\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"deleteRecord\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.responseParameters = { valueIfEmpty: true };\r\n\r\n //copy locally\r\n const ifmatch = internalRequest.ifmatch;\r\n\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifmatch && error.status === 412) {\r\n //precondition failed - not updated\r\n return false; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to upsert a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n upsert = async (request: UpsertRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.upsert\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"PATCH\";\r\n internalRequest.functionName = \"upsert\";\r\n\r\n //copy locally\r\n const ifnonematch = internalRequest.ifnonematch;\r\n const ifmatch = internalRequest.ifmatch;\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifnonematch && error.status === 412) {\r\n //if prevent update\r\n return null; //todo: check this\r\n } else if (ifmatch && error.status === 404) {\r\n //if prevent create\r\n return null; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n private _uploadFileChunk = async (request: Core.InternalRequest, fileBytes: Uint8Array | Buffer, chunkSize: number, offset: number = 0): Promise => {\r\n // offset = offset || 0;\r\n Utility.setFileChunk(request, fileBytes, chunkSize, offset);\r\n\r\n await this._makeRequest(request);\r\n\r\n offset += chunkSize;\r\n if (offset <= fileBytes.length) {\r\n return this._uploadFileChunk(request, fileBytes, chunkSize, offset);\r\n }\r\n };\r\n\r\n /**\r\n * Upload file to a File Attribute\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n */\r\n uploadFile = async (request: UploadRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.uploadFile\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.uploadFile\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request, [\"data\"]);\r\n internalRequest.method = \"PATCH\";\r\n internalRequest.functionName = \"uploadFile\";\r\n internalRequest.transferMode = \"chunked\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n internalRequest.url = response?.data.location;\r\n delete internalRequest.transferMode;\r\n delete internalRequest.fieldName;\r\n delete internalRequest.fileName;\r\n return this._uploadFileChunk(internalRequest, request.data, response?.data.chunkSize);\r\n };\r\n\r\n private _downloadFileChunk = async (\r\n request: Core.InternalRequest,\r\n bytesDownloaded: number = 0,\r\n // fileSize: number = 0,\r\n data: string = \"\"\r\n ): Promise => {\r\n // bytesDownloaded = bytesDownloaded || 0;\r\n // fileSize = fileSize || 0;\r\n // data = data || \"\";\r\n\r\n request.range = \"bytes=\" + bytesDownloaded + \"-\" + (bytesDownloaded + Utility.downloadChunkSize - 1);\r\n request.downloadSize = \"full\";\r\n\r\n const response = await this._makeRequest(request);\r\n\r\n request.url = response?.data.location;\r\n data += response?.data.value;\r\n\r\n bytesDownloaded += Utility.downloadChunkSize;\r\n\r\n if (bytesDownloaded <= response?.data.fileSize) {\r\n return this._downloadFileChunk(request, bytesDownloaded, data);\r\n }\r\n\r\n return {\r\n fileName: response?.data.fileName,\r\n fileSize: response?.data.fileSize,\r\n data: Utility.convertToFileBuffer(data),\r\n };\r\n };\r\n\r\n /**\r\n * Download a file from a File Attribute\r\n * @param request - An object that represents all possible options for a current request.\r\n */\r\n downloadFile = (request: DownloadRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.downloadFile\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.downloadFile\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"downloadFile\";\r\n internalRequest.responseParameters = { parse: true };\r\n\r\n return this._downloadFileChunk(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve records.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @param {string} [nextPageLink] - Use the value of the @odata.nextLink property with a new GET request to return the next page of data. Pass null to retrieveMultipleOptions.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveMultiple = async (request: RetrieveMultipleRequest, nextPageLink?: string): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveMultiple\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"retrieveMultiple\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"GET\";\r\n\r\n if (nextPageLink) {\r\n ErrorHelper.stringParameterCheck(nextPageLink, \"DynamicsWebApi.retrieveMultiple\", \"nextPageLink\");\r\n internalRequest.url = nextPageLink;\r\n }\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n return response?.data;\r\n };\r\n\r\n private _retrieveAllRequest = async (request: RetrieveMultipleRequest, nextPageLink?: string, records: any[] = []): Promise> => {\r\n const response = await this.retrieveMultiple(request, nextPageLink);\r\n records = records.concat(response.value);\r\n\r\n const pageLink = response.oDataNextLink;\r\n\r\n if (pageLink) {\r\n return this._retrieveAllRequest(request, pageLink, records);\r\n }\r\n\r\n const result: AllResponse = { value: records };\r\n\r\n if (response.oDataDeltaLink) {\r\n result[\"@odata.deltaLink\"] = response.oDataDeltaLink;\r\n result.oDataDeltaLink = response.oDataDeltaLink;\r\n }\r\n\r\n return result;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve all records.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAll = (request: RetrieveMultipleRequest): Promise> => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.retrieveAll\", this._isBatch);\r\n return this._retrieveAllRequest(request);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to count records. IMPORTANT! The count value does not represent the total number of entities in the system. It is limited by the maximum number of entities that can be returned. Returns: Number\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n count = async (request: CountRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.count\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"count\";\r\n\r\n if (internalRequest.filter?.length) {\r\n internalRequest.count = true;\r\n } else {\r\n internalRequest.navigationProperty = \"$count\";\r\n }\r\n\r\n internalRequest.responseParameters = { toCount: internalRequest.count };\r\n\r\n //if filter has not been specified then simplify the request\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to count records. Returns: Number\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n countAll = async (request: CountAllRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.countAll\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.countAll\", \"request\");\r\n\r\n const response = await this._retrieveAllRequest(request);\r\n\r\n return response ? (response.value ? response.value.length : 0) : 0;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to execute FetchXml to retrieve records. Returns: DWA.Types.FetchXmlResponse\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n fetch = async (request: FetchXmlRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.fetch\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"fetch\";\r\n\r\n ErrorHelper.stringParameterCheck(internalRequest.fetchXml, \"DynamicsWebApi.fetch\", \"request.fetchXml\");\r\n\r\n //only add paging if there is no top\r\n if (internalRequest.fetchXml && !/^(request: FetchAllRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.fetchAll\", \"request\");\r\n\r\n const _executeFetchXmlAll = async (request: FetchXmlRequest, records: any[] = []): Promise> => {\r\n // records = records || [];\r\n\r\n const response = await this.fetch(request);\r\n\r\n records = records.concat(response.value);\r\n\r\n if (response.PagingInfo) {\r\n request.pageNumber = response.PagingInfo.nextPage;\r\n request.pagingCookie = response.PagingInfo.cookie;\r\n\r\n return _executeFetchXmlAll(request, records);\r\n }\r\n\r\n return { value: records };\r\n };\r\n\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.fetchAll\", this._isBatch);\r\n return _executeFetchXmlAll(request);\r\n };\r\n\r\n /**\r\n * Associate for a collection-valued navigation property. (1:N or N:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n associate = async (request: AssociateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.associate\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"associate\";\r\n\r\n ErrorHelper.stringParameterCheck(request.relatedCollection, \"DynamicsWebApi.associate\", \"request.relatedcollection\");\r\n ErrorHelper.stringParameterCheck(request.relationshipName, \"DynamicsWebApi.associate\", \"request.relationshipName\");\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.associate\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.associate\", \"request.relatedKey\");\r\n\r\n internalRequest.navigationProperty = request.relationshipName + \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n internalRequest.data = { \"@odata.id\": `${request.relatedCollection}(${relatedKey})` };\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Disassociate for a collection-valued navigation property.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n disassociate = async (request: DisassociateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.disassociate\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.functionName = \"disassociate\";\r\n\r\n ErrorHelper.stringParameterCheck(request.relationshipName, \"DynamicsWebApi.disassociate\", \"request.relationshipName\");\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.disassociate\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.disassociate\", \"request.relatedId\");\r\n\r\n internalRequest.key = primaryKey;\r\n internalRequest.navigationProperty = `${request.relationshipName}(${relatedKey})/$ref`;\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Associate for a single-valued navigation property. (1:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n associateSingleValued = async (request: AssociateSingleValuedRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.associateSingleValued\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"PUT\";\r\n internalRequest.functionName = \"associateSingleValued\";\r\n\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.associateSingleValued\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.associateSingleValued\", \"request.relatedKey\");\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, \"DynamicsWebApi.associateSingleValued\", \"request.navigationProperty\");\r\n ErrorHelper.stringParameterCheck(request.relatedCollection, \"DynamicsWebApi.associateSingleValued\", \"request.relatedcollection\");\r\n\r\n internalRequest.navigationProperty += \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n internalRequest.data = { \"@odata.id\": `${request.relatedCollection}(${relatedKey})` };\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Removes a reference to an entity for a single-valued navigation property. (1:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n disassociateSingleValued = async (request: DisassociateSingleValuedRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.disassociateSingleValued\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.functionName = \"disassociateSingleValued\";\r\n\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.disassociateSingleValued\", \"request.primaryKey\");\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, \"DynamicsWebApi.disassociateSingleValued\", \"request.navigationProperty\");\r\n\r\n internalRequest.navigationProperty += \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Calls a Web API function\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n callFunction: CallFunction = async (request: string | BoundFunctionRequest | UnboundFunctionRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.callFunction`, \"request\");\r\n\r\n const getFunctionName = (request: BoundFunctionRequest | UnboundFunctionRequest) => request.name || request.functionName;\r\n\r\n const isObject = typeof request !== \"string\";\r\n const functionName = isObject ? getFunctionName(request) : request;\r\n const parameterName = isObject ? \"request.name\" : \"name\";\r\n const internalRequest: Core.InternalRequest = isObject ? Utility.copyObject(request, [\"name\"]) : { functionName: functionName };\r\n\r\n ErrorHelper.stringParameterCheck(functionName, `DynamicsWebApi.callFunction`, parameterName);\r\n\r\n const functionParameters = Utility.buildFunctionParameters(internalRequest.parameters);\r\n\r\n internalRequest.method = \"GET\";\r\n internalRequest._additionalUrl = functionName + functionParameters.key;\r\n internalRequest.queryParams = functionParameters.queryParams;\r\n internalRequest._isUnboundRequest = !internalRequest.collection;\r\n internalRequest.functionName = \"callFunction\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Calls a Web API action\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n callAction: CallAction = async (\r\n request: BoundActionRequest | UnboundActionRequest\r\n ): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.callAction`, \"request\");\r\n ErrorHelper.stringParameterCheck(request.actionName, `DynamicsWebApi.callAction`, \"request.actionName\");\r\n\r\n const internalRequest = Utility.copyRequest(request, [\"action\"]);\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"callAction\";\r\n\r\n internalRequest._additionalUrl = request.actionName;\r\n internalRequest._isUnboundRequest = !internalRequest.collection;\r\n internalRequest.data = request.action;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n /**\r\n * Sends an asynchronous request to create an entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createEntity = (request: CreateEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.createEntity`, \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createEntity\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"createEntity\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update an entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateEntity = (request: UpdateEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateEntity\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateEntity\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateEntity\", \"request.data.MetadataId\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.key = internalRequest.data.MetadataId;\r\n internalRequest.functionName = \"updateEntity\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveEntity = (request: RetrieveEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveEntity\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.retrieveEntity\", \"request.key\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntity\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve entity definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveEntities = (request?: RetrieveEntitiesRequest): Promise> => {\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntities\";\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create an attribute.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createAttribute = (request: CreateAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createAttribute\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createAttribute\", \"request.data\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.createAttribute\", \"request.entityKey\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntity\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.key = request.entityKey;\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update an attribute.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateAttribute = (request: UpdateAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateAttribute\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateAttribute\", \"request.data\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.updateAttribute\", \"request.entityKey\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateAttribute\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateAttribute\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.navigationPropertyKey = request.data.MetadataId;\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"updateAttribute\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve attribute metadata for a specified entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAttributes = (request: RetrieveAttributesRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveAttributes\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.retrieveAttributes\", \"request.entityKey\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveAttributes\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"retrieveAttributes\";\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific attribute metadata for a specified entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAttribute = (request: RetrieveAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveAttributes\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.retrieveAttribute\", \"request.entityKey\");\r\n ErrorHelper.keyParameterCheck(request.attributeKey, \"DynamicsWebApi.retrieveAttribute\", \"request.attributeKey\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveAttribute\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.navigationPropertyKey = request.attributeKey;\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"retrieveAttribute\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createRelationship = (request: CreateRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createRelationship\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createRelationship\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"createRelationship\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateRelationship = (request: UpdateRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateRelationship\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateRelationship\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateRelationship\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateRelationship\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.key = request.data.MetadataId;\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"updateRelationship\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteRelationship = (request: DeleteRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteRelationship\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.deleteRelationship\", \"request.key\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"deleteRelationship\";\r\n\r\n return this.deleteRecord(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve relationship definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveRelationships = (request?: RetrieveRelationshipsRequest): Promise> => {\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"retrieveRelationships\";\r\n\r\n if (request) {\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveRelationships\", \"request.castType\");\r\n internalRequest.navigationProperty = request.castType;\r\n }\r\n }\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveRelationship = (request: RetrieveRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveRelationship\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.retrieveRelationship\", \"request.key\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveRelationship\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"retrieveRelationship\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a Global Option Set definition\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createGlobalOptionSet = (request: CreateGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createGlobalOptionSet\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createGlobalOptionSet\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"createGlobalOptionSet\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a Global Option Set.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateGlobalOptionSet = (request: UpdateGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateGlobalOptionSet\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.key = request.data.MetadataId;\r\n internalRequest.functionName = \"updateGlobalOptionSet\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a Global Option Set.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteGlobalOptionSet = (request: DeleteGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteGlobalOptionSet\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"deleteGlobalOptionSet\";\r\n\r\n return this.deleteRecord(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve Global Option Set definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveGlobalOptionSet = (request: RetrieveGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveGlobalOptionSet\", \"request\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveGlobalOptionSet\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"retrieveGlobalOptionSet\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve Global Option Set definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveGlobalOptionSets = (request?: RetrieveGlobalOptionSetsRequest): Promise> => {\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"retrieveGlobalOptionSets\";\r\n\r\n if (request?.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveGlobalOptionSets\", \"request.castType\");\r\n internalRequest.navigationProperty = request.castType;\r\n }\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Retrieves a CSDL Document Metadata\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} A raw CSDL $metadata document.\r\n */\r\n retrieveCsdlMetadata = async (request?: CsdlMetadataRequest): Promise => {\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"$metadata\";\r\n internalRequest.functionName = \"retrieveCsdlMetadata\";\r\n\r\n if (request?.addAnnotations) {\r\n ErrorHelper.boolParameterCheck(request.addAnnotations, \"DynamicsWebApi.retrieveCsdlMetadata\", \"request.addAnnotations\");\r\n internalRequest.includeAnnotations = \"*\";\r\n }\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides a search results page.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Search result\r\n */\r\n search: SearchFunction = async (request: string | SearchRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.search\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: Core.InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.search\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.search\", parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.search\", parameterName, 100);\r\n\r\n internalRequest.collection = \"query\";\r\n internalRequest.functionName = \"search\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Suggestions result\r\n */\r\n suggest: SuggestFunction = async (request: string | SuggestRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.suggest\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: Core.InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.suggest\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.suggest\", parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.suggest\", parameterName, 100);\r\n\r\n internalRequest.functionName = internalRequest.collection = \"suggest\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n autocomplete: AutocompleteFunction = async (request: string | AutocompleteRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.autocomplete\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: Core.InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n if (isObject) ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.autocomplete\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, `DynamicsWebApi.autocomplete`, parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.autocomplete\", parameterName, 100);\r\n\r\n internalRequest.functionName = internalRequest.collection = \"autocomplete\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Starts/executes a batch request.\r\n */\r\n startBatch = (): void => {\r\n this._isBatch = true;\r\n this._batchRequestId = Utility.generateUUID();\r\n };\r\n\r\n /**\r\n * Executes a batch request. Please call DynamicsWebApi.startBatch() first to start a batch request.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n executeBatch = async (request?: BatchRequest): Promise => {\r\n ErrorHelper.throwBatchNotStarted(this._isBatch);\r\n\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"$batch\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"executeBatch\";\r\n internalRequest.requestId = this._batchRequestId;\r\n\r\n this._batchRequestId = null;\r\n this._isBatch = false;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Creates a new instance of DynamicsWebApi. If config is not provided, it is copied from a current instance.\r\n *\r\n * @param {Config} config configuration object.\r\n * @returns {DynamicsWebApi} A new instance of DynamicsWebApi\r\n */\r\n initializeInstance = (config?: Config): DynamicsWebApi => new DynamicsWebApi(config || this._config);\r\n\r\n Utility = {\r\n /**\r\n * Searches for a collection name by provided entity name in a cached entity metadata.\r\n * The returned collection name can be null.\r\n *\r\n * @param {string} entityName entity name\r\n * @returns {string | null} collection name\r\n */\r\n getCollectionName: (entityName: string): string | null => RequestClient.getCollectionName(entityName),\r\n };\r\n}\r\n\r\nexport interface Expand {\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**Limit the number of results returned by using the $top system query option.Do not use $top with $count! */\r\n top?: number;\r\n /**An Array(of Strings) representing the order in which items are returned using the $orderby system query option.Use the asc or desc suffix to specify ascending or descending order respectively.The default is ascending if the suffix isn't applied. */\r\n orderBy?: string[];\r\n /**A name of a single-valued navigation property which needs to be expanded. */\r\n property?: string;\r\n /**An Array of Expand Objects representing the $expand Query Option value to control which related records need to be returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface BaseRequest {\r\n /**XHR requests only! Indicates whether the requests should be made synchronously or asynchronously.Default value is 'true'(asynchronously). */\r\n async?: boolean;\r\n /**Impersonates a user based on their systemuserid by adding \"MSCRMCallerID\" header. A String representing the GUID value for the Dynamics 365 systemuserid. */\r\n impersonate?: string;\r\n /**Impersonates a user based on their Azure Active Directory (AAD) object id by passing that value along with the header \"CallerObjectId\". A String should represent a GUID value. */\r\n impersonateAAD?: string;\r\n /**If set to 'true', DynamicsWebApi adds a request header 'Cache-Control: no-cache'.Default value is 'false'. */\r\n noCache?: boolean;\r\n /** Authorization Token. If set, onTokenRefresh will not be called. */\r\n token?: string;\r\n /**Sets a number of milliseconds before a request times out. */\r\n timeout?: number;\r\n /**The AbortSignal interface represents a signal object that allows you to communicate with a DOM request and abort it if required via an AbortController object. */\r\n signal?: AbortSignal;\r\n /**Indicates if an operation must be included in a Change Set or not. Works in Batch Operations only. By default, it's \"true\", except for GET operations - they are not allowed in Change Sets. */\r\n inChangeSet?: boolean;\r\n /**Headers to supply with a request. These headers will override configuraiton headers if the identical ones were set. */\r\n headers?: HeaderCollection;\r\n /**Custom query parameters. Can be used to set parameter aliases for \"$filter\" and \"$orderBy\". Important! These parameters ARE NOT URI encoded! */\r\n queryParams?: string[];\r\n}\r\n\r\nexport interface BatchRequest extends BaseRequest {\r\n /** Sets Prefer header to \"odata.continue-on-error\" that allows more requests be processed when errors occur. The batch request will return '200 OK' and individual response errors will be returned in the batch response body. */\r\n continueOnError?: boolean;\r\n}\r\n\r\nexport interface Request extends BaseRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection?: string;\r\n}\r\n\r\nexport interface CRUDRequest extends Request {\r\n /**A String representing collection record's Primary Key (GUID) or Alternate Key(s). */\r\n key?: string;\r\n}\r\n\r\nexport interface CountRequest extends Request {\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n}\r\n\r\nexport interface CountAllRequest extends CountRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**An Array (of strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n}\r\n\r\nexport interface FetchAllRequest extends Request {\r\n /**Sets FetchXML - a proprietary query language that provides capabilities to perform aggregation. */\r\n fetchXml: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation. Annotations provide additional information about lookups, options sets and other complex attribute types. For example: * or Microsoft.Dynamics.CRM.fetchxmlpagingcookie */\r\n includeAnnotations?: string;\r\n}\r\n\r\nexport interface FetchXmlRequest extends FetchAllRequest {\r\n /**Page number. */\r\n pageNumber?: number;\r\n /**Paging cookie. To retrive the first page, pagingCookie must be null. */\r\n pagingCookie?: string;\r\n}\r\n\r\nexport interface CreateRequest extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Web API v9+ only! Boolean that enables duplicate detection. */\r\n duplicateDetection?: boolean;\r\n /**A JavaScript object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data?: T;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface UpdateRequestBase extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Web API v9+ only! Boolean that enables duplicate detection. */\r\n duplicateDetection?: boolean;\r\n /**A JavaScript object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data?: T;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**Casts the AttributeMetadata to a specific type. (Used in requests to Attribute Metadata). */\r\n metadataAttributeType?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface UpdateRequest extends UpdateRequestBase {\r\n /**If set to 'true', DynamicsWebApi adds a request header 'MSCRM.MergeLabels: true'. Default value is 'false' */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface UpdateSinglePropertyRequest extends CRUDRequest {\r\n /**Object with a logical name of the field as a key and a value to update with. Example: {subject: \"Update Record\"} */\r\n fieldValuePair: { [key: string]: any };\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n}\r\n\r\nexport interface UpsertRequest extends UpdateRequestBase {\r\n /**Sets If-None-Match header value that enables to use conditional retrieval in applicable requests. */\r\n ifnonematch?: string;\r\n}\r\n\r\nexport interface DeleteRequest extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**Field name that needs to be cleared (for example File Field) */\r\n fieldName?: string;\r\n}\r\n\r\nexport interface RetrieveRequest extends CRUDRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets If-None-Match header value that enables to use conditional retrieval in applicable requests. */\r\n ifnonematch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Casts the AttributeMetadata to a specific type. (Used in requests to Attribute Metadata). */\r\n metadataAttributeType?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**A String representing the GUID value of the saved query. */\r\n savedQuery?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**A String representing the GUID value of the user query. */\r\n userQuery?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface RetrieveMultipleRequest extends Request {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**Use the $apply to aggregate and group your data dynamically */\r\n apply?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Boolean that sets the $count system query option with a value of true to include a count of entities that match the filter criteria up to 5000(per page).Do not use $top with $count! */\r\n count?: boolean;\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets the odata.maxpagesize preference value to request the number of entities returned in the response. */\r\n maxPageSize?: number;\r\n /**An Array(of string) representing the order in which items are returned using the $orderby system query option.Use the asc or desc suffix to specify ascending or descending order respectively.The default is ascending if the suffix isn't applied. */\r\n orderBy?: string[];\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Limit the number of results returned by using the $top system query option.Do not use $top with $count! */\r\n top?: number;\r\n /**Sets Prefer header with value 'odata.track-changes' to request that a delta link be returned which can subsequently be used to retrieve entity changes. */\r\n trackChanges?: boolean;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface AssociateRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Relationship name. */\r\n relationshipName: string;\r\n /**Related name of the Entity Collection or Entity Logical name. */\r\n relatedCollection: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface AssociateSingleValuedRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Navigation property name. */\r\n navigationProperty: string;\r\n /**Related name of the Entity Collection or Entity Logical name. */\r\n relatedCollection: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface DisassociateRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Relationship name. */\r\n relationshipName: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface DisassociateSingleValuedRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Navigation property name. */\r\n navigationProperty: string;\r\n}\r\n\r\nexport interface UnboundFunctionRequest extends BaseRequest {\r\n /**\r\n * Name of the function.\r\n */\r\n name?: string;\r\n /**\r\n * Name of the function. \r\n * @deprecated Use \"name\" parameter.\r\n */\r\n functionName?: string;\r\n /**Function's input parameters. Example: { param1: \"test\", param2: 3 }. */\r\n parameters?: any;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n}\r\n\r\nexport interface BoundFunctionRequest extends UnboundFunctionRequest, Request {\r\n /**A String representing the GUID value for the record. */\r\n key?: string;\r\n}\r\n\r\nexport interface UnboundActionRequest extends BaseRequest {\r\n /**A name of the Web API action. */\r\n actionName: string;\r\n /**An object that represents a Dynamics 365 action. */\r\n action?: TAction;\r\n}\r\n\r\nexport interface BoundActionRequest extends UnboundActionRequest, Request {\r\n /**A String representing the GUID value for the record. */\r\n key?: string;\r\n}\r\n\r\nexport interface CreateEntityRequest extends BaseRequest {\r\n /**An object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateEntityRequest extends CRUDRequest {\r\n /**An object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data: any;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface RetrieveEntityRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveEntitiesRequest extends BaseRequest {\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateAttributeRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Attribute metadata object. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateAttributeRequest extends CreateAttributeRequest {\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface RetrieveAttributesRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveAttributeRequest extends BaseRequest {\r\n /**An Attribute MetadataId or Alternate Key (such as LogicalName). */\r\n attributeKey: string;\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateRelationshipRequest extends BaseRequest {\r\n /**Relationship Definition. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateRelationshipRequest extends CreateRelationshipRequest {\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface DeleteRelationshipRequest extends BaseRequest {\r\n /**A Relationship MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n}\r\n\r\nexport interface RetrieveRelationshipsRequest extends BaseRequest {\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveRelationshipRequest extends BaseRequest {\r\n /**A Relationship MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateGlobalOptionSetRequest extends BaseRequest {\r\n /**Global Option Set Definition. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateGlobalOptionSetRequest extends CreateRelationshipRequest {\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface DeleteGlobalOptionSetRequest extends BaseRequest {\r\n /**A Global Option Set MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n}\r\n\r\nexport interface RetrieveGlobalOptionSetsRequest extends BaseRequest {\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveGlobalOptionSetRequest extends BaseRequest {\r\n /**A Global Option Set MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface UploadRequest extends CRUDRequest {\r\n /**Binary Buffer*/\r\n data: Uint8Array | Buffer;\r\n /**Name of the file */\r\n fileName: string;\r\n /**File Field Name */\r\n fieldName: string;\r\n}\r\n\r\nexport interface DownloadRequest extends CRUDRequest {\r\n /**File Field Name */\r\n fieldName: string;\r\n}\r\n\r\nexport interface CsdlMetadataRequest extends BaseRequest {\r\n /**If set to \"true\" the document will include many different kinds of annotations that can be useful. Most annotations are not included by default because they increase the total size of the document. */\r\n addAnnotations?: boolean;\r\n}\r\n\r\nexport type SearchMode = \"any\" | \"all\";\r\nexport type SearchType = \"simple\" | \"full\";\r\n\r\nexport interface SearchQueryBase {\r\n /**The search parameter value contains the term to be searched for and has a 100-character limit. For suggestions, min 3 characters in addition. */\r\n search: string;\r\n /**The default table list searches across all Dataverse search\u2013configured tables and columns. The default list is configured by your administrator when Dataverse search is enabled. */\r\n entities?: string[];\r\n /**Filters are applied while searching data and are specified in standard OData syntax. */\r\n filter?: string;\r\n}\r\n\r\nexport interface Search extends SearchQueryBase {\r\n /**Facets support the ability to drill down into data results after they've been retrieved. */\r\n facets?: string[];\r\n /**Specify true to return the total record count; otherwise false. The default is false. */\r\n returnTotalRecordCount?: boolean;\r\n /**Specifies the number of search results to skip. */\r\n skip?: number;\r\n /**Specifies the number of search results to retrieve. The default is 50, and the maximum value is 100. */\r\n top?: number;\r\n /**A list of comma-separated clauses where each clause consists of a column name followed by 'asc' (ascending, which is the default) or 'desc' (descending). This list specifies how to order the results in order of precedence. */\r\n orderBy?: string[];\r\n /**Specifies whether any or all the search terms must be matched to count the document as a match. The default is 'any'. */\r\n searchMode?: SearchMode;\r\n /**The search type specifies the syntax of a search query. Using 'simple' selects simple query syntax and 'full' selects Lucene query syntax. The default is 'simple'. */\r\n searchType?: SearchType;\r\n}\r\n\r\nexport interface Suggest extends SearchQueryBase {\r\n /**Use fuzzy search to aid with misspellings. The default is false. */\r\n useFuzzy?: boolean;\r\n /**Number of suggestions to retrieve. The default is 5. */\r\n top?: number;\r\n /**A list of comma-separated clauses where each clause consists of a column name followed by 'asc' (ascending, which is the default) or 'desc' (descending). This list specifies how to order the results in order of precedence. */\r\n orderBy?: string[];\r\n}\r\n\r\nexport interface Autocomplete extends SearchQueryBase {\r\n /**Use fuzzy search to aid with misspellings. The default is false. */\r\n useFuzzy?: boolean;\r\n}\r\n\r\nexport interface SearchRequest extends BaseRequest {\r\n /**Search query object */\r\n query: Search;\r\n}\r\n\r\nexport interface SuggestRequest extends BaseRequest {\r\n /**Suggestion query object */\r\n query: Suggest;\r\n}\r\n\r\nexport interface AutocompleteRequest extends BaseRequest {\r\n /**Autocomplete query object */\r\n query: Autocomplete;\r\n}\r\n\r\nexport interface ApiConfig {\r\n /** API Version to use, for example: \"9.2\" or \"1.0\" */\r\n version?: string;\r\n /** API Path, for example: \"data\" or \"search\" */\r\n path?: string;\r\n}\r\n\r\nexport interface AccessToken {\r\n /** Access Token */\r\n accessToken: string;\r\n}\r\n\r\nexport interface Config {\r\n /**The url to Dataverse API server, for example: https://contoso.api.crm.dynamics.com/. It is required when used in Node.js application. */\r\n serverUrl?: string | null;\r\n /**Impersonates a user based on their systemuserid by adding \"MSCRMCallerID\" header. A String representing the GUID value for the Dynamics 365 systemuserid. */\r\n impersonate?: string | null;\r\n /**Impersonates a user based on their Azure Active Directory (AAD) object id by passing that value along with the header \"CallerObjectId\". A String should represent a GUID value. */\r\n impersonateAAD?: string | null;\r\n /**A function that is called when a security token needs to be refreshed. */\r\n onTokenRefresh?: (() => Promise) | null;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types.*/\r\n includeAnnotations?: string | null;\r\n /**Sets the odata.maxpagesize preference value to request the number of entities returned in the response. */\r\n maxPageSize?: number | null;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request.*/\r\n returnRepresentation?: boolean | null;\r\n /**Indicates whether to use Entity Logical Names instead of Collection Logical Names.*/\r\n useEntityNames?: boolean | null;\r\n /**Sets a number of milliseconds before a request times out. */\r\n timeout?: number | null;\r\n /**Proxy configuration object. */\r\n proxy?: ProxyConfig | null;\r\n /**Configuration object for Dataverse Web API (with path \"data\"). */\r\n dataApi?: ApiConfig;\r\n /**Configuration object for Dataverse Search API (with path \"search\"). */\r\n searchApi?: ApiConfig;\r\n /**Default headers to supply with each request. */\r\n headers?: HeaderCollection;\r\n}\r\n\r\n/**Header collection type */\r\nexport type HeaderCollection = {\r\n /**key-value */\r\n [key: string]: string;\r\n};\r\n\r\nexport interface ProxyConfig {\r\n /**Proxy server url */\r\n url: string;\r\n /**Basic authentication credentials */\r\n auth?: {\r\n /**Username */\r\n username: string;\r\n /**Password */\r\n password: string;\r\n };\r\n}\r\n\r\n/** Callback with an acquired token called by DynamicsWebApi; \"token\" argument can be a string or an object with a property {accessToken: } */\r\n// export interface OnTokenAcquiredCallback {\r\n// (token: any): void;\r\n// }\r\n\r\nexport interface RequestError extends Error {\r\n /**The name of the error */\r\n name: string;\r\n /**This code is not related to the http status code and is frequently empty */\r\n code?: string;\r\n /**A message describing the error */\r\n message: string;\r\n /**HTTP status code */\r\n status?: number;\r\n /**HTTP status text. Frequently empty */\r\n statusText?: string;\r\n /**HTTP Response headers */\r\n headers?: any;\r\n /**Details about an error */\r\n innererror?: {\r\n /**A message describing the error, this is frequently the same as the outer message */\r\n message?: string;\r\n /**Microsoft.Crm.CrmHttpException */\r\n type?: string;\r\n /**Details from the server about where the error occurred */\r\n stacktrace?: string;\r\n };\r\n}\r\n\r\nexport interface MultipleResponse {\r\n /**Multiple respone entities */\r\n value: T[];\r\n oDataCount?: number;\r\n \"@odata.count\"?: number;\r\n oDataContext?: string;\r\n \"@odata.context\"?: number;\r\n}\r\n\r\nexport interface AllResponse extends MultipleResponse {\r\n /**@odata.deltaLink value */\r\n oDataDeltaLink?: string;\r\n}\r\n\r\nexport interface RetrieveMultipleResponse extends MultipleResponse {\r\n \"@Microsoft.Dynamics.CRM.totalrecordcount\"?: number;\r\n \"@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded\"?: boolean;\r\n /**@odata.nextLink value */\r\n oDataNextLink?: string;\r\n /**@odata.deltaLink value */\r\n oDataDeltaLink?: string;\r\n \"@odata.deltaLink\"?: string;\r\n \"@odata.nextLink\"?: string;\r\n}\r\n\r\nexport interface FetchXmlResponse extends MultipleResponse {\r\n \"@Microsoft.Dynamics.CRM.totalrecordcount\"?: number;\r\n \"@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded\"?: boolean;\r\n /**Paging information */\r\n PagingInfo?: {\r\n /**Number of the next page */\r\n nextPage?: number;\r\n /**Next page cookie */\r\n cookie?: string;\r\n };\r\n}\r\n\r\nexport interface DownloadResponse {\r\n /**The name of the file */\r\n fileName: string;\r\n /**File size */\r\n fileSize: number;\r\n /**File Data */\r\n data: Uint8Array | Buffer;\r\n}\r\n\r\nexport interface SearchResponse {\r\n /**Search results*/\r\n value: TValue[];\r\n facets: any | null;\r\n totalrecordcount: number;\r\n querycontext: any | null;\r\n}\r\n\r\nexport interface SuggestResponseValue {\r\n text: string;\r\n document: TDocument;\r\n}\r\n\r\nexport interface SuggestResponse {\r\n /**Suggestions*/\r\n value: SuggestResponseValue[];\r\n querycontext: any | null;\r\n}\r\n\r\nexport interface AutocompleteResponse {\r\n /**Autocomplete result*/\r\n value: string | null;\r\n querycontext: any | null;\r\n}\r\n\r\n//function overloads\r\n\r\ntype CallFunction = {\r\n /**\r\n * Calls a Web API function\r\n *\r\n * @param name - The name of a function.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (name: string): Promise;\r\n /**\r\n * Calls a bound Web API function\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundFunctionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API function (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundFunctionRequest): Promise;\r\n};\r\n\r\ntype CallAction = {\r\n /**\r\n * Calls a bound Web API action (bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {T} Type of the value in a response\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundActionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API action (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {T} Type of the value in a response\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundActionRequest): Promise;\r\n /**\r\n * Calls a bound Web API action (bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {TResponse} Type of the value in a response\r\n * @type {TAction} Type of an action object\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundActionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API action (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {TResponse} Type of the value in a response\r\n * @type {TAction} Type of an action object\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundActionRequest): Promise;\r\n};\r\n\r\ntype SearchFunction = {\r\n /**\r\n * Provides a search results page.\r\n * @param term - The term to be searched for and has a max 100-character limit.\r\n * @returns {Promise} Search result\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides a search results page.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Search result\r\n */\r\n (request: SearchRequest): Promise>;\r\n};\r\n\r\ntype SuggestFunction = {\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param term - The term to be searched for and has min 3 characters to a max 100-character limit.\r\n * @returns {Promise} Suggestions result\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Suggestions result\r\n */\r\n (request: SuggestRequest): Promise>;\r\n};\r\n\r\ntype AutocompleteFunction = {\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param term - The term to be searched for and has a 100-character limit.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n (request: AutocompleteRequest): Promise;\r\n};\r\n", "import { Utility } from \"./Utility\";\r\nimport { ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { ApiConfig, Config } from \"../dynamics-web-api\";\r\n\r\ntype ApiType = \"dataApi\" | \"searchApi\";\r\n\r\nexport interface InternalApiConfig extends ApiConfig {\r\n url: string;\r\n}\r\n\r\nexport interface InternalConfig extends Config {\r\n dataApi: InternalApiConfig;\r\n searchApi: InternalApiConfig;\r\n}\r\n\r\nconst getApiUrl = (serverUrl: string | undefined | null, apiConfig: ApiConfig): string => {\r\n if (Utility.isRunningWithinPortals()) {\r\n return new URL(\"_api\", global.window.location.origin).toString() + \"/\";\r\n } else {\r\n if (!serverUrl) serverUrl = Utility.getClientUrl();\r\n return new URL(`api/${apiConfig.path}/v${apiConfig.version}`, serverUrl).toString() + \"/\";\r\n }\r\n};\r\n\r\nconst mergeApiConfigs = (apiConfig: ApiConfig | undefined, apiType: ApiType, internalConfig: InternalConfig): void => {\r\n const internalApiConfig = internalConfig[apiType] as InternalApiConfig;\r\n\r\n if (apiConfig?.version) {\r\n ErrorHelper.stringParameterCheck(apiConfig.version, \"DynamicsWebApi.setConfig\", `config.${apiType}.version`);\r\n internalApiConfig.version = apiConfig.version;\r\n }\r\n\r\n if (apiConfig?.path) {\r\n ErrorHelper.stringParameterCheck(apiConfig.path, \"DynamicsWebApi.setConfig\", `config.${apiType}.path`);\r\n internalApiConfig.path = apiConfig.path;\r\n }\r\n\r\n internalApiConfig.url = getApiUrl(internalConfig.serverUrl, internalApiConfig);\r\n};\r\n\r\nexport class ConfigurationUtility {\r\n static mergeApiConfigs = mergeApiConfigs;\r\n\r\n static merge(internalConfig: InternalConfig, config?: Config): void {\r\n if (config?.serverUrl) {\r\n ErrorHelper.stringParameterCheck(config.serverUrl, \"DynamicsWebApi.setConfig\", \"config.serverUrl\");\r\n internalConfig.serverUrl = config.serverUrl;\r\n }\r\n\r\n mergeApiConfigs(config?.dataApi, \"dataApi\", internalConfig);\r\n mergeApiConfigs(config?.searchApi, \"searchApi\", internalConfig);\r\n\r\n if (config?.impersonate) {\r\n internalConfig.impersonate = ErrorHelper.guidParameterCheck(config.impersonate, \"DynamicsWebApi.setConfig\", \"config.impersonate\");\r\n }\r\n\r\n if (config?.impersonateAAD) {\r\n internalConfig.impersonateAAD = ErrorHelper.guidParameterCheck(config.impersonateAAD, \"DynamicsWebApi.setConfig\", \"config.impersonateAAD\");\r\n }\r\n\r\n if (config?.onTokenRefresh) {\r\n ErrorHelper.callbackParameterCheck(config.onTokenRefresh, \"DynamicsWebApi.setConfig\", \"config.onTokenRefresh\");\r\n internalConfig.onTokenRefresh = config.onTokenRefresh;\r\n }\r\n\r\n if (config?.includeAnnotations) {\r\n ErrorHelper.stringParameterCheck(config.includeAnnotations, \"DynamicsWebApi.setConfig\", \"config.includeAnnotations\");\r\n internalConfig.includeAnnotations = config.includeAnnotations;\r\n }\r\n\r\n if (config?.timeout) {\r\n ErrorHelper.numberParameterCheck(config.timeout, \"DynamicsWebApi.setConfig\", \"config.timeout\");\r\n internalConfig.timeout = config.timeout;\r\n }\r\n\r\n if (config?.maxPageSize) {\r\n ErrorHelper.numberParameterCheck(config.maxPageSize, \"DynamicsWebApi.setConfig\", \"config.maxPageSize\");\r\n internalConfig.maxPageSize = config.maxPageSize;\r\n }\r\n\r\n if (config?.returnRepresentation) {\r\n ErrorHelper.boolParameterCheck(config.returnRepresentation, \"DynamicsWebApi.setConfig\", \"config.returnRepresentation\");\r\n internalConfig.returnRepresentation = config.returnRepresentation;\r\n }\r\n\r\n if (config?.useEntityNames) {\r\n ErrorHelper.boolParameterCheck(config.useEntityNames, \"DynamicsWebApi.setConfig\", \"config.useEntityNames\");\r\n internalConfig.useEntityNames = config.useEntityNames;\r\n }\r\n\r\n if (config?.headers) {\r\n internalConfig.headers = config.headers;\r\n }\r\n\r\n if (!global.DWA_BROWSER && config?.proxy) {\r\n ErrorHelper.parameterCheck(config.proxy, \"DynamicsWebApi.setConfig\", \"config.proxy\");\r\n\r\n if (config.proxy.url) {\r\n ErrorHelper.stringParameterCheck(config.proxy.url, \"DynamicsWebApi.setConfig\", \"config.proxy.url\");\r\n\r\n if (config.proxy.auth) {\r\n ErrorHelper.parameterCheck(config.proxy.auth, \"DynamicsWebApi.setConfig\", \"config.proxy.auth\");\r\n ErrorHelper.stringParameterCheck(config.proxy.auth.username, \"DynamicsWebApi.setConfig\", \"config.proxy.auth.username\");\r\n ErrorHelper.stringParameterCheck(config.proxy.auth.password, \"DynamicsWebApi.setConfig\", \"config.proxy.auth.password\");\r\n }\r\n }\r\n\r\n internalConfig.proxy = config.proxy;\r\n }\r\n }\r\n\r\n static default(): InternalConfig {\r\n return {\r\n serverUrl: null,\r\n impersonate: null,\r\n impersonateAAD: null,\r\n onTokenRefresh: null,\r\n includeAnnotations: null,\r\n maxPageSize: null,\r\n returnRepresentation: null,\r\n proxy: null,\r\n dataApi: {\r\n path: \"data\",\r\n version: \"9.2\",\r\n url: \"\"\r\n },\r\n searchApi: {\r\n path: \"search\",\r\n version: \"1.0\",\r\n url: \"\"\r\n },\r\n };\r\n }\r\n}\r\n", "import { Utility } from \"../utils/Utility\";\r\nimport { InternalConfig } from \"../utils/Config\";\r\nimport { RequestUtility } from \"../utils/Request\";\r\nimport { DynamicsWebApiError, ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { Core } from \"../types\";\r\nimport { executeRequest } from \"./helpers/executeRequest\";\r\nimport { AccessToken } from \"../dynamics-web-api\";\r\n\r\nconst _addResponseParams = (requestId, responseParams) => {\r\n if (_responseParseParams[requestId]) _responseParseParams[requestId].push(responseParams);\r\n else _responseParseParams[requestId] = [responseParams];\r\n};\r\n\r\nconst _addRequestToBatchCollection = (requestId, request) => {\r\n if (_batchRequestCollection[requestId]) _batchRequestCollection[requestId].push(request);\r\n else _batchRequestCollection[requestId] = [request];\r\n};\r\n\r\nconst _clearRequestData = (requestId: string): void => {\r\n delete _responseParseParams[requestId];\r\n if (_batchRequestCollection.hasOwnProperty(requestId)) delete _batchRequestCollection[requestId];\r\n};\r\n\r\nconst _runRequest = async (request: Core.InternalRequest, config: InternalConfig): Promise => {\r\n try {\r\n const result = await RequestClient.sendRequest(request, config);\r\n _clearRequestData(request.requestId!);\r\n\r\n return result;\r\n } catch (error) {\r\n _clearRequestData(request.requestId!);\r\n throw error;\r\n } finally {\r\n _clearRequestData(request.requestId!);\r\n }\r\n};\r\n\r\nlet _batchRequestCollection: Core.BatchRequestCollection = {};\r\nlet _responseParseParams: { [key: string]: any[] } = {};\r\n\r\nexport class RequestClient {\r\n /**\r\n * Sends a request to given URL with given parameters\r\n *\r\n * @param {InternalRequest} request - Composed request to D365 Web Api\r\n * @param {InternalConfig} config - DynamicsWebApi config.\r\n */\r\n static async sendRequest(request: Core.InternalRequest, config: InternalConfig): Promise {\r\n request.headers = request.headers || {};\r\n request.responseParameters = request.responseParameters || {};\r\n request.requestId = request.requestId || Utility.generateUUID();\r\n\r\n //add response parameters to parse\r\n _addResponseParams(request.requestId, request.responseParameters);\r\n\r\n //stringify passed data\r\n let processedData = null;\r\n\r\n const isBatchConverted = request.responseParameters?.convertedToBatch;\r\n\r\n if (request.path === \"$batch\" && !isBatchConverted) {\r\n const batchRequest = _batchRequestCollection[request.requestId];\r\n\r\n if (!batchRequest) throw ErrorHelper.batchIsEmpty();\r\n\r\n const batchResult = RequestUtility.convertToBatch(batchRequest, config, request);\r\n\r\n processedData = batchResult.body;\r\n request.headers = { ...batchResult.headers, ...request.headers };\r\n\r\n //clear an array of requests\r\n delete _batchRequestCollection[request.requestId];\r\n } else {\r\n processedData = !isBatchConverted ? RequestUtility.processData(request.data, config) : request.data;\r\n\r\n if (!isBatchConverted) request.headers = RequestUtility.setStandardHeaders(request.headers);\r\n }\r\n\r\n if (config.impersonate && !request.headers![\"MSCRMCallerID\"]) {\r\n request.headers![\"MSCRMCallerID\"] = config.impersonate;\r\n }\r\n\r\n if (config.impersonateAAD && !request.headers![\"CallerObjectId\"]) {\r\n request.headers![\"CallerObjectId\"] = config.impersonateAAD;\r\n }\r\n\r\n let token: AccessToken | string | null = null;\r\n\r\n //call a token refresh callback only if it is set and there is no \"Authorization\" header set yet\r\n if (config.onTokenRefresh && (!request.headers || (request.headers && !request.headers[\"Authorization\"]))) {\r\n token = await config.onTokenRefresh();\r\n if (!token) throw new Error(\"Token is empty. Request is aborted.\");\r\n }\r\n\r\n if (token) {\r\n request.headers![\"Authorization\"] = \"Bearer \" + (token.hasOwnProperty(\"accessToken\") ? (token as AccessToken).accessToken : token);\r\n }\r\n\r\n if (Utility.isRunningWithinPortals()) {\r\n request.headers![\"__RequestVerificationToken\"] = await global.window.shell!.getTokenDeferred();\r\n }\r\n\r\n const url = request.apiConfig ? request.apiConfig.url : config.dataApi.url;\r\n\r\n return await executeRequest({\r\n method: request.method!,\r\n uri: url!.toString() + request.path,\r\n data: processedData,\r\n additionalHeaders: request.headers,\r\n responseParams: _responseParseParams,\r\n isAsync: request.async,\r\n timeout: request.timeout || config.timeout,\r\n proxy: config.proxy,\r\n requestId: request.requestId!,\r\n abortSignal: request.signal,\r\n });\r\n }\r\n\r\n private static async _getCollectionNames(entityName: string, config: InternalConfig): Promise {\r\n if (!Utility.isNull(RequestUtility.entityNames)) {\r\n return RequestUtility.findCollectionName(entityName) || entityName;\r\n }\r\n\r\n const request = RequestUtility.compose(\r\n {\r\n method: \"GET\",\r\n collection: \"EntityDefinitions\",\r\n select: [\"EntitySetName\", \"LogicalName\"],\r\n noCache: true,\r\n functionName: \"retrieveMultiple\",\r\n },\r\n config\r\n );\r\n\r\n const result = await _runRequest(request, config);\r\n RequestUtility.entityNames = {};\r\n for (let i = 0; i < result.data.value.length; i++) {\r\n RequestUtility.entityNames[result.data.value[i].LogicalName] = result.data.value[i].EntitySetName;\r\n }\r\n\r\n return RequestUtility.findCollectionName(entityName) || entityName;\r\n }\r\n\r\n private static _isEntityNameException(entityName: string): boolean {\r\n const exceptions = [\r\n \"$metadata\",\r\n \"EntityDefinitions\",\r\n \"RelationshipDefinitions\",\r\n \"GlobalOptionSetDefinitions\",\r\n \"ManagedPropertyDefinitions\",\r\n \"query\",\r\n \"suggest\",\r\n \"autocomplete\",\r\n ];\r\n\r\n return exceptions.indexOf(entityName) > -1;\r\n }\r\n\r\n private static async _checkCollectionName(entityName: string | null | undefined, config: InternalConfig): Promise {\r\n if (!entityName || RequestClient._isEntityNameException(entityName)) {\r\n return entityName;\r\n }\r\n\r\n entityName = entityName.toLowerCase();\r\n\r\n if (!config.useEntityNames) {\r\n return entityName;\r\n }\r\n\r\n try {\r\n return await RequestClient._getCollectionNames(entityName, config);\r\n } catch (error: any) {\r\n throw new Error(\"Unable to fetch Collection Names. Error: \" + (error as DynamicsWebApiError).message);\r\n }\r\n }\r\n\r\n static async makeRequest(request: Core.InternalRequest, config: InternalConfig): Promise {\r\n request.responseParameters = request.responseParameters || {};\r\n //we don't want to mix headers set by the library and by the user\r\n request.userHeaders = request.headers;\r\n delete request.headers;\r\n\r\n if (!request.isBatch) {\r\n const collectionName = await RequestClient._checkCollectionName(request.collection, config);\r\n\r\n request.collection = collectionName;\r\n RequestUtility.compose(request, config);\r\n request.responseParameters.convertedToBatch = false;\r\n\r\n //the URL contains more characters than max possible limit, convert the request to a batch request\r\n if (request.path!.length > 2000) {\r\n const batchRequest = RequestUtility.convertToBatch([request], config);\r\n\r\n request.method = \"POST\";\r\n request.path = \"$batch\";\r\n request.data = batchRequest.body;\r\n request.headers = { ...batchRequest.headers, ...request.userHeaders };\r\n request.responseParameters.convertedToBatch = true;\r\n }\r\n\r\n return _runRequest(request, config);\r\n }\r\n\r\n //no need to make a request to web api if it's a part of batch\r\n RequestUtility.compose(request, config);\r\n //add response parameters to parse\r\n _addResponseParams(request.requestId, request.responseParameters);\r\n _addRequestToBatchCollection(request.requestId, request);\r\n }\r\n\r\n static _clearTestData(): void {\r\n RequestUtility.entityNames = null;\r\n _responseParseParams = {};\r\n _batchRequestCollection = {};\r\n }\r\n\r\n static getCollectionName(entityName: string): string | null {\r\n return RequestUtility.findCollectionName(entityName);\r\n }\r\n}\r\n", "import { Utility } from \"./Utility\";\r\nimport { Config, HeaderCollection } from \"../dynamics-web-api\";\r\nimport { ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { Core } from \"../types\";\r\nimport { InternalConfig } from \"./Config\";\r\n\r\n/**\r\n * @typedef {Object} ConvertedRequestOptions\r\n * @property {string} url URL (without query)\r\n * @property {string} query Query String\r\n * @property {Object} headers Heades object (always an Object; can be empty: {})\r\n */\r\n\r\n/**\r\n * @typedef {Object} ConvertedRequest\r\n * @property {string} url URL (including Query String)\r\n * @property {Object} headers Heades object (always an Object; can be empty: {})\r\n * @property {boolean} async\r\n */\r\n\r\nexport class RequestUtility {\r\n /**\r\n * Converts a request object to URL link\r\n *\r\n * @param {Object} request - Request object\r\n * @param {Object} [config] - DynamicsWebApi config\r\n * @returns {ConvertedRequest} Converted request\r\n */\r\n static compose(request: Core.InternalRequest, config: InternalConfig): Core.InternalRequest {\r\n request.path = request.path || \"\";\r\n request.functionName = request.functionName || \"\";\r\n if (!request.url) {\r\n if (!request._isUnboundRequest && !request.contentId && !request.collection) {\r\n ErrorHelper.parameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, \"request.collection\");\r\n }\r\n if (request.collection != null) {\r\n ErrorHelper.stringParameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, \"request.collection\");\r\n request.path = request.collection;\r\n\r\n //add alternate key feature\r\n if (request.key) {\r\n request.key = ErrorHelper.keyParameterCheck(request.key, `DynamicsWebApi.${request.functionName}`, \"request.key\");\r\n request.path += `(${request.key})`;\r\n }\r\n }\r\n\r\n if (request.contentId) {\r\n ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, \"request.contentId\");\r\n if (request.contentId.startsWith(\"$\")) {\r\n request.path = request.path ? `${request.contentId}/${request.path}` : request.contentId;\r\n }\r\n }\r\n\r\n if (request._additionalUrl) {\r\n if (request.path) {\r\n request.path += \"/\";\r\n }\r\n request.path += request._additionalUrl;\r\n }\r\n\r\n request.path = RequestUtility.composeUrl(request, config, request.path);\r\n\r\n if (request.fetchXml) {\r\n ErrorHelper.stringParameterCheck(request.fetchXml, `DynamicsWebApi.${request.functionName}`, \"request.fetchXml\");\r\n let join = request.path.indexOf(\"?\") === -1 ? \"?\" : \"&\";\r\n request.path += `${join}fetchXml=${encodeURIComponent(request.fetchXml)}`;\r\n }\r\n } else {\r\n ErrorHelper.stringParameterCheck(request.url, `DynamicsWebApi.${request.functionName}`, \"request.url\");\r\n request.path = request.url.replace(config.dataApi.url, \"\");\r\n }\r\n\r\n if (request.hasOwnProperty(\"async\") && request.async != null) {\r\n ErrorHelper.boolParameterCheck(request.async, `DynamicsWebApi.${request.functionName}`, \"request.async\");\r\n } else {\r\n request.async = true;\r\n }\r\n\r\n request.headers = RequestUtility.composeHeaders(request, config);\r\n\r\n return request;\r\n }\r\n\r\n /**\r\n * Converts optional parameters of the request to URL. If expand parameter exists this function is called recursively.\r\n *\r\n * @param {Object} request - Request object\r\n * @param {string} request.functionName - Name of the function that converts a request (for Error Handling)\r\n * @param {string} url - URL beginning (with required parameters)\r\n * @param {string} [joinSymbol] - URL beginning (with required parameters)\r\n * @param {Object} [config] - DynamicsWebApi config\r\n * @returns {ConvertedRequestOptions} Additional options in request\r\n */\r\n static composeUrl(request: Core.InternalRequest, config: Config, url: string = \"\", joinSymbol: string = \"&\"): string {\r\n const queryArray: string[] = [];\r\n\r\n if (request) {\r\n if (request.navigationProperty) {\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, `DynamicsWebApi.${request.functionName}`, \"request.navigationProperty\");\r\n url += \"/\" + request.navigationProperty;\r\n\r\n if (request.navigationPropertyKey) {\r\n let navigationKey = ErrorHelper.keyParameterCheck(\r\n request.navigationPropertyKey,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.navigationPropertyKey\"\r\n );\r\n url += \"(\" + navigationKey + \")\";\r\n }\r\n\r\n if (request.navigationProperty === \"Attributes\") {\r\n if (request.metadataAttributeType) {\r\n ErrorHelper.stringParameterCheck(\r\n request.metadataAttributeType,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.metadataAttributeType\"\r\n );\r\n url += \"/\" + request.metadataAttributeType;\r\n }\r\n }\r\n }\r\n\r\n if (request.select?.length) {\r\n ErrorHelper.arrayParameterCheck(request.select, `DynamicsWebApi.${request.functionName}`, \"request.select\");\r\n\r\n if (request.functionName == \"retrieve\" && request.select.length == 1 && request.select[0].endsWith(\"/$ref\")) {\r\n url += \"/\" + request.select[0];\r\n } else {\r\n if (request.select[0].startsWith(\"/\") && request.functionName == \"retrieve\") {\r\n if (request.navigationProperty == null) {\r\n url += request.select.shift();\r\n } else {\r\n request.select.shift();\r\n }\r\n }\r\n\r\n //check if anything left in the array\r\n if (request.select.length) {\r\n queryArray.push(\"$select=\" + request.select.join(\",\"));\r\n }\r\n }\r\n }\r\n\r\n if (request.filter) {\r\n ErrorHelper.stringParameterCheck(request.filter, `DynamicsWebApi.${request.functionName}`, \"request.filter\");\r\n const removeBracketsFromGuidReg = /[^\"']{([\\w\\d]{8}[-]?(?:[\\w\\d]{4}[-]?){3}[\\w\\d]{12})}(?:[^\"']|$)/g;\r\n let filterResult = request.filter;\r\n\r\n //fix bug 2018-06-11\r\n let m: RegExpExecArray | null = null;\r\n while ((m = removeBracketsFromGuidReg.exec(filterResult)) !== null) {\r\n if (m.index === removeBracketsFromGuidReg.lastIndex) {\r\n removeBracketsFromGuidReg.lastIndex++;\r\n }\r\n\r\n let replacement = m[0].endsWith(\")\") ? \")\" : \" \";\r\n filterResult = filterResult.replace(m[0], \" \" + m[1] + replacement);\r\n }\r\n\r\n queryArray.push(\"$filter=\" + encodeURIComponent(filterResult));\r\n }\r\n\r\n if (request.fieldName) {\r\n ErrorHelper.stringParameterCheck(request.fieldName, `DynamicsWebApi.${request.functionName}`, \"request.fieldName\");\r\n url += \"/\" + request.fieldName;\r\n }\r\n\r\n if (request.savedQuery) {\r\n queryArray.push(\r\n \"savedQuery=\" + ErrorHelper.guidParameterCheck(request.savedQuery, `DynamicsWebApi.${request.functionName}`, \"request.savedQuery\")\r\n );\r\n }\r\n\r\n if (request.userQuery) {\r\n queryArray.push(\r\n \"userQuery=\" + ErrorHelper.guidParameterCheck(request.userQuery, `DynamicsWebApi.${request.functionName}`, \"request.userQuery\")\r\n );\r\n }\r\n\r\n if (request.apply) {\r\n ErrorHelper.stringParameterCheck(request.apply, `DynamicsWebApi.${request.functionName}`, \"request.apply\");\r\n queryArray.push(\"$apply=\" + request.apply);\r\n }\r\n\r\n if (request.count) {\r\n ErrorHelper.boolParameterCheck(request.count, `DynamicsWebApi.${request.functionName}`, \"request.count\");\r\n queryArray.push(\"$count=\" + request.count);\r\n }\r\n\r\n if (request.top && request.top > 0) {\r\n ErrorHelper.numberParameterCheck(request.top, `DynamicsWebApi.${request.functionName}`, \"request.top\");\r\n queryArray.push(\"$top=\" + request.top);\r\n }\r\n\r\n if (request.orderBy != null && request.orderBy.length) {\r\n ErrorHelper.arrayParameterCheck(request.orderBy, `DynamicsWebApi.${request.functionName}`, \"request.orderBy\");\r\n queryArray.push(\"$orderby=\" + request.orderBy.join(\",\"));\r\n }\r\n\r\n if (request.partitionId) {\r\n ErrorHelper.stringParameterCheck(request.partitionId, `DynamicsWebApi.${request.functionName}`, \"request.partitionId\");\r\n queryArray.push(\"partitionid='\" + request.partitionId + \"'\");\r\n }\r\n\r\n if (request.downloadSize) {\r\n ErrorHelper.stringParameterCheck(request.downloadSize, `DynamicsWebApi.${request.functionName}`, \"request.downloadSize\");\r\n queryArray.push(\"size=\" + request.downloadSize);\r\n }\r\n\r\n if (request.queryParams?.length) {\r\n ErrorHelper.arrayParameterCheck(request.queryParams, `DynamicsWebApi.${request.functionName}`, \"request.queryParams\");\r\n queryArray.push(request.queryParams.join(\"&\"));\r\n }\r\n\r\n if (request.fileName) {\r\n ErrorHelper.stringParameterCheck(request.fileName, `DynamicsWebApi.${request.functionName}`, \"request.fileName\");\r\n queryArray.push(\"x-ms-file-name=\" + request.fileName);\r\n }\r\n\r\n if (request.data) {\r\n ErrorHelper.parameterCheck(request.data, `DynamicsWebApi.${request.functionName}`, \"request.data\");\r\n }\r\n\r\n if (request.isBatch) {\r\n ErrorHelper.boolParameterCheck(request.isBatch, `DynamicsWebApi.${request.functionName}`, \"request.isBatch\");\r\n }\r\n\r\n if (!Utility.isNull(request.inChangeSet)) {\r\n ErrorHelper.boolParameterCheck(request.inChangeSet, `DynamicsWebApi.${request.functionName}`, \"request.inChangeSet\");\r\n }\r\n\r\n if (request.isBatch && Utility.isNull(request.inChangeSet)) request.inChangeSet = true;\r\n\r\n if (request.timeout) {\r\n ErrorHelper.numberParameterCheck(request.timeout, `DynamicsWebApi.${request.functionName}`, \"request.timeout\");\r\n }\r\n\r\n if (request.expand?.length) {\r\n ErrorHelper.stringOrArrayParameterCheck(request.expand, `DynamicsWebApi.${request.functionName}`, \"request.expand\");\r\n if (typeof request.expand === \"string\") {\r\n queryArray.push(\"$expand=\" + request.expand);\r\n } else {\r\n const expandQueryArray: string[] = [];\r\n for (let i = 0; i < request.expand.length; i++) {\r\n if (request.expand[i].property) {\r\n const expand = request.expand[i];\r\n expand.functionName = `${request.functionName} $expand`;\r\n let expandConverted = RequestUtility.composeUrl(expand, config, \"\", \";\");\r\n if (expandConverted) {\r\n expandConverted = `(${expandConverted.substr(1)})`;\r\n }\r\n expandQueryArray.push(request.expand[i].property + expandConverted);\r\n }\r\n }\r\n if (expandQueryArray.length) {\r\n queryArray.push(\"$expand=\" + expandQueryArray.join(\",\"));\r\n }\r\n }\r\n }\r\n }\r\n\r\n return !queryArray.length ? url : url + \"?\" + queryArray.join(joinSymbol);\r\n }\r\n\r\n static composeHeaders(request: Core.InternalRequest, config: Config): HeaderCollection {\r\n const headers: HeaderCollection = { ...config.headers, ...request.userHeaders };\r\n\r\n const prefer = RequestUtility.composePreferHeader(request, config);\r\n if (prefer.length) {\r\n headers[\"Prefer\"] = prefer;\r\n }\r\n\r\n if (request.collection === \"$metadata\") {\r\n headers[\"Accept\"] = \"application/xml\";\r\n }\r\n\r\n if (request.transferMode) {\r\n headers[\"x-ms-transfer-mode\"] = request.transferMode;\r\n }\r\n\r\n if (request.ifmatch != null && request.ifnonematch != null) {\r\n throw new Error(\r\n `DynamicsWebApi.${request.functionName}. Either one of request.ifmatch or request.ifnonematch parameters should be used in a call, not both.`\r\n );\r\n }\r\n\r\n if (request.ifmatch) {\r\n ErrorHelper.stringParameterCheck(request.ifmatch, `DynamicsWebApi.${request.functionName}`, \"request.ifmatch\");\r\n headers[\"If-Match\"] = request.ifmatch;\r\n }\r\n\r\n if (request.ifnonematch) {\r\n ErrorHelper.stringParameterCheck(request.ifnonematch, `DynamicsWebApi.${request.functionName}`, \"request.ifnonematch\");\r\n headers[\"If-None-Match\"] = request.ifnonematch;\r\n }\r\n\r\n if (request.impersonate) {\r\n ErrorHelper.stringParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, \"request.impersonate\");\r\n headers[\"MSCRMCallerID\"] = ErrorHelper.guidParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, \"request.impersonate\");\r\n }\r\n\r\n if (request.impersonateAAD) {\r\n ErrorHelper.stringParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, \"request.impersonateAAD\");\r\n headers[\"CallerObjectId\"] = ErrorHelper.guidParameterCheck(\r\n request.impersonateAAD,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.impersonateAAD\"\r\n );\r\n }\r\n\r\n if (request.token) {\r\n ErrorHelper.stringParameterCheck(request.token, `DynamicsWebApi.${request.functionName}`, \"request.token\");\r\n headers[\"Authorization\"] = \"Bearer \" + request.token;\r\n }\r\n\r\n if (request.duplicateDetection) {\r\n ErrorHelper.boolParameterCheck(request.duplicateDetection, `DynamicsWebApi.${request.functionName}`, \"request.duplicateDetection\");\r\n headers[\"MSCRM.SuppressDuplicateDetection\"] = \"false\";\r\n }\r\n\r\n if (request.bypassCustomPluginExecution) {\r\n ErrorHelper.boolParameterCheck(\r\n request.bypassCustomPluginExecution,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.bypassCustomPluginExecution\"\r\n );\r\n headers[\"MSCRM.BypassCustomPluginExecution\"] = \"true\";\r\n }\r\n\r\n if (request.noCache) {\r\n ErrorHelper.boolParameterCheck(request.noCache, `DynamicsWebApi.${request.functionName}`, \"request.noCache\");\r\n headers[\"Cache-Control\"] = \"no-cache\";\r\n }\r\n\r\n if (request.mergeLabels) {\r\n ErrorHelper.boolParameterCheck(request.mergeLabels, `DynamicsWebApi.${request.functionName}`, \"request.mergeLabels\");\r\n headers[\"MSCRM.MergeLabels\"] = \"true\";\r\n }\r\n\r\n if (request.contentId) {\r\n ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, \"request.contentId\");\r\n if (!request.contentId.startsWith(\"$\")) {\r\n headers[\"Content-ID\"] = request.contentId;\r\n }\r\n }\r\n\r\n if (request.contentRange) {\r\n ErrorHelper.stringParameterCheck(request.contentRange, `DynamicsWebApi.${request.functionName}`, \"request.contentRange\");\r\n headers[\"Content-Range\"] = request.contentRange;\r\n }\r\n\r\n if (request.range) {\r\n ErrorHelper.stringParameterCheck(request.range, `DynamicsWebApi.${request.functionName}`, \"request.range\");\r\n headers[\"Range\"] = request.range;\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n static composePreferHeader(request: Core.InternalRequest, config: Config): string {\r\n let returnRepresentation: boolean | null | undefined = request.returnRepresentation;\r\n let includeAnnotations: string | null | undefined = request.includeAnnotations;\r\n let maxPageSize: number | null | undefined = request.maxPageSize;\r\n let trackChanges: boolean | null | undefined = request.trackChanges;\r\n let continueOnError: boolean | null | undefined = request.continueOnError;\r\n\r\n let prefer: string[] = [];\r\n\r\n if (request.prefer && request.prefer.length) {\r\n ErrorHelper.stringOrArrayParameterCheck(request.prefer, `DynamicsWebApi.${request.functionName}`, \"request.prefer\");\r\n if (typeof request.prefer === \"string\") {\r\n prefer = request.prefer.split(\",\");\r\n }\r\n for (let i in prefer) {\r\n let item = prefer[i].trim();\r\n if (item === \"return=representation\") {\r\n returnRepresentation = true;\r\n } else if (item.includes(\"odata.include-annotations=\")) {\r\n includeAnnotations = item.replace(\"odata.include-annotations=\", \"\").replace(/\"/g, \"\");\r\n } else if (item.startsWith(\"odata.maxpagesize=\")) {\r\n maxPageSize = Number(item.replace(\"odata.maxpagesize=\", \"\").replace(/\"/g, \"\")) || 0;\r\n } else if (item.includes(\"odata.track-changes\")) {\r\n trackChanges = true;\r\n } else if (item.includes(\"odata.continue-on-error\")) {\r\n continueOnError = true;\r\n }\r\n }\r\n }\r\n\r\n //clear array\r\n prefer = [];\r\n\r\n if (config) {\r\n if (returnRepresentation == null) {\r\n returnRepresentation = config.returnRepresentation;\r\n }\r\n includeAnnotations = includeAnnotations ? includeAnnotations : config.includeAnnotations;\r\n maxPageSize = maxPageSize ? maxPageSize : config.maxPageSize;\r\n }\r\n\r\n if (returnRepresentation) {\r\n ErrorHelper.boolParameterCheck(returnRepresentation, `DynamicsWebApi.${request.functionName}`, \"request.returnRepresentation\");\r\n prefer.push(\"return=representation\");\r\n }\r\n\r\n if (includeAnnotations) {\r\n ErrorHelper.stringParameterCheck(includeAnnotations, `DynamicsWebApi.${request.functionName}`, \"request.includeAnnotations\");\r\n prefer.push(`odata.include-annotations=\"${includeAnnotations}\"`);\r\n }\r\n\r\n if (maxPageSize && maxPageSize > 0) {\r\n ErrorHelper.numberParameterCheck(maxPageSize, `DynamicsWebApi.${request.functionName}`, \"request.maxPageSize\");\r\n prefer.push(\"odata.maxpagesize=\" + maxPageSize);\r\n }\r\n\r\n if (trackChanges) {\r\n ErrorHelper.boolParameterCheck(trackChanges, `DynamicsWebApi.${request.functionName}`, \"request.trackChanges\");\r\n prefer.push(\"odata.track-changes\");\r\n }\r\n\r\n if (continueOnError) {\r\n ErrorHelper.boolParameterCheck(continueOnError, `DynamicsWebApi.${request.functionName}`, \"request.continueOnError\");\r\n prefer.push(\"odata.continue-on-error\");\r\n }\r\n\r\n return prefer.join(\",\");\r\n }\r\n\r\n static convertToBatch(requests: Core.InternalRequest[], config: InternalConfig, batchRequest?: Core.InternalRequest): Core.InternalBatchRequest {\r\n const batchBoundary = `dwa_batch_${Utility.generateUUID()}`;\r\n\r\n const batchBody: string[] = [];\r\n let currentChangeSet: string | null = null;\r\n let contentId = 100000;\r\n\r\n requests.forEach((internalRequest) => {\r\n internalRequest.functionName = \"executeBatch\";\r\n if (batchRequest?.inChangeSet === false) internalRequest.inChangeSet = false;\r\n const inChangeSet = internalRequest.method === \"GET\" ? false : !!internalRequest.inChangeSet;\r\n\r\n if (!inChangeSet && currentChangeSet) {\r\n //end current change set\r\n batchBody.push(`\\n--${currentChangeSet}--`);\r\n\r\n currentChangeSet = null;\r\n contentId = 100000;\r\n }\r\n\r\n if (!currentChangeSet) {\r\n batchBody.push(`\\n--${batchBoundary}`);\r\n\r\n if (inChangeSet) {\r\n currentChangeSet = `changeset_${Utility.generateUUID()}`;\r\n batchBody.push(\"Content-Type: multipart/mixed;boundary=\" + currentChangeSet);\r\n }\r\n }\r\n\r\n if (inChangeSet) {\r\n batchBody.push(`\\n--${currentChangeSet}`);\r\n }\r\n\r\n batchBody.push(\"Content-Type: application/http\");\r\n batchBody.push(\"Content-Transfer-Encoding: binary\");\r\n\r\n if (inChangeSet) {\r\n const contentIdValue = internalRequest.headers!.hasOwnProperty(\"Content-ID\") ? internalRequest.headers![\"Content-ID\"] : ++contentId;\r\n\r\n batchBody.push(`Content-ID: ${contentIdValue}`);\r\n }\r\n\r\n if (!internalRequest.path?.startsWith(\"$\")) {\r\n batchBody.push(`\\n${internalRequest.method} ${config.dataApi.url}${internalRequest.path} HTTP/1.1`);\r\n } else {\r\n batchBody.push(`\\n${internalRequest.method} ${internalRequest.path} HTTP/1.1`);\r\n }\r\n\r\n if (internalRequest.method === \"GET\") {\r\n batchBody.push(\"Accept: application/json\");\r\n } else {\r\n batchBody.push(\"Content-Type: application/json\");\r\n }\r\n\r\n for (let key in internalRequest.headers) {\r\n if (key === \"Authorization\" || key === \"Content-ID\") continue;\r\n\r\n batchBody.push(`${key}: ${internalRequest.headers[key]}`);\r\n }\r\n\r\n if (internalRequest.data) {\r\n batchBody.push(`\\n${RequestUtility.processData(internalRequest.data, config)}`);\r\n }\r\n });\r\n\r\n if (currentChangeSet) {\r\n batchBody.push(`\\n--${currentChangeSet}--`);\r\n }\r\n\r\n batchBody.push(`\\n--${batchBoundary}--`);\r\n\r\n const headers = RequestUtility.setStandardHeaders(batchRequest?.userHeaders);\r\n headers[\"Content-Type\"] = `multipart/mixed;boundary=${batchBoundary}`;\r\n\r\n return { headers: headers, body: batchBody.join(\"\\n\") };\r\n }\r\n\r\n static entityNames: any = null;\r\n\r\n static findCollectionName(entityName: string): string | null {\r\n let collectionName = null;\r\n\r\n if (!Utility.isNull(RequestUtility.entityNames)) {\r\n collectionName = RequestUtility.entityNames[entityName];\r\n if (Utility.isNull(collectionName)) {\r\n for (let key in RequestUtility.entityNames) {\r\n if (RequestUtility.entityNames[key] === entityName) {\r\n return entityName;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return collectionName;\r\n }\r\n\r\n static processData(data: any, config: InternalConfig): string | Uint8Array | Uint16Array | Uint32Array | null {\r\n let stringifiedData: string | null = null;\r\n if (data) {\r\n if (data instanceof Uint8Array || data instanceof Uint16Array || data instanceof Uint32Array) return data;\r\n\r\n stringifiedData = JSON.stringify(data, (key, value) => {\r\n if (key.endsWith(\"@odata.bind\") || key.endsWith(\"@odata.id\")) {\r\n if (typeof value === \"string\" && !value.startsWith(\"$\")) {\r\n //remove brackets in guid\r\n if (/\\(\\{[\\w\\d-]+\\}\\)/g.test(value)) {\r\n value = value.replace(/(.+)\\(\\{([\\w\\d-]+)\\}\\)/g, \"$1($2)\");\r\n }\r\n\r\n if (config.useEntityNames) {\r\n //replace entity name with collection name\r\n const regularExpression = /([\\w_]+)(\\([\\d\\w-]+\\))$/;\r\n const valueParts = regularExpression.exec(value);\r\n if (valueParts && valueParts.length > 2) {\r\n const collectionName = RequestUtility.findCollectionName(valueParts[1]);\r\n\r\n if (!Utility.isNull(collectionName)) {\r\n value = value.replace(regularExpression, collectionName + \"$2\");\r\n }\r\n }\r\n }\r\n\r\n if (!value.startsWith(config.dataApi.url)) {\r\n //add full web api url if it's not set\r\n if (key.endsWith(\"@odata.bind\")) {\r\n if (!value.startsWith(\"/\")) {\r\n value = \"/\" + value;\r\n }\r\n } else {\r\n value = config.dataApi.url + value.replace(/^\\//, \"\");\r\n }\r\n }\r\n }\r\n } else if (key.startsWith(\"oData\") || key.endsWith(\"_Formatted\") || key.endsWith(\"_NavigationProperty\") || key.endsWith(\"_LogicalName\")) {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n });\r\n\r\n stringifiedData = stringifiedData.replace(/[\\u007F-\\uFFFF]/g, function (chr: string) {\r\n return \"\\\\u\" + (\"0000\" + chr.charCodeAt(0).toString(16)).slice(-4);\r\n });\r\n }\r\n\r\n return stringifiedData;\r\n }\r\n\r\n static setStandardHeaders(headers: HeaderCollection = {}): any {\r\n if (!headers[\"Accept\"]) headers[\"Accept\"] = \"application/json\";\r\n if (!headers[\"OData-MaxVersion\"]) headers[\"OData-MaxVersion\"] = \"4.0\";\r\n if (!headers[\"OData-Version\"]) headers[\"OData-Version\"] = \"4.0\";\r\n if (headers[\"Content-Range\"]) headers[\"Content-Type\"] = \"application/octet-stream\";\r\n else if (!headers[\"Content-Type\"]) headers[\"Content-Type\"] = \"application/json; charset=utf-8\";\r\n\r\n return headers;\r\n }\r\n}\r\n", "import { Core } from \"../../types\";\r\n\r\nexport async function executeRequest(options: Core.RequestOptions): Promise {\r\n return global.DWA_BROWSER ? require(\"../xhr\").executeRequest(options) : require(\"../http\").executeRequest(options);\r\n}\r\n"], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAIO,SAAS,YAAa;AACzB,SAAO,mBAAAA;AACX;AANA,IAEA;AAFA;AAAA;AAAA;AAEA,yBAAoB;AAAA;AAAA;;;ACFb,SAASC,aAAwB;AACpC,SAAO,QAAqB,OAAO,OAAO,SAAS,0CAAyB,UAAU;AAC1F;AAEO,SAAS,sBAAsB;AAClC,SAAO,QAAqBA,WAAU,EAAE,gBAAgB,IAAI,WAAW,CAAC,CAAC,IAAIA,WAAU,EAAE,YAAY,CAAC;AAC1G;AANA;AAAA;AAAA;AAAA;AAAA;;;ACEO,SAAS,OAAO,OAAwB;AAC3C,QAAM,QAAQ,IAAI,OAAO,MAAM,GAAG,EAAE,KAAK,KAAK;AAC9C,SAAO,CAAC,CAAC;AACb;AAEO,SAAS,YAAY,OAA8B;AACtD,QAAM,QAAQ,IAAI,OAAO,SAAS,OAAO,QAAQ,GAAG,EAAE,KAAK,KAAK;AAChE,SAAO,QAAQ,MAAM,CAAC,IAAI;AAC9B;AAEO,SAAS,mBAAmB,KAA4B;AAC3D,QAAM,QAAQ,IAAI,OAAO,MAAM,OAAO,SAAS,GAAG,EAAE,KAAK,GAAG;AAC5D,SAAO,QAAQ,MAAM,CAAC,IAAI;AAC9B;AAfA,IAAM;AAAN;AAAA;AAAA;AAAA,IAAM,OAAO;AAAA;AAAA;;;ACAb,IAgBM,mBAEO;AAlBb;AAAA;AAAA;AACA;AACA;AAcA,IAAM,oBAAoB;AAEnB,IAAM,WAAN,MAAM,SAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOjB,OAAO,wBAAwB,YAA2C;AACtE,YAAI,YAAY;AACZ,gBAAM,iBAAiB,OAAO,KAAK,UAAU;AAC7C,gBAAM,iBAA2B,CAAC;AAClC,gBAAM,WAAqB,CAAC;AAE5B,mBAAS,IAAI,GAAG,KAAK,eAAe,QAAQ,KAAK;AAC7C,kBAAM,gBAAgB,eAAe,IAAI,CAAC;AAC1C,gBAAI,QAAQ,WAAW,aAAa;AAEpC,gBAAI,SAAS;AAAM;AAEnB,gBAAI,OAAO,UAAU,YAAY,CAAC,MAAM,WAAW,wBAAwB,KAAK,CAAC,OAAO,KAAK,GAAG;AAC5F,sBAAQ,IAAI,KAAK;AAAA,YACrB,WAAW,OAAO,UAAU,UAAU;AAClC,sBAAQ,KAAK,UAAU,KAAK;AAAA,YAChC;AAEA,2BAAe,KAAK,GAAG,aAAa,MAAM,CAAC,EAAE;AAC7C,qBAAS,KAAK,KAAK,CAAC,IAAI,YAAY,KAAK,KAAK,KAAK,EAAE;AAAA,UACzD;AAEA,iBAAO;AAAA,YACH,KAAK,IAAI,eAAe,KAAK,GAAG,CAAC;AAAA,YACjC,aAAa;AAAA,UACjB;AAAA,QACJ,OAAO;AACH,iBAAO;AAAA,YACH,KAAK;AAAA,UACT;AAAA,QACJ;AAAA,MACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,OAAO,wBAAwB,cAAsB,IAAI,oBAA4B,GAAwB;AAEzG,sBAAc,mBAAmB,mBAAmB,WAAW,CAAC;AAEhE,cAAM,OAAO,mDAAmD,KAAK,WAAW;AAEhF,YAAI,QAAQ,MAAM;AACd,cAAI,OAAO,SAAS,KAAK,CAAC,CAAC;AAC3B,iBAAO;AAAA,YACH,QAAQ,KAAK,CAAC,EACT,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,OAAO,GAAG,EAClB,QAAQ,OAAO,QAAa;AAAA,YACjC;AAAA,YACA,UAAU,OAAO;AAAA,UACrB;AAAA,QACJ,OAAO;AAEH,iBAAO;AAAA,YACH,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,UAAU,oBAAoB;AAAA,UAClC;AAAA,QACJ;AAAA,MACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAYA,OAAO,yBAAyB,cAAyC;AACrE,cAAM,SAAS,8DAA8D,KAAK,aAAa,WAAW,CAAC;AAC3G,eAAO,EAAE,IAAI,OAAQ,CAAC,GAAG,YAAY,OAAQ,CAAC,GAAG,cAAc,aAAa,gBAAgB,EAAE;AAAA,MAClG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,OAAO,OAAO,OAAqB;AAC/B,eAAO,OAAO,UAAU,eAAe,SAAS;AAAA,MACpD;AAAA;AAAA,MAGA,OAAO,eAAuB;AAC1B,gBAAa,CAAC,GAAG,IAAI,OAAO,OAAO,OAAO,OAAO,QAAQ,UAAU,CAAC,OAAO,IAAK,oBAAoB,EAAE,CAAC,IAAK,MAAO,IAAI,GAAM,SAAS,EAAE,CAAC;AAAA,MAC7I;AAAA,MAEA,OAAO,gBAAqB;AACxB,YAAI,OAAO,qBAAqB,aAAa;AACzC,iBAAO,iBAAiB;AAAA,QAC5B,OAAO;AACH,cAAI,OAAO,QAAQ,aAAa;AAE5B,gBAAI,CAAC,SAAQ,OAAO,IAAI,OAAO,KAAK,CAAC,SAAQ,OAAO,IAAI,QAAQ,gBAAgB,GAAG;AAC/E,qBAAO,IAAI,QAAQ,iBAAiB;AAAA,YACxC,WAAW,CAAC,SAAQ,OAAO,IAAI,IAAI,KAAK,CAAC,SAAQ,OAAO,IAAI,KAAK,OAAO,GAAG;AACvE,qBAAO,IAAI,KAAK;AAAA,YACpB;AAAA,UACJ;AAAA,QACJ;AAEA,cAAM,IAAI;AAAA,UACN;AAAA,QACJ;AAAA,MACJ;AAAA;AAAA;AAAA;AAAA,MAMA,OAAO,eAAuB;AAC1B,cAAM,UAAU,SAAQ,cAAc;AAEtC,YAAI,YAAY,QAAQ,aAAa;AAErC,YAAI,UAAU,MAAM,KAAK,GAAG;AACxB,sBAAY,UAAU,UAAU,GAAG,UAAU,SAAS,CAAC;AAAA,QAC3D;AACA,eAAO;AAAA,MACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,OAAO,yBAAkC;AACrC,eAAO,QAAqB,CAAC,CAAC,OAAO,OAAO,QAAQ;AAAA,MACxD;AAAA,MAEA,OAAO,SAAS,KAAmB;AAC/B,eAAO,OAAO,QAAQ,YAAY,CAAC,CAAC,OAAO,CAAC,MAAM,QAAQ,GAAG,KAAK,OAAO,UAAU,SAAS,KAAK,GAAG,MAAM;AAAA,MAC9G;AAAA,MAEA,OAAO,WAAoB,KAAU,cAA4B;AAC7D,YAAI,SAAS,CAAC;AACd,iBAAS,QAAQ,KAAK;AAClB,cAAI,IAAI,eAAe,IAAI,KAAK,EAAC,6CAAc,SAAS,QAAO;AAE3D,gBAAI,SAAQ,SAAS,IAAI,IAAI,CAAC,GAAG;AAC7B,qBAAO,IAAI,IAAI,SAAQ,WAAW,IAAI,IAAI,CAAC;AAAA,YAC/C,WAAW,MAAM,QAAQ,IAAI,IAAI,CAAC,GAAG;AACjC,qBAAO,IAAI,IAAI,IAAI,IAAI,EAAE,MAAM;AAAA,YACnC,OAAO;AACH,qBAAO,IAAI,IAAI,IAAI,IAAI;AAAA,YAC3B;AAAA,UACJ;AAAA,QACJ;AACA,eAAU;AAAA,MACd;AAAA,MAEA,OAAO,YAAY,KAAU,eAAyB,CAAC,GAAyB;AAE5E,YAAI,CAAC,aAAa,SAAS,QAAQ;AAAG,uBAAa,KAAK,QAAQ;AAEhE,cAAM,SAAS,SAAQ,WAAiC,KAAK,YAAY;AACzE,eAAO,SAAS,IAAI;AAEpB,eAAO;AAAA,MACX;AAAA,MAEA,OAAO,aAAa,SAA+B,YAAiC,WAAmB,QAAsB;AACzH,iBAAS,UAAU;AAEnB,cAAM,QAAQ,SAAS,YAAY,WAAW,SAAS,WAAW,SAAS,YAAY;AAEvF,YAAI;AAEJ,YAAI,OAAoB;AACpB,oBAAU,IAAI,WAAW,KAAK;AAC9B,mBAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC5B,oBAAQ,CAAC,IAAI,WAAW,SAAS,CAAC;AAAA,UACtC;AAAA,QACJ,OAAO;AACH,oBAAU,WAAW,MAAM,QAAQ,SAAS,KAAK;AAAA,QACrD;AAEA,gBAAQ,OAAO;AACf,gBAAQ,eAAe,WAAW,SAAS,OAAO,SAAS,QAAQ,KAAK,MAAM,WAAW;AAAA,MAC7F;AAAA,MAEA,OAAO,oBAAoB,cAA2C;AAClE,YAAI;AAAqB,iBAAO,OAAO,KAAK,cAAc,QAAQ;AAElE,cAAM,QAAQ,IAAI,WAAW,aAAa,MAAM;AAChD,iBAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC1C,gBAAM,CAAC,IAAI,aAAa,WAAW,CAAC;AAAA,QACxC;AACA,eAAO;AAAA,MACX;AAAA,IACJ;AAnII;AAAA,IA5ES,SA4EF,oBAAoB;AA5ExB,IAAM,UAAN;AAAA;AAAA;;;ACXP,SAAS,oBAAoB,cAAsB,eAAuB,MAAuC;AAC7G,QAAM,IAAI;AAAA,IACN,OAAO,GAAG,YAAY,eAAe,aAAa,4BAA4B,IAAI,MAAM,GAAG,YAAY,eAAe,aAAa;AAAA,EACvI;AACJ;AAXA,IAaa;AAbb;AAAA;AAAA;AACA;AAYO,IAAM,cAAN,MAAM,aAAY;AAAA,MACrB,OAAO,oBAAoB,KAAW;AAClC,cAAM,IAAI,MAAM,UAAU,IAAI,MAAM,KAAK,IAAI,OAAO,EAAE;AAAA,MAC1D;AAAA,MAEA,OAAO,eAAe,WAAgB,cAAsB,eAAuB,MAAqB;AACpG,YAAI,OAAO,cAAc,eAAe,cAAc,QAAQ,cAAc,IAAI;AAC5E,8BAAoB,cAAc,eAAe,IAAI;AAAA,QACzD;AAAA,MACJ;AAAA,MAEA,OAAO,qBAAqB,WAAgB,cAAsB,eAA6B;AAC3F,YAAI,OAAO,cAAc,UAAU;AAC/B,8BAAoB,cAAc,eAAe,QAAQ;AAAA,QAC7D;AAAA,MACJ;AAAA,MAEA,OAAO,8BAA8B,WAA0B,cAAsB,eAAuB,WAAyB;AACjI,YAAI,CAAC;AAAW;AAEhB,YAAI,UAAU,SAAS,WAAW;AAC9B,gBAAM,IAAI,MAAM,GAAG,aAAa,UAAU,SAAS,mBAAmB;AAAA,QAC1E;AAAA,MACJ;AAAA,MAEA,OAAO,oBAAoB,WAAgB,cAAsB,eAA6B;AAC1F,YAAI,UAAU,gBAAgB,OAAO;AACjC,8BAAoB,cAAc,eAAe,OAAO;AAAA,QAC5D;AAAA,MACJ;AAAA,MAEA,OAAO,4BAA4B,WAAgB,cAAsB,eAA6B;AAClG,YAAI,UAAU,gBAAgB,SAAS,OAAO,cAAc,UAAU;AAClE,8BAAoB,cAAc,eAAe,iBAAiB;AAAA,QACtE;AAAA,MACJ;AAAA,MAEA,OAAO,qBAAqB,WAAgB,cAAsB,eAA6B;AAC3F,YAAI,OAAO,aAAa,UAAU;AAC9B,cAAI,OAAO,cAAc,YAAY,WAAW;AAC5C,gBAAI,CAAC,MAAM,SAAS,SAAS,CAAC,GAAG;AAC7B;AAAA,YACJ;AAAA,UACJ;AACA,8BAAoB,cAAc,eAAe,QAAQ;AAAA,QAC7D;AAAA,MACJ;AAAA,MAEA,OAAO,eAAwB;AAC3B,eAAO;AAAA,UACH,IAAI;AAAA,YACA;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,MAEA,OAAO,gBAAgB,aAAkB,YAAuC;AAC5E,cAAM,QAAQ,IAAI,MAAM;AAExB,eAAO,KAAK,WAAW,EAAE,QAAQ,CAAC,MAAM;AACpC,gBAAM,CAAC,IAAI,YAAY,CAAC;AAAA,QAC5B,CAAC;AAED,YAAI,YAAY;AACZ,iBAAO,KAAK,UAAU,EAAE,QAAQ,CAAC,MAAM;AACnC,kBAAM,CAAC,IAAI,WAAW,CAAC;AAAA,UAC3B,CAAC;AAAA,QACL;AAEA,eAA4B;AAAA,MAChC;AAAA,MAEA,OAAO,mBAAmB,WAAgB,cAAsB,eAA6B;AACzF,YAAI,OAAO,aAAa,WAAW;AAC/B,8BAAoB,cAAc,eAAe,SAAS;AAAA,QAC9D;AAAA,MACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,OAAO,mBAAmB,WAAgB,cAAsB,eAA+B;AAC3F,cAAM,QAAQ,YAAY,SAAS;AACnC,YAAI,CAAC;AAAO,8BAAoB,cAAc,eAAe,aAAa;AAE1E,eAAO;AAAA,MACX;AAAA,MAEA,OAAO,kBAAkB,WAAgB,cAAsB,eAA2C;AACtG,YAAI;AACA,uBAAY,qBAAqB,WAAW,cAAc,aAAa;AAGvE,gBAAM,QAAQ,YAAY,SAAS;AACnC,cAAI;AAAO,mBAAO;AAGlB,gBAAM,gBAAgB,UAAU,MAAM,GAAG;AAEzC,cAAI,cAAc,QAAQ;AACtB,qBAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC3C,4BAAc,CAAC,IAAI,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,MAAM,GAAG;AAC5D,mCAAqB,KAAK,cAAc,CAAC,CAAC,EAAG,CAAC;AAAA,YAClD;AAAA,UACJ;AAEA,iBAAO,cAAc,KAAK,GAAG;AAAA,QACjC,SAAS,OAAO;AACZ,8BAAoB,cAAc,eAAe,2CAA2C;AAAA,QAChG;AAAA,MACJ;AAAA,MAEA,OAAO,uBAAuB,mBAA+D,cAAsB,eAA6B;AAC5I,YAAI,OAAO,qBAAqB,YAAY;AACxC,8BAAoB,cAAc,eAAe,UAAU;AAAA,QAC/D;AAAA,MACJ;AAAA,MAEA,OAAO,uBAAuB,cAAsB,SAAwB;AACxE,YAAI,SAAS;AACT,oBAAU;AACV,gBAAM,IAAI,MAAM,eAAe,qCAAqC;AAAA,QACxE;AAAA,MACJ;AAAA,MAEA,OAAO,qBAAqB,SAAwB;AAChD,YAAI,CAAC,SAAS;AACV,gBAAM,IAAI;AAAA,YACN;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA;AAAA;;;ACrJA,YAAM;AAAN;AAAA;AAAA;AAAA,IAAM,OAAN,MAAM,KAAI;AAAA,IAeV;AAdC,IADK,KACE,UAAS,WAAM;AAAA,MAUrB,OAAO,IAAI,YAAoB;AAC9B,eAAO,GAAG,KAAI,OAAO,kBAAkB,KAAK,UAAU;AAAA,MACvD;AAAA,IACD,GAbgB,GACR,uBAA+B,yBADvB,GAER,eAAc,WAAM;AAAA,IAM3B,GANqB,GACb,+BAAuC,uDAD1B,GAEb,oBAA4B,4CAFf,GAGb,MAAc,KAHD,GAIb,iBAAyB,6CAJZ,GAKb,uBAA+B,+CALlB,KAFN,GASR,qBAA6B,6BATrB;AADjB,IAAM,MAAN;AAAA;AAAA;;;ACAQ,SAAS,YAAY,KAAa,OAAkB;AAC3D,MAAI,OAAO,UAAU,UAAU;AAC9B,UAAM,IAAI,yEAAyE,KAAK,KAAK;AAC7F,QAAI,GAAG;AACN,aAAO,IAAI,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,IACvE;AAAA,EACD;AACA,SAAO;AACR;AARA;AAAA;AAAA;AAAA;AAAA;;;ACOA,SAAS,qBAAqB,SAAiB,OAAmB;AAC9D,MAAI,SAAwB;AAC5B,MAAI,QAAQ,QAAQ,GAAG,MAAM,IAAI;AAC7B,UAAM,SAAS,QAAQ,MAAM,GAAG;AAChC,YAAQ,OAAO,CAAC,GAAG;AAAA,MACf,KAAK;AACD,iBAAS;AACT;AAAA,MACJ,KAAK;AACD,iBAAS;AACT,gBAAQ,SAAS,OAAO,SAAS,KAAK,IAAI;AAC1C;AAAA,MACJ,KAAK;AACD,iBAAS;AACT;AAAA,MACJ,KAAK;AACD,iBAAS;AACT;AAAA,MACJ,KAAK,IAAI,OAAO,YAAY;AACxB,iBAAS,OAAO,CAAC,IAAI;AACrB;AAAA,MACJ,KAAK,IAAI,OAAO,YAAY;AACxB,iBAAS,OAAO,CAAC,IAAI;AACrB;AAAA,MACJ,KAAK,IAAI,OAAO,YAAY;AACxB,iBAAS,OAAO,CAAC,IAAI;AACrB;AAAA,IACR;AAAA,EACJ;AAEA,SAAO,CAAC,QAAQ,KAAK;AACzB;AAQA,SAAS,UAAU,QAAa,aAAwB;AACpD,MAAI,aAAa;AACb,QAAI,YAAY,SAAS,OAAO,WAAW,KAAK,MAAM;AAClD,aAAO,QAAQ,yBAAyB,MAAM;AAAA,IAClD;AAEA,QAAI,YAAY,SAAS;AACrB,aAAO,qBAAqB,gBAAgB,OAAO,cAAc,CAAC,EAAE,CAAC,KAAK;AAAA,IAC9E;AAAA,EACJ;AAEA,QAAM,OAAO,OAAO,KAAK,MAAM;AAE/B,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,UAAM,aAAa,KAAK,CAAC;AAEzB,QAAI,OAAO,UAAU,KAAK,MAAM;AAC5B,UAAI,OAAO,UAAU,EAAE,gBAAgB,OAAO;AAC1C,iBAAS,IAAI,GAAG,IAAI,OAAO,UAAU,EAAE,QAAQ,KAAK;AAChD,iBAAO,UAAU,EAAE,CAAC,IAAI,UAAU,OAAO,UAAU,EAAE,CAAC,CAAC;AAAA,QAC3D;AAAA,MACJ,WAAW,OAAO,OAAO,UAAU,MAAM,UAAU;AAC/C,kBAAU,OAAO,UAAU,CAAC;AAAA,MAChC;AAAA,IACJ;AAGA,QAAI,oBAAoB,qBAAqB,YAAY,OAAO,UAAU,CAAC;AAC3E,QAAI,kBAAkB,CAAC,GAAG;AACtB,aAAO,kBAAkB,CAAC,CAAC,IAAI,kBAAkB,CAAC;AAAA,IACtD;AAGA,QAAI,WAAW,QAAQ,SAAS,MAAM,IAAI;AACtC,YAAM,YAAY,WAAW,MAAM,SAAS;AAE5C,UAAI,CAAC,OAAO,eAAe,UAAU,CAAC,CAAC,GAAG;AACtC,eAAO,UAAU,CAAC,CAAC,IAAI,EAAE,UAAU,QAAQ;AAAA,MAC/C,WAGI,OAAO,OAAO,UAAU,CAAC,CAAC,MAAM,YAC/B,OAAO,OAAO,UAAU,CAAC,CAAC,MAAM,YAAY,CAAC,OAAO,UAAU,CAAC,CAAC,EAAE,eAAe,UAAU,GAC9F;AACE,cAAM,IAAI,MAAM,qDAAqD;AAAA,MACzE;AAEA,aAAO,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,OAAO,UAAU;AAGtD,0BAAoB,qBAAqB,UAAU,CAAC,GAAG,OAAO,UAAU,CAAC;AACzE,UAAI,kBAAkB,CAAC,GAAG;AACtB,eAAO,UAAU,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,IAAI,kBAAkB,CAAC;AAAA,MACpE;AAAA,IACJ;AAAA,EACJ;AAEA,MAAI,aAAa;AACb,QAAI,YAAY,eAAe,YAAY,KAAK,OAAO,MAAM,IAAI,OAAO,YAAY,oBAAoB,KAAK,MAAM;AAC/G,aAAO,aAAa,QAAQ,wBAAwB,OAAO,MAAM,IAAI,OAAO,YAAY,oBAAoB,GAAG,YAAY,UAAU;AAAA,IACzI;AAAA,EACJ;AAEA,SAAO;AACX;AAKA,SAAS,kBAAkB,MAAmB;AAC1C,QAAM,MAAM,EAAE,UAAU,EAAE;AAC1B,QAAM,UAAU,CAAC;AACjB,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,KAAG;AACC,UAAM,IAAI;AACV,WAAO,SAAS,MAAM,GAAG;AACzB,YAAQ,oBAAoB,KAAK,IAAI;AACrC,QAAI,UAAU,MAAM;AAChB,cAAQ,MAAM,CAAC,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC;AAAA,IAC7C,OAAO;AAEH,UAAI,WAAW;AAAA,IACnB;AAAA,EACJ,SAAS,QAAQ;AAEjB,SAAO;AACX;AAGA,SAAS,SAAS,MAAc,KAA0C;AACtE,SAAO,OAAO,MAAM,KAAK,MAAM;AACnC;AAGA,SAAS,OAAO,MAAc,KAA2B,KAA4B;AACjF,QAAM,QAAQ,IAAI,YAAY;AAC9B,MAAI,MAAM,KAAK;AACf,MAAI,KAAK;AACL,UAAM,KAAK,QAAQ,KAAK,KAAK;AAC7B,QAAI,QAAQ,IAAI;AACZ,aAAO;AAAA,IACX;AACA,QAAI,WAAW,MAAM,IAAI;AAAA,EAC7B,OAAO;AACH,QAAI,WAAW;AAAA,EACnB;AAEA,SAAO,KAAK,UAAU,OAAO,GAAG;AACpC;AAUA,SAAS,mBAAmB,UAAkB,aAAkB,gBAAwB,GAA0D;AAG9I,QAAM,YAAY,SAAS,OAAO,GAAG,SAAS,QAAQ,MAAM,CAAC;AAC7D,QAAM,qBAAqB,SAAS,MAAM,SAAS;AAEnD,qBAAmB,MAAM;AAEzB,qBAAmB,IAAI;AAEvB,MAAI,SAAgE,CAAC;AACrE,WAAS,IAAI,GAAG,IAAI,mBAAmB,QAAQ,KAAK;AAChD,QAAI,gBAAgB,mBAAmB,CAAC;AACxC,QAAI,cAAc,QAAQ,sBAAsB,IAAI,IAAI;AACpD,sBAAgB,cAAc,KAAK;AACnC,YAAM,iBAAiB,cAAc,UAAU,cAAc,QAAQ,MAAM,IAAI,CAAC,EAAE,KAAK;AAEvF,eAAS,OAAO,OAAO,mBAAmB,gBAAgB,aAAa,aAAa,CAAC;AAAA,IACzF,OAAO;AAEH,YAAM,gBAAgB,4CAA4C,KAAK,aAAa;AAEpF,YAAM,aAAa,SAAS,cAAe,CAAC,CAAC;AAC7C,YAAM,oBAAoB,cAAe,CAAC,EAAE,KAAK;AAEjD,YAAM,eAAe,cAAc,UAAU,cAAc,QAAQ,GAAG,GAAG,cAAc,YAAY,GAAG,IAAI,CAAC;AAE3G,UAAI,CAAC,cAAc;AACf,YAAI,6BAA6B,KAAK,aAAa,GAAG;AAClD,gBAAM,kBAAkB,SAAS,KAAK,cAAc,KAAK,CAAC;AAC1D,gBAAM,eAAe,mBAAmB,gBAAgB,SAAS,gBAAgB,CAAC,IAAI;AAGtF,iBAAO,KAAK,MAAM,OAAO,YAAY,CAAC,IAAI,eAAe,OAAO,YAAY,CAAC;AAAA,QACjF,OAAO;AACH,cAAI,YAAY,UAAU,YAAY,aAAa,KAAK,YAAY,aAAa,EAAE,eAAe,cAAc,GAAG;AAC/G,mBAAO,KAAK,YAAY,aAAa,EAAE,YAAY;AAAA,UACvD,OAAO;AACH,kBAAM,YAAY,oBAAoB,KAAK,aAAa;AAExD,gBAAI,aAAa,UAAU,QAAQ;AAC/B,oBAAM,aAAa,mBAAmB,UAAU,CAAC,CAAC;AAClD,qBAAO,KAAK,aAAa,aAAa,MAAS;AAAA,YACnD,OAAO;AACH,qBAAO,KAAK,MAAS;AAAA,YACzB;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ,OAAO;AACH,cAAM,iBAAiB,UAAU,KAAK,MAAM,cAAc,WAAW,GAAG,YAAY,aAAa,CAAC;AAElG,YAAI,cAAc,KAAK;AACnB,gBAAM,kBAAkB;AAAA;AAAA,YAEpB,cAAc,UAAU,cAAc,QAAQ,cAAe,CAAC,CAAC,IAAI,cAAe,CAAC,EAAE,SAAS,GAAG,cAAc,QAAQ,GAAG,CAAC;AAAA,UAC/H;AAEA,iBAAO;AAAA,YACH,YAAY,gBAAgB,gBAAgB;AAAA,cACxC,QAAQ;AAAA,cACR,YAAY;AAAA,cACZ,eAAe;AAAA,cACf,SAAS;AAAA,YACb,CAAC;AAAA,UACL;AAAA,QACJ,OAAO;AACH,iBAAO,KAAK,cAAc;AAAA,QAC9B;AAAA,MACJ;AAAA,IACJ;AAEA;AAAA,EACJ;AAEA,SAAO;AACX;AAEA,SAAS,eAAe,QAAwB;AAC5C,SAAO,QAAqB,OAAO,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,QAAQ,QAAQ,EAAE,SAAS,QAAQ;AAC5G;AAEA,SAAS,kBAAkB,UAAe,iBAAsB,aAAwC;AACpG,MAAI,OAAO;AAEX,MAAI,YAAY,eAAe,OAAO,GAAG;AACrC,WAAO,KAAK,MAAM,IAAI,EAAE;AACxB,WAAO,eAAe,IAAI;AAAA,EAC9B;AAEA,MAAI,cAAoC;AAAA,IACpC,OAAO;AAAA,EACX;AAEA,MAAI,gBAAgB,gBAAgB;AAAG,gBAAY,WAAW,gBAAgB,gBAAgB;AAE9F,MAAI,gBAAgB,gBAAgB;AAAG,gBAAY,WAAW,SAAS,gBAAgB,gBAAgB,CAAC;AAExG,MAAI,UAAU,iBAAiB,UAAU;AAAG,gBAAY,WAAW,UAAU,iBAAiB,UAAU;AAExG,SAAO;AACX;AAEA,SAAS,UAAU,SAAc,MAAuB;AACpD,SAAO,QAAQ,eAAe,IAAI,KAAK,QAAQ,eAAe,KAAK,YAAY,CAAC;AACpF;AAEA,SAAS,UAAU,SAAc,MAAsB;AACnD,MAAI,QAAQ,IAAI;AAAG,WAAO,QAAQ,IAAI;AAEtC,SAAO,QAAQ,KAAK,YAAY,CAAC;AACrC;AASO,SAAS,cAAc,UAAkB,iBAAsB,aAAyB;AAC3F,MAAI,cAAmB;AACvB,MAAI,SAAS,QAAQ;AACjB,QAAI,SAAS,QAAQ,kBAAkB,IAAI,IAAI;AAC3C,YAAM,QAAQ,mBAAmB,UAAU,WAAW;AAEtD,oBAAc,YAAY,WAAW,KAAK,YAAY,CAAC,EAAE,mBAAmB,MAAM,CAAC,IAAI;AAAA,IAC3F,OAAO;AACH,UAAI,UAAU,iBAAiB,qBAAqB,GAAG;AACnD,sBAAc,kBAAkB,UAAU,iBAAiB,YAAY,CAAC,CAAC;AAAA,MAC7E,OAAO;AACH,cAAM,cAAc,UAAU,iBAAiB,cAAc;AAC7D,YAAI,YAAY,WAAW,kBAAkB,GAAG;AAC5C,wBAAc,UAAU,KAAK,MAAM,UAAU,WAAW,GAAG,YAAY,CAAC,CAAC;AAAA,QAC7E,OAAO;AACH,wBAAc,MAAM,OAAO,QAAQ,CAAC,IAAI,WAAW,OAAO,QAAQ;AAAA,QACtE;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,OAAO;AACH,QAAI,YAAY,UAAU,YAAY,CAAC,EAAE,eAAe,cAAc,GAAG;AACrE,oBAAc,YAAY,CAAC,EAAE;AAAA,IACjC,WAAW,UAAU,iBAAiB,gBAAgB,GAAG;AACrD,YAAM,YAAY,UAAU,iBAAiB,gBAAgB;AAE7D,YAAM,aAAa,mBAAmB,SAAS;AAE/C,UAAI,YAAY;AACZ,sBAAc;AAAA,MAClB;AAAA,IACJ,WAAW,UAAU,iBAAiB,UAAU,GAAG;AAC/C,oBAAc;AAAA,QACV,UAAU,UAAU,iBAAiB,UAAU;AAAA,MACnD;AAEA,UAAI,gBAAgB,iBAAiB;AAAG,oBAAY,YAAY,SAAS,gBAAgB,iBAAiB,CAAC;AAAA,IAC/G;AAAA,EACJ;AAEA,SAAO;AACX;AAtUA,IAgHM;AAhHN;AAAA;AAAA;AAAC;AACD;AACA;AACA;AAEA;AA2GA,IAAM,sBAAsB;AAAA;AAAA;;;AChH5B;AAAA;AAAA;AAAA;AA2CO,SAAS,eAAe,SAA4D;AACvF,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACpC,oBAAgB,SAAS,SAAS,MAAM;AAAA,EAC5C,CAAC;AACL;AAMA,SAAS,gBACL,SACA,iBACA,eACF;AAzDF,MAAAC;AA0DI,QAAM,OAAO,QAAQ;AACrB,QAAM,oBAAoB,QAAQ;AAClC,QAAM,iBAAiB,QAAQ;AAC/B,QAAM,SAAS,QAAQ;AAEvB,QAAM,UAAoC,CAAC;AAE3C,MAAI,MAAM;AACN,YAAQ,cAAc,IAAI,kBAAkB,cAAc;AAC1D,YAAQ,gBAAgB,IAAI,KAAK;AAEjC,WAAO,kBAAkB,cAAc;AAAA,EAC3C;AAGA,WAAS,OAAO,mBAAmB;AAC/B,YAAQ,GAAG,IAAI,kBAAkB,GAAG;AAAA,EACxC;AACA,QAAM,YAAY,IAAI,IAAI,QAAQ,GAAG;AACrC,QAAM,aAAWA,MAAA,UAAU,aAAV,gBAAAA,IAAoB,MAAM,GAAG,QAAO;AACrD,QAAM,oBAAoB,aAAa,SAAS,OAAO;AAEvD,QAAM,kBAAuC;AAAA,IACzC,UAAU,UAAU;AAAA,IACpB,MAAM,UAAU;AAAA,IAChB,MAAM,UAAU,WAAW,UAAU;AAAA,IACrC,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ,WAAW;AAAA,IAC5B;AAAA,IACA;AAAA,EACJ;AAGA,MAAI,CAAC,QAAQ,SAAS,QAAQ,IAAI,GAAG,QAAQ,QAAQ,GAAG;AACpD,YAAQ,QAAQ;AAAA,MACZ,KAAK,QAAQ,IAAI,GAAG,QAAQ,QAAQ;AAAA,IACxC;AAAA,EACJ;AAEA,kBAAgB,QAAQ,SAAS,SAAS,QAAQ;AAElD,MAAI,QAAQ,OAAO;AACf,UAAM,aAAa,IAAI,IAAI,QAAQ,MAAM,GAAG,EAAE;AAC9C,QAAI;AAAY,cAAQ,OAAO;AAAA,EACnC;AAEA,QAAM,UAAU,kBAAkB,QAAQ,iBAAiB,SAAU,KAAK;AACtE,QAAI,UAAU;AACd,QAAI,YAAY,MAAM;AACtB,QAAI,GAAG,QAAQ,SAAU,OAAO;AAC5B,iBAAW;AAAA,IACf,CAAC;AACD,QAAI,GAAG,OAAO,WAAY;AACtB,cAAQ,IAAI,YAAY;AAAA,QACpB,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK,KAAK;AAEN,cAAI,eAAe,cAAc,SAAS,IAAI,SAAS,eAAe,QAAQ,SAAS,CAAC;AAExF,cAAI,WAAW;AAAA,YACX,MAAM;AAAA,YACN,SAAS,IAAI;AAAA,YACb,QAAQ,IAAI;AAAA,UAChB;AAEA,0BAAgB,QAAQ;AACxB;AAAA,QACJ;AAAA,QACA;AAEI,cAAI;AACJ,cAAI;AACA,gBAAI,cAAc,cAAc,SAAS,IAAI,SAAS,eAAe,QAAQ,SAAS,CAAC;AAEvF,gBAAI,MAAM,QAAQ,WAAW,GAAG;AAC5B,4BAAc,WAAW;AACzB;AAAA,YACJ;AAEA,uBAAW,YAAY,eAAe,OAAO,KAAK,YAAY,QAAQ,YAAY,QAAQ,EAAE,SAAS,YAAY,QAAQ;AAAA,UAC7H,SAAS,GAAG;AACR,gBAAI,QAAQ,SAAS,GAAG;AACpB,yBAAW,EAAE,SAAS,QAAQ;AAAA,YAClC,OAAO;AACH,yBAAW,EAAE,SAAS,mBAAmB;AAAA,YAC7C;AAAA,UACJ;AAEA;AAAA,YACI,YAAY,gBAAgB,UAAU;AAAA,cAClC,QAAQ,IAAI;AAAA,cACZ,YAAY;AAAA,cACZ,eAAe,IAAI;AAAA,cACnB,SAAS,IAAI;AAAA,YACjB,CAAC;AAAA,UACL;AACA;AAAA,MACR;AAAA,IACJ,CAAC;AAAA,EACL,CAAC;AAED,MAAI,gBAAgB,SAAS;AACzB,YAAQ,WAAW,gBAAgB,SAAS,WAAY;AACpD,cAAQ,QAAQ;AAAA,IACpB,CAAC;AAAA,EACL;AAEA,UAAQ,GAAG,SAAS,SAAU,OAAO;AACjC,kBAAc,KAAK;AAAA,EACvB,CAAC;AAED,MAAI,MAAM;AACN,YAAQ,MAAM,IAAI;AAAA,EACtB;AAEA,UAAQ,IAAI;AAChB;AAjLA,IAAC,MACD,OACA,yBACA,0BAKM,QAEA;AAVN;AAAA;AAAA;AAAC,WAAsB;AACvB,YAAuB;AACvB,8BAA2B;AAC3B,+BAA4B;AAE5B;AACA;AAEA,IAAM,SAAwC,CAAC;AAE/C,IAAM,WAAW,CAAC,SAA8B,aAAiC;AAC7E,YAAM,SAAS,aAAa;AAC5B,YAAM,QAAQ,QAAQ;AACtB,YAAM,YAAY,QAAQ,MAAM,MAAM;AAEtC,UAAI,CAAC,OAAO,SAAS,GAAG;AACpB,YAAI,OAAO;AACP,gBAAM,iBAAiB,IAAI,IAAI,MAAM,GAAG;AACxC,gBAAM,aAAa,SAAS,wBAAAC,QAAe,iBAAiB,yBAAAC,QAAgB;AAE5E,gBAAM,eAA8F;AAAA,YAChG,MAAM,eAAe;AAAA,YACrB,MAAM,eAAe;AAAA,YACrB,UAAU,eAAe;AAAA,UAC7B;AAEA,cAAI,MAAM;AAAM,yBAAa,OAAO,MAAM,KAAK,WAAW,MAAM,MAAM,KAAK;AAAA,mBAClE,eAAe,YAAY,eAAe;AAAU,yBAAa,OAAO,GAAG,eAAe,QAAQ,IAAI,eAAe,QAAQ;AAEtI,iBAAO,SAAS,IAAI,IAAI,WAAW,YAAY;AAAA,QACnD,OAAO;AACH,gBAAM,oBAAoB,SAAS,OAAO;AAE1C,iBAAO,SAAS,IAAI,IAAI,kBAAkB,MAAM;AAAA,YAC5C,WAAW;AAAA,YACX,YAAY;AAAA,UAChB,CAAC;AAAA,QACL;AAAA,MACJ;AAEA,aAAO,OAAO,SAAS;AAAA,IAC3B;AAAA;AAAA;;;ACzCA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AACA;AAcA,IAAM,YAAY,CAAC,WAAsC,cAAiC;AACtF,MAAI,QAAQ,uBAAuB,GAAG;AAClC,WAAO,IAAI,IAAI,QAAQ,OAAO,OAAO,SAAS,MAAM,EAAE,SAAS,IAAI;AAAA,EACvE,OAAO;AACH,QAAI,CAAC;AAAW,kBAAY,QAAQ,aAAa;AACjD,WAAO,IAAI,IAAI,OAAO,UAAU,IAAI,KAAK,UAAU,OAAO,IAAI,SAAS,EAAE,SAAS,IAAI;AAAA,EAC1F;AACJ;AAEA,IAAM,kBAAkB,CAAC,WAAkC,SAAkB,mBAAyC;AAClH,QAAM,oBAAoB,eAAe,OAAO;AAEhD,MAAI,uCAAW,SAAS;AACpB,gBAAY,qBAAqB,UAAU,SAAS,4BAA4B,UAAU,OAAO,UAAU;AAC3G,sBAAkB,UAAU,UAAU;AAAA,EAC1C;AAEA,MAAI,uCAAW,MAAM;AACjB,gBAAY,qBAAqB,UAAU,MAAM,4BAA4B,UAAU,OAAO,OAAO;AACrG,sBAAkB,OAAO,UAAU;AAAA,EACvC;AAEA,oBAAkB,MAAM,UAAU,eAAe,WAAW,iBAAiB;AACjF;AAEO,IAAM,uBAAN,MAA2B;AAAA,EAG9B,OAAO,MAAM,gBAAgC,QAAuB;AAChE,QAAI,iCAAQ,WAAW;AACnB,kBAAY,qBAAqB,OAAO,WAAW,4BAA4B,kBAAkB;AACjG,qBAAe,YAAY,OAAO;AAAA,IACtC;AAEA,oBAAgB,iCAAQ,SAAS,WAAW,cAAc;AAC1D,oBAAgB,iCAAQ,WAAW,aAAa,cAAc;AAE9D,QAAI,iCAAQ,aAAa;AACrB,qBAAe,cAAc,YAAY,mBAAmB,OAAO,aAAa,4BAA4B,oBAAoB;AAAA,IACpI;AAEA,QAAI,iCAAQ,gBAAgB;AACxB,qBAAe,iBAAiB,YAAY,mBAAmB,OAAO,gBAAgB,4BAA4B,uBAAuB;AAAA,IAC7I;AAEA,QAAI,iCAAQ,gBAAgB;AACxB,kBAAY,uBAAuB,OAAO,gBAAgB,4BAA4B,uBAAuB;AAC7G,qBAAe,iBAAiB,OAAO;AAAA,IAC3C;AAEA,QAAI,iCAAQ,oBAAoB;AAC5B,kBAAY,qBAAqB,OAAO,oBAAoB,4BAA4B,2BAA2B;AACnH,qBAAe,qBAAqB,OAAO;AAAA,IAC/C;AAEA,QAAI,iCAAQ,SAAS;AACjB,kBAAY,qBAAqB,OAAO,SAAS,4BAA4B,gBAAgB;AAC7F,qBAAe,UAAU,OAAO;AAAA,IACpC;AAEA,QAAI,iCAAQ,aAAa;AACrB,kBAAY,qBAAqB,OAAO,aAAa,4BAA4B,oBAAoB;AACrG,qBAAe,cAAc,OAAO;AAAA,IACxC;AAEA,QAAI,iCAAQ,sBAAsB;AAC9B,kBAAY,mBAAmB,OAAO,sBAAsB,4BAA4B,6BAA6B;AACrH,qBAAe,uBAAuB,OAAO;AAAA,IACjD;AAEA,QAAI,iCAAQ,gBAAgB;AACxB,kBAAY,mBAAmB,OAAO,gBAAgB,4BAA4B,uBAAuB;AACzG,qBAAe,iBAAiB,OAAO;AAAA,IAC3C;AAEA,QAAI,iCAAQ,SAAS;AACjB,qBAAe,UAAU,OAAO;AAAA,IACpC;AAEA,QAA2B,iCAAQ,OAAO;AACtC,kBAAY,eAAe,OAAO,OAAO,4BAA4B,cAAc;AAEnF,UAAI,OAAO,MAAM,KAAK;AAClB,oBAAY,qBAAqB,OAAO,MAAM,KAAK,4BAA4B,kBAAkB;AAEjG,YAAI,OAAO,MAAM,MAAM;AACnB,sBAAY,eAAe,OAAO,MAAM,MAAM,4BAA4B,mBAAmB;AAC7F,sBAAY,qBAAqB,OAAO,MAAM,KAAK,UAAU,4BAA4B,4BAA4B;AACrH,sBAAY,qBAAqB,OAAO,MAAM,KAAK,UAAU,4BAA4B,4BAA4B;AAAA,QACzH;AAAA,MACJ;AAEA,qBAAe,QAAQ,OAAO;AAAA,IAClC;AAAA,EACJ;AAAA,EAEA,OAAO,UAA0B;AAC7B,WAAO;AAAA,MACH,WAAW;AAAA,MACX,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,oBAAoB;AAAA,MACpB,aAAa;AAAA,MACb,sBAAsB;AAAA,MACtB,OAAO;AAAA,MACP,SAAS;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,KAAK;AAAA,MACT;AAAA,MACA,WAAW;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,QACT,KAAK;AAAA,MACT;AAAA,IACJ;AAAA,EACJ;AACJ;AA7Fa,qBACF,kBAAkB;;;ADxC7B;AACA;;;AEFA;;;ACAA;AAEA;AAkBO,IAAM,kBAAN,MAAM,gBAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQxB,OAAO,QAAQ,SAA+B,QAA8C;AACxF,YAAQ,OAAO,QAAQ,QAAQ;AAC/B,YAAQ,eAAe,QAAQ,gBAAgB;AAC/C,QAAI,CAAC,QAAQ,KAAK;AACd,UAAI,CAAC,QAAQ,qBAAqB,CAAC,QAAQ,aAAa,CAAC,QAAQ,YAAY;AACzE,oBAAY,eAAe,QAAQ,YAAY,kBAAkB,QAAQ,YAAY,IAAI,oBAAoB;AAAA,MACjH;AACA,UAAI,QAAQ,cAAc,MAAM;AAC5B,oBAAY,qBAAqB,QAAQ,YAAY,kBAAkB,QAAQ,YAAY,IAAI,oBAAoB;AACnH,gBAAQ,OAAO,QAAQ;AAGvB,YAAI,QAAQ,KAAK;AACb,kBAAQ,MAAM,YAAY,kBAAkB,QAAQ,KAAK,kBAAkB,QAAQ,YAAY,IAAI,aAAa;AAChH,kBAAQ,QAAQ,IAAI,QAAQ,GAAG;AAAA,QACnC;AAAA,MACJ;AAEA,UAAI,QAAQ,WAAW;AACnB,oBAAY,qBAAqB,QAAQ,WAAW,kBAAkB,QAAQ,YAAY,IAAI,mBAAmB;AACjH,YAAI,QAAQ,UAAU,WAAW,GAAG,GAAG;AACnC,kBAAQ,OAAO,QAAQ,OAAO,GAAG,QAAQ,SAAS,IAAI,QAAQ,IAAI,KAAK,QAAQ;AAAA,QACnF;AAAA,MACJ;AAEA,UAAI,QAAQ,gBAAgB;AACxB,YAAI,QAAQ,MAAM;AACd,kBAAQ,QAAQ;AAAA,QACpB;AACA,gBAAQ,QAAQ,QAAQ;AAAA,MAC5B;AAEA,cAAQ,OAAO,gBAAe,WAAW,SAAS,QAAQ,QAAQ,IAAI;AAEtE,UAAI,QAAQ,UAAU;AAClB,oBAAY,qBAAqB,QAAQ,UAAU,kBAAkB,QAAQ,YAAY,IAAI,kBAAkB;AAC/G,YAAI,OAAO,QAAQ,KAAK,QAAQ,GAAG,MAAM,KAAK,MAAM;AACpD,gBAAQ,QAAQ,GAAG,IAAI,YAAY,mBAAmB,QAAQ,QAAQ,CAAC;AAAA,MAC3E;AAAA,IACJ,OAAO;AACH,kBAAY,qBAAqB,QAAQ,KAAK,kBAAkB,QAAQ,YAAY,IAAI,aAAa;AACrG,cAAQ,OAAO,QAAQ,IAAI,QAAQ,OAAO,QAAQ,KAAK,EAAE;AAAA,IAC7D;AAEA,QAAI,QAAQ,eAAe,OAAO,KAAK,QAAQ,SAAS,MAAM;AAC1D,kBAAY,mBAAmB,QAAQ,OAAO,kBAAkB,QAAQ,YAAY,IAAI,eAAe;AAAA,IAC3G,OAAO;AACH,cAAQ,QAAQ;AAAA,IACpB;AAEA,YAAQ,UAAU,gBAAe,eAAe,SAAS,MAAM;AAE/D,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,WAAW,SAA+B,QAAgB,MAAc,IAAI,aAAqB,KAAa;AA7FzH,QAAAC,KAAAC,KAAA;AA8FQ,UAAM,aAAuB,CAAC;AAE9B,QAAI,SAAS;AACT,UAAI,QAAQ,oBAAoB;AAC5B,oBAAY,qBAAqB,QAAQ,oBAAoB,kBAAkB,QAAQ,YAAY,IAAI,4BAA4B;AACnI,eAAO,MAAM,QAAQ;AAErB,YAAI,QAAQ,uBAAuB;AAC/B,cAAI,gBAAgB,YAAY;AAAA,YAC5B,QAAQ;AAAA,YACR,kBAAkB,QAAQ,YAAY;AAAA,YACtC;AAAA,UACJ;AACA,iBAAO,MAAM,gBAAgB;AAAA,QACjC;AAEA,YAAI,QAAQ,uBAAuB,cAAc;AAC7C,cAAI,QAAQ,uBAAuB;AAC/B,wBAAY;AAAA,cACR,QAAQ;AAAA,cACR,kBAAkB,QAAQ,YAAY;AAAA,cACtC;AAAA,YACJ;AACA,mBAAO,MAAM,QAAQ;AAAA,UACzB;AAAA,QACJ;AAAA,MACJ;AAEA,WAAID,MAAA,QAAQ,WAAR,gBAAAA,IAAgB,QAAQ;AACxB,oBAAY,oBAAoB,QAAQ,QAAQ,kBAAkB,QAAQ,YAAY,IAAI,gBAAgB;AAE1G,YAAI,QAAQ,gBAAgB,cAAc,QAAQ,OAAO,UAAU,KAAK,QAAQ,OAAO,CAAC,EAAE,SAAS,OAAO,GAAG;AACzG,iBAAO,MAAM,QAAQ,OAAO,CAAC;AAAA,QACjC,OAAO;AACH,cAAI,QAAQ,OAAO,CAAC,EAAE,WAAW,GAAG,KAAK,QAAQ,gBAAgB,YAAY;AACzE,gBAAI,QAAQ,sBAAsB,MAAM;AACpC,qBAAO,QAAQ,OAAO,MAAM;AAAA,YAChC,OAAO;AACH,sBAAQ,OAAO,MAAM;AAAA,YACzB;AAAA,UACJ;AAGA,cAAI,QAAQ,OAAO,QAAQ;AACvB,uBAAW,KAAK,aAAa,QAAQ,OAAO,KAAK,GAAG,CAAC;AAAA,UACzD;AAAA,QACJ;AAAA,MACJ;AAEA,UAAI,QAAQ,QAAQ;AAChB,oBAAY,qBAAqB,QAAQ,QAAQ,kBAAkB,QAAQ,YAAY,IAAI,gBAAgB;AAC3G,cAAM,4BAA4B;AAClC,YAAI,eAAe,QAAQ;AAG3B,YAAI,IAA4B;AAChC,gBAAQ,IAAI,0BAA0B,KAAK,YAAY,OAAO,MAAM;AAChE,cAAI,EAAE,UAAU,0BAA0B,WAAW;AACjD,sCAA0B;AAAA,UAC9B;AAEA,cAAI,cAAc,EAAE,CAAC,EAAE,SAAS,GAAG,IAAI,MAAM;AAC7C,yBAAe,aAAa,QAAQ,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,WAAW;AAAA,QACtE;AAEA,mBAAW,KAAK,aAAa,mBAAmB,YAAY,CAAC;AAAA,MACjE;AAEA,UAAI,QAAQ,WAAW;AACnB,oBAAY,qBAAqB,QAAQ,WAAW,kBAAkB,QAAQ,YAAY,IAAI,mBAAmB;AACjH,eAAO,MAAM,QAAQ;AAAA,MACzB;AAEA,UAAI,QAAQ,YAAY;AACpB,mBAAW;AAAA,UACP,gBAAgB,YAAY,mBAAmB,QAAQ,YAAY,kBAAkB,QAAQ,YAAY,IAAI,oBAAoB;AAAA,QACrI;AAAA,MACJ;AAEA,UAAI,QAAQ,WAAW;AACnB,mBAAW;AAAA,UACP,eAAe,YAAY,mBAAmB,QAAQ,WAAW,kBAAkB,QAAQ,YAAY,IAAI,mBAAmB;AAAA,QAClI;AAAA,MACJ;AAEA,UAAI,QAAQ,OAAO;AACf,oBAAY,qBAAqB,QAAQ,OAAO,kBAAkB,QAAQ,YAAY,IAAI,eAAe;AACzG,mBAAW,KAAK,YAAY,QAAQ,KAAK;AAAA,MAC7C;AAEA,UAAI,QAAQ,OAAO;AACf,oBAAY,mBAAmB,QAAQ,OAAO,kBAAkB,QAAQ,YAAY,IAAI,eAAe;AACvG,mBAAW,KAAK,YAAY,QAAQ,KAAK;AAAA,MAC7C;AAEA,UAAI,QAAQ,OAAO,QAAQ,MAAM,GAAG;AAChC,oBAAY,qBAAqB,QAAQ,KAAK,kBAAkB,QAAQ,YAAY,IAAI,aAAa;AACrG,mBAAW,KAAK,UAAU,QAAQ,GAAG;AAAA,MACzC;AAEA,UAAI,QAAQ,WAAW,QAAQ,QAAQ,QAAQ,QAAQ;AACnD,oBAAY,oBAAoB,QAAQ,SAAS,kBAAkB,QAAQ,YAAY,IAAI,iBAAiB;AAC5G,mBAAW,KAAK,cAAc,QAAQ,QAAQ,KAAK,GAAG,CAAC;AAAA,MAC3D;AAEA,UAAI,QAAQ,aAAa;AACrB,oBAAY,qBAAqB,QAAQ,aAAa,kBAAkB,QAAQ,YAAY,IAAI,qBAAqB;AACrH,mBAAW,KAAK,kBAAkB,QAAQ,cAAc,GAAG;AAAA,MAC/D;AAEA,UAAI,QAAQ,cAAc;AACtB,oBAAY,qBAAqB,QAAQ,cAAc,kBAAkB,QAAQ,YAAY,IAAI,sBAAsB;AACvH,mBAAW,KAAK,UAAU,QAAQ,YAAY;AAAA,MAClD;AAEA,WAAIC,MAAA,QAAQ,gBAAR,gBAAAA,IAAqB,QAAQ;AAC7B,oBAAY,oBAAoB,QAAQ,aAAa,kBAAkB,QAAQ,YAAY,IAAI,qBAAqB;AACpH,mBAAW,KAAK,QAAQ,YAAY,KAAK,GAAG,CAAC;AAAA,MACjD;AAEA,UAAI,QAAQ,UAAU;AAClB,oBAAY,qBAAqB,QAAQ,UAAU,kBAAkB,QAAQ,YAAY,IAAI,kBAAkB;AAC/G,mBAAW,KAAK,oBAAoB,QAAQ,QAAQ;AAAA,MACxD;AAEA,UAAI,QAAQ,MAAM;AACd,oBAAY,eAAe,QAAQ,MAAM,kBAAkB,QAAQ,YAAY,IAAI,cAAc;AAAA,MACrG;AAEA,UAAI,QAAQ,SAAS;AACjB,oBAAY,mBAAmB,QAAQ,SAAS,kBAAkB,QAAQ,YAAY,IAAI,iBAAiB;AAAA,MAC/G;AAEA,UAAI,CAAC,QAAQ,OAAO,QAAQ,WAAW,GAAG;AACtC,oBAAY,mBAAmB,QAAQ,aAAa,kBAAkB,QAAQ,YAAY,IAAI,qBAAqB;AAAA,MACvH;AAEA,UAAI,QAAQ,WAAW,QAAQ,OAAO,QAAQ,WAAW;AAAG,gBAAQ,cAAc;AAElF,UAAI,QAAQ,SAAS;AACjB,oBAAY,qBAAqB,QAAQ,SAAS,kBAAkB,QAAQ,YAAY,IAAI,iBAAiB;AAAA,MACjH;AAEA,WAAI,aAAQ,WAAR,mBAAgB,QAAQ;AACxB,oBAAY,4BAA4B,QAAQ,QAAQ,kBAAkB,QAAQ,YAAY,IAAI,gBAAgB;AAClH,YAAI,OAAO,QAAQ,WAAW,UAAU;AACpC,qBAAW,KAAK,aAAa,QAAQ,MAAM;AAAA,QAC/C,OAAO;AACH,gBAAM,mBAA6B,CAAC;AACpC,mBAAS,IAAI,GAAG,IAAI,QAAQ,OAAO,QAAQ,KAAK;AAC5C,gBAAI,QAAQ,OAAO,CAAC,EAAE,UAAU;AAC5B,oBAAM,SAA+B,QAAQ,OAAO,CAAC;AACrD,qBAAO,eAAe,GAAG,QAAQ,YAAY;AAC7C,kBAAI,kBAAkB,gBAAe,WAAW,QAAQ,QAAQ,IAAI,GAAG;AACvE,kBAAI,iBAAiB;AACjB,kCAAkB,IAAI,gBAAgB,OAAO,CAAC,CAAC;AAAA,cACnD;AACA,+BAAiB,KAAK,QAAQ,OAAO,CAAC,EAAE,WAAW,eAAe;AAAA,YACtE;AAAA,UACJ;AACA,cAAI,iBAAiB,QAAQ;AACzB,uBAAW,KAAK,aAAa,iBAAiB,KAAK,GAAG,CAAC;AAAA,UAC3D;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO,CAAC,WAAW,SAAS,MAAM,MAAM,MAAM,WAAW,KAAK,UAAU;AAAA,EAC5E;AAAA,EAEA,OAAO,eAAe,SAA+B,QAAkC;AACnF,UAAM,UAA4B,EAAE,GAAG,OAAO,SAAS,GAAG,QAAQ,YAAY;AAE9E,UAAM,SAAS,gBAAe,oBAAoB,SAAS,MAAM;AACjE,QAAI,OAAO,QAAQ;AACf,cAAQ,QAAQ,IAAI;AAAA,IACxB;AAEA,QAAI,QAAQ,eAAe,aAAa;AACpC,cAAQ,QAAQ,IAAI;AAAA,IACxB;AAEA,QAAI,QAAQ,cAAc;AACtB,cAAQ,oBAAoB,IAAI,QAAQ;AAAA,IAC5C;AAEA,QAAI,QAAQ,WAAW,QAAQ,QAAQ,eAAe,MAAM;AACxD,YAAM,IAAI;AAAA,QACN,kBAAkB,QAAQ,YAAY;AAAA,MAC1C;AAAA,IACJ;AAEA,QAAI,QAAQ,SAAS;AACjB,kBAAY,qBAAqB,QAAQ,SAAS,kBAAkB,QAAQ,YAAY,IAAI,iBAAiB;AAC7G,cAAQ,UAAU,IAAI,QAAQ;AAAA,IAClC;AAEA,QAAI,QAAQ,aAAa;AACrB,kBAAY,qBAAqB,QAAQ,aAAa,kBAAkB,QAAQ,YAAY,IAAI,qBAAqB;AACrH,cAAQ,eAAe,IAAI,QAAQ;AAAA,IACvC;AAEA,QAAI,QAAQ,aAAa;AACrB,kBAAY,qBAAqB,QAAQ,aAAa,kBAAkB,QAAQ,YAAY,IAAI,qBAAqB;AACrH,cAAQ,eAAe,IAAI,YAAY,mBAAmB,QAAQ,aAAa,kBAAkB,QAAQ,YAAY,IAAI,qBAAqB;AAAA,IAClJ;AAEA,QAAI,QAAQ,gBAAgB;AACxB,kBAAY,qBAAqB,QAAQ,gBAAgB,kBAAkB,QAAQ,YAAY,IAAI,wBAAwB;AAC3H,cAAQ,gBAAgB,IAAI,YAAY;AAAA,QACpC,QAAQ;AAAA,QACR,kBAAkB,QAAQ,YAAY;AAAA,QACtC;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI,QAAQ,OAAO;AACf,kBAAY,qBAAqB,QAAQ,OAAO,kBAAkB,QAAQ,YAAY,IAAI,eAAe;AACzG,cAAQ,eAAe,IAAI,YAAY,QAAQ;AAAA,IACnD;AAEA,QAAI,QAAQ,oBAAoB;AAC5B,kBAAY,mBAAmB,QAAQ,oBAAoB,kBAAkB,QAAQ,YAAY,IAAI,4BAA4B;AACjI,cAAQ,kCAAkC,IAAI;AAAA,IAClD;AAEA,QAAI,QAAQ,6BAA6B;AACrC,kBAAY;AAAA,QACR,QAAQ;AAAA,QACR,kBAAkB,QAAQ,YAAY;AAAA,QACtC;AAAA,MACJ;AACA,cAAQ,mCAAmC,IAAI;AAAA,IACnD;AAEA,QAAI,QAAQ,SAAS;AACjB,kBAAY,mBAAmB,QAAQ,SAAS,kBAAkB,QAAQ,YAAY,IAAI,iBAAiB;AAC3G,cAAQ,eAAe,IAAI;AAAA,IAC/B;AAEA,QAAI,QAAQ,aAAa;AACrB,kBAAY,mBAAmB,QAAQ,aAAa,kBAAkB,QAAQ,YAAY,IAAI,qBAAqB;AACnH,cAAQ,mBAAmB,IAAI;AAAA,IACnC;AAEA,QAAI,QAAQ,WAAW;AACnB,kBAAY,qBAAqB,QAAQ,WAAW,kBAAkB,QAAQ,YAAY,IAAI,mBAAmB;AACjH,UAAI,CAAC,QAAQ,UAAU,WAAW,GAAG,GAAG;AACpC,gBAAQ,YAAY,IAAI,QAAQ;AAAA,MACpC;AAAA,IACJ;AAEA,QAAI,QAAQ,cAAc;AACtB,kBAAY,qBAAqB,QAAQ,cAAc,kBAAkB,QAAQ,YAAY,IAAI,sBAAsB;AACvH,cAAQ,eAAe,IAAI,QAAQ;AAAA,IACvC;AAEA,QAAI,QAAQ,OAAO;AACf,kBAAY,qBAAqB,QAAQ,OAAO,kBAAkB,QAAQ,YAAY,IAAI,eAAe;AACzG,cAAQ,OAAO,IAAI,QAAQ;AAAA,IAC/B;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,OAAO,oBAAoB,SAA+B,QAAwB;AAC9E,QAAI,uBAAmD,QAAQ;AAC/D,QAAI,qBAAgD,QAAQ;AAC5D,QAAI,cAAyC,QAAQ;AACrD,QAAI,eAA2C,QAAQ;AACvD,QAAI,kBAA8C,QAAQ;AAE1D,QAAI,SAAmB,CAAC;AAExB,QAAI,QAAQ,UAAU,QAAQ,OAAO,QAAQ;AACzC,kBAAY,4BAA4B,QAAQ,QAAQ,kBAAkB,QAAQ,YAAY,IAAI,gBAAgB;AAClH,UAAI,OAAO,QAAQ,WAAW,UAAU;AACpC,iBAAS,QAAQ,OAAO,MAAM,GAAG;AAAA,MACrC;AACA,eAAS,KAAK,QAAQ;AAClB,YAAI,OAAO,OAAO,CAAC,EAAE,KAAK;AAC1B,YAAI,SAAS,yBAAyB;AAClC,iCAAuB;AAAA,QAC3B,WAAW,KAAK,SAAS,4BAA4B,GAAG;AACpD,+BAAqB,KAAK,QAAQ,8BAA8B,EAAE,EAAE,QAAQ,MAAM,EAAE;AAAA,QACxF,WAAW,KAAK,WAAW,oBAAoB,GAAG;AAC9C,wBAAc,OAAO,KAAK,QAAQ,sBAAsB,EAAE,EAAE,QAAQ,MAAM,EAAE,CAAC,KAAK;AAAA,QACtF,WAAW,KAAK,SAAS,qBAAqB,GAAG;AAC7C,yBAAe;AAAA,QACnB,WAAW,KAAK,SAAS,yBAAyB,GAAG;AACjD,4BAAkB;AAAA,QACtB;AAAA,MACJ;AAAA,IACJ;AAGA,aAAS,CAAC;AAEV,QAAI,QAAQ;AACR,UAAI,wBAAwB,MAAM;AAC9B,+BAAuB,OAAO;AAAA,MAClC;AACA,2BAAqB,qBAAqB,qBAAqB,OAAO;AACtE,oBAAc,cAAc,cAAc,OAAO;AAAA,IACrD;AAEA,QAAI,sBAAsB;AACtB,kBAAY,mBAAmB,sBAAsB,kBAAkB,QAAQ,YAAY,IAAI,8BAA8B;AAC7H,aAAO,KAAK,uBAAuB;AAAA,IACvC;AAEA,QAAI,oBAAoB;AACpB,kBAAY,qBAAqB,oBAAoB,kBAAkB,QAAQ,YAAY,IAAI,4BAA4B;AAC3H,aAAO,KAAK,8BAA8B,kBAAkB,GAAG;AAAA,IACnE;AAEA,QAAI,eAAe,cAAc,GAAG;AAChC,kBAAY,qBAAqB,aAAa,kBAAkB,QAAQ,YAAY,IAAI,qBAAqB;AAC7G,aAAO,KAAK,uBAAuB,WAAW;AAAA,IAClD;AAEA,QAAI,cAAc;AACd,kBAAY,mBAAmB,cAAc,kBAAkB,QAAQ,YAAY,IAAI,sBAAsB;AAC7G,aAAO,KAAK,qBAAqB;AAAA,IACrC;AAEA,QAAI,iBAAiB;AACjB,kBAAY,mBAAmB,iBAAiB,kBAAkB,QAAQ,YAAY,IAAI,yBAAyB;AACnH,aAAO,KAAK,yBAAyB;AAAA,IACzC;AAEA,WAAO,OAAO,KAAK,GAAG;AAAA,EAC1B;AAAA,EAEA,OAAO,eAAe,UAAkC,QAAwB,cAAgE;AAC5I,UAAM,gBAAgB,aAAa,QAAQ,aAAa,CAAC;AAEzD,UAAM,YAAsB,CAAC;AAC7B,QAAI,mBAAkC;AACtC,QAAI,YAAY;AAEhB,aAAS,QAAQ,CAAC,oBAAoB;AAnb9C,UAAAD;AAobY,sBAAgB,eAAe;AAC/B,WAAI,6CAAc,iBAAgB;AAAO,wBAAgB,cAAc;AACvE,YAAM,cAAc,gBAAgB,WAAW,QAAQ,QAAQ,CAAC,CAAC,gBAAgB;AAEjF,UAAI,CAAC,eAAe,kBAAkB;AAElC,kBAAU,KAAK;AAAA,IAAO,gBAAgB,IAAI;AAE1C,2BAAmB;AACnB,oBAAY;AAAA,MAChB;AAEA,UAAI,CAAC,kBAAkB;AACnB,kBAAU,KAAK;AAAA,IAAO,aAAa,EAAE;AAErC,YAAI,aAAa;AACb,6BAAmB,aAAa,QAAQ,aAAa,CAAC;AACtD,oBAAU,KAAK,4CAA4C,gBAAgB;AAAA,QAC/E;AAAA,MACJ;AAEA,UAAI,aAAa;AACb,kBAAU,KAAK;AAAA,IAAO,gBAAgB,EAAE;AAAA,MAC5C;AAEA,gBAAU,KAAK,gCAAgC;AAC/C,gBAAU,KAAK,mCAAmC;AAElD,UAAI,aAAa;AACb,cAAM,iBAAiB,gBAAgB,QAAS,eAAe,YAAY,IAAI,gBAAgB,QAAS,YAAY,IAAI,EAAE;AAE1H,kBAAU,KAAK,eAAe,cAAc,EAAE;AAAA,MAClD;AAEA,UAAI,GAACA,MAAA,gBAAgB,SAAhB,gBAAAA,IAAsB,WAAW,OAAM;AACxC,kBAAU,KAAK;AAAA,EAAK,gBAAgB,MAAM,IAAI,OAAO,QAAQ,GAAG,GAAG,gBAAgB,IAAI,WAAW;AAAA,MACtG,OAAO;AACH,kBAAU,KAAK;AAAA,EAAK,gBAAgB,MAAM,IAAI,gBAAgB,IAAI,WAAW;AAAA,MACjF;AAEA,UAAI,gBAAgB,WAAW,OAAO;AAClC,kBAAU,KAAK,0BAA0B;AAAA,MAC7C,OAAO;AACH,kBAAU,KAAK,gCAAgC;AAAA,MACnD;AAEA,eAAS,OAAO,gBAAgB,SAAS;AACrC,YAAI,QAAQ,mBAAmB,QAAQ;AAAc;AAErD,kBAAU,KAAK,GAAG,GAAG,KAAK,gBAAgB,QAAQ,GAAG,CAAC,EAAE;AAAA,MAC5D;AAEA,UAAI,gBAAgB,MAAM;AACtB,kBAAU,KAAK;AAAA,EAAK,gBAAe,YAAY,gBAAgB,MAAM,MAAM,CAAC,EAAE;AAAA,MAClF;AAAA,IACJ,CAAC;AAED,QAAI,kBAAkB;AAClB,gBAAU,KAAK;AAAA,IAAO,gBAAgB,IAAI;AAAA,IAC9C;AAEA,cAAU,KAAK;AAAA,IAAO,aAAa,IAAI;AAEvC,UAAM,UAAU,gBAAe,mBAAmB,6CAAc,WAAW;AAC3E,YAAQ,cAAc,IAAI,4BAA4B,aAAa;AAEnE,WAAO,EAAE,SAAkB,MAAM,UAAU,KAAK,IAAI,EAAE;AAAA,EAC1D;AAAA,EAIA,OAAO,mBAAmB,YAAmC;AACzD,QAAI,iBAAiB;AAErB,QAAI,CAAC,QAAQ,OAAO,gBAAe,WAAW,GAAG;AAC7C,uBAAiB,gBAAe,YAAY,UAAU;AACtD,UAAI,QAAQ,OAAO,cAAc,GAAG;AAChC,iBAAS,OAAO,gBAAe,aAAa;AACxC,cAAI,gBAAe,YAAY,GAAG,MAAM,YAAY;AAChD,mBAAO;AAAA,UACX;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,OAAO,YAAY,MAAW,QAAgF;AAC1G,QAAI,kBAAiC;AACrC,QAAI,MAAM;AACN,UAAI,gBAAgB,cAAc,gBAAgB,eAAe,gBAAgB;AAAa,eAAO;AAErG,wBAAkB,KAAK,UAAU,MAAM,CAAC,KAAK,UAAU;AACnD,YAAI,IAAI,SAAS,aAAa,KAAK,IAAI,SAAS,WAAW,GAAG;AAC1D,cAAI,OAAO,UAAU,YAAY,CAAC,MAAM,WAAW,GAAG,GAAG;AAErD,gBAAI,oBAAoB,KAAK,KAAK,GAAG;AACjC,sBAAQ,MAAM,QAAQ,2BAA2B,QAAQ;AAAA,YAC7D;AAEA,gBAAI,OAAO,gBAAgB;AAEvB,oBAAM,oBAAoB;AAC1B,oBAAM,aAAa,kBAAkB,KAAK,KAAK;AAC/C,kBAAI,cAAc,WAAW,SAAS,GAAG;AACrC,sBAAM,iBAAiB,gBAAe,mBAAmB,WAAW,CAAC,CAAC;AAEtE,oBAAI,CAAC,QAAQ,OAAO,cAAc,GAAG;AACjC,0BAAQ,MAAM,QAAQ,mBAAmB,iBAAiB,IAAI;AAAA,gBAClE;AAAA,cACJ;AAAA,YACJ;AAEA,gBAAI,CAAC,MAAM,WAAW,OAAO,QAAQ,GAAG,GAAG;AAEvC,kBAAI,IAAI,SAAS,aAAa,GAAG;AAC7B,oBAAI,CAAC,MAAM,WAAW,GAAG,GAAG;AACxB,0BAAQ,MAAM;AAAA,gBAClB;AAAA,cACJ,OAAO;AACH,wBAAQ,OAAO,QAAQ,MAAM,MAAM,QAAQ,OAAO,EAAE;AAAA,cACxD;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ,WAAW,IAAI,WAAW,OAAO,KAAK,IAAI,SAAS,YAAY,KAAK,IAAI,SAAS,qBAAqB,KAAK,IAAI,SAAS,cAAc,GAAG;AACrI,kBAAQ;AAAA,QACZ;AAEA,eAAO;AAAA,MACX,CAAC;AAED,wBAAkB,gBAAgB,QAAQ,oBAAoB,SAAU,KAAa;AACjF,eAAO,SAAS,SAAS,IAAI,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE;AAAA,MACrE,CAAC;AAAA,IACL;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,OAAO,mBAAmB,UAA4B,CAAC,GAAQ;AAC3D,QAAI,CAAC,QAAQ,QAAQ;AAAG,cAAQ,QAAQ,IAAI;AAC5C,QAAI,CAAC,QAAQ,kBAAkB;AAAG,cAAQ,kBAAkB,IAAI;AAChE,QAAI,CAAC,QAAQ,eAAe;AAAG,cAAQ,eAAe,IAAI;AAC1D,QAAI,QAAQ,eAAe;AAAG,cAAQ,cAAc,IAAI;AAAA,aAC/C,CAAC,QAAQ,cAAc;AAAG,cAAQ,cAAc,IAAI;AAE7D,WAAO;AAAA,EACX;AACJ;AArjBa,gBAqeF,cAAmB;AArevB,IAAM,iBAAN;;;ADjBP;;;AEDA,eAAsBE,gBAAe,SAA4D;AAC7F,SAAO,QAAqB,KAAkB,eAAe,OAAO,IAAI,0CAAmB,eAAe,OAAO;AACrH;;;AFIA,IAAM,qBAAqB,CAAC,WAAW,mBAAmB;AACtD,MAAI,qBAAqB,SAAS;AAAG,yBAAqB,SAAS,EAAE,KAAK,cAAc;AAAA;AACnF,yBAAqB,SAAS,IAAI,CAAC,cAAc;AAC1D;AAEA,IAAM,+BAA+B,CAAC,WAAW,YAAY;AACzD,MAAI,wBAAwB,SAAS;AAAG,4BAAwB,SAAS,EAAE,KAAK,OAAO;AAAA;AAClF,4BAAwB,SAAS,IAAI,CAAC,OAAO;AACtD;AAEA,IAAM,oBAAoB,CAAC,cAA4B;AACnD,SAAO,qBAAqB,SAAS;AACrC,MAAI,wBAAwB,eAAe,SAAS;AAAG,WAAO,wBAAwB,SAAS;AACnG;AAEA,IAAM,cAAc,OAAO,SAA+B,WAAyD;AAC/G,MAAI;AACA,UAAM,SAAS,MAAM,cAAc,YAAY,SAAS,MAAM;AAC9D,sBAAkB,QAAQ,SAAU;AAEpC,WAAO;AAAA,EACX,SAAS,OAAO;AACZ,sBAAkB,QAAQ,SAAU;AACpC,UAAM;AAAA,EACV,UAAE;AACE,sBAAkB,QAAQ,SAAU;AAAA,EACxC;AACJ;AAEA,IAAI,0BAAuD,CAAC;AAC5D,IAAI,uBAAiD,CAAC;AAE/C,IAAM,gBAAN,MAAM,eAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvB,aAAa,YAAY,SAA+B,QAAsD;AA/ClH,QAAAC;AAgDQ,YAAQ,UAAU,QAAQ,WAAW,CAAC;AACtC,YAAQ,qBAAqB,QAAQ,sBAAsB,CAAC;AAC5D,YAAQ,YAAY,QAAQ,aAAa,QAAQ,aAAa;AAG9D,uBAAmB,QAAQ,WAAW,QAAQ,kBAAkB;AAGhE,QAAI,gBAAgB;AAEpB,UAAM,oBAAmBA,MAAA,QAAQ,uBAAR,gBAAAA,IAA4B;AAErD,QAAI,QAAQ,SAAS,YAAY,CAAC,kBAAkB;AAChD,YAAM,eAAe,wBAAwB,QAAQ,SAAS;AAE9D,UAAI,CAAC;AAAc,cAAM,YAAY,aAAa;AAElD,YAAM,cAAc,eAAe,eAAe,cAAc,QAAQ,OAAO;AAE/E,sBAAgB,YAAY;AAC5B,cAAQ,UAAU,EAAE,GAAG,YAAY,SAAS,GAAG,QAAQ,QAAQ;AAG/D,aAAO,wBAAwB,QAAQ,SAAS;AAAA,IACpD,OAAO;AACH,sBAAgB,CAAC,mBAAmB,eAAe,YAAY,QAAQ,MAAM,MAAM,IAAI,QAAQ;AAE/F,UAAI,CAAC;AAAkB,gBAAQ,UAAU,eAAe,mBAAmB,QAAQ,OAAO;AAAA,IAC9F;AAEA,QAAI,OAAO,eAAe,CAAC,QAAQ,QAAS,eAAe,GAAG;AAC1D,cAAQ,QAAS,eAAe,IAAI,OAAO;AAAA,IAC/C;AAEA,QAAI,OAAO,kBAAkB,CAAC,QAAQ,QAAS,gBAAgB,GAAG;AAC9D,cAAQ,QAAS,gBAAgB,IAAI,OAAO;AAAA,IAChD;AAEA,QAAI,QAAqC;AAGzC,QAAI,OAAO,mBAAmB,CAAC,QAAQ,WAAY,QAAQ,WAAW,CAAC,QAAQ,QAAQ,eAAe,IAAK;AACvG,cAAQ,MAAM,OAAO,eAAe;AACpC,UAAI,CAAC;AAAO,cAAM,IAAI,MAAM,qCAAqC;AAAA,IACrE;AAEA,QAAI,OAAO;AACP,cAAQ,QAAS,eAAe,IAAI,aAAa,MAAM,eAAe,aAAa,IAAK,MAAsB,cAAc;AAAA,IAChI;AAEA,QAAI,QAAQ,uBAAuB,GAAG;AAClC,cAAQ,QAAS,4BAA4B,IAAI,MAAM,OAAO,OAAO,MAAO,iBAAiB;AAAA,IACjG;AAEA,UAAM,MAAM,QAAQ,YAAY,QAAQ,UAAU,MAAM,OAAO,QAAQ;AAEvE,WAAO,MAAMC,gBAAe;AAAA,MACxB,QAAQ,QAAQ;AAAA,MAChB,KAAK,IAAK,SAAS,IAAI,QAAQ;AAAA,MAC/B,MAAM;AAAA,MACN,mBAAmB,QAAQ;AAAA,MAC3B,gBAAgB;AAAA,MAChB,SAAS,QAAQ;AAAA,MACjB,SAAS,QAAQ,WAAW,OAAO;AAAA,MACnC,OAAO,OAAO;AAAA,MACd,WAAW,QAAQ;AAAA,MACnB,aAAa,QAAQ;AAAA,IACzB,CAAC;AAAA,EACL;AAAA,EAEA,aAAqB,oBAAoB,YAAoB,QAA4D;AACrH,QAAI,CAAC,QAAQ,OAAO,eAAe,WAAW,GAAG;AAC7C,aAAO,eAAe,mBAAmB,UAAU,KAAK;AAAA,IAC5D;AAEA,UAAM,UAAU,eAAe;AAAA,MAC3B;AAAA,QACI,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ,CAAC,iBAAiB,aAAa;AAAA,QACvC,SAAS;AAAA,QACT,cAAc;AAAA,MAClB;AAAA,MACA;AAAA,IACJ;AAEA,UAAM,SAAS,MAAM,YAAY,SAAS,MAAM;AAChD,mBAAe,cAAc,CAAC;AAC9B,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK,MAAM,QAAQ,KAAK;AAC/C,qBAAe,YAAY,OAAO,KAAK,MAAM,CAAC,EAAE,WAAW,IAAI,OAAO,KAAK,MAAM,CAAC,EAAE;AAAA,IACxF;AAEA,WAAO,eAAe,mBAAmB,UAAU,KAAK;AAAA,EAC5D;AAAA,EAEA,OAAe,uBAAuB,YAA6B;AAC/D,UAAM,aAAa;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAEA,WAAO,WAAW,QAAQ,UAAU,IAAI;AAAA,EAC5C;AAAA,EAEA,aAAqB,qBAAqB,YAAuC,QAA4D;AACzI,QAAI,CAAC,cAAc,eAAc,uBAAuB,UAAU,GAAG;AACjE,aAAO;AAAA,IACX;AAEA,iBAAa,WAAW,YAAY;AAEpC,QAAI,CAAC,OAAO,gBAAgB;AACxB,aAAO;AAAA,IACX;AAEA,QAAI;AACA,aAAO,MAAM,eAAc,oBAAoB,YAAY,MAAM;AAAA,IACrE,SAAS,OAAY;AACjB,YAAM,IAAI,MAAM,8CAA+C,MAA8B,OAAO;AAAA,IACxG;AAAA,EACJ;AAAA,EAEA,aAAa,YAAY,SAA+B,QAAkE;AACtH,YAAQ,qBAAqB,QAAQ,sBAAsB,CAAC;AAE5D,YAAQ,cAAc,QAAQ;AAC9B,WAAO,QAAQ;AAEf,QAAI,CAAC,QAAQ,SAAS;AAClB,YAAM,iBAAiB,MAAM,eAAc,qBAAqB,QAAQ,YAAY,MAAM;AAE1F,cAAQ,aAAa;AACrB,qBAAe,QAAQ,SAAS,MAAM;AACtC,cAAQ,mBAAmB,mBAAmB;AAG9C,UAAI,QAAQ,KAAM,SAAS,KAAM;AAC7B,cAAM,eAAe,eAAe,eAAe,CAAC,OAAO,GAAG,MAAM;AAEpE,gBAAQ,SAAS;AACjB,gBAAQ,OAAO;AACf,gBAAQ,OAAO,aAAa;AAC5B,gBAAQ,UAAU,EAAE,GAAG,aAAa,SAAS,GAAG,QAAQ,YAAY;AACpE,gBAAQ,mBAAmB,mBAAmB;AAAA,MAClD;AAEA,aAAO,YAAY,SAAS,MAAM;AAAA,IACtC;AAGA,mBAAe,QAAQ,SAAS,MAAM;AAEtC,uBAAmB,QAAQ,WAAW,QAAQ,kBAAkB;AAChE,iCAA6B,QAAQ,WAAW,OAAO;AAAA,EAC3D;AAAA,EAEA,OAAO,iBAAuB;AAC1B,mBAAe,cAAc;AAC7B,2BAAuB,CAAC;AACxB,8BAA0B,CAAC;AAAA,EAC/B;AAAA,EAEA,OAAO,kBAAkB,YAAmC;AACxD,WAAO,eAAe,mBAAmB,UAAU;AAAA,EACvD;AACJ;;;AFjNO,IAAM,iBAAN,MAAM,gBAAe;AAAA;AAAA;AAAA;AAAA;AAAA,EASxB,YAAY,QAAiB;AAR7B,SAAQ,UAAU,qBAAqB,QAAQ;AAC/C,SAAQ,WAAW;AACnB,SAAQ,kBAAiC;AAiBzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAY,CAAC,WAAmB,qBAAqB,MAAM,KAAK,SAAS,MAAM;AAE/E,SAAQ,eAAe,OAAO,YAA4E;AACtG,cAAQ,UAAU,KAAK;AACvB,UAAI,KAAK;AAAiB,gBAAQ,YAAY,KAAK;AACnD,aAAO,cAAc,YAAY,SAAS,KAAK,OAAO;AAAA,IAC1D;AAwBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAS,OAAoB,YAAkD;AAC3E,kBAAY,eAAe,SAAS,yBAAyB,SAAS;AAEtE,UAAI;AAEJ,UAAI,CAAwB,QAAS,cAAc;AAC/C,0BAAkB,QAAQ,YAAY,OAAO;AAC7C,wBAAgB,eAAe;AAAA,MACnC;AAAO,0BAAwC;AAE/C,sBAAgB,SAAS;AAEzB,YAAM,WAAW,MAAM,KAAK,aAAa,eAAe;AAExD,aAAO,qCAAU;AAAA,IACrB;AAkBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAW,OAAgB,YAAyC;AA7FxE,UAAAC;AA8FQ,kBAAY,eAAe,SAAS,2BAA2B,SAAS;AAExE,UAAI;AAEJ,UAAI,CAAwB,QAAS,cAAc;AAC/C,0BAAkB,QAAQ,YAAY,OAAO;AAC7C,wBAAgB,eAAe;AAAA,MACnC;AAAO,0BAAkB;AAEzB,sBAAgB,SAAS;AACzB,sBAAgB,qBAAqB;AAAA,QACjC,SAAOA,MAAA,gBAAgB,WAAhB,gBAAAA,IAAwB,YAAW,KAAK,gBAAgB,OAAO,CAAC,EAAE,SAAS,OAAO;AAAA,MAC7F;AAEA,YAAM,WAAW,MAAM,KAAK,aAAa,eAAe;AACxD,aAAO,qCAAU;AAAA,IACrB;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAS,OAAoB,YAAkD;AAC3E,kBAAY,eAAe,SAAS,yBAAyB,SAAS;AAEtE,UAAI;AAEJ,UAAI,CAAwB,QAAS,cAAc;AAC/C,0BAAkB,QAAQ,YAAY,OAAO;AAC7C,wBAAgB,eAAe;AAAA,MACnC;AAAO,0BAAkB;AAGzB,UAAI,CAAC,gBAAgB;AACjB,wBAAgB,SAAS,uEAAuE,KAAK,gBAAgB,cAAc,EAAE,IAC/H,QACA;AAEV,sBAAgB,qBAAqB,EAAE,cAAc,KAAK;AAE1D,UAAI,gBAAgB,WAAW,MAAM;AACjC,wBAAgB,UAAU;AAAA,MAC9B;AAGA,YAAM,UAAU,gBAAgB;AAEhC,UAAI;AACA,cAAM,WAAW,MAAM,KAAK,aAAa,eAAe;AACxD,eAAO,qCAAU;AAAA,MACrB,SAAS,OAAY;AACjB,YAAI,WAAW,MAAM,WAAW,KAAK;AAEjC,iBAAY;AAAA,QAChB;AAEA,cAAM;AAAA,MACV;AAAA,IACJ;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAAuB,OAAgB,YAAqD;AACxF,kBAAY,eAAe,SAAS,uCAAuC,SAAS;AACpF,kBAAY,eAAe,QAAQ,gBAAgB,uCAAuC,wBAAwB;AAElH,UAAI,QAAQ,OAAO,KAAK,QAAQ,cAAc,EAAE,CAAC;AACjD,UAAI,aAAa,QAAQ,eAAe,KAAK;AAE7C,YAAM,kBAAkB,QAAQ,YAAY,OAAO;AACnD,sBAAgB,qBAAqB;AACrC,sBAAgB,OAAO,EAAE,OAAO,WAAW;AAC3C,sBAAgB,eAAe;AAC/B,sBAAgB,SAAS;AAEzB,aAAO,gBAAgB,gBAAgB;AAEvC,YAAM,WAAW,MAAM,KAAK,aAAa,eAAe;AACxD,aAAO,qCAAU;AAAA,IACrB;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAe,OAAO,YAAyC;AAC3D,kBAAY,eAAe,SAAS,+BAA+B,SAAS;AAE5E,UAAI;AAEJ,UAAI,CAAwB,QAAS,cAAc;AAC/C,0BAAkB,QAAQ,YAAY,OAAO;AAC7C,wBAAgB,eAAe;AAAA,MACnC;AAAO,0BAAkB;AAEzB,sBAAgB,SAAS;AACzB,sBAAgB,qBAAqB,EAAE,cAAc,KAAK;AAG1D,YAAM,UAAU,gBAAgB;AAEhC,UAAI;AACA,cAAM,WAAW,MAAM,KAAK,aAAa,eAAe;AACxD,eAAO,qCAAU;AAAA,MACrB,SAAS,OAAY;AACjB,YAAI,WAAW,MAAM,WAAW,KAAK;AAEjC,iBAAO;AAAA,QACX;AAEA,cAAM;AAAA,MACV;AAAA,IACJ;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAS,OAAoB,YAAkD;AAC3E,kBAAY,eAAe,SAAS,yBAAyB,SAAS;AAEtE,YAAM,kBAAkB,QAAQ,YAAY,OAAO;AACnD,sBAAgB,SAAS;AACzB,sBAAgB,eAAe;AAG/B,YAAM,cAAc,gBAAgB;AACpC,YAAM,UAAU,gBAAgB;AAChC,UAAI;AACA,cAAM,WAAW,MAAM,KAAK,aAAa,eAAe;AACxD,eAAO,qCAAU;AAAA,MACrB,SAAS,OAAY;AACjB,YAAI,eAAe,MAAM,WAAW,KAAK;AAErC,iBAAY;AAAA,QAChB,WAAW,WAAW,MAAM,WAAW,KAAK;AAExC,iBAAY;AAAA,QAChB;AAEA,cAAM;AAAA,MACV;AAAA,IACJ;AAEA,SAAQ,mBAAmB,OAAO,SAA+B,WAAgC,WAAmB,SAAiB,MAAqB;AAEtJ,cAAQ,aAAa,SAAS,WAAW,WAAW,MAAM;AAE1D,YAAM,KAAK,aAAa,OAAO;AAE/B,gBAAU;AACV,UAAI,UAAU,UAAU,QAAQ;AAC5B,eAAO,KAAK,iBAAiB,SAAS,WAAW,WAAW,MAAM;AAAA,MACtE;AAAA,IACJ;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAa,OAAO,YAA0C;AAC1D,kBAAY,uBAAuB,6BAA6B,KAAK,QAAQ;AAC7E,kBAAY,eAAe,SAAS,6BAA6B,SAAS;AAE1E,YAAM,kBAAkB,QAAQ,YAAY,SAAS,CAAC,MAAM,CAAC;AAC7D,sBAAgB,SAAS;AACzB,sBAAgB,eAAe;AAC/B,sBAAgB,eAAe;AAE/B,YAAM,WAAW,MAAM,KAAK,aAAa,eAAe;AAExD,sBAAgB,MAAM,qCAAU,KAAK;AACrC,aAAO,gBAAgB;AACvB,aAAO,gBAAgB;AACvB,aAAO,gBAAgB;AACvB,aAAO,KAAK,iBAAiB,iBAAiB,QAAQ,MAAM,qCAAU,KAAK,SAAS;AAAA,IACxF;AAEA,SAAQ,qBAAqB,OACzB,SACA,kBAA0B,GAE1B,OAAe,OACa;AAK5B,cAAQ,QAAQ,WAAW,kBAAkB,OAAO,kBAAkB,QAAQ,oBAAoB;AAClG,cAAQ,eAAe;AAEvB,YAAM,WAAW,MAAM,KAAK,aAAa,OAAO;AAEhD,cAAQ,MAAM,qCAAU,KAAK;AAC7B,cAAQ,qCAAU,KAAK;AAEvB,yBAAmB,QAAQ;AAE3B,UAAI,oBAAmB,qCAAU,KAAK,WAAU;AAC5C,eAAO,KAAK,mBAAmB,SAAS,iBAAiB,IAAI;AAAA,MACjE;AAEA,aAAO;AAAA,QACH,UAAU,qCAAU,KAAK;AAAA,QACzB,UAAU,qCAAU,KAAK;AAAA,QACzB,MAAM,QAAQ,oBAAoB,IAAI;AAAA,MAC1C;AAAA,IACJ;AAMA;AAAA;AAAA;AAAA;AAAA,wBAAe,CAAC,YAAwD;AACpE,kBAAY,uBAAuB,+BAA+B,KAAK,QAAQ;AAC/E,kBAAY,eAAe,SAAS,+BAA+B,SAAS;AAE5E,YAAM,kBAAkB,QAAQ,YAAY,OAAO;AACnD,sBAAgB,SAAS;AACzB,sBAAgB,eAAe;AAC/B,sBAAgB,qBAAqB,EAAE,OAAO,KAAK;AAEnD,aAAO,KAAK,mBAAmB,eAAe;AAAA,IAClD;AASA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAmB,OAAgB,SAAkC,iBAAgE;AACjI,kBAAY,eAAe,SAAS,mCAAmC,SAAS;AAEhF,UAAI;AAEJ,UAAI,CAAwB,QAAS,cAAc;AAC/C,0BAAkB,QAAQ,YAAY,OAAO;AAC7C,wBAAgB,eAAe;AAAA,MACnC;AAAO,0BAAkB;AAEzB,sBAAgB,SAAS;AAEzB,UAAI,cAAc;AACd,oBAAY,qBAAqB,cAAc,mCAAmC,cAAc;AAChG,wBAAgB,MAAM;AAAA,MAC1B;AAEA,YAAM,WAAW,MAAM,KAAK,aAAa,eAAe;AAExD,aAAO,qCAAU;AAAA,IACrB;AAEA,SAAQ,sBAAsB,OAAgB,SAAkC,cAAuB,UAAiB,CAAC,MAA+B;AACpJ,YAAM,WAAW,MAAM,KAAK,iBAAiB,SAAS,YAAY;AAClE,gBAAU,QAAQ,OAAO,SAAS,KAAK;AAEvC,YAAM,WAAW,SAAS;AAE1B,UAAI,UAAU;AACV,eAAO,KAAK,oBAAoB,SAAS,UAAU,OAAO;AAAA,MAC9D;AAEA,YAAM,SAAyB,EAAE,OAAO,QAAQ;AAEhD,UAAI,SAAS,gBAAgB;AACzB,eAAO,kBAAkB,IAAI,SAAS;AACtC,eAAO,iBAAiB,SAAS;AAAA,MACrC;AAEA,aAAO;AAAA,IACX;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAc,CAAU,YAA8D;AAClF,kBAAY,uBAAuB,8BAA8B,KAAK,QAAQ;AAC9E,aAAO,KAAK,oBAAoB,OAAO;AAAA,IAC3C;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAQ,OAAO,YAA2C;AA5Y9D,UAAAA;AA6YQ,kBAAY,eAAe,SAAS,wBAAwB,SAAS;AAErE,YAAM,kBAAkB,QAAQ,YAAY,OAAO;AACnD,sBAAgB,SAAS;AACzB,sBAAgB,eAAe;AAE/B,WAAIA,MAAA,gBAAgB,WAAhB,gBAAAA,IAAwB,QAAQ;AAChC,wBAAgB,QAAQ;AAAA,MAC5B,OAAO;AACH,wBAAgB,qBAAqB;AAAA,MACzC;AAEA,sBAAgB,qBAAqB,EAAE,SAAS,gBAAgB,MAAM;AAGtE,YAAM,WAAW,MAAM,KAAK,aAAa,eAAe;AACxD,aAAO,qCAAU;AAAA,IACrB;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAW,OAAO,YAA8C;AAC5D,kBAAY,uBAAuB,2BAA2B,KAAK,QAAQ;AAC3E,kBAAY,eAAe,SAAS,2BAA2B,SAAS;AAExE,YAAM,WAAW,MAAM,KAAK,oBAAoB,OAAO;AAEvD,aAAO,WAAY,SAAS,QAAQ,SAAS,MAAM,SAAS,IAAK;AAAA,IACrE;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAQ,OAAgB,YAA2D;AAC/E,kBAAY,eAAe,SAAS,wBAAwB,SAAS;AAErE,YAAM,kBAAkB,QAAQ,YAAY,OAAO;AACnD,sBAAgB,SAAS;AACzB,sBAAgB,eAAe;AAE/B,kBAAY,qBAAqB,gBAAgB,UAAU,wBAAwB,kBAAkB;AAGrG,UAAI,gBAAgB,YAAY,CAAC,gBAAgB,KAAK,gBAAgB,QAAQ,GAAG;AAC7E,YAAI,oBAA4B;AAEhC,YAAI,CAAC,iBAAiB,KAAK,gBAAgB,QAAQ,GAAG;AAClD,0BAAgB,aAAa,gBAAgB,cAAc;AAE3D,sBAAY,qBAAqB,gBAAgB,YAAY,wBAAwB,oBAAoB;AACzG,8BAAoB,YAAY,gBAAgB,UAAU;AAAA,QAC9D;AAEA,YAAI,gBAAgB,gBAAgB,MAAM;AACtC,sBAAY,qBAAqB,gBAAgB,cAAc,wBAAwB,sBAAsB;AAC7G,+BAAqB,mBAAmB,gBAAgB,YAAY;AAAA,QACxE;AAGA,YAAI;AAAmB,0BAAgB,WAAW,gBAAgB,SAAS,QAAQ,aAAa,iBAAiB;AAAA,MACrH;AAEA,sBAAgB,qBAAqB,EAAE,YAAY,gBAAgB,WAAW;AAE9E,YAAM,WAAW,MAAM,KAAK,aAAa,eAAe;AAExD,aAAO,qCAAU;AAAA,IACrB;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAW,OAAgB,YAA2D;AAClF,kBAAY,eAAe,SAAS,2BAA2B,SAAS;AAExE,YAAM,sBAAsB,OAAOC,UAA0B,UAAiB,CAAC,MAAoC;AAG/G,cAAM,WAAW,MAAM,KAAK,MAAMA,QAAO;AAEzC,kBAAU,QAAQ,OAAO,SAAS,KAAK;AAEvC,YAAI,SAAS,YAAY;AACrB,UAAAA,SAAQ,aAAa,SAAS,WAAW;AACzC,UAAAA,SAAQ,eAAe,SAAS,WAAW;AAE3C,iBAAO,oBAAoBA,UAAS,OAAO;AAAA,QAC/C;AAEA,eAAO,EAAE,OAAO,QAAQ;AAAA,MAC5B;AAEA,kBAAY,uBAAuB,2BAA2B,KAAK,QAAQ;AAC3E,aAAO,oBAAoB,OAAO;AAAA,IACtC;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAY,OAAO,YAA6C;AAC5D,kBAAY,eAAe,SAAS,4BAA4B,SAAS;AAEzE,YAAM,kBAAkB,QAAQ,YAAY,OAAO;AACnD,sBAAgB,SAAS;AACzB,sBAAgB,eAAe;AAE/B,kBAAY,qBAAqB,QAAQ,mBAAmB,4BAA4B,2BAA2B;AACnH,kBAAY,qBAAqB,QAAQ,kBAAkB,4BAA4B,0BAA0B;AACjH,YAAM,aAAa,YAAY,kBAAkB,QAAQ,YAAY,4BAA4B,oBAAoB;AACrH,YAAM,aAAa,YAAY,kBAAkB,QAAQ,YAAY,4BAA4B,oBAAoB;AAErH,sBAAgB,qBAAqB,QAAQ,mBAAmB;AAChE,sBAAgB,MAAM;AACtB,sBAAgB,OAAO,EAAE,aAAa,GAAG,QAAQ,iBAAiB,IAAI,UAAU,IAAI;AAEpF,YAAM,KAAK,aAAa,eAAe;AAAA,IAC3C;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAe,OAAO,YAAgD;AAClE,kBAAY,eAAe,SAAS,+BAA+B,SAAS;AAE5E,YAAM,kBAAkB,QAAQ,YAAY,OAAO;AACnD,sBAAgB,SAAS;AACzB,sBAAgB,eAAe;AAE/B,kBAAY,qBAAqB,QAAQ,kBAAkB,+BAA+B,0BAA0B;AACpH,YAAM,aAAa,YAAY,kBAAkB,QAAQ,YAAY,+BAA+B,oBAAoB;AACxH,YAAM,aAAa,YAAY,kBAAkB,QAAQ,YAAY,+BAA+B,mBAAmB;AAEvH,sBAAgB,MAAM;AACtB,sBAAgB,qBAAqB,GAAG,QAAQ,gBAAgB,IAAI,UAAU;AAE9E,YAAM,KAAK,aAAa,eAAe;AAAA,IAC3C;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAAwB,OAAO,YAAyD;AACpF,kBAAY,eAAe,SAAS,wCAAwC,SAAS;AAErF,YAAM,kBAAkB,QAAQ,YAAY,OAAO;AACnD,sBAAgB,SAAS;AACzB,sBAAgB,eAAe;AAE/B,YAAM,aAAa,YAAY,kBAAkB,QAAQ,YAAY,wCAAwC,oBAAoB;AACjI,YAAM,aAAa,YAAY,kBAAkB,QAAQ,YAAY,wCAAwC,oBAAoB;AACjI,kBAAY,qBAAqB,QAAQ,oBAAoB,wCAAwC,4BAA4B;AACjI,kBAAY,qBAAqB,QAAQ,mBAAmB,wCAAwC,2BAA2B;AAE/H,sBAAgB,sBAAsB;AACtC,sBAAgB,MAAM;AACtB,sBAAgB,OAAO,EAAE,aAAa,GAAG,QAAQ,iBAAiB,IAAI,UAAU,IAAI;AAEpF,YAAM,KAAK,aAAa,eAAe;AAAA,IAC3C;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAA2B,OAAO,YAA4D;AAC1F,kBAAY,eAAe,SAAS,2CAA2C,SAAS;AAExF,YAAM,kBAAkB,QAAQ,YAAY,OAAO;AACnD,sBAAgB,SAAS;AACzB,sBAAgB,eAAe;AAE/B,YAAM,aAAa,YAAY,kBAAkB,QAAQ,YAAY,2CAA2C,oBAAoB;AACpI,kBAAY,qBAAqB,QAAQ,oBAAoB,2CAA2C,4BAA4B;AAEpI,sBAAgB,sBAAsB;AACtC,sBAAgB,MAAM;AAEtB,YAAM,KAAK,aAAa,eAAe;AAAA,IAC3C;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAA6B,OAAgB,YAAgF;AACzH,kBAAY,eAAe,SAAS,+BAA+B,SAAS;AAE5E,YAAM,kBAAkB,CAACA,aAA2DA,SAAQ,QAAQA,SAAQ;AAE5G,YAAM,WAAW,OAAO,YAAY;AACpC,YAAM,eAAe,WAAW,gBAAgB,OAAO,IAAI;AAC3D,YAAM,gBAAgB,WAAW,iBAAiB;AAClD,YAAM,kBAAwC,WAAW,QAAQ,WAAW,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,aAA2B;AAE9H,kBAAY,qBAAqB,cAAc,+BAA+B,aAAa;AAE3F,YAAM,qBAAqB,QAAQ,wBAAwB,gBAAgB,UAAU;AAErF,sBAAgB,SAAS;AACzB,sBAAgB,iBAAiB,eAAe,mBAAmB;AACnE,sBAAgB,cAAc,mBAAmB;AACjD,sBAAgB,oBAAoB,CAAC,gBAAgB;AACrD,sBAAgB,eAAe;AAE/B,YAAM,WAAW,MAAM,KAAK,aAAa,eAAe;AACxD,aAAO,qCAAU;AAAA,IACrB;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAyB,OACrB,YACqB;AACrB,kBAAY,eAAe,SAAS,6BAA6B,SAAS;AAC1E,kBAAY,qBAAqB,QAAQ,YAAY,6BAA6B,oBAAoB;AAEtG,YAAM,kBAAkB,QAAQ,YAAY,SAAS,CAAC,QAAQ,CAAC;AAC/D,sBAAgB,SAAS;AACzB,sBAAgB,eAAe;AAE/B,sBAAgB,iBAAiB,QAAQ;AACzC,sBAAgB,oBAAoB,CAAC,gBAAgB;AACrD,sBAAgB,OAAO,QAAQ;AAE/B,YAAM,WAAW,MAAM,KAAK,aAAa,eAAe;AACxD,aAAO,qCAAU;AAAA,IACrB;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAe,CAAU,YAA6C;AAClE,kBAAY,eAAe,SAAS,+BAA+B,SAAS;AAC5E,kBAAY,eAAe,QAAQ,MAAM,+BAA+B,cAAc;AAEtF,YAAM,kBAAkB,QAAQ,YAAY,OAAO;AACnD,sBAAgB,aAAa;AAC7B,sBAAgB,eAAe;AAE/B,aAAO,KAAK,OAAsB,eAAe;AAAA,IACrD;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAe,CAAU,YAA6C;AAClE,kBAAY,eAAe,SAAS,+BAA+B,SAAS;AAC5E,kBAAY,eAAe,QAAQ,MAAM,+BAA+B,cAAc;AACtF,kBAAY,mBAAmB,QAAQ,KAAK,YAAY,+BAA+B,yBAAyB;AAEhH,YAAM,kBAAkB,QAAQ,YAAY,OAAO;AACnD,sBAAgB,aAAa;AAC7B,sBAAgB,MAAM,gBAAgB,KAAK;AAC3C,sBAAgB,eAAe;AAC/B,sBAAgB,SAAS;AAEzB,aAAO,KAAK,OAAsB,eAAe;AAAA,IACrD;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAiB,CAAU,YAA+C;AACtE,kBAAY,eAAe,SAAS,iCAAiC,SAAS;AAC9E,kBAAY,kBAAkB,QAAQ,KAAK,iCAAiC,aAAa;AAEzF,YAAM,kBAAkB,QAAQ,YAAY,OAAO;AACnD,sBAAgB,aAAa;AAC7B,sBAAgB,eAAe;AAE/B,aAAO,KAAK,SAA0B,eAAe;AAAA,IACzD;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAmB,CAAU,YAA4E;AACrG,YAAM,kBAAwC,CAAC,UAAU,CAAC,IAAI,QAAQ,YAAY,OAAO;AAEzF,sBAAgB,aAAa;AAC7B,sBAAgB,eAAe;AAE/B,aAAO,KAAK,iBAA0C,eAAe;AAAA,IACzE;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAAkB,CAAU,YAAgD;AACxE,kBAAY,eAAe,SAAS,kCAAkC,SAAS;AAC/E,kBAAY,eAAe,QAAQ,MAAM,kCAAkC,cAAc;AACzF,kBAAY,kBAAkB,QAAQ,WAAW,kCAAkC,mBAAmB;AAEtG,YAAM,kBAAkB,QAAQ,YAAY,OAAO;AACnD,sBAAgB,aAAa;AAC7B,sBAAgB,eAAe;AAC/B,sBAAgB,qBAAqB;AACrC,sBAAgB,MAAM,QAAQ;AAE9B,aAAO,KAAK,OAAsB,eAAe;AAAA,IACrD;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAAkB,CAAU,YAAgD;AACxE,kBAAY,eAAe,SAAS,kCAAkC,SAAS;AAC/E,kBAAY,eAAe,QAAQ,MAAM,kCAAkC,cAAc;AACzF,kBAAY,kBAAkB,QAAQ,WAAW,kCAAkC,mBAAmB;AACtG,kBAAY,mBAAmB,QAAQ,KAAK,YAAY,kCAAkC,yBAAyB;AAEnH,UAAI,QAAQ,UAAU;AAClB,oBAAY,qBAAqB,QAAQ,UAAU,kCAAkC,kBAAkB;AAAA,MAC3G;AAEA,YAAM,kBAAkB,QAAQ,YAAY,OAAO;AACnD,sBAAgB,aAAa;AAC7B,sBAAgB,qBAAqB;AACrC,sBAAgB,wBAAwB,QAAQ,KAAK;AACrD,sBAAgB,wBAAwB,QAAQ;AAChD,sBAAgB,MAAM,QAAQ;AAC9B,sBAAgB,eAAe;AAC/B,sBAAgB,SAAS;AAEzB,aAAO,KAAK,OAAsB,eAAe;AAAA,IACrD;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAqB,CAAU,YAA6E;AACxG,kBAAY,eAAe,SAAS,qCAAqC,SAAS;AAClF,kBAAY,kBAAkB,QAAQ,WAAW,qCAAqC,mBAAmB;AAEzG,UAAI,QAAQ,UAAU;AAClB,oBAAY,qBAAqB,QAAQ,UAAU,qCAAqC,kBAAkB;AAAA,MAC9G;AAEA,YAAM,kBAAkB,QAAQ,YAAY,OAAO;AACnD,sBAAgB,aAAa;AAC7B,sBAAgB,qBAAqB;AACrC,sBAAgB,wBAAwB,QAAQ;AAChD,sBAAgB,MAAM,QAAQ;AAC9B,sBAAgB,eAAe;AAE/B,aAAO,KAAK,iBAA0C,eAAe;AAAA,IACzE;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAAoB,CAAU,YAAkD;AAC5E,kBAAY,eAAe,SAAS,qCAAqC,SAAS;AAClF,kBAAY,kBAAkB,QAAQ,WAAW,oCAAoC,mBAAmB;AACxG,kBAAY,kBAAkB,QAAQ,cAAc,oCAAoC,sBAAsB;AAE9G,UAAI,QAAQ,UAAU;AAClB,oBAAY,qBAAqB,QAAQ,UAAU,oCAAoC,kBAAkB;AAAA,MAC7G;AAEA,YAAM,kBAAkB,QAAQ,YAAY,OAAO;AACnD,sBAAgB,aAAa;AAC7B,sBAAgB,qBAAqB;AACrC,sBAAgB,wBAAwB,QAAQ;AAChD,sBAAgB,wBAAwB,QAAQ;AAChD,sBAAgB,MAAM,QAAQ;AAC9B,sBAAgB,eAAe;AAE/B,aAAO,KAAK,SAA0B,eAAe;AAAA,IACzD;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAqB,CAAU,YAAmD;AAC9E,kBAAY,eAAe,SAAS,qCAAqC,SAAS;AAClF,kBAAY,eAAe,QAAQ,MAAM,qCAAqC,cAAc;AAE5F,YAAM,kBAAkB,QAAQ,YAAY,OAAO;AACnD,sBAAgB,aAAa;AAC7B,sBAAgB,eAAe;AAE/B,aAAO,KAAK,OAAsB,eAAe;AAAA,IACrD;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAqB,CAAU,YAAmD;AAC9E,kBAAY,eAAe,SAAS,qCAAqC,SAAS;AAClF,kBAAY,eAAe,QAAQ,MAAM,qCAAqC,cAAc;AAC5F,kBAAY,mBAAmB,QAAQ,KAAK,YAAY,qCAAqC,yBAAyB;AAEtH,UAAI,QAAQ,UAAU;AAClB,oBAAY,qBAAqB,QAAQ,UAAU,qCAAqC,kBAAkB;AAAA,MAC9G;AAEA,YAAM,kBAAkB,QAAQ,YAAY,OAAO;AACnD,sBAAgB,aAAa;AAC7B,sBAAgB,MAAM,QAAQ,KAAK;AACnC,sBAAgB,qBAAqB,QAAQ;AAC7C,sBAAgB,eAAe;AAC/B,sBAAgB,SAAS;AAEzB,aAAO,KAAK,OAAsB,eAAe;AAAA,IACrD;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAqB,CAAC,YAAqD;AACvE,kBAAY,eAAe,SAAS,qCAAqC,SAAS;AAClF,kBAAY,kBAAkB,QAAQ,KAAK,qCAAqC,aAAa;AAE7F,YAAM,kBAAkB,QAAQ,YAAY,OAAO;AACnD,sBAAgB,aAAa;AAC7B,sBAAgB,eAAe;AAE/B,aAAO,KAAK,aAA4B,eAAe;AAAA,IAC3D;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAAwB,CAAU,YAAiF;AAC/G,YAAM,kBAAwC,CAAC,UAAU,CAAC,IAAI,QAAQ,YAAY,OAAO;AAEzF,sBAAgB,aAAa;AAC7B,sBAAgB,eAAe;AAE/B,UAAI,SAAS;AACT,YAAI,QAAQ,UAAU;AAClB,sBAAY,qBAAqB,QAAQ,UAAU,wCAAwC,kBAAkB;AAC7G,0BAAgB,qBAAqB,QAAQ;AAAA,QACjD;AAAA,MACJ;AAEA,aAAO,KAAK,iBAA0C,eAAe;AAAA,IACzE;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAAuB,CAAU,YAAqD;AAClF,kBAAY,eAAe,SAAS,uCAAuC,SAAS;AACpF,kBAAY,kBAAkB,QAAQ,KAAK,uCAAuC,aAAa;AAE/F,UAAI,QAAQ,UAAU;AAClB,oBAAY,qBAAqB,QAAQ,UAAU,uCAAuC,kBAAkB;AAAA,MAChH;AAEA,YAAM,kBAAkB,QAAQ,YAAY,OAAO;AACnD,sBAAgB,aAAa;AAC7B,sBAAgB,qBAAqB,QAAQ;AAC7C,sBAAgB,eAAe;AAE/B,aAAO,KAAK,SAA0B,eAAe;AAAA,IACzD;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAAwB,CAAU,YAAsD;AACpF,kBAAY,eAAe,SAAS,wCAAwC,SAAS;AACrF,kBAAY,eAAe,QAAQ,MAAM,wCAAwC,cAAc;AAE/F,YAAM,kBAAkB,QAAQ,YAAY,OAAO;AACnD,sBAAgB,aAAa;AAC7B,sBAAgB,eAAe;AAE/B,aAAO,KAAK,OAAsB,eAAe;AAAA,IACrD;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAAwB,CAAU,YAAsD;AACpF,kBAAY,eAAe,SAAS,wCAAwC,SAAS;AACrF,kBAAY,eAAe,QAAQ,MAAM,wCAAwC,cAAc;AAC/F,kBAAY,mBAAmB,QAAQ,KAAK,YAAY,wCAAwC,yBAAyB;AAEzH,UAAI,QAAQ,UAAU;AAClB,oBAAY,qBAAqB,QAAQ,UAAU,wCAAwC,kBAAkB;AAAA,MACjH;AAEA,YAAM,kBAAkB,QAAQ,YAAY,OAAO;AACnD,sBAAgB,aAAa;AAC7B,sBAAgB,MAAM,QAAQ,KAAK;AACnC,sBAAgB,eAAe;AAC/B,sBAAgB,SAAS;AAEzB,aAAO,KAAK,OAAsB,eAAe;AAAA,IACrD;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAAwB,CAAC,YAAwD;AAC7E,kBAAY,eAAe,SAAS,wCAAwC,SAAS;AAErF,YAAM,kBAAkB,QAAQ,YAAY,OAAO;AACnD,sBAAgB,aAAa;AAC7B,sBAAgB,eAAe;AAE/B,aAAO,KAAK,aAA4B,eAAe;AAAA,IAC3D;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mCAA0B,CAAU,YAAwD;AACxF,kBAAY,eAAe,SAAS,0CAA0C,SAAS;AAEvF,UAAI,QAAQ,UAAU;AAClB,oBAAY,qBAAqB,QAAQ,UAAU,0CAA0C,kBAAkB;AAAA,MACnH;AAEA,YAAM,kBAAkB,QAAQ,YAAY,OAAO;AACnD,sBAAgB,aAAa;AAC7B,sBAAgB,qBAAqB,QAAQ;AAC7C,sBAAgB,eAAe;AAE/B,aAAO,KAAK,SAA0B,eAAe;AAAA,IACzD;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAA2B,CAAU,YAAoF;AACrH,YAAM,kBAAwC,CAAC,UAAU,CAAC,IAAI,QAAQ,YAAY,OAAO;AAEzF,sBAAgB,aAAa;AAC7B,sBAAgB,eAAe;AAE/B,UAAI,mCAAS,UAAU;AACnB,oBAAY,qBAAqB,QAAQ,UAAU,2CAA2C,kBAAkB;AAChH,wBAAgB,qBAAqB,QAAQ;AAAA,MACjD;AAEA,aAAO,KAAK,iBAA0C,eAAe;AAAA,IACzE;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAAuB,OAAO,YAAmD;AAC7E,YAAM,kBAAwC,CAAC,UAAU,CAAC,IAAI,QAAQ,YAAY,OAAO;AAEzF,sBAAgB,aAAa;AAC7B,sBAAgB,eAAe;AAE/B,UAAI,mCAAS,gBAAgB;AACzB,oBAAY,mBAAmB,QAAQ,gBAAgB,uCAAuC,wBAAwB;AACtH,wBAAgB,qBAAqB;AAAA,MACzC;AAEA,YAAM,WAAW,MAAM,KAAK,aAAa,eAAe;AACxD,aAAO,qCAAU;AAAA,IACrB;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAyB,OAAqB,YAAqE;AAC/G,kBAAY,eAAe,SAAS,yBAAyB,SAAS;AAEtE,YAAM,WAAW,QAAQ,SAAS,OAAO;AACzC,YAAM,gBAAgB,WAAW,yBAAyB;AAC1D,YAAM,kBAAwC,WAAW,QAAQ,WAAW,OAAO,IAAI,EAAE,OAAO,EAAE,QAAQ,QAAkB,EAAE;AAE9H,kBAAY,eAAe,gBAAgB,OAAO,yBAAyB,eAAe;AAC1F,kBAAY,qBAAqB,gBAAgB,MAAM,QAAQ,yBAAyB,aAAa;AACrG,kBAAY,8BAA8B,gBAAgB,MAAM,QAAQ,yBAAyB,eAAe,GAAG;AAEnH,sBAAgB,aAAa;AAC7B,sBAAgB,eAAe;AAC/B,sBAAgB,SAAS;AACzB,sBAAgB,OAAO,gBAAgB;AACvC,sBAAgB,YAAY,KAAK,QAAQ;AAEzC,aAAO,gBAAgB;AAEvB,YAAM,WAAW,MAAM,KAAK,aAAa,eAAe;AACxD,aAAO,qCAAU;AAAA,IACrB;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA2B,OAA6B,YAA+E;AACnI,kBAAY,eAAe,SAAS,0BAA0B,SAAS;AAEvE,YAAM,WAAW,QAAQ,SAAS,OAAO;AACzC,YAAM,gBAAgB,WAAW,yBAAyB;AAC1D,YAAM,kBAAwC,WAAW,QAAQ,WAAW,OAAO,IAAI,EAAE,OAAO,EAAE,QAAQ,QAAkB,EAAE;AAE9H,kBAAY,eAAe,gBAAgB,OAAO,0BAA0B,eAAe;AAC3F,kBAAY,qBAAqB,gBAAgB,MAAM,QAAQ,0BAA0B,aAAa;AACtG,kBAAY,8BAA8B,gBAAgB,MAAM,QAAQ,0BAA0B,eAAe,GAAG;AAEpH,sBAAgB,eAAe,gBAAgB,aAAa;AAC5D,sBAAgB,SAAS;AACzB,sBAAgB,OAAO,gBAAgB;AACvC,sBAAgB,YAAY,KAAK,QAAQ;AAEzC,aAAO,gBAAgB;AAEvB,YAAM,WAAW,MAAM,KAAK,aAAa,eAAe;AACxD,aAAO,qCAAU;AAAA,IACrB;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAqC,OAAO,YAAyE;AACjH,kBAAY,eAAe,SAAS,+BAA+B,SAAS;AAE5E,YAAM,WAAW,QAAQ,SAAS,OAAO;AACzC,YAAM,gBAAgB,WAAW,yBAAyB;AAC1D,YAAM,kBAAwC,WAAW,QAAQ,WAAW,OAAO,IAAI,EAAE,OAAO,EAAE,QAAQ,QAAkB,EAAE;AAE9H,UAAI;AAAU,oBAAY,eAAe,gBAAgB,OAAO,+BAA+B,eAAe;AAC9G,kBAAY,qBAAqB,gBAAgB,MAAM,QAAQ,+BAA+B,aAAa;AAC3G,kBAAY,8BAA8B,gBAAgB,MAAM,QAAQ,+BAA+B,eAAe,GAAG;AAEzH,sBAAgB,eAAe,gBAAgB,aAAa;AAC5D,sBAAgB,SAAS;AACzB,sBAAgB,OAAO,gBAAgB;AACvC,sBAAgB,YAAY,KAAK,QAAQ;AAEzC,aAAO,gBAAgB;AAEvB,YAAM,WAAW,MAAM,KAAK,aAAa,eAAe;AACxD,aAAO,qCAAU;AAAA,IACrB;AAKA;AAAA;AAAA;AAAA,sBAAa,MAAY;AACrB,WAAK,WAAW;AAChB,WAAK,kBAAkB,QAAQ,aAAa;AAAA,IAChD;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAe,OAAO,YAA2C;AAC7D,kBAAY,qBAAqB,KAAK,QAAQ;AAE9C,YAAM,kBAAwC,CAAC,UAAU,CAAC,IAAI,QAAQ,YAAY,OAAO;AAEzF,sBAAgB,aAAa;AAC7B,sBAAgB,SAAS;AACzB,sBAAgB,eAAe;AAC/B,sBAAgB,YAAY,KAAK;AAEjC,WAAK,kBAAkB;AACvB,WAAK,WAAW;AAEhB,YAAM,WAAW,MAAM,KAAK,aAAa,eAAe;AACxD,aAAO,qCAAU;AAAA,IACrB;AAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAqB,CAAC,WAAoC,IAAI,gBAAe,UAAU,KAAK,OAAO;AAEnG,mBAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQN,mBAAmB,CAAC,eAAsC,cAAc,kBAAkB,UAAU;AAAA,IACxG;AA3nCI,yBAAqB,MAAM,KAAK,SAAS,MAAM;AAAA,EACnD;AA2nCJ;", + "sourcesContent": ["//had to move getCrypto for node to a different local module,\r\n//because esbuild does not support external require in esm format\r\nimport nCrypto from \"node:crypto\";\r\n\r\nexport function getCrypto () {\r\n return nCrypto;\r\n}", "export function getCrypto(): T {\r\n return global.DWA_BROWSER ? global.window.crypto : require(\"./crypto/node\").getCrypto();\r\n}\r\n\r\nexport function generateRandomBytes() {\r\n return global.DWA_BROWSER ? getCrypto().getRandomValues(new Uint8Array(1)) : getCrypto().randomBytes(1);\r\n}\r\n", "const uuid = \"[0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12}\";\r\n\r\nexport function isUuid(value: string): boolean {\r\n const match = new RegExp(uuid, \"i\").exec(value);\r\n return !!match;\r\n}\r\n\r\nexport function extractUuid(value: string): string | null {\r\n const match = new RegExp(\"^{?(\" + uuid + \")}?$\", \"i\").exec(value);\r\n return match ? match[1] : null;\r\n}\r\n\r\nexport function extractUuidFromUrl(url: string): string | null {\r\n const match = new RegExp(\"(\" + uuid + \")\\\\)$\", \"i\").exec(url);\r\n return match ? match[1] : null;\r\n}\r\n", "\uFEFFimport type * as Core from \"../types\";\r\nimport { generateRandomBytes } from \"../helpers/Crypto\";\r\nimport { isUuid, extractUuid } from \"../helpers/Regex\";\r\n\r\ndeclare var GetGlobalContext: any;\r\ndeclare var Xrm: any;\r\n\r\n// function isNodeEnv(): boolean {\r\n// // tslint:disable:strict-type-predicates\r\n// return Object.prototype.toString.call(typeof process !== \"undefined\" ? process : 0) === \"[object process]\";\r\n// }\r\n\r\n// function getGlobalObject(): T {\r\n// return (isNodeEnv() ? global : typeof window !== \"undefined\" ? window : typeof self !== \"undefined\" ? self : {}) as T;\r\n// }\r\n\r\nconst downloadChunkSize = 4194304;\r\n\r\nexport class Utility {\r\n /**\r\n * Builds parametes for a funciton. Returns '()' (if no parameters) or '([params])?[query]'\r\n *\r\n * @param {Object} [parameters] - Function's input parameters. Example: { param1: \"test\", param2: 3 }.\r\n * @returns {string}\r\n */\r\n static buildFunctionParameters(parameters?: any): Core.FunctionParameters {\r\n if (parameters) {\r\n const parameterNames = Object.keys(parameters);\r\n const functionParams: string[] = [];\r\n const urlQuery: string[] = [];\r\n\r\n for (let i = 1; i <= parameterNames.length; i++) {\r\n const parameterName = parameterNames[i - 1];\r\n let value = parameters[parameterName];\r\n\r\n if (value == null) continue;\r\n\r\n if (typeof value === \"string\" && !value.startsWith(\"Microsoft.Dynamics.CRM\") && !isUuid(value)) {\r\n value = `'${value}'`;\r\n } else if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n\r\n functionParams.push(`${parameterName}=@p${i}`);\r\n urlQuery.push(`@p${i}=${extractUuid(value) || value}`);\r\n }\r\n\r\n return {\r\n key: `(${functionParams.join(\",\")})`,\r\n queryParams: urlQuery,\r\n };\r\n } else {\r\n return {\r\n key: \"()\",\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Parses a paging cookie returned in response\r\n *\r\n * @param {string} pageCookies - Page cookies returned in @Microsoft.Dynamics.CRM.fetchxmlpagingcookie.\r\n * @param {number} currentPageNumber - A current page number. Fix empty paging-cookie for complex fetch xmls.\r\n * @returns {{cookie: \"\", number: 0, next: 1}}\r\n */\r\n static getFetchXmlPagingCookie(pageCookies: string = \"\", currentPageNumber: number = 1): Core.FetchXmlCookie {\r\n //get the page cokies\r\n pageCookies = decodeURIComponent(decodeURIComponent(pageCookies));\r\n\r\n const info = /pagingcookie=\"()/.exec(pageCookies);\r\n\r\n if (info != null) {\r\n let page = parseInt(info[2]);\r\n return {\r\n cookie: info[1]\r\n .replace(//g, \">\")\r\n .replace(/\\\"/g, \"'\")\r\n .replace(/\\'/g, \"&\" + \"quot;\"),\r\n page: page,\r\n nextPage: page + 1,\r\n };\r\n } else {\r\n //http://stackoverflow.com/questions/41262772/execution-of-fetch-xml-using-web-api-dynamics-365 workaround\r\n return {\r\n cookie: \"\",\r\n page: currentPageNumber,\r\n nextPage: currentPageNumber + 1,\r\n };\r\n }\r\n }\r\n\r\n // static isNodeEnv = isNodeEnv;\r\n\r\n static downloadChunkSize = downloadChunkSize;\r\n\r\n /**\r\n * Converts a response to a reference object\r\n *\r\n * @param {Object} responseData - Response object\r\n * @returns {ReferenceObject}\r\n */\r\n static convertToReferenceObject(responseData: any): Core.ReferenceObject {\r\n const result = /\\/(\\w+)\\(([0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12})/i.exec(responseData[\"@odata.id\"]);\r\n return { id: result![2], collection: result![1], oDataContext: responseData[\"@odata.context\"] };\r\n }\r\n\r\n /**\r\n * Checks whether the value is JS Null.\r\n * @param {Object} value\r\n * @returns {boolean}\r\n */\r\n static isNull(value: any): boolean {\r\n return typeof value === \"undefined\" || value == null;\r\n }\r\n\r\n /** Generates UUID */\r\n static generateUUID(): string {\r\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) => (c ^ (generateRandomBytes()[0] & (15 >> (c / 4)))).toString(16));\r\n }\r\n\r\n static getXrmContext(): any {\r\n if (typeof GetGlobalContext !== \"undefined\") {\r\n return GetGlobalContext();\r\n } else {\r\n if (typeof Xrm !== \"undefined\") {\r\n //d365 v.9.0\r\n if (!Utility.isNull(Xrm.Utility) && !Utility.isNull(Xrm.Utility.getGlobalContext)) {\r\n return Xrm.Utility.getGlobalContext();\r\n } else if (!Utility.isNull(Xrm.Page) && !Utility.isNull(Xrm.Page.context)) {\r\n return Xrm.Page.context;\r\n }\r\n }\r\n }\r\n\r\n throw new Error(\r\n \"Xrm Context is not available. In most cases, it can be resolved by adding a reference to a ClientGlobalContext.js.aspx. Please refer to MSDN documentation for more details.\"\r\n );\r\n }\r\n\r\n // static getXrmUtility(): any {\r\n // return typeof Xrm !== \"undefined\" ? Xrm.Utility : null;\r\n // }\r\n\r\n static getClientUrl(): string {\r\n const context = Utility.getXrmContext();\r\n\r\n let clientUrl = context.getClientUrl();\r\n\r\n if (clientUrl.match(/\\/$/)) {\r\n clientUrl = clientUrl.substring(0, clientUrl.length - 1);\r\n }\r\n return clientUrl;\r\n }\r\n\r\n /**\r\n * Checks whether the app is currently running in a Dynamics Portals Environment.\r\n *\r\n * In that case we switch to the Web API for Dynamics Portals.\r\n * @returns {boolean}\r\n */\r\n static isRunningWithinPortals(): boolean {\r\n return global.DWA_BROWSER ? !!global.window.shell : false;\r\n }\r\n\r\n static isObject(obj: any): boolean {\r\n return typeof obj === \"object\" && !!obj && !Array.isArray(obj) && Object.prototype.toString.call(obj) !== \"[object Date]\";\r\n }\r\n\r\n static copyObject(src: any, excludeProps?: string[]): T {\r\n let target = {};\r\n for (let prop in src) {\r\n if (src.hasOwnProperty(prop) && !excludeProps?.includes(prop)) {\r\n // if the value is a nested object, recursively copy all its properties\r\n if (Utility.isObject(src[prop])) {\r\n target[prop] = Utility.copyObject(src[prop]);\r\n } else if (Array.isArray(src[prop])) {\r\n target[prop] = src[prop].slice();\r\n } else {\r\n target[prop] = src[prop];\r\n }\r\n }\r\n }\r\n return target;\r\n }\r\n\r\n static copyRequest(src: any, excludeProps: string[] = []): Core.InternalRequest {\r\n //todo: do we need to include \"data\" in here?\r\n if (!excludeProps.includes(\"signal\")) excludeProps.push(\"signal\");\r\n\r\n const result = Utility.copyObject(src, excludeProps);\r\n result.signal = src.signal;\r\n\r\n return result;\r\n }\r\n\r\n static setFileChunk(request: Core.InternalRequest, fileBuffer: Uint8Array | Buffer, chunkSize: number, offset: number): void {\r\n offset = offset || 0;\r\n\r\n const count = offset + chunkSize > fileBuffer.length ? fileBuffer.length % chunkSize : chunkSize;\r\n\r\n let content: any;\r\n\r\n if (global.DWA_BROWSER) {\r\n content = new Uint8Array(count);\r\n for (let i = 0; i < count; i++) {\r\n content[i] = fileBuffer[offset + i];\r\n }\r\n } else {\r\n content = fileBuffer.slice(offset, offset + count);\r\n }\r\n\r\n request.data = content;\r\n request.contentRange = \"bytes \" + offset + \"-\" + (offset + count - 1) + \"/\" + fileBuffer.length;\r\n }\r\n\r\n static convertToFileBuffer(binaryString: string): Uint8Array | Buffer {\r\n if (!global.DWA_BROWSER) return Buffer.from(binaryString, \"binary\");\r\n\r\n const bytes = new Uint8Array(binaryString.length);\r\n for (var i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n return bytes;\r\n }\r\n}\r\n", "\uFEFFimport { AccessToken } from \"../dynamics-web-api\";\r\nimport { extractUuid } from \"./Regex\";\r\n\r\nexport interface DynamicsWebApiError extends Error {\r\n status: number;\r\n}\r\n\r\nfunction throwParameterError(functionName: string, parameterName: string, type: string | null | undefined): void {\r\n throw new Error(\r\n type ? `${functionName} requires a ${parameterName} parameter to be of type ${type}.` : `${functionName} requires a ${parameterName} parameter.`\r\n );\r\n}\r\n\r\nexport class ErrorHelper {\r\n static handleErrorResponse(req): void {\r\n throw new Error(`Error: ${req.status}: ${req.message}`);\r\n }\r\n\r\n static parameterCheck(parameter: any, functionName: string, parameterName: string, type?: string): void {\r\n if (typeof parameter === \"undefined\" || parameter === null || parameter === \"\") {\r\n throwParameterError(functionName, parameterName, type);\r\n }\r\n }\r\n\r\n static stringParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter !== \"string\") {\r\n throwParameterError(functionName, parameterName, \"String\");\r\n }\r\n }\r\n\r\n static maxLengthStringParameterCheck(parameter: string | null, functionName: string, parameterName: string, maxLength: number): void {\r\n if (!parameter) return;\r\n\r\n if (parameter.length > maxLength) {\r\n throw new Error(`${parameterName} has a ${maxLength} character limit.`);\r\n }\r\n }\r\n\r\n static arrayParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (parameter.constructor !== Array) {\r\n throwParameterError(functionName, parameterName, \"Array\");\r\n }\r\n }\r\n\r\n static stringOrArrayParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (parameter.constructor !== Array && typeof parameter !== \"string\") {\r\n throwParameterError(functionName, parameterName, \"String or Array\");\r\n }\r\n }\r\n\r\n static numberParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter != \"number\") {\r\n if (typeof parameter === \"string\" && parameter) {\r\n if (!isNaN(parseInt(parameter))) {\r\n return;\r\n }\r\n }\r\n throwParameterError(functionName, parameterName, \"Number\");\r\n }\r\n }\r\n\r\n static batchIsEmpty(): Error[] {\r\n return [\r\n new Error(\r\n \"Payload of the batch operation is empty. Please make that you have other operations in between startBatch() and executeBatch() to successfuly build a batch payload.\"\r\n ),\r\n ];\r\n }\r\n\r\n static handleHttpError(parsedError: any, parameters?: any): DynamicsWebApiError {\r\n const error = new Error();\r\n\r\n Object.keys(parsedError).forEach((k) => {\r\n error[k] = parsedError[k];\r\n });\r\n\r\n if (parameters) {\r\n Object.keys(parameters).forEach((k) => {\r\n error[k] = parameters[k];\r\n });\r\n }\r\n\r\n return error;\r\n }\r\n\r\n static boolParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter != \"boolean\") {\r\n throwParameterError(functionName, parameterName, \"Boolean\");\r\n }\r\n }\r\n\r\n /**\r\n * Private function used to check whether required parameter is a valid GUID\r\n * @param parameter The GUID parameter to check\r\n * @param functionName\r\n * @param parameterName\r\n * @returns\r\n */\r\n static guidParameterCheck(parameter: any, functionName: string, parameterName: string): string {\r\n const match = extractUuid(parameter);\r\n if (!match) throwParameterError(functionName, parameterName, \"GUID String\");\r\n\r\n return match!;\r\n }\r\n\r\n static keyParameterCheck(parameter: any, functionName: string, parameterName: string): string | undefined {\r\n try {\r\n ErrorHelper.stringParameterCheck(parameter, functionName, parameterName);\r\n\r\n //check if the param is a guid\r\n const match = extractUuid(parameter);\r\n if (match) return match;\r\n\r\n //check the alternate key\r\n const alternateKeys = parameter.split(\",\");\r\n\r\n if (alternateKeys.length) {\r\n for (let i = 0; i < alternateKeys.length; i++) {\r\n alternateKeys[i] = alternateKeys[i].trim().replace(/\"/g, \"'\");\r\n /^[\\w\\d\\_]+\\=(.+)$/i.exec(alternateKeys[i])![0];\r\n }\r\n }\r\n\r\n return alternateKeys.join(\",\");\r\n } catch (error) {\r\n throwParameterError(functionName, parameterName, \"String representing GUID or Alternate Key\");\r\n }\r\n }\r\n\r\n static callbackParameterCheck(callbackParameter: () => Promise, functionName: string, parameterName: string): void {\r\n if (typeof callbackParameter != \"function\") {\r\n throwParameterError(functionName, parameterName, \"Function\");\r\n }\r\n }\r\n\r\n static throwBatchIncompatible(functionName: string, isBatch: boolean): void {\r\n if (isBatch) {\r\n isBatch = false;\r\n throw new Error(functionName + \" cannot be used in a BATCH request.\");\r\n }\r\n }\r\n\r\n static throwBatchNotStarted(isBatch: boolean): void {\r\n if (!isBatch) {\r\n throw new Error(\r\n \"Batch operation has not been started. Please call a DynamicsWebApi.startBatch() function prior to calling DynamicsWebApi.executeBatch() to perform a batch request correctly.\"\r\n );\r\n }\r\n }\r\n}\r\n", "class DWA {\r\n\tstatic Prefer = class {\r\n\t\tstatic ReturnRepresentation: string = \"return=representation\";\r\n\t\tstatic Annotations = class {\r\n\t\t\tstatic AssociatedNavigationProperty: string = \"Microsoft.Dynamics.CRM.associatednavigationproperty\";\r\n\t\t\tstatic LookupLogicalName: string = \"Microsoft.Dynamics.CRM.lookuplogicalname\";\r\n\t\t\tstatic All: string = \"*\";\r\n\t\t\tstatic FormattedValue: string = \"OData.Community.Display.V1.FormattedValue\";\r\n\t\t\tstatic FetchXmlPagingCookie: string = \"Microsoft.Dynamics.CRM.fetchxmlpagingcookie\";\r\n\t\t};\r\n\t\tstatic IncludeAnnotations: string = \"odata.include-annotations\";\r\n\t\tstatic get(annotation: string) {\r\n\t\t\treturn `${DWA.Prefer.IncludeAnnotations}=\"${annotation}\"`;\r\n\t\t}\r\n\t};\r\n}\r\n\r\nexport { DWA };\r\n", "\uFEFFexport function dateReviver(key: string, value: any): Date {\r\n\tif (typeof value === \"string\") {\r\n\t\tconst a = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:Z|[-+]\\d{2}:\\d{2})$/.exec(value);\r\n\t\tif (a) {\r\n\t\t\treturn new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));\r\n\t\t}\r\n\t}\r\n\treturn value;\r\n}\r\n", "\uFEFFimport { DWA } from \"../../dwa\";\r\nimport { Utility } from \"../../utils/Utility\";\r\nimport { ErrorHelper, DynamicsWebApiError } from \"../../helpers/ErrorHelper\";\r\nimport { dateReviver } from \"./dateReviver\";\r\nimport type * as Core from \"../../types\";\r\nimport { extractUuidFromUrl } from \"../../helpers/Regex\";\r\n\r\nfunction getFormattedKeyValue(keyName: string, value: any): any[] {\r\n let newKey: string | null = null;\r\n if (keyName.indexOf(\"@\") !== -1) {\r\n const format = keyName.split(\"@\");\r\n switch (format[1]) {\r\n case \"odata.context\":\r\n newKey = \"oDataContext\";\r\n break;\r\n case \"odata.count\":\r\n newKey = \"oDataCount\";\r\n value = value != null ? parseInt(value) : 0;\r\n break;\r\n case \"odata.nextLink\":\r\n newKey = \"oDataNextLink\";\r\n break;\r\n case \"odata.deltaLink\":\r\n newKey = \"oDataDeltaLink\";\r\n break;\r\n case DWA.Prefer.Annotations.FormattedValue:\r\n newKey = format[0] + \"_Formatted\";\r\n break;\r\n case DWA.Prefer.Annotations.AssociatedNavigationProperty:\r\n newKey = format[0] + \"_NavigationProperty\";\r\n break;\r\n case DWA.Prefer.Annotations.LookupLogicalName:\r\n newKey = format[0] + \"_LogicalName\";\r\n break;\r\n }\r\n }\r\n\r\n return [newKey, value];\r\n}\r\n\r\n/**\r\n *\r\n * @param {any} object - parsed JSON object\r\n * @param {any} parseParams - parameters for parsing the response\r\n * @returns {any} parsed batch response\r\n */\r\nfunction parseData(object: any, parseParams?: any): any {\r\n if (parseParams) {\r\n if (parseParams.isRef && object[\"@odata.id\"] != null) {\r\n return Utility.convertToReferenceObject(object);\r\n }\r\n\r\n if (parseParams.toCount) {\r\n return getFormattedKeyValue(\"@odata.count\", object[\"@odata.count\"])[1] || 0;\r\n }\r\n }\r\n\r\n const keys = Object.keys(object);\r\n\r\n for (let i = 0; i < keys.length; i++) {\r\n const currentKey = keys[i];\r\n\r\n if (object[currentKey] != null) {\r\n if (object[currentKey].constructor === Array) {\r\n for (var j = 0; j < object[currentKey].length; j++) {\r\n object[currentKey][j] = parseData(object[currentKey][j]);\r\n }\r\n } else if (typeof object[currentKey] === \"object\") {\r\n parseData(object[currentKey]);\r\n }\r\n }\r\n\r\n //parse formatted values\r\n let formattedKeyValue = getFormattedKeyValue(currentKey, object[currentKey]);\r\n if (formattedKeyValue[0]) {\r\n object[formattedKeyValue[0]] = formattedKeyValue[1];\r\n }\r\n\r\n //parse aliased values\r\n if (currentKey.indexOf(\"_x002e_\") !== -1) {\r\n const aliasKeys = currentKey.split(\"_x002e_\");\r\n\r\n if (!object.hasOwnProperty(aliasKeys[0])) {\r\n object[aliasKeys[0]] = { _dwaType: \"alias\" };\r\n }\r\n //throw an error if there is already a property which is not an 'alias'\r\n else if (\r\n typeof object[aliasKeys[0]] !== \"object\" ||\r\n (typeof object[aliasKeys[0]] === \"object\" && !object[aliasKeys[0]].hasOwnProperty(\"_dwaType\"))\r\n ) {\r\n throw new Error(\"The alias name of the linked entity must be unique!\");\r\n }\r\n\r\n object[aliasKeys[0]][aliasKeys[1]] = object[currentKey];\r\n\r\n //aliases also contain formatted values\r\n formattedKeyValue = getFormattedKeyValue(aliasKeys[1], object[currentKey]);\r\n if (formattedKeyValue[0]) {\r\n object[aliasKeys[0]][formattedKeyValue[0]] = formattedKeyValue[1];\r\n }\r\n }\r\n }\r\n\r\n if (parseParams) {\r\n if (parseParams.hasOwnProperty(\"pageNumber\") && object[\"@\" + DWA.Prefer.Annotations.FetchXmlPagingCookie] != null) {\r\n object.PagingInfo = Utility.getFetchXmlPagingCookie(object[\"@\" + DWA.Prefer.Annotations.FetchXmlPagingCookie], parseParams.pageNumber);\r\n }\r\n }\r\n\r\n return object;\r\n}\r\n\r\nconst responseHeaderRegex = /^([^()<>@,;:\\\\\"\\/[\\]?={} \\t]+)\\s?:\\s?(.*)/;\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction parseBatchHeaders(text: string): any {\r\n const ctx = { position: 0 };\r\n const headers = {};\r\n let parts;\r\n let line;\r\n let pos;\r\n\r\n do {\r\n pos = ctx.position;\r\n line = readLine(text, ctx);\r\n parts = responseHeaderRegex.exec(line);\r\n if (parts !== null) {\r\n headers[parts[1].toLowerCase()] = parts[2];\r\n } else {\r\n // Whatever was found is not a header, so reset the context position.\r\n ctx.position = pos;\r\n }\r\n } while (line && parts);\r\n\r\n return headers;\r\n}\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction readLine(text: string, ctx: { position: number }): string | null {\r\n return readTo(text, ctx, \"\\r\\n\");\r\n}\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction readTo(text: string, ctx: { position: number }, str: string): string | null {\r\n const start = ctx.position || 0;\r\n let end = text.length;\r\n if (str) {\r\n end = text.indexOf(str, start);\r\n if (end === -1) {\r\n return null;\r\n }\r\n ctx.position = end + str.length;\r\n } else {\r\n ctx.position = end;\r\n }\r\n\r\n return text.substring(start, end);\r\n}\r\n\r\n//partially taken from https://github.com/emiltholin/google-api-batch-utils\r\n/**\r\n *\r\n * @param {string} response - response that needs to be parsed\r\n * @param {Array} parseParams - parameters for parsing the response\r\n * @param {Number} [requestNumber] - number of the request\r\n * @returns {any} parsed batch response\r\n */\r\nfunction parseBatchResponse(response: string, parseParams: any, requestNumber: number = 0): (string | undefined | DynamicsWebApiError | Number)[] {\r\n // Not the same delimiter in the response as we specify ourselves in the request,\r\n // so we have to extract it.\r\n const delimiter = response.substr(0, response.indexOf(\"\\r\\n\"));\r\n const batchResponseParts = response.split(delimiter);\r\n // The first part will always be an empty string. Just remove it.\r\n batchResponseParts.shift();\r\n // The last part will be the \"--\". Just remove it.\r\n batchResponseParts.pop();\r\n\r\n let result: (string | undefined | DynamicsWebApiError | Number)[] = [];\r\n for (let i = 0; i < batchResponseParts.length; i++) {\r\n let batchResponse = batchResponseParts[i];\r\n if (batchResponse.indexOf(\"--changesetresponse_\") > -1) {\r\n batchResponse = batchResponse.trim();\r\n const batchToProcess = batchResponse.substring(batchResponse.indexOf(\"\\r\\n\") + 1).trim();\r\n\r\n result = result.concat(parseBatchResponse(batchToProcess, parseParams, requestNumber));\r\n } else {\r\n //check http status\r\n const httpStatusReg = /HTTP\\/?\\s*[\\d.]*\\s+(\\d{3})\\s+([\\w\\s]*)$/gm.exec(batchResponse);\r\n //todo: add error handler for httpStatus and httpStatusMessage; remove \"!\" operator\r\n const httpStatus = parseInt(httpStatusReg![1]);\r\n const httpStatusMessage = httpStatusReg![2].trim();\r\n\r\n const responseData = batchResponse.substring(batchResponse.indexOf(\"{\"), batchResponse.lastIndexOf(\"}\") + 1);\r\n\r\n if (!responseData) {\r\n if (/Content-Type: text\\/plain/i.test(batchResponse)) {\r\n const plainContentReg = /\\w+$/gi.exec(batchResponse.trim());\r\n const plainContent = plainContentReg && plainContentReg.length ? plainContentReg[0] : undefined;\r\n\r\n //check if a plain content is a number or not\r\n result.push(isNaN(Number(plainContent)) ? plainContent : Number(plainContent));\r\n } else {\r\n if (parseParams.length && parseParams[requestNumber] && parseParams[requestNumber].hasOwnProperty(\"valueIfEmpty\")) {\r\n result.push(parseParams[requestNumber].valueIfEmpty);\r\n } else {\r\n const entityUrl = /OData-EntityId.+/i.exec(batchResponse);\r\n\r\n if (entityUrl && entityUrl.length) {\r\n const guidResult = extractUuidFromUrl(entityUrl[0]);\r\n result.push(guidResult ? guidResult : undefined);\r\n } else {\r\n result.push(undefined);\r\n }\r\n }\r\n }\r\n } else {\r\n const parsedResponse = parseData(JSON.parse(responseData, dateReviver), parseParams[requestNumber]);\r\n\r\n if (httpStatus >= 400) {\r\n const responseHeaders = parseBatchHeaders(\r\n //todo: add error handler for httpStatusReg; remove \"!\" operator\r\n batchResponse.substring(batchResponse.indexOf(httpStatusReg![0]) + httpStatusReg![0].length + 1, batchResponse.indexOf(\"{\"))\r\n );\r\n\r\n result.push(\r\n ErrorHelper.handleHttpError(parsedResponse, {\r\n status: httpStatus,\r\n statusText: httpStatusMessage,\r\n statusMessage: httpStatusMessage,\r\n headers: responseHeaders,\r\n })\r\n );\r\n } else {\r\n result.push(parsedResponse);\r\n }\r\n }\r\n }\r\n\r\n requestNumber++;\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction base64ToString(base64: string): string {\r\n return global.DWA_BROWSER ? global.window.atob(base64) : Buffer.from(base64, \"base64\").toString(\"binary\");\r\n}\r\n\r\nfunction parseFileResponse(response: any, responseHeaders: any, parseParams: any): Core.FileParseResult {\r\n let data = response;\r\n\r\n if (parseParams.hasOwnProperty(\"parse\")) {\r\n data = JSON.parse(data).value;\r\n data = base64ToString(data);\r\n }\r\n\r\n var parseResult: Core.FileParseResult = {\r\n value: data,\r\n };\r\n\r\n if (responseHeaders[\"x-ms-file-name\"]) parseResult.fileName = responseHeaders[\"x-ms-file-name\"];\r\n\r\n if (responseHeaders[\"x-ms-file-size\"]) parseResult.fileSize = parseInt(responseHeaders[\"x-ms-file-size\"]);\r\n\r\n if (hasHeader(responseHeaders, \"Location\")) parseResult.location = getHeader(responseHeaders, \"Location\");\r\n\r\n return parseResult;\r\n}\r\n\r\nfunction hasHeader(headers: any, name: string): boolean {\r\n return headers.hasOwnProperty(name) || headers.hasOwnProperty(name.toLowerCase());\r\n}\r\n\r\nfunction getHeader(headers: any, name: string): string {\r\n if (headers[name]) return headers[name];\r\n\r\n return headers[name.toLowerCase()];\r\n}\r\n\r\n/**\r\n *\r\n * @param {string} response - response that needs to be parsed\r\n * @param {Array} responseHeaders - response headers\r\n * @param {Array} parseParams - parameters for parsing the response\r\n * @returns {any} parsed response\r\n */\r\nexport function parseResponse(response: string, responseHeaders: any, parseParams: any[]): any {\r\n let parseResult: any = undefined;\r\n if (response.length) {\r\n if (response.indexOf(\"--batchresponse_\") > -1) {\r\n const batch = parseBatchResponse(response, parseParams);\r\n\r\n parseResult = parseParams.length === 1 && parseParams[0].convertedToBatch ? batch[0] : batch;\r\n } else {\r\n if (hasHeader(responseHeaders, \"Content-Disposition\")) {\r\n parseResult = parseFileResponse(response, responseHeaders, parseParams[0]);\r\n } else {\r\n const contentType = getHeader(responseHeaders, \"Content-Type\");\r\n if (contentType.startsWith(\"application/json\")) {\r\n parseResult = parseData(JSON.parse(response, dateReviver), parseParams[0]);\r\n } else {\r\n parseResult = isNaN(Number(response)) ? response : Number(response);\r\n }\r\n }\r\n }\r\n } else {\r\n if (parseParams.length && parseParams[0].hasOwnProperty(\"valueIfEmpty\")) {\r\n parseResult = parseParams[0].valueIfEmpty;\r\n } else if (hasHeader(responseHeaders, \"OData-EntityId\")) {\r\n const entityUrl = getHeader(responseHeaders, \"OData-EntityId\");\r\n\r\n const guidResult = extractUuidFromUrl(entityUrl);\r\n\r\n if (guidResult) {\r\n parseResult = guidResult;\r\n }\r\n } else if (hasHeader(responseHeaders, \"Location\")) {\r\n parseResult = {\r\n location: getHeader(responseHeaders, \"Location\"),\r\n };\r\n\r\n if (responseHeaders[\"x-ms-chunk-size\"]) parseResult.chunkSize = parseInt(responseHeaders[\"x-ms-chunk-size\"]);\r\n }\r\n }\r\n\r\n return parseResult;\r\n}\r\n", "\uFEFFimport * as http from \"http\";\r\nimport * as https from \"https\";\r\nimport HttpProxyAgent from \"http-proxy-agent\";\r\nimport HttpsProxyAgent from \"https-proxy-agent\";\r\nimport type * as Core from \"../types\";\r\nimport { ErrorHelper } from \"./../helpers/ErrorHelper\";\r\nimport { parseResponse } from \"./helpers/parseResponse\";\r\n\r\nconst agents: { [key: string]: http.Agent } = {};\r\n\r\nconst getAgent = (options: Core.RequestOptions, protocol: string): http.Agent => {\r\n const isHttp = protocol === \"http\";\r\n const proxy = options.proxy;\r\n const agentName = proxy ? proxy.url : protocol;\r\n\r\n if (!agents[agentName]) {\r\n if (proxy) {\r\n const parsedProxyUrl = new URL(proxy.url);\r\n const proxyAgent = isHttp ? HttpProxyAgent.HttpProxyAgent : HttpsProxyAgent.HttpsProxyAgent;\r\n\r\n const proxyOptions: HttpProxyAgent.HttpProxyAgentOptions | HttpsProxyAgent.HttpsProxyAgentOptions = {\r\n host: parsedProxyUrl.hostname,\r\n port: parsedProxyUrl.port,\r\n protocol: parsedProxyUrl.protocol,\r\n };\r\n\r\n if (proxy.auth) proxyOptions.auth = proxy.auth.username + \":\" + proxy.auth.password;\r\n else if (parsedProxyUrl.username && parsedProxyUrl.password) proxyOptions.auth = `${parsedProxyUrl.username}:${parsedProxyUrl.password}`;\r\n\r\n agents[agentName] = new proxyAgent(proxyOptions);\r\n } else {\r\n const protocolInterface = isHttp ? http : https;\r\n\r\n agents[agentName] = new protocolInterface.Agent({\r\n keepAlive: true,\r\n maxSockets: Infinity,\r\n });\r\n }\r\n }\r\n\r\n return agents[agentName];\r\n};\r\n\r\nexport function executeRequest(options: Core.RequestOptions): Promise {\r\n return new Promise((resolve, reject) => {\r\n _executeRequest(options, resolve, reject);\r\n });\r\n}\r\n\r\n/**\r\n * Sends a request to given URL with given parameters\r\n *\r\n */\r\nfunction _executeRequest(\r\n options: Core.RequestOptions,\r\n successCallback: (response: Core.WebApiResponse) => void,\r\n errorCallback: (error: Core.WebApiErrorResponse | Core.WebApiErrorResponse[]) => void\r\n) {\r\n const data = options.data;\r\n const headers = options.headers;\r\n const responseParams = options.responseParams;\r\n const signal = options.abortSignal;\r\n\r\n const httpHeaders: http.OutgoingHttpHeaders = {};\r\n\r\n if (data) {\r\n httpHeaders[\"Content-Type\"] = headers[\"Content-Type\"];\r\n httpHeaders[\"Content-Length\"] = data.length;\r\n\r\n delete headers[\"Content-Type\"];\r\n }\r\n\r\n //set additional headers\r\n for (let key in headers) {\r\n httpHeaders[key] = headers[key];\r\n }\r\n const parsedUrl = new URL(options.uri);\r\n const protocol = parsedUrl.protocol?.slice(0, -1) || \"https\";\r\n const protocolInterface = protocol === \"http\" ? http : https;\r\n\r\n const internalOptions: http.RequestOptions = {\r\n hostname: parsedUrl.hostname,\r\n port: parsedUrl.port,\r\n path: parsedUrl.pathname + parsedUrl.search,\r\n method: options.method,\r\n timeout: options.timeout || 0,\r\n headers: httpHeaders,\r\n signal: signal,\r\n };\r\n\r\n //support environment variables\r\n if (!options.proxy && process.env[`${protocol}_proxy`]) {\r\n options.proxy = {\r\n url: process.env[`${protocol}_proxy`]!,\r\n };\r\n }\r\n\r\n internalOptions.agent = getAgent(options, protocol);\r\n\r\n if (options.proxy) {\r\n const hostHeader = new URL(options.proxy.url).host;\r\n if (hostHeader) httpHeaders.host = hostHeader;\r\n }\r\n\r\n const request = protocolInterface.request(internalOptions, function (res) {\r\n let rawData = \"\";\r\n res.setEncoding(\"utf8\");\r\n res.on(\"data\", function (chunk) {\r\n rawData += chunk;\r\n });\r\n res.on(\"end\", function () {\r\n switch (res.statusCode) {\r\n case 200: // Success with content returned in response body.\r\n case 201: // Success with content returned in response body.\r\n case 204: // Success with no content returned in response body.\r\n case 206: //Success with partial content\r\n case 304: {\r\n // Success with Not Modified\r\n let responseData = parseResponse(rawData, res.headers, responseParams[options.requestId]);\r\n\r\n let response = {\r\n data: responseData,\r\n headers: res.headers as any,\r\n status: res.statusCode,\r\n };\r\n\r\n successCallback(response);\r\n break;\r\n }\r\n default:\r\n // All other statuses are error cases.\r\n let crmError;\r\n try {\r\n var errorParsed = parseResponse(rawData, res.headers, responseParams[options.requestId]);\r\n\r\n if (Array.isArray(errorParsed)) {\r\n errorCallback(errorParsed);\r\n break;\r\n }\r\n\r\n crmError = errorParsed.hasOwnProperty(\"error\") && errorParsed.error ? errorParsed.error : { message: errorParsed.Message };\r\n } catch (e) {\r\n if (rawData.length > 0) {\r\n crmError = { message: rawData };\r\n } else {\r\n crmError = { message: \"Unexpected Error\" };\r\n }\r\n }\r\n\r\n errorCallback(\r\n ErrorHelper.handleHttpError(crmError, {\r\n status: res.statusCode,\r\n statusText: \"\",\r\n statusMessage: res.statusMessage,\r\n headers: res.headers,\r\n })\r\n );\r\n break;\r\n }\r\n });\r\n });\r\n\r\n if (internalOptions.timeout) {\r\n request.setTimeout(internalOptions.timeout, function () {\r\n request.destroy();\r\n });\r\n }\r\n\r\n request.on(\"error\", function (error) {\r\n errorCallback(error);\r\n });\r\n\r\n if (data) {\r\n request.write(data);\r\n }\r\n\r\n request.end();\r\n}\r\n", "\uFEFFimport { ConfigurationUtility } from \"./utils/Config\";\r\nimport { Utility } from \"./utils/Utility\";\r\nimport { ErrorHelper } from \"./helpers/ErrorHelper\";\r\nimport { RequestClient } from \"./client/RequestClient\";\r\nimport type { InternalRequest, WebApiResponse } from \"./types\";\r\n\r\n/**\r\n * Microsoft Dynamics CRM Web API helper library written in JavaScript.\r\n * It is compatible with: Dynamics 365 (online), Dynamics 365 (on-premise), Dynamics CRM 2016, Dynamics CRM Online.\r\n */\r\nexport class DynamicsWebApi {\r\n private _config = ConfigurationUtility.default();\r\n private _isBatch = false;\r\n private _batchRequestId: string | null = null;\r\n\r\n /**\r\n * Initializes a new instance of DynamicsWebApi\r\n * @param config - Configuration object\r\n */\r\n constructor(config?: Config) {\r\n ConfigurationUtility.merge(this._config, config);\r\n }\r\n\r\n /**\r\n\t * Merges provided configuration properties with an existing one.\r\n\t *\r\n\t * @param {DynamicsWebApi.Config} config - Configuration\r\n\t * @example\r\n\t dynamicsWebApi.setConfig({ serverUrl: 'https://contoso.api.crm.dynamics.com/' });\r\n\t */\r\n setConfig = (config: Config) => ConfigurationUtility.merge(this._config, config);\r\n\r\n private _makeRequest = async (request: InternalRequest): Promise => {\r\n request.isBatch = this._isBatch;\r\n if (this._batchRequestId) request.requestId = this._batchRequestId;\r\n return RequestClient.makeRequest(request, this._config);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a new record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n * @example\r\n *const lead = {\r\n * subject: \"Test WebAPI\",\r\n * firstname: \"Test\",\r\n * lastname: \"WebAPI\",\r\n * jobtitle: \"Title\"\r\n *};\r\n *\r\n *const request = {\r\n * data: lead,\r\n * collection: \"leads\",\r\n * returnRepresentation: true\r\n *}\r\n *\r\n *const response = await dynamicsWebApi.create(request);\r\n *\r\n */\r\n create = async (request: CreateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.create\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"create\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"POST\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n * @example\r\n *const request = {\r\n * key: '7d577253-3ef0-4a0a-bb7f-8335c2596e70',\r\n * collection: \"leads\",\r\n * select: [\"fullname\", \"subject\"],\r\n * ifnonematch: 'W/\"468026\"',\r\n * includeAnnotations: \"OData.Community.Display.V1.FormattedValue\"\r\n *};\r\n *\r\n *const response = await dynamicsWebApi.retrieve(request);\r\n */\r\n retrieve = async (request: RetrieveRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieve\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"retrieve\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"GET\";\r\n internalRequest.responseParameters = {\r\n isRef: internalRequest.select?.length === 1 && internalRequest.select[0].endsWith(\"/$ref\"),\r\n };\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n update = async (request: UpdateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.update\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"update\";\r\n } else internalRequest = request;\r\n\r\n //Metadata definitions, cannot be updated using \"PATCH\" method\r\n if (!internalRequest.method)\r\n internalRequest.method = /EntityDefinitions|RelationshipDefinitions|GlobalOptionSetDefinitions/.test(internalRequest.collection || \"\")\r\n ? \"PUT\"\r\n : \"PATCH\";\r\n\r\n internalRequest.responseParameters = { valueIfEmpty: true };\r\n\r\n if (internalRequest.ifmatch == null) {\r\n internalRequest.ifmatch = \"*\"; //to prevent upsert\r\n }\r\n\r\n //copy locally\r\n const ifmatch = internalRequest.ifmatch;\r\n\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifmatch && error.status === 412) {\r\n //precondition failed - not updated\r\n return false; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a single value in the record.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateSingleProperty = async (request: UpdateSinglePropertyRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateSingleProperty\", \"request\");\r\n ErrorHelper.parameterCheck(request.fieldValuePair, \"DynamicsWebApi.updateSingleProperty\", \"request.fieldValuePair\");\r\n\r\n var field = Object.keys(request.fieldValuePair)[0];\r\n var fieldValue = request.fieldValuePair[field];\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.navigationProperty = field;\r\n internalRequest.data = { value: fieldValue };\r\n internalRequest.functionName = \"updateSingleProperty\";\r\n internalRequest.method = \"PUT\";\r\n\r\n delete internalRequest[\"fieldValuePair\"];\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a record.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteRecord = async (request: DeleteRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteRecord\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"deleteRecord\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.responseParameters = { valueIfEmpty: true };\r\n\r\n //copy locally\r\n const ifmatch = internalRequest.ifmatch;\r\n\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifmatch && error.status === 412) {\r\n //precondition failed - not updated\r\n return false; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to upsert a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n upsert = async (request: UpsertRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.upsert\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"PATCH\";\r\n internalRequest.functionName = \"upsert\";\r\n\r\n //copy locally\r\n const ifnonematch = internalRequest.ifnonematch;\r\n const ifmatch = internalRequest.ifmatch;\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifnonematch && error.status === 412) {\r\n //if prevent update\r\n return null; //todo: check this\r\n } else if (ifmatch && error.status === 404) {\r\n //if prevent create\r\n return null; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n private _uploadFileChunk = async (request: InternalRequest, fileBytes: Uint8Array | Buffer, chunkSize: number, offset: number = 0): Promise => {\r\n // offset = offset || 0;\r\n Utility.setFileChunk(request, fileBytes, chunkSize, offset);\r\n\r\n await this._makeRequest(request);\r\n\r\n offset += chunkSize;\r\n if (offset <= fileBytes.length) {\r\n return this._uploadFileChunk(request, fileBytes, chunkSize, offset);\r\n }\r\n };\r\n\r\n /**\r\n * Upload file to a File Attribute\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n */\r\n uploadFile = async (request: UploadRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.uploadFile\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.uploadFile\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request, [\"data\"]);\r\n internalRequest.method = \"PATCH\";\r\n internalRequest.functionName = \"uploadFile\";\r\n internalRequest.transferMode = \"chunked\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n internalRequest.url = response?.data.location;\r\n delete internalRequest.transferMode;\r\n delete internalRequest.fieldName;\r\n delete internalRequest.fileName;\r\n return this._uploadFileChunk(internalRequest, request.data, response?.data.chunkSize);\r\n };\r\n\r\n private _downloadFileChunk = async (\r\n request: InternalRequest,\r\n bytesDownloaded: number = 0,\r\n // fileSize: number = 0,\r\n data: string = \"\"\r\n ): Promise => {\r\n // bytesDownloaded = bytesDownloaded || 0;\r\n // fileSize = fileSize || 0;\r\n // data = data || \"\";\r\n\r\n request.range = \"bytes=\" + bytesDownloaded + \"-\" + (bytesDownloaded + Utility.downloadChunkSize - 1);\r\n request.downloadSize = \"full\";\r\n\r\n const response = await this._makeRequest(request);\r\n\r\n request.url = response?.data.location;\r\n data += response?.data.value;\r\n\r\n bytesDownloaded += Utility.downloadChunkSize;\r\n\r\n if (bytesDownloaded <= response?.data.fileSize) {\r\n return this._downloadFileChunk(request, bytesDownloaded, data);\r\n }\r\n\r\n return {\r\n fileName: response?.data.fileName,\r\n fileSize: response?.data.fileSize,\r\n data: Utility.convertToFileBuffer(data),\r\n };\r\n };\r\n\r\n /**\r\n * Download a file from a File Attribute\r\n * @param request - An object that represents all possible options for a current request.\r\n */\r\n downloadFile = (request: DownloadRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.downloadFile\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.downloadFile\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"downloadFile\";\r\n internalRequest.responseParameters = { parse: true };\r\n\r\n return this._downloadFileChunk(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve records.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @param {string} [nextPageLink] - Use the value of the @odata.nextLink property with a new GET request to return the next page of data. Pass null to retrieveMultipleOptions.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveMultiple = async (request: RetrieveMultipleRequest, nextPageLink?: string): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveMultiple\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"retrieveMultiple\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"GET\";\r\n\r\n if (nextPageLink) {\r\n ErrorHelper.stringParameterCheck(nextPageLink, \"DynamicsWebApi.retrieveMultiple\", \"nextPageLink\");\r\n internalRequest.url = nextPageLink;\r\n }\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n return response?.data;\r\n };\r\n\r\n private _retrieveAllRequest = async (request: RetrieveMultipleRequest, nextPageLink?: string, records: any[] = []): Promise> => {\r\n const response = await this.retrieveMultiple(request, nextPageLink);\r\n records = records.concat(response.value);\r\n\r\n const pageLink = response.oDataNextLink;\r\n\r\n if (pageLink) {\r\n return this._retrieveAllRequest(request, pageLink, records);\r\n }\r\n\r\n const result: AllResponse = { value: records };\r\n\r\n if (response.oDataDeltaLink) {\r\n result[\"@odata.deltaLink\"] = response.oDataDeltaLink;\r\n result.oDataDeltaLink = response.oDataDeltaLink;\r\n }\r\n\r\n return result;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve all records.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAll = (request: RetrieveMultipleRequest): Promise> => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.retrieveAll\", this._isBatch);\r\n return this._retrieveAllRequest(request);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to count records. IMPORTANT! The count value does not represent the total number of entities in the system. It is limited by the maximum number of entities that can be returned. Returns: Number\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n count = async (request: CountRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.count\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"count\";\r\n\r\n if (internalRequest.filter?.length) {\r\n internalRequest.count = true;\r\n } else {\r\n internalRequest.navigationProperty = \"$count\";\r\n }\r\n\r\n internalRequest.responseParameters = { toCount: internalRequest.count };\r\n\r\n //if filter has not been specified then simplify the request\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to count records. Returns: Number\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n countAll = async (request: CountAllRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.countAll\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.countAll\", \"request\");\r\n\r\n const response = await this._retrieveAllRequest(request);\r\n\r\n return response ? (response.value ? response.value.length : 0) : 0;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to execute FetchXml to retrieve records. Returns: DWA.Types.FetchXmlResponse\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n fetch = async (request: FetchXmlRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.fetch\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"fetch\";\r\n\r\n ErrorHelper.stringParameterCheck(internalRequest.fetchXml, \"DynamicsWebApi.fetch\", \"request.fetchXml\");\r\n\r\n //only add paging if there is no top\r\n if (internalRequest.fetchXml && !/^(request: FetchAllRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.fetchAll\", \"request\");\r\n\r\n const _executeFetchXmlAll = async (request: FetchXmlRequest, records: any[] = []): Promise> => {\r\n // records = records || [];\r\n\r\n const response = await this.fetch(request);\r\n\r\n records = records.concat(response.value);\r\n\r\n if (response.PagingInfo) {\r\n request.pageNumber = response.PagingInfo.nextPage;\r\n request.pagingCookie = response.PagingInfo.cookie;\r\n\r\n return _executeFetchXmlAll(request, records);\r\n }\r\n\r\n return { value: records };\r\n };\r\n\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.fetchAll\", this._isBatch);\r\n return _executeFetchXmlAll(request);\r\n };\r\n\r\n /**\r\n * Associate for a collection-valued navigation property. (1:N or N:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n associate = async (request: AssociateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.associate\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"associate\";\r\n\r\n ErrorHelper.stringParameterCheck(request.relatedCollection, \"DynamicsWebApi.associate\", \"request.relatedcollection\");\r\n ErrorHelper.stringParameterCheck(request.relationshipName, \"DynamicsWebApi.associate\", \"request.relationshipName\");\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.associate\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.associate\", \"request.relatedKey\");\r\n\r\n internalRequest.navigationProperty = request.relationshipName + \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n internalRequest.data = { \"@odata.id\": `${request.relatedCollection}(${relatedKey})` };\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Disassociate for a collection-valued navigation property.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n disassociate = async (request: DisassociateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.disassociate\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.functionName = \"disassociate\";\r\n\r\n ErrorHelper.stringParameterCheck(request.relationshipName, \"DynamicsWebApi.disassociate\", \"request.relationshipName\");\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.disassociate\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.disassociate\", \"request.relatedId\");\r\n\r\n internalRequest.key = primaryKey;\r\n internalRequest.navigationProperty = `${request.relationshipName}(${relatedKey})/$ref`;\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Associate for a single-valued navigation property. (1:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n associateSingleValued = async (request: AssociateSingleValuedRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.associateSingleValued\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"PUT\";\r\n internalRequest.functionName = \"associateSingleValued\";\r\n\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.associateSingleValued\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.associateSingleValued\", \"request.relatedKey\");\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, \"DynamicsWebApi.associateSingleValued\", \"request.navigationProperty\");\r\n ErrorHelper.stringParameterCheck(request.relatedCollection, \"DynamicsWebApi.associateSingleValued\", \"request.relatedcollection\");\r\n\r\n internalRequest.navigationProperty += \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n internalRequest.data = { \"@odata.id\": `${request.relatedCollection}(${relatedKey})` };\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Removes a reference to an entity for a single-valued navigation property. (1:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n disassociateSingleValued = async (request: DisassociateSingleValuedRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.disassociateSingleValued\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.functionName = \"disassociateSingleValued\";\r\n\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.disassociateSingleValued\", \"request.primaryKey\");\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, \"DynamicsWebApi.disassociateSingleValued\", \"request.navigationProperty\");\r\n\r\n internalRequest.navigationProperty += \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Calls a Web API function\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n callFunction: CallFunction = async (request: string | BoundFunctionRequest | UnboundFunctionRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.callFunction`, \"request\");\r\n\r\n const getFunctionName = (request: BoundFunctionRequest | UnboundFunctionRequest) => request.name || request.functionName;\r\n\r\n const isObject = typeof request !== \"string\";\r\n const functionName = isObject ? getFunctionName(request) : request;\r\n const parameterName = isObject ? \"request.name\" : \"name\";\r\n const internalRequest: InternalRequest = isObject ? Utility.copyObject(request, [\"name\"]) : { functionName: functionName };\r\n\r\n ErrorHelper.stringParameterCheck(functionName, `DynamicsWebApi.callFunction`, parameterName);\r\n\r\n const functionParameters = Utility.buildFunctionParameters(internalRequest.parameters);\r\n\r\n internalRequest.method = \"GET\";\r\n internalRequest.addPath = functionName + functionParameters.key;\r\n internalRequest.queryParams = functionParameters.queryParams;\r\n internalRequest._isUnboundRequest = !internalRequest.collection;\r\n internalRequest.functionName = \"callFunction\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Calls a Web API action\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n callAction: CallAction = async (\r\n request: BoundActionRequest | UnboundActionRequest\r\n ): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.callAction`, \"request\");\r\n ErrorHelper.stringParameterCheck(request.actionName, `DynamicsWebApi.callAction`, \"request.actionName\");\r\n\r\n const internalRequest = Utility.copyRequest(request, [\"action\"]);\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"callAction\";\r\n\r\n internalRequest.addPath = request.actionName;\r\n internalRequest._isUnboundRequest = !internalRequest.collection;\r\n internalRequest.data = request.action;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n /**\r\n * Sends an asynchronous request to create an entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createEntity = (request: CreateEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.createEntity`, \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createEntity\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"createEntity\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update an entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateEntity = (request: UpdateEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateEntity\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateEntity\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateEntity\", \"request.data.MetadataId\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.key = internalRequest.data.MetadataId;\r\n internalRequest.functionName = \"updateEntity\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveEntity = (request: RetrieveEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveEntity\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.retrieveEntity\", \"request.key\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntity\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve entity definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveEntities = (request?: RetrieveEntitiesRequest): Promise> => {\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntities\";\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create an attribute.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createAttribute = (request: CreateAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createAttribute\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createAttribute\", \"request.data\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.createAttribute\", \"request.entityKey\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntity\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.key = request.entityKey;\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update an attribute.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateAttribute = (request: UpdateAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateAttribute\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateAttribute\", \"request.data\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.updateAttribute\", \"request.entityKey\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateAttribute\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateAttribute\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.navigationPropertyKey = request.data.MetadataId;\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"updateAttribute\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve attribute metadata for a specified entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAttributes = (request: RetrieveAttributesRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveAttributes\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.retrieveAttributes\", \"request.entityKey\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveAttributes\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"retrieveAttributes\";\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific attribute metadata for a specified entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAttribute = (request: RetrieveAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveAttributes\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.retrieveAttribute\", \"request.entityKey\");\r\n ErrorHelper.keyParameterCheck(request.attributeKey, \"DynamicsWebApi.retrieveAttribute\", \"request.attributeKey\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveAttribute\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.navigationPropertyKey = request.attributeKey;\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"retrieveAttribute\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createRelationship = (request: CreateRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createRelationship\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createRelationship\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"createRelationship\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateRelationship = (request: UpdateRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateRelationship\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateRelationship\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateRelationship\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateRelationship\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.key = request.data.MetadataId;\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"updateRelationship\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteRelationship = (request: DeleteRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteRelationship\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.deleteRelationship\", \"request.key\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"deleteRelationship\";\r\n\r\n return this.deleteRecord(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve relationship definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveRelationships = (request?: RetrieveRelationshipsRequest): Promise> => {\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"retrieveRelationships\";\r\n\r\n if (request) {\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveRelationships\", \"request.castType\");\r\n internalRequest.navigationProperty = request.castType;\r\n }\r\n }\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveRelationship = (request: RetrieveRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveRelationship\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.retrieveRelationship\", \"request.key\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveRelationship\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"retrieveRelationship\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a Global Option Set definition\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createGlobalOptionSet = (request: CreateGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createGlobalOptionSet\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createGlobalOptionSet\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"createGlobalOptionSet\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a Global Option Set.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateGlobalOptionSet = (request: UpdateGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateGlobalOptionSet\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.key = request.data.MetadataId;\r\n internalRequest.functionName = \"updateGlobalOptionSet\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a Global Option Set.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteGlobalOptionSet = (request: DeleteGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteGlobalOptionSet\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"deleteGlobalOptionSet\";\r\n\r\n return this.deleteRecord(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve Global Option Set definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveGlobalOptionSet = (request: RetrieveGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveGlobalOptionSet\", \"request\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveGlobalOptionSet\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"retrieveGlobalOptionSet\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve Global Option Set definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveGlobalOptionSets = (request?: RetrieveGlobalOptionSetsRequest): Promise> => {\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"retrieveGlobalOptionSets\";\r\n\r\n if (request?.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveGlobalOptionSets\", \"request.castType\");\r\n internalRequest.navigationProperty = request.castType;\r\n }\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Retrieves a CSDL Document Metadata\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} A raw CSDL $metadata document.\r\n */\r\n retrieveCsdlMetadata = async (request?: CsdlMetadataRequest): Promise => {\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"$metadata\";\r\n internalRequest.functionName = \"retrieveCsdlMetadata\";\r\n\r\n if (request?.addAnnotations) {\r\n ErrorHelper.boolParameterCheck(request.addAnnotations, \"DynamicsWebApi.retrieveCsdlMetadata\", \"request.addAnnotations\");\r\n internalRequest.includeAnnotations = \"*\";\r\n }\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides a search results page.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Search result\r\n */\r\n search: SearchFunction = async (request: string | SearchRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.search\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.search\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.search\", parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.search\", parameterName, 100);\r\n\r\n internalRequest.collection = \"query\";\r\n internalRequest.functionName = \"search\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Suggestions result\r\n */\r\n suggest: SuggestFunction = async (request: string | SuggestRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.suggest\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.suggest\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.suggest\", parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.suggest\", parameterName, 100);\r\n\r\n internalRequest.functionName = internalRequest.collection = \"suggest\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n autocomplete: AutocompleteFunction = async (request: string | AutocompleteRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.autocomplete\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n if (isObject) ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.autocomplete\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, `DynamicsWebApi.autocomplete`, parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.autocomplete\", parameterName, 100);\r\n\r\n internalRequest.functionName = internalRequest.collection = \"autocomplete\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Starts/executes a batch request.\r\n */\r\n startBatch = (): void => {\r\n this._isBatch = true;\r\n this._batchRequestId = Utility.generateUUID();\r\n };\r\n\r\n /**\r\n * Executes a batch request. Please call DynamicsWebApi.startBatch() first to start a batch request.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n executeBatch = async (request?: BatchRequest): Promise => {\r\n ErrorHelper.throwBatchNotStarted(this._isBatch);\r\n\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"$batch\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"executeBatch\";\r\n internalRequest.requestId = this._batchRequestId;\r\n\r\n this._batchRequestId = null;\r\n this._isBatch = false;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Creates a new instance of DynamicsWebApi. If config is not provided, it is copied from a current instance.\r\n *\r\n * @param {Config} config configuration object.\r\n * @returns {DynamicsWebApi} A new instance of DynamicsWebApi\r\n */\r\n initializeInstance = (config?: Config): DynamicsWebApi => new DynamicsWebApi(config || this._config);\r\n\r\n Utility = {\r\n /**\r\n * Searches for a collection name by provided entity name in a cached entity metadata.\r\n * The returned collection name can be null.\r\n *\r\n * @param {string} entityName entity name\r\n * @returns {string | null} collection name\r\n */\r\n getCollectionName: (entityName: string): string | null => RequestClient.getCollectionName(entityName),\r\n };\r\n}\r\n\r\nexport interface Expand {\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**Limit the number of results returned by using the $top system query option.Do not use $top with $count! */\r\n top?: number;\r\n /**An Array(of Strings) representing the order in which items are returned using the $orderby system query option.Use the asc or desc suffix to specify ascending or descending order respectively.The default is ascending if the suffix isn't applied. */\r\n orderBy?: string[];\r\n /**A name of a single-valued navigation property which needs to be expanded. */\r\n property?: string;\r\n /**An Array of Expand Objects representing the $expand Query Option value to control which related records need to be returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface BaseRequest {\r\n /**XHR requests only! Indicates whether the requests should be made synchronously or asynchronously.Default value is 'true'(asynchronously). */\r\n async?: boolean;\r\n /**Impersonates a user based on their systemuserid by adding \"MSCRMCallerID\" header. A String representing the GUID value for the Dynamics 365 systemuserid. */\r\n impersonate?: string;\r\n /**Impersonates a user based on their Azure Active Directory (AAD) object id by passing that value along with the header \"CallerObjectId\". A String should represent a GUID value. */\r\n impersonateAAD?: string;\r\n /**If set to 'true', DynamicsWebApi adds a request header 'Cache-Control: no-cache'.Default value is 'false'. */\r\n noCache?: boolean;\r\n /** Authorization Token. If set, onTokenRefresh will not be called. */\r\n token?: string;\r\n /**Sets a number of milliseconds before a request times out. */\r\n timeout?: number;\r\n /**The AbortSignal interface represents a signal object that allows you to communicate with a DOM request and abort it if required via an AbortController object. */\r\n signal?: AbortSignal;\r\n /**Indicates if an operation must be included in a Change Set or not. Works in Batch Operations only. By default, it's \"true\", except for GET operations - they are not allowed in Change Sets. */\r\n inChangeSet?: boolean;\r\n /**Headers to supply with a request. These headers will override configuraiton headers if the identical ones were set. */\r\n headers?: HeaderCollection;\r\n /**Custom query parameters. Can be used to set parameter aliases for \"$filter\" and \"$orderBy\". Important! These parameters ARE NOT URI encoded! */\r\n queryParams?: string[];\r\n}\r\n\r\nexport interface BatchRequest extends BaseRequest {\r\n /** Sets Prefer header to \"odata.continue-on-error\" that allows more requests be processed when errors occur. The batch request will return '200 OK' and individual response errors will be returned in the batch response body. */\r\n continueOnError?: boolean;\r\n}\r\n\r\nexport interface Request extends BaseRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection?: string;\r\n}\r\n\r\nexport interface CRUDRequest extends Request {\r\n /**A String representing collection record's Primary Key (GUID) or Alternate Key(s). */\r\n key?: string;\r\n}\r\n\r\nexport interface CountRequest extends Request {\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n}\r\n\r\nexport interface CountAllRequest extends CountRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**An Array (of strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n}\r\n\r\nexport interface FetchAllRequest extends Request {\r\n /**Sets FetchXML - a proprietary query language that provides capabilities to perform aggregation. */\r\n fetchXml: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation. Annotations provide additional information about lookups, options sets and other complex attribute types. For example: * or Microsoft.Dynamics.CRM.fetchxmlpagingcookie */\r\n includeAnnotations?: string;\r\n}\r\n\r\nexport interface FetchXmlRequest extends FetchAllRequest {\r\n /**Page number. */\r\n pageNumber?: number;\r\n /**Paging cookie. To retrive the first page, pagingCookie must be null. */\r\n pagingCookie?: string;\r\n}\r\n\r\nexport interface CreateRequest extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Web API v9+ only! Boolean that enables duplicate detection. */\r\n duplicateDetection?: boolean;\r\n /**A JavaScript object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data?: T;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface UpdateRequestBase extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Web API v9+ only! Boolean that enables duplicate detection. */\r\n duplicateDetection?: boolean;\r\n /**A JavaScript object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data?: T;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**Casts the AttributeMetadata to a specific type. (Used in requests to Attribute Metadata). */\r\n metadataAttributeType?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface UpdateRequest extends UpdateRequestBase {\r\n /**If set to 'true', DynamicsWebApi adds a request header 'MSCRM.MergeLabels: true'. Default value is 'false' */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface UpdateSinglePropertyRequest extends CRUDRequest {\r\n /**Object with a logical name of the field as a key and a value to update with. Example: {subject: \"Update Record\"} */\r\n fieldValuePair: { [key: string]: any };\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n}\r\n\r\nexport interface UpsertRequest extends UpdateRequestBase {\r\n /**Sets If-None-Match header value that enables to use conditional retrieval in applicable requests. */\r\n ifnonematch?: string;\r\n}\r\n\r\nexport interface DeleteRequest extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**Field name that needs to be cleared (for example File Field) */\r\n fieldName?: string;\r\n}\r\n\r\nexport interface RetrieveRequest extends CRUDRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets If-None-Match header value that enables to use conditional retrieval in applicable requests. */\r\n ifnonematch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Casts the AttributeMetadata to a specific type. (Used in requests to Attribute Metadata). */\r\n metadataAttributeType?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**A String representing the GUID value of the saved query. */\r\n savedQuery?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**A String representing the GUID value of the user query. */\r\n userQuery?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface RetrieveMultipleRequest extends Request {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**Use the $apply to aggregate and group your data dynamically */\r\n apply?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Boolean that sets the $count system query option with a value of true to include a count of entities that match the filter criteria up to 5000(per page).Do not use $top with $count! */\r\n count?: boolean;\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets the odata.maxpagesize preference value to request the number of entities returned in the response. */\r\n maxPageSize?: number;\r\n /**An Array(of string) representing the order in which items are returned using the $orderby system query option.Use the asc or desc suffix to specify ascending or descending order respectively.The default is ascending if the suffix isn't applied. */\r\n orderBy?: string[];\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Limit the number of results returned by using the $top system query option.Do not use $top with $count! */\r\n top?: number;\r\n /**Sets Prefer header with value 'odata.track-changes' to request that a delta link be returned which can subsequently be used to retrieve entity changes. */\r\n trackChanges?: boolean;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface AssociateRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Relationship name. */\r\n relationshipName: string;\r\n /**Related name of the Entity Collection or Entity Logical name. */\r\n relatedCollection: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface AssociateSingleValuedRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Navigation property name. */\r\n navigationProperty: string;\r\n /**Related name of the Entity Collection or Entity Logical name. */\r\n relatedCollection: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface DisassociateRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Relationship name. */\r\n relationshipName: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface DisassociateSingleValuedRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Navigation property name. */\r\n navigationProperty: string;\r\n}\r\n\r\nexport interface UnboundFunctionRequest extends BaseRequest {\r\n /**\r\n * Name of the function.\r\n */\r\n name?: string;\r\n /**\r\n * Name of the function. \r\n * @deprecated Use \"name\" parameter.\r\n */\r\n functionName?: string;\r\n /**Function's input parameters. Example: { param1: \"test\", param2: 3 }. */\r\n parameters?: any;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n}\r\n\r\nexport interface BoundFunctionRequest extends UnboundFunctionRequest, Request {\r\n /**A String representing the GUID value for the record. */\r\n key?: string;\r\n}\r\n\r\nexport interface UnboundActionRequest extends BaseRequest {\r\n /**A name of the Web API action. */\r\n actionName: string;\r\n /**An object that represents a Dynamics 365 action. */\r\n action?: TAction;\r\n}\r\n\r\nexport interface BoundActionRequest extends UnboundActionRequest, Request {\r\n /**A String representing the GUID value for the record. */\r\n key?: string;\r\n}\r\n\r\nexport interface CreateEntityRequest extends BaseRequest {\r\n /**An object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateEntityRequest extends CRUDRequest {\r\n /**An object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data: any;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface RetrieveEntityRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveEntitiesRequest extends BaseRequest {\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateAttributeRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Attribute metadata object. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateAttributeRequest extends CreateAttributeRequest {\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface RetrieveAttributesRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveAttributeRequest extends BaseRequest {\r\n /**An Attribute MetadataId or Alternate Key (such as LogicalName). */\r\n attributeKey: string;\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateRelationshipRequest extends BaseRequest {\r\n /**Relationship Definition. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateRelationshipRequest extends CreateRelationshipRequest {\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface DeleteRelationshipRequest extends BaseRequest {\r\n /**A Relationship MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n}\r\n\r\nexport interface RetrieveRelationshipsRequest extends BaseRequest {\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveRelationshipRequest extends BaseRequest {\r\n /**A Relationship MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateGlobalOptionSetRequest extends BaseRequest {\r\n /**Global Option Set Definition. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateGlobalOptionSetRequest extends CreateRelationshipRequest {\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface DeleteGlobalOptionSetRequest extends BaseRequest {\r\n /**A Global Option Set MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n}\r\n\r\nexport interface RetrieveGlobalOptionSetsRequest extends BaseRequest {\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveGlobalOptionSetRequest extends BaseRequest {\r\n /**A Global Option Set MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface UploadRequest extends CRUDRequest {\r\n /**Binary Buffer*/\r\n data: Uint8Array | Buffer;\r\n /**Name of the file */\r\n fileName: string;\r\n /**File Field Name */\r\n fieldName: string;\r\n}\r\n\r\nexport interface DownloadRequest extends CRUDRequest {\r\n /**File Field Name */\r\n fieldName: string;\r\n}\r\n\r\nexport interface CsdlMetadataRequest extends BaseRequest {\r\n /**If set to \"true\" the document will include many different kinds of annotations that can be useful. Most annotations are not included by default because they increase the total size of the document. */\r\n addAnnotations?: boolean;\r\n}\r\n\r\nexport type SearchMode = \"any\" | \"all\";\r\nexport type SearchType = \"simple\" | \"full\";\r\n\r\nexport interface SearchQueryBase {\r\n /**The search parameter value contains the term to be searched for and has a 100-character limit. For suggestions, min 3 characters in addition. */\r\n search: string;\r\n /**The default table list searches across all Dataverse search\u2013configured tables and columns. The default list is configured by your administrator when Dataverse search is enabled. */\r\n entities?: string[];\r\n /**Filters are applied while searching data and are specified in standard OData syntax. */\r\n filter?: string;\r\n}\r\n\r\nexport interface Search extends SearchQueryBase {\r\n /**Facets support the ability to drill down into data results after they've been retrieved. */\r\n facets?: string[];\r\n /**Specify true to return the total record count; otherwise false. The default is false. */\r\n returnTotalRecordCount?: boolean;\r\n /**Specifies the number of search results to skip. */\r\n skip?: number;\r\n /**Specifies the number of search results to retrieve. The default is 50, and the maximum value is 100. */\r\n top?: number;\r\n /**A list of comma-separated clauses where each clause consists of a column name followed by 'asc' (ascending, which is the default) or 'desc' (descending). This list specifies how to order the results in order of precedence. */\r\n orderBy?: string[];\r\n /**Specifies whether any or all the search terms must be matched to count the document as a match. The default is 'any'. */\r\n searchMode?: SearchMode;\r\n /**The search type specifies the syntax of a search query. Using 'simple' selects simple query syntax and 'full' selects Lucene query syntax. The default is 'simple'. */\r\n searchType?: SearchType;\r\n}\r\n\r\nexport interface Suggest extends SearchQueryBase {\r\n /**Use fuzzy search to aid with misspellings. The default is false. */\r\n useFuzzy?: boolean;\r\n /**Number of suggestions to retrieve. The default is 5. */\r\n top?: number;\r\n /**A list of comma-separated clauses where each clause consists of a column name followed by 'asc' (ascending, which is the default) or 'desc' (descending). This list specifies how to order the results in order of precedence. */\r\n orderBy?: string[];\r\n}\r\n\r\nexport interface Autocomplete extends SearchQueryBase {\r\n /**Use fuzzy search to aid with misspellings. The default is false. */\r\n useFuzzy?: boolean;\r\n}\r\n\r\nexport interface SearchRequest extends BaseRequest {\r\n /**Search query object */\r\n query: Search;\r\n}\r\n\r\nexport interface SuggestRequest extends BaseRequest {\r\n /**Suggestion query object */\r\n query: Suggest;\r\n}\r\n\r\nexport interface AutocompleteRequest extends BaseRequest {\r\n /**Autocomplete query object */\r\n query: Autocomplete;\r\n}\r\n\r\nexport interface ApiConfig {\r\n /** API Version to use, for example: \"9.2\" or \"1.0\" */\r\n version?: string;\r\n /** API Path, for example: \"data\" or \"search\" */\r\n path?: string;\r\n}\r\n\r\nexport interface AccessToken {\r\n /** Access Token */\r\n accessToken: string;\r\n}\r\n\r\nexport interface Config {\r\n /**The url to Dataverse API server, for example: https://contoso.api.crm.dynamics.com/. It is required when used in Node.js application. */\r\n serverUrl?: string | null;\r\n /**Impersonates a user based on their systemuserid by adding \"MSCRMCallerID\" header. A String representing the GUID value for the Dynamics 365 systemuserid. */\r\n impersonate?: string | null;\r\n /**Impersonates a user based on their Azure Active Directory (AAD) object id by passing that value along with the header \"CallerObjectId\". A String should represent a GUID value. */\r\n impersonateAAD?: string | null;\r\n /**A function that is called when a security token needs to be refreshed. */\r\n onTokenRefresh?: (() => Promise) | null;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types.*/\r\n includeAnnotations?: string | null;\r\n /**Sets the odata.maxpagesize preference value to request the number of entities returned in the response. */\r\n maxPageSize?: number | null;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request.*/\r\n returnRepresentation?: boolean | null;\r\n /**Indicates whether to use Entity Logical Names instead of Collection Logical Names.*/\r\n useEntityNames?: boolean | null;\r\n /**Sets a number of milliseconds before a request times out. */\r\n timeout?: number | null;\r\n /**Proxy configuration object. */\r\n proxy?: ProxyConfig | null;\r\n /**Configuration object for Dataverse Web API (with path \"data\"). */\r\n dataApi?: ApiConfig;\r\n /**Configuration object for Dataverse Search API (with path \"search\"). */\r\n searchApi?: ApiConfig;\r\n /**Default headers to supply with each request. */\r\n headers?: HeaderCollection;\r\n}\r\n\r\n/**Header collection type */\r\nexport type HeaderCollection = Record;\r\n\r\nexport interface ProxyConfig {\r\n /**Proxy server url */\r\n url: string;\r\n /**Basic authentication credentials */\r\n auth?: {\r\n /**Username */\r\n username: string;\r\n /**Password */\r\n password: string;\r\n };\r\n}\r\n\r\n/** Callback with an acquired token called by DynamicsWebApi; \"token\" argument can be a string or an object with a property {accessToken: } */\r\n// export interface OnTokenAcquiredCallback {\r\n// (token: any): void;\r\n// }\r\n\r\nexport interface RequestError extends Error {\r\n /**The name of the error */\r\n name: string;\r\n /**This code is not related to the http status code and is frequently empty */\r\n code?: string;\r\n /**A message describing the error */\r\n message: string;\r\n /**HTTP status code */\r\n status?: number;\r\n /**HTTP status text. Frequently empty */\r\n statusText?: string;\r\n /**HTTP Response headers */\r\n headers?: any;\r\n /**Details about an error */\r\n innererror?: {\r\n /**A message describing the error, this is frequently the same as the outer message */\r\n message?: string;\r\n /**Microsoft.Crm.CrmHttpException */\r\n type?: string;\r\n /**Details from the server about where the error occurred */\r\n stacktrace?: string;\r\n };\r\n}\r\n\r\nexport interface MultipleResponse {\r\n /**Multiple respone entities */\r\n value: T[];\r\n oDataCount?: number;\r\n \"@odata.count\"?: number;\r\n oDataContext?: string;\r\n \"@odata.context\"?: number;\r\n}\r\n\r\nexport interface AllResponse extends MultipleResponse {\r\n /**@odata.deltaLink value */\r\n oDataDeltaLink?: string;\r\n}\r\n\r\nexport interface RetrieveMultipleResponse extends MultipleResponse {\r\n \"@Microsoft.Dynamics.CRM.totalrecordcount\"?: number;\r\n \"@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded\"?: boolean;\r\n /**@odata.nextLink value */\r\n oDataNextLink?: string;\r\n /**@odata.deltaLink value */\r\n oDataDeltaLink?: string;\r\n \"@odata.deltaLink\"?: string;\r\n \"@odata.nextLink\"?: string;\r\n}\r\n\r\nexport interface FetchXmlResponse extends MultipleResponse {\r\n \"@Microsoft.Dynamics.CRM.totalrecordcount\"?: number;\r\n \"@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded\"?: boolean;\r\n /**Paging information */\r\n PagingInfo?: {\r\n /**Number of the next page */\r\n nextPage?: number;\r\n /**Next page cookie */\r\n cookie?: string;\r\n };\r\n}\r\n\r\nexport interface DownloadResponse {\r\n /**The name of the file */\r\n fileName: string;\r\n /**File size */\r\n fileSize: number;\r\n /**File Data */\r\n data: Uint8Array | Buffer;\r\n}\r\n\r\nexport interface SearchResponse {\r\n /**Search results*/\r\n value: TValue[];\r\n facets: any | null;\r\n totalrecordcount: number;\r\n querycontext: any | null;\r\n}\r\n\r\nexport interface SuggestResponseValue {\r\n text: string;\r\n document: TDocument;\r\n}\r\n\r\nexport interface SuggestResponse {\r\n /**Suggestions*/\r\n value: SuggestResponseValue[];\r\n querycontext: any | null;\r\n}\r\n\r\nexport interface AutocompleteResponse {\r\n /**Autocomplete result*/\r\n value: string | null;\r\n querycontext: any | null;\r\n}\r\n\r\n//function overloads\r\n\r\ntype CallFunction = {\r\n /**\r\n * Calls a Web API function\r\n *\r\n * @param name - The name of a function.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (name: string): Promise;\r\n /**\r\n * Calls a bound Web API function\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundFunctionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API function (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundFunctionRequest): Promise;\r\n};\r\n\r\ntype CallAction = {\r\n /**\r\n * Calls a bound Web API action (bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {T} Type of the value in a response\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundActionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API action (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {T} Type of the value in a response\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundActionRequest): Promise;\r\n /**\r\n * Calls a bound Web API action (bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {TResponse} Type of the value in a response\r\n * @type {TAction} Type of an action object\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundActionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API action (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {TResponse} Type of the value in a response\r\n * @type {TAction} Type of an action object\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundActionRequest): Promise;\r\n};\r\n\r\ntype SearchFunction = {\r\n /**\r\n * Provides a search results page.\r\n * @param term - The term to be searched for and has a max 100-character limit.\r\n * @returns {Promise} Search result\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides a search results page.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Search result\r\n */\r\n (request: SearchRequest): Promise>;\r\n};\r\n\r\ntype SuggestFunction = {\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param term - The term to be searched for and has min 3 characters to a max 100-character limit.\r\n * @returns {Promise} Suggestions result\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Suggestions result\r\n */\r\n (request: SuggestRequest): Promise>;\r\n};\r\n\r\ntype AutocompleteFunction = {\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param term - The term to be searched for and has a 100-character limit.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n (request: AutocompleteRequest): Promise;\r\n};\r\n", "import { Utility } from \"./Utility\";\r\nimport { ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { ApiConfig, Config } from \"../dynamics-web-api\";\r\n\r\ntype ApiType = \"dataApi\" | \"searchApi\";\r\n\r\nexport interface InternalApiConfig extends ApiConfig {\r\n url: string;\r\n}\r\n\r\nexport interface InternalConfig extends Config {\r\n dataApi: InternalApiConfig;\r\n searchApi: InternalApiConfig;\r\n}\r\n\r\nconst getApiUrl = (serverUrl: string | undefined | null, apiConfig: ApiConfig): string => {\r\n if (Utility.isRunningWithinPortals()) {\r\n return new URL(\"_api\", global.window.location.origin).toString() + \"/\";\r\n } else {\r\n if (!serverUrl) serverUrl = Utility.getClientUrl();\r\n return new URL(`api/${apiConfig.path}/v${apiConfig.version}`, serverUrl).toString() + \"/\";\r\n }\r\n};\r\n\r\nconst mergeApiConfigs = (apiConfig: ApiConfig | undefined, apiType: ApiType, internalConfig: InternalConfig): void => {\r\n const internalApiConfig = internalConfig[apiType] as InternalApiConfig;\r\n\r\n if (apiConfig?.version) {\r\n ErrorHelper.stringParameterCheck(apiConfig.version, \"DynamicsWebApi.setConfig\", `config.${apiType}.version`);\r\n internalApiConfig.version = apiConfig.version;\r\n }\r\n\r\n if (apiConfig?.path) {\r\n ErrorHelper.stringParameterCheck(apiConfig.path, \"DynamicsWebApi.setConfig\", `config.${apiType}.path`);\r\n internalApiConfig.path = apiConfig.path;\r\n }\r\n\r\n internalApiConfig.url = getApiUrl(internalConfig.serverUrl, internalApiConfig);\r\n};\r\n\r\nexport class ConfigurationUtility {\r\n static mergeApiConfigs = mergeApiConfigs;\r\n\r\n static merge(internalConfig: InternalConfig, config?: Config): void {\r\n if (config?.serverUrl) {\r\n ErrorHelper.stringParameterCheck(config.serverUrl, \"DynamicsWebApi.setConfig\", \"config.serverUrl\");\r\n internalConfig.serverUrl = config.serverUrl;\r\n }\r\n\r\n mergeApiConfigs(config?.dataApi, \"dataApi\", internalConfig);\r\n mergeApiConfigs(config?.searchApi, \"searchApi\", internalConfig);\r\n\r\n if (config?.impersonate) {\r\n internalConfig.impersonate = ErrorHelper.guidParameterCheck(config.impersonate, \"DynamicsWebApi.setConfig\", \"config.impersonate\");\r\n }\r\n\r\n if (config?.impersonateAAD) {\r\n internalConfig.impersonateAAD = ErrorHelper.guidParameterCheck(config.impersonateAAD, \"DynamicsWebApi.setConfig\", \"config.impersonateAAD\");\r\n }\r\n\r\n if (config?.onTokenRefresh) {\r\n ErrorHelper.callbackParameterCheck(config.onTokenRefresh, \"DynamicsWebApi.setConfig\", \"config.onTokenRefresh\");\r\n internalConfig.onTokenRefresh = config.onTokenRefresh;\r\n }\r\n\r\n if (config?.includeAnnotations) {\r\n ErrorHelper.stringParameterCheck(config.includeAnnotations, \"DynamicsWebApi.setConfig\", \"config.includeAnnotations\");\r\n internalConfig.includeAnnotations = config.includeAnnotations;\r\n }\r\n\r\n if (config?.timeout) {\r\n ErrorHelper.numberParameterCheck(config.timeout, \"DynamicsWebApi.setConfig\", \"config.timeout\");\r\n internalConfig.timeout = config.timeout;\r\n }\r\n\r\n if (config?.maxPageSize) {\r\n ErrorHelper.numberParameterCheck(config.maxPageSize, \"DynamicsWebApi.setConfig\", \"config.maxPageSize\");\r\n internalConfig.maxPageSize = config.maxPageSize;\r\n }\r\n\r\n if (config?.returnRepresentation) {\r\n ErrorHelper.boolParameterCheck(config.returnRepresentation, \"DynamicsWebApi.setConfig\", \"config.returnRepresentation\");\r\n internalConfig.returnRepresentation = config.returnRepresentation;\r\n }\r\n\r\n if (config?.useEntityNames) {\r\n ErrorHelper.boolParameterCheck(config.useEntityNames, \"DynamicsWebApi.setConfig\", \"config.useEntityNames\");\r\n internalConfig.useEntityNames = config.useEntityNames;\r\n }\r\n\r\n if (config?.headers) {\r\n internalConfig.headers = config.headers;\r\n }\r\n\r\n if (!global.DWA_BROWSER && config?.proxy) {\r\n ErrorHelper.parameterCheck(config.proxy, \"DynamicsWebApi.setConfig\", \"config.proxy\");\r\n\r\n if (config.proxy.url) {\r\n ErrorHelper.stringParameterCheck(config.proxy.url, \"DynamicsWebApi.setConfig\", \"config.proxy.url\");\r\n\r\n if (config.proxy.auth) {\r\n ErrorHelper.parameterCheck(config.proxy.auth, \"DynamicsWebApi.setConfig\", \"config.proxy.auth\");\r\n ErrorHelper.stringParameterCheck(config.proxy.auth.username, \"DynamicsWebApi.setConfig\", \"config.proxy.auth.username\");\r\n ErrorHelper.stringParameterCheck(config.proxy.auth.password, \"DynamicsWebApi.setConfig\", \"config.proxy.auth.password\");\r\n }\r\n }\r\n\r\n internalConfig.proxy = config.proxy;\r\n }\r\n }\r\n\r\n static default(): InternalConfig {\r\n return {\r\n serverUrl: null,\r\n impersonate: null,\r\n impersonateAAD: null,\r\n onTokenRefresh: null,\r\n includeAnnotations: null,\r\n maxPageSize: null,\r\n returnRepresentation: null,\r\n proxy: null,\r\n dataApi: {\r\n path: \"data\",\r\n version: \"9.2\",\r\n url: \"\"\r\n },\r\n searchApi: {\r\n path: \"search\",\r\n version: \"1.0\",\r\n url: \"\"\r\n },\r\n };\r\n }\r\n}\r\n", "import type * as Core from \"../types\";\r\nimport { Utility } from \"../utils/Utility\";\r\nimport { InternalConfig } from \"../utils/Config\";\r\nimport * as RequestUtility from \"../utils/Request\";\r\nimport { DynamicsWebApiError, ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { executeRequest } from \"./helpers/executeRequest\";\r\nimport { AccessToken } from \"../dynamics-web-api\";\r\n\r\nconst _addResponseParams = (requestId: string, responseParams: Record) => {\r\n if (_responseParseParams[requestId]) _responseParseParams[requestId].push(responseParams);\r\n else _responseParseParams[requestId] = [responseParams];\r\n};\r\n\r\nconst _addRequestToBatchCollection = (requestId: string, request: Core.InternalRequest) => {\r\n if (_batchRequestCollection[requestId]) _batchRequestCollection[requestId].push(request);\r\n else _batchRequestCollection[requestId] = [request];\r\n};\r\n\r\nconst _clearRequestData = (requestId: string): void => {\r\n delete _responseParseParams[requestId];\r\n if (_batchRequestCollection.hasOwnProperty(requestId)) delete _batchRequestCollection[requestId];\r\n};\r\n\r\nconst _runRequest = async (request: Core.InternalRequest, config: InternalConfig): Promise => {\r\n try {\r\n const result = await RequestClient.sendRequest(request, config);\r\n _clearRequestData(request.requestId!);\r\n\r\n return result;\r\n } catch (error) {\r\n _clearRequestData(request.requestId!);\r\n throw error;\r\n } finally {\r\n _clearRequestData(request.requestId!);\r\n }\r\n};\r\n\r\nlet _batchRequestCollection: Core.BatchRequestCollection = {};\r\nlet _responseParseParams: { [key: string]: any[] } = {};\r\n\r\nconst _nameExceptions = [\r\n \"$metadata\",\r\n \"EntityDefinitions\",\r\n \"RelationshipDefinitions\",\r\n \"GlobalOptionSetDefinitions\",\r\n \"ManagedPropertyDefinitions\",\r\n \"query\",\r\n \"suggest\",\r\n \"autocomplete\",\r\n];\r\n\r\nconst _isEntityNameException = (entityName: string): boolean => {\r\n return _nameExceptions.indexOf(entityName) > -1;\r\n};\r\n\r\nconst _getCollectionNames = async (entityName: string, config: InternalConfig): Promise => {\r\n if (!Utility.isNull(RequestUtility.entityNames)) {\r\n return RequestUtility.findCollectionName(entityName) || entityName;\r\n }\r\n\r\n const request = RequestUtility.compose(\r\n {\r\n method: \"GET\",\r\n collection: \"EntityDefinitions\",\r\n select: [\"EntitySetName\", \"LogicalName\"],\r\n noCache: true,\r\n functionName: \"retrieveMultiple\",\r\n },\r\n config\r\n );\r\n\r\n const result = await _runRequest(request, config);\r\n RequestUtility.setEntityNames({});\r\n for (let i = 0; i < result.data.value.length; i++) {\r\n RequestUtility.entityNames![result.data.value[i].LogicalName] = result.data.value[i].EntitySetName;\r\n }\r\n\r\n return RequestUtility.findCollectionName(entityName) || entityName;\r\n};\r\n\r\nconst _checkCollectionName = async (entityName: string | null | undefined, config: InternalConfig): Promise => {\r\n if (!entityName || _isEntityNameException(entityName)) {\r\n return entityName;\r\n }\r\n\r\n entityName = entityName.toLowerCase();\r\n\r\n if (!config.useEntityNames) {\r\n return entityName;\r\n }\r\n\r\n try {\r\n return await _getCollectionNames(entityName, config);\r\n } catch (error: any) {\r\n throw new Error(\"Unable to fetch Collection Names. Error: \" + (error as DynamicsWebApiError).message);\r\n }\r\n};\r\n\r\nexport class RequestClient {\r\n /**\r\n * Sends a request to given URL with given parameters\r\n *\r\n * @param {InternalRequest} request - Composed request to D365 Web Api\r\n * @param {InternalConfig} config - DynamicsWebApi config.\r\n */\r\n static async sendRequest(request: Core.InternalRequest, config: InternalConfig): Promise {\r\n request.headers = request.headers || {};\r\n request.responseParameters = request.responseParameters || {};\r\n request.requestId = request.requestId || Utility.generateUUID();\r\n\r\n //add response parameters to parse\r\n _addResponseParams(request.requestId, request.responseParameters);\r\n\r\n //stringify passed data\r\n let processedData = null;\r\n\r\n const isBatchConverted = request.responseParameters?.convertedToBatch;\r\n\r\n if (request.path === \"$batch\" && !isBatchConverted) {\r\n const batchRequest = _batchRequestCollection[request.requestId];\r\n\r\n if (!batchRequest) throw ErrorHelper.batchIsEmpty();\r\n\r\n const batchResult = RequestUtility.convertToBatch(batchRequest, config, request);\r\n\r\n processedData = batchResult.body;\r\n request.headers = { ...batchResult.headers, ...request.headers };\r\n\r\n //clear an array of requests\r\n delete _batchRequestCollection[request.requestId];\r\n } else {\r\n processedData = !isBatchConverted ? RequestUtility.processData(request.data, config) : request.data;\r\n\r\n if (!isBatchConverted) request.headers = RequestUtility.setStandardHeaders(request.headers);\r\n }\r\n\r\n if (config.impersonate && !request.headers![\"MSCRMCallerID\"]) {\r\n request.headers![\"MSCRMCallerID\"] = config.impersonate;\r\n }\r\n\r\n if (config.impersonateAAD && !request.headers![\"CallerObjectId\"]) {\r\n request.headers![\"CallerObjectId\"] = config.impersonateAAD;\r\n }\r\n\r\n let token: AccessToken | string | null = null;\r\n\r\n //call a token refresh callback only if it is set and there is no \"Authorization\" header set yet\r\n if (config.onTokenRefresh && (!request.headers || (request.headers && !request.headers[\"Authorization\"]))) {\r\n token = await config.onTokenRefresh();\r\n if (!token) throw new Error(\"Token is empty. Request is aborted.\");\r\n }\r\n\r\n if (token) {\r\n request.headers![\"Authorization\"] = \"Bearer \" + (token.hasOwnProperty(\"accessToken\") ? (token as AccessToken).accessToken : token);\r\n }\r\n\r\n if (Utility.isRunningWithinPortals()) {\r\n request.headers![\"__RequestVerificationToken\"] = await global.window.shell!.getTokenDeferred();\r\n }\r\n\r\n const url = request.apiConfig ? request.apiConfig.url : config.dataApi.url;\r\n\r\n return await executeRequest({\r\n method: request.method!,\r\n uri: url!.toString() + request.path,\r\n data: processedData,\r\n proxy: config.proxy,\r\n isAsync: request.async,\r\n headers: request.headers!,\r\n requestId: request.requestId!,\r\n abortSignal: request.signal,\r\n responseParams: _responseParseParams,\r\n timeout: request.timeout || config.timeout,\r\n });\r\n }\r\n\r\n static async makeRequest(request: Core.InternalRequest, config: InternalConfig): Promise {\r\n request.responseParameters = request.responseParameters || {};\r\n //we don't want to mix headers set by the library and by the user\r\n request.userHeaders = request.headers;\r\n delete request.headers;\r\n\r\n if (!request.isBatch) {\r\n const collectionName = await _checkCollectionName(request.collection, config);\r\n\r\n request.collection = collectionName;\r\n RequestUtility.compose(request, config);\r\n request.responseParameters.convertedToBatch = false;\r\n\r\n //the URL contains more characters than max possible limit, convert the request to a batch request\r\n if (request.path!.length > 2000) {\r\n const batchRequest = RequestUtility.convertToBatch([request], config);\r\n\r\n //#175 authorization header must be copied as well. \r\n //todo: is it the only one that needs to be copied?\r\n if (request.headers![\"Authorization\"]) {\r\n batchRequest.headers[\"Authorization\"] = request.headers![\"Authorization\"];\r\n }\r\n\r\n request.method = \"POST\";\r\n request.path = \"$batch\";\r\n request.data = batchRequest.body;\r\n request.headers = { ...batchRequest.headers, ...request.userHeaders };\r\n request.responseParameters.convertedToBatch = true;\r\n }\r\n\r\n return _runRequest(request, config);\r\n }\r\n\r\n //no need to make a request to web api if it's a part of batch\r\n RequestUtility.compose(request, config);\r\n //add response parameters to parse\r\n _addResponseParams(request.requestId!, request.responseParameters);\r\n _addRequestToBatchCollection(request.requestId!, request);\r\n }\r\n\r\n static _clearTestData(): void {\r\n RequestUtility.setEntityNames(null);\r\n _responseParseParams = {};\r\n _batchRequestCollection = {};\r\n }\r\n\r\n static getCollectionName(entityName: string): string | null {\r\n return RequestUtility.findCollectionName(entityName);\r\n }\r\n}\r\n", "import type { InternalRequest, InternalBatchRequest } from \"../types\";\r\n\r\nimport { Utility } from \"./Utility\";\r\nimport { Config, HeaderCollection } from \"../dynamics-web-api\";\r\nimport { ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { InternalConfig } from \"./Config\";\r\n\r\nexport let entityNames: Record | null = null;\r\n\r\nexport const setEntityNames = (newEntityNames: Record | null) => {\r\n entityNames = newEntityNames;\r\n};\r\n\r\n/**\r\n * Converts a request object to URL link\r\n * @param request Internal request object\r\n * @param config Internal configuration object\r\n * @returns Modified internal request object\r\n */\r\nexport const compose = (request: InternalRequest, config: InternalConfig): InternalRequest => {\r\n request.path = request.path || \"\";\r\n request.functionName = request.functionName || \"\";\r\n if (!request.url) {\r\n if (!request._isUnboundRequest && !request.contentId && !request.collection) {\r\n ErrorHelper.parameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, \"request.collection\");\r\n }\r\n if (request.collection != null) {\r\n ErrorHelper.stringParameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, \"request.collection\");\r\n request.path = request.collection;\r\n\r\n //add alternate key feature\r\n if (request.key) {\r\n request.key = ErrorHelper.keyParameterCheck(request.key, `DynamicsWebApi.${request.functionName}`, \"request.key\");\r\n request.path += `(${request.key})`;\r\n }\r\n }\r\n\r\n if (request.contentId) {\r\n ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, \"request.contentId\");\r\n if (request.contentId.startsWith(\"$\")) {\r\n request.path = request.path ? `${request.contentId}/${request.path}` : request.contentId;\r\n }\r\n }\r\n\r\n if (request.addPath) {\r\n if (request.path) {\r\n request.path += \"/\";\r\n }\r\n request.path += request.addPath;\r\n }\r\n\r\n request.path = composeUrl(request, config, request.path);\r\n\r\n if (request.fetchXml) {\r\n ErrorHelper.stringParameterCheck(request.fetchXml, `DynamicsWebApi.${request.functionName}`, \"request.fetchXml\");\r\n let join = request.path.indexOf(\"?\") === -1 ? \"?\" : \"&\";\r\n request.path += `${join}fetchXml=${encodeURIComponent(request.fetchXml)}`;\r\n }\r\n } else {\r\n ErrorHelper.stringParameterCheck(request.url, `DynamicsWebApi.${request.functionName}`, \"request.url\");\r\n request.path = request.url.replace(config.dataApi.url, \"\");\r\n }\r\n\r\n if (request.hasOwnProperty(\"async\") && request.async != null) {\r\n ErrorHelper.boolParameterCheck(request.async, `DynamicsWebApi.${request.functionName}`, \"request.async\");\r\n } else {\r\n request.async = true;\r\n }\r\n\r\n request.headers = composeHeaders(request, config);\r\n\r\n return request;\r\n};\r\n\r\n/**\r\n * Converts optional parameters of the request to URL. If expand parameter exists this function is called recursively.\r\n * @param request Internal request object\r\n * @param config Internal configuration object\r\n * @param url Starting url\r\n * @param joinSymbol Join symbol. \"&\" by default and \";\" inside an expand query parameter\r\n * @returns Request URL\r\n */\r\nexport const composeUrl = (request: InternalRequest, config: Config, url: string = \"\", joinSymbol: \"&\" | \";\" = \"&\"): string => {\r\n const queryArray: string[] = [];\r\n\r\n if (request) {\r\n if (request.navigationProperty) {\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, `DynamicsWebApi.${request.functionName}`, \"request.navigationProperty\");\r\n url += \"/\" + request.navigationProperty;\r\n\r\n if (request.navigationPropertyKey) {\r\n let navigationKey = ErrorHelper.keyParameterCheck(\r\n request.navigationPropertyKey,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.navigationPropertyKey\"\r\n );\r\n url += \"(\" + navigationKey + \")\";\r\n }\r\n\r\n if (request.navigationProperty === \"Attributes\") {\r\n if (request.metadataAttributeType) {\r\n ErrorHelper.stringParameterCheck(request.metadataAttributeType, `DynamicsWebApi.${request.functionName}`, \"request.metadataAttributeType\");\r\n url += \"/\" + request.metadataAttributeType;\r\n }\r\n }\r\n }\r\n\r\n if (request.select?.length) {\r\n ErrorHelper.arrayParameterCheck(request.select, `DynamicsWebApi.${request.functionName}`, \"request.select\");\r\n\r\n if (request.functionName == \"retrieve\" && request.select.length == 1 && request.select[0].endsWith(\"/$ref\")) {\r\n url += \"/\" + request.select[0];\r\n } else {\r\n if (request.select[0].startsWith(\"/\") && request.functionName == \"retrieve\") {\r\n if (request.navigationProperty == null) {\r\n url += request.select.shift();\r\n } else {\r\n request.select.shift();\r\n }\r\n }\r\n\r\n //check if anything left in the array\r\n if (request.select.length) {\r\n queryArray.push(\"$select=\" + request.select.join(\",\"));\r\n }\r\n }\r\n }\r\n\r\n if (request.filter) {\r\n ErrorHelper.stringParameterCheck(request.filter, `DynamicsWebApi.${request.functionName}`, \"request.filter\");\r\n const removeBracketsFromGuidReg = /[^\"']{([\\w\\d]{8}[-]?(?:[\\w\\d]{4}[-]?){3}[\\w\\d]{12})}(?:[^\"']|$)/g;\r\n let filterResult = request.filter;\r\n\r\n //fix bug 2018-06-11\r\n let m: RegExpExecArray | null = null;\r\n while ((m = removeBracketsFromGuidReg.exec(filterResult)) !== null) {\r\n if (m.index === removeBracketsFromGuidReg.lastIndex) {\r\n removeBracketsFromGuidReg.lastIndex++;\r\n }\r\n\r\n let replacement = m[0].endsWith(\")\") ? \")\" : \" \";\r\n filterResult = filterResult.replace(m[0], \" \" + m[1] + replacement);\r\n }\r\n\r\n queryArray.push(\"$filter=\" + encodeURIComponent(filterResult));\r\n }\r\n\r\n if (request.fieldName) {\r\n ErrorHelper.stringParameterCheck(request.fieldName, `DynamicsWebApi.${request.functionName}`, \"request.fieldName\");\r\n url += \"/\" + request.fieldName;\r\n }\r\n\r\n if (request.savedQuery) {\r\n queryArray.push(\"savedQuery=\" + ErrorHelper.guidParameterCheck(request.savedQuery, `DynamicsWebApi.${request.functionName}`, \"request.savedQuery\"));\r\n }\r\n\r\n if (request.userQuery) {\r\n queryArray.push(\"userQuery=\" + ErrorHelper.guidParameterCheck(request.userQuery, `DynamicsWebApi.${request.functionName}`, \"request.userQuery\"));\r\n }\r\n\r\n if (request.apply) {\r\n ErrorHelper.stringParameterCheck(request.apply, `DynamicsWebApi.${request.functionName}`, \"request.apply\");\r\n queryArray.push(\"$apply=\" + request.apply);\r\n }\r\n\r\n if (request.count) {\r\n ErrorHelper.boolParameterCheck(request.count, `DynamicsWebApi.${request.functionName}`, \"request.count\");\r\n queryArray.push(\"$count=\" + request.count);\r\n }\r\n\r\n if (request.top && request.top > 0) {\r\n ErrorHelper.numberParameterCheck(request.top, `DynamicsWebApi.${request.functionName}`, \"request.top\");\r\n queryArray.push(\"$top=\" + request.top);\r\n }\r\n\r\n if (request.orderBy != null && request.orderBy.length) {\r\n ErrorHelper.arrayParameterCheck(request.orderBy, `DynamicsWebApi.${request.functionName}`, \"request.orderBy\");\r\n queryArray.push(\"$orderby=\" + request.orderBy.join(\",\"));\r\n }\r\n\r\n if (request.partitionId) {\r\n ErrorHelper.stringParameterCheck(request.partitionId, `DynamicsWebApi.${request.functionName}`, \"request.partitionId\");\r\n queryArray.push(\"partitionid='\" + request.partitionId + \"'\");\r\n }\r\n\r\n if (request.downloadSize) {\r\n ErrorHelper.stringParameterCheck(request.downloadSize, `DynamicsWebApi.${request.functionName}`, \"request.downloadSize\");\r\n queryArray.push(\"size=\" + request.downloadSize);\r\n }\r\n\r\n if (request.queryParams?.length) {\r\n ErrorHelper.arrayParameterCheck(request.queryParams, `DynamicsWebApi.${request.functionName}`, \"request.queryParams\");\r\n queryArray.push(request.queryParams.join(\"&\"));\r\n }\r\n\r\n if (request.fileName) {\r\n ErrorHelper.stringParameterCheck(request.fileName, `DynamicsWebApi.${request.functionName}`, \"request.fileName\");\r\n queryArray.push(\"x-ms-file-name=\" + request.fileName);\r\n }\r\n\r\n if (request.data) {\r\n ErrorHelper.parameterCheck(request.data, `DynamicsWebApi.${request.functionName}`, \"request.data\");\r\n }\r\n\r\n if (request.isBatch) {\r\n ErrorHelper.boolParameterCheck(request.isBatch, `DynamicsWebApi.${request.functionName}`, \"request.isBatch\");\r\n }\r\n\r\n if (!Utility.isNull(request.inChangeSet)) {\r\n ErrorHelper.boolParameterCheck(request.inChangeSet, `DynamicsWebApi.${request.functionName}`, \"request.inChangeSet\");\r\n }\r\n\r\n if (request.isBatch && Utility.isNull(request.inChangeSet)) request.inChangeSet = true;\r\n\r\n if (request.timeout) {\r\n ErrorHelper.numberParameterCheck(request.timeout, `DynamicsWebApi.${request.functionName}`, \"request.timeout\");\r\n }\r\n\r\n if (request.expand?.length) {\r\n ErrorHelper.stringOrArrayParameterCheck(request.expand, `DynamicsWebApi.${request.functionName}`, \"request.expand\");\r\n if (typeof request.expand === \"string\") {\r\n queryArray.push(\"$expand=\" + request.expand);\r\n } else {\r\n const expandQueryArray: string[] = [];\r\n for (let i = 0; i < request.expand.length; i++) {\r\n if (request.expand[i].property) {\r\n const expand = request.expand[i];\r\n expand.functionName = `${request.functionName} $expand`;\r\n let expandConverted = composeUrl(expand, config, \"\", \";\");\r\n if (expandConverted) {\r\n expandConverted = `(${expandConverted.substr(1)})`;\r\n }\r\n expandQueryArray.push(request.expand[i].property + expandConverted);\r\n }\r\n }\r\n if (expandQueryArray.length) {\r\n queryArray.push(\"$expand=\" + expandQueryArray.join(\",\"));\r\n }\r\n }\r\n }\r\n }\r\n\r\n return !queryArray.length ? url : url + \"?\" + queryArray.join(joinSymbol);\r\n};\r\n\r\nexport const composeHeaders = (request: InternalRequest, config: Config): HeaderCollection => {\r\n const headers: HeaderCollection = { ...config.headers, ...request.userHeaders };\r\n\r\n const prefer = composePreferHeader(request, config);\r\n if (prefer.length) {\r\n headers[\"Prefer\"] = prefer;\r\n }\r\n\r\n if (request.collection === \"$metadata\") {\r\n headers[\"Accept\"] = \"application/xml\";\r\n }\r\n\r\n if (request.transferMode) {\r\n headers[\"x-ms-transfer-mode\"] = request.transferMode;\r\n }\r\n\r\n if (request.ifmatch != null && request.ifnonematch != null) {\r\n throw new Error(\r\n `DynamicsWebApi.${request.functionName}. Either one of request.ifmatch or request.ifnonematch parameters should be used in a call, not both.`\r\n );\r\n }\r\n\r\n if (request.ifmatch) {\r\n ErrorHelper.stringParameterCheck(request.ifmatch, `DynamicsWebApi.${request.functionName}`, \"request.ifmatch\");\r\n headers[\"If-Match\"] = request.ifmatch;\r\n }\r\n\r\n if (request.ifnonematch) {\r\n ErrorHelper.stringParameterCheck(request.ifnonematch, `DynamicsWebApi.${request.functionName}`, \"request.ifnonematch\");\r\n headers[\"If-None-Match\"] = request.ifnonematch;\r\n }\r\n\r\n if (request.impersonate) {\r\n ErrorHelper.stringParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, \"request.impersonate\");\r\n headers[\"MSCRMCallerID\"] = ErrorHelper.guidParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, \"request.impersonate\");\r\n }\r\n\r\n if (request.impersonateAAD) {\r\n ErrorHelper.stringParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, \"request.impersonateAAD\");\r\n headers[\"CallerObjectId\"] = ErrorHelper.guidParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, \"request.impersonateAAD\");\r\n }\r\n\r\n if (request.token) {\r\n ErrorHelper.stringParameterCheck(request.token, `DynamicsWebApi.${request.functionName}`, \"request.token\");\r\n headers[\"Authorization\"] = \"Bearer \" + request.token;\r\n }\r\n\r\n if (request.duplicateDetection) {\r\n ErrorHelper.boolParameterCheck(request.duplicateDetection, `DynamicsWebApi.${request.functionName}`, \"request.duplicateDetection\");\r\n headers[\"MSCRM.SuppressDuplicateDetection\"] = \"false\";\r\n }\r\n\r\n if (request.bypassCustomPluginExecution) {\r\n ErrorHelper.boolParameterCheck(request.bypassCustomPluginExecution, `DynamicsWebApi.${request.functionName}`, \"request.bypassCustomPluginExecution\");\r\n headers[\"MSCRM.BypassCustomPluginExecution\"] = \"true\";\r\n }\r\n\r\n if (request.noCache) {\r\n ErrorHelper.boolParameterCheck(request.noCache, `DynamicsWebApi.${request.functionName}`, \"request.noCache\");\r\n headers[\"Cache-Control\"] = \"no-cache\";\r\n }\r\n\r\n if (request.mergeLabels) {\r\n ErrorHelper.boolParameterCheck(request.mergeLabels, `DynamicsWebApi.${request.functionName}`, \"request.mergeLabels\");\r\n headers[\"MSCRM.MergeLabels\"] = \"true\";\r\n }\r\n\r\n if (request.contentId) {\r\n ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, \"request.contentId\");\r\n if (!request.contentId.startsWith(\"$\")) {\r\n headers[\"Content-ID\"] = request.contentId;\r\n }\r\n }\r\n\r\n if (request.contentRange) {\r\n ErrorHelper.stringParameterCheck(request.contentRange, `DynamicsWebApi.${request.functionName}`, \"request.contentRange\");\r\n headers[\"Content-Range\"] = request.contentRange;\r\n }\r\n\r\n if (request.range) {\r\n ErrorHelper.stringParameterCheck(request.range, `DynamicsWebApi.${request.functionName}`, \"request.range\");\r\n headers[\"Range\"] = request.range;\r\n }\r\n\r\n return headers;\r\n};\r\n\r\nexport const composePreferHeader = (request: InternalRequest, config: Config): string => {\r\n let returnRepresentation: boolean | null | undefined = request.returnRepresentation;\r\n let includeAnnotations: string | null | undefined = request.includeAnnotations;\r\n let maxPageSize: number | null | undefined = request.maxPageSize;\r\n let trackChanges: boolean | null | undefined = request.trackChanges;\r\n let continueOnError: boolean | null | undefined = request.continueOnError;\r\n\r\n let prefer: string[] = [];\r\n\r\n if (request.prefer && request.prefer.length) {\r\n ErrorHelper.stringOrArrayParameterCheck(request.prefer, `DynamicsWebApi.${request.functionName}`, \"request.prefer\");\r\n if (typeof request.prefer === \"string\") {\r\n prefer = request.prefer.split(\",\");\r\n }\r\n for (let i in prefer) {\r\n let item = prefer[i].trim();\r\n if (item === \"return=representation\") {\r\n returnRepresentation = true;\r\n } else if (item.includes(\"odata.include-annotations=\")) {\r\n includeAnnotations = item.replace(\"odata.include-annotations=\", \"\").replace(/\"/g, \"\");\r\n } else if (item.startsWith(\"odata.maxpagesize=\")) {\r\n maxPageSize = Number(item.replace(\"odata.maxpagesize=\", \"\").replace(/\"/g, \"\")) || 0;\r\n } else if (item.includes(\"odata.track-changes\")) {\r\n trackChanges = true;\r\n } else if (item.includes(\"odata.continue-on-error\")) {\r\n continueOnError = true;\r\n }\r\n }\r\n }\r\n\r\n //clear array\r\n prefer = [];\r\n\r\n if (config) {\r\n if (returnRepresentation == null) {\r\n returnRepresentation = config.returnRepresentation;\r\n }\r\n includeAnnotations = includeAnnotations ? includeAnnotations : config.includeAnnotations;\r\n maxPageSize = maxPageSize ? maxPageSize : config.maxPageSize;\r\n }\r\n\r\n if (returnRepresentation) {\r\n ErrorHelper.boolParameterCheck(returnRepresentation, `DynamicsWebApi.${request.functionName}`, \"request.returnRepresentation\");\r\n prefer.push(\"return=representation\");\r\n }\r\n\r\n if (includeAnnotations) {\r\n ErrorHelper.stringParameterCheck(includeAnnotations, `DynamicsWebApi.${request.functionName}`, \"request.includeAnnotations\");\r\n prefer.push(`odata.include-annotations=\"${includeAnnotations}\"`);\r\n }\r\n\r\n if (maxPageSize && maxPageSize > 0) {\r\n ErrorHelper.numberParameterCheck(maxPageSize, `DynamicsWebApi.${request.functionName}`, \"request.maxPageSize\");\r\n prefer.push(\"odata.maxpagesize=\" + maxPageSize);\r\n }\r\n\r\n if (trackChanges) {\r\n ErrorHelper.boolParameterCheck(trackChanges, `DynamicsWebApi.${request.functionName}`, \"request.trackChanges\");\r\n prefer.push(\"odata.track-changes\");\r\n }\r\n\r\n if (continueOnError) {\r\n ErrorHelper.boolParameterCheck(continueOnError, `DynamicsWebApi.${request.functionName}`, \"request.continueOnError\");\r\n prefer.push(\"odata.continue-on-error\");\r\n }\r\n\r\n return prefer.join(\",\");\r\n};\r\n\r\nexport const convertToBatch = (requests: InternalRequest[], config: InternalConfig, batchRequest?: InternalRequest): InternalBatchRequest => {\r\n const batchBoundary = `dwa_batch_${Utility.generateUUID()}`;\r\n\r\n const batchBody: string[] = [];\r\n let currentChangeSet: string | null = null;\r\n let contentId = 100000;\r\n\r\n requests.forEach((internalRequest) => {\r\n internalRequest.functionName = \"executeBatch\";\r\n if (batchRequest?.inChangeSet === false) internalRequest.inChangeSet = false;\r\n const inChangeSet = internalRequest.method === \"GET\" ? false : !!internalRequest.inChangeSet;\r\n\r\n if (!inChangeSet && currentChangeSet) {\r\n //end current change set\r\n batchBody.push(`\\n--${currentChangeSet}--`);\r\n\r\n currentChangeSet = null;\r\n contentId = 100000;\r\n }\r\n\r\n if (!currentChangeSet) {\r\n batchBody.push(`\\n--${batchBoundary}`);\r\n\r\n if (inChangeSet) {\r\n currentChangeSet = `changeset_${Utility.generateUUID()}`;\r\n batchBody.push(\"Content-Type: multipart/mixed;boundary=\" + currentChangeSet);\r\n }\r\n }\r\n\r\n if (inChangeSet) {\r\n batchBody.push(`\\n--${currentChangeSet}`);\r\n }\r\n\r\n batchBody.push(\"Content-Type: application/http\");\r\n batchBody.push(\"Content-Transfer-Encoding: binary\");\r\n\r\n if (inChangeSet) {\r\n const contentIdValue = internalRequest.headers!.hasOwnProperty(\"Content-ID\") ? internalRequest.headers![\"Content-ID\"] : ++contentId;\r\n\r\n batchBody.push(`Content-ID: ${contentIdValue}`);\r\n }\r\n\r\n if (!internalRequest.path?.startsWith(\"$\")) {\r\n batchBody.push(`\\n${internalRequest.method} ${config.dataApi.url}${internalRequest.path} HTTP/1.1`);\r\n } else {\r\n batchBody.push(`\\n${internalRequest.method} ${internalRequest.path} HTTP/1.1`);\r\n }\r\n\r\n if (internalRequest.method === \"GET\") {\r\n batchBody.push(\"Accept: application/json\");\r\n } else {\r\n batchBody.push(\"Content-Type: application/json\");\r\n }\r\n\r\n for (let key in internalRequest.headers) {\r\n if (key === \"Authorization\" || key === \"Content-ID\") continue;\r\n\r\n batchBody.push(`${key}: ${internalRequest.headers[key]}`);\r\n }\r\n\r\n if (internalRequest.data) {\r\n batchBody.push(`\\n${processData(internalRequest.data, config)}`);\r\n }\r\n });\r\n\r\n if (currentChangeSet) {\r\n batchBody.push(`\\n--${currentChangeSet}--`);\r\n }\r\n\r\n batchBody.push(`\\n--${batchBoundary}--`);\r\n\r\n const headers = setStandardHeaders(batchRequest?.userHeaders);\r\n headers[\"Content-Type\"] = `multipart/mixed;boundary=${batchBoundary}`;\r\n\r\n return { headers: headers, body: batchBody.join(\"\\n\") };\r\n};\r\n\r\nexport const findCollectionName = (entityName: string): string | null => {\r\n let collectionName: string | null = null;\r\n\r\n if (!Utility.isNull(entityNames)) {\r\n collectionName = entityNames![entityName];\r\n if (!collectionName) {\r\n for (let key in entityNames!) {\r\n if (entityNames[key] === entityName) {\r\n return entityName;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return collectionName;\r\n};\r\n\r\nexport const processData = (data: any, config: InternalConfig): string | Uint8Array | Uint16Array | Uint32Array | null => {\r\n let stringifiedData: string | null = null;\r\n if (data) {\r\n if (data instanceof Uint8Array || data instanceof Uint16Array || data instanceof Uint32Array) return data;\r\n\r\n stringifiedData = JSON.stringify(data, (key, value) => {\r\n if (key.endsWith(\"@odata.bind\") || key.endsWith(\"@odata.id\")) {\r\n if (typeof value === \"string\" && !value.startsWith(\"$\")) {\r\n //remove brackets in guid\r\n if (/\\(\\{[\\w\\d-]+\\}\\)/g.test(value)) {\r\n value = value.replace(/(.+)\\(\\{([\\w\\d-]+)\\}\\)/g, \"$1($2)\");\r\n }\r\n\r\n if (config.useEntityNames) {\r\n //replace entity name with collection name\r\n const regularExpression = /([\\w_]+)(\\([\\d\\w-]+\\))$/;\r\n const valueParts = regularExpression.exec(value);\r\n if (valueParts && valueParts.length > 2) {\r\n const collectionName = findCollectionName(valueParts[1]);\r\n\r\n if (!Utility.isNull(collectionName)) {\r\n value = value.replace(regularExpression, collectionName + \"$2\");\r\n }\r\n }\r\n }\r\n\r\n if (!value.startsWith(config.dataApi.url)) {\r\n //add full web api url if it's not set\r\n if (key.endsWith(\"@odata.bind\")) {\r\n if (!value.startsWith(\"/\")) {\r\n value = \"/\" + value;\r\n }\r\n } else {\r\n value = config.dataApi.url + value.replace(/^\\//, \"\");\r\n }\r\n }\r\n }\r\n } else if (key.startsWith(\"oData\") || key.endsWith(\"_Formatted\") || key.endsWith(\"_NavigationProperty\") || key.endsWith(\"_LogicalName\")) {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n });\r\n\r\n stringifiedData = stringifiedData.replace(/[\\u007F-\\uFFFF]/g, function (chr: string) {\r\n return \"\\\\u\" + (\"0000\" + chr.charCodeAt(0).toString(16)).slice(-4);\r\n });\r\n }\r\n\r\n return stringifiedData;\r\n};\r\n\r\nexport const setStandardHeaders = (headers: HeaderCollection = {}): HeaderCollection => {\r\n if (!headers[\"Accept\"]) headers[\"Accept\"] = \"application/json\";\r\n if (!headers[\"OData-MaxVersion\"]) headers[\"OData-MaxVersion\"] = \"4.0\";\r\n if (!headers[\"OData-Version\"]) headers[\"OData-Version\"] = \"4.0\";\r\n if (headers[\"Content-Range\"]) headers[\"Content-Type\"] = \"application/octet-stream\";\r\n else if (!headers[\"Content-Type\"]) headers[\"Content-Type\"] = \"application/json; charset=utf-8\";\r\n\r\n return headers;\r\n};\r\n", "import type { RequestOptions, WebApiResponse } from \"../../types\";\r\n\r\nexport async function executeRequest(options: RequestOptions): Promise {\r\n return global.DWA_BROWSER ? require(\"../xhr\").executeRequest(options) : require(\"../http\").executeRequest(options);\r\n}\r\n"], + "mappings": "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", "names": ["nCrypto", "getCrypto", "_a", "HttpProxyAgent", "HttpsProxyAgent", "_a", "_b", "executeRequest", "_a", "executeRequest", "_a", "request"] } diff --git a/dist/dynamics-web-api.d.ts b/dist/dynamics-web-api.d.ts index 3092507..bd2b71d 100644 --- a/dist/dynamics-web-api.d.ts +++ b/dist/dynamics-web-api.d.ts @@ -1,4 +1,4 @@ -/*! dynamics-web-api v2.1.4 (c) 2024 Aleksandr Rogov */ +/*! dynamics-web-api v2.1.5 (c) 2024 Aleksandr Rogov */ /// /** * Microsoft Dynamics CRM Web API helper library written in JavaScript. @@ -876,10 +876,7 @@ export interface Config { headers?: HeaderCollection; } /**Header collection type */ -export type HeaderCollection = { - /**key-value */ - [key: string]: string; -}; +export type HeaderCollection = Record; export interface ProxyConfig { /**Proxy server url */ url: string; diff --git a/dist/dynamics-web-api.js b/dist/dynamics-web-api.js index 4087657..85b3de9 100644 --- a/dist/dynamics-web-api.js +++ b/dist/dynamics-web-api.js @@ -1,4 +1,4 @@ -/*! dynamics-web-api v2.1.4 (c) 2024 Aleksandr Rogov */ +/*! dynamics-web-api v2.1.5 (c) 2024 Aleksandr Rogov */ "use strict"; var _dynamicsWebApiExports = (() => { var __defProp = Object.defineProperty; @@ -685,7 +685,7 @@ var _dynamicsWebApiExports = (() => { } function _executeRequest(options, successCallback, errorCallback) { const data = options.data; - const additionalHeaders = options.additionalHeaders; + const headers = options.headers; const responseParams = options.responseParams; const signal = options.abortSignal; if (signal?.aborted) { @@ -700,8 +700,8 @@ var _dynamicsWebApiExports = (() => { } let request = new XMLHttpRequest(); request.open(options.method, options.uri, options.isAsync || false); - for (let key in additionalHeaders) { - request.setRequestHeader(key, additionalHeaders[key]); + for (let key in headers) { + request.setRequestHeader(key, headers[key]); } request.onreadystatechange = function() { if (request.readyState === 4) { @@ -730,10 +730,10 @@ var _dynamicsWebApiExports = (() => { if (!request) break; let error; - let headers; + let headers2; try { - headers = parseResponseHeaders(request.getAllResponseHeaders()); - const errorParsed = parseResponse(request.responseText, headers, responseParams[options.requestId]); + headers2 = parseResponseHeaders(request.getAllResponseHeaders()); + const errorParsed = parseResponse(request.responseText, headers2, responseParams[options.requestId]); if (Array.isArray(errorParsed)) { errorCallback(errorParsed); break; @@ -749,7 +749,7 @@ var _dynamicsWebApiExports = (() => { const errorParameters = { status: request.status, statusText: request.statusText, - headers + headers: headers2 }; request = null; errorCallback(ErrorHelper.handleHttpError(error, errorParameters)); @@ -761,26 +761,26 @@ var _dynamicsWebApiExports = (() => { request.timeout = options.timeout; } request.onerror = function() { - const headers = parseResponseHeaders(request.getAllResponseHeaders()); + const headers2 = parseResponseHeaders(request.getAllResponseHeaders()); errorCallback( ErrorHelper.handleHttpError({ status: request.status, statusText: request.statusText, message: request.responseText || "Network Error", - headers + headers: headers2 }) ); request = null; }; request.ontimeout = function() { - const headers = parseResponseHeaders(request.getAllResponseHeaders()); + const headers2 = parseResponseHeaders(request.getAllResponseHeaders()); errorCallback( ErrorHelper.handleHttpError({ name: "TimeoutError", status: request.status, statusText: request.statusText, message: request.responseText || "Request Timed Out", - headers + headers: headers2 }) ); request = null; @@ -788,13 +788,13 @@ var _dynamicsWebApiExports = (() => { request.onabort = function() { if (!request) return; - const headers = parseResponseHeaders(request.getAllResponseHeaders()); + const headers2 = parseResponseHeaders(request.getAllResponseHeaders()); errorCallback( ErrorHelper.handleHttpError({ status: request.status, statusText: request.statusText, message: "Request aborted", - headers + headers: headers2 }) ); request = null; @@ -802,7 +802,7 @@ var _dynamicsWebApiExports = (() => { const abort = () => { if (!request) return; - const headers = parseResponseHeaders(request.getAllResponseHeaders()); + const headers2 = parseResponseHeaders(request.getAllResponseHeaders()); errorCallback( ErrorHelper.handleHttpError({ name: "AbortError", @@ -810,7 +810,7 @@ var _dynamicsWebApiExports = (() => { status: request.status, statusText: request.statusText, message: "The user aborted a request.", - headers + headers: headers2 }) ); request.abort(); @@ -954,482 +954,449 @@ var _dynamicsWebApiExports = (() => { // src/utils/Request.ts init_Utility(); init_ErrorHelper(); - var _RequestUtility = class _RequestUtility { - /** - * Converts a request object to URL link - * - * @param {Object} request - Request object - * @param {Object} [config] - DynamicsWebApi config - * @returns {ConvertedRequest} Converted request - */ - static compose(request, config) { - request.path = request.path || ""; - request.functionName = request.functionName || ""; - if (!request.url) { - if (!request._isUnboundRequest && !request.contentId && !request.collection) { - ErrorHelper.parameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, "request.collection"); - } - if (request.collection != null) { - ErrorHelper.stringParameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, "request.collection"); - request.path = request.collection; - if (request.key) { - request.key = ErrorHelper.keyParameterCheck(request.key, `DynamicsWebApi.${request.functionName}`, "request.key"); - request.path += `(${request.key})`; - } - } - if (request.contentId) { - ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, "request.contentId"); - if (request.contentId.startsWith("$")) { - request.path = request.path ? `${request.contentId}/${request.path}` : request.contentId; - } + var entityNames = null; + var setEntityNames = (newEntityNames) => { + entityNames = newEntityNames; + }; + var compose = (request, config) => { + request.path = request.path || ""; + request.functionName = request.functionName || ""; + if (!request.url) { + if (!request._isUnboundRequest && !request.contentId && !request.collection) { + ErrorHelper.parameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, "request.collection"); + } + if (request.collection != null) { + ErrorHelper.stringParameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, "request.collection"); + request.path = request.collection; + if (request.key) { + request.key = ErrorHelper.keyParameterCheck(request.key, `DynamicsWebApi.${request.functionName}`, "request.key"); + request.path += `(${request.key})`; } - if (request._additionalUrl) { - if (request.path) { - request.path += "/"; - } - request.path += request._additionalUrl; + } + if (request.contentId) { + ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, "request.contentId"); + if (request.contentId.startsWith("$")) { + request.path = request.path ? `${request.contentId}/${request.path}` : request.contentId; } - request.path = _RequestUtility.composeUrl(request, config, request.path); - if (request.fetchXml) { - ErrorHelper.stringParameterCheck(request.fetchXml, `DynamicsWebApi.${request.functionName}`, "request.fetchXml"); - let join = request.path.indexOf("?") === -1 ? "?" : "&"; - request.path += `${join}fetchXml=${encodeURIComponent(request.fetchXml)}`; + } + if (request.addPath) { + if (request.path) { + request.path += "/"; } - } else { - ErrorHelper.stringParameterCheck(request.url, `DynamicsWebApi.${request.functionName}`, "request.url"); - request.path = request.url.replace(config.dataApi.url, ""); + request.path += request.addPath; } - if (request.hasOwnProperty("async") && request.async != null) { - ErrorHelper.boolParameterCheck(request.async, `DynamicsWebApi.${request.functionName}`, "request.async"); - } else { - request.async = true; + request.path = composeUrl(request, config, request.path); + if (request.fetchXml) { + ErrorHelper.stringParameterCheck(request.fetchXml, `DynamicsWebApi.${request.functionName}`, "request.fetchXml"); + let join = request.path.indexOf("?") === -1 ? "?" : "&"; + request.path += `${join}fetchXml=${encodeURIComponent(request.fetchXml)}`; } - request.headers = _RequestUtility.composeHeaders(request, config); - return request; + } else { + ErrorHelper.stringParameterCheck(request.url, `DynamicsWebApi.${request.functionName}`, "request.url"); + request.path = request.url.replace(config.dataApi.url, ""); } - /** - * Converts optional parameters of the request to URL. If expand parameter exists this function is called recursively. - * - * @param {Object} request - Request object - * @param {string} request.functionName - Name of the function that converts a request (for Error Handling) - * @param {string} url - URL beginning (with required parameters) - * @param {string} [joinSymbol] - URL beginning (with required parameters) - * @param {Object} [config] - DynamicsWebApi config - * @returns {ConvertedRequestOptions} Additional options in request - */ - static composeUrl(request, config, url = "", joinSymbol = "&") { - const queryArray = []; - if (request) { - if (request.navigationProperty) { - ErrorHelper.stringParameterCheck(request.navigationProperty, `DynamicsWebApi.${request.functionName}`, "request.navigationProperty"); - url += "/" + request.navigationProperty; - if (request.navigationPropertyKey) { - let navigationKey = ErrorHelper.keyParameterCheck( - request.navigationPropertyKey, - `DynamicsWebApi.${request.functionName}`, - "request.navigationPropertyKey" - ); - url += "(" + navigationKey + ")"; - } - if (request.navigationProperty === "Attributes") { - if (request.metadataAttributeType) { - ErrorHelper.stringParameterCheck( - request.metadataAttributeType, - `DynamicsWebApi.${request.functionName}`, - "request.metadataAttributeType" - ); - url += "/" + request.metadataAttributeType; - } - } + if (request.hasOwnProperty("async") && request.async != null) { + ErrorHelper.boolParameterCheck(request.async, `DynamicsWebApi.${request.functionName}`, "request.async"); + } else { + request.async = true; + } + request.headers = composeHeaders(request, config); + return request; + }; + var composeUrl = (request, config, url = "", joinSymbol = "&") => { + const queryArray = []; + if (request) { + if (request.navigationProperty) { + ErrorHelper.stringParameterCheck(request.navigationProperty, `DynamicsWebApi.${request.functionName}`, "request.navigationProperty"); + url += "/" + request.navigationProperty; + if (request.navigationPropertyKey) { + let navigationKey = ErrorHelper.keyParameterCheck( + request.navigationPropertyKey, + `DynamicsWebApi.${request.functionName}`, + "request.navigationPropertyKey" + ); + url += "(" + navigationKey + ")"; } - if (request.select?.length) { - ErrorHelper.arrayParameterCheck(request.select, `DynamicsWebApi.${request.functionName}`, "request.select"); - if (request.functionName == "retrieve" && request.select.length == 1 && request.select[0].endsWith("/$ref")) { - url += "/" + request.select[0]; - } else { - if (request.select[0].startsWith("/") && request.functionName == "retrieve") { - if (request.navigationProperty == null) { - url += request.select.shift(); - } else { - request.select.shift(); - } - } - if (request.select.length) { - queryArray.push("$select=" + request.select.join(",")); - } + if (request.navigationProperty === "Attributes") { + if (request.metadataAttributeType) { + ErrorHelper.stringParameterCheck(request.metadataAttributeType, `DynamicsWebApi.${request.functionName}`, "request.metadataAttributeType"); + url += "/" + request.metadataAttributeType; } } - if (request.filter) { - ErrorHelper.stringParameterCheck(request.filter, `DynamicsWebApi.${request.functionName}`, "request.filter"); - const removeBracketsFromGuidReg = /[^"']{([\w\d]{8}[-]?(?:[\w\d]{4}[-]?){3}[\w\d]{12})}(?:[^"']|$)/g; - let filterResult = request.filter; - let m = null; - while ((m = removeBracketsFromGuidReg.exec(filterResult)) !== null) { - if (m.index === removeBracketsFromGuidReg.lastIndex) { - removeBracketsFromGuidReg.lastIndex++; + } + if (request.select?.length) { + ErrorHelper.arrayParameterCheck(request.select, `DynamicsWebApi.${request.functionName}`, "request.select"); + if (request.functionName == "retrieve" && request.select.length == 1 && request.select[0].endsWith("/$ref")) { + url += "/" + request.select[0]; + } else { + if (request.select[0].startsWith("/") && request.functionName == "retrieve") { + if (request.navigationProperty == null) { + url += request.select.shift(); + } else { + request.select.shift(); } - let replacement = m[0].endsWith(")") ? ")" : " "; - filterResult = filterResult.replace(m[0], " " + m[1] + replacement); } - queryArray.push("$filter=" + encodeURIComponent(filterResult)); - } - if (request.fieldName) { - ErrorHelper.stringParameterCheck(request.fieldName, `DynamicsWebApi.${request.functionName}`, "request.fieldName"); - url += "/" + request.fieldName; - } - if (request.savedQuery) { - queryArray.push( - "savedQuery=" + ErrorHelper.guidParameterCheck(request.savedQuery, `DynamicsWebApi.${request.functionName}`, "request.savedQuery") - ); - } - if (request.userQuery) { - queryArray.push( - "userQuery=" + ErrorHelper.guidParameterCheck(request.userQuery, `DynamicsWebApi.${request.functionName}`, "request.userQuery") - ); - } - if (request.apply) { - ErrorHelper.stringParameterCheck(request.apply, `DynamicsWebApi.${request.functionName}`, "request.apply"); - queryArray.push("$apply=" + request.apply); - } - if (request.count) { - ErrorHelper.boolParameterCheck(request.count, `DynamicsWebApi.${request.functionName}`, "request.count"); - queryArray.push("$count=" + request.count); - } - if (request.top && request.top > 0) { - ErrorHelper.numberParameterCheck(request.top, `DynamicsWebApi.${request.functionName}`, "request.top"); - queryArray.push("$top=" + request.top); - } - if (request.orderBy != null && request.orderBy.length) { - ErrorHelper.arrayParameterCheck(request.orderBy, `DynamicsWebApi.${request.functionName}`, "request.orderBy"); - queryArray.push("$orderby=" + request.orderBy.join(",")); - } - if (request.partitionId) { - ErrorHelper.stringParameterCheck(request.partitionId, `DynamicsWebApi.${request.functionName}`, "request.partitionId"); - queryArray.push("partitionid='" + request.partitionId + "'"); - } - if (request.downloadSize) { - ErrorHelper.stringParameterCheck(request.downloadSize, `DynamicsWebApi.${request.functionName}`, "request.downloadSize"); - queryArray.push("size=" + request.downloadSize); - } - if (request.queryParams?.length) { - ErrorHelper.arrayParameterCheck(request.queryParams, `DynamicsWebApi.${request.functionName}`, "request.queryParams"); - queryArray.push(request.queryParams.join("&")); - } - if (request.fileName) { - ErrorHelper.stringParameterCheck(request.fileName, `DynamicsWebApi.${request.functionName}`, "request.fileName"); - queryArray.push("x-ms-file-name=" + request.fileName); - } - if (request.data) { - ErrorHelper.parameterCheck(request.data, `DynamicsWebApi.${request.functionName}`, "request.data"); - } - if (request.isBatch) { - ErrorHelper.boolParameterCheck(request.isBatch, `DynamicsWebApi.${request.functionName}`, "request.isBatch"); - } - if (!Utility.isNull(request.inChangeSet)) { - ErrorHelper.boolParameterCheck(request.inChangeSet, `DynamicsWebApi.${request.functionName}`, "request.inChangeSet"); - } - if (request.isBatch && Utility.isNull(request.inChangeSet)) - request.inChangeSet = true; - if (request.timeout) { - ErrorHelper.numberParameterCheck(request.timeout, `DynamicsWebApi.${request.functionName}`, "request.timeout"); - } - if (request.expand?.length) { - ErrorHelper.stringOrArrayParameterCheck(request.expand, `DynamicsWebApi.${request.functionName}`, "request.expand"); - if (typeof request.expand === "string") { - queryArray.push("$expand=" + request.expand); - } else { - const expandQueryArray = []; - for (let i = 0; i < request.expand.length; i++) { - if (request.expand[i].property) { - const expand = request.expand[i]; - expand.functionName = `${request.functionName} $expand`; - let expandConverted = _RequestUtility.composeUrl(expand, config, "", ";"); - if (expandConverted) { - expandConverted = `(${expandConverted.substr(1)})`; - } - expandQueryArray.push(request.expand[i].property + expandConverted); - } - } - if (expandQueryArray.length) { - queryArray.push("$expand=" + expandQueryArray.join(",")); - } + if (request.select.length) { + queryArray.push("$select=" + request.select.join(",")); } } } - return !queryArray.length ? url : url + "?" + queryArray.join(joinSymbol); - } - static composeHeaders(request, config) { - const headers = { ...config.headers, ...request.userHeaders }; - const prefer = _RequestUtility.composePreferHeader(request, config); - if (prefer.length) { - headers["Prefer"] = prefer; + if (request.filter) { + ErrorHelper.stringParameterCheck(request.filter, `DynamicsWebApi.${request.functionName}`, "request.filter"); + const removeBracketsFromGuidReg = /[^"']{([\w\d]{8}[-]?(?:[\w\d]{4}[-]?){3}[\w\d]{12})}(?:[^"']|$)/g; + let filterResult = request.filter; + let m = null; + while ((m = removeBracketsFromGuidReg.exec(filterResult)) !== null) { + if (m.index === removeBracketsFromGuidReg.lastIndex) { + removeBracketsFromGuidReg.lastIndex++; + } + let replacement = m[0].endsWith(")") ? ")" : " "; + filterResult = filterResult.replace(m[0], " " + m[1] + replacement); + } + queryArray.push("$filter=" + encodeURIComponent(filterResult)); } - if (request.collection === "$metadata") { - headers["Accept"] = "application/xml"; + if (request.fieldName) { + ErrorHelper.stringParameterCheck(request.fieldName, `DynamicsWebApi.${request.functionName}`, "request.fieldName"); + url += "/" + request.fieldName; } - if (request.transferMode) { - headers["x-ms-transfer-mode"] = request.transferMode; + if (request.savedQuery) { + queryArray.push("savedQuery=" + ErrorHelper.guidParameterCheck(request.savedQuery, `DynamicsWebApi.${request.functionName}`, "request.savedQuery")); } - if (request.ifmatch != null && request.ifnonematch != null) { - throw new Error( - `DynamicsWebApi.${request.functionName}. Either one of request.ifmatch or request.ifnonematch parameters should be used in a call, not both.` - ); + if (request.userQuery) { + queryArray.push("userQuery=" + ErrorHelper.guidParameterCheck(request.userQuery, `DynamicsWebApi.${request.functionName}`, "request.userQuery")); } - if (request.ifmatch) { - ErrorHelper.stringParameterCheck(request.ifmatch, `DynamicsWebApi.${request.functionName}`, "request.ifmatch"); - headers["If-Match"] = request.ifmatch; + if (request.apply) { + ErrorHelper.stringParameterCheck(request.apply, `DynamicsWebApi.${request.functionName}`, "request.apply"); + queryArray.push("$apply=" + request.apply); } - if (request.ifnonematch) { - ErrorHelper.stringParameterCheck(request.ifnonematch, `DynamicsWebApi.${request.functionName}`, "request.ifnonematch"); - headers["If-None-Match"] = request.ifnonematch; + if (request.count) { + ErrorHelper.boolParameterCheck(request.count, `DynamicsWebApi.${request.functionName}`, "request.count"); + queryArray.push("$count=" + request.count); } - if (request.impersonate) { - ErrorHelper.stringParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, "request.impersonate"); - headers["MSCRMCallerID"] = ErrorHelper.guidParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, "request.impersonate"); + if (request.top && request.top > 0) { + ErrorHelper.numberParameterCheck(request.top, `DynamicsWebApi.${request.functionName}`, "request.top"); + queryArray.push("$top=" + request.top); } - if (request.impersonateAAD) { - ErrorHelper.stringParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, "request.impersonateAAD"); - headers["CallerObjectId"] = ErrorHelper.guidParameterCheck( - request.impersonateAAD, - `DynamicsWebApi.${request.functionName}`, - "request.impersonateAAD" - ); + if (request.orderBy != null && request.orderBy.length) { + ErrorHelper.arrayParameterCheck(request.orderBy, `DynamicsWebApi.${request.functionName}`, "request.orderBy"); + queryArray.push("$orderby=" + request.orderBy.join(",")); } - if (request.token) { - ErrorHelper.stringParameterCheck(request.token, `DynamicsWebApi.${request.functionName}`, "request.token"); - headers["Authorization"] = "Bearer " + request.token; + if (request.partitionId) { + ErrorHelper.stringParameterCheck(request.partitionId, `DynamicsWebApi.${request.functionName}`, "request.partitionId"); + queryArray.push("partitionid='" + request.partitionId + "'"); } - if (request.duplicateDetection) { - ErrorHelper.boolParameterCheck(request.duplicateDetection, `DynamicsWebApi.${request.functionName}`, "request.duplicateDetection"); - headers["MSCRM.SuppressDuplicateDetection"] = "false"; + if (request.downloadSize) { + ErrorHelper.stringParameterCheck(request.downloadSize, `DynamicsWebApi.${request.functionName}`, "request.downloadSize"); + queryArray.push("size=" + request.downloadSize); } - if (request.bypassCustomPluginExecution) { - ErrorHelper.boolParameterCheck( - request.bypassCustomPluginExecution, - `DynamicsWebApi.${request.functionName}`, - "request.bypassCustomPluginExecution" - ); - headers["MSCRM.BypassCustomPluginExecution"] = "true"; + if (request.queryParams?.length) { + ErrorHelper.arrayParameterCheck(request.queryParams, `DynamicsWebApi.${request.functionName}`, "request.queryParams"); + queryArray.push(request.queryParams.join("&")); } - if (request.noCache) { - ErrorHelper.boolParameterCheck(request.noCache, `DynamicsWebApi.${request.functionName}`, "request.noCache"); - headers["Cache-Control"] = "no-cache"; + if (request.fileName) { + ErrorHelper.stringParameterCheck(request.fileName, `DynamicsWebApi.${request.functionName}`, "request.fileName"); + queryArray.push("x-ms-file-name=" + request.fileName); } - if (request.mergeLabels) { - ErrorHelper.boolParameterCheck(request.mergeLabels, `DynamicsWebApi.${request.functionName}`, "request.mergeLabels"); - headers["MSCRM.MergeLabels"] = "true"; + if (request.data) { + ErrorHelper.parameterCheck(request.data, `DynamicsWebApi.${request.functionName}`, "request.data"); } - if (request.contentId) { - ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, "request.contentId"); - if (!request.contentId.startsWith("$")) { - headers["Content-ID"] = request.contentId; - } + if (request.isBatch) { + ErrorHelper.boolParameterCheck(request.isBatch, `DynamicsWebApi.${request.functionName}`, "request.isBatch"); } - if (request.contentRange) { - ErrorHelper.stringParameterCheck(request.contentRange, `DynamicsWebApi.${request.functionName}`, "request.contentRange"); - headers["Content-Range"] = request.contentRange; + if (!Utility.isNull(request.inChangeSet)) { + ErrorHelper.boolParameterCheck(request.inChangeSet, `DynamicsWebApi.${request.functionName}`, "request.inChangeSet"); } - if (request.range) { - ErrorHelper.stringParameterCheck(request.range, `DynamicsWebApi.${request.functionName}`, "request.range"); - headers["Range"] = request.range; + if (request.isBatch && Utility.isNull(request.inChangeSet)) + request.inChangeSet = true; + if (request.timeout) { + ErrorHelper.numberParameterCheck(request.timeout, `DynamicsWebApi.${request.functionName}`, "request.timeout"); } - return headers; - } - static composePreferHeader(request, config) { - let returnRepresentation = request.returnRepresentation; - let includeAnnotations = request.includeAnnotations; - let maxPageSize = request.maxPageSize; - let trackChanges = request.trackChanges; - let continueOnError = request.continueOnError; - let prefer = []; - if (request.prefer && request.prefer.length) { - ErrorHelper.stringOrArrayParameterCheck(request.prefer, `DynamicsWebApi.${request.functionName}`, "request.prefer"); - if (typeof request.prefer === "string") { - prefer = request.prefer.split(","); - } - for (let i in prefer) { - let item = prefer[i].trim(); - if (item === "return=representation") { - returnRepresentation = true; - } else if (item.includes("odata.include-annotations=")) { - includeAnnotations = item.replace("odata.include-annotations=", "").replace(/"/g, ""); - } else if (item.startsWith("odata.maxpagesize=")) { - maxPageSize = Number(item.replace("odata.maxpagesize=", "").replace(/"/g, "")) || 0; - } else if (item.includes("odata.track-changes")) { - trackChanges = true; - } else if (item.includes("odata.continue-on-error")) { - continueOnError = true; + if (request.expand?.length) { + ErrorHelper.stringOrArrayParameterCheck(request.expand, `DynamicsWebApi.${request.functionName}`, "request.expand"); + if (typeof request.expand === "string") { + queryArray.push("$expand=" + request.expand); + } else { + const expandQueryArray = []; + for (let i = 0; i < request.expand.length; i++) { + if (request.expand[i].property) { + const expand = request.expand[i]; + expand.functionName = `${request.functionName} $expand`; + let expandConverted = composeUrl(expand, config, "", ";"); + if (expandConverted) { + expandConverted = `(${expandConverted.substr(1)})`; + } + expandQueryArray.push(request.expand[i].property + expandConverted); + } + } + if (expandQueryArray.length) { + queryArray.push("$expand=" + expandQueryArray.join(",")); } } } - prefer = []; - if (config) { - if (returnRepresentation == null) { - returnRepresentation = config.returnRepresentation; - } - includeAnnotations = includeAnnotations ? includeAnnotations : config.includeAnnotations; - maxPageSize = maxPageSize ? maxPageSize : config.maxPageSize; - } - if (returnRepresentation) { - ErrorHelper.boolParameterCheck(returnRepresentation, `DynamicsWebApi.${request.functionName}`, "request.returnRepresentation"); - prefer.push("return=representation"); - } - if (includeAnnotations) { - ErrorHelper.stringParameterCheck(includeAnnotations, `DynamicsWebApi.${request.functionName}`, "request.includeAnnotations"); - prefer.push(`odata.include-annotations="${includeAnnotations}"`); - } - if (maxPageSize && maxPageSize > 0) { - ErrorHelper.numberParameterCheck(maxPageSize, `DynamicsWebApi.${request.functionName}`, "request.maxPageSize"); - prefer.push("odata.maxpagesize=" + maxPageSize); + } + return !queryArray.length ? url : url + "?" + queryArray.join(joinSymbol); + }; + var composeHeaders = (request, config) => { + const headers = { ...config.headers, ...request.userHeaders }; + const prefer = composePreferHeader(request, config); + if (prefer.length) { + headers["Prefer"] = prefer; + } + if (request.collection === "$metadata") { + headers["Accept"] = "application/xml"; + } + if (request.transferMode) { + headers["x-ms-transfer-mode"] = request.transferMode; + } + if (request.ifmatch != null && request.ifnonematch != null) { + throw new Error( + `DynamicsWebApi.${request.functionName}. Either one of request.ifmatch or request.ifnonematch parameters should be used in a call, not both.` + ); + } + if (request.ifmatch) { + ErrorHelper.stringParameterCheck(request.ifmatch, `DynamicsWebApi.${request.functionName}`, "request.ifmatch"); + headers["If-Match"] = request.ifmatch; + } + if (request.ifnonematch) { + ErrorHelper.stringParameterCheck(request.ifnonematch, `DynamicsWebApi.${request.functionName}`, "request.ifnonematch"); + headers["If-None-Match"] = request.ifnonematch; + } + if (request.impersonate) { + ErrorHelper.stringParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, "request.impersonate"); + headers["MSCRMCallerID"] = ErrorHelper.guidParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, "request.impersonate"); + } + if (request.impersonateAAD) { + ErrorHelper.stringParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, "request.impersonateAAD"); + headers["CallerObjectId"] = ErrorHelper.guidParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, "request.impersonateAAD"); + } + if (request.token) { + ErrorHelper.stringParameterCheck(request.token, `DynamicsWebApi.${request.functionName}`, "request.token"); + headers["Authorization"] = "Bearer " + request.token; + } + if (request.duplicateDetection) { + ErrorHelper.boolParameterCheck(request.duplicateDetection, `DynamicsWebApi.${request.functionName}`, "request.duplicateDetection"); + headers["MSCRM.SuppressDuplicateDetection"] = "false"; + } + if (request.bypassCustomPluginExecution) { + ErrorHelper.boolParameterCheck(request.bypassCustomPluginExecution, `DynamicsWebApi.${request.functionName}`, "request.bypassCustomPluginExecution"); + headers["MSCRM.BypassCustomPluginExecution"] = "true"; + } + if (request.noCache) { + ErrorHelper.boolParameterCheck(request.noCache, `DynamicsWebApi.${request.functionName}`, "request.noCache"); + headers["Cache-Control"] = "no-cache"; + } + if (request.mergeLabels) { + ErrorHelper.boolParameterCheck(request.mergeLabels, `DynamicsWebApi.${request.functionName}`, "request.mergeLabels"); + headers["MSCRM.MergeLabels"] = "true"; + } + if (request.contentId) { + ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, "request.contentId"); + if (!request.contentId.startsWith("$")) { + headers["Content-ID"] = request.contentId; } - if (trackChanges) { - ErrorHelper.boolParameterCheck(trackChanges, `DynamicsWebApi.${request.functionName}`, "request.trackChanges"); - prefer.push("odata.track-changes"); + } + if (request.contentRange) { + ErrorHelper.stringParameterCheck(request.contentRange, `DynamicsWebApi.${request.functionName}`, "request.contentRange"); + headers["Content-Range"] = request.contentRange; + } + if (request.range) { + ErrorHelper.stringParameterCheck(request.range, `DynamicsWebApi.${request.functionName}`, "request.range"); + headers["Range"] = request.range; + } + return headers; + }; + var composePreferHeader = (request, config) => { + let returnRepresentation = request.returnRepresentation; + let includeAnnotations = request.includeAnnotations; + let maxPageSize = request.maxPageSize; + let trackChanges = request.trackChanges; + let continueOnError = request.continueOnError; + let prefer = []; + if (request.prefer && request.prefer.length) { + ErrorHelper.stringOrArrayParameterCheck(request.prefer, `DynamicsWebApi.${request.functionName}`, "request.prefer"); + if (typeof request.prefer === "string") { + prefer = request.prefer.split(","); + } + for (let i in prefer) { + let item = prefer[i].trim(); + if (item === "return=representation") { + returnRepresentation = true; + } else if (item.includes("odata.include-annotations=")) { + includeAnnotations = item.replace("odata.include-annotations=", "").replace(/"/g, ""); + } else if (item.startsWith("odata.maxpagesize=")) { + maxPageSize = Number(item.replace("odata.maxpagesize=", "").replace(/"/g, "")) || 0; + } else if (item.includes("odata.track-changes")) { + trackChanges = true; + } else if (item.includes("odata.continue-on-error")) { + continueOnError = true; + } } - if (continueOnError) { - ErrorHelper.boolParameterCheck(continueOnError, `DynamicsWebApi.${request.functionName}`, "request.continueOnError"); - prefer.push("odata.continue-on-error"); + } + prefer = []; + if (config) { + if (returnRepresentation == null) { + returnRepresentation = config.returnRepresentation; } - return prefer.join(","); + includeAnnotations = includeAnnotations ? includeAnnotations : config.includeAnnotations; + maxPageSize = maxPageSize ? maxPageSize : config.maxPageSize; } - static convertToBatch(requests, config, batchRequest) { - const batchBoundary = `dwa_batch_${Utility.generateUUID()}`; - const batchBody = []; - let currentChangeSet = null; - let contentId = 1e5; - requests.forEach((internalRequest) => { - internalRequest.functionName = "executeBatch"; - if (batchRequest?.inChangeSet === false) - internalRequest.inChangeSet = false; - const inChangeSet = internalRequest.method === "GET" ? false : !!internalRequest.inChangeSet; - if (!inChangeSet && currentChangeSet) { - batchBody.push(` + if (returnRepresentation) { + ErrorHelper.boolParameterCheck(returnRepresentation, `DynamicsWebApi.${request.functionName}`, "request.returnRepresentation"); + prefer.push("return=representation"); + } + if (includeAnnotations) { + ErrorHelper.stringParameterCheck(includeAnnotations, `DynamicsWebApi.${request.functionName}`, "request.includeAnnotations"); + prefer.push(`odata.include-annotations="${includeAnnotations}"`); + } + if (maxPageSize && maxPageSize > 0) { + ErrorHelper.numberParameterCheck(maxPageSize, `DynamicsWebApi.${request.functionName}`, "request.maxPageSize"); + prefer.push("odata.maxpagesize=" + maxPageSize); + } + if (trackChanges) { + ErrorHelper.boolParameterCheck(trackChanges, `DynamicsWebApi.${request.functionName}`, "request.trackChanges"); + prefer.push("odata.track-changes"); + } + if (continueOnError) { + ErrorHelper.boolParameterCheck(continueOnError, `DynamicsWebApi.${request.functionName}`, "request.continueOnError"); + prefer.push("odata.continue-on-error"); + } + return prefer.join(","); + }; + var convertToBatch = (requests, config, batchRequest) => { + const batchBoundary = `dwa_batch_${Utility.generateUUID()}`; + const batchBody = []; + let currentChangeSet = null; + let contentId = 1e5; + requests.forEach((internalRequest) => { + internalRequest.functionName = "executeBatch"; + if (batchRequest?.inChangeSet === false) + internalRequest.inChangeSet = false; + const inChangeSet = internalRequest.method === "GET" ? false : !!internalRequest.inChangeSet; + if (!inChangeSet && currentChangeSet) { + batchBody.push(` --${currentChangeSet}--`); - currentChangeSet = null; - contentId = 1e5; - } - if (!currentChangeSet) { - batchBody.push(` + currentChangeSet = null; + contentId = 1e5; + } + if (!currentChangeSet) { + batchBody.push(` --${batchBoundary}`); - if (inChangeSet) { - currentChangeSet = `changeset_${Utility.generateUUID()}`; - batchBody.push("Content-Type: multipart/mixed;boundary=" + currentChangeSet); - } - } if (inChangeSet) { - batchBody.push(` ---${currentChangeSet}`); + currentChangeSet = `changeset_${Utility.generateUUID()}`; + batchBody.push("Content-Type: multipart/mixed;boundary=" + currentChangeSet); } - batchBody.push("Content-Type: application/http"); - batchBody.push("Content-Transfer-Encoding: binary"); - if (inChangeSet) { - const contentIdValue = internalRequest.headers.hasOwnProperty("Content-ID") ? internalRequest.headers["Content-ID"] : ++contentId; - batchBody.push(`Content-ID: ${contentIdValue}`); - } - if (!internalRequest.path?.startsWith("$")) { - batchBody.push(` + } + if (inChangeSet) { + batchBody.push(` +--${currentChangeSet}`); + } + batchBody.push("Content-Type: application/http"); + batchBody.push("Content-Transfer-Encoding: binary"); + if (inChangeSet) { + const contentIdValue = internalRequest.headers.hasOwnProperty("Content-ID") ? internalRequest.headers["Content-ID"] : ++contentId; + batchBody.push(`Content-ID: ${contentIdValue}`); + } + if (!internalRequest.path?.startsWith("$")) { + batchBody.push(` ${internalRequest.method} ${config.dataApi.url}${internalRequest.path} HTTP/1.1`); - } else { - batchBody.push(` + } else { + batchBody.push(` ${internalRequest.method} ${internalRequest.path} HTTP/1.1`); - } - if (internalRequest.method === "GET") { - batchBody.push("Accept: application/json"); - } else { - batchBody.push("Content-Type: application/json"); - } - for (let key in internalRequest.headers) { - if (key === "Authorization" || key === "Content-ID") - continue; - batchBody.push(`${key}: ${internalRequest.headers[key]}`); - } - if (internalRequest.data) { - batchBody.push(` -${_RequestUtility.processData(internalRequest.data, config)}`); - } - }); - if (currentChangeSet) { + } + if (internalRequest.method === "GET") { + batchBody.push("Accept: application/json"); + } else { + batchBody.push("Content-Type: application/json"); + } + for (let key in internalRequest.headers) { + if (key === "Authorization" || key === "Content-ID") + continue; + batchBody.push(`${key}: ${internalRequest.headers[key]}`); + } + if (internalRequest.data) { batchBody.push(` ---${currentChangeSet}--`); +${processData(internalRequest.data, config)}`); } + }); + if (currentChangeSet) { batchBody.push(` +--${currentChangeSet}--`); + } + batchBody.push(` --${batchBoundary}--`); - const headers = _RequestUtility.setStandardHeaders(batchRequest?.userHeaders); - headers["Content-Type"] = `multipart/mixed;boundary=${batchBoundary}`; - return { headers, body: batchBody.join("\n") }; - } - static findCollectionName(entityName) { - let collectionName = null; - if (!Utility.isNull(_RequestUtility.entityNames)) { - collectionName = _RequestUtility.entityNames[entityName]; - if (Utility.isNull(collectionName)) { - for (let key in _RequestUtility.entityNames) { - if (_RequestUtility.entityNames[key] === entityName) { - return entityName; - } + const headers = setStandardHeaders(batchRequest?.userHeaders); + headers["Content-Type"] = `multipart/mixed;boundary=${batchBoundary}`; + return { headers, body: batchBody.join("\n") }; + }; + var findCollectionName = (entityName) => { + let collectionName = null; + if (!Utility.isNull(entityNames)) { + collectionName = entityNames[entityName]; + if (!collectionName) { + for (let key in entityNames) { + if (entityNames[key] === entityName) { + return entityName; } } } - return collectionName; } - static processData(data, config) { - let stringifiedData = null; - if (data) { - if (data instanceof Uint8Array || data instanceof Uint16Array || data instanceof Uint32Array) - return data; - stringifiedData = JSON.stringify(data, (key, value) => { - if (key.endsWith("@odata.bind") || key.endsWith("@odata.id")) { - if (typeof value === "string" && !value.startsWith("$")) { - if (/\(\{[\w\d-]+\}\)/g.test(value)) { - value = value.replace(/(.+)\(\{([\w\d-]+)\}\)/g, "$1($2)"); - } - if (config.useEntityNames) { - const regularExpression = /([\w_]+)(\([\d\w-]+\))$/; - const valueParts = regularExpression.exec(value); - if (valueParts && valueParts.length > 2) { - const collectionName = _RequestUtility.findCollectionName(valueParts[1]); - if (!Utility.isNull(collectionName)) { - value = value.replace(regularExpression, collectionName + "$2"); - } + return collectionName; + }; + var processData = (data, config) => { + let stringifiedData = null; + if (data) { + if (data instanceof Uint8Array || data instanceof Uint16Array || data instanceof Uint32Array) + return data; + stringifiedData = JSON.stringify(data, (key, value) => { + if (key.endsWith("@odata.bind") || key.endsWith("@odata.id")) { + if (typeof value === "string" && !value.startsWith("$")) { + if (/\(\{[\w\d-]+\}\)/g.test(value)) { + value = value.replace(/(.+)\(\{([\w\d-]+)\}\)/g, "$1($2)"); + } + if (config.useEntityNames) { + const regularExpression = /([\w_]+)(\([\d\w-]+\))$/; + const valueParts = regularExpression.exec(value); + if (valueParts && valueParts.length > 2) { + const collectionName = findCollectionName(valueParts[1]); + if (!Utility.isNull(collectionName)) { + value = value.replace(regularExpression, collectionName + "$2"); } } - if (!value.startsWith(config.dataApi.url)) { - if (key.endsWith("@odata.bind")) { - if (!value.startsWith("/")) { - value = "/" + value; - } - } else { - value = config.dataApi.url + value.replace(/^\//, ""); + } + if (!value.startsWith(config.dataApi.url)) { + if (key.endsWith("@odata.bind")) { + if (!value.startsWith("/")) { + value = "/" + value; } + } else { + value = config.dataApi.url + value.replace(/^\//, ""); } } - } else if (key.startsWith("oData") || key.endsWith("_Formatted") || key.endsWith("_NavigationProperty") || key.endsWith("_LogicalName")) { - value = void 0; } - return value; - }); - stringifiedData = stringifiedData.replace(/[\u007F-\uFFFF]/g, function(chr) { - return "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).slice(-4); - }); - } - return stringifiedData; - } - static setStandardHeaders(headers = {}) { - if (!headers["Accept"]) - headers["Accept"] = "application/json"; - if (!headers["OData-MaxVersion"]) - headers["OData-MaxVersion"] = "4.0"; - if (!headers["OData-Version"]) - headers["OData-Version"] = "4.0"; - if (headers["Content-Range"]) - headers["Content-Type"] = "application/octet-stream"; - else if (!headers["Content-Type"]) - headers["Content-Type"] = "application/json; charset=utf-8"; - return headers; + } else if (key.startsWith("oData") || key.endsWith("_Formatted") || key.endsWith("_NavigationProperty") || key.endsWith("_LogicalName")) { + value = void 0; + } + return value; + }); + stringifiedData = stringifiedData.replace(/[\u007F-\uFFFF]/g, function(chr) { + return "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).slice(-4); + }); } + return stringifiedData; + }; + var setStandardHeaders = (headers = {}) => { + if (!headers["Accept"]) + headers["Accept"] = "application/json"; + if (!headers["OData-MaxVersion"]) + headers["OData-MaxVersion"] = "4.0"; + if (!headers["OData-Version"]) + headers["OData-Version"] = "4.0"; + if (headers["Content-Range"]) + headers["Content-Type"] = "application/octet-stream"; + else if (!headers["Content-Type"]) + headers["Content-Type"] = "application/json; charset=utf-8"; + return headers; }; - _RequestUtility.entityNames = null; - var RequestUtility = _RequestUtility; // src/client/RequestClient.ts init_ErrorHelper(); @@ -1471,7 +1438,55 @@ ${_RequestUtility.processData(internalRequest.data, config)}`); }; var _batchRequestCollection = {}; var _responseParseParams = {}; - var RequestClient = class _RequestClient { + var _nameExceptions = [ + "$metadata", + "EntityDefinitions", + "RelationshipDefinitions", + "GlobalOptionSetDefinitions", + "ManagedPropertyDefinitions", + "query", + "suggest", + "autocomplete" + ]; + var _isEntityNameException = (entityName) => { + return _nameExceptions.indexOf(entityName) > -1; + }; + var _getCollectionNames = async (entityName, config) => { + if (!Utility.isNull(entityNames)) { + return findCollectionName(entityName) || entityName; + } + const request = compose( + { + method: "GET", + collection: "EntityDefinitions", + select: ["EntitySetName", "LogicalName"], + noCache: true, + functionName: "retrieveMultiple" + }, + config + ); + const result = await _runRequest(request, config); + setEntityNames({}); + for (let i = 0; i < result.data.value.length; i++) { + entityNames[result.data.value[i].LogicalName] = result.data.value[i].EntitySetName; + } + return findCollectionName(entityName) || entityName; + }; + var _checkCollectionName = async (entityName, config) => { + if (!entityName || _isEntityNameException(entityName)) { + return entityName; + } + entityName = entityName.toLowerCase(); + if (!config.useEntityNames) { + return entityName; + } + try { + return await _getCollectionNames(entityName, config); + } catch (error) { + throw new Error("Unable to fetch Collection Names. Error: " + error.message); + } + }; + var RequestClient = class { /** * Sends a request to given URL with given parameters * @@ -1489,14 +1504,14 @@ ${_RequestUtility.processData(internalRequest.data, config)}`); const batchRequest = _batchRequestCollection[request.requestId]; if (!batchRequest) throw ErrorHelper.batchIsEmpty(); - const batchResult = RequestUtility.convertToBatch(batchRequest, config, request); + const batchResult = convertToBatch(batchRequest, config, request); processedData = batchResult.body; request.headers = { ...batchResult.headers, ...request.headers }; delete _batchRequestCollection[request.requestId]; } else { - processedData = !isBatchConverted ? RequestUtility.processData(request.data, config) : request.data; + processedData = !isBatchConverted ? processData(request.data, config) : request.data; if (!isBatchConverted) - request.headers = RequestUtility.setStandardHeaders(request.headers); + request.headers = setStandardHeaders(request.headers); } if (config.impersonate && !request.headers["MSCRMCallerID"]) { request.headers["MSCRMCallerID"] = config.impersonate; @@ -1521,74 +1536,29 @@ ${_RequestUtility.processData(internalRequest.data, config)}`); method: request.method, uri: url.toString() + request.path, data: processedData, - additionalHeaders: request.headers, - responseParams: _responseParseParams, - isAsync: request.async, - timeout: request.timeout || config.timeout, proxy: config.proxy, + isAsync: request.async, + headers: request.headers, requestId: request.requestId, - abortSignal: request.signal + abortSignal: request.signal, + responseParams: _responseParseParams, + timeout: request.timeout || config.timeout }); } - static async _getCollectionNames(entityName, config) { - if (!Utility.isNull(RequestUtility.entityNames)) { - return RequestUtility.findCollectionName(entityName) || entityName; - } - const request = RequestUtility.compose( - { - method: "GET", - collection: "EntityDefinitions", - select: ["EntitySetName", "LogicalName"], - noCache: true, - functionName: "retrieveMultiple" - }, - config - ); - const result = await _runRequest(request, config); - RequestUtility.entityNames = {}; - for (let i = 0; i < result.data.value.length; i++) { - RequestUtility.entityNames[result.data.value[i].LogicalName] = result.data.value[i].EntitySetName; - } - return RequestUtility.findCollectionName(entityName) || entityName; - } - static _isEntityNameException(entityName) { - const exceptions = [ - "$metadata", - "EntityDefinitions", - "RelationshipDefinitions", - "GlobalOptionSetDefinitions", - "ManagedPropertyDefinitions", - "query", - "suggest", - "autocomplete" - ]; - return exceptions.indexOf(entityName) > -1; - } - static async _checkCollectionName(entityName, config) { - if (!entityName || _RequestClient._isEntityNameException(entityName)) { - return entityName; - } - entityName = entityName.toLowerCase(); - if (!config.useEntityNames) { - return entityName; - } - try { - return await _RequestClient._getCollectionNames(entityName, config); - } catch (error) { - throw new Error("Unable to fetch Collection Names. Error: " + error.message); - } - } static async makeRequest(request, config) { request.responseParameters = request.responseParameters || {}; request.userHeaders = request.headers; delete request.headers; if (!request.isBatch) { - const collectionName = await _RequestClient._checkCollectionName(request.collection, config); + const collectionName = await _checkCollectionName(request.collection, config); request.collection = collectionName; - RequestUtility.compose(request, config); + compose(request, config); request.responseParameters.convertedToBatch = false; if (request.path.length > 2e3) { - const batchRequest = RequestUtility.convertToBatch([request], config); + const batchRequest = convertToBatch([request], config); + if (request.headers["Authorization"]) { + batchRequest.headers["Authorization"] = request.headers["Authorization"]; + } request.method = "POST"; request.path = "$batch"; request.data = batchRequest.body; @@ -1597,17 +1567,17 @@ ${_RequestUtility.processData(internalRequest.data, config)}`); } return _runRequest(request, config); } - RequestUtility.compose(request, config); + compose(request, config); _addResponseParams(request.requestId, request.responseParameters); _addRequestToBatchCollection(request.requestId, request); } static _clearTestData() { - RequestUtility.entityNames = null; + setEntityNames(null); _responseParseParams = {}; _batchRequestCollection = {}; } static getCollectionName(entityName) { - return RequestUtility.findCollectionName(entityName); + return findCollectionName(entityName); } }; @@ -2079,7 +2049,7 @@ ${_RequestUtility.processData(internalRequest.data, config)}`); ErrorHelper.stringParameterCheck(functionName, `DynamicsWebApi.callFunction`, parameterName); const functionParameters = Utility.buildFunctionParameters(internalRequest.parameters); internalRequest.method = "GET"; - internalRequest._additionalUrl = functionName + functionParameters.key; + internalRequest.addPath = functionName + functionParameters.key; internalRequest.queryParams = functionParameters.queryParams; internalRequest._isUnboundRequest = !internalRequest.collection; internalRequest.functionName = "callFunction"; @@ -2098,7 +2068,7 @@ ${_RequestUtility.processData(internalRequest.data, config)}`); const internalRequest = Utility.copyRequest(request, ["action"]); internalRequest.method = "POST"; internalRequest.functionName = "callAction"; - internalRequest._additionalUrl = request.actionName; + internalRequest.addPath = request.actionName; internalRequest._isUnboundRequest = !internalRequest.collection; internalRequest.data = request.action; const response = await this._makeRequest(internalRequest); diff --git a/dist/dynamics-web-api.js.map b/dist/dynamics-web-api.js.map index 18b6b0a..07d5c12 100644 --- a/dist/dynamics-web-api.js.map +++ b/dist/dynamics-web-api.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/helpers/Crypto.ts", "../src/helpers/Regex.ts", "../src/utils/Utility.ts", "../src/helpers/ErrorHelper.ts", "../src/dwa.ts", "../src/client/helpers/dateReviver.ts", "../src/client/helpers/parseResponse.ts", "../src/client/helpers/parseResponseHeaders.ts", "../src/client/xhr.ts", "../src/dynamics-web-api.ts", "../src/utils/Config.ts", "../src/client/RequestClient.ts", "../src/utils/Request.ts", "../src/client/helpers/executeRequest.ts"], - "sourcesContent": ["export function getCrypto(): T {\r\n return global.DWA_BROWSER ? global.window.crypto : require(\"./crypto/node\").getCrypto();\r\n}\r\n\r\nexport function generateRandomBytes() {\r\n return global.DWA_BROWSER ? getCrypto().getRandomValues(new Uint8Array(1)) : getCrypto().randomBytes(1);\r\n}\r\n", "const uuid = \"[0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12}\";\r\n\r\nexport function isUuid(value: string): boolean {\r\n const match = new RegExp(uuid, \"i\").exec(value);\r\n return !!match;\r\n}\r\n\r\nexport function extractUuid(value: string): string | null {\r\n const match = new RegExp(\"^{?(\" + uuid + \")}?$\", \"i\").exec(value);\r\n return match ? match[1] : null;\r\n}\r\n\r\nexport function extractUuidFromUrl(url: string): string | null {\r\n const match = new RegExp(\"(\" + uuid + \")\\\\)$\", \"i\").exec(url);\r\n return match ? match[1] : null;\r\n}\r\n", "\uFEFFimport { Core } from \"../types\";\r\nimport { generateRandomBytes } from \"../helpers/Crypto\";\r\nimport { isUuid, extractUuid } from \"../helpers/Regex\";\r\n\r\ndeclare var GetGlobalContext: any;\r\ndeclare var Xrm: any;\r\n\r\n// function isNodeEnv(): boolean {\r\n// // tslint:disable:strict-type-predicates\r\n// return Object.prototype.toString.call(typeof process !== \"undefined\" ? process : 0) === \"[object process]\";\r\n// }\r\n\r\n// function getGlobalObject(): T {\r\n// return (isNodeEnv() ? global : typeof window !== \"undefined\" ? window : typeof self !== \"undefined\" ? self : {}) as T;\r\n// }\r\n\r\nconst downloadChunkSize = 4194304;\r\n\r\nexport class Utility {\r\n /**\r\n * Builds parametes for a funciton. Returns '()' (if no parameters) or '([params])?[query]'\r\n *\r\n * @param {Object} [parameters] - Function's input parameters. Example: { param1: \"test\", param2: 3 }.\r\n * @returns {string}\r\n */\r\n static buildFunctionParameters(parameters?: any): Core.FunctionParameters {\r\n if (parameters) {\r\n const parameterNames = Object.keys(parameters);\r\n const functionParams: string[] = [];\r\n const urlQuery: string[] = [];\r\n\r\n for (let i = 1; i <= parameterNames.length; i++) {\r\n const parameterName = parameterNames[i - 1];\r\n let value = parameters[parameterName];\r\n\r\n if (value == null) continue;\r\n\r\n if (typeof value === \"string\" && !value.startsWith(\"Microsoft.Dynamics.CRM\") && !isUuid(value)) {\r\n value = `'${value}'`;\r\n } else if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n\r\n functionParams.push(`${parameterName}=@p${i}`);\r\n urlQuery.push(`@p${i}=${extractUuid(value) || value}`);\r\n }\r\n\r\n return {\r\n key: `(${functionParams.join(\",\")})`,\r\n queryParams: urlQuery,\r\n };\r\n } else {\r\n return {\r\n key: \"()\",\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Parses a paging cookie returned in response\r\n *\r\n * @param {string} pageCookies - Page cookies returned in @Microsoft.Dynamics.CRM.fetchxmlpagingcookie.\r\n * @param {number} currentPageNumber - A current page number. Fix empty paging-cookie for complex fetch xmls.\r\n * @returns {{cookie: \"\", number: 0, next: 1}}\r\n */\r\n static getFetchXmlPagingCookie(pageCookies: string = \"\", currentPageNumber: number = 1): Core.FetchXmlCookie {\r\n //get the page cokies\r\n pageCookies = decodeURIComponent(decodeURIComponent(pageCookies));\r\n\r\n const info = /pagingcookie=\"()/.exec(pageCookies);\r\n\r\n if (info != null) {\r\n let page = parseInt(info[2]);\r\n return {\r\n cookie: info[1]\r\n .replace(//g, \">\")\r\n .replace(/\\\"/g, \"'\")\r\n .replace(/\\'/g, \"&\" + \"quot;\"),\r\n page: page,\r\n nextPage: page + 1,\r\n };\r\n } else {\r\n //http://stackoverflow.com/questions/41262772/execution-of-fetch-xml-using-web-api-dynamics-365 workaround\r\n return {\r\n cookie: \"\",\r\n page: currentPageNumber,\r\n nextPage: currentPageNumber + 1,\r\n };\r\n }\r\n }\r\n\r\n // static isNodeEnv = isNodeEnv;\r\n\r\n static downloadChunkSize = downloadChunkSize;\r\n\r\n /**\r\n * Converts a response to a reference object\r\n *\r\n * @param {Object} responseData - Response object\r\n * @returns {ReferenceObject}\r\n */\r\n static convertToReferenceObject(responseData: any): Core.ReferenceObject {\r\n const result = /\\/(\\w+)\\(([0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12})/i.exec(responseData[\"@odata.id\"]);\r\n return { id: result![2], collection: result![1], oDataContext: responseData[\"@odata.context\"] };\r\n }\r\n\r\n /**\r\n * Checks whether the value is JS Null.\r\n * @param {Object} value\r\n * @returns {boolean}\r\n */\r\n static isNull(value: any): boolean {\r\n return typeof value === \"undefined\" || value == null;\r\n }\r\n\r\n /** Generates UUID */\r\n static generateUUID(): string {\r\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) => (c ^ (generateRandomBytes()[0] & (15 >> (c / 4)))).toString(16));\r\n }\r\n\r\n static getXrmContext(): any {\r\n if (typeof GetGlobalContext !== \"undefined\") {\r\n return GetGlobalContext();\r\n } else {\r\n if (typeof Xrm !== \"undefined\") {\r\n //d365 v.9.0\r\n if (!Utility.isNull(Xrm.Utility) && !Utility.isNull(Xrm.Utility.getGlobalContext)) {\r\n return Xrm.Utility.getGlobalContext();\r\n } else if (!Utility.isNull(Xrm.Page) && !Utility.isNull(Xrm.Page.context)) {\r\n return Xrm.Page.context;\r\n }\r\n }\r\n }\r\n\r\n throw new Error(\r\n \"Xrm Context is not available. In most cases, it can be resolved by adding a reference to a ClientGlobalContext.js.aspx. Please refer to MSDN documentation for more details.\"\r\n );\r\n }\r\n\r\n // static getXrmUtility(): any {\r\n // return typeof Xrm !== \"undefined\" ? Xrm.Utility : null;\r\n // }\r\n\r\n static getClientUrl(): string {\r\n const context = Utility.getXrmContext();\r\n\r\n let clientUrl = context.getClientUrl();\r\n\r\n if (clientUrl.match(/\\/$/)) {\r\n clientUrl = clientUrl.substring(0, clientUrl.length - 1);\r\n }\r\n return clientUrl;\r\n }\r\n\r\n /**\r\n * Checks whether the app is currently running in a Dynamics Portals Environment.\r\n *\r\n * In that case we switch to the Web API for Dynamics Portals.\r\n * @returns {boolean}\r\n */\r\n static isRunningWithinPortals(): boolean {\r\n return global.DWA_BROWSER ? !!global.window.shell : false;\r\n }\r\n\r\n static isObject(obj: any): boolean {\r\n return typeof obj === \"object\" && !!obj && !Array.isArray(obj) && Object.prototype.toString.call(obj) !== \"[object Date]\";\r\n }\r\n\r\n static copyObject(src: any, excludeProps?: string[]): T {\r\n let target = {};\r\n for (let prop in src) {\r\n if (src.hasOwnProperty(prop) && !excludeProps?.includes(prop)) {\r\n // if the value is a nested object, recursively copy all its properties\r\n if (Utility.isObject(src[prop])) {\r\n target[prop] = Utility.copyObject(src[prop]);\r\n } else if (Array.isArray(src[prop])) {\r\n target[prop] = src[prop].slice();\r\n } else {\r\n target[prop] = src[prop];\r\n }\r\n }\r\n }\r\n return target;\r\n }\r\n\r\n static copyRequest(src: any, excludeProps: string[] = []): Core.InternalRequest {\r\n //todo: do we need to include \"data\" in here?\r\n if (!excludeProps.includes(\"signal\")) excludeProps.push(\"signal\");\r\n\r\n const result = Utility.copyObject(src, excludeProps);\r\n result.signal = src.signal;\r\n\r\n return result;\r\n }\r\n\r\n static setFileChunk(request: Core.InternalRequest, fileBuffer: Uint8Array | Buffer, chunkSize: number, offset: number): void {\r\n offset = offset || 0;\r\n\r\n const count = offset + chunkSize > fileBuffer.length ? fileBuffer.length % chunkSize : chunkSize;\r\n\r\n let content: any;\r\n\r\n if (global.DWA_BROWSER) {\r\n content = new Uint8Array(count);\r\n for (let i = 0; i < count; i++) {\r\n content[i] = fileBuffer[offset + i];\r\n }\r\n } else {\r\n content = fileBuffer.slice(offset, offset + count);\r\n }\r\n\r\n request.data = content;\r\n request.contentRange = \"bytes \" + offset + \"-\" + (offset + count - 1) + \"/\" + fileBuffer.length;\r\n }\r\n\r\n static convertToFileBuffer(binaryString: string): Uint8Array | Buffer {\r\n if (!global.DWA_BROWSER) return Buffer.from(binaryString, \"binary\");\r\n\r\n const bytes = new Uint8Array(binaryString.length);\r\n for (var i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n return bytes;\r\n }\r\n}\r\n", "\uFEFFimport { AccessToken } from \"../dynamics-web-api\";\r\nimport { extractUuid } from \"./Regex\";\r\n\r\nexport interface DynamicsWebApiError extends Error {\r\n status: number;\r\n}\r\n\r\nfunction throwParameterError(functionName: string, parameterName: string, type: string | null | undefined): void {\r\n throw new Error(\r\n type ? `${functionName} requires a ${parameterName} parameter to be of type ${type}.` : `${functionName} requires a ${parameterName} parameter.`\r\n );\r\n}\r\n\r\nexport class ErrorHelper {\r\n static handleErrorResponse(req): void {\r\n throw new Error(`Error: ${req.status}: ${req.message}`);\r\n }\r\n\r\n static parameterCheck(parameter: any, functionName: string, parameterName: string, type?: string): void {\r\n if (typeof parameter === \"undefined\" || parameter === null || parameter === \"\") {\r\n throwParameterError(functionName, parameterName, type);\r\n }\r\n }\r\n\r\n static stringParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter !== \"string\") {\r\n throwParameterError(functionName, parameterName, \"String\");\r\n }\r\n }\r\n\r\n static maxLengthStringParameterCheck(parameter: string | null, functionName: string, parameterName: string, maxLength: number): void {\r\n if (!parameter) return;\r\n\r\n if (parameter.length > maxLength) {\r\n throw new Error(`${parameterName} has a ${maxLength} character limit.`);\r\n }\r\n }\r\n\r\n static arrayParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (parameter.constructor !== Array) {\r\n throwParameterError(functionName, parameterName, \"Array\");\r\n }\r\n }\r\n\r\n static stringOrArrayParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (parameter.constructor !== Array && typeof parameter !== \"string\") {\r\n throwParameterError(functionName, parameterName, \"String or Array\");\r\n }\r\n }\r\n\r\n static numberParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter != \"number\") {\r\n if (typeof parameter === \"string\" && parameter) {\r\n if (!isNaN(parseInt(parameter))) {\r\n return;\r\n }\r\n }\r\n throwParameterError(functionName, parameterName, \"Number\");\r\n }\r\n }\r\n\r\n static batchIsEmpty(): Error[] {\r\n return [\r\n new Error(\r\n \"Payload of the batch operation is empty. Please make that you have other operations in between startBatch() and executeBatch() to successfuly build a batch payload.\"\r\n ),\r\n ];\r\n }\r\n\r\n static handleHttpError(parsedError: any, parameters?: any): DynamicsWebApiError {\r\n const error = new Error();\r\n\r\n Object.keys(parsedError).forEach((k) => {\r\n error[k] = parsedError[k];\r\n });\r\n\r\n if (parameters) {\r\n Object.keys(parameters).forEach((k) => {\r\n error[k] = parameters[k];\r\n });\r\n }\r\n\r\n return error;\r\n }\r\n\r\n static boolParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter != \"boolean\") {\r\n throwParameterError(functionName, parameterName, \"Boolean\");\r\n }\r\n }\r\n\r\n /**\r\n * Private function used to check whether required parameter is a valid GUID\r\n * @param parameter The GUID parameter to check\r\n * @param functionName\r\n * @param parameterName\r\n * @returns\r\n */\r\n static guidParameterCheck(parameter: any, functionName: string, parameterName: string): string {\r\n const match = extractUuid(parameter);\r\n if (!match) throwParameterError(functionName, parameterName, \"GUID String\");\r\n\r\n return match!;\r\n }\r\n\r\n static keyParameterCheck(parameter: any, functionName: string, parameterName: string): string | undefined {\r\n try {\r\n ErrorHelper.stringParameterCheck(parameter, functionName, parameterName);\r\n\r\n //check if the param is a guid\r\n const match = extractUuid(parameter);\r\n if (match) return match;\r\n\r\n //check the alternate key\r\n const alternateKeys = parameter.split(\",\");\r\n\r\n if (alternateKeys.length) {\r\n for (let i = 0; i < alternateKeys.length; i++) {\r\n alternateKeys[i] = alternateKeys[i].trim().replace(/\"/g, \"'\");\r\n /^[\\w\\d\\_]+\\=(.+)$/i.exec(alternateKeys[i])![0];\r\n }\r\n }\r\n\r\n return alternateKeys.join(\",\");\r\n } catch (error) {\r\n throwParameterError(functionName, parameterName, \"String representing GUID or Alternate Key\");\r\n }\r\n }\r\n\r\n static callbackParameterCheck(callbackParameter: () => Promise, functionName: string, parameterName: string): void {\r\n if (typeof callbackParameter != \"function\") {\r\n throwParameterError(functionName, parameterName, \"Function\");\r\n }\r\n }\r\n\r\n static throwBatchIncompatible(functionName: string, isBatch: boolean): void {\r\n if (isBatch) {\r\n isBatch = false;\r\n throw new Error(functionName + \" cannot be used in a BATCH request.\");\r\n }\r\n }\r\n\r\n static throwBatchNotStarted(isBatch: boolean): void {\r\n if (!isBatch) {\r\n throw new Error(\r\n \"Batch operation has not been started. Please call a DynamicsWebApi.startBatch() function prior to calling DynamicsWebApi.executeBatch() to perform a batch request correctly.\"\r\n );\r\n }\r\n }\r\n}\r\n", "class DWA {\r\n\tstatic Prefer = class {\r\n\t\tstatic ReturnRepresentation: string = \"return=representation\";\r\n\t\tstatic Annotations = class {\r\n\t\t\tstatic AssociatedNavigationProperty: string = \"Microsoft.Dynamics.CRM.associatednavigationproperty\";\r\n\t\t\tstatic LookupLogicalName: string = \"Microsoft.Dynamics.CRM.lookuplogicalname\";\r\n\t\t\tstatic All: string = \"*\";\r\n\t\t\tstatic FormattedValue: string = \"OData.Community.Display.V1.FormattedValue\";\r\n\t\t\tstatic FetchXmlPagingCookie: string = \"Microsoft.Dynamics.CRM.fetchxmlpagingcookie\";\r\n\t\t};\r\n\t\tstatic IncludeAnnotations: string = \"odata.include-annotations\";\r\n\t\tstatic get(annotation: string) {\r\n\t\t\treturn `${DWA.Prefer.IncludeAnnotations}=\"${annotation}\"`;\r\n\t\t}\r\n\t};\r\n}\r\n\r\nexport { DWA };\r\n", "\uFEFFexport function dateReviver(key: string, value: any): Date {\r\n\tif (typeof value === \"string\") {\r\n\t\tconst a = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:Z|[-+]\\d{2}:\\d{2})$/.exec(value);\r\n\t\tif (a) {\r\n\t\t\treturn new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));\r\n\t\t}\r\n\t}\r\n\treturn value;\r\n}\r\n", "\uFEFFimport { DWA } from \"../../dwa\";\r\nimport { Utility } from \"../../utils/Utility\";\r\nimport { ErrorHelper, DynamicsWebApiError } from \"../../helpers/ErrorHelper\";\r\nimport { dateReviver } from \"./dateReviver\";\r\nimport { Core } from \"../../types\";\r\nimport { extractUuidFromUrl } from \"../../helpers/Regex\";\r\n\r\nfunction getFormattedKeyValue(keyName: string, value: any): any[] {\r\n let newKey: string | null = null;\r\n if (keyName.indexOf(\"@\") !== -1) {\r\n const format = keyName.split(\"@\");\r\n switch (format[1]) {\r\n case \"odata.context\":\r\n newKey = \"oDataContext\";\r\n break;\r\n case \"odata.count\":\r\n newKey = \"oDataCount\";\r\n value = value != null ? parseInt(value) : 0;\r\n break;\r\n case \"odata.nextLink\":\r\n newKey = \"oDataNextLink\";\r\n break;\r\n case \"odata.deltaLink\":\r\n newKey = \"oDataDeltaLink\";\r\n break;\r\n case DWA.Prefer.Annotations.FormattedValue:\r\n newKey = format[0] + \"_Formatted\";\r\n break;\r\n case DWA.Prefer.Annotations.AssociatedNavigationProperty:\r\n newKey = format[0] + \"_NavigationProperty\";\r\n break;\r\n case DWA.Prefer.Annotations.LookupLogicalName:\r\n newKey = format[0] + \"_LogicalName\";\r\n break;\r\n }\r\n }\r\n\r\n return [newKey, value];\r\n}\r\n\r\n/**\r\n *\r\n * @param {any} object - parsed JSON object\r\n * @param {any} parseParams - parameters for parsing the response\r\n * @returns {any} parsed batch response\r\n */\r\nfunction parseData(object: any, parseParams?: any): any {\r\n if (parseParams) {\r\n if (parseParams.isRef && object[\"@odata.id\"] != null) {\r\n return Utility.convertToReferenceObject(object);\r\n }\r\n\r\n if (parseParams.toCount) {\r\n return getFormattedKeyValue(\"@odata.count\", object[\"@odata.count\"])[1] || 0;\r\n }\r\n }\r\n\r\n const keys = Object.keys(object);\r\n\r\n for (let i = 0; i < keys.length; i++) {\r\n const currentKey = keys[i];\r\n\r\n if (object[currentKey] != null) {\r\n if (object[currentKey].constructor === Array) {\r\n for (var j = 0; j < object[currentKey].length; j++) {\r\n object[currentKey][j] = parseData(object[currentKey][j]);\r\n }\r\n } else if (typeof object[currentKey] === \"object\") {\r\n parseData(object[currentKey]);\r\n }\r\n }\r\n\r\n //parse formatted values\r\n let formattedKeyValue = getFormattedKeyValue(currentKey, object[currentKey]);\r\n if (formattedKeyValue[0]) {\r\n object[formattedKeyValue[0]] = formattedKeyValue[1];\r\n }\r\n\r\n //parse aliased values\r\n if (currentKey.indexOf(\"_x002e_\") !== -1) {\r\n const aliasKeys = currentKey.split(\"_x002e_\");\r\n\r\n if (!object.hasOwnProperty(aliasKeys[0])) {\r\n object[aliasKeys[0]] = { _dwaType: \"alias\" };\r\n }\r\n //throw an error if there is already a property which is not an 'alias'\r\n else if (\r\n typeof object[aliasKeys[0]] !== \"object\" ||\r\n (typeof object[aliasKeys[0]] === \"object\" && !object[aliasKeys[0]].hasOwnProperty(\"_dwaType\"))\r\n ) {\r\n throw new Error(\"The alias name of the linked entity must be unique!\");\r\n }\r\n\r\n object[aliasKeys[0]][aliasKeys[1]] = object[currentKey];\r\n\r\n //aliases also contain formatted values\r\n formattedKeyValue = getFormattedKeyValue(aliasKeys[1], object[currentKey]);\r\n if (formattedKeyValue[0]) {\r\n object[aliasKeys[0]][formattedKeyValue[0]] = formattedKeyValue[1];\r\n }\r\n }\r\n }\r\n\r\n if (parseParams) {\r\n if (parseParams.hasOwnProperty(\"pageNumber\") && object[\"@\" + DWA.Prefer.Annotations.FetchXmlPagingCookie] != null) {\r\n object.PagingInfo = Utility.getFetchXmlPagingCookie(object[\"@\" + DWA.Prefer.Annotations.FetchXmlPagingCookie], parseParams.pageNumber);\r\n }\r\n }\r\n\r\n return object;\r\n}\r\n\r\nconst responseHeaderRegex = /^([^()<>@,;:\\\\\"\\/[\\]?={} \\t]+)\\s?:\\s?(.*)/;\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction parseBatchHeaders(text: string): any {\r\n const ctx = { position: 0 };\r\n const headers = {};\r\n let parts;\r\n let line;\r\n let pos;\r\n\r\n do {\r\n pos = ctx.position;\r\n line = readLine(text, ctx);\r\n parts = responseHeaderRegex.exec(line);\r\n if (parts !== null) {\r\n headers[parts[1].toLowerCase()] = parts[2];\r\n } else {\r\n // Whatever was found is not a header, so reset the context position.\r\n ctx.position = pos;\r\n }\r\n } while (line && parts);\r\n\r\n return headers;\r\n}\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction readLine(text: string, ctx: { position: number }): string | null {\r\n return readTo(text, ctx, \"\\r\\n\");\r\n}\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction readTo(text: string, ctx: { position: number }, str: string): string | null {\r\n const start = ctx.position || 0;\r\n let end = text.length;\r\n if (str) {\r\n end = text.indexOf(str, start);\r\n if (end === -1) {\r\n return null;\r\n }\r\n ctx.position = end + str.length;\r\n } else {\r\n ctx.position = end;\r\n }\r\n\r\n return text.substring(start, end);\r\n}\r\n\r\n//partially taken from https://github.com/emiltholin/google-api-batch-utils\r\n/**\r\n *\r\n * @param {string} response - response that needs to be parsed\r\n * @param {Array} parseParams - parameters for parsing the response\r\n * @param {Number} [requestNumber] - number of the request\r\n * @returns {any} parsed batch response\r\n */\r\nfunction parseBatchResponse(response: string, parseParams: any, requestNumber: number = 0): (string | undefined | DynamicsWebApiError | Number)[] {\r\n // Not the same delimiter in the response as we specify ourselves in the request,\r\n // so we have to extract it.\r\n const delimiter = response.substr(0, response.indexOf(\"\\r\\n\"));\r\n const batchResponseParts = response.split(delimiter);\r\n // The first part will always be an empty string. Just remove it.\r\n batchResponseParts.shift();\r\n // The last part will be the \"--\". Just remove it.\r\n batchResponseParts.pop();\r\n\r\n let result: (string | undefined | DynamicsWebApiError | Number)[] = [];\r\n for (let i = 0; i < batchResponseParts.length; i++) {\r\n let batchResponse = batchResponseParts[i];\r\n if (batchResponse.indexOf(\"--changesetresponse_\") > -1) {\r\n batchResponse = batchResponse.trim();\r\n const batchToProcess = batchResponse.substring(batchResponse.indexOf(\"\\r\\n\") + 1).trim();\r\n\r\n result = result.concat(parseBatchResponse(batchToProcess, parseParams, requestNumber));\r\n } else {\r\n //check http status\r\n const httpStatusReg = /HTTP\\/?\\s*[\\d.]*\\s+(\\d{3})\\s+([\\w\\s]*)$/gm.exec(batchResponse);\r\n //todo: add error handler for httpStatus and httpStatusMessage; remove \"!\" operator\r\n const httpStatus = parseInt(httpStatusReg![1]);\r\n const httpStatusMessage = httpStatusReg![2].trim();\r\n\r\n const responseData = batchResponse.substring(batchResponse.indexOf(\"{\"), batchResponse.lastIndexOf(\"}\") + 1);\r\n\r\n if (!responseData) {\r\n if (/Content-Type: text\\/plain/i.test(batchResponse)) {\r\n const plainContentReg = /\\w+$/gi.exec(batchResponse.trim());\r\n const plainContent = plainContentReg && plainContentReg.length ? plainContentReg[0] : undefined;\r\n\r\n //check if a plain content is a number or not\r\n result.push(isNaN(Number(plainContent)) ? plainContent : Number(plainContent));\r\n } else {\r\n if (parseParams.length && parseParams[requestNumber] && parseParams[requestNumber].hasOwnProperty(\"valueIfEmpty\")) {\r\n result.push(parseParams[requestNumber].valueIfEmpty);\r\n } else {\r\n const entityUrl = /OData-EntityId.+/i.exec(batchResponse);\r\n\r\n if (entityUrl && entityUrl.length) {\r\n const guidResult = extractUuidFromUrl(entityUrl[0]);\r\n result.push(guidResult ? guidResult : undefined);\r\n } else {\r\n result.push(undefined);\r\n }\r\n }\r\n }\r\n } else {\r\n const parsedResponse = parseData(JSON.parse(responseData, dateReviver), parseParams[requestNumber]);\r\n\r\n if (httpStatus >= 400) {\r\n const responseHeaders = parseBatchHeaders(\r\n //todo: add error handler for httpStatusReg; remove \"!\" operator\r\n batchResponse.substring(batchResponse.indexOf(httpStatusReg![0]) + httpStatusReg![0].length + 1, batchResponse.indexOf(\"{\"))\r\n );\r\n\r\n result.push(\r\n ErrorHelper.handleHttpError(parsedResponse, {\r\n status: httpStatus,\r\n statusText: httpStatusMessage,\r\n statusMessage: httpStatusMessage,\r\n headers: responseHeaders,\r\n })\r\n );\r\n } else {\r\n result.push(parsedResponse);\r\n }\r\n }\r\n }\r\n\r\n requestNumber++;\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction base64ToString(base64: string): string {\r\n return global.DWA_BROWSER ? global.window.atob(base64) : Buffer.from(base64, \"base64\").toString(\"binary\");\r\n}\r\n\r\nfunction parseFileResponse(response: any, responseHeaders: any, parseParams: any): Core.FileParseResult {\r\n let data = response;\r\n\r\n if (parseParams.hasOwnProperty(\"parse\")) {\r\n data = JSON.parse(data).value;\r\n data = base64ToString(data);\r\n }\r\n\r\n var parseResult: Core.FileParseResult = {\r\n value: data,\r\n };\r\n\r\n if (responseHeaders[\"x-ms-file-name\"]) parseResult.fileName = responseHeaders[\"x-ms-file-name\"];\r\n\r\n if (responseHeaders[\"x-ms-file-size\"]) parseResult.fileSize = parseInt(responseHeaders[\"x-ms-file-size\"]);\r\n\r\n if (hasHeader(responseHeaders, \"Location\")) parseResult.location = getHeader(responseHeaders, \"Location\");\r\n\r\n return parseResult;\r\n}\r\n\r\nfunction hasHeader(headers: any, name: string): boolean {\r\n return headers.hasOwnProperty(name) || headers.hasOwnProperty(name.toLowerCase());\r\n}\r\n\r\nfunction getHeader(headers: any, name: string): string {\r\n if (headers[name]) return headers[name];\r\n\r\n return headers[name.toLowerCase()];\r\n}\r\n\r\n/**\r\n *\r\n * @param {string} response - response that needs to be parsed\r\n * @param {Array} responseHeaders - response headers\r\n * @param {Array} parseParams - parameters for parsing the response\r\n * @returns {any} parsed response\r\n */\r\nexport function parseResponse(response: string, responseHeaders: any, parseParams: any[]): any {\r\n let parseResult: any = undefined;\r\n if (response.length) {\r\n if (response.indexOf(\"--batchresponse_\") > -1) {\r\n const batch = parseBatchResponse(response, parseParams);\r\n\r\n parseResult = parseParams.length === 1 && parseParams[0].convertedToBatch ? batch[0] : batch;\r\n } else {\r\n if (hasHeader(responseHeaders, \"Content-Disposition\")) {\r\n parseResult = parseFileResponse(response, responseHeaders, parseParams[0]);\r\n } else {\r\n const contentType = getHeader(responseHeaders, \"Content-Type\");\r\n if (contentType.startsWith(\"application/json\")) {\r\n parseResult = parseData(JSON.parse(response, dateReviver), parseParams[0]);\r\n } else {\r\n parseResult = isNaN(Number(response)) ? response : Number(response);\r\n }\r\n }\r\n }\r\n } else {\r\n if (parseParams.length && parseParams[0].hasOwnProperty(\"valueIfEmpty\")) {\r\n parseResult = parseParams[0].valueIfEmpty;\r\n } else if (hasHeader(responseHeaders, \"OData-EntityId\")) {\r\n const entityUrl = getHeader(responseHeaders, \"OData-EntityId\");\r\n\r\n const guidResult = extractUuidFromUrl(entityUrl);\r\n\r\n if (guidResult) {\r\n parseResult = guidResult;\r\n }\r\n } else if (hasHeader(responseHeaders, \"Location\")) {\r\n parseResult = {\r\n location: getHeader(responseHeaders, \"Location\"),\r\n };\r\n\r\n if (responseHeaders[\"x-ms-chunk-size\"]) parseResult.chunkSize = parseInt(responseHeaders[\"x-ms-chunk-size\"]);\r\n }\r\n }\r\n\r\n return parseResult;\r\n}\r\n", "\uFEFFexport function parseResponseHeaders(headerStr: string): any {\r\n\tconst headers = {};\r\n\tif (!headerStr) {\r\n\t\treturn headers;\r\n\t}\r\n\tconst headerPairs = headerStr.split(\"\\u000d\\u000a\");\r\n\tfor (let i = 0, ilen = headerPairs.length; i < ilen; i++) {\r\n\t\tconst headerPair = headerPairs[i];\r\n\t\tconst index = headerPair.indexOf(\"\\u003a\\u0020\");\r\n\t\tif (index > 0) {\r\n\t\t\theaders[headerPair.substring(0, index)] = headerPair.substring(index + 2);\r\n\t\t}\r\n\t}\r\n\treturn headers;\r\n}\r\n", "\uFEFFimport { Core } from \"../types\";\r\nimport { ErrorHelper } from \"./../helpers/ErrorHelper\";\r\nimport { parseResponse } from \"./helpers/parseResponse\";\r\nimport { parseResponseHeaders } from \"./helpers/parseResponseHeaders\";\r\n\r\nexport function executeRequest(options: Core.RequestOptions): Promise {\r\n return new Promise((resolve, reject) => {\r\n _executeRequest(options, resolve, reject);\r\n });\r\n}\r\n\r\nfunction _executeRequest(\r\n options: Core.RequestOptions,\r\n successCallback: (response: Core.WebApiResponse) => void,\r\n errorCallback: (error: Core.WebApiErrorResponse | Core.WebApiErrorResponse[]) => void\r\n) {\r\n const data = options.data;\r\n const additionalHeaders = options.additionalHeaders;\r\n const responseParams = options.responseParams;\r\n const signal = options.abortSignal;\r\n\r\n if (signal?.aborted) {\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n name: \"AbortError\",\r\n code: 20,\r\n message: \"The user aborted a request.\",\r\n })\r\n );\r\n\r\n return;\r\n }\r\n\r\n let request = new XMLHttpRequest();\r\n request.open(options.method, options.uri, options.isAsync || false);\r\n\r\n //set additional headers\r\n for (let key in additionalHeaders) {\r\n request.setRequestHeader(key, additionalHeaders[key]);\r\n }\r\n\r\n request.onreadystatechange = function () {\r\n if (request.readyState === 4) {\r\n if (signal) signal.removeEventListener(\"abort\", abort);\r\n\r\n switch (request.status) {\r\n case 200: // Success with content returned in response body.\r\n case 201: // Success with content returned in response body.\r\n case 204: // Success with no content returned in response body.\r\n case 206: // Success with partial content.\r\n case 304: {\r\n // Success with Not Modified\r\n const responseHeaders = parseResponseHeaders(request.getAllResponseHeaders());\r\n const responseData = parseResponse(request.responseText, responseHeaders, responseParams[options.requestId]);\r\n\r\n const response = {\r\n data: responseData,\r\n headers: responseHeaders,\r\n status: request.status,\r\n };\r\n\r\n request = null as any;\r\n\r\n successCallback(response);\r\n break;\r\n }\r\n case 0:\r\n break; //response will be handled by onerror\r\n default:\r\n if (!request) break; //response was handled somewhere else\r\n\r\n // All other statuses are error cases.\r\n let error;\r\n let headers;\r\n try {\r\n headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n const errorParsed = parseResponse(request.responseText, headers, responseParams[options.requestId]);\r\n\r\n if (Array.isArray(errorParsed)) {\r\n errorCallback(errorParsed);\r\n break;\r\n }\r\n\r\n error = errorParsed.error;\r\n } catch (e) {\r\n if (request.response.length > 0) {\r\n error = { message: request.response };\r\n } else {\r\n error = { message: \"Unexpected Error\" };\r\n }\r\n }\r\n\r\n const errorParameters = {\r\n status: request.status,\r\n statusText: request.statusText,\r\n headers: headers,\r\n };\r\n\r\n request = null as any;\r\n\r\n errorCallback(ErrorHelper.handleHttpError(error, errorParameters));\r\n\r\n break;\r\n }\r\n }\r\n };\r\n\r\n if (options.timeout) {\r\n request.timeout = options.timeout;\r\n }\r\n\r\n request.onerror = function () {\r\n const headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n status: request.status,\r\n statusText: request.statusText,\r\n message: request.responseText || \"Network Error\",\r\n headers: headers,\r\n })\r\n );\r\n request = null as any;\r\n };\r\n\r\n request.ontimeout = function () {\r\n const headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n name: \"TimeoutError\",\r\n status: request.status,\r\n statusText: request.statusText,\r\n message: request.responseText || \"Request Timed Out\",\r\n headers: headers,\r\n })\r\n );\r\n request = null as any;\r\n };\r\n\r\n //browser abort\r\n request.onabort = function () {\r\n if (!request) return;\r\n\r\n const headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n status: request.status,\r\n statusText: request.statusText,\r\n message: \"Request aborted\",\r\n headers: headers,\r\n })\r\n );\r\n request = null as any;\r\n };\r\n\r\n //manual abort/cancellation\r\n const abort = () => {\r\n if (!request) return;\r\n\r\n const headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n name: \"AbortError\",\r\n code: 20,\r\n status: request.status,\r\n statusText: request.statusText,\r\n message: \"The user aborted a request.\",\r\n headers: headers,\r\n })\r\n );\r\n\r\n request.abort();\r\n\r\n request = null as any;\r\n };\r\n\r\n if (signal) {\r\n signal.addEventListener(\"abort\", abort);\r\n }\r\n\r\n data ? request.send(data) : request.send();\r\n\r\n //called for testing\r\n if (XhrWrapper.afterSendEvent) XhrWrapper.afterSendEvent();\r\n}\r\n\r\n/**\r\n * Sends a request to given URL with given parameters\r\n */\r\nexport class XhrWrapper {\r\n //for testing\r\n static afterSendEvent: () => void;\r\n}\r\n", "\uFEFFimport { ConfigurationUtility } from \"./utils/Config\";\r\nimport { Utility } from \"./utils/Utility\";\r\nimport { ErrorHelper } from \"./helpers/ErrorHelper\";\r\nimport { RequestClient } from \"./client/RequestClient\";\r\nimport type { Core } from \"./types\";\r\n\r\n/**\r\n * Microsoft Dynamics CRM Web API helper library written in JavaScript.\r\n * It is compatible with: Dynamics 365 (online), Dynamics 365 (on-premise), Dynamics CRM 2016, Dynamics CRM Online.\r\n */\r\nexport class DynamicsWebApi {\r\n private _config = ConfigurationUtility.default();\r\n private _isBatch = false;\r\n private _batchRequestId: string | null = null;\r\n\r\n /**\r\n * Initializes a new instance of DynamicsWebApi\r\n * @param config - Configuration object\r\n */\r\n constructor(config?: Config) {\r\n ConfigurationUtility.merge(this._config, config);\r\n }\r\n\r\n /**\r\n\t * Merges provided configuration properties with an existing one.\r\n\t *\r\n\t * @param {DynamicsWebApi.Config} config - Configuration\r\n\t * @example\r\n\t dynamicsWebApi.setConfig({ serverUrl: 'https://contoso.api.crm.dynamics.com/' });\r\n\t */\r\n setConfig = (config: Config) => ConfigurationUtility.merge(this._config, config);\r\n\r\n private _makeRequest = async (request: Core.InternalRequest): Promise => {\r\n request.isBatch = this._isBatch;\r\n if (this._batchRequestId) request.requestId = this._batchRequestId;\r\n return RequestClient.makeRequest(request, this._config);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a new record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n * @example\r\n *const lead = {\r\n * subject: \"Test WebAPI\",\r\n * firstname: \"Test\",\r\n * lastname: \"WebAPI\",\r\n * jobtitle: \"Title\"\r\n *};\r\n *\r\n *const request = {\r\n * data: lead,\r\n * collection: \"leads\",\r\n * returnRepresentation: true\r\n *}\r\n *\r\n *const response = await dynamicsWebApi.create(request);\r\n *\r\n */\r\n create = async (request: CreateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.create\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"create\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"POST\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n * @example\r\n *const request = {\r\n * key: '7d577253-3ef0-4a0a-bb7f-8335c2596e70',\r\n * collection: \"leads\",\r\n * select: [\"fullname\", \"subject\"],\r\n * ifnonematch: 'W/\"468026\"',\r\n * includeAnnotations: \"OData.Community.Display.V1.FormattedValue\"\r\n *};\r\n *\r\n *const response = await dynamicsWebApi.retrieve(request);\r\n */\r\n retrieve = async (request: RetrieveRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieve\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"retrieve\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"GET\";\r\n internalRequest.responseParameters = {\r\n isRef: internalRequest.select?.length === 1 && internalRequest.select[0].endsWith(\"/$ref\"),\r\n };\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n update = async (request: UpdateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.update\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"update\";\r\n } else internalRequest = request;\r\n\r\n //Metadata definitions, cannot be updated using \"PATCH\" method\r\n if (!internalRequest.method)\r\n internalRequest.method = /EntityDefinitions|RelationshipDefinitions|GlobalOptionSetDefinitions/.test(internalRequest.collection || \"\")\r\n ? \"PUT\"\r\n : \"PATCH\";\r\n\r\n internalRequest.responseParameters = { valueIfEmpty: true };\r\n\r\n if (internalRequest.ifmatch == null) {\r\n internalRequest.ifmatch = \"*\"; //to prevent upsert\r\n }\r\n\r\n //copy locally\r\n const ifmatch = internalRequest.ifmatch;\r\n\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifmatch && error.status === 412) {\r\n //precondition failed - not updated\r\n return false; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a single value in the record.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateSingleProperty = async (request: UpdateSinglePropertyRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateSingleProperty\", \"request\");\r\n ErrorHelper.parameterCheck(request.fieldValuePair, \"DynamicsWebApi.updateSingleProperty\", \"request.fieldValuePair\");\r\n\r\n var field = Object.keys(request.fieldValuePair)[0];\r\n var fieldValue = request.fieldValuePair[field];\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.navigationProperty = field;\r\n internalRequest.data = { value: fieldValue };\r\n internalRequest.functionName = \"updateSingleProperty\";\r\n internalRequest.method = \"PUT\";\r\n\r\n delete internalRequest[\"fieldValuePair\"];\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a record.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteRecord = async (request: DeleteRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteRecord\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"deleteRecord\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.responseParameters = { valueIfEmpty: true };\r\n\r\n //copy locally\r\n const ifmatch = internalRequest.ifmatch;\r\n\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifmatch && error.status === 412) {\r\n //precondition failed - not updated\r\n return false; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to upsert a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n upsert = async (request: UpsertRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.upsert\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"PATCH\";\r\n internalRequest.functionName = \"upsert\";\r\n\r\n //copy locally\r\n const ifnonematch = internalRequest.ifnonematch;\r\n const ifmatch = internalRequest.ifmatch;\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifnonematch && error.status === 412) {\r\n //if prevent update\r\n return null; //todo: check this\r\n } else if (ifmatch && error.status === 404) {\r\n //if prevent create\r\n return null; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n private _uploadFileChunk = async (request: Core.InternalRequest, fileBytes: Uint8Array | Buffer, chunkSize: number, offset: number = 0): Promise => {\r\n // offset = offset || 0;\r\n Utility.setFileChunk(request, fileBytes, chunkSize, offset);\r\n\r\n await this._makeRequest(request);\r\n\r\n offset += chunkSize;\r\n if (offset <= fileBytes.length) {\r\n return this._uploadFileChunk(request, fileBytes, chunkSize, offset);\r\n }\r\n };\r\n\r\n /**\r\n * Upload file to a File Attribute\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n */\r\n uploadFile = async (request: UploadRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.uploadFile\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.uploadFile\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request, [\"data\"]);\r\n internalRequest.method = \"PATCH\";\r\n internalRequest.functionName = \"uploadFile\";\r\n internalRequest.transferMode = \"chunked\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n internalRequest.url = response?.data.location;\r\n delete internalRequest.transferMode;\r\n delete internalRequest.fieldName;\r\n delete internalRequest.fileName;\r\n return this._uploadFileChunk(internalRequest, request.data, response?.data.chunkSize);\r\n };\r\n\r\n private _downloadFileChunk = async (\r\n request: Core.InternalRequest,\r\n bytesDownloaded: number = 0,\r\n // fileSize: number = 0,\r\n data: string = \"\"\r\n ): Promise => {\r\n // bytesDownloaded = bytesDownloaded || 0;\r\n // fileSize = fileSize || 0;\r\n // data = data || \"\";\r\n\r\n request.range = \"bytes=\" + bytesDownloaded + \"-\" + (bytesDownloaded + Utility.downloadChunkSize - 1);\r\n request.downloadSize = \"full\";\r\n\r\n const response = await this._makeRequest(request);\r\n\r\n request.url = response?.data.location;\r\n data += response?.data.value;\r\n\r\n bytesDownloaded += Utility.downloadChunkSize;\r\n\r\n if (bytesDownloaded <= response?.data.fileSize) {\r\n return this._downloadFileChunk(request, bytesDownloaded, data);\r\n }\r\n\r\n return {\r\n fileName: response?.data.fileName,\r\n fileSize: response?.data.fileSize,\r\n data: Utility.convertToFileBuffer(data),\r\n };\r\n };\r\n\r\n /**\r\n * Download a file from a File Attribute\r\n * @param request - An object that represents all possible options for a current request.\r\n */\r\n downloadFile = (request: DownloadRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.downloadFile\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.downloadFile\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"downloadFile\";\r\n internalRequest.responseParameters = { parse: true };\r\n\r\n return this._downloadFileChunk(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve records.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @param {string} [nextPageLink] - Use the value of the @odata.nextLink property with a new GET request to return the next page of data. Pass null to retrieveMultipleOptions.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveMultiple = async (request: RetrieveMultipleRequest, nextPageLink?: string): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveMultiple\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"retrieveMultiple\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"GET\";\r\n\r\n if (nextPageLink) {\r\n ErrorHelper.stringParameterCheck(nextPageLink, \"DynamicsWebApi.retrieveMultiple\", \"nextPageLink\");\r\n internalRequest.url = nextPageLink;\r\n }\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n return response?.data;\r\n };\r\n\r\n private _retrieveAllRequest = async (request: RetrieveMultipleRequest, nextPageLink?: string, records: any[] = []): Promise> => {\r\n const response = await this.retrieveMultiple(request, nextPageLink);\r\n records = records.concat(response.value);\r\n\r\n const pageLink = response.oDataNextLink;\r\n\r\n if (pageLink) {\r\n return this._retrieveAllRequest(request, pageLink, records);\r\n }\r\n\r\n const result: AllResponse = { value: records };\r\n\r\n if (response.oDataDeltaLink) {\r\n result[\"@odata.deltaLink\"] = response.oDataDeltaLink;\r\n result.oDataDeltaLink = response.oDataDeltaLink;\r\n }\r\n\r\n return result;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve all records.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAll = (request: RetrieveMultipleRequest): Promise> => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.retrieveAll\", this._isBatch);\r\n return this._retrieveAllRequest(request);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to count records. IMPORTANT! The count value does not represent the total number of entities in the system. It is limited by the maximum number of entities that can be returned. Returns: Number\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n count = async (request: CountRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.count\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"count\";\r\n\r\n if (internalRequest.filter?.length) {\r\n internalRequest.count = true;\r\n } else {\r\n internalRequest.navigationProperty = \"$count\";\r\n }\r\n\r\n internalRequest.responseParameters = { toCount: internalRequest.count };\r\n\r\n //if filter has not been specified then simplify the request\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to count records. Returns: Number\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n countAll = async (request: CountAllRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.countAll\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.countAll\", \"request\");\r\n\r\n const response = await this._retrieveAllRequest(request);\r\n\r\n return response ? (response.value ? response.value.length : 0) : 0;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to execute FetchXml to retrieve records. Returns: DWA.Types.FetchXmlResponse\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n fetch = async (request: FetchXmlRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.fetch\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"fetch\";\r\n\r\n ErrorHelper.stringParameterCheck(internalRequest.fetchXml, \"DynamicsWebApi.fetch\", \"request.fetchXml\");\r\n\r\n //only add paging if there is no top\r\n if (internalRequest.fetchXml && !/^(request: FetchAllRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.fetchAll\", \"request\");\r\n\r\n const _executeFetchXmlAll = async (request: FetchXmlRequest, records: any[] = []): Promise> => {\r\n // records = records || [];\r\n\r\n const response = await this.fetch(request);\r\n\r\n records = records.concat(response.value);\r\n\r\n if (response.PagingInfo) {\r\n request.pageNumber = response.PagingInfo.nextPage;\r\n request.pagingCookie = response.PagingInfo.cookie;\r\n\r\n return _executeFetchXmlAll(request, records);\r\n }\r\n\r\n return { value: records };\r\n };\r\n\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.fetchAll\", this._isBatch);\r\n return _executeFetchXmlAll(request);\r\n };\r\n\r\n /**\r\n * Associate for a collection-valued navigation property. (1:N or N:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n associate = async (request: AssociateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.associate\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"associate\";\r\n\r\n ErrorHelper.stringParameterCheck(request.relatedCollection, \"DynamicsWebApi.associate\", \"request.relatedcollection\");\r\n ErrorHelper.stringParameterCheck(request.relationshipName, \"DynamicsWebApi.associate\", \"request.relationshipName\");\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.associate\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.associate\", \"request.relatedKey\");\r\n\r\n internalRequest.navigationProperty = request.relationshipName + \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n internalRequest.data = { \"@odata.id\": `${request.relatedCollection}(${relatedKey})` };\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Disassociate for a collection-valued navigation property.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n disassociate = async (request: DisassociateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.disassociate\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.functionName = \"disassociate\";\r\n\r\n ErrorHelper.stringParameterCheck(request.relationshipName, \"DynamicsWebApi.disassociate\", \"request.relationshipName\");\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.disassociate\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.disassociate\", \"request.relatedId\");\r\n\r\n internalRequest.key = primaryKey;\r\n internalRequest.navigationProperty = `${request.relationshipName}(${relatedKey})/$ref`;\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Associate for a single-valued navigation property. (1:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n associateSingleValued = async (request: AssociateSingleValuedRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.associateSingleValued\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"PUT\";\r\n internalRequest.functionName = \"associateSingleValued\";\r\n\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.associateSingleValued\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.associateSingleValued\", \"request.relatedKey\");\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, \"DynamicsWebApi.associateSingleValued\", \"request.navigationProperty\");\r\n ErrorHelper.stringParameterCheck(request.relatedCollection, \"DynamicsWebApi.associateSingleValued\", \"request.relatedcollection\");\r\n\r\n internalRequest.navigationProperty += \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n internalRequest.data = { \"@odata.id\": `${request.relatedCollection}(${relatedKey})` };\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Removes a reference to an entity for a single-valued navigation property. (1:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n disassociateSingleValued = async (request: DisassociateSingleValuedRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.disassociateSingleValued\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.functionName = \"disassociateSingleValued\";\r\n\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.disassociateSingleValued\", \"request.primaryKey\");\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, \"DynamicsWebApi.disassociateSingleValued\", \"request.navigationProperty\");\r\n\r\n internalRequest.navigationProperty += \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Calls a Web API function\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n callFunction: CallFunction = async (request: string | BoundFunctionRequest | UnboundFunctionRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.callFunction`, \"request\");\r\n\r\n const getFunctionName = (request: BoundFunctionRequest | UnboundFunctionRequest) => request.name || request.functionName;\r\n\r\n const isObject = typeof request !== \"string\";\r\n const functionName = isObject ? getFunctionName(request) : request;\r\n const parameterName = isObject ? \"request.name\" : \"name\";\r\n const internalRequest: Core.InternalRequest = isObject ? Utility.copyObject(request, [\"name\"]) : { functionName: functionName };\r\n\r\n ErrorHelper.stringParameterCheck(functionName, `DynamicsWebApi.callFunction`, parameterName);\r\n\r\n const functionParameters = Utility.buildFunctionParameters(internalRequest.parameters);\r\n\r\n internalRequest.method = \"GET\";\r\n internalRequest._additionalUrl = functionName + functionParameters.key;\r\n internalRequest.queryParams = functionParameters.queryParams;\r\n internalRequest._isUnboundRequest = !internalRequest.collection;\r\n internalRequest.functionName = \"callFunction\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Calls a Web API action\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n callAction: CallAction = async (\r\n request: BoundActionRequest | UnboundActionRequest\r\n ): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.callAction`, \"request\");\r\n ErrorHelper.stringParameterCheck(request.actionName, `DynamicsWebApi.callAction`, \"request.actionName\");\r\n\r\n const internalRequest = Utility.copyRequest(request, [\"action\"]);\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"callAction\";\r\n\r\n internalRequest._additionalUrl = request.actionName;\r\n internalRequest._isUnboundRequest = !internalRequest.collection;\r\n internalRequest.data = request.action;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n /**\r\n * Sends an asynchronous request to create an entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createEntity = (request: CreateEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.createEntity`, \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createEntity\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"createEntity\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update an entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateEntity = (request: UpdateEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateEntity\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateEntity\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateEntity\", \"request.data.MetadataId\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.key = internalRequest.data.MetadataId;\r\n internalRequest.functionName = \"updateEntity\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveEntity = (request: RetrieveEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveEntity\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.retrieveEntity\", \"request.key\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntity\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve entity definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveEntities = (request?: RetrieveEntitiesRequest): Promise> => {\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntities\";\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create an attribute.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createAttribute = (request: CreateAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createAttribute\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createAttribute\", \"request.data\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.createAttribute\", \"request.entityKey\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntity\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.key = request.entityKey;\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update an attribute.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateAttribute = (request: UpdateAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateAttribute\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateAttribute\", \"request.data\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.updateAttribute\", \"request.entityKey\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateAttribute\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateAttribute\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.navigationPropertyKey = request.data.MetadataId;\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"updateAttribute\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve attribute metadata for a specified entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAttributes = (request: RetrieveAttributesRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveAttributes\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.retrieveAttributes\", \"request.entityKey\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveAttributes\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"retrieveAttributes\";\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific attribute metadata for a specified entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAttribute = (request: RetrieveAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveAttributes\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.retrieveAttribute\", \"request.entityKey\");\r\n ErrorHelper.keyParameterCheck(request.attributeKey, \"DynamicsWebApi.retrieveAttribute\", \"request.attributeKey\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveAttribute\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.navigationPropertyKey = request.attributeKey;\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"retrieveAttribute\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createRelationship = (request: CreateRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createRelationship\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createRelationship\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"createRelationship\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateRelationship = (request: UpdateRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateRelationship\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateRelationship\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateRelationship\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateRelationship\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.key = request.data.MetadataId;\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"updateRelationship\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteRelationship = (request: DeleteRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteRelationship\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.deleteRelationship\", \"request.key\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"deleteRelationship\";\r\n\r\n return this.deleteRecord(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve relationship definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveRelationships = (request?: RetrieveRelationshipsRequest): Promise> => {\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"retrieveRelationships\";\r\n\r\n if (request) {\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveRelationships\", \"request.castType\");\r\n internalRequest.navigationProperty = request.castType;\r\n }\r\n }\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveRelationship = (request: RetrieveRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveRelationship\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.retrieveRelationship\", \"request.key\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveRelationship\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"retrieveRelationship\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a Global Option Set definition\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createGlobalOptionSet = (request: CreateGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createGlobalOptionSet\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createGlobalOptionSet\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"createGlobalOptionSet\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a Global Option Set.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateGlobalOptionSet = (request: UpdateGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateGlobalOptionSet\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.key = request.data.MetadataId;\r\n internalRequest.functionName = \"updateGlobalOptionSet\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a Global Option Set.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteGlobalOptionSet = (request: DeleteGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteGlobalOptionSet\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"deleteGlobalOptionSet\";\r\n\r\n return this.deleteRecord(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve Global Option Set definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveGlobalOptionSet = (request: RetrieveGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveGlobalOptionSet\", \"request\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveGlobalOptionSet\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"retrieveGlobalOptionSet\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve Global Option Set definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveGlobalOptionSets = (request?: RetrieveGlobalOptionSetsRequest): Promise> => {\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"retrieveGlobalOptionSets\";\r\n\r\n if (request?.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveGlobalOptionSets\", \"request.castType\");\r\n internalRequest.navigationProperty = request.castType;\r\n }\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Retrieves a CSDL Document Metadata\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} A raw CSDL $metadata document.\r\n */\r\n retrieveCsdlMetadata = async (request?: CsdlMetadataRequest): Promise => {\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"$metadata\";\r\n internalRequest.functionName = \"retrieveCsdlMetadata\";\r\n\r\n if (request?.addAnnotations) {\r\n ErrorHelper.boolParameterCheck(request.addAnnotations, \"DynamicsWebApi.retrieveCsdlMetadata\", \"request.addAnnotations\");\r\n internalRequest.includeAnnotations = \"*\";\r\n }\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides a search results page.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Search result\r\n */\r\n search: SearchFunction = async (request: string | SearchRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.search\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: Core.InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.search\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.search\", parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.search\", parameterName, 100);\r\n\r\n internalRequest.collection = \"query\";\r\n internalRequest.functionName = \"search\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Suggestions result\r\n */\r\n suggest: SuggestFunction = async (request: string | SuggestRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.suggest\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: Core.InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.suggest\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.suggest\", parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.suggest\", parameterName, 100);\r\n\r\n internalRequest.functionName = internalRequest.collection = \"suggest\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n autocomplete: AutocompleteFunction = async (request: string | AutocompleteRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.autocomplete\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: Core.InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n if (isObject) ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.autocomplete\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, `DynamicsWebApi.autocomplete`, parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.autocomplete\", parameterName, 100);\r\n\r\n internalRequest.functionName = internalRequest.collection = \"autocomplete\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Starts/executes a batch request.\r\n */\r\n startBatch = (): void => {\r\n this._isBatch = true;\r\n this._batchRequestId = Utility.generateUUID();\r\n };\r\n\r\n /**\r\n * Executes a batch request. Please call DynamicsWebApi.startBatch() first to start a batch request.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n executeBatch = async (request?: BatchRequest): Promise => {\r\n ErrorHelper.throwBatchNotStarted(this._isBatch);\r\n\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"$batch\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"executeBatch\";\r\n internalRequest.requestId = this._batchRequestId;\r\n\r\n this._batchRequestId = null;\r\n this._isBatch = false;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Creates a new instance of DynamicsWebApi. If config is not provided, it is copied from a current instance.\r\n *\r\n * @param {Config} config configuration object.\r\n * @returns {DynamicsWebApi} A new instance of DynamicsWebApi\r\n */\r\n initializeInstance = (config?: Config): DynamicsWebApi => new DynamicsWebApi(config || this._config);\r\n\r\n Utility = {\r\n /**\r\n * Searches for a collection name by provided entity name in a cached entity metadata.\r\n * The returned collection name can be null.\r\n *\r\n * @param {string} entityName entity name\r\n * @returns {string | null} collection name\r\n */\r\n getCollectionName: (entityName: string): string | null => RequestClient.getCollectionName(entityName),\r\n };\r\n}\r\n\r\nexport interface Expand {\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**Limit the number of results returned by using the $top system query option.Do not use $top with $count! */\r\n top?: number;\r\n /**An Array(of Strings) representing the order in which items are returned using the $orderby system query option.Use the asc or desc suffix to specify ascending or descending order respectively.The default is ascending if the suffix isn't applied. */\r\n orderBy?: string[];\r\n /**A name of a single-valued navigation property which needs to be expanded. */\r\n property?: string;\r\n /**An Array of Expand Objects representing the $expand Query Option value to control which related records need to be returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface BaseRequest {\r\n /**XHR requests only! Indicates whether the requests should be made synchronously or asynchronously.Default value is 'true'(asynchronously). */\r\n async?: boolean;\r\n /**Impersonates a user based on their systemuserid by adding \"MSCRMCallerID\" header. A String representing the GUID value for the Dynamics 365 systemuserid. */\r\n impersonate?: string;\r\n /**Impersonates a user based on their Azure Active Directory (AAD) object id by passing that value along with the header \"CallerObjectId\". A String should represent a GUID value. */\r\n impersonateAAD?: string;\r\n /**If set to 'true', DynamicsWebApi adds a request header 'Cache-Control: no-cache'.Default value is 'false'. */\r\n noCache?: boolean;\r\n /** Authorization Token. If set, onTokenRefresh will not be called. */\r\n token?: string;\r\n /**Sets a number of milliseconds before a request times out. */\r\n timeout?: number;\r\n /**The AbortSignal interface represents a signal object that allows you to communicate with a DOM request and abort it if required via an AbortController object. */\r\n signal?: AbortSignal;\r\n /**Indicates if an operation must be included in a Change Set or not. Works in Batch Operations only. By default, it's \"true\", except for GET operations - they are not allowed in Change Sets. */\r\n inChangeSet?: boolean;\r\n /**Headers to supply with a request. These headers will override configuraiton headers if the identical ones were set. */\r\n headers?: HeaderCollection;\r\n /**Custom query parameters. Can be used to set parameter aliases for \"$filter\" and \"$orderBy\". Important! These parameters ARE NOT URI encoded! */\r\n queryParams?: string[];\r\n}\r\n\r\nexport interface BatchRequest extends BaseRequest {\r\n /** Sets Prefer header to \"odata.continue-on-error\" that allows more requests be processed when errors occur. The batch request will return '200 OK' and individual response errors will be returned in the batch response body. */\r\n continueOnError?: boolean;\r\n}\r\n\r\nexport interface Request extends BaseRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection?: string;\r\n}\r\n\r\nexport interface CRUDRequest extends Request {\r\n /**A String representing collection record's Primary Key (GUID) or Alternate Key(s). */\r\n key?: string;\r\n}\r\n\r\nexport interface CountRequest extends Request {\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n}\r\n\r\nexport interface CountAllRequest extends CountRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**An Array (of strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n}\r\n\r\nexport interface FetchAllRequest extends Request {\r\n /**Sets FetchXML - a proprietary query language that provides capabilities to perform aggregation. */\r\n fetchXml: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation. Annotations provide additional information about lookups, options sets and other complex attribute types. For example: * or Microsoft.Dynamics.CRM.fetchxmlpagingcookie */\r\n includeAnnotations?: string;\r\n}\r\n\r\nexport interface FetchXmlRequest extends FetchAllRequest {\r\n /**Page number. */\r\n pageNumber?: number;\r\n /**Paging cookie. To retrive the first page, pagingCookie must be null. */\r\n pagingCookie?: string;\r\n}\r\n\r\nexport interface CreateRequest extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Web API v9+ only! Boolean that enables duplicate detection. */\r\n duplicateDetection?: boolean;\r\n /**A JavaScript object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data?: T;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface UpdateRequestBase extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Web API v9+ only! Boolean that enables duplicate detection. */\r\n duplicateDetection?: boolean;\r\n /**A JavaScript object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data?: T;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**Casts the AttributeMetadata to a specific type. (Used in requests to Attribute Metadata). */\r\n metadataAttributeType?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface UpdateRequest extends UpdateRequestBase {\r\n /**If set to 'true', DynamicsWebApi adds a request header 'MSCRM.MergeLabels: true'. Default value is 'false' */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface UpdateSinglePropertyRequest extends CRUDRequest {\r\n /**Object with a logical name of the field as a key and a value to update with. Example: {subject: \"Update Record\"} */\r\n fieldValuePair: { [key: string]: any };\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n}\r\n\r\nexport interface UpsertRequest extends UpdateRequestBase {\r\n /**Sets If-None-Match header value that enables to use conditional retrieval in applicable requests. */\r\n ifnonematch?: string;\r\n}\r\n\r\nexport interface DeleteRequest extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**Field name that needs to be cleared (for example File Field) */\r\n fieldName?: string;\r\n}\r\n\r\nexport interface RetrieveRequest extends CRUDRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets If-None-Match header value that enables to use conditional retrieval in applicable requests. */\r\n ifnonematch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Casts the AttributeMetadata to a specific type. (Used in requests to Attribute Metadata). */\r\n metadataAttributeType?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**A String representing the GUID value of the saved query. */\r\n savedQuery?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**A String representing the GUID value of the user query. */\r\n userQuery?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface RetrieveMultipleRequest extends Request {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**Use the $apply to aggregate and group your data dynamically */\r\n apply?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Boolean that sets the $count system query option with a value of true to include a count of entities that match the filter criteria up to 5000(per page).Do not use $top with $count! */\r\n count?: boolean;\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets the odata.maxpagesize preference value to request the number of entities returned in the response. */\r\n maxPageSize?: number;\r\n /**An Array(of string) representing the order in which items are returned using the $orderby system query option.Use the asc or desc suffix to specify ascending or descending order respectively.The default is ascending if the suffix isn't applied. */\r\n orderBy?: string[];\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Limit the number of results returned by using the $top system query option.Do not use $top with $count! */\r\n top?: number;\r\n /**Sets Prefer header with value 'odata.track-changes' to request that a delta link be returned which can subsequently be used to retrieve entity changes. */\r\n trackChanges?: boolean;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface AssociateRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Relationship name. */\r\n relationshipName: string;\r\n /**Related name of the Entity Collection or Entity Logical name. */\r\n relatedCollection: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface AssociateSingleValuedRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Navigation property name. */\r\n navigationProperty: string;\r\n /**Related name of the Entity Collection or Entity Logical name. */\r\n relatedCollection: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface DisassociateRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Relationship name. */\r\n relationshipName: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface DisassociateSingleValuedRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Navigation property name. */\r\n navigationProperty: string;\r\n}\r\n\r\nexport interface UnboundFunctionRequest extends BaseRequest {\r\n /**\r\n * Name of the function.\r\n */\r\n name?: string;\r\n /**\r\n * Name of the function. \r\n * @deprecated Use \"name\" parameter.\r\n */\r\n functionName?: string;\r\n /**Function's input parameters. Example: { param1: \"test\", param2: 3 }. */\r\n parameters?: any;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n}\r\n\r\nexport interface BoundFunctionRequest extends UnboundFunctionRequest, Request {\r\n /**A String representing the GUID value for the record. */\r\n key?: string;\r\n}\r\n\r\nexport interface UnboundActionRequest extends BaseRequest {\r\n /**A name of the Web API action. */\r\n actionName: string;\r\n /**An object that represents a Dynamics 365 action. */\r\n action?: TAction;\r\n}\r\n\r\nexport interface BoundActionRequest extends UnboundActionRequest, Request {\r\n /**A String representing the GUID value for the record. */\r\n key?: string;\r\n}\r\n\r\nexport interface CreateEntityRequest extends BaseRequest {\r\n /**An object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateEntityRequest extends CRUDRequest {\r\n /**An object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data: any;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface RetrieveEntityRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveEntitiesRequest extends BaseRequest {\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateAttributeRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Attribute metadata object. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateAttributeRequest extends CreateAttributeRequest {\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface RetrieveAttributesRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveAttributeRequest extends BaseRequest {\r\n /**An Attribute MetadataId or Alternate Key (such as LogicalName). */\r\n attributeKey: string;\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateRelationshipRequest extends BaseRequest {\r\n /**Relationship Definition. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateRelationshipRequest extends CreateRelationshipRequest {\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface DeleteRelationshipRequest extends BaseRequest {\r\n /**A Relationship MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n}\r\n\r\nexport interface RetrieveRelationshipsRequest extends BaseRequest {\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveRelationshipRequest extends BaseRequest {\r\n /**A Relationship MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateGlobalOptionSetRequest extends BaseRequest {\r\n /**Global Option Set Definition. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateGlobalOptionSetRequest extends CreateRelationshipRequest {\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface DeleteGlobalOptionSetRequest extends BaseRequest {\r\n /**A Global Option Set MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n}\r\n\r\nexport interface RetrieveGlobalOptionSetsRequest extends BaseRequest {\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveGlobalOptionSetRequest extends BaseRequest {\r\n /**A Global Option Set MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface UploadRequest extends CRUDRequest {\r\n /**Binary Buffer*/\r\n data: Uint8Array | Buffer;\r\n /**Name of the file */\r\n fileName: string;\r\n /**File Field Name */\r\n fieldName: string;\r\n}\r\n\r\nexport interface DownloadRequest extends CRUDRequest {\r\n /**File Field Name */\r\n fieldName: string;\r\n}\r\n\r\nexport interface CsdlMetadataRequest extends BaseRequest {\r\n /**If set to \"true\" the document will include many different kinds of annotations that can be useful. Most annotations are not included by default because they increase the total size of the document. */\r\n addAnnotations?: boolean;\r\n}\r\n\r\nexport type SearchMode = \"any\" | \"all\";\r\nexport type SearchType = \"simple\" | \"full\";\r\n\r\nexport interface SearchQueryBase {\r\n /**The search parameter value contains the term to be searched for and has a 100-character limit. For suggestions, min 3 characters in addition. */\r\n search: string;\r\n /**The default table list searches across all Dataverse search\u2013configured tables and columns. The default list is configured by your administrator when Dataverse search is enabled. */\r\n entities?: string[];\r\n /**Filters are applied while searching data and are specified in standard OData syntax. */\r\n filter?: string;\r\n}\r\n\r\nexport interface Search extends SearchQueryBase {\r\n /**Facets support the ability to drill down into data results after they've been retrieved. */\r\n facets?: string[];\r\n /**Specify true to return the total record count; otherwise false. The default is false. */\r\n returnTotalRecordCount?: boolean;\r\n /**Specifies the number of search results to skip. */\r\n skip?: number;\r\n /**Specifies the number of search results to retrieve. The default is 50, and the maximum value is 100. */\r\n top?: number;\r\n /**A list of comma-separated clauses where each clause consists of a column name followed by 'asc' (ascending, which is the default) or 'desc' (descending). This list specifies how to order the results in order of precedence. */\r\n orderBy?: string[];\r\n /**Specifies whether any or all the search terms must be matched to count the document as a match. The default is 'any'. */\r\n searchMode?: SearchMode;\r\n /**The search type specifies the syntax of a search query. Using 'simple' selects simple query syntax and 'full' selects Lucene query syntax. The default is 'simple'. */\r\n searchType?: SearchType;\r\n}\r\n\r\nexport interface Suggest extends SearchQueryBase {\r\n /**Use fuzzy search to aid with misspellings. The default is false. */\r\n useFuzzy?: boolean;\r\n /**Number of suggestions to retrieve. The default is 5. */\r\n top?: number;\r\n /**A list of comma-separated clauses where each clause consists of a column name followed by 'asc' (ascending, which is the default) or 'desc' (descending). This list specifies how to order the results in order of precedence. */\r\n orderBy?: string[];\r\n}\r\n\r\nexport interface Autocomplete extends SearchQueryBase {\r\n /**Use fuzzy search to aid with misspellings. The default is false. */\r\n useFuzzy?: boolean;\r\n}\r\n\r\nexport interface SearchRequest extends BaseRequest {\r\n /**Search query object */\r\n query: Search;\r\n}\r\n\r\nexport interface SuggestRequest extends BaseRequest {\r\n /**Suggestion query object */\r\n query: Suggest;\r\n}\r\n\r\nexport interface AutocompleteRequest extends BaseRequest {\r\n /**Autocomplete query object */\r\n query: Autocomplete;\r\n}\r\n\r\nexport interface ApiConfig {\r\n /** API Version to use, for example: \"9.2\" or \"1.0\" */\r\n version?: string;\r\n /** API Path, for example: \"data\" or \"search\" */\r\n path?: string;\r\n}\r\n\r\nexport interface AccessToken {\r\n /** Access Token */\r\n accessToken: string;\r\n}\r\n\r\nexport interface Config {\r\n /**The url to Dataverse API server, for example: https://contoso.api.crm.dynamics.com/. It is required when used in Node.js application. */\r\n serverUrl?: string | null;\r\n /**Impersonates a user based on their systemuserid by adding \"MSCRMCallerID\" header. A String representing the GUID value for the Dynamics 365 systemuserid. */\r\n impersonate?: string | null;\r\n /**Impersonates a user based on their Azure Active Directory (AAD) object id by passing that value along with the header \"CallerObjectId\". A String should represent a GUID value. */\r\n impersonateAAD?: string | null;\r\n /**A function that is called when a security token needs to be refreshed. */\r\n onTokenRefresh?: (() => Promise) | null;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types.*/\r\n includeAnnotations?: string | null;\r\n /**Sets the odata.maxpagesize preference value to request the number of entities returned in the response. */\r\n maxPageSize?: number | null;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request.*/\r\n returnRepresentation?: boolean | null;\r\n /**Indicates whether to use Entity Logical Names instead of Collection Logical Names.*/\r\n useEntityNames?: boolean | null;\r\n /**Sets a number of milliseconds before a request times out. */\r\n timeout?: number | null;\r\n /**Proxy configuration object. */\r\n proxy?: ProxyConfig | null;\r\n /**Configuration object for Dataverse Web API (with path \"data\"). */\r\n dataApi?: ApiConfig;\r\n /**Configuration object for Dataverse Search API (with path \"search\"). */\r\n searchApi?: ApiConfig;\r\n /**Default headers to supply with each request. */\r\n headers?: HeaderCollection;\r\n}\r\n\r\n/**Header collection type */\r\nexport type HeaderCollection = {\r\n /**key-value */\r\n [key: string]: string;\r\n};\r\n\r\nexport interface ProxyConfig {\r\n /**Proxy server url */\r\n url: string;\r\n /**Basic authentication credentials */\r\n auth?: {\r\n /**Username */\r\n username: string;\r\n /**Password */\r\n password: string;\r\n };\r\n}\r\n\r\n/** Callback with an acquired token called by DynamicsWebApi; \"token\" argument can be a string or an object with a property {accessToken: } */\r\n// export interface OnTokenAcquiredCallback {\r\n// (token: any): void;\r\n// }\r\n\r\nexport interface RequestError extends Error {\r\n /**The name of the error */\r\n name: string;\r\n /**This code is not related to the http status code and is frequently empty */\r\n code?: string;\r\n /**A message describing the error */\r\n message: string;\r\n /**HTTP status code */\r\n status?: number;\r\n /**HTTP status text. Frequently empty */\r\n statusText?: string;\r\n /**HTTP Response headers */\r\n headers?: any;\r\n /**Details about an error */\r\n innererror?: {\r\n /**A message describing the error, this is frequently the same as the outer message */\r\n message?: string;\r\n /**Microsoft.Crm.CrmHttpException */\r\n type?: string;\r\n /**Details from the server about where the error occurred */\r\n stacktrace?: string;\r\n };\r\n}\r\n\r\nexport interface MultipleResponse {\r\n /**Multiple respone entities */\r\n value: T[];\r\n oDataCount?: number;\r\n \"@odata.count\"?: number;\r\n oDataContext?: string;\r\n \"@odata.context\"?: number;\r\n}\r\n\r\nexport interface AllResponse extends MultipleResponse {\r\n /**@odata.deltaLink value */\r\n oDataDeltaLink?: string;\r\n}\r\n\r\nexport interface RetrieveMultipleResponse extends MultipleResponse {\r\n \"@Microsoft.Dynamics.CRM.totalrecordcount\"?: number;\r\n \"@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded\"?: boolean;\r\n /**@odata.nextLink value */\r\n oDataNextLink?: string;\r\n /**@odata.deltaLink value */\r\n oDataDeltaLink?: string;\r\n \"@odata.deltaLink\"?: string;\r\n \"@odata.nextLink\"?: string;\r\n}\r\n\r\nexport interface FetchXmlResponse extends MultipleResponse {\r\n \"@Microsoft.Dynamics.CRM.totalrecordcount\"?: number;\r\n \"@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded\"?: boolean;\r\n /**Paging information */\r\n PagingInfo?: {\r\n /**Number of the next page */\r\n nextPage?: number;\r\n /**Next page cookie */\r\n cookie?: string;\r\n };\r\n}\r\n\r\nexport interface DownloadResponse {\r\n /**The name of the file */\r\n fileName: string;\r\n /**File size */\r\n fileSize: number;\r\n /**File Data */\r\n data: Uint8Array | Buffer;\r\n}\r\n\r\nexport interface SearchResponse {\r\n /**Search results*/\r\n value: TValue[];\r\n facets: any | null;\r\n totalrecordcount: number;\r\n querycontext: any | null;\r\n}\r\n\r\nexport interface SuggestResponseValue {\r\n text: string;\r\n document: TDocument;\r\n}\r\n\r\nexport interface SuggestResponse {\r\n /**Suggestions*/\r\n value: SuggestResponseValue[];\r\n querycontext: any | null;\r\n}\r\n\r\nexport interface AutocompleteResponse {\r\n /**Autocomplete result*/\r\n value: string | null;\r\n querycontext: any | null;\r\n}\r\n\r\n//function overloads\r\n\r\ntype CallFunction = {\r\n /**\r\n * Calls a Web API function\r\n *\r\n * @param name - The name of a function.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (name: string): Promise;\r\n /**\r\n * Calls a bound Web API function\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundFunctionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API function (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundFunctionRequest): Promise;\r\n};\r\n\r\ntype CallAction = {\r\n /**\r\n * Calls a bound Web API action (bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {T} Type of the value in a response\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundActionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API action (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {T} Type of the value in a response\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundActionRequest): Promise;\r\n /**\r\n * Calls a bound Web API action (bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {TResponse} Type of the value in a response\r\n * @type {TAction} Type of an action object\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundActionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API action (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {TResponse} Type of the value in a response\r\n * @type {TAction} Type of an action object\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundActionRequest): Promise;\r\n};\r\n\r\ntype SearchFunction = {\r\n /**\r\n * Provides a search results page.\r\n * @param term - The term to be searched for and has a max 100-character limit.\r\n * @returns {Promise} Search result\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides a search results page.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Search result\r\n */\r\n (request: SearchRequest): Promise>;\r\n};\r\n\r\ntype SuggestFunction = {\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param term - The term to be searched for and has min 3 characters to a max 100-character limit.\r\n * @returns {Promise} Suggestions result\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Suggestions result\r\n */\r\n (request: SuggestRequest): Promise>;\r\n};\r\n\r\ntype AutocompleteFunction = {\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param term - The term to be searched for and has a 100-character limit.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n (request: AutocompleteRequest): Promise;\r\n};\r\n", "import { Utility } from \"./Utility\";\r\nimport { ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { ApiConfig, Config } from \"../dynamics-web-api\";\r\n\r\ntype ApiType = \"dataApi\" | \"searchApi\";\r\n\r\nexport interface InternalApiConfig extends ApiConfig {\r\n url: string;\r\n}\r\n\r\nexport interface InternalConfig extends Config {\r\n dataApi: InternalApiConfig;\r\n searchApi: InternalApiConfig;\r\n}\r\n\r\nconst getApiUrl = (serverUrl: string | undefined | null, apiConfig: ApiConfig): string => {\r\n if (Utility.isRunningWithinPortals()) {\r\n return new URL(\"_api\", global.window.location.origin).toString() + \"/\";\r\n } else {\r\n if (!serverUrl) serverUrl = Utility.getClientUrl();\r\n return new URL(`api/${apiConfig.path}/v${apiConfig.version}`, serverUrl).toString() + \"/\";\r\n }\r\n};\r\n\r\nconst mergeApiConfigs = (apiConfig: ApiConfig | undefined, apiType: ApiType, internalConfig: InternalConfig): void => {\r\n const internalApiConfig = internalConfig[apiType] as InternalApiConfig;\r\n\r\n if (apiConfig?.version) {\r\n ErrorHelper.stringParameterCheck(apiConfig.version, \"DynamicsWebApi.setConfig\", `config.${apiType}.version`);\r\n internalApiConfig.version = apiConfig.version;\r\n }\r\n\r\n if (apiConfig?.path) {\r\n ErrorHelper.stringParameterCheck(apiConfig.path, \"DynamicsWebApi.setConfig\", `config.${apiType}.path`);\r\n internalApiConfig.path = apiConfig.path;\r\n }\r\n\r\n internalApiConfig.url = getApiUrl(internalConfig.serverUrl, internalApiConfig);\r\n};\r\n\r\nexport class ConfigurationUtility {\r\n static mergeApiConfigs = mergeApiConfigs;\r\n\r\n static merge(internalConfig: InternalConfig, config?: Config): void {\r\n if (config?.serverUrl) {\r\n ErrorHelper.stringParameterCheck(config.serverUrl, \"DynamicsWebApi.setConfig\", \"config.serverUrl\");\r\n internalConfig.serverUrl = config.serverUrl;\r\n }\r\n\r\n mergeApiConfigs(config?.dataApi, \"dataApi\", internalConfig);\r\n mergeApiConfigs(config?.searchApi, \"searchApi\", internalConfig);\r\n\r\n if (config?.impersonate) {\r\n internalConfig.impersonate = ErrorHelper.guidParameterCheck(config.impersonate, \"DynamicsWebApi.setConfig\", \"config.impersonate\");\r\n }\r\n\r\n if (config?.impersonateAAD) {\r\n internalConfig.impersonateAAD = ErrorHelper.guidParameterCheck(config.impersonateAAD, \"DynamicsWebApi.setConfig\", \"config.impersonateAAD\");\r\n }\r\n\r\n if (config?.onTokenRefresh) {\r\n ErrorHelper.callbackParameterCheck(config.onTokenRefresh, \"DynamicsWebApi.setConfig\", \"config.onTokenRefresh\");\r\n internalConfig.onTokenRefresh = config.onTokenRefresh;\r\n }\r\n\r\n if (config?.includeAnnotations) {\r\n ErrorHelper.stringParameterCheck(config.includeAnnotations, \"DynamicsWebApi.setConfig\", \"config.includeAnnotations\");\r\n internalConfig.includeAnnotations = config.includeAnnotations;\r\n }\r\n\r\n if (config?.timeout) {\r\n ErrorHelper.numberParameterCheck(config.timeout, \"DynamicsWebApi.setConfig\", \"config.timeout\");\r\n internalConfig.timeout = config.timeout;\r\n }\r\n\r\n if (config?.maxPageSize) {\r\n ErrorHelper.numberParameterCheck(config.maxPageSize, \"DynamicsWebApi.setConfig\", \"config.maxPageSize\");\r\n internalConfig.maxPageSize = config.maxPageSize;\r\n }\r\n\r\n if (config?.returnRepresentation) {\r\n ErrorHelper.boolParameterCheck(config.returnRepresentation, \"DynamicsWebApi.setConfig\", \"config.returnRepresentation\");\r\n internalConfig.returnRepresentation = config.returnRepresentation;\r\n }\r\n\r\n if (config?.useEntityNames) {\r\n ErrorHelper.boolParameterCheck(config.useEntityNames, \"DynamicsWebApi.setConfig\", \"config.useEntityNames\");\r\n internalConfig.useEntityNames = config.useEntityNames;\r\n }\r\n\r\n if (config?.headers) {\r\n internalConfig.headers = config.headers;\r\n }\r\n\r\n if (!global.DWA_BROWSER && config?.proxy) {\r\n ErrorHelper.parameterCheck(config.proxy, \"DynamicsWebApi.setConfig\", \"config.proxy\");\r\n\r\n if (config.proxy.url) {\r\n ErrorHelper.stringParameterCheck(config.proxy.url, \"DynamicsWebApi.setConfig\", \"config.proxy.url\");\r\n\r\n if (config.proxy.auth) {\r\n ErrorHelper.parameterCheck(config.proxy.auth, \"DynamicsWebApi.setConfig\", \"config.proxy.auth\");\r\n ErrorHelper.stringParameterCheck(config.proxy.auth.username, \"DynamicsWebApi.setConfig\", \"config.proxy.auth.username\");\r\n ErrorHelper.stringParameterCheck(config.proxy.auth.password, \"DynamicsWebApi.setConfig\", \"config.proxy.auth.password\");\r\n }\r\n }\r\n\r\n internalConfig.proxy = config.proxy;\r\n }\r\n }\r\n\r\n static default(): InternalConfig {\r\n return {\r\n serverUrl: null,\r\n impersonate: null,\r\n impersonateAAD: null,\r\n onTokenRefresh: null,\r\n includeAnnotations: null,\r\n maxPageSize: null,\r\n returnRepresentation: null,\r\n proxy: null,\r\n dataApi: {\r\n path: \"data\",\r\n version: \"9.2\",\r\n url: \"\"\r\n },\r\n searchApi: {\r\n path: \"search\",\r\n version: \"1.0\",\r\n url: \"\"\r\n },\r\n };\r\n }\r\n}\r\n", "import { Utility } from \"../utils/Utility\";\r\nimport { InternalConfig } from \"../utils/Config\";\r\nimport { RequestUtility } from \"../utils/Request\";\r\nimport { DynamicsWebApiError, ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { Core } from \"../types\";\r\nimport { executeRequest } from \"./helpers/executeRequest\";\r\nimport { AccessToken } from \"../dynamics-web-api\";\r\n\r\nconst _addResponseParams = (requestId, responseParams) => {\r\n if (_responseParseParams[requestId]) _responseParseParams[requestId].push(responseParams);\r\n else _responseParseParams[requestId] = [responseParams];\r\n};\r\n\r\nconst _addRequestToBatchCollection = (requestId, request) => {\r\n if (_batchRequestCollection[requestId]) _batchRequestCollection[requestId].push(request);\r\n else _batchRequestCollection[requestId] = [request];\r\n};\r\n\r\nconst _clearRequestData = (requestId: string): void => {\r\n delete _responseParseParams[requestId];\r\n if (_batchRequestCollection.hasOwnProperty(requestId)) delete _batchRequestCollection[requestId];\r\n};\r\n\r\nconst _runRequest = async (request: Core.InternalRequest, config: InternalConfig): Promise => {\r\n try {\r\n const result = await RequestClient.sendRequest(request, config);\r\n _clearRequestData(request.requestId!);\r\n\r\n return result;\r\n } catch (error) {\r\n _clearRequestData(request.requestId!);\r\n throw error;\r\n } finally {\r\n _clearRequestData(request.requestId!);\r\n }\r\n};\r\n\r\nlet _batchRequestCollection: Core.BatchRequestCollection = {};\r\nlet _responseParseParams: { [key: string]: any[] } = {};\r\n\r\nexport class RequestClient {\r\n /**\r\n * Sends a request to given URL with given parameters\r\n *\r\n * @param {InternalRequest} request - Composed request to D365 Web Api\r\n * @param {InternalConfig} config - DynamicsWebApi config.\r\n */\r\n static async sendRequest(request: Core.InternalRequest, config: InternalConfig): Promise {\r\n request.headers = request.headers || {};\r\n request.responseParameters = request.responseParameters || {};\r\n request.requestId = request.requestId || Utility.generateUUID();\r\n\r\n //add response parameters to parse\r\n _addResponseParams(request.requestId, request.responseParameters);\r\n\r\n //stringify passed data\r\n let processedData = null;\r\n\r\n const isBatchConverted = request.responseParameters?.convertedToBatch;\r\n\r\n if (request.path === \"$batch\" && !isBatchConverted) {\r\n const batchRequest = _batchRequestCollection[request.requestId];\r\n\r\n if (!batchRequest) throw ErrorHelper.batchIsEmpty();\r\n\r\n const batchResult = RequestUtility.convertToBatch(batchRequest, config, request);\r\n\r\n processedData = batchResult.body;\r\n request.headers = { ...batchResult.headers, ...request.headers };\r\n\r\n //clear an array of requests\r\n delete _batchRequestCollection[request.requestId];\r\n } else {\r\n processedData = !isBatchConverted ? RequestUtility.processData(request.data, config) : request.data;\r\n\r\n if (!isBatchConverted) request.headers = RequestUtility.setStandardHeaders(request.headers);\r\n }\r\n\r\n if (config.impersonate && !request.headers![\"MSCRMCallerID\"]) {\r\n request.headers![\"MSCRMCallerID\"] = config.impersonate;\r\n }\r\n\r\n if (config.impersonateAAD && !request.headers![\"CallerObjectId\"]) {\r\n request.headers![\"CallerObjectId\"] = config.impersonateAAD;\r\n }\r\n\r\n let token: AccessToken | string | null = null;\r\n\r\n //call a token refresh callback only if it is set and there is no \"Authorization\" header set yet\r\n if (config.onTokenRefresh && (!request.headers || (request.headers && !request.headers[\"Authorization\"]))) {\r\n token = await config.onTokenRefresh();\r\n if (!token) throw new Error(\"Token is empty. Request is aborted.\");\r\n }\r\n\r\n if (token) {\r\n request.headers![\"Authorization\"] = \"Bearer \" + (token.hasOwnProperty(\"accessToken\") ? (token as AccessToken).accessToken : token);\r\n }\r\n\r\n if (Utility.isRunningWithinPortals()) {\r\n request.headers![\"__RequestVerificationToken\"] = await global.window.shell!.getTokenDeferred();\r\n }\r\n\r\n const url = request.apiConfig ? request.apiConfig.url : config.dataApi.url;\r\n\r\n return await executeRequest({\r\n method: request.method!,\r\n uri: url!.toString() + request.path,\r\n data: processedData,\r\n additionalHeaders: request.headers,\r\n responseParams: _responseParseParams,\r\n isAsync: request.async,\r\n timeout: request.timeout || config.timeout,\r\n proxy: config.proxy,\r\n requestId: request.requestId!,\r\n abortSignal: request.signal,\r\n });\r\n }\r\n\r\n private static async _getCollectionNames(entityName: string, config: InternalConfig): Promise {\r\n if (!Utility.isNull(RequestUtility.entityNames)) {\r\n return RequestUtility.findCollectionName(entityName) || entityName;\r\n }\r\n\r\n const request = RequestUtility.compose(\r\n {\r\n method: \"GET\",\r\n collection: \"EntityDefinitions\",\r\n select: [\"EntitySetName\", \"LogicalName\"],\r\n noCache: true,\r\n functionName: \"retrieveMultiple\",\r\n },\r\n config\r\n );\r\n\r\n const result = await _runRequest(request, config);\r\n RequestUtility.entityNames = {};\r\n for (let i = 0; i < result.data.value.length; i++) {\r\n RequestUtility.entityNames[result.data.value[i].LogicalName] = result.data.value[i].EntitySetName;\r\n }\r\n\r\n return RequestUtility.findCollectionName(entityName) || entityName;\r\n }\r\n\r\n private static _isEntityNameException(entityName: string): boolean {\r\n const exceptions = [\r\n \"$metadata\",\r\n \"EntityDefinitions\",\r\n \"RelationshipDefinitions\",\r\n \"GlobalOptionSetDefinitions\",\r\n \"ManagedPropertyDefinitions\",\r\n \"query\",\r\n \"suggest\",\r\n \"autocomplete\",\r\n ];\r\n\r\n return exceptions.indexOf(entityName) > -1;\r\n }\r\n\r\n private static async _checkCollectionName(entityName: string | null | undefined, config: InternalConfig): Promise {\r\n if (!entityName || RequestClient._isEntityNameException(entityName)) {\r\n return entityName;\r\n }\r\n\r\n entityName = entityName.toLowerCase();\r\n\r\n if (!config.useEntityNames) {\r\n return entityName;\r\n }\r\n\r\n try {\r\n return await RequestClient._getCollectionNames(entityName, config);\r\n } catch (error: any) {\r\n throw new Error(\"Unable to fetch Collection Names. Error: \" + (error as DynamicsWebApiError).message);\r\n }\r\n }\r\n\r\n static async makeRequest(request: Core.InternalRequest, config: InternalConfig): Promise {\r\n request.responseParameters = request.responseParameters || {};\r\n //we don't want to mix headers set by the library and by the user\r\n request.userHeaders = request.headers;\r\n delete request.headers;\r\n\r\n if (!request.isBatch) {\r\n const collectionName = await RequestClient._checkCollectionName(request.collection, config);\r\n\r\n request.collection = collectionName;\r\n RequestUtility.compose(request, config);\r\n request.responseParameters.convertedToBatch = false;\r\n\r\n //the URL contains more characters than max possible limit, convert the request to a batch request\r\n if (request.path!.length > 2000) {\r\n const batchRequest = RequestUtility.convertToBatch([request], config);\r\n\r\n request.method = \"POST\";\r\n request.path = \"$batch\";\r\n request.data = batchRequest.body;\r\n request.headers = { ...batchRequest.headers, ...request.userHeaders };\r\n request.responseParameters.convertedToBatch = true;\r\n }\r\n\r\n return _runRequest(request, config);\r\n }\r\n\r\n //no need to make a request to web api if it's a part of batch\r\n RequestUtility.compose(request, config);\r\n //add response parameters to parse\r\n _addResponseParams(request.requestId, request.responseParameters);\r\n _addRequestToBatchCollection(request.requestId, request);\r\n }\r\n\r\n static _clearTestData(): void {\r\n RequestUtility.entityNames = null;\r\n _responseParseParams = {};\r\n _batchRequestCollection = {};\r\n }\r\n\r\n static getCollectionName(entityName: string): string | null {\r\n return RequestUtility.findCollectionName(entityName);\r\n }\r\n}\r\n", "import { Utility } from \"./Utility\";\r\nimport { Config, HeaderCollection } from \"../dynamics-web-api\";\r\nimport { ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { Core } from \"../types\";\r\nimport { InternalConfig } from \"./Config\";\r\n\r\n/**\r\n * @typedef {Object} ConvertedRequestOptions\r\n * @property {string} url URL (without query)\r\n * @property {string} query Query String\r\n * @property {Object} headers Heades object (always an Object; can be empty: {})\r\n */\r\n\r\n/**\r\n * @typedef {Object} ConvertedRequest\r\n * @property {string} url URL (including Query String)\r\n * @property {Object} headers Heades object (always an Object; can be empty: {})\r\n * @property {boolean} async\r\n */\r\n\r\nexport class RequestUtility {\r\n /**\r\n * Converts a request object to URL link\r\n *\r\n * @param {Object} request - Request object\r\n * @param {Object} [config] - DynamicsWebApi config\r\n * @returns {ConvertedRequest} Converted request\r\n */\r\n static compose(request: Core.InternalRequest, config: InternalConfig): Core.InternalRequest {\r\n request.path = request.path || \"\";\r\n request.functionName = request.functionName || \"\";\r\n if (!request.url) {\r\n if (!request._isUnboundRequest && !request.contentId && !request.collection) {\r\n ErrorHelper.parameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, \"request.collection\");\r\n }\r\n if (request.collection != null) {\r\n ErrorHelper.stringParameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, \"request.collection\");\r\n request.path = request.collection;\r\n\r\n //add alternate key feature\r\n if (request.key) {\r\n request.key = ErrorHelper.keyParameterCheck(request.key, `DynamicsWebApi.${request.functionName}`, \"request.key\");\r\n request.path += `(${request.key})`;\r\n }\r\n }\r\n\r\n if (request.contentId) {\r\n ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, \"request.contentId\");\r\n if (request.contentId.startsWith(\"$\")) {\r\n request.path = request.path ? `${request.contentId}/${request.path}` : request.contentId;\r\n }\r\n }\r\n\r\n if (request._additionalUrl) {\r\n if (request.path) {\r\n request.path += \"/\";\r\n }\r\n request.path += request._additionalUrl;\r\n }\r\n\r\n request.path = RequestUtility.composeUrl(request, config, request.path);\r\n\r\n if (request.fetchXml) {\r\n ErrorHelper.stringParameterCheck(request.fetchXml, `DynamicsWebApi.${request.functionName}`, \"request.fetchXml\");\r\n let join = request.path.indexOf(\"?\") === -1 ? \"?\" : \"&\";\r\n request.path += `${join}fetchXml=${encodeURIComponent(request.fetchXml)}`;\r\n }\r\n } else {\r\n ErrorHelper.stringParameterCheck(request.url, `DynamicsWebApi.${request.functionName}`, \"request.url\");\r\n request.path = request.url.replace(config.dataApi.url, \"\");\r\n }\r\n\r\n if (request.hasOwnProperty(\"async\") && request.async != null) {\r\n ErrorHelper.boolParameterCheck(request.async, `DynamicsWebApi.${request.functionName}`, \"request.async\");\r\n } else {\r\n request.async = true;\r\n }\r\n\r\n request.headers = RequestUtility.composeHeaders(request, config);\r\n\r\n return request;\r\n }\r\n\r\n /**\r\n * Converts optional parameters of the request to URL. If expand parameter exists this function is called recursively.\r\n *\r\n * @param {Object} request - Request object\r\n * @param {string} request.functionName - Name of the function that converts a request (for Error Handling)\r\n * @param {string} url - URL beginning (with required parameters)\r\n * @param {string} [joinSymbol] - URL beginning (with required parameters)\r\n * @param {Object} [config] - DynamicsWebApi config\r\n * @returns {ConvertedRequestOptions} Additional options in request\r\n */\r\n static composeUrl(request: Core.InternalRequest, config: Config, url: string = \"\", joinSymbol: string = \"&\"): string {\r\n const queryArray: string[] = [];\r\n\r\n if (request) {\r\n if (request.navigationProperty) {\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, `DynamicsWebApi.${request.functionName}`, \"request.navigationProperty\");\r\n url += \"/\" + request.navigationProperty;\r\n\r\n if (request.navigationPropertyKey) {\r\n let navigationKey = ErrorHelper.keyParameterCheck(\r\n request.navigationPropertyKey,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.navigationPropertyKey\"\r\n );\r\n url += \"(\" + navigationKey + \")\";\r\n }\r\n\r\n if (request.navigationProperty === \"Attributes\") {\r\n if (request.metadataAttributeType) {\r\n ErrorHelper.stringParameterCheck(\r\n request.metadataAttributeType,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.metadataAttributeType\"\r\n );\r\n url += \"/\" + request.metadataAttributeType;\r\n }\r\n }\r\n }\r\n\r\n if (request.select?.length) {\r\n ErrorHelper.arrayParameterCheck(request.select, `DynamicsWebApi.${request.functionName}`, \"request.select\");\r\n\r\n if (request.functionName == \"retrieve\" && request.select.length == 1 && request.select[0].endsWith(\"/$ref\")) {\r\n url += \"/\" + request.select[0];\r\n } else {\r\n if (request.select[0].startsWith(\"/\") && request.functionName == \"retrieve\") {\r\n if (request.navigationProperty == null) {\r\n url += request.select.shift();\r\n } else {\r\n request.select.shift();\r\n }\r\n }\r\n\r\n //check if anything left in the array\r\n if (request.select.length) {\r\n queryArray.push(\"$select=\" + request.select.join(\",\"));\r\n }\r\n }\r\n }\r\n\r\n if (request.filter) {\r\n ErrorHelper.stringParameterCheck(request.filter, `DynamicsWebApi.${request.functionName}`, \"request.filter\");\r\n const removeBracketsFromGuidReg = /[^\"']{([\\w\\d]{8}[-]?(?:[\\w\\d]{4}[-]?){3}[\\w\\d]{12})}(?:[^\"']|$)/g;\r\n let filterResult = request.filter;\r\n\r\n //fix bug 2018-06-11\r\n let m: RegExpExecArray | null = null;\r\n while ((m = removeBracketsFromGuidReg.exec(filterResult)) !== null) {\r\n if (m.index === removeBracketsFromGuidReg.lastIndex) {\r\n removeBracketsFromGuidReg.lastIndex++;\r\n }\r\n\r\n let replacement = m[0].endsWith(\")\") ? \")\" : \" \";\r\n filterResult = filterResult.replace(m[0], \" \" + m[1] + replacement);\r\n }\r\n\r\n queryArray.push(\"$filter=\" + encodeURIComponent(filterResult));\r\n }\r\n\r\n if (request.fieldName) {\r\n ErrorHelper.stringParameterCheck(request.fieldName, `DynamicsWebApi.${request.functionName}`, \"request.fieldName\");\r\n url += \"/\" + request.fieldName;\r\n }\r\n\r\n if (request.savedQuery) {\r\n queryArray.push(\r\n \"savedQuery=\" + ErrorHelper.guidParameterCheck(request.savedQuery, `DynamicsWebApi.${request.functionName}`, \"request.savedQuery\")\r\n );\r\n }\r\n\r\n if (request.userQuery) {\r\n queryArray.push(\r\n \"userQuery=\" + ErrorHelper.guidParameterCheck(request.userQuery, `DynamicsWebApi.${request.functionName}`, \"request.userQuery\")\r\n );\r\n }\r\n\r\n if (request.apply) {\r\n ErrorHelper.stringParameterCheck(request.apply, `DynamicsWebApi.${request.functionName}`, \"request.apply\");\r\n queryArray.push(\"$apply=\" + request.apply);\r\n }\r\n\r\n if (request.count) {\r\n ErrorHelper.boolParameterCheck(request.count, `DynamicsWebApi.${request.functionName}`, \"request.count\");\r\n queryArray.push(\"$count=\" + request.count);\r\n }\r\n\r\n if (request.top && request.top > 0) {\r\n ErrorHelper.numberParameterCheck(request.top, `DynamicsWebApi.${request.functionName}`, \"request.top\");\r\n queryArray.push(\"$top=\" + request.top);\r\n }\r\n\r\n if (request.orderBy != null && request.orderBy.length) {\r\n ErrorHelper.arrayParameterCheck(request.orderBy, `DynamicsWebApi.${request.functionName}`, \"request.orderBy\");\r\n queryArray.push(\"$orderby=\" + request.orderBy.join(\",\"));\r\n }\r\n\r\n if (request.partitionId) {\r\n ErrorHelper.stringParameterCheck(request.partitionId, `DynamicsWebApi.${request.functionName}`, \"request.partitionId\");\r\n queryArray.push(\"partitionid='\" + request.partitionId + \"'\");\r\n }\r\n\r\n if (request.downloadSize) {\r\n ErrorHelper.stringParameterCheck(request.downloadSize, `DynamicsWebApi.${request.functionName}`, \"request.downloadSize\");\r\n queryArray.push(\"size=\" + request.downloadSize);\r\n }\r\n\r\n if (request.queryParams?.length) {\r\n ErrorHelper.arrayParameterCheck(request.queryParams, `DynamicsWebApi.${request.functionName}`, \"request.queryParams\");\r\n queryArray.push(request.queryParams.join(\"&\"));\r\n }\r\n\r\n if (request.fileName) {\r\n ErrorHelper.stringParameterCheck(request.fileName, `DynamicsWebApi.${request.functionName}`, \"request.fileName\");\r\n queryArray.push(\"x-ms-file-name=\" + request.fileName);\r\n }\r\n\r\n if (request.data) {\r\n ErrorHelper.parameterCheck(request.data, `DynamicsWebApi.${request.functionName}`, \"request.data\");\r\n }\r\n\r\n if (request.isBatch) {\r\n ErrorHelper.boolParameterCheck(request.isBatch, `DynamicsWebApi.${request.functionName}`, \"request.isBatch\");\r\n }\r\n\r\n if (!Utility.isNull(request.inChangeSet)) {\r\n ErrorHelper.boolParameterCheck(request.inChangeSet, `DynamicsWebApi.${request.functionName}`, \"request.inChangeSet\");\r\n }\r\n\r\n if (request.isBatch && Utility.isNull(request.inChangeSet)) request.inChangeSet = true;\r\n\r\n if (request.timeout) {\r\n ErrorHelper.numberParameterCheck(request.timeout, `DynamicsWebApi.${request.functionName}`, \"request.timeout\");\r\n }\r\n\r\n if (request.expand?.length) {\r\n ErrorHelper.stringOrArrayParameterCheck(request.expand, `DynamicsWebApi.${request.functionName}`, \"request.expand\");\r\n if (typeof request.expand === \"string\") {\r\n queryArray.push(\"$expand=\" + request.expand);\r\n } else {\r\n const expandQueryArray: string[] = [];\r\n for (let i = 0; i < request.expand.length; i++) {\r\n if (request.expand[i].property) {\r\n const expand = request.expand[i];\r\n expand.functionName = `${request.functionName} $expand`;\r\n let expandConverted = RequestUtility.composeUrl(expand, config, \"\", \";\");\r\n if (expandConverted) {\r\n expandConverted = `(${expandConverted.substr(1)})`;\r\n }\r\n expandQueryArray.push(request.expand[i].property + expandConverted);\r\n }\r\n }\r\n if (expandQueryArray.length) {\r\n queryArray.push(\"$expand=\" + expandQueryArray.join(\",\"));\r\n }\r\n }\r\n }\r\n }\r\n\r\n return !queryArray.length ? url : url + \"?\" + queryArray.join(joinSymbol);\r\n }\r\n\r\n static composeHeaders(request: Core.InternalRequest, config: Config): HeaderCollection {\r\n const headers: HeaderCollection = { ...config.headers, ...request.userHeaders };\r\n\r\n const prefer = RequestUtility.composePreferHeader(request, config);\r\n if (prefer.length) {\r\n headers[\"Prefer\"] = prefer;\r\n }\r\n\r\n if (request.collection === \"$metadata\") {\r\n headers[\"Accept\"] = \"application/xml\";\r\n }\r\n\r\n if (request.transferMode) {\r\n headers[\"x-ms-transfer-mode\"] = request.transferMode;\r\n }\r\n\r\n if (request.ifmatch != null && request.ifnonematch != null) {\r\n throw new Error(\r\n `DynamicsWebApi.${request.functionName}. Either one of request.ifmatch or request.ifnonematch parameters should be used in a call, not both.`\r\n );\r\n }\r\n\r\n if (request.ifmatch) {\r\n ErrorHelper.stringParameterCheck(request.ifmatch, `DynamicsWebApi.${request.functionName}`, \"request.ifmatch\");\r\n headers[\"If-Match\"] = request.ifmatch;\r\n }\r\n\r\n if (request.ifnonematch) {\r\n ErrorHelper.stringParameterCheck(request.ifnonematch, `DynamicsWebApi.${request.functionName}`, \"request.ifnonematch\");\r\n headers[\"If-None-Match\"] = request.ifnonematch;\r\n }\r\n\r\n if (request.impersonate) {\r\n ErrorHelper.stringParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, \"request.impersonate\");\r\n headers[\"MSCRMCallerID\"] = ErrorHelper.guidParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, \"request.impersonate\");\r\n }\r\n\r\n if (request.impersonateAAD) {\r\n ErrorHelper.stringParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, \"request.impersonateAAD\");\r\n headers[\"CallerObjectId\"] = ErrorHelper.guidParameterCheck(\r\n request.impersonateAAD,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.impersonateAAD\"\r\n );\r\n }\r\n\r\n if (request.token) {\r\n ErrorHelper.stringParameterCheck(request.token, `DynamicsWebApi.${request.functionName}`, \"request.token\");\r\n headers[\"Authorization\"] = \"Bearer \" + request.token;\r\n }\r\n\r\n if (request.duplicateDetection) {\r\n ErrorHelper.boolParameterCheck(request.duplicateDetection, `DynamicsWebApi.${request.functionName}`, \"request.duplicateDetection\");\r\n headers[\"MSCRM.SuppressDuplicateDetection\"] = \"false\";\r\n }\r\n\r\n if (request.bypassCustomPluginExecution) {\r\n ErrorHelper.boolParameterCheck(\r\n request.bypassCustomPluginExecution,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.bypassCustomPluginExecution\"\r\n );\r\n headers[\"MSCRM.BypassCustomPluginExecution\"] = \"true\";\r\n }\r\n\r\n if (request.noCache) {\r\n ErrorHelper.boolParameterCheck(request.noCache, `DynamicsWebApi.${request.functionName}`, \"request.noCache\");\r\n headers[\"Cache-Control\"] = \"no-cache\";\r\n }\r\n\r\n if (request.mergeLabels) {\r\n ErrorHelper.boolParameterCheck(request.mergeLabels, `DynamicsWebApi.${request.functionName}`, \"request.mergeLabels\");\r\n headers[\"MSCRM.MergeLabels\"] = \"true\";\r\n }\r\n\r\n if (request.contentId) {\r\n ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, \"request.contentId\");\r\n if (!request.contentId.startsWith(\"$\")) {\r\n headers[\"Content-ID\"] = request.contentId;\r\n }\r\n }\r\n\r\n if (request.contentRange) {\r\n ErrorHelper.stringParameterCheck(request.contentRange, `DynamicsWebApi.${request.functionName}`, \"request.contentRange\");\r\n headers[\"Content-Range\"] = request.contentRange;\r\n }\r\n\r\n if (request.range) {\r\n ErrorHelper.stringParameterCheck(request.range, `DynamicsWebApi.${request.functionName}`, \"request.range\");\r\n headers[\"Range\"] = request.range;\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n static composePreferHeader(request: Core.InternalRequest, config: Config): string {\r\n let returnRepresentation: boolean | null | undefined = request.returnRepresentation;\r\n let includeAnnotations: string | null | undefined = request.includeAnnotations;\r\n let maxPageSize: number | null | undefined = request.maxPageSize;\r\n let trackChanges: boolean | null | undefined = request.trackChanges;\r\n let continueOnError: boolean | null | undefined = request.continueOnError;\r\n\r\n let prefer: string[] = [];\r\n\r\n if (request.prefer && request.prefer.length) {\r\n ErrorHelper.stringOrArrayParameterCheck(request.prefer, `DynamicsWebApi.${request.functionName}`, \"request.prefer\");\r\n if (typeof request.prefer === \"string\") {\r\n prefer = request.prefer.split(\",\");\r\n }\r\n for (let i in prefer) {\r\n let item = prefer[i].trim();\r\n if (item === \"return=representation\") {\r\n returnRepresentation = true;\r\n } else if (item.includes(\"odata.include-annotations=\")) {\r\n includeAnnotations = item.replace(\"odata.include-annotations=\", \"\").replace(/\"/g, \"\");\r\n } else if (item.startsWith(\"odata.maxpagesize=\")) {\r\n maxPageSize = Number(item.replace(\"odata.maxpagesize=\", \"\").replace(/\"/g, \"\")) || 0;\r\n } else if (item.includes(\"odata.track-changes\")) {\r\n trackChanges = true;\r\n } else if (item.includes(\"odata.continue-on-error\")) {\r\n continueOnError = true;\r\n }\r\n }\r\n }\r\n\r\n //clear array\r\n prefer = [];\r\n\r\n if (config) {\r\n if (returnRepresentation == null) {\r\n returnRepresentation = config.returnRepresentation;\r\n }\r\n includeAnnotations = includeAnnotations ? includeAnnotations : config.includeAnnotations;\r\n maxPageSize = maxPageSize ? maxPageSize : config.maxPageSize;\r\n }\r\n\r\n if (returnRepresentation) {\r\n ErrorHelper.boolParameterCheck(returnRepresentation, `DynamicsWebApi.${request.functionName}`, \"request.returnRepresentation\");\r\n prefer.push(\"return=representation\");\r\n }\r\n\r\n if (includeAnnotations) {\r\n ErrorHelper.stringParameterCheck(includeAnnotations, `DynamicsWebApi.${request.functionName}`, \"request.includeAnnotations\");\r\n prefer.push(`odata.include-annotations=\"${includeAnnotations}\"`);\r\n }\r\n\r\n if (maxPageSize && maxPageSize > 0) {\r\n ErrorHelper.numberParameterCheck(maxPageSize, `DynamicsWebApi.${request.functionName}`, \"request.maxPageSize\");\r\n prefer.push(\"odata.maxpagesize=\" + maxPageSize);\r\n }\r\n\r\n if (trackChanges) {\r\n ErrorHelper.boolParameterCheck(trackChanges, `DynamicsWebApi.${request.functionName}`, \"request.trackChanges\");\r\n prefer.push(\"odata.track-changes\");\r\n }\r\n\r\n if (continueOnError) {\r\n ErrorHelper.boolParameterCheck(continueOnError, `DynamicsWebApi.${request.functionName}`, \"request.continueOnError\");\r\n prefer.push(\"odata.continue-on-error\");\r\n }\r\n\r\n return prefer.join(\",\");\r\n }\r\n\r\n static convertToBatch(requests: Core.InternalRequest[], config: InternalConfig, batchRequest?: Core.InternalRequest): Core.InternalBatchRequest {\r\n const batchBoundary = `dwa_batch_${Utility.generateUUID()}`;\r\n\r\n const batchBody: string[] = [];\r\n let currentChangeSet: string | null = null;\r\n let contentId = 100000;\r\n\r\n requests.forEach((internalRequest) => {\r\n internalRequest.functionName = \"executeBatch\";\r\n if (batchRequest?.inChangeSet === false) internalRequest.inChangeSet = false;\r\n const inChangeSet = internalRequest.method === \"GET\" ? false : !!internalRequest.inChangeSet;\r\n\r\n if (!inChangeSet && currentChangeSet) {\r\n //end current change set\r\n batchBody.push(`\\n--${currentChangeSet}--`);\r\n\r\n currentChangeSet = null;\r\n contentId = 100000;\r\n }\r\n\r\n if (!currentChangeSet) {\r\n batchBody.push(`\\n--${batchBoundary}`);\r\n\r\n if (inChangeSet) {\r\n currentChangeSet = `changeset_${Utility.generateUUID()}`;\r\n batchBody.push(\"Content-Type: multipart/mixed;boundary=\" + currentChangeSet);\r\n }\r\n }\r\n\r\n if (inChangeSet) {\r\n batchBody.push(`\\n--${currentChangeSet}`);\r\n }\r\n\r\n batchBody.push(\"Content-Type: application/http\");\r\n batchBody.push(\"Content-Transfer-Encoding: binary\");\r\n\r\n if (inChangeSet) {\r\n const contentIdValue = internalRequest.headers!.hasOwnProperty(\"Content-ID\") ? internalRequest.headers![\"Content-ID\"] : ++contentId;\r\n\r\n batchBody.push(`Content-ID: ${contentIdValue}`);\r\n }\r\n\r\n if (!internalRequest.path?.startsWith(\"$\")) {\r\n batchBody.push(`\\n${internalRequest.method} ${config.dataApi.url}${internalRequest.path} HTTP/1.1`);\r\n } else {\r\n batchBody.push(`\\n${internalRequest.method} ${internalRequest.path} HTTP/1.1`);\r\n }\r\n\r\n if (internalRequest.method === \"GET\") {\r\n batchBody.push(\"Accept: application/json\");\r\n } else {\r\n batchBody.push(\"Content-Type: application/json\");\r\n }\r\n\r\n for (let key in internalRequest.headers) {\r\n if (key === \"Authorization\" || key === \"Content-ID\") continue;\r\n\r\n batchBody.push(`${key}: ${internalRequest.headers[key]}`);\r\n }\r\n\r\n if (internalRequest.data) {\r\n batchBody.push(`\\n${RequestUtility.processData(internalRequest.data, config)}`);\r\n }\r\n });\r\n\r\n if (currentChangeSet) {\r\n batchBody.push(`\\n--${currentChangeSet}--`);\r\n }\r\n\r\n batchBody.push(`\\n--${batchBoundary}--`);\r\n\r\n const headers = RequestUtility.setStandardHeaders(batchRequest?.userHeaders);\r\n headers[\"Content-Type\"] = `multipart/mixed;boundary=${batchBoundary}`;\r\n\r\n return { headers: headers, body: batchBody.join(\"\\n\") };\r\n }\r\n\r\n static entityNames: any = null;\r\n\r\n static findCollectionName(entityName: string): string | null {\r\n let collectionName = null;\r\n\r\n if (!Utility.isNull(RequestUtility.entityNames)) {\r\n collectionName = RequestUtility.entityNames[entityName];\r\n if (Utility.isNull(collectionName)) {\r\n for (let key in RequestUtility.entityNames) {\r\n if (RequestUtility.entityNames[key] === entityName) {\r\n return entityName;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return collectionName;\r\n }\r\n\r\n static processData(data: any, config: InternalConfig): string | Uint8Array | Uint16Array | Uint32Array | null {\r\n let stringifiedData: string | null = null;\r\n if (data) {\r\n if (data instanceof Uint8Array || data instanceof Uint16Array || data instanceof Uint32Array) return data;\r\n\r\n stringifiedData = JSON.stringify(data, (key, value) => {\r\n if (key.endsWith(\"@odata.bind\") || key.endsWith(\"@odata.id\")) {\r\n if (typeof value === \"string\" && !value.startsWith(\"$\")) {\r\n //remove brackets in guid\r\n if (/\\(\\{[\\w\\d-]+\\}\\)/g.test(value)) {\r\n value = value.replace(/(.+)\\(\\{([\\w\\d-]+)\\}\\)/g, \"$1($2)\");\r\n }\r\n\r\n if (config.useEntityNames) {\r\n //replace entity name with collection name\r\n const regularExpression = /([\\w_]+)(\\([\\d\\w-]+\\))$/;\r\n const valueParts = regularExpression.exec(value);\r\n if (valueParts && valueParts.length > 2) {\r\n const collectionName = RequestUtility.findCollectionName(valueParts[1]);\r\n\r\n if (!Utility.isNull(collectionName)) {\r\n value = value.replace(regularExpression, collectionName + \"$2\");\r\n }\r\n }\r\n }\r\n\r\n if (!value.startsWith(config.dataApi.url)) {\r\n //add full web api url if it's not set\r\n if (key.endsWith(\"@odata.bind\")) {\r\n if (!value.startsWith(\"/\")) {\r\n value = \"/\" + value;\r\n }\r\n } else {\r\n value = config.dataApi.url + value.replace(/^\\//, \"\");\r\n }\r\n }\r\n }\r\n } else if (key.startsWith(\"oData\") || key.endsWith(\"_Formatted\") || key.endsWith(\"_NavigationProperty\") || key.endsWith(\"_LogicalName\")) {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n });\r\n\r\n stringifiedData = stringifiedData.replace(/[\\u007F-\\uFFFF]/g, function (chr: string) {\r\n return \"\\\\u\" + (\"0000\" + chr.charCodeAt(0).toString(16)).slice(-4);\r\n });\r\n }\r\n\r\n return stringifiedData;\r\n }\r\n\r\n static setStandardHeaders(headers: HeaderCollection = {}): any {\r\n if (!headers[\"Accept\"]) headers[\"Accept\"] = \"application/json\";\r\n if (!headers[\"OData-MaxVersion\"]) headers[\"OData-MaxVersion\"] = \"4.0\";\r\n if (!headers[\"OData-Version\"]) headers[\"OData-Version\"] = \"4.0\";\r\n if (headers[\"Content-Range\"]) headers[\"Content-Type\"] = \"application/octet-stream\";\r\n else if (!headers[\"Content-Type\"]) headers[\"Content-Type\"] = \"application/json; charset=utf-8\";\r\n\r\n return headers;\r\n }\r\n}\r\n", "import { Core } from \"../../types\";\r\n\r\nexport async function executeRequest(options: Core.RequestOptions): Promise {\r\n return global.DWA_BROWSER ? require(\"../xhr\").executeRequest(options) : require(\"../http\").executeRequest(options);\r\n}\r\n"], - "mappings": "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", - "names": ["executeRequest", "executeRequest", "request"] + "sourcesContent": ["export function getCrypto(): T {\r\n return global.DWA_BROWSER ? global.window.crypto : require(\"./crypto/node\").getCrypto();\r\n}\r\n\r\nexport function generateRandomBytes() {\r\n return global.DWA_BROWSER ? getCrypto().getRandomValues(new Uint8Array(1)) : getCrypto().randomBytes(1);\r\n}\r\n", "const uuid = \"[0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12}\";\r\n\r\nexport function isUuid(value: string): boolean {\r\n const match = new RegExp(uuid, \"i\").exec(value);\r\n return !!match;\r\n}\r\n\r\nexport function extractUuid(value: string): string | null {\r\n const match = new RegExp(\"^{?(\" + uuid + \")}?$\", \"i\").exec(value);\r\n return match ? match[1] : null;\r\n}\r\n\r\nexport function extractUuidFromUrl(url: string): string | null {\r\n const match = new RegExp(\"(\" + uuid + \")\\\\)$\", \"i\").exec(url);\r\n return match ? match[1] : null;\r\n}\r\n", "\uFEFFimport type * as Core from \"../types\";\r\nimport { generateRandomBytes } from \"../helpers/Crypto\";\r\nimport { isUuid, extractUuid } from \"../helpers/Regex\";\r\n\r\ndeclare var GetGlobalContext: any;\r\ndeclare var Xrm: any;\r\n\r\n// function isNodeEnv(): boolean {\r\n// // tslint:disable:strict-type-predicates\r\n// return Object.prototype.toString.call(typeof process !== \"undefined\" ? process : 0) === \"[object process]\";\r\n// }\r\n\r\n// function getGlobalObject(): T {\r\n// return (isNodeEnv() ? global : typeof window !== \"undefined\" ? window : typeof self !== \"undefined\" ? self : {}) as T;\r\n// }\r\n\r\nconst downloadChunkSize = 4194304;\r\n\r\nexport class Utility {\r\n /**\r\n * Builds parametes for a funciton. Returns '()' (if no parameters) or '([params])?[query]'\r\n *\r\n * @param {Object} [parameters] - Function's input parameters. Example: { param1: \"test\", param2: 3 }.\r\n * @returns {string}\r\n */\r\n static buildFunctionParameters(parameters?: any): Core.FunctionParameters {\r\n if (parameters) {\r\n const parameterNames = Object.keys(parameters);\r\n const functionParams: string[] = [];\r\n const urlQuery: string[] = [];\r\n\r\n for (let i = 1; i <= parameterNames.length; i++) {\r\n const parameterName = parameterNames[i - 1];\r\n let value = parameters[parameterName];\r\n\r\n if (value == null) continue;\r\n\r\n if (typeof value === \"string\" && !value.startsWith(\"Microsoft.Dynamics.CRM\") && !isUuid(value)) {\r\n value = `'${value}'`;\r\n } else if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n\r\n functionParams.push(`${parameterName}=@p${i}`);\r\n urlQuery.push(`@p${i}=${extractUuid(value) || value}`);\r\n }\r\n\r\n return {\r\n key: `(${functionParams.join(\",\")})`,\r\n queryParams: urlQuery,\r\n };\r\n } else {\r\n return {\r\n key: \"()\",\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Parses a paging cookie returned in response\r\n *\r\n * @param {string} pageCookies - Page cookies returned in @Microsoft.Dynamics.CRM.fetchxmlpagingcookie.\r\n * @param {number} currentPageNumber - A current page number. Fix empty paging-cookie for complex fetch xmls.\r\n * @returns {{cookie: \"\", number: 0, next: 1}}\r\n */\r\n static getFetchXmlPagingCookie(pageCookies: string = \"\", currentPageNumber: number = 1): Core.FetchXmlCookie {\r\n //get the page cokies\r\n pageCookies = decodeURIComponent(decodeURIComponent(pageCookies));\r\n\r\n const info = /pagingcookie=\"()/.exec(pageCookies);\r\n\r\n if (info != null) {\r\n let page = parseInt(info[2]);\r\n return {\r\n cookie: info[1]\r\n .replace(//g, \">\")\r\n .replace(/\\\"/g, \"'\")\r\n .replace(/\\'/g, \"&\" + \"quot;\"),\r\n page: page,\r\n nextPage: page + 1,\r\n };\r\n } else {\r\n //http://stackoverflow.com/questions/41262772/execution-of-fetch-xml-using-web-api-dynamics-365 workaround\r\n return {\r\n cookie: \"\",\r\n page: currentPageNumber,\r\n nextPage: currentPageNumber + 1,\r\n };\r\n }\r\n }\r\n\r\n // static isNodeEnv = isNodeEnv;\r\n\r\n static downloadChunkSize = downloadChunkSize;\r\n\r\n /**\r\n * Converts a response to a reference object\r\n *\r\n * @param {Object} responseData - Response object\r\n * @returns {ReferenceObject}\r\n */\r\n static convertToReferenceObject(responseData: any): Core.ReferenceObject {\r\n const result = /\\/(\\w+)\\(([0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12})/i.exec(responseData[\"@odata.id\"]);\r\n return { id: result![2], collection: result![1], oDataContext: responseData[\"@odata.context\"] };\r\n }\r\n\r\n /**\r\n * Checks whether the value is JS Null.\r\n * @param {Object} value\r\n * @returns {boolean}\r\n */\r\n static isNull(value: any): boolean {\r\n return typeof value === \"undefined\" || value == null;\r\n }\r\n\r\n /** Generates UUID */\r\n static generateUUID(): string {\r\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) => (c ^ (generateRandomBytes()[0] & (15 >> (c / 4)))).toString(16));\r\n }\r\n\r\n static getXrmContext(): any {\r\n if (typeof GetGlobalContext !== \"undefined\") {\r\n return GetGlobalContext();\r\n } else {\r\n if (typeof Xrm !== \"undefined\") {\r\n //d365 v.9.0\r\n if (!Utility.isNull(Xrm.Utility) && !Utility.isNull(Xrm.Utility.getGlobalContext)) {\r\n return Xrm.Utility.getGlobalContext();\r\n } else if (!Utility.isNull(Xrm.Page) && !Utility.isNull(Xrm.Page.context)) {\r\n return Xrm.Page.context;\r\n }\r\n }\r\n }\r\n\r\n throw new Error(\r\n \"Xrm Context is not available. In most cases, it can be resolved by adding a reference to a ClientGlobalContext.js.aspx. Please refer to MSDN documentation for more details.\"\r\n );\r\n }\r\n\r\n // static getXrmUtility(): any {\r\n // return typeof Xrm !== \"undefined\" ? Xrm.Utility : null;\r\n // }\r\n\r\n static getClientUrl(): string {\r\n const context = Utility.getXrmContext();\r\n\r\n let clientUrl = context.getClientUrl();\r\n\r\n if (clientUrl.match(/\\/$/)) {\r\n clientUrl = clientUrl.substring(0, clientUrl.length - 1);\r\n }\r\n return clientUrl;\r\n }\r\n\r\n /**\r\n * Checks whether the app is currently running in a Dynamics Portals Environment.\r\n *\r\n * In that case we switch to the Web API for Dynamics Portals.\r\n * @returns {boolean}\r\n */\r\n static isRunningWithinPortals(): boolean {\r\n return global.DWA_BROWSER ? !!global.window.shell : false;\r\n }\r\n\r\n static isObject(obj: any): boolean {\r\n return typeof obj === \"object\" && !!obj && !Array.isArray(obj) && Object.prototype.toString.call(obj) !== \"[object Date]\";\r\n }\r\n\r\n static copyObject(src: any, excludeProps?: string[]): T {\r\n let target = {};\r\n for (let prop in src) {\r\n if (src.hasOwnProperty(prop) && !excludeProps?.includes(prop)) {\r\n // if the value is a nested object, recursively copy all its properties\r\n if (Utility.isObject(src[prop])) {\r\n target[prop] = Utility.copyObject(src[prop]);\r\n } else if (Array.isArray(src[prop])) {\r\n target[prop] = src[prop].slice();\r\n } else {\r\n target[prop] = src[prop];\r\n }\r\n }\r\n }\r\n return target;\r\n }\r\n\r\n static copyRequest(src: any, excludeProps: string[] = []): Core.InternalRequest {\r\n //todo: do we need to include \"data\" in here?\r\n if (!excludeProps.includes(\"signal\")) excludeProps.push(\"signal\");\r\n\r\n const result = Utility.copyObject(src, excludeProps);\r\n result.signal = src.signal;\r\n\r\n return result;\r\n }\r\n\r\n static setFileChunk(request: Core.InternalRequest, fileBuffer: Uint8Array | Buffer, chunkSize: number, offset: number): void {\r\n offset = offset || 0;\r\n\r\n const count = offset + chunkSize > fileBuffer.length ? fileBuffer.length % chunkSize : chunkSize;\r\n\r\n let content: any;\r\n\r\n if (global.DWA_BROWSER) {\r\n content = new Uint8Array(count);\r\n for (let i = 0; i < count; i++) {\r\n content[i] = fileBuffer[offset + i];\r\n }\r\n } else {\r\n content = fileBuffer.slice(offset, offset + count);\r\n }\r\n\r\n request.data = content;\r\n request.contentRange = \"bytes \" + offset + \"-\" + (offset + count - 1) + \"/\" + fileBuffer.length;\r\n }\r\n\r\n static convertToFileBuffer(binaryString: string): Uint8Array | Buffer {\r\n if (!global.DWA_BROWSER) return Buffer.from(binaryString, \"binary\");\r\n\r\n const bytes = new Uint8Array(binaryString.length);\r\n for (var i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n return bytes;\r\n }\r\n}\r\n", "\uFEFFimport { AccessToken } from \"../dynamics-web-api\";\r\nimport { extractUuid } from \"./Regex\";\r\n\r\nexport interface DynamicsWebApiError extends Error {\r\n status: number;\r\n}\r\n\r\nfunction throwParameterError(functionName: string, parameterName: string, type: string | null | undefined): void {\r\n throw new Error(\r\n type ? `${functionName} requires a ${parameterName} parameter to be of type ${type}.` : `${functionName} requires a ${parameterName} parameter.`\r\n );\r\n}\r\n\r\nexport class ErrorHelper {\r\n static handleErrorResponse(req): void {\r\n throw new Error(`Error: ${req.status}: ${req.message}`);\r\n }\r\n\r\n static parameterCheck(parameter: any, functionName: string, parameterName: string, type?: string): void {\r\n if (typeof parameter === \"undefined\" || parameter === null || parameter === \"\") {\r\n throwParameterError(functionName, parameterName, type);\r\n }\r\n }\r\n\r\n static stringParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter !== \"string\") {\r\n throwParameterError(functionName, parameterName, \"String\");\r\n }\r\n }\r\n\r\n static maxLengthStringParameterCheck(parameter: string | null, functionName: string, parameterName: string, maxLength: number): void {\r\n if (!parameter) return;\r\n\r\n if (parameter.length > maxLength) {\r\n throw new Error(`${parameterName} has a ${maxLength} character limit.`);\r\n }\r\n }\r\n\r\n static arrayParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (parameter.constructor !== Array) {\r\n throwParameterError(functionName, parameterName, \"Array\");\r\n }\r\n }\r\n\r\n static stringOrArrayParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (parameter.constructor !== Array && typeof parameter !== \"string\") {\r\n throwParameterError(functionName, parameterName, \"String or Array\");\r\n }\r\n }\r\n\r\n static numberParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter != \"number\") {\r\n if (typeof parameter === \"string\" && parameter) {\r\n if (!isNaN(parseInt(parameter))) {\r\n return;\r\n }\r\n }\r\n throwParameterError(functionName, parameterName, \"Number\");\r\n }\r\n }\r\n\r\n static batchIsEmpty(): Error[] {\r\n return [\r\n new Error(\r\n \"Payload of the batch operation is empty. Please make that you have other operations in between startBatch() and executeBatch() to successfuly build a batch payload.\"\r\n ),\r\n ];\r\n }\r\n\r\n static handleHttpError(parsedError: any, parameters?: any): DynamicsWebApiError {\r\n const error = new Error();\r\n\r\n Object.keys(parsedError).forEach((k) => {\r\n error[k] = parsedError[k];\r\n });\r\n\r\n if (parameters) {\r\n Object.keys(parameters).forEach((k) => {\r\n error[k] = parameters[k];\r\n });\r\n }\r\n\r\n return error;\r\n }\r\n\r\n static boolParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter != \"boolean\") {\r\n throwParameterError(functionName, parameterName, \"Boolean\");\r\n }\r\n }\r\n\r\n /**\r\n * Private function used to check whether required parameter is a valid GUID\r\n * @param parameter The GUID parameter to check\r\n * @param functionName\r\n * @param parameterName\r\n * @returns\r\n */\r\n static guidParameterCheck(parameter: any, functionName: string, parameterName: string): string {\r\n const match = extractUuid(parameter);\r\n if (!match) throwParameterError(functionName, parameterName, \"GUID String\");\r\n\r\n return match!;\r\n }\r\n\r\n static keyParameterCheck(parameter: any, functionName: string, parameterName: string): string | undefined {\r\n try {\r\n ErrorHelper.stringParameterCheck(parameter, functionName, parameterName);\r\n\r\n //check if the param is a guid\r\n const match = extractUuid(parameter);\r\n if (match) return match;\r\n\r\n //check the alternate key\r\n const alternateKeys = parameter.split(\",\");\r\n\r\n if (alternateKeys.length) {\r\n for (let i = 0; i < alternateKeys.length; i++) {\r\n alternateKeys[i] = alternateKeys[i].trim().replace(/\"/g, \"'\");\r\n /^[\\w\\d\\_]+\\=(.+)$/i.exec(alternateKeys[i])![0];\r\n }\r\n }\r\n\r\n return alternateKeys.join(\",\");\r\n } catch (error) {\r\n throwParameterError(functionName, parameterName, \"String representing GUID or Alternate Key\");\r\n }\r\n }\r\n\r\n static callbackParameterCheck(callbackParameter: () => Promise, functionName: string, parameterName: string): void {\r\n if (typeof callbackParameter != \"function\") {\r\n throwParameterError(functionName, parameterName, \"Function\");\r\n }\r\n }\r\n\r\n static throwBatchIncompatible(functionName: string, isBatch: boolean): void {\r\n if (isBatch) {\r\n isBatch = false;\r\n throw new Error(functionName + \" cannot be used in a BATCH request.\");\r\n }\r\n }\r\n\r\n static throwBatchNotStarted(isBatch: boolean): void {\r\n if (!isBatch) {\r\n throw new Error(\r\n \"Batch operation has not been started. Please call a DynamicsWebApi.startBatch() function prior to calling DynamicsWebApi.executeBatch() to perform a batch request correctly.\"\r\n );\r\n }\r\n }\r\n}\r\n", "class DWA {\r\n\tstatic Prefer = class {\r\n\t\tstatic ReturnRepresentation: string = \"return=representation\";\r\n\t\tstatic Annotations = class {\r\n\t\t\tstatic AssociatedNavigationProperty: string = \"Microsoft.Dynamics.CRM.associatednavigationproperty\";\r\n\t\t\tstatic LookupLogicalName: string = \"Microsoft.Dynamics.CRM.lookuplogicalname\";\r\n\t\t\tstatic All: string = \"*\";\r\n\t\t\tstatic FormattedValue: string = \"OData.Community.Display.V1.FormattedValue\";\r\n\t\t\tstatic FetchXmlPagingCookie: string = \"Microsoft.Dynamics.CRM.fetchxmlpagingcookie\";\r\n\t\t};\r\n\t\tstatic IncludeAnnotations: string = \"odata.include-annotations\";\r\n\t\tstatic get(annotation: string) {\r\n\t\t\treturn `${DWA.Prefer.IncludeAnnotations}=\"${annotation}\"`;\r\n\t\t}\r\n\t};\r\n}\r\n\r\nexport { DWA };\r\n", "\uFEFFexport function dateReviver(key: string, value: any): Date {\r\n\tif (typeof value === \"string\") {\r\n\t\tconst a = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:Z|[-+]\\d{2}:\\d{2})$/.exec(value);\r\n\t\tif (a) {\r\n\t\t\treturn new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));\r\n\t\t}\r\n\t}\r\n\treturn value;\r\n}\r\n", "\uFEFFimport { DWA } from \"../../dwa\";\r\nimport { Utility } from \"../../utils/Utility\";\r\nimport { ErrorHelper, DynamicsWebApiError } from \"../../helpers/ErrorHelper\";\r\nimport { dateReviver } from \"./dateReviver\";\r\nimport type * as Core from \"../../types\";\r\nimport { extractUuidFromUrl } from \"../../helpers/Regex\";\r\n\r\nfunction getFormattedKeyValue(keyName: string, value: any): any[] {\r\n let newKey: string | null = null;\r\n if (keyName.indexOf(\"@\") !== -1) {\r\n const format = keyName.split(\"@\");\r\n switch (format[1]) {\r\n case \"odata.context\":\r\n newKey = \"oDataContext\";\r\n break;\r\n case \"odata.count\":\r\n newKey = \"oDataCount\";\r\n value = value != null ? parseInt(value) : 0;\r\n break;\r\n case \"odata.nextLink\":\r\n newKey = \"oDataNextLink\";\r\n break;\r\n case \"odata.deltaLink\":\r\n newKey = \"oDataDeltaLink\";\r\n break;\r\n case DWA.Prefer.Annotations.FormattedValue:\r\n newKey = format[0] + \"_Formatted\";\r\n break;\r\n case DWA.Prefer.Annotations.AssociatedNavigationProperty:\r\n newKey = format[0] + \"_NavigationProperty\";\r\n break;\r\n case DWA.Prefer.Annotations.LookupLogicalName:\r\n newKey = format[0] + \"_LogicalName\";\r\n break;\r\n }\r\n }\r\n\r\n return [newKey, value];\r\n}\r\n\r\n/**\r\n *\r\n * @param {any} object - parsed JSON object\r\n * @param {any} parseParams - parameters for parsing the response\r\n * @returns {any} parsed batch response\r\n */\r\nfunction parseData(object: any, parseParams?: any): any {\r\n if (parseParams) {\r\n if (parseParams.isRef && object[\"@odata.id\"] != null) {\r\n return Utility.convertToReferenceObject(object);\r\n }\r\n\r\n if (parseParams.toCount) {\r\n return getFormattedKeyValue(\"@odata.count\", object[\"@odata.count\"])[1] || 0;\r\n }\r\n }\r\n\r\n const keys = Object.keys(object);\r\n\r\n for (let i = 0; i < keys.length; i++) {\r\n const currentKey = keys[i];\r\n\r\n if (object[currentKey] != null) {\r\n if (object[currentKey].constructor === Array) {\r\n for (var j = 0; j < object[currentKey].length; j++) {\r\n object[currentKey][j] = parseData(object[currentKey][j]);\r\n }\r\n } else if (typeof object[currentKey] === \"object\") {\r\n parseData(object[currentKey]);\r\n }\r\n }\r\n\r\n //parse formatted values\r\n let formattedKeyValue = getFormattedKeyValue(currentKey, object[currentKey]);\r\n if (formattedKeyValue[0]) {\r\n object[formattedKeyValue[0]] = formattedKeyValue[1];\r\n }\r\n\r\n //parse aliased values\r\n if (currentKey.indexOf(\"_x002e_\") !== -1) {\r\n const aliasKeys = currentKey.split(\"_x002e_\");\r\n\r\n if (!object.hasOwnProperty(aliasKeys[0])) {\r\n object[aliasKeys[0]] = { _dwaType: \"alias\" };\r\n }\r\n //throw an error if there is already a property which is not an 'alias'\r\n else if (\r\n typeof object[aliasKeys[0]] !== \"object\" ||\r\n (typeof object[aliasKeys[0]] === \"object\" && !object[aliasKeys[0]].hasOwnProperty(\"_dwaType\"))\r\n ) {\r\n throw new Error(\"The alias name of the linked entity must be unique!\");\r\n }\r\n\r\n object[aliasKeys[0]][aliasKeys[1]] = object[currentKey];\r\n\r\n //aliases also contain formatted values\r\n formattedKeyValue = getFormattedKeyValue(aliasKeys[1], object[currentKey]);\r\n if (formattedKeyValue[0]) {\r\n object[aliasKeys[0]][formattedKeyValue[0]] = formattedKeyValue[1];\r\n }\r\n }\r\n }\r\n\r\n if (parseParams) {\r\n if (parseParams.hasOwnProperty(\"pageNumber\") && object[\"@\" + DWA.Prefer.Annotations.FetchXmlPagingCookie] != null) {\r\n object.PagingInfo = Utility.getFetchXmlPagingCookie(object[\"@\" + DWA.Prefer.Annotations.FetchXmlPagingCookie], parseParams.pageNumber);\r\n }\r\n }\r\n\r\n return object;\r\n}\r\n\r\nconst responseHeaderRegex = /^([^()<>@,;:\\\\\"\\/[\\]?={} \\t]+)\\s?:\\s?(.*)/;\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction parseBatchHeaders(text: string): any {\r\n const ctx = { position: 0 };\r\n const headers = {};\r\n let parts;\r\n let line;\r\n let pos;\r\n\r\n do {\r\n pos = ctx.position;\r\n line = readLine(text, ctx);\r\n parts = responseHeaderRegex.exec(line);\r\n if (parts !== null) {\r\n headers[parts[1].toLowerCase()] = parts[2];\r\n } else {\r\n // Whatever was found is not a header, so reset the context position.\r\n ctx.position = pos;\r\n }\r\n } while (line && parts);\r\n\r\n return headers;\r\n}\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction readLine(text: string, ctx: { position: number }): string | null {\r\n return readTo(text, ctx, \"\\r\\n\");\r\n}\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction readTo(text: string, ctx: { position: number }, str: string): string | null {\r\n const start = ctx.position || 0;\r\n let end = text.length;\r\n if (str) {\r\n end = text.indexOf(str, start);\r\n if (end === -1) {\r\n return null;\r\n }\r\n ctx.position = end + str.length;\r\n } else {\r\n ctx.position = end;\r\n }\r\n\r\n return text.substring(start, end);\r\n}\r\n\r\n//partially taken from https://github.com/emiltholin/google-api-batch-utils\r\n/**\r\n *\r\n * @param {string} response - response that needs to be parsed\r\n * @param {Array} parseParams - parameters for parsing the response\r\n * @param {Number} [requestNumber] - number of the request\r\n * @returns {any} parsed batch response\r\n */\r\nfunction parseBatchResponse(response: string, parseParams: any, requestNumber: number = 0): (string | undefined | DynamicsWebApiError | Number)[] {\r\n // Not the same delimiter in the response as we specify ourselves in the request,\r\n // so we have to extract it.\r\n const delimiter = response.substr(0, response.indexOf(\"\\r\\n\"));\r\n const batchResponseParts = response.split(delimiter);\r\n // The first part will always be an empty string. Just remove it.\r\n batchResponseParts.shift();\r\n // The last part will be the \"--\". Just remove it.\r\n batchResponseParts.pop();\r\n\r\n let result: (string | undefined | DynamicsWebApiError | Number)[] = [];\r\n for (let i = 0; i < batchResponseParts.length; i++) {\r\n let batchResponse = batchResponseParts[i];\r\n if (batchResponse.indexOf(\"--changesetresponse_\") > -1) {\r\n batchResponse = batchResponse.trim();\r\n const batchToProcess = batchResponse.substring(batchResponse.indexOf(\"\\r\\n\") + 1).trim();\r\n\r\n result = result.concat(parseBatchResponse(batchToProcess, parseParams, requestNumber));\r\n } else {\r\n //check http status\r\n const httpStatusReg = /HTTP\\/?\\s*[\\d.]*\\s+(\\d{3})\\s+([\\w\\s]*)$/gm.exec(batchResponse);\r\n //todo: add error handler for httpStatus and httpStatusMessage; remove \"!\" operator\r\n const httpStatus = parseInt(httpStatusReg![1]);\r\n const httpStatusMessage = httpStatusReg![2].trim();\r\n\r\n const responseData = batchResponse.substring(batchResponse.indexOf(\"{\"), batchResponse.lastIndexOf(\"}\") + 1);\r\n\r\n if (!responseData) {\r\n if (/Content-Type: text\\/plain/i.test(batchResponse)) {\r\n const plainContentReg = /\\w+$/gi.exec(batchResponse.trim());\r\n const plainContent = plainContentReg && plainContentReg.length ? plainContentReg[0] : undefined;\r\n\r\n //check if a plain content is a number or not\r\n result.push(isNaN(Number(plainContent)) ? plainContent : Number(plainContent));\r\n } else {\r\n if (parseParams.length && parseParams[requestNumber] && parseParams[requestNumber].hasOwnProperty(\"valueIfEmpty\")) {\r\n result.push(parseParams[requestNumber].valueIfEmpty);\r\n } else {\r\n const entityUrl = /OData-EntityId.+/i.exec(batchResponse);\r\n\r\n if (entityUrl && entityUrl.length) {\r\n const guidResult = extractUuidFromUrl(entityUrl[0]);\r\n result.push(guidResult ? guidResult : undefined);\r\n } else {\r\n result.push(undefined);\r\n }\r\n }\r\n }\r\n } else {\r\n const parsedResponse = parseData(JSON.parse(responseData, dateReviver), parseParams[requestNumber]);\r\n\r\n if (httpStatus >= 400) {\r\n const responseHeaders = parseBatchHeaders(\r\n //todo: add error handler for httpStatusReg; remove \"!\" operator\r\n batchResponse.substring(batchResponse.indexOf(httpStatusReg![0]) + httpStatusReg![0].length + 1, batchResponse.indexOf(\"{\"))\r\n );\r\n\r\n result.push(\r\n ErrorHelper.handleHttpError(parsedResponse, {\r\n status: httpStatus,\r\n statusText: httpStatusMessage,\r\n statusMessage: httpStatusMessage,\r\n headers: responseHeaders,\r\n })\r\n );\r\n } else {\r\n result.push(parsedResponse);\r\n }\r\n }\r\n }\r\n\r\n requestNumber++;\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction base64ToString(base64: string): string {\r\n return global.DWA_BROWSER ? global.window.atob(base64) : Buffer.from(base64, \"base64\").toString(\"binary\");\r\n}\r\n\r\nfunction parseFileResponse(response: any, responseHeaders: any, parseParams: any): Core.FileParseResult {\r\n let data = response;\r\n\r\n if (parseParams.hasOwnProperty(\"parse\")) {\r\n data = JSON.parse(data).value;\r\n data = base64ToString(data);\r\n }\r\n\r\n var parseResult: Core.FileParseResult = {\r\n value: data,\r\n };\r\n\r\n if (responseHeaders[\"x-ms-file-name\"]) parseResult.fileName = responseHeaders[\"x-ms-file-name\"];\r\n\r\n if (responseHeaders[\"x-ms-file-size\"]) parseResult.fileSize = parseInt(responseHeaders[\"x-ms-file-size\"]);\r\n\r\n if (hasHeader(responseHeaders, \"Location\")) parseResult.location = getHeader(responseHeaders, \"Location\");\r\n\r\n return parseResult;\r\n}\r\n\r\nfunction hasHeader(headers: any, name: string): boolean {\r\n return headers.hasOwnProperty(name) || headers.hasOwnProperty(name.toLowerCase());\r\n}\r\n\r\nfunction getHeader(headers: any, name: string): string {\r\n if (headers[name]) return headers[name];\r\n\r\n return headers[name.toLowerCase()];\r\n}\r\n\r\n/**\r\n *\r\n * @param {string} response - response that needs to be parsed\r\n * @param {Array} responseHeaders - response headers\r\n * @param {Array} parseParams - parameters for parsing the response\r\n * @returns {any} parsed response\r\n */\r\nexport function parseResponse(response: string, responseHeaders: any, parseParams: any[]): any {\r\n let parseResult: any = undefined;\r\n if (response.length) {\r\n if (response.indexOf(\"--batchresponse_\") > -1) {\r\n const batch = parseBatchResponse(response, parseParams);\r\n\r\n parseResult = parseParams.length === 1 && parseParams[0].convertedToBatch ? batch[0] : batch;\r\n } else {\r\n if (hasHeader(responseHeaders, \"Content-Disposition\")) {\r\n parseResult = parseFileResponse(response, responseHeaders, parseParams[0]);\r\n } else {\r\n const contentType = getHeader(responseHeaders, \"Content-Type\");\r\n if (contentType.startsWith(\"application/json\")) {\r\n parseResult = parseData(JSON.parse(response, dateReviver), parseParams[0]);\r\n } else {\r\n parseResult = isNaN(Number(response)) ? response : Number(response);\r\n }\r\n }\r\n }\r\n } else {\r\n if (parseParams.length && parseParams[0].hasOwnProperty(\"valueIfEmpty\")) {\r\n parseResult = parseParams[0].valueIfEmpty;\r\n } else if (hasHeader(responseHeaders, \"OData-EntityId\")) {\r\n const entityUrl = getHeader(responseHeaders, \"OData-EntityId\");\r\n\r\n const guidResult = extractUuidFromUrl(entityUrl);\r\n\r\n if (guidResult) {\r\n parseResult = guidResult;\r\n }\r\n } else if (hasHeader(responseHeaders, \"Location\")) {\r\n parseResult = {\r\n location: getHeader(responseHeaders, \"Location\"),\r\n };\r\n\r\n if (responseHeaders[\"x-ms-chunk-size\"]) parseResult.chunkSize = parseInt(responseHeaders[\"x-ms-chunk-size\"]);\r\n }\r\n }\r\n\r\n return parseResult;\r\n}\r\n", "\uFEFFexport function parseResponseHeaders(headerStr: string): any {\r\n\tconst headers = {};\r\n\tif (!headerStr) {\r\n\t\treturn headers;\r\n\t}\r\n\tconst headerPairs = headerStr.split(\"\\u000d\\u000a\");\r\n\tfor (let i = 0, ilen = headerPairs.length; i < ilen; i++) {\r\n\t\tconst headerPair = headerPairs[i];\r\n\t\tconst index = headerPair.indexOf(\"\\u003a\\u0020\");\r\n\t\tif (index > 0) {\r\n\t\t\theaders[headerPair.substring(0, index)] = headerPair.substring(index + 2);\r\n\t\t}\r\n\t}\r\n\treturn headers;\r\n}\r\n", "\uFEFFimport type * as Core from \"../types\";\r\nimport { ErrorHelper } from \"./../helpers/ErrorHelper\";\r\nimport { parseResponse } from \"./helpers/parseResponse\";\r\nimport { parseResponseHeaders } from \"./helpers/parseResponseHeaders\";\r\n\r\nexport function executeRequest(options: Core.RequestOptions): Promise {\r\n return new Promise((resolve, reject) => {\r\n _executeRequest(options, resolve, reject);\r\n });\r\n}\r\n\r\nfunction _executeRequest(\r\n options: Core.RequestOptions,\r\n successCallback: (response: Core.WebApiResponse) => void,\r\n errorCallback: (error: Core.WebApiErrorResponse | Core.WebApiErrorResponse[]) => void\r\n) {\r\n const data = options.data;\r\n const headers = options.headers;\r\n const responseParams = options.responseParams;\r\n const signal = options.abortSignal;\r\n\r\n if (signal?.aborted) {\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n name: \"AbortError\",\r\n code: 20,\r\n message: \"The user aborted a request.\",\r\n })\r\n );\r\n\r\n return;\r\n }\r\n\r\n let request = new XMLHttpRequest();\r\n request.open(options.method, options.uri, options.isAsync || false);\r\n\r\n //set additional headers\r\n for (let key in headers) {\r\n request.setRequestHeader(key, headers[key]);\r\n }\r\n\r\n request.onreadystatechange = function () {\r\n if (request.readyState === 4) {\r\n if (signal) signal.removeEventListener(\"abort\", abort);\r\n\r\n switch (request.status) {\r\n case 200: // Success with content returned in response body.\r\n case 201: // Success with content returned in response body.\r\n case 204: // Success with no content returned in response body.\r\n case 206: // Success with partial content.\r\n case 304: {\r\n // Success with Not Modified\r\n const responseHeaders = parseResponseHeaders(request.getAllResponseHeaders());\r\n const responseData = parseResponse(request.responseText, responseHeaders, responseParams[options.requestId]);\r\n\r\n const response = {\r\n data: responseData,\r\n headers: responseHeaders,\r\n status: request.status,\r\n };\r\n\r\n request = null as any;\r\n\r\n successCallback(response);\r\n break;\r\n }\r\n case 0:\r\n break; //response will be handled by onerror\r\n default:\r\n if (!request) break; //response was handled somewhere else\r\n\r\n // All other statuses are error cases.\r\n let error;\r\n let headers;\r\n try {\r\n headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n const errorParsed = parseResponse(request.responseText, headers, responseParams[options.requestId]);\r\n\r\n if (Array.isArray(errorParsed)) {\r\n errorCallback(errorParsed);\r\n break;\r\n }\r\n\r\n error = errorParsed.error;\r\n } catch (e) {\r\n if (request.response.length > 0) {\r\n error = { message: request.response };\r\n } else {\r\n error = { message: \"Unexpected Error\" };\r\n }\r\n }\r\n\r\n const errorParameters = {\r\n status: request.status,\r\n statusText: request.statusText,\r\n headers: headers,\r\n };\r\n\r\n request = null as any;\r\n\r\n errorCallback(ErrorHelper.handleHttpError(error, errorParameters));\r\n\r\n break;\r\n }\r\n }\r\n };\r\n\r\n if (options.timeout) {\r\n request.timeout = options.timeout;\r\n }\r\n\r\n request.onerror = function () {\r\n const headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n status: request.status,\r\n statusText: request.statusText,\r\n message: request.responseText || \"Network Error\",\r\n headers: headers,\r\n })\r\n );\r\n request = null as any;\r\n };\r\n\r\n request.ontimeout = function () {\r\n const headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n name: \"TimeoutError\",\r\n status: request.status,\r\n statusText: request.statusText,\r\n message: request.responseText || \"Request Timed Out\",\r\n headers: headers,\r\n })\r\n );\r\n request = null as any;\r\n };\r\n\r\n //browser abort\r\n request.onabort = function () {\r\n if (!request) return;\r\n\r\n const headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n status: request.status,\r\n statusText: request.statusText,\r\n message: \"Request aborted\",\r\n headers: headers,\r\n })\r\n );\r\n request = null as any;\r\n };\r\n\r\n //manual abort/cancellation\r\n const abort = () => {\r\n if (!request) return;\r\n\r\n const headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n name: \"AbortError\",\r\n code: 20,\r\n status: request.status,\r\n statusText: request.statusText,\r\n message: \"The user aborted a request.\",\r\n headers: headers,\r\n })\r\n );\r\n\r\n request.abort();\r\n\r\n request = null as any;\r\n };\r\n\r\n if (signal) {\r\n signal.addEventListener(\"abort\", abort);\r\n }\r\n\r\n data ? request.send(data) : request.send();\r\n\r\n //called for testing\r\n if (XhrWrapper.afterSendEvent) XhrWrapper.afterSendEvent();\r\n}\r\n\r\n/**\r\n * Sends a request to given URL with given parameters\r\n */\r\nexport class XhrWrapper {\r\n //for testing\r\n static afterSendEvent: () => void;\r\n}\r\n", "\uFEFFimport { ConfigurationUtility } from \"./utils/Config\";\r\nimport { Utility } from \"./utils/Utility\";\r\nimport { ErrorHelper } from \"./helpers/ErrorHelper\";\r\nimport { RequestClient } from \"./client/RequestClient\";\r\nimport type { InternalRequest, WebApiResponse } from \"./types\";\r\n\r\n/**\r\n * Microsoft Dynamics CRM Web API helper library written in JavaScript.\r\n * It is compatible with: Dynamics 365 (online), Dynamics 365 (on-premise), Dynamics CRM 2016, Dynamics CRM Online.\r\n */\r\nexport class DynamicsWebApi {\r\n private _config = ConfigurationUtility.default();\r\n private _isBatch = false;\r\n private _batchRequestId: string | null = null;\r\n\r\n /**\r\n * Initializes a new instance of DynamicsWebApi\r\n * @param config - Configuration object\r\n */\r\n constructor(config?: Config) {\r\n ConfigurationUtility.merge(this._config, config);\r\n }\r\n\r\n /**\r\n\t * Merges provided configuration properties with an existing one.\r\n\t *\r\n\t * @param {DynamicsWebApi.Config} config - Configuration\r\n\t * @example\r\n\t dynamicsWebApi.setConfig({ serverUrl: 'https://contoso.api.crm.dynamics.com/' });\r\n\t */\r\n setConfig = (config: Config) => ConfigurationUtility.merge(this._config, config);\r\n\r\n private _makeRequest = async (request: InternalRequest): Promise => {\r\n request.isBatch = this._isBatch;\r\n if (this._batchRequestId) request.requestId = this._batchRequestId;\r\n return RequestClient.makeRequest(request, this._config);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a new record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n * @example\r\n *const lead = {\r\n * subject: \"Test WebAPI\",\r\n * firstname: \"Test\",\r\n * lastname: \"WebAPI\",\r\n * jobtitle: \"Title\"\r\n *};\r\n *\r\n *const request = {\r\n * data: lead,\r\n * collection: \"leads\",\r\n * returnRepresentation: true\r\n *}\r\n *\r\n *const response = await dynamicsWebApi.create(request);\r\n *\r\n */\r\n create = async (request: CreateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.create\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"create\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"POST\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n * @example\r\n *const request = {\r\n * key: '7d577253-3ef0-4a0a-bb7f-8335c2596e70',\r\n * collection: \"leads\",\r\n * select: [\"fullname\", \"subject\"],\r\n * ifnonematch: 'W/\"468026\"',\r\n * includeAnnotations: \"OData.Community.Display.V1.FormattedValue\"\r\n *};\r\n *\r\n *const response = await dynamicsWebApi.retrieve(request);\r\n */\r\n retrieve = async (request: RetrieveRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieve\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"retrieve\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"GET\";\r\n internalRequest.responseParameters = {\r\n isRef: internalRequest.select?.length === 1 && internalRequest.select[0].endsWith(\"/$ref\"),\r\n };\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n update = async (request: UpdateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.update\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"update\";\r\n } else internalRequest = request;\r\n\r\n //Metadata definitions, cannot be updated using \"PATCH\" method\r\n if (!internalRequest.method)\r\n internalRequest.method = /EntityDefinitions|RelationshipDefinitions|GlobalOptionSetDefinitions/.test(internalRequest.collection || \"\")\r\n ? \"PUT\"\r\n : \"PATCH\";\r\n\r\n internalRequest.responseParameters = { valueIfEmpty: true };\r\n\r\n if (internalRequest.ifmatch == null) {\r\n internalRequest.ifmatch = \"*\"; //to prevent upsert\r\n }\r\n\r\n //copy locally\r\n const ifmatch = internalRequest.ifmatch;\r\n\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifmatch && error.status === 412) {\r\n //precondition failed - not updated\r\n return false; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a single value in the record.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateSingleProperty = async (request: UpdateSinglePropertyRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateSingleProperty\", \"request\");\r\n ErrorHelper.parameterCheck(request.fieldValuePair, \"DynamicsWebApi.updateSingleProperty\", \"request.fieldValuePair\");\r\n\r\n var field = Object.keys(request.fieldValuePair)[0];\r\n var fieldValue = request.fieldValuePair[field];\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.navigationProperty = field;\r\n internalRequest.data = { value: fieldValue };\r\n internalRequest.functionName = \"updateSingleProperty\";\r\n internalRequest.method = \"PUT\";\r\n\r\n delete internalRequest[\"fieldValuePair\"];\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a record.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteRecord = async (request: DeleteRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteRecord\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"deleteRecord\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.responseParameters = { valueIfEmpty: true };\r\n\r\n //copy locally\r\n const ifmatch = internalRequest.ifmatch;\r\n\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifmatch && error.status === 412) {\r\n //precondition failed - not updated\r\n return false; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to upsert a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n upsert = async (request: UpsertRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.upsert\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"PATCH\";\r\n internalRequest.functionName = \"upsert\";\r\n\r\n //copy locally\r\n const ifnonematch = internalRequest.ifnonematch;\r\n const ifmatch = internalRequest.ifmatch;\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifnonematch && error.status === 412) {\r\n //if prevent update\r\n return null; //todo: check this\r\n } else if (ifmatch && error.status === 404) {\r\n //if prevent create\r\n return null; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n private _uploadFileChunk = async (request: InternalRequest, fileBytes: Uint8Array | Buffer, chunkSize: number, offset: number = 0): Promise => {\r\n // offset = offset || 0;\r\n Utility.setFileChunk(request, fileBytes, chunkSize, offset);\r\n\r\n await this._makeRequest(request);\r\n\r\n offset += chunkSize;\r\n if (offset <= fileBytes.length) {\r\n return this._uploadFileChunk(request, fileBytes, chunkSize, offset);\r\n }\r\n };\r\n\r\n /**\r\n * Upload file to a File Attribute\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n */\r\n uploadFile = async (request: UploadRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.uploadFile\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.uploadFile\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request, [\"data\"]);\r\n internalRequest.method = \"PATCH\";\r\n internalRequest.functionName = \"uploadFile\";\r\n internalRequest.transferMode = \"chunked\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n internalRequest.url = response?.data.location;\r\n delete internalRequest.transferMode;\r\n delete internalRequest.fieldName;\r\n delete internalRequest.fileName;\r\n return this._uploadFileChunk(internalRequest, request.data, response?.data.chunkSize);\r\n };\r\n\r\n private _downloadFileChunk = async (\r\n request: InternalRequest,\r\n bytesDownloaded: number = 0,\r\n // fileSize: number = 0,\r\n data: string = \"\"\r\n ): Promise => {\r\n // bytesDownloaded = bytesDownloaded || 0;\r\n // fileSize = fileSize || 0;\r\n // data = data || \"\";\r\n\r\n request.range = \"bytes=\" + bytesDownloaded + \"-\" + (bytesDownloaded + Utility.downloadChunkSize - 1);\r\n request.downloadSize = \"full\";\r\n\r\n const response = await this._makeRequest(request);\r\n\r\n request.url = response?.data.location;\r\n data += response?.data.value;\r\n\r\n bytesDownloaded += Utility.downloadChunkSize;\r\n\r\n if (bytesDownloaded <= response?.data.fileSize) {\r\n return this._downloadFileChunk(request, bytesDownloaded, data);\r\n }\r\n\r\n return {\r\n fileName: response?.data.fileName,\r\n fileSize: response?.data.fileSize,\r\n data: Utility.convertToFileBuffer(data),\r\n };\r\n };\r\n\r\n /**\r\n * Download a file from a File Attribute\r\n * @param request - An object that represents all possible options for a current request.\r\n */\r\n downloadFile = (request: DownloadRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.downloadFile\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.downloadFile\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"downloadFile\";\r\n internalRequest.responseParameters = { parse: true };\r\n\r\n return this._downloadFileChunk(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve records.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @param {string} [nextPageLink] - Use the value of the @odata.nextLink property with a new GET request to return the next page of data. Pass null to retrieveMultipleOptions.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveMultiple = async (request: RetrieveMultipleRequest, nextPageLink?: string): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveMultiple\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"retrieveMultiple\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"GET\";\r\n\r\n if (nextPageLink) {\r\n ErrorHelper.stringParameterCheck(nextPageLink, \"DynamicsWebApi.retrieveMultiple\", \"nextPageLink\");\r\n internalRequest.url = nextPageLink;\r\n }\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n return response?.data;\r\n };\r\n\r\n private _retrieveAllRequest = async (request: RetrieveMultipleRequest, nextPageLink?: string, records: any[] = []): Promise> => {\r\n const response = await this.retrieveMultiple(request, nextPageLink);\r\n records = records.concat(response.value);\r\n\r\n const pageLink = response.oDataNextLink;\r\n\r\n if (pageLink) {\r\n return this._retrieveAllRequest(request, pageLink, records);\r\n }\r\n\r\n const result: AllResponse = { value: records };\r\n\r\n if (response.oDataDeltaLink) {\r\n result[\"@odata.deltaLink\"] = response.oDataDeltaLink;\r\n result.oDataDeltaLink = response.oDataDeltaLink;\r\n }\r\n\r\n return result;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve all records.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAll = (request: RetrieveMultipleRequest): Promise> => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.retrieveAll\", this._isBatch);\r\n return this._retrieveAllRequest(request);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to count records. IMPORTANT! The count value does not represent the total number of entities in the system. It is limited by the maximum number of entities that can be returned. Returns: Number\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n count = async (request: CountRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.count\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"count\";\r\n\r\n if (internalRequest.filter?.length) {\r\n internalRequest.count = true;\r\n } else {\r\n internalRequest.navigationProperty = \"$count\";\r\n }\r\n\r\n internalRequest.responseParameters = { toCount: internalRequest.count };\r\n\r\n //if filter has not been specified then simplify the request\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to count records. Returns: Number\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n countAll = async (request: CountAllRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.countAll\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.countAll\", \"request\");\r\n\r\n const response = await this._retrieveAllRequest(request);\r\n\r\n return response ? (response.value ? response.value.length : 0) : 0;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to execute FetchXml to retrieve records. Returns: DWA.Types.FetchXmlResponse\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n fetch = async (request: FetchXmlRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.fetch\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"fetch\";\r\n\r\n ErrorHelper.stringParameterCheck(internalRequest.fetchXml, \"DynamicsWebApi.fetch\", \"request.fetchXml\");\r\n\r\n //only add paging if there is no top\r\n if (internalRequest.fetchXml && !/^(request: FetchAllRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.fetchAll\", \"request\");\r\n\r\n const _executeFetchXmlAll = async (request: FetchXmlRequest, records: any[] = []): Promise> => {\r\n // records = records || [];\r\n\r\n const response = await this.fetch(request);\r\n\r\n records = records.concat(response.value);\r\n\r\n if (response.PagingInfo) {\r\n request.pageNumber = response.PagingInfo.nextPage;\r\n request.pagingCookie = response.PagingInfo.cookie;\r\n\r\n return _executeFetchXmlAll(request, records);\r\n }\r\n\r\n return { value: records };\r\n };\r\n\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.fetchAll\", this._isBatch);\r\n return _executeFetchXmlAll(request);\r\n };\r\n\r\n /**\r\n * Associate for a collection-valued navigation property. (1:N or N:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n associate = async (request: AssociateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.associate\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"associate\";\r\n\r\n ErrorHelper.stringParameterCheck(request.relatedCollection, \"DynamicsWebApi.associate\", \"request.relatedcollection\");\r\n ErrorHelper.stringParameterCheck(request.relationshipName, \"DynamicsWebApi.associate\", \"request.relationshipName\");\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.associate\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.associate\", \"request.relatedKey\");\r\n\r\n internalRequest.navigationProperty = request.relationshipName + \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n internalRequest.data = { \"@odata.id\": `${request.relatedCollection}(${relatedKey})` };\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Disassociate for a collection-valued navigation property.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n disassociate = async (request: DisassociateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.disassociate\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.functionName = \"disassociate\";\r\n\r\n ErrorHelper.stringParameterCheck(request.relationshipName, \"DynamicsWebApi.disassociate\", \"request.relationshipName\");\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.disassociate\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.disassociate\", \"request.relatedId\");\r\n\r\n internalRequest.key = primaryKey;\r\n internalRequest.navigationProperty = `${request.relationshipName}(${relatedKey})/$ref`;\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Associate for a single-valued navigation property. (1:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n associateSingleValued = async (request: AssociateSingleValuedRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.associateSingleValued\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"PUT\";\r\n internalRequest.functionName = \"associateSingleValued\";\r\n\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.associateSingleValued\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.associateSingleValued\", \"request.relatedKey\");\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, \"DynamicsWebApi.associateSingleValued\", \"request.navigationProperty\");\r\n ErrorHelper.stringParameterCheck(request.relatedCollection, \"DynamicsWebApi.associateSingleValued\", \"request.relatedcollection\");\r\n\r\n internalRequest.navigationProperty += \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n internalRequest.data = { \"@odata.id\": `${request.relatedCollection}(${relatedKey})` };\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Removes a reference to an entity for a single-valued navigation property. (1:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n disassociateSingleValued = async (request: DisassociateSingleValuedRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.disassociateSingleValued\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.functionName = \"disassociateSingleValued\";\r\n\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.disassociateSingleValued\", \"request.primaryKey\");\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, \"DynamicsWebApi.disassociateSingleValued\", \"request.navigationProperty\");\r\n\r\n internalRequest.navigationProperty += \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Calls a Web API function\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n callFunction: CallFunction = async (request: string | BoundFunctionRequest | UnboundFunctionRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.callFunction`, \"request\");\r\n\r\n const getFunctionName = (request: BoundFunctionRequest | UnboundFunctionRequest) => request.name || request.functionName;\r\n\r\n const isObject = typeof request !== \"string\";\r\n const functionName = isObject ? getFunctionName(request) : request;\r\n const parameterName = isObject ? \"request.name\" : \"name\";\r\n const internalRequest: InternalRequest = isObject ? Utility.copyObject(request, [\"name\"]) : { functionName: functionName };\r\n\r\n ErrorHelper.stringParameterCheck(functionName, `DynamicsWebApi.callFunction`, parameterName);\r\n\r\n const functionParameters = Utility.buildFunctionParameters(internalRequest.parameters);\r\n\r\n internalRequest.method = \"GET\";\r\n internalRequest.addPath = functionName + functionParameters.key;\r\n internalRequest.queryParams = functionParameters.queryParams;\r\n internalRequest._isUnboundRequest = !internalRequest.collection;\r\n internalRequest.functionName = \"callFunction\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Calls a Web API action\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n callAction: CallAction = async (\r\n request: BoundActionRequest | UnboundActionRequest\r\n ): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.callAction`, \"request\");\r\n ErrorHelper.stringParameterCheck(request.actionName, `DynamicsWebApi.callAction`, \"request.actionName\");\r\n\r\n const internalRequest = Utility.copyRequest(request, [\"action\"]);\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"callAction\";\r\n\r\n internalRequest.addPath = request.actionName;\r\n internalRequest._isUnboundRequest = !internalRequest.collection;\r\n internalRequest.data = request.action;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n /**\r\n * Sends an asynchronous request to create an entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createEntity = (request: CreateEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.createEntity`, \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createEntity\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"createEntity\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update an entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateEntity = (request: UpdateEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateEntity\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateEntity\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateEntity\", \"request.data.MetadataId\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.key = internalRequest.data.MetadataId;\r\n internalRequest.functionName = \"updateEntity\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveEntity = (request: RetrieveEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveEntity\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.retrieveEntity\", \"request.key\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntity\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve entity definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveEntities = (request?: RetrieveEntitiesRequest): Promise> => {\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntities\";\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create an attribute.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createAttribute = (request: CreateAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createAttribute\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createAttribute\", \"request.data\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.createAttribute\", \"request.entityKey\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntity\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.key = request.entityKey;\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update an attribute.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateAttribute = (request: UpdateAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateAttribute\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateAttribute\", \"request.data\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.updateAttribute\", \"request.entityKey\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateAttribute\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateAttribute\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.navigationPropertyKey = request.data.MetadataId;\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"updateAttribute\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve attribute metadata for a specified entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAttributes = (request: RetrieveAttributesRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveAttributes\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.retrieveAttributes\", \"request.entityKey\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveAttributes\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"retrieveAttributes\";\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific attribute metadata for a specified entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAttribute = (request: RetrieveAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveAttributes\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.retrieveAttribute\", \"request.entityKey\");\r\n ErrorHelper.keyParameterCheck(request.attributeKey, \"DynamicsWebApi.retrieveAttribute\", \"request.attributeKey\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveAttribute\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.navigationPropertyKey = request.attributeKey;\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"retrieveAttribute\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createRelationship = (request: CreateRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createRelationship\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createRelationship\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"createRelationship\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateRelationship = (request: UpdateRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateRelationship\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateRelationship\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateRelationship\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateRelationship\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.key = request.data.MetadataId;\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"updateRelationship\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteRelationship = (request: DeleteRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteRelationship\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.deleteRelationship\", \"request.key\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"deleteRelationship\";\r\n\r\n return this.deleteRecord(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve relationship definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveRelationships = (request?: RetrieveRelationshipsRequest): Promise> => {\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"retrieveRelationships\";\r\n\r\n if (request) {\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveRelationships\", \"request.castType\");\r\n internalRequest.navigationProperty = request.castType;\r\n }\r\n }\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveRelationship = (request: RetrieveRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveRelationship\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.retrieveRelationship\", \"request.key\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveRelationship\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"retrieveRelationship\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a Global Option Set definition\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createGlobalOptionSet = (request: CreateGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createGlobalOptionSet\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createGlobalOptionSet\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"createGlobalOptionSet\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a Global Option Set.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateGlobalOptionSet = (request: UpdateGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateGlobalOptionSet\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.key = request.data.MetadataId;\r\n internalRequest.functionName = \"updateGlobalOptionSet\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a Global Option Set.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteGlobalOptionSet = (request: DeleteGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteGlobalOptionSet\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"deleteGlobalOptionSet\";\r\n\r\n return this.deleteRecord(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve Global Option Set definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveGlobalOptionSet = (request: RetrieveGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveGlobalOptionSet\", \"request\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveGlobalOptionSet\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"retrieveGlobalOptionSet\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve Global Option Set definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveGlobalOptionSets = (request?: RetrieveGlobalOptionSetsRequest): Promise> => {\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"retrieveGlobalOptionSets\";\r\n\r\n if (request?.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveGlobalOptionSets\", \"request.castType\");\r\n internalRequest.navigationProperty = request.castType;\r\n }\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Retrieves a CSDL Document Metadata\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} A raw CSDL $metadata document.\r\n */\r\n retrieveCsdlMetadata = async (request?: CsdlMetadataRequest): Promise => {\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"$metadata\";\r\n internalRequest.functionName = \"retrieveCsdlMetadata\";\r\n\r\n if (request?.addAnnotations) {\r\n ErrorHelper.boolParameterCheck(request.addAnnotations, \"DynamicsWebApi.retrieveCsdlMetadata\", \"request.addAnnotations\");\r\n internalRequest.includeAnnotations = \"*\";\r\n }\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides a search results page.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Search result\r\n */\r\n search: SearchFunction = async (request: string | SearchRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.search\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.search\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.search\", parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.search\", parameterName, 100);\r\n\r\n internalRequest.collection = \"query\";\r\n internalRequest.functionName = \"search\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Suggestions result\r\n */\r\n suggest: SuggestFunction = async (request: string | SuggestRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.suggest\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.suggest\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.suggest\", parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.suggest\", parameterName, 100);\r\n\r\n internalRequest.functionName = internalRequest.collection = \"suggest\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n autocomplete: AutocompleteFunction = async (request: string | AutocompleteRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.autocomplete\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n if (isObject) ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.autocomplete\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, `DynamicsWebApi.autocomplete`, parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.autocomplete\", parameterName, 100);\r\n\r\n internalRequest.functionName = internalRequest.collection = \"autocomplete\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Starts/executes a batch request.\r\n */\r\n startBatch = (): void => {\r\n this._isBatch = true;\r\n this._batchRequestId = Utility.generateUUID();\r\n };\r\n\r\n /**\r\n * Executes a batch request. Please call DynamicsWebApi.startBatch() first to start a batch request.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n executeBatch = async (request?: BatchRequest): Promise => {\r\n ErrorHelper.throwBatchNotStarted(this._isBatch);\r\n\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"$batch\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"executeBatch\";\r\n internalRequest.requestId = this._batchRequestId;\r\n\r\n this._batchRequestId = null;\r\n this._isBatch = false;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Creates a new instance of DynamicsWebApi. If config is not provided, it is copied from a current instance.\r\n *\r\n * @param {Config} config configuration object.\r\n * @returns {DynamicsWebApi} A new instance of DynamicsWebApi\r\n */\r\n initializeInstance = (config?: Config): DynamicsWebApi => new DynamicsWebApi(config || this._config);\r\n\r\n Utility = {\r\n /**\r\n * Searches for a collection name by provided entity name in a cached entity metadata.\r\n * The returned collection name can be null.\r\n *\r\n * @param {string} entityName entity name\r\n * @returns {string | null} collection name\r\n */\r\n getCollectionName: (entityName: string): string | null => RequestClient.getCollectionName(entityName),\r\n };\r\n}\r\n\r\nexport interface Expand {\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**Limit the number of results returned by using the $top system query option.Do not use $top with $count! */\r\n top?: number;\r\n /**An Array(of Strings) representing the order in which items are returned using the $orderby system query option.Use the asc or desc suffix to specify ascending or descending order respectively.The default is ascending if the suffix isn't applied. */\r\n orderBy?: string[];\r\n /**A name of a single-valued navigation property which needs to be expanded. */\r\n property?: string;\r\n /**An Array of Expand Objects representing the $expand Query Option value to control which related records need to be returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface BaseRequest {\r\n /**XHR requests only! Indicates whether the requests should be made synchronously or asynchronously.Default value is 'true'(asynchronously). */\r\n async?: boolean;\r\n /**Impersonates a user based on their systemuserid by adding \"MSCRMCallerID\" header. A String representing the GUID value for the Dynamics 365 systemuserid. */\r\n impersonate?: string;\r\n /**Impersonates a user based on their Azure Active Directory (AAD) object id by passing that value along with the header \"CallerObjectId\". A String should represent a GUID value. */\r\n impersonateAAD?: string;\r\n /**If set to 'true', DynamicsWebApi adds a request header 'Cache-Control: no-cache'.Default value is 'false'. */\r\n noCache?: boolean;\r\n /** Authorization Token. If set, onTokenRefresh will not be called. */\r\n token?: string;\r\n /**Sets a number of milliseconds before a request times out. */\r\n timeout?: number;\r\n /**The AbortSignal interface represents a signal object that allows you to communicate with a DOM request and abort it if required via an AbortController object. */\r\n signal?: AbortSignal;\r\n /**Indicates if an operation must be included in a Change Set or not. Works in Batch Operations only. By default, it's \"true\", except for GET operations - they are not allowed in Change Sets. */\r\n inChangeSet?: boolean;\r\n /**Headers to supply with a request. These headers will override configuraiton headers if the identical ones were set. */\r\n headers?: HeaderCollection;\r\n /**Custom query parameters. Can be used to set parameter aliases for \"$filter\" and \"$orderBy\". Important! These parameters ARE NOT URI encoded! */\r\n queryParams?: string[];\r\n}\r\n\r\nexport interface BatchRequest extends BaseRequest {\r\n /** Sets Prefer header to \"odata.continue-on-error\" that allows more requests be processed when errors occur. The batch request will return '200 OK' and individual response errors will be returned in the batch response body. */\r\n continueOnError?: boolean;\r\n}\r\n\r\nexport interface Request extends BaseRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection?: string;\r\n}\r\n\r\nexport interface CRUDRequest extends Request {\r\n /**A String representing collection record's Primary Key (GUID) or Alternate Key(s). */\r\n key?: string;\r\n}\r\n\r\nexport interface CountRequest extends Request {\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n}\r\n\r\nexport interface CountAllRequest extends CountRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**An Array (of strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n}\r\n\r\nexport interface FetchAllRequest extends Request {\r\n /**Sets FetchXML - a proprietary query language that provides capabilities to perform aggregation. */\r\n fetchXml: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation. Annotations provide additional information about lookups, options sets and other complex attribute types. For example: * or Microsoft.Dynamics.CRM.fetchxmlpagingcookie */\r\n includeAnnotations?: string;\r\n}\r\n\r\nexport interface FetchXmlRequest extends FetchAllRequest {\r\n /**Page number. */\r\n pageNumber?: number;\r\n /**Paging cookie. To retrive the first page, pagingCookie must be null. */\r\n pagingCookie?: string;\r\n}\r\n\r\nexport interface CreateRequest extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Web API v9+ only! Boolean that enables duplicate detection. */\r\n duplicateDetection?: boolean;\r\n /**A JavaScript object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data?: T;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface UpdateRequestBase extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Web API v9+ only! Boolean that enables duplicate detection. */\r\n duplicateDetection?: boolean;\r\n /**A JavaScript object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data?: T;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**Casts the AttributeMetadata to a specific type. (Used in requests to Attribute Metadata). */\r\n metadataAttributeType?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface UpdateRequest extends UpdateRequestBase {\r\n /**If set to 'true', DynamicsWebApi adds a request header 'MSCRM.MergeLabels: true'. Default value is 'false' */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface UpdateSinglePropertyRequest extends CRUDRequest {\r\n /**Object with a logical name of the field as a key and a value to update with. Example: {subject: \"Update Record\"} */\r\n fieldValuePair: { [key: string]: any };\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n}\r\n\r\nexport interface UpsertRequest extends UpdateRequestBase {\r\n /**Sets If-None-Match header value that enables to use conditional retrieval in applicable requests. */\r\n ifnonematch?: string;\r\n}\r\n\r\nexport interface DeleteRequest extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**Field name that needs to be cleared (for example File Field) */\r\n fieldName?: string;\r\n}\r\n\r\nexport interface RetrieveRequest extends CRUDRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets If-None-Match header value that enables to use conditional retrieval in applicable requests. */\r\n ifnonematch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Casts the AttributeMetadata to a specific type. (Used in requests to Attribute Metadata). */\r\n metadataAttributeType?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**A String representing the GUID value of the saved query. */\r\n savedQuery?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**A String representing the GUID value of the user query. */\r\n userQuery?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface RetrieveMultipleRequest extends Request {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**Use the $apply to aggregate and group your data dynamically */\r\n apply?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Boolean that sets the $count system query option with a value of true to include a count of entities that match the filter criteria up to 5000(per page).Do not use $top with $count! */\r\n count?: boolean;\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets the odata.maxpagesize preference value to request the number of entities returned in the response. */\r\n maxPageSize?: number;\r\n /**An Array(of string) representing the order in which items are returned using the $orderby system query option.Use the asc or desc suffix to specify ascending or descending order respectively.The default is ascending if the suffix isn't applied. */\r\n orderBy?: string[];\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Limit the number of results returned by using the $top system query option.Do not use $top with $count! */\r\n top?: number;\r\n /**Sets Prefer header with value 'odata.track-changes' to request that a delta link be returned which can subsequently be used to retrieve entity changes. */\r\n trackChanges?: boolean;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface AssociateRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Relationship name. */\r\n relationshipName: string;\r\n /**Related name of the Entity Collection or Entity Logical name. */\r\n relatedCollection: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface AssociateSingleValuedRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Navigation property name. */\r\n navigationProperty: string;\r\n /**Related name of the Entity Collection or Entity Logical name. */\r\n relatedCollection: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface DisassociateRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Relationship name. */\r\n relationshipName: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface DisassociateSingleValuedRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Navigation property name. */\r\n navigationProperty: string;\r\n}\r\n\r\nexport interface UnboundFunctionRequest extends BaseRequest {\r\n /**\r\n * Name of the function.\r\n */\r\n name?: string;\r\n /**\r\n * Name of the function. \r\n * @deprecated Use \"name\" parameter.\r\n */\r\n functionName?: string;\r\n /**Function's input parameters. Example: { param1: \"test\", param2: 3 }. */\r\n parameters?: any;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n}\r\n\r\nexport interface BoundFunctionRequest extends UnboundFunctionRequest, Request {\r\n /**A String representing the GUID value for the record. */\r\n key?: string;\r\n}\r\n\r\nexport interface UnboundActionRequest extends BaseRequest {\r\n /**A name of the Web API action. */\r\n actionName: string;\r\n /**An object that represents a Dynamics 365 action. */\r\n action?: TAction;\r\n}\r\n\r\nexport interface BoundActionRequest extends UnboundActionRequest, Request {\r\n /**A String representing the GUID value for the record. */\r\n key?: string;\r\n}\r\n\r\nexport interface CreateEntityRequest extends BaseRequest {\r\n /**An object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateEntityRequest extends CRUDRequest {\r\n /**An object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data: any;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface RetrieveEntityRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveEntitiesRequest extends BaseRequest {\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateAttributeRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Attribute metadata object. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateAttributeRequest extends CreateAttributeRequest {\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface RetrieveAttributesRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveAttributeRequest extends BaseRequest {\r\n /**An Attribute MetadataId or Alternate Key (such as LogicalName). */\r\n attributeKey: string;\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateRelationshipRequest extends BaseRequest {\r\n /**Relationship Definition. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateRelationshipRequest extends CreateRelationshipRequest {\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface DeleteRelationshipRequest extends BaseRequest {\r\n /**A Relationship MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n}\r\n\r\nexport interface RetrieveRelationshipsRequest extends BaseRequest {\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveRelationshipRequest extends BaseRequest {\r\n /**A Relationship MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateGlobalOptionSetRequest extends BaseRequest {\r\n /**Global Option Set Definition. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateGlobalOptionSetRequest extends CreateRelationshipRequest {\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface DeleteGlobalOptionSetRequest extends BaseRequest {\r\n /**A Global Option Set MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n}\r\n\r\nexport interface RetrieveGlobalOptionSetsRequest extends BaseRequest {\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveGlobalOptionSetRequest extends BaseRequest {\r\n /**A Global Option Set MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface UploadRequest extends CRUDRequest {\r\n /**Binary Buffer*/\r\n data: Uint8Array | Buffer;\r\n /**Name of the file */\r\n fileName: string;\r\n /**File Field Name */\r\n fieldName: string;\r\n}\r\n\r\nexport interface DownloadRequest extends CRUDRequest {\r\n /**File Field Name */\r\n fieldName: string;\r\n}\r\n\r\nexport interface CsdlMetadataRequest extends BaseRequest {\r\n /**If set to \"true\" the document will include many different kinds of annotations that can be useful. Most annotations are not included by default because they increase the total size of the document. */\r\n addAnnotations?: boolean;\r\n}\r\n\r\nexport type SearchMode = \"any\" | \"all\";\r\nexport type SearchType = \"simple\" | \"full\";\r\n\r\nexport interface SearchQueryBase {\r\n /**The search parameter value contains the term to be searched for and has a 100-character limit. For suggestions, min 3 characters in addition. */\r\n search: string;\r\n /**The default table list searches across all Dataverse search\u2013configured tables and columns. The default list is configured by your administrator when Dataverse search is enabled. */\r\n entities?: string[];\r\n /**Filters are applied while searching data and are specified in standard OData syntax. */\r\n filter?: string;\r\n}\r\n\r\nexport interface Search extends SearchQueryBase {\r\n /**Facets support the ability to drill down into data results after they've been retrieved. */\r\n facets?: string[];\r\n /**Specify true to return the total record count; otherwise false. The default is false. */\r\n returnTotalRecordCount?: boolean;\r\n /**Specifies the number of search results to skip. */\r\n skip?: number;\r\n /**Specifies the number of search results to retrieve. The default is 50, and the maximum value is 100. */\r\n top?: number;\r\n /**A list of comma-separated clauses where each clause consists of a column name followed by 'asc' (ascending, which is the default) or 'desc' (descending). This list specifies how to order the results in order of precedence. */\r\n orderBy?: string[];\r\n /**Specifies whether any or all the search terms must be matched to count the document as a match. The default is 'any'. */\r\n searchMode?: SearchMode;\r\n /**The search type specifies the syntax of a search query. Using 'simple' selects simple query syntax and 'full' selects Lucene query syntax. The default is 'simple'. */\r\n searchType?: SearchType;\r\n}\r\n\r\nexport interface Suggest extends SearchQueryBase {\r\n /**Use fuzzy search to aid with misspellings. The default is false. */\r\n useFuzzy?: boolean;\r\n /**Number of suggestions to retrieve. The default is 5. */\r\n top?: number;\r\n /**A list of comma-separated clauses where each clause consists of a column name followed by 'asc' (ascending, which is the default) or 'desc' (descending). This list specifies how to order the results in order of precedence. */\r\n orderBy?: string[];\r\n}\r\n\r\nexport interface Autocomplete extends SearchQueryBase {\r\n /**Use fuzzy search to aid with misspellings. The default is false. */\r\n useFuzzy?: boolean;\r\n}\r\n\r\nexport interface SearchRequest extends BaseRequest {\r\n /**Search query object */\r\n query: Search;\r\n}\r\n\r\nexport interface SuggestRequest extends BaseRequest {\r\n /**Suggestion query object */\r\n query: Suggest;\r\n}\r\n\r\nexport interface AutocompleteRequest extends BaseRequest {\r\n /**Autocomplete query object */\r\n query: Autocomplete;\r\n}\r\n\r\nexport interface ApiConfig {\r\n /** API Version to use, for example: \"9.2\" or \"1.0\" */\r\n version?: string;\r\n /** API Path, for example: \"data\" or \"search\" */\r\n path?: string;\r\n}\r\n\r\nexport interface AccessToken {\r\n /** Access Token */\r\n accessToken: string;\r\n}\r\n\r\nexport interface Config {\r\n /**The url to Dataverse API server, for example: https://contoso.api.crm.dynamics.com/. It is required when used in Node.js application. */\r\n serverUrl?: string | null;\r\n /**Impersonates a user based on their systemuserid by adding \"MSCRMCallerID\" header. A String representing the GUID value for the Dynamics 365 systemuserid. */\r\n impersonate?: string | null;\r\n /**Impersonates a user based on their Azure Active Directory (AAD) object id by passing that value along with the header \"CallerObjectId\". A String should represent a GUID value. */\r\n impersonateAAD?: string | null;\r\n /**A function that is called when a security token needs to be refreshed. */\r\n onTokenRefresh?: (() => Promise) | null;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types.*/\r\n includeAnnotations?: string | null;\r\n /**Sets the odata.maxpagesize preference value to request the number of entities returned in the response. */\r\n maxPageSize?: number | null;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request.*/\r\n returnRepresentation?: boolean | null;\r\n /**Indicates whether to use Entity Logical Names instead of Collection Logical Names.*/\r\n useEntityNames?: boolean | null;\r\n /**Sets a number of milliseconds before a request times out. */\r\n timeout?: number | null;\r\n /**Proxy configuration object. */\r\n proxy?: ProxyConfig | null;\r\n /**Configuration object for Dataverse Web API (with path \"data\"). */\r\n dataApi?: ApiConfig;\r\n /**Configuration object for Dataverse Search API (with path \"search\"). */\r\n searchApi?: ApiConfig;\r\n /**Default headers to supply with each request. */\r\n headers?: HeaderCollection;\r\n}\r\n\r\n/**Header collection type */\r\nexport type HeaderCollection = Record;\r\n\r\nexport interface ProxyConfig {\r\n /**Proxy server url */\r\n url: string;\r\n /**Basic authentication credentials */\r\n auth?: {\r\n /**Username */\r\n username: string;\r\n /**Password */\r\n password: string;\r\n };\r\n}\r\n\r\n/** Callback with an acquired token called by DynamicsWebApi; \"token\" argument can be a string or an object with a property {accessToken: } */\r\n// export interface OnTokenAcquiredCallback {\r\n// (token: any): void;\r\n// }\r\n\r\nexport interface RequestError extends Error {\r\n /**The name of the error */\r\n name: string;\r\n /**This code is not related to the http status code and is frequently empty */\r\n code?: string;\r\n /**A message describing the error */\r\n message: string;\r\n /**HTTP status code */\r\n status?: number;\r\n /**HTTP status text. Frequently empty */\r\n statusText?: string;\r\n /**HTTP Response headers */\r\n headers?: any;\r\n /**Details about an error */\r\n innererror?: {\r\n /**A message describing the error, this is frequently the same as the outer message */\r\n message?: string;\r\n /**Microsoft.Crm.CrmHttpException */\r\n type?: string;\r\n /**Details from the server about where the error occurred */\r\n stacktrace?: string;\r\n };\r\n}\r\n\r\nexport interface MultipleResponse {\r\n /**Multiple respone entities */\r\n value: T[];\r\n oDataCount?: number;\r\n \"@odata.count\"?: number;\r\n oDataContext?: string;\r\n \"@odata.context\"?: number;\r\n}\r\n\r\nexport interface AllResponse extends MultipleResponse {\r\n /**@odata.deltaLink value */\r\n oDataDeltaLink?: string;\r\n}\r\n\r\nexport interface RetrieveMultipleResponse extends MultipleResponse {\r\n \"@Microsoft.Dynamics.CRM.totalrecordcount\"?: number;\r\n \"@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded\"?: boolean;\r\n /**@odata.nextLink value */\r\n oDataNextLink?: string;\r\n /**@odata.deltaLink value */\r\n oDataDeltaLink?: string;\r\n \"@odata.deltaLink\"?: string;\r\n \"@odata.nextLink\"?: string;\r\n}\r\n\r\nexport interface FetchXmlResponse extends MultipleResponse {\r\n \"@Microsoft.Dynamics.CRM.totalrecordcount\"?: number;\r\n \"@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded\"?: boolean;\r\n /**Paging information */\r\n PagingInfo?: {\r\n /**Number of the next page */\r\n nextPage?: number;\r\n /**Next page cookie */\r\n cookie?: string;\r\n };\r\n}\r\n\r\nexport interface DownloadResponse {\r\n /**The name of the file */\r\n fileName: string;\r\n /**File size */\r\n fileSize: number;\r\n /**File Data */\r\n data: Uint8Array | Buffer;\r\n}\r\n\r\nexport interface SearchResponse {\r\n /**Search results*/\r\n value: TValue[];\r\n facets: any | null;\r\n totalrecordcount: number;\r\n querycontext: any | null;\r\n}\r\n\r\nexport interface SuggestResponseValue {\r\n text: string;\r\n document: TDocument;\r\n}\r\n\r\nexport interface SuggestResponse {\r\n /**Suggestions*/\r\n value: SuggestResponseValue[];\r\n querycontext: any | null;\r\n}\r\n\r\nexport interface AutocompleteResponse {\r\n /**Autocomplete result*/\r\n value: string | null;\r\n querycontext: any | null;\r\n}\r\n\r\n//function overloads\r\n\r\ntype CallFunction = {\r\n /**\r\n * Calls a Web API function\r\n *\r\n * @param name - The name of a function.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (name: string): Promise;\r\n /**\r\n * Calls a bound Web API function\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundFunctionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API function (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundFunctionRequest): Promise;\r\n};\r\n\r\ntype CallAction = {\r\n /**\r\n * Calls a bound Web API action (bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {T} Type of the value in a response\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundActionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API action (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {T} Type of the value in a response\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundActionRequest): Promise;\r\n /**\r\n * Calls a bound Web API action (bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {TResponse} Type of the value in a response\r\n * @type {TAction} Type of an action object\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundActionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API action (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {TResponse} Type of the value in a response\r\n * @type {TAction} Type of an action object\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundActionRequest): Promise;\r\n};\r\n\r\ntype SearchFunction = {\r\n /**\r\n * Provides a search results page.\r\n * @param term - The term to be searched for and has a max 100-character limit.\r\n * @returns {Promise} Search result\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides a search results page.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Search result\r\n */\r\n (request: SearchRequest): Promise>;\r\n};\r\n\r\ntype SuggestFunction = {\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param term - The term to be searched for and has min 3 characters to a max 100-character limit.\r\n * @returns {Promise} Suggestions result\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Suggestions result\r\n */\r\n (request: SuggestRequest): Promise>;\r\n};\r\n\r\ntype AutocompleteFunction = {\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param term - The term to be searched for and has a 100-character limit.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n (request: AutocompleteRequest): Promise;\r\n};\r\n", "import { Utility } from \"./Utility\";\r\nimport { ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { ApiConfig, Config } from \"../dynamics-web-api\";\r\n\r\ntype ApiType = \"dataApi\" | \"searchApi\";\r\n\r\nexport interface InternalApiConfig extends ApiConfig {\r\n url: string;\r\n}\r\n\r\nexport interface InternalConfig extends Config {\r\n dataApi: InternalApiConfig;\r\n searchApi: InternalApiConfig;\r\n}\r\n\r\nconst getApiUrl = (serverUrl: string | undefined | null, apiConfig: ApiConfig): string => {\r\n if (Utility.isRunningWithinPortals()) {\r\n return new URL(\"_api\", global.window.location.origin).toString() + \"/\";\r\n } else {\r\n if (!serverUrl) serverUrl = Utility.getClientUrl();\r\n return new URL(`api/${apiConfig.path}/v${apiConfig.version}`, serverUrl).toString() + \"/\";\r\n }\r\n};\r\n\r\nconst mergeApiConfigs = (apiConfig: ApiConfig | undefined, apiType: ApiType, internalConfig: InternalConfig): void => {\r\n const internalApiConfig = internalConfig[apiType] as InternalApiConfig;\r\n\r\n if (apiConfig?.version) {\r\n ErrorHelper.stringParameterCheck(apiConfig.version, \"DynamicsWebApi.setConfig\", `config.${apiType}.version`);\r\n internalApiConfig.version = apiConfig.version;\r\n }\r\n\r\n if (apiConfig?.path) {\r\n ErrorHelper.stringParameterCheck(apiConfig.path, \"DynamicsWebApi.setConfig\", `config.${apiType}.path`);\r\n internalApiConfig.path = apiConfig.path;\r\n }\r\n\r\n internalApiConfig.url = getApiUrl(internalConfig.serverUrl, internalApiConfig);\r\n};\r\n\r\nexport class ConfigurationUtility {\r\n static mergeApiConfigs = mergeApiConfigs;\r\n\r\n static merge(internalConfig: InternalConfig, config?: Config): void {\r\n if (config?.serverUrl) {\r\n ErrorHelper.stringParameterCheck(config.serverUrl, \"DynamicsWebApi.setConfig\", \"config.serverUrl\");\r\n internalConfig.serverUrl = config.serverUrl;\r\n }\r\n\r\n mergeApiConfigs(config?.dataApi, \"dataApi\", internalConfig);\r\n mergeApiConfigs(config?.searchApi, \"searchApi\", internalConfig);\r\n\r\n if (config?.impersonate) {\r\n internalConfig.impersonate = ErrorHelper.guidParameterCheck(config.impersonate, \"DynamicsWebApi.setConfig\", \"config.impersonate\");\r\n }\r\n\r\n if (config?.impersonateAAD) {\r\n internalConfig.impersonateAAD = ErrorHelper.guidParameterCheck(config.impersonateAAD, \"DynamicsWebApi.setConfig\", \"config.impersonateAAD\");\r\n }\r\n\r\n if (config?.onTokenRefresh) {\r\n ErrorHelper.callbackParameterCheck(config.onTokenRefresh, \"DynamicsWebApi.setConfig\", \"config.onTokenRefresh\");\r\n internalConfig.onTokenRefresh = config.onTokenRefresh;\r\n }\r\n\r\n if (config?.includeAnnotations) {\r\n ErrorHelper.stringParameterCheck(config.includeAnnotations, \"DynamicsWebApi.setConfig\", \"config.includeAnnotations\");\r\n internalConfig.includeAnnotations = config.includeAnnotations;\r\n }\r\n\r\n if (config?.timeout) {\r\n ErrorHelper.numberParameterCheck(config.timeout, \"DynamicsWebApi.setConfig\", \"config.timeout\");\r\n internalConfig.timeout = config.timeout;\r\n }\r\n\r\n if (config?.maxPageSize) {\r\n ErrorHelper.numberParameterCheck(config.maxPageSize, \"DynamicsWebApi.setConfig\", \"config.maxPageSize\");\r\n internalConfig.maxPageSize = config.maxPageSize;\r\n }\r\n\r\n if (config?.returnRepresentation) {\r\n ErrorHelper.boolParameterCheck(config.returnRepresentation, \"DynamicsWebApi.setConfig\", \"config.returnRepresentation\");\r\n internalConfig.returnRepresentation = config.returnRepresentation;\r\n }\r\n\r\n if (config?.useEntityNames) {\r\n ErrorHelper.boolParameterCheck(config.useEntityNames, \"DynamicsWebApi.setConfig\", \"config.useEntityNames\");\r\n internalConfig.useEntityNames = config.useEntityNames;\r\n }\r\n\r\n if (config?.headers) {\r\n internalConfig.headers = config.headers;\r\n }\r\n\r\n if (!global.DWA_BROWSER && config?.proxy) {\r\n ErrorHelper.parameterCheck(config.proxy, \"DynamicsWebApi.setConfig\", \"config.proxy\");\r\n\r\n if (config.proxy.url) {\r\n ErrorHelper.stringParameterCheck(config.proxy.url, \"DynamicsWebApi.setConfig\", \"config.proxy.url\");\r\n\r\n if (config.proxy.auth) {\r\n ErrorHelper.parameterCheck(config.proxy.auth, \"DynamicsWebApi.setConfig\", \"config.proxy.auth\");\r\n ErrorHelper.stringParameterCheck(config.proxy.auth.username, \"DynamicsWebApi.setConfig\", \"config.proxy.auth.username\");\r\n ErrorHelper.stringParameterCheck(config.proxy.auth.password, \"DynamicsWebApi.setConfig\", \"config.proxy.auth.password\");\r\n }\r\n }\r\n\r\n internalConfig.proxy = config.proxy;\r\n }\r\n }\r\n\r\n static default(): InternalConfig {\r\n return {\r\n serverUrl: null,\r\n impersonate: null,\r\n impersonateAAD: null,\r\n onTokenRefresh: null,\r\n includeAnnotations: null,\r\n maxPageSize: null,\r\n returnRepresentation: null,\r\n proxy: null,\r\n dataApi: {\r\n path: \"data\",\r\n version: \"9.2\",\r\n url: \"\"\r\n },\r\n searchApi: {\r\n path: \"search\",\r\n version: \"1.0\",\r\n url: \"\"\r\n },\r\n };\r\n }\r\n}\r\n", "import type * as Core from \"../types\";\r\nimport { Utility } from \"../utils/Utility\";\r\nimport { InternalConfig } from \"../utils/Config\";\r\nimport * as RequestUtility from \"../utils/Request\";\r\nimport { DynamicsWebApiError, ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { executeRequest } from \"./helpers/executeRequest\";\r\nimport { AccessToken } from \"../dynamics-web-api\";\r\n\r\nconst _addResponseParams = (requestId: string, responseParams: Record) => {\r\n if (_responseParseParams[requestId]) _responseParseParams[requestId].push(responseParams);\r\n else _responseParseParams[requestId] = [responseParams];\r\n};\r\n\r\nconst _addRequestToBatchCollection = (requestId: string, request: Core.InternalRequest) => {\r\n if (_batchRequestCollection[requestId]) _batchRequestCollection[requestId].push(request);\r\n else _batchRequestCollection[requestId] = [request];\r\n};\r\n\r\nconst _clearRequestData = (requestId: string): void => {\r\n delete _responseParseParams[requestId];\r\n if (_batchRequestCollection.hasOwnProperty(requestId)) delete _batchRequestCollection[requestId];\r\n};\r\n\r\nconst _runRequest = async (request: Core.InternalRequest, config: InternalConfig): Promise => {\r\n try {\r\n const result = await RequestClient.sendRequest(request, config);\r\n _clearRequestData(request.requestId!);\r\n\r\n return result;\r\n } catch (error) {\r\n _clearRequestData(request.requestId!);\r\n throw error;\r\n } finally {\r\n _clearRequestData(request.requestId!);\r\n }\r\n};\r\n\r\nlet _batchRequestCollection: Core.BatchRequestCollection = {};\r\nlet _responseParseParams: { [key: string]: any[] } = {};\r\n\r\nconst _nameExceptions = [\r\n \"$metadata\",\r\n \"EntityDefinitions\",\r\n \"RelationshipDefinitions\",\r\n \"GlobalOptionSetDefinitions\",\r\n \"ManagedPropertyDefinitions\",\r\n \"query\",\r\n \"suggest\",\r\n \"autocomplete\",\r\n];\r\n\r\nconst _isEntityNameException = (entityName: string): boolean => {\r\n return _nameExceptions.indexOf(entityName) > -1;\r\n};\r\n\r\nconst _getCollectionNames = async (entityName: string, config: InternalConfig): Promise => {\r\n if (!Utility.isNull(RequestUtility.entityNames)) {\r\n return RequestUtility.findCollectionName(entityName) || entityName;\r\n }\r\n\r\n const request = RequestUtility.compose(\r\n {\r\n method: \"GET\",\r\n collection: \"EntityDefinitions\",\r\n select: [\"EntitySetName\", \"LogicalName\"],\r\n noCache: true,\r\n functionName: \"retrieveMultiple\",\r\n },\r\n config\r\n );\r\n\r\n const result = await _runRequest(request, config);\r\n RequestUtility.setEntityNames({});\r\n for (let i = 0; i < result.data.value.length; i++) {\r\n RequestUtility.entityNames![result.data.value[i].LogicalName] = result.data.value[i].EntitySetName;\r\n }\r\n\r\n return RequestUtility.findCollectionName(entityName) || entityName;\r\n};\r\n\r\nconst _checkCollectionName = async (entityName: string | null | undefined, config: InternalConfig): Promise => {\r\n if (!entityName || _isEntityNameException(entityName)) {\r\n return entityName;\r\n }\r\n\r\n entityName = entityName.toLowerCase();\r\n\r\n if (!config.useEntityNames) {\r\n return entityName;\r\n }\r\n\r\n try {\r\n return await _getCollectionNames(entityName, config);\r\n } catch (error: any) {\r\n throw new Error(\"Unable to fetch Collection Names. Error: \" + (error as DynamicsWebApiError).message);\r\n }\r\n};\r\n\r\nexport class RequestClient {\r\n /**\r\n * Sends a request to given URL with given parameters\r\n *\r\n * @param {InternalRequest} request - Composed request to D365 Web Api\r\n * @param {InternalConfig} config - DynamicsWebApi config.\r\n */\r\n static async sendRequest(request: Core.InternalRequest, config: InternalConfig): Promise {\r\n request.headers = request.headers || {};\r\n request.responseParameters = request.responseParameters || {};\r\n request.requestId = request.requestId || Utility.generateUUID();\r\n\r\n //add response parameters to parse\r\n _addResponseParams(request.requestId, request.responseParameters);\r\n\r\n //stringify passed data\r\n let processedData = null;\r\n\r\n const isBatchConverted = request.responseParameters?.convertedToBatch;\r\n\r\n if (request.path === \"$batch\" && !isBatchConverted) {\r\n const batchRequest = _batchRequestCollection[request.requestId];\r\n\r\n if (!batchRequest) throw ErrorHelper.batchIsEmpty();\r\n\r\n const batchResult = RequestUtility.convertToBatch(batchRequest, config, request);\r\n\r\n processedData = batchResult.body;\r\n request.headers = { ...batchResult.headers, ...request.headers };\r\n\r\n //clear an array of requests\r\n delete _batchRequestCollection[request.requestId];\r\n } else {\r\n processedData = !isBatchConverted ? RequestUtility.processData(request.data, config) : request.data;\r\n\r\n if (!isBatchConverted) request.headers = RequestUtility.setStandardHeaders(request.headers);\r\n }\r\n\r\n if (config.impersonate && !request.headers![\"MSCRMCallerID\"]) {\r\n request.headers![\"MSCRMCallerID\"] = config.impersonate;\r\n }\r\n\r\n if (config.impersonateAAD && !request.headers![\"CallerObjectId\"]) {\r\n request.headers![\"CallerObjectId\"] = config.impersonateAAD;\r\n }\r\n\r\n let token: AccessToken | string | null = null;\r\n\r\n //call a token refresh callback only if it is set and there is no \"Authorization\" header set yet\r\n if (config.onTokenRefresh && (!request.headers || (request.headers && !request.headers[\"Authorization\"]))) {\r\n token = await config.onTokenRefresh();\r\n if (!token) throw new Error(\"Token is empty. Request is aborted.\");\r\n }\r\n\r\n if (token) {\r\n request.headers![\"Authorization\"] = \"Bearer \" + (token.hasOwnProperty(\"accessToken\") ? (token as AccessToken).accessToken : token);\r\n }\r\n\r\n if (Utility.isRunningWithinPortals()) {\r\n request.headers![\"__RequestVerificationToken\"] = await global.window.shell!.getTokenDeferred();\r\n }\r\n\r\n const url = request.apiConfig ? request.apiConfig.url : config.dataApi.url;\r\n\r\n return await executeRequest({\r\n method: request.method!,\r\n uri: url!.toString() + request.path,\r\n data: processedData,\r\n proxy: config.proxy,\r\n isAsync: request.async,\r\n headers: request.headers!,\r\n requestId: request.requestId!,\r\n abortSignal: request.signal,\r\n responseParams: _responseParseParams,\r\n timeout: request.timeout || config.timeout,\r\n });\r\n }\r\n\r\n static async makeRequest(request: Core.InternalRequest, config: InternalConfig): Promise {\r\n request.responseParameters = request.responseParameters || {};\r\n //we don't want to mix headers set by the library and by the user\r\n request.userHeaders = request.headers;\r\n delete request.headers;\r\n\r\n if (!request.isBatch) {\r\n const collectionName = await _checkCollectionName(request.collection, config);\r\n\r\n request.collection = collectionName;\r\n RequestUtility.compose(request, config);\r\n request.responseParameters.convertedToBatch = false;\r\n\r\n //the URL contains more characters than max possible limit, convert the request to a batch request\r\n if (request.path!.length > 2000) {\r\n const batchRequest = RequestUtility.convertToBatch([request], config);\r\n\r\n //#175 authorization header must be copied as well. \r\n //todo: is it the only one that needs to be copied?\r\n if (request.headers![\"Authorization\"]) {\r\n batchRequest.headers[\"Authorization\"] = request.headers![\"Authorization\"];\r\n }\r\n\r\n request.method = \"POST\";\r\n request.path = \"$batch\";\r\n request.data = batchRequest.body;\r\n request.headers = { ...batchRequest.headers, ...request.userHeaders };\r\n request.responseParameters.convertedToBatch = true;\r\n }\r\n\r\n return _runRequest(request, config);\r\n }\r\n\r\n //no need to make a request to web api if it's a part of batch\r\n RequestUtility.compose(request, config);\r\n //add response parameters to parse\r\n _addResponseParams(request.requestId!, request.responseParameters);\r\n _addRequestToBatchCollection(request.requestId!, request);\r\n }\r\n\r\n static _clearTestData(): void {\r\n RequestUtility.setEntityNames(null);\r\n _responseParseParams = {};\r\n _batchRequestCollection = {};\r\n }\r\n\r\n static getCollectionName(entityName: string): string | null {\r\n return RequestUtility.findCollectionName(entityName);\r\n }\r\n}\r\n", "import type { InternalRequest, InternalBatchRequest } from \"../types\";\r\n\r\nimport { Utility } from \"./Utility\";\r\nimport { Config, HeaderCollection } from \"../dynamics-web-api\";\r\nimport { ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { InternalConfig } from \"./Config\";\r\n\r\nexport let entityNames: Record | null = null;\r\n\r\nexport const setEntityNames = (newEntityNames: Record | null) => {\r\n entityNames = newEntityNames;\r\n};\r\n\r\n/**\r\n * Converts a request object to URL link\r\n * @param request Internal request object\r\n * @param config Internal configuration object\r\n * @returns Modified internal request object\r\n */\r\nexport const compose = (request: InternalRequest, config: InternalConfig): InternalRequest => {\r\n request.path = request.path || \"\";\r\n request.functionName = request.functionName || \"\";\r\n if (!request.url) {\r\n if (!request._isUnboundRequest && !request.contentId && !request.collection) {\r\n ErrorHelper.parameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, \"request.collection\");\r\n }\r\n if (request.collection != null) {\r\n ErrorHelper.stringParameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, \"request.collection\");\r\n request.path = request.collection;\r\n\r\n //add alternate key feature\r\n if (request.key) {\r\n request.key = ErrorHelper.keyParameterCheck(request.key, `DynamicsWebApi.${request.functionName}`, \"request.key\");\r\n request.path += `(${request.key})`;\r\n }\r\n }\r\n\r\n if (request.contentId) {\r\n ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, \"request.contentId\");\r\n if (request.contentId.startsWith(\"$\")) {\r\n request.path = request.path ? `${request.contentId}/${request.path}` : request.contentId;\r\n }\r\n }\r\n\r\n if (request.addPath) {\r\n if (request.path) {\r\n request.path += \"/\";\r\n }\r\n request.path += request.addPath;\r\n }\r\n\r\n request.path = composeUrl(request, config, request.path);\r\n\r\n if (request.fetchXml) {\r\n ErrorHelper.stringParameterCheck(request.fetchXml, `DynamicsWebApi.${request.functionName}`, \"request.fetchXml\");\r\n let join = request.path.indexOf(\"?\") === -1 ? \"?\" : \"&\";\r\n request.path += `${join}fetchXml=${encodeURIComponent(request.fetchXml)}`;\r\n }\r\n } else {\r\n ErrorHelper.stringParameterCheck(request.url, `DynamicsWebApi.${request.functionName}`, \"request.url\");\r\n request.path = request.url.replace(config.dataApi.url, \"\");\r\n }\r\n\r\n if (request.hasOwnProperty(\"async\") && request.async != null) {\r\n ErrorHelper.boolParameterCheck(request.async, `DynamicsWebApi.${request.functionName}`, \"request.async\");\r\n } else {\r\n request.async = true;\r\n }\r\n\r\n request.headers = composeHeaders(request, config);\r\n\r\n return request;\r\n};\r\n\r\n/**\r\n * Converts optional parameters of the request to URL. If expand parameter exists this function is called recursively.\r\n * @param request Internal request object\r\n * @param config Internal configuration object\r\n * @param url Starting url\r\n * @param joinSymbol Join symbol. \"&\" by default and \";\" inside an expand query parameter\r\n * @returns Request URL\r\n */\r\nexport const composeUrl = (request: InternalRequest, config: Config, url: string = \"\", joinSymbol: \"&\" | \";\" = \"&\"): string => {\r\n const queryArray: string[] = [];\r\n\r\n if (request) {\r\n if (request.navigationProperty) {\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, `DynamicsWebApi.${request.functionName}`, \"request.navigationProperty\");\r\n url += \"/\" + request.navigationProperty;\r\n\r\n if (request.navigationPropertyKey) {\r\n let navigationKey = ErrorHelper.keyParameterCheck(\r\n request.navigationPropertyKey,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.navigationPropertyKey\"\r\n );\r\n url += \"(\" + navigationKey + \")\";\r\n }\r\n\r\n if (request.navigationProperty === \"Attributes\") {\r\n if (request.metadataAttributeType) {\r\n ErrorHelper.stringParameterCheck(request.metadataAttributeType, `DynamicsWebApi.${request.functionName}`, \"request.metadataAttributeType\");\r\n url += \"/\" + request.metadataAttributeType;\r\n }\r\n }\r\n }\r\n\r\n if (request.select?.length) {\r\n ErrorHelper.arrayParameterCheck(request.select, `DynamicsWebApi.${request.functionName}`, \"request.select\");\r\n\r\n if (request.functionName == \"retrieve\" && request.select.length == 1 && request.select[0].endsWith(\"/$ref\")) {\r\n url += \"/\" + request.select[0];\r\n } else {\r\n if (request.select[0].startsWith(\"/\") && request.functionName == \"retrieve\") {\r\n if (request.navigationProperty == null) {\r\n url += request.select.shift();\r\n } else {\r\n request.select.shift();\r\n }\r\n }\r\n\r\n //check if anything left in the array\r\n if (request.select.length) {\r\n queryArray.push(\"$select=\" + request.select.join(\",\"));\r\n }\r\n }\r\n }\r\n\r\n if (request.filter) {\r\n ErrorHelper.stringParameterCheck(request.filter, `DynamicsWebApi.${request.functionName}`, \"request.filter\");\r\n const removeBracketsFromGuidReg = /[^\"']{([\\w\\d]{8}[-]?(?:[\\w\\d]{4}[-]?){3}[\\w\\d]{12})}(?:[^\"']|$)/g;\r\n let filterResult = request.filter;\r\n\r\n //fix bug 2018-06-11\r\n let m: RegExpExecArray | null = null;\r\n while ((m = removeBracketsFromGuidReg.exec(filterResult)) !== null) {\r\n if (m.index === removeBracketsFromGuidReg.lastIndex) {\r\n removeBracketsFromGuidReg.lastIndex++;\r\n }\r\n\r\n let replacement = m[0].endsWith(\")\") ? \")\" : \" \";\r\n filterResult = filterResult.replace(m[0], \" \" + m[1] + replacement);\r\n }\r\n\r\n queryArray.push(\"$filter=\" + encodeURIComponent(filterResult));\r\n }\r\n\r\n if (request.fieldName) {\r\n ErrorHelper.stringParameterCheck(request.fieldName, `DynamicsWebApi.${request.functionName}`, \"request.fieldName\");\r\n url += \"/\" + request.fieldName;\r\n }\r\n\r\n if (request.savedQuery) {\r\n queryArray.push(\"savedQuery=\" + ErrorHelper.guidParameterCheck(request.savedQuery, `DynamicsWebApi.${request.functionName}`, \"request.savedQuery\"));\r\n }\r\n\r\n if (request.userQuery) {\r\n queryArray.push(\"userQuery=\" + ErrorHelper.guidParameterCheck(request.userQuery, `DynamicsWebApi.${request.functionName}`, \"request.userQuery\"));\r\n }\r\n\r\n if (request.apply) {\r\n ErrorHelper.stringParameterCheck(request.apply, `DynamicsWebApi.${request.functionName}`, \"request.apply\");\r\n queryArray.push(\"$apply=\" + request.apply);\r\n }\r\n\r\n if (request.count) {\r\n ErrorHelper.boolParameterCheck(request.count, `DynamicsWebApi.${request.functionName}`, \"request.count\");\r\n queryArray.push(\"$count=\" + request.count);\r\n }\r\n\r\n if (request.top && request.top > 0) {\r\n ErrorHelper.numberParameterCheck(request.top, `DynamicsWebApi.${request.functionName}`, \"request.top\");\r\n queryArray.push(\"$top=\" + request.top);\r\n }\r\n\r\n if (request.orderBy != null && request.orderBy.length) {\r\n ErrorHelper.arrayParameterCheck(request.orderBy, `DynamicsWebApi.${request.functionName}`, \"request.orderBy\");\r\n queryArray.push(\"$orderby=\" + request.orderBy.join(\",\"));\r\n }\r\n\r\n if (request.partitionId) {\r\n ErrorHelper.stringParameterCheck(request.partitionId, `DynamicsWebApi.${request.functionName}`, \"request.partitionId\");\r\n queryArray.push(\"partitionid='\" + request.partitionId + \"'\");\r\n }\r\n\r\n if (request.downloadSize) {\r\n ErrorHelper.stringParameterCheck(request.downloadSize, `DynamicsWebApi.${request.functionName}`, \"request.downloadSize\");\r\n queryArray.push(\"size=\" + request.downloadSize);\r\n }\r\n\r\n if (request.queryParams?.length) {\r\n ErrorHelper.arrayParameterCheck(request.queryParams, `DynamicsWebApi.${request.functionName}`, \"request.queryParams\");\r\n queryArray.push(request.queryParams.join(\"&\"));\r\n }\r\n\r\n if (request.fileName) {\r\n ErrorHelper.stringParameterCheck(request.fileName, `DynamicsWebApi.${request.functionName}`, \"request.fileName\");\r\n queryArray.push(\"x-ms-file-name=\" + request.fileName);\r\n }\r\n\r\n if (request.data) {\r\n ErrorHelper.parameterCheck(request.data, `DynamicsWebApi.${request.functionName}`, \"request.data\");\r\n }\r\n\r\n if (request.isBatch) {\r\n ErrorHelper.boolParameterCheck(request.isBatch, `DynamicsWebApi.${request.functionName}`, \"request.isBatch\");\r\n }\r\n\r\n if (!Utility.isNull(request.inChangeSet)) {\r\n ErrorHelper.boolParameterCheck(request.inChangeSet, `DynamicsWebApi.${request.functionName}`, \"request.inChangeSet\");\r\n }\r\n\r\n if (request.isBatch && Utility.isNull(request.inChangeSet)) request.inChangeSet = true;\r\n\r\n if (request.timeout) {\r\n ErrorHelper.numberParameterCheck(request.timeout, `DynamicsWebApi.${request.functionName}`, \"request.timeout\");\r\n }\r\n\r\n if (request.expand?.length) {\r\n ErrorHelper.stringOrArrayParameterCheck(request.expand, `DynamicsWebApi.${request.functionName}`, \"request.expand\");\r\n if (typeof request.expand === \"string\") {\r\n queryArray.push(\"$expand=\" + request.expand);\r\n } else {\r\n const expandQueryArray: string[] = [];\r\n for (let i = 0; i < request.expand.length; i++) {\r\n if (request.expand[i].property) {\r\n const expand = request.expand[i];\r\n expand.functionName = `${request.functionName} $expand`;\r\n let expandConverted = composeUrl(expand, config, \"\", \";\");\r\n if (expandConverted) {\r\n expandConverted = `(${expandConverted.substr(1)})`;\r\n }\r\n expandQueryArray.push(request.expand[i].property + expandConverted);\r\n }\r\n }\r\n if (expandQueryArray.length) {\r\n queryArray.push(\"$expand=\" + expandQueryArray.join(\",\"));\r\n }\r\n }\r\n }\r\n }\r\n\r\n return !queryArray.length ? url : url + \"?\" + queryArray.join(joinSymbol);\r\n};\r\n\r\nexport const composeHeaders = (request: InternalRequest, config: Config): HeaderCollection => {\r\n const headers: HeaderCollection = { ...config.headers, ...request.userHeaders };\r\n\r\n const prefer = composePreferHeader(request, config);\r\n if (prefer.length) {\r\n headers[\"Prefer\"] = prefer;\r\n }\r\n\r\n if (request.collection === \"$metadata\") {\r\n headers[\"Accept\"] = \"application/xml\";\r\n }\r\n\r\n if (request.transferMode) {\r\n headers[\"x-ms-transfer-mode\"] = request.transferMode;\r\n }\r\n\r\n if (request.ifmatch != null && request.ifnonematch != null) {\r\n throw new Error(\r\n `DynamicsWebApi.${request.functionName}. Either one of request.ifmatch or request.ifnonematch parameters should be used in a call, not both.`\r\n );\r\n }\r\n\r\n if (request.ifmatch) {\r\n ErrorHelper.stringParameterCheck(request.ifmatch, `DynamicsWebApi.${request.functionName}`, \"request.ifmatch\");\r\n headers[\"If-Match\"] = request.ifmatch;\r\n }\r\n\r\n if (request.ifnonematch) {\r\n ErrorHelper.stringParameterCheck(request.ifnonematch, `DynamicsWebApi.${request.functionName}`, \"request.ifnonematch\");\r\n headers[\"If-None-Match\"] = request.ifnonematch;\r\n }\r\n\r\n if (request.impersonate) {\r\n ErrorHelper.stringParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, \"request.impersonate\");\r\n headers[\"MSCRMCallerID\"] = ErrorHelper.guidParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, \"request.impersonate\");\r\n }\r\n\r\n if (request.impersonateAAD) {\r\n ErrorHelper.stringParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, \"request.impersonateAAD\");\r\n headers[\"CallerObjectId\"] = ErrorHelper.guidParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, \"request.impersonateAAD\");\r\n }\r\n\r\n if (request.token) {\r\n ErrorHelper.stringParameterCheck(request.token, `DynamicsWebApi.${request.functionName}`, \"request.token\");\r\n headers[\"Authorization\"] = \"Bearer \" + request.token;\r\n }\r\n\r\n if (request.duplicateDetection) {\r\n ErrorHelper.boolParameterCheck(request.duplicateDetection, `DynamicsWebApi.${request.functionName}`, \"request.duplicateDetection\");\r\n headers[\"MSCRM.SuppressDuplicateDetection\"] = \"false\";\r\n }\r\n\r\n if (request.bypassCustomPluginExecution) {\r\n ErrorHelper.boolParameterCheck(request.bypassCustomPluginExecution, `DynamicsWebApi.${request.functionName}`, \"request.bypassCustomPluginExecution\");\r\n headers[\"MSCRM.BypassCustomPluginExecution\"] = \"true\";\r\n }\r\n\r\n if (request.noCache) {\r\n ErrorHelper.boolParameterCheck(request.noCache, `DynamicsWebApi.${request.functionName}`, \"request.noCache\");\r\n headers[\"Cache-Control\"] = \"no-cache\";\r\n }\r\n\r\n if (request.mergeLabels) {\r\n ErrorHelper.boolParameterCheck(request.mergeLabels, `DynamicsWebApi.${request.functionName}`, \"request.mergeLabels\");\r\n headers[\"MSCRM.MergeLabels\"] = \"true\";\r\n }\r\n\r\n if (request.contentId) {\r\n ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, \"request.contentId\");\r\n if (!request.contentId.startsWith(\"$\")) {\r\n headers[\"Content-ID\"] = request.contentId;\r\n }\r\n }\r\n\r\n if (request.contentRange) {\r\n ErrorHelper.stringParameterCheck(request.contentRange, `DynamicsWebApi.${request.functionName}`, \"request.contentRange\");\r\n headers[\"Content-Range\"] = request.contentRange;\r\n }\r\n\r\n if (request.range) {\r\n ErrorHelper.stringParameterCheck(request.range, `DynamicsWebApi.${request.functionName}`, \"request.range\");\r\n headers[\"Range\"] = request.range;\r\n }\r\n\r\n return headers;\r\n};\r\n\r\nexport const composePreferHeader = (request: InternalRequest, config: Config): string => {\r\n let returnRepresentation: boolean | null | undefined = request.returnRepresentation;\r\n let includeAnnotations: string | null | undefined = request.includeAnnotations;\r\n let maxPageSize: number | null | undefined = request.maxPageSize;\r\n let trackChanges: boolean | null | undefined = request.trackChanges;\r\n let continueOnError: boolean | null | undefined = request.continueOnError;\r\n\r\n let prefer: string[] = [];\r\n\r\n if (request.prefer && request.prefer.length) {\r\n ErrorHelper.stringOrArrayParameterCheck(request.prefer, `DynamicsWebApi.${request.functionName}`, \"request.prefer\");\r\n if (typeof request.prefer === \"string\") {\r\n prefer = request.prefer.split(\",\");\r\n }\r\n for (let i in prefer) {\r\n let item = prefer[i].trim();\r\n if (item === \"return=representation\") {\r\n returnRepresentation = true;\r\n } else if (item.includes(\"odata.include-annotations=\")) {\r\n includeAnnotations = item.replace(\"odata.include-annotations=\", \"\").replace(/\"/g, \"\");\r\n } else if (item.startsWith(\"odata.maxpagesize=\")) {\r\n maxPageSize = Number(item.replace(\"odata.maxpagesize=\", \"\").replace(/\"/g, \"\")) || 0;\r\n } else if (item.includes(\"odata.track-changes\")) {\r\n trackChanges = true;\r\n } else if (item.includes(\"odata.continue-on-error\")) {\r\n continueOnError = true;\r\n }\r\n }\r\n }\r\n\r\n //clear array\r\n prefer = [];\r\n\r\n if (config) {\r\n if (returnRepresentation == null) {\r\n returnRepresentation = config.returnRepresentation;\r\n }\r\n includeAnnotations = includeAnnotations ? includeAnnotations : config.includeAnnotations;\r\n maxPageSize = maxPageSize ? maxPageSize : config.maxPageSize;\r\n }\r\n\r\n if (returnRepresentation) {\r\n ErrorHelper.boolParameterCheck(returnRepresentation, `DynamicsWebApi.${request.functionName}`, \"request.returnRepresentation\");\r\n prefer.push(\"return=representation\");\r\n }\r\n\r\n if (includeAnnotations) {\r\n ErrorHelper.stringParameterCheck(includeAnnotations, `DynamicsWebApi.${request.functionName}`, \"request.includeAnnotations\");\r\n prefer.push(`odata.include-annotations=\"${includeAnnotations}\"`);\r\n }\r\n\r\n if (maxPageSize && maxPageSize > 0) {\r\n ErrorHelper.numberParameterCheck(maxPageSize, `DynamicsWebApi.${request.functionName}`, \"request.maxPageSize\");\r\n prefer.push(\"odata.maxpagesize=\" + maxPageSize);\r\n }\r\n\r\n if (trackChanges) {\r\n ErrorHelper.boolParameterCheck(trackChanges, `DynamicsWebApi.${request.functionName}`, \"request.trackChanges\");\r\n prefer.push(\"odata.track-changes\");\r\n }\r\n\r\n if (continueOnError) {\r\n ErrorHelper.boolParameterCheck(continueOnError, `DynamicsWebApi.${request.functionName}`, \"request.continueOnError\");\r\n prefer.push(\"odata.continue-on-error\");\r\n }\r\n\r\n return prefer.join(\",\");\r\n};\r\n\r\nexport const convertToBatch = (requests: InternalRequest[], config: InternalConfig, batchRequest?: InternalRequest): InternalBatchRequest => {\r\n const batchBoundary = `dwa_batch_${Utility.generateUUID()}`;\r\n\r\n const batchBody: string[] = [];\r\n let currentChangeSet: string | null = null;\r\n let contentId = 100000;\r\n\r\n requests.forEach((internalRequest) => {\r\n internalRequest.functionName = \"executeBatch\";\r\n if (batchRequest?.inChangeSet === false) internalRequest.inChangeSet = false;\r\n const inChangeSet = internalRequest.method === \"GET\" ? false : !!internalRequest.inChangeSet;\r\n\r\n if (!inChangeSet && currentChangeSet) {\r\n //end current change set\r\n batchBody.push(`\\n--${currentChangeSet}--`);\r\n\r\n currentChangeSet = null;\r\n contentId = 100000;\r\n }\r\n\r\n if (!currentChangeSet) {\r\n batchBody.push(`\\n--${batchBoundary}`);\r\n\r\n if (inChangeSet) {\r\n currentChangeSet = `changeset_${Utility.generateUUID()}`;\r\n batchBody.push(\"Content-Type: multipart/mixed;boundary=\" + currentChangeSet);\r\n }\r\n }\r\n\r\n if (inChangeSet) {\r\n batchBody.push(`\\n--${currentChangeSet}`);\r\n }\r\n\r\n batchBody.push(\"Content-Type: application/http\");\r\n batchBody.push(\"Content-Transfer-Encoding: binary\");\r\n\r\n if (inChangeSet) {\r\n const contentIdValue = internalRequest.headers!.hasOwnProperty(\"Content-ID\") ? internalRequest.headers![\"Content-ID\"] : ++contentId;\r\n\r\n batchBody.push(`Content-ID: ${contentIdValue}`);\r\n }\r\n\r\n if (!internalRequest.path?.startsWith(\"$\")) {\r\n batchBody.push(`\\n${internalRequest.method} ${config.dataApi.url}${internalRequest.path} HTTP/1.1`);\r\n } else {\r\n batchBody.push(`\\n${internalRequest.method} ${internalRequest.path} HTTP/1.1`);\r\n }\r\n\r\n if (internalRequest.method === \"GET\") {\r\n batchBody.push(\"Accept: application/json\");\r\n } else {\r\n batchBody.push(\"Content-Type: application/json\");\r\n }\r\n\r\n for (let key in internalRequest.headers) {\r\n if (key === \"Authorization\" || key === \"Content-ID\") continue;\r\n\r\n batchBody.push(`${key}: ${internalRequest.headers[key]}`);\r\n }\r\n\r\n if (internalRequest.data) {\r\n batchBody.push(`\\n${processData(internalRequest.data, config)}`);\r\n }\r\n });\r\n\r\n if (currentChangeSet) {\r\n batchBody.push(`\\n--${currentChangeSet}--`);\r\n }\r\n\r\n batchBody.push(`\\n--${batchBoundary}--`);\r\n\r\n const headers = setStandardHeaders(batchRequest?.userHeaders);\r\n headers[\"Content-Type\"] = `multipart/mixed;boundary=${batchBoundary}`;\r\n\r\n return { headers: headers, body: batchBody.join(\"\\n\") };\r\n};\r\n\r\nexport const findCollectionName = (entityName: string): string | null => {\r\n let collectionName: string | null = null;\r\n\r\n if (!Utility.isNull(entityNames)) {\r\n collectionName = entityNames![entityName];\r\n if (!collectionName) {\r\n for (let key in entityNames!) {\r\n if (entityNames[key] === entityName) {\r\n return entityName;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return collectionName;\r\n};\r\n\r\nexport const processData = (data: any, config: InternalConfig): string | Uint8Array | Uint16Array | Uint32Array | null => {\r\n let stringifiedData: string | null = null;\r\n if (data) {\r\n if (data instanceof Uint8Array || data instanceof Uint16Array || data instanceof Uint32Array) return data;\r\n\r\n stringifiedData = JSON.stringify(data, (key, value) => {\r\n if (key.endsWith(\"@odata.bind\") || key.endsWith(\"@odata.id\")) {\r\n if (typeof value === \"string\" && !value.startsWith(\"$\")) {\r\n //remove brackets in guid\r\n if (/\\(\\{[\\w\\d-]+\\}\\)/g.test(value)) {\r\n value = value.replace(/(.+)\\(\\{([\\w\\d-]+)\\}\\)/g, \"$1($2)\");\r\n }\r\n\r\n if (config.useEntityNames) {\r\n //replace entity name with collection name\r\n const regularExpression = /([\\w_]+)(\\([\\d\\w-]+\\))$/;\r\n const valueParts = regularExpression.exec(value);\r\n if (valueParts && valueParts.length > 2) {\r\n const collectionName = findCollectionName(valueParts[1]);\r\n\r\n if (!Utility.isNull(collectionName)) {\r\n value = value.replace(regularExpression, collectionName + \"$2\");\r\n }\r\n }\r\n }\r\n\r\n if (!value.startsWith(config.dataApi.url)) {\r\n //add full web api url if it's not set\r\n if (key.endsWith(\"@odata.bind\")) {\r\n if (!value.startsWith(\"/\")) {\r\n value = \"/\" + value;\r\n }\r\n } else {\r\n value = config.dataApi.url + value.replace(/^\\//, \"\");\r\n }\r\n }\r\n }\r\n } else if (key.startsWith(\"oData\") || key.endsWith(\"_Formatted\") || key.endsWith(\"_NavigationProperty\") || key.endsWith(\"_LogicalName\")) {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n });\r\n\r\n stringifiedData = stringifiedData.replace(/[\\u007F-\\uFFFF]/g, function (chr: string) {\r\n return \"\\\\u\" + (\"0000\" + chr.charCodeAt(0).toString(16)).slice(-4);\r\n });\r\n }\r\n\r\n return stringifiedData;\r\n};\r\n\r\nexport const setStandardHeaders = (headers: HeaderCollection = {}): HeaderCollection => {\r\n if (!headers[\"Accept\"]) headers[\"Accept\"] = \"application/json\";\r\n if (!headers[\"OData-MaxVersion\"]) headers[\"OData-MaxVersion\"] = \"4.0\";\r\n if (!headers[\"OData-Version\"]) headers[\"OData-Version\"] = \"4.0\";\r\n if (headers[\"Content-Range\"]) headers[\"Content-Type\"] = \"application/octet-stream\";\r\n else if (!headers[\"Content-Type\"]) headers[\"Content-Type\"] = \"application/json; charset=utf-8\";\r\n\r\n return headers;\r\n};\r\n", "import type { RequestOptions, WebApiResponse } from \"../../types\";\r\n\r\nexport async function executeRequest(options: RequestOptions): Promise {\r\n return global.DWA_BROWSER ? require(\"../xhr\").executeRequest(options) : require(\"../http\").executeRequest(options);\r\n}\r\n"], + "mappings": "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", + "names": ["headers", "executeRequest", "executeRequest", "request"] } diff --git a/dist/dynamics-web-api.min.js b/dist/dynamics-web-api.min.js index 4c32cac..27163cc 100644 --- a/dist/dynamics-web-api.min.js +++ b/dist/dynamics-web-api.min.js @@ -1,17 +1,17 @@ -/*! dynamics-web-api v2.1.4 (c) 2024 Aleksandr Rogov */ -"use strict";var _dynamicsWebApiExports=(()=>{var q=Object.defineProperty;var le=Object.getOwnPropertyDescriptor;var pe=Object.getOwnPropertyNames;var ue=Object.prototype.hasOwnProperty;var b=(o,e)=>()=>(o&&(e=o(o=0)),e);var z=(o,e)=>{for(var t in e)q(o,t,{get:e[t],enumerable:!0})},me=(o,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of pe(e))!ue.call(o,a)&&a!==t&&q(o,a,{get:()=>e[a],enumerable:!(n=le(e,a))||n.enumerable});return o};var X=o=>me(q({},"__esModule",{value:!0}),o);function de(){return window.crypto}function j(){return de().getRandomValues(new Uint8Array(1))}var Q=b(()=>{"use strict"});function J(o){return!!new RegExp(M,"i").exec(o)}function S(o){let e=new RegExp("^{?("+M+")}?$","i").exec(o);return e?e[1]:null}function F(o){let e=new RegExp("("+M+")\\)$","i").exec(o);return e?e[1]:null}var M,w=b(()=>{"use strict";M="[0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12}"});var ye,g,l,v=b(()=>{"use strict";Q();w();ye=4194304,g=class g{static buildFunctionParameters(e){if(e){let t=Object.keys(e),n=[],a=[];for(let r=1;r<=t.length;r++){let c=t[r-1],s=e[c];s!=null&&(typeof s=="string"&&!s.startsWith("Microsoft.Dynamics.CRM")&&!J(s)?s=`'${s}'`:typeof s=="object"&&(s=JSON.stringify(s)),n.push(`${c}=@p${r}`),a.push(`@p${r}=${S(s)||s}`))}return{key:`(${n.join(",")})`,queryParams:a}}else return{key:"()"}}static getFetchXmlPagingCookie(e="",t=1){e=decodeURIComponent(decodeURIComponent(e));let n=/pagingcookie="()/.exec(e);if(n!=null){let a=parseInt(n[2]);return{cookie:n[1].replace(//g,">").replace(/\"/g,"'").replace(/\'/g,"""),page:a,nextPage:a+1}}else return{cookie:"",page:t,nextPage:t+1}}static convertToReferenceObject(e){let t=/\/(\w+)\(([0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12})/i.exec(e["@odata.id"]);return{id:t[2],collection:t[1],oDataContext:e["@odata.context"]}}static isNull(e){return typeof e>"u"||e==null}static generateUUID(){return([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,e=>(e^j()[0]&15>>e/4).toString(16))}static getXrmContext(){if(typeof GetGlobalContext<"u")return GetGlobalContext();if(typeof Xrm<"u"){if(!g.isNull(Xrm.Utility)&&!g.isNull(Xrm.Utility.getGlobalContext))return Xrm.Utility.getGlobalContext();if(!g.isNull(Xrm.Page)&&!g.isNull(Xrm.Page.context))return Xrm.Page.context}throw new Error("Xrm Context is not available. In most cases, it can be resolved by adding a reference to a ClientGlobalContext.js.aspx. Please refer to MSDN documentation for more details.")}static getClientUrl(){let t=g.getXrmContext().getClientUrl();return t.match(/\/$/)&&(t=t.substring(0,t.length-1)),t}static isRunningWithinPortals(){return!!window.shell}static isObject(e){return typeof e=="object"&&!!e&&!Array.isArray(e)&&Object.prototype.toString.call(e)!=="[object Date]"}static copyObject(e,t){let n={};for(let a in e)e.hasOwnProperty(a)&&!t?.includes(a)&&(g.isObject(e[a])?n[a]=g.copyObject(e[a]):Array.isArray(e[a])?n[a]=e[a].slice():n[a]=e[a]);return n}static copyRequest(e,t=[]){t.includes("signal")||t.push("signal");let n=g.copyObject(e,t);return n.signal=e.signal,n}static setFileChunk(e,t,n,a){a=a||0;let r=a+n>t.length?t.length%n:n,c;c=new Uint8Array(r);for(let s=0;s{"use strict";w();i=class o{static handleErrorResponse(e){throw new Error(`Error: ${e.status}: ${e.message}`)}static parameterCheck(e,t,n,a){(typeof e>"u"||e===null||e==="")&&C(t,n,a)}static stringParameterCheck(e,t,n){typeof e!="string"&&C(t,n,"String")}static maxLengthStringParameterCheck(e,t,n,a){if(e&&e.length>a)throw new Error(`${n} has a ${a} character limit.`)}static arrayParameterCheck(e,t,n){e.constructor!==Array&&C(t,n,"Array")}static stringOrArrayParameterCheck(e,t,n){e.constructor!==Array&&typeof e!="string"&&C(t,n,"String or Array")}static numberParameterCheck(e,t,n){if(typeof e!="number"){if(typeof e=="string"&&e&&!isNaN(parseInt(e)))return;C(t,n,"Number")}}static batchIsEmpty(){return[new Error("Payload of the batch operation is empty. Please make that you have other operations in between startBatch() and executeBatch() to successfuly build a batch payload.")]}static handleHttpError(e,t){let n=new Error;return Object.keys(e).forEach(a=>{n[a]=e[a]}),t&&Object.keys(t).forEach(a=>{n[a]=t[a]}),n}static boolParameterCheck(e,t,n){typeof e!="boolean"&&C(t,n,"Boolean")}static guidParameterCheck(e,t,n){let a=S(e);return a||C(t,n,"GUID String"),a}static keyParameterCheck(e,t,n){try{o.stringParameterCheck(e,t,n);let a=S(e);if(a)return a;let r=e.split(",");if(r.length)for(let c=0;c{"use strict";$=class ${};$.Prefer=(E=class{static get(e){return`${$.Prefer.IncludeAnnotations}="${e}"`}},E.ReturnRepresentation="return=representation",E.Annotations=(D=class{},D.AssociatedNavigationProperty="Microsoft.Dynamics.CRM.associatednavigationproperty",D.LookupLogicalName="Microsoft.Dynamics.CRM.lookuplogicalname",D.All="*",D.FormattedValue="OData.Community.Display.V1.FormattedValue",D.FetchXmlPagingCookie="Microsoft.Dynamics.CRM.fetchxmlpagingcookie",D),E.IncludeAnnotations="odata.include-annotations",E);A=$});function K(o,e){if(typeof e=="string"){let t=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:Z|[-+]\d{2}:\d{2})$/.exec(e);if(t)return new Date(Date.UTC(+t[1],+t[2]-1,+t[3],+t[4],+t[5],+t[6]))}return e}var Y=b(()=>{"use strict"});function G(o,e){let t=null;if(o.indexOf("@")!==-1){let n=o.split("@");switch(n[1]){case"odata.context":t="oDataContext";break;case"odata.count":t="oDataCount",e=e!=null?parseInt(e):0;break;case"odata.nextLink":t="oDataNextLink";break;case"odata.deltaLink":t="oDataDeltaLink";break;case A.Prefer.Annotations.FormattedValue:t=n[0]+"_Formatted";break;case A.Prefer.Annotations.AssociatedNavigationProperty:t=n[0]+"_NavigationProperty";break;case A.Prefer.Annotations.LookupLogicalName:t=n[0]+"_LogicalName";break}}return[t,e]}function B(o,e){if(e){if(e.isRef&&o["@odata.id"]!=null)return l.convertToReferenceObject(o);if(e.toCount)return G("@odata.count",o["@odata.count"])[1]||0}let t=Object.keys(o);for(let a=0;a-1){s=s.trim();let u=s.substring(s.indexOf(`\r -`)+1).trim();r=r.concat(ee(u,e,t))}else{let u=/HTTP\/?\s*[\d.]*\s+(\d{3})\s+([\w\s]*)$/gm.exec(s),p=parseInt(u[1]),m=u[2].trim(),f=s.substring(s.indexOf("{"),s.lastIndexOf("}")+1);if(f){let d=B(JSON.parse(f,K),e[t]);if(p>=400){let R=ge(s.substring(s.indexOf(u[0])+u[0].length+1,s.indexOf("{")));r.push(i.handleHttpError(d,{status:p,statusText:m,statusMessage:m,headers:R}))}else r.push(d)}else if(/Content-Type: text\/plain/i.test(s)){let d=/\w+$/gi.exec(s.trim()),R=d&&d.length?d[0]:void 0;r.push(isNaN(Number(R))?R:Number(R))}else if(e.length&&e[t]&&e[t].hasOwnProperty("valueIfEmpty"))r.push(e[t].valueIfEmpty);else{let d=/OData-EntityId.+/i.exec(s);if(d&&d.length){let R=F(d[0]);r.push(R||void 0)}else r.push(void 0)}}t++}return r}function Ce(o){return window.atob(o)}function Ae(o,e,t){let n=o;t.hasOwnProperty("parse")&&(n=JSON.parse(n).value,n=Ce(n));var a={value:n};return e["x-ms-file-name"]&&(a.fileName=e["x-ms-file-name"]),e["x-ms-file-size"]&&(a.fileSize=parseInt(e["x-ms-file-size"])),O(e,"Location")&&(a.location=U(e,"Location")),a}function O(o,e){return o.hasOwnProperty(e)||o.hasOwnProperty(e.toLowerCase())}function U(o,e){return o[e]?o[e]:o[e.toLowerCase()]}function L(o,e,t){let n;if(o.length)if(o.indexOf("--batchresponse_")>-1){let a=ee(o,t);n=t.length===1&&t[0].convertedToBatch?a[0]:a}else O(e,"Content-Disposition")?n=Ae(o,e,t[0]):U(e,"Content-Type").startsWith("application/json")?n=B(JSON.parse(o,K),t[0]):n=isNaN(Number(o))?o:Number(o);else if(t.length&&t[0].hasOwnProperty("valueIfEmpty"))n=t[0].valueIfEmpty;else if(O(e,"OData-EntityId")){let a=U(e,"OData-EntityId"),r=F(a);r&&(n=r)}else O(e,"Location")&&(n={location:U(e,"Location")},e["x-ms-chunk-size"]&&(n.chunkSize=parseInt(e["x-ms-chunk-size"])));return n}var fe,te=b(()=>{"use strict";Z();v();P();Y();w();fe=/^([^()<>@,;:\\"\/[\]?={} \t]+)\s?:\s?(.*)/});function T(o){let e={};if(!o)return e;let t=o.split(`\r -`);for(let n=0,a=t.length;n0&&(e[r.substring(0,c)]=r.substring(c+2))}return e}var ne=b(()=>{"use strict"});var ae={};z(ae,{XhrWrapper:()=>I,executeRequest:()=>xe});function xe(o){return new Promise((e,t)=>{Pe(o,e,t)})}function Pe(o,e,t){let n=o.data,a=o.additionalHeaders,r=o.responseParams,c=o.abortSignal;if(c?.aborted){t(i.handleHttpError({name:"AbortError",code:20,message:"The user aborted a request."}));return}let s=new XMLHttpRequest;s.open(o.method,o.uri,o.isAsync||!1);for(let p in a)s.setRequestHeader(p,a[p]);s.onreadystatechange=function(){if(s.readyState===4)switch(c&&c.removeEventListener("abort",u),s.status){case 200:case 201:case 204:case 206:case 304:{let d=T(s.getAllResponseHeaders()),ce={data:L(s.responseText,d,r[o.requestId]),headers:d,status:s.status};s=null,e(ce);break}case 0:break;default:if(!s)break;let p,m;try{m=T(s.getAllResponseHeaders());let d=L(s.responseText,m,r[o.requestId]);if(Array.isArray(d)){t(d);break}p=d.error}catch{s.response.length>0?p={message:s.response}:p={message:"Unexpected Error"}}let f={status:s.status,statusText:s.statusText,headers:m};s=null,t(i.handleHttpError(p,f));break}},o.timeout&&(s.timeout=o.timeout),s.onerror=function(){let p=T(s.getAllResponseHeaders());t(i.handleHttpError({status:s.status,statusText:s.statusText,message:s.responseText||"Network Error",headers:p})),s=null},s.ontimeout=function(){let p=T(s.getAllResponseHeaders());t(i.handleHttpError({name:"TimeoutError",status:s.status,statusText:s.statusText,message:s.responseText||"Request Timed Out",headers:p})),s=null},s.onabort=function(){if(!s)return;let p=T(s.getAllResponseHeaders());t(i.handleHttpError({status:s.status,statusText:s.statusText,message:"Request aborted",headers:p})),s=null};let u=()=>{if(!s)return;let p=T(s.getAllResponseHeaders());t(i.handleHttpError({name:"AbortError",code:20,status:s.status,statusText:s.statusText,message:"The user aborted a request.",headers:p})),s.abort(),s=null};c&&c.addEventListener("abort",u),n?s.send(n):s.send(),I.afterSendEvent&&I.afterSendEvent()}var I,ie=b(()=>{"use strict";P();te();ne();I=class{}});var De={};z(De,{DynamicsWebApi:()=>H});v();P();var he=(o,e)=>l.isRunningWithinPortals()?new URL("_api",window.location.origin).toString()+"/":(o||(o=l.getClientUrl()),new URL(`api/${e.path}/v${e.version}`,o).toString()+"/"),_=(o,e,t)=>{let n=t[e];o?.version&&(i.stringParameterCheck(o.version,"DynamicsWebApi.setConfig",`config.${e}.version`),n.version=o.version),o?.path&&(i.stringParameterCheck(o.path,"DynamicsWebApi.setConfig",`config.${e}.path`),n.path=o.path),n.url=he(t.serverUrl,n)},k=class{static merge(e,t){t?.serverUrl&&(i.stringParameterCheck(t.serverUrl,"DynamicsWebApi.setConfig","config.serverUrl"),e.serverUrl=t.serverUrl),_(t?.dataApi,"dataApi",e),_(t?.searchApi,"searchApi",e),t?.impersonate&&(e.impersonate=i.guidParameterCheck(t.impersonate,"DynamicsWebApi.setConfig","config.impersonate")),t?.impersonateAAD&&(e.impersonateAAD=i.guidParameterCheck(t.impersonateAAD,"DynamicsWebApi.setConfig","config.impersonateAAD")),t?.onTokenRefresh&&(i.callbackParameterCheck(t.onTokenRefresh,"DynamicsWebApi.setConfig","config.onTokenRefresh"),e.onTokenRefresh=t.onTokenRefresh),t?.includeAnnotations&&(i.stringParameterCheck(t.includeAnnotations,"DynamicsWebApi.setConfig","config.includeAnnotations"),e.includeAnnotations=t.includeAnnotations),t?.timeout&&(i.numberParameterCheck(t.timeout,"DynamicsWebApi.setConfig","config.timeout"),e.timeout=t.timeout),t?.maxPageSize&&(i.numberParameterCheck(t.maxPageSize,"DynamicsWebApi.setConfig","config.maxPageSize"),e.maxPageSize=t.maxPageSize),t?.returnRepresentation&&(i.boolParameterCheck(t.returnRepresentation,"DynamicsWebApi.setConfig","config.returnRepresentation"),e.returnRepresentation=t.returnRepresentation),t?.useEntityNames&&(i.boolParameterCheck(t.useEntityNames,"DynamicsWebApi.setConfig","config.useEntityNames"),e.useEntityNames=t.useEntityNames),t?.headers&&(e.headers=t.headers)}static default(){return{serverUrl:null,impersonate:null,impersonateAAD:null,onTokenRefresh:null,includeAnnotations:null,maxPageSize:null,returnRepresentation:null,proxy:null,dataApi:{path:"data",version:"9.2",url:""},searchApi:{path:"search",version:"1.0",url:""}}}};k.mergeApiConfigs=_;v();P();v();v();P();var h=class h{static compose(e,t){if(e.path=e.path||"",e.functionName=e.functionName||"",e.url)i.stringParameterCheck(e.url,`DynamicsWebApi.${e.functionName}`,"request.url"),e.path=e.url.replace(t.dataApi.url,"");else if(!e._isUnboundRequest&&!e.contentId&&!e.collection&&i.parameterCheck(e.collection,`DynamicsWebApi.${e.functionName}`,"request.collection"),e.collection!=null&&(i.stringParameterCheck(e.collection,`DynamicsWebApi.${e.functionName}`,"request.collection"),e.path=e.collection,e.key&&(e.key=i.keyParameterCheck(e.key,`DynamicsWebApi.${e.functionName}`,"request.key"),e.path+=`(${e.key})`)),e.contentId&&(i.stringParameterCheck(e.contentId,`DynamicsWebApi.${e.functionName}`,"request.contentId"),e.contentId.startsWith("$")&&(e.path=e.path?`${e.contentId}/${e.path}`:e.contentId)),e._additionalUrl&&(e.path&&(e.path+="/"),e.path+=e._additionalUrl),e.path=h.composeUrl(e,t,e.path),e.fetchXml){i.stringParameterCheck(e.fetchXml,`DynamicsWebApi.${e.functionName}`,"request.fetchXml");let n=e.path.indexOf("?")===-1?"?":"&";e.path+=`${n}fetchXml=${encodeURIComponent(e.fetchXml)}`}return e.hasOwnProperty("async")&&e.async!=null?i.boolParameterCheck(e.async,`DynamicsWebApi.${e.functionName}`,"request.async"):e.async=!0,e.headers=h.composeHeaders(e,t),e}static composeUrl(e,t,n="",a="&"){let r=[];if(e){if(e.navigationProperty){if(i.stringParameterCheck(e.navigationProperty,`DynamicsWebApi.${e.functionName}`,"request.navigationProperty"),n+="/"+e.navigationProperty,e.navigationPropertyKey){let c=i.keyParameterCheck(e.navigationPropertyKey,`DynamicsWebApi.${e.functionName}`,"request.navigationPropertyKey");n+="("+c+")"}e.navigationProperty==="Attributes"&&e.metadataAttributeType&&(i.stringParameterCheck(e.metadataAttributeType,`DynamicsWebApi.${e.functionName}`,"request.metadataAttributeType"),n+="/"+e.metadataAttributeType)}if(e.select?.length&&(i.arrayParameterCheck(e.select,`DynamicsWebApi.${e.functionName}`,"request.select"),e.functionName=="retrieve"&&e.select.length==1&&e.select[0].endsWith("/$ref")?n+="/"+e.select[0]:(e.select[0].startsWith("/")&&e.functionName=="retrieve"&&(e.navigationProperty==null?n+=e.select.shift():e.select.shift()),e.select.length&&r.push("$select="+e.select.join(",")))),e.filter){i.stringParameterCheck(e.filter,`DynamicsWebApi.${e.functionName}`,"request.filter");let c=/[^"']{([\w\d]{8}[-]?(?:[\w\d]{4}[-]?){3}[\w\d]{12})}(?:[^"']|$)/g,s=e.filter,u=null;for(;(u=c.exec(s))!==null;){u.index===c.lastIndex&&c.lastIndex++;let p=u[0].endsWith(")")?")":" ";s=s.replace(u[0]," "+u[1]+p)}r.push("$filter="+encodeURIComponent(s))}if(e.fieldName&&(i.stringParameterCheck(e.fieldName,`DynamicsWebApi.${e.functionName}`,"request.fieldName"),n+="/"+e.fieldName),e.savedQuery&&r.push("savedQuery="+i.guidParameterCheck(e.savedQuery,`DynamicsWebApi.${e.functionName}`,"request.savedQuery")),e.userQuery&&r.push("userQuery="+i.guidParameterCheck(e.userQuery,`DynamicsWebApi.${e.functionName}`,"request.userQuery")),e.apply&&(i.stringParameterCheck(e.apply,`DynamicsWebApi.${e.functionName}`,"request.apply"),r.push("$apply="+e.apply)),e.count&&(i.boolParameterCheck(e.count,`DynamicsWebApi.${e.functionName}`,"request.count"),r.push("$count="+e.count)),e.top&&e.top>0&&(i.numberParameterCheck(e.top,`DynamicsWebApi.${e.functionName}`,"request.top"),r.push("$top="+e.top)),e.orderBy!=null&&e.orderBy.length&&(i.arrayParameterCheck(e.orderBy,`DynamicsWebApi.${e.functionName}`,"request.orderBy"),r.push("$orderby="+e.orderBy.join(","))),e.partitionId&&(i.stringParameterCheck(e.partitionId,`DynamicsWebApi.${e.functionName}`,"request.partitionId"),r.push("partitionid='"+e.partitionId+"'")),e.downloadSize&&(i.stringParameterCheck(e.downloadSize,`DynamicsWebApi.${e.functionName}`,"request.downloadSize"),r.push("size="+e.downloadSize)),e.queryParams?.length&&(i.arrayParameterCheck(e.queryParams,`DynamicsWebApi.${e.functionName}`,"request.queryParams"),r.push(e.queryParams.join("&"))),e.fileName&&(i.stringParameterCheck(e.fileName,`DynamicsWebApi.${e.functionName}`,"request.fileName"),r.push("x-ms-file-name="+e.fileName)),e.data&&i.parameterCheck(e.data,`DynamicsWebApi.${e.functionName}`,"request.data"),e.isBatch&&i.boolParameterCheck(e.isBatch,`DynamicsWebApi.${e.functionName}`,"request.isBatch"),l.isNull(e.inChangeSet)||i.boolParameterCheck(e.inChangeSet,`DynamicsWebApi.${e.functionName}`,"request.inChangeSet"),e.isBatch&&l.isNull(e.inChangeSet)&&(e.inChangeSet=!0),e.timeout&&i.numberParameterCheck(e.timeout,`DynamicsWebApi.${e.functionName}`,"request.timeout"),e.expand?.length)if(i.stringOrArrayParameterCheck(e.expand,`DynamicsWebApi.${e.functionName}`,"request.expand"),typeof e.expand=="string")r.push("$expand="+e.expand);else{let c=[];for(let s=0;s0&&(i.numberParameterCheck(r,`DynamicsWebApi.${e.functionName}`,"request.maxPageSize"),u.push("odata.maxpagesize="+r)),c&&(i.boolParameterCheck(c,`DynamicsWebApi.${e.functionName}`,"request.trackChanges"),u.push("odata.track-changes")),s&&(i.boolParameterCheck(s,`DynamicsWebApi.${e.functionName}`,"request.continueOnError"),u.push("odata.continue-on-error")),u.join(",")}static convertToBatch(e,t,n){let a=`dwa_batch_${l.generateUUID()}`,r=[],c=null,s=1e5;e.forEach(p=>{p.functionName="executeBatch",n?.inChangeSet===!1&&(p.inChangeSet=!1);let m=p.method==="GET"?!1:!!p.inChangeSet;if(!m&&c&&(r.push(` ---${c}--`),c=null,s=1e5),c||(r.push(` ---${a}`),m&&(c=`changeset_${l.generateUUID()}`,r.push("Content-Type: multipart/mixed;boundary="+c))),m&&r.push(` ---${c}`),r.push("Content-Type: application/http"),r.push("Content-Transfer-Encoding: binary"),m){let f=p.headers.hasOwnProperty("Content-ID")?p.headers["Content-ID"]:++s;r.push(`Content-ID: ${f}`)}p.path?.startsWith("$")?r.push(` -${p.method} ${p.path} HTTP/1.1`):r.push(` -${p.method} ${t.dataApi.url}${p.path} HTTP/1.1`),p.method==="GET"?r.push("Accept: application/json"):r.push("Content-Type: application/json");for(let f in p.headers)f==="Authorization"||f==="Content-ID"||r.push(`${f}: ${p.headers[f]}`);p.data&&r.push(` -${h.processData(p.data,t)}`)}),c&&r.push(` ---${c}--`),r.push(` ---${a}--`);let u=h.setStandardHeaders(n?.userHeaders);return u["Content-Type"]=`multipart/mixed;boundary=${a}`,{headers:u,body:r.join(` -`)}}static findCollectionName(e){let t=null;if(!l.isNull(h.entityNames)&&(t=h.entityNames[e],l.isNull(t))){for(let n in h.entityNames)if(h.entityNames[n]===e)return e}return t}static processData(e,t){let n=null;if(e){if(e instanceof Uint8Array||e instanceof Uint16Array||e instanceof Uint32Array)return e;n=JSON.stringify(e,(a,r)=>{if(a.endsWith("@odata.bind")||a.endsWith("@odata.id")){if(typeof r=="string"&&!r.startsWith("$")){if(/\(\{[\w\d-]+\}\)/g.test(r)&&(r=r.replace(/(.+)\(\{([\w\d-]+)\}\)/g,"$1($2)")),t.useEntityNames){let c=/([\w_]+)(\([\d\w-]+\))$/,s=c.exec(r);if(s&&s.length>2){let u=h.findCollectionName(s[1]);l.isNull(u)||(r=r.replace(c,u+"$2"))}}r.startsWith(t.dataApi.url)||(a.endsWith("@odata.bind")?r.startsWith("/")||(r="/"+r):r=t.dataApi.url+r.replace(/^\//,""))}}else(a.startsWith("oData")||a.endsWith("_Formatted")||a.endsWith("_NavigationProperty")||a.endsWith("_LogicalName"))&&(r=void 0);return r}),n=n.replace(/[\u007F-\uFFFF]/g,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})}return n}static setStandardHeaders(e={}){return e.Accept||(e.Accept="application/json"),e["OData-MaxVersion"]||(e["OData-MaxVersion"]="4.0"),e["OData-Version"]||(e["OData-Version"]="4.0"),e["Content-Range"]?e["Content-Type"]="application/octet-stream":e["Content-Type"]||(e["Content-Type"]="application/json; charset=utf-8"),e}};h.entityNames=null;var y=h;P();async function re(o){return(ie(),X(ae)).executeRequest(o)}var oe=(o,e)=>{W[o]?W[o].push(e):W[o]=[e]},ke=(o,e)=>{x[o]?x[o].push(e):x[o]=[e]},V=o=>{delete W[o],x.hasOwnProperty(o)&&delete x[o]},se=async(o,e)=>{try{let t=await N.sendRequest(o,e);return V(o.requestId),t}catch(t){throw V(o.requestId),t}finally{V(o.requestId)}},x={},W={},N=class o{static async sendRequest(e,t){e.headers=e.headers||{},e.responseParameters=e.responseParameters||{},e.requestId=e.requestId||l.generateUUID(),oe(e.requestId,e.responseParameters);let n=null,a=e.responseParameters?.convertedToBatch;if(e.path==="$batch"&&!a){let s=x[e.requestId];if(!s)throw i.batchIsEmpty();let u=y.convertToBatch(s,t,e);n=u.body,e.headers={...u.headers,...e.headers},delete x[e.requestId]}else n=a?e.data:y.processData(e.data,t),a||(e.headers=y.setStandardHeaders(e.headers));t.impersonate&&!e.headers.MSCRMCallerID&&(e.headers.MSCRMCallerID=t.impersonate),t.impersonateAAD&&!e.headers.CallerObjectId&&(e.headers.CallerObjectId=t.impersonateAAD);let r=null;if(t.onTokenRefresh&&(!e.headers||e.headers&&!e.headers.Authorization)&&(r=await t.onTokenRefresh(),!r))throw new Error("Token is empty. Request is aborted.");r&&(e.headers.Authorization="Bearer "+(r.hasOwnProperty("accessToken")?r.accessToken:r)),l.isRunningWithinPortals()&&(e.headers.__RequestVerificationToken=await window.shell.getTokenDeferred());let c=e.apiConfig?e.apiConfig.url:t.dataApi.url;return await re({method:e.method,uri:c.toString()+e.path,data:n,additionalHeaders:e.headers,responseParams:W,isAsync:e.async,timeout:e.timeout||t.timeout,proxy:t.proxy,requestId:e.requestId,abortSignal:e.signal})}static async _getCollectionNames(e,t){if(!l.isNull(y.entityNames))return y.findCollectionName(e)||e;let n=y.compose({method:"GET",collection:"EntityDefinitions",select:["EntitySetName","LogicalName"],noCache:!0,functionName:"retrieveMultiple"},t),a=await se(n,t);y.entityNames={};for(let r=0;r-1}static async _checkCollectionName(e,t){if(!e||o._isEntityNameException(e)||(e=e.toLowerCase(),!t.useEntityNames))return e;try{return await o._getCollectionNames(e,t)}catch(n){throw new Error("Unable to fetch Collection Names. Error: "+n.message)}}static async makeRequest(e,t){if(e.responseParameters=e.responseParameters||{},e.userHeaders=e.headers,delete e.headers,!e.isBatch){let n=await o._checkCollectionName(e.collection,t);if(e.collection=n,y.compose(e,t),e.responseParameters.convertedToBatch=!1,e.path.length>2e3){let a=y.convertToBatch([e],t);e.method="POST",e.path="$batch",e.data=a.body,e.headers={...a.headers,...e.userHeaders},e.responseParameters.convertedToBatch=!0}return se(e,t)}y.compose(e,t),oe(e.requestId,e.responseParameters),ke(e.requestId,e)}static _clearTestData(){y.entityNames=null,W={},x={}}static getCollectionName(e){return y.findCollectionName(e)}};var H=class o{constructor(e){this._config=k.default();this._isBatch=!1;this._batchRequestId=null;this.setConfig=e=>k.merge(this._config,e);this._makeRequest=async e=>(e.isBatch=this._isBatch,this._batchRequestId&&(e.requestId=this._batchRequestId),N.makeRequest(e,this._config));this.create=async e=>{i.parameterCheck(e,"DynamicsWebApi.create","request");let t;return e.functionName?t=e:(t=l.copyRequest(e),t.functionName="create"),t.method="POST",(await this._makeRequest(t))?.data};this.retrieve=async e=>{i.parameterCheck(e,"DynamicsWebApi.retrieve","request");let t;return e.functionName?t=e:(t=l.copyRequest(e),t.functionName="retrieve"),t.method="GET",t.responseParameters={isRef:t.select?.length===1&&t.select[0].endsWith("/$ref")},(await this._makeRequest(t))?.data};this.update=async e=>{i.parameterCheck(e,"DynamicsWebApi.update","request");let t;e.functionName?t=e:(t=l.copyRequest(e),t.functionName="update"),t.method||(t.method=/EntityDefinitions|RelationshipDefinitions|GlobalOptionSetDefinitions/.test(t.collection||"")?"PUT":"PATCH"),t.responseParameters={valueIfEmpty:!0},t.ifmatch==null&&(t.ifmatch="*");let n=t.ifmatch;try{return(await this._makeRequest(t))?.data}catch(a){if(n&&a.status===412)return!1;throw a}};this.updateSingleProperty=async e=>{i.parameterCheck(e,"DynamicsWebApi.updateSingleProperty","request"),i.parameterCheck(e.fieldValuePair,"DynamicsWebApi.updateSingleProperty","request.fieldValuePair");var t=Object.keys(e.fieldValuePair)[0],n=e.fieldValuePair[t];let a=l.copyRequest(e);return a.navigationProperty=t,a.data={value:n},a.functionName="updateSingleProperty",a.method="PUT",delete a.fieldValuePair,(await this._makeRequest(a))?.data};this.deleteRecord=async e=>{i.parameterCheck(e,"DynamicsWebApi.deleteRecord","request");let t;e.functionName?t=e:(t=l.copyRequest(e),t.functionName="deleteRecord"),t.method="DELETE",t.responseParameters={valueIfEmpty:!0};let n=t.ifmatch;try{return(await this._makeRequest(t))?.data}catch(a){if(n&&a.status===412)return!1;throw a}};this.upsert=async e=>{i.parameterCheck(e,"DynamicsWebApi.upsert","request");let t=l.copyRequest(e);t.method="PATCH",t.functionName="upsert";let n=t.ifnonematch,a=t.ifmatch;try{return(await this._makeRequest(t))?.data}catch(r){if(n&&r.status===412)return null;if(a&&r.status===404)return null;throw r}};this._uploadFileChunk=async(e,t,n,a=0)=>{if(l.setFileChunk(e,t,n,a),await this._makeRequest(e),a+=n,a<=t.length)return this._uploadFileChunk(e,t,n,a)};this.uploadFile=async e=>{i.throwBatchIncompatible("DynamicsWebApi.uploadFile",this._isBatch),i.parameterCheck(e,"DynamicsWebApi.uploadFile","request");let t=l.copyRequest(e,["data"]);t.method="PATCH",t.functionName="uploadFile",t.transferMode="chunked";let n=await this._makeRequest(t);return t.url=n?.data.location,delete t.transferMode,delete t.fieldName,delete t.fileName,this._uploadFileChunk(t,e.data,n?.data.chunkSize)};this._downloadFileChunk=async(e,t=0,n="")=>{e.range="bytes="+t+"-"+(t+l.downloadChunkSize-1),e.downloadSize="full";let a=await this._makeRequest(e);return e.url=a?.data.location,n+=a?.data.value,t+=l.downloadChunkSize,t<=a?.data.fileSize?this._downloadFileChunk(e,t,n):{fileName:a?.data.fileName,fileSize:a?.data.fileSize,data:l.convertToFileBuffer(n)}};this.downloadFile=e=>{i.throwBatchIncompatible("DynamicsWebApi.downloadFile",this._isBatch),i.parameterCheck(e,"DynamicsWebApi.downloadFile","request");let t=l.copyRequest(e);return t.method="GET",t.functionName="downloadFile",t.responseParameters={parse:!0},this._downloadFileChunk(t)};this.retrieveMultiple=async(e,t)=>{i.parameterCheck(e,"DynamicsWebApi.retrieveMultiple","request");let n;return e.functionName?n=e:(n=l.copyRequest(e),n.functionName="retrieveMultiple"),n.method="GET",t&&(i.stringParameterCheck(t,"DynamicsWebApi.retrieveMultiple","nextPageLink"),n.url=t),(await this._makeRequest(n))?.data};this._retrieveAllRequest=async(e,t,n=[])=>{let a=await this.retrieveMultiple(e,t);n=n.concat(a.value);let r=a.oDataNextLink;if(r)return this._retrieveAllRequest(e,r,n);let c={value:n};return a.oDataDeltaLink&&(c["@odata.deltaLink"]=a.oDataDeltaLink,c.oDataDeltaLink=a.oDataDeltaLink),c};this.retrieveAll=e=>(i.throwBatchIncompatible("DynamicsWebApi.retrieveAll",this._isBatch),this._retrieveAllRequest(e));this.count=async e=>{i.parameterCheck(e,"DynamicsWebApi.count","request");let t=l.copyRequest(e);return t.method="GET",t.functionName="count",t.filter?.length?t.count=!0:t.navigationProperty="$count",t.responseParameters={toCount:t.count},(await this._makeRequest(t))?.data};this.countAll=async e=>{i.throwBatchIncompatible("DynamicsWebApi.countAll",this._isBatch),i.parameterCheck(e,"DynamicsWebApi.countAll","request");let t=await this._retrieveAllRequest(e);return t&&t.value?t.value.length:0};this.fetch=async e=>{i.parameterCheck(e,"DynamicsWebApi.fetch","request");let t=l.copyRequest(e);if(t.method="GET",t.functionName="fetch",i.stringParameterCheck(t.fetchXml,"DynamicsWebApi.fetch","request.fetchXml"),t.fetchXml&&!/^{i.parameterCheck(e,"DynamicsWebApi.fetchAll","request");let t=async(n,a=[])=>{let r=await this.fetch(n);return a=a.concat(r.value),r.PagingInfo?(n.pageNumber=r.PagingInfo.nextPage,n.pagingCookie=r.PagingInfo.cookie,t(n,a)):{value:a}};return i.throwBatchIncompatible("DynamicsWebApi.fetchAll",this._isBatch),t(e)};this.associate=async e=>{i.parameterCheck(e,"DynamicsWebApi.associate","request");let t=l.copyRequest(e);t.method="POST",t.functionName="associate",i.stringParameterCheck(e.relatedCollection,"DynamicsWebApi.associate","request.relatedcollection"),i.stringParameterCheck(e.relationshipName,"DynamicsWebApi.associate","request.relationshipName");let n=i.keyParameterCheck(e.primaryKey,"DynamicsWebApi.associate","request.primaryKey"),a=i.keyParameterCheck(e.relatedKey,"DynamicsWebApi.associate","request.relatedKey");t.navigationProperty=e.relationshipName+"/$ref",t.key=n,t.data={"@odata.id":`${e.relatedCollection}(${a})`},await this._makeRequest(t)};this.disassociate=async e=>{i.parameterCheck(e,"DynamicsWebApi.disassociate","request");let t=l.copyRequest(e);t.method="DELETE",t.functionName="disassociate",i.stringParameterCheck(e.relationshipName,"DynamicsWebApi.disassociate","request.relationshipName");let n=i.keyParameterCheck(e.primaryKey,"DynamicsWebApi.disassociate","request.primaryKey"),a=i.keyParameterCheck(e.relatedKey,"DynamicsWebApi.disassociate","request.relatedId");t.key=n,t.navigationProperty=`${e.relationshipName}(${a})/$ref`,await this._makeRequest(t)};this.associateSingleValued=async e=>{i.parameterCheck(e,"DynamicsWebApi.associateSingleValued","request");let t=l.copyRequest(e);t.method="PUT",t.functionName="associateSingleValued";let n=i.keyParameterCheck(e.primaryKey,"DynamicsWebApi.associateSingleValued","request.primaryKey"),a=i.keyParameterCheck(e.relatedKey,"DynamicsWebApi.associateSingleValued","request.relatedKey");i.stringParameterCheck(e.navigationProperty,"DynamicsWebApi.associateSingleValued","request.navigationProperty"),i.stringParameterCheck(e.relatedCollection,"DynamicsWebApi.associateSingleValued","request.relatedcollection"),t.navigationProperty+="/$ref",t.key=n,t.data={"@odata.id":`${e.relatedCollection}(${a})`},await this._makeRequest(t)};this.disassociateSingleValued=async e=>{i.parameterCheck(e,"DynamicsWebApi.disassociateSingleValued","request");let t=l.copyRequest(e);t.method="DELETE",t.functionName="disassociateSingleValued";let n=i.keyParameterCheck(e.primaryKey,"DynamicsWebApi.disassociateSingleValued","request.primaryKey");i.stringParameterCheck(e.navigationProperty,"DynamicsWebApi.disassociateSingleValued","request.navigationProperty"),t.navigationProperty+="/$ref",t.key=n,await this._makeRequest(t)};this.callFunction=async e=>{i.parameterCheck(e,"DynamicsWebApi.callFunction","request");let t=p=>p.name||p.functionName,n=typeof e!="string",a=n?t(e):e,r=n?"request.name":"name",c=n?l.copyObject(e,["name"]):{functionName:a};i.stringParameterCheck(a,"DynamicsWebApi.callFunction",r);let s=l.buildFunctionParameters(c.parameters);return c.method="GET",c._additionalUrl=a+s.key,c.queryParams=s.queryParams,c._isUnboundRequest=!c.collection,c.functionName="callFunction",(await this._makeRequest(c))?.data};this.callAction=async e=>{i.parameterCheck(e,"DynamicsWebApi.callAction","request"),i.stringParameterCheck(e.actionName,"DynamicsWebApi.callAction","request.actionName");let t=l.copyRequest(e,["action"]);return t.method="POST",t.functionName="callAction",t._additionalUrl=e.actionName,t._isUnboundRequest=!t.collection,t.data=e.action,(await this._makeRequest(t))?.data};this.createEntity=e=>{i.parameterCheck(e,"DynamicsWebApi.createEntity","request"),i.parameterCheck(e.data,"DynamicsWebApi.createEntity","request.data");let t=l.copyRequest(e);return t.collection="EntityDefinitions",t.functionName="createEntity",this.create(t)};this.updateEntity=e=>{i.parameterCheck(e,"DynamicsWebApi.updateEntity","request"),i.parameterCheck(e.data,"DynamicsWebApi.updateEntity","request.data"),i.guidParameterCheck(e.data.MetadataId,"DynamicsWebApi.updateEntity","request.data.MetadataId");let t=l.copyRequest(e);return t.collection="EntityDefinitions",t.key=t.data.MetadataId,t.functionName="updateEntity",t.method="PUT",this.update(t)};this.retrieveEntity=e=>{i.parameterCheck(e,"DynamicsWebApi.retrieveEntity","request"),i.keyParameterCheck(e.key,"DynamicsWebApi.retrieveEntity","request.key");let t=l.copyRequest(e);return t.collection="EntityDefinitions",t.functionName="retrieveEntity",this.retrieve(t)};this.retrieveEntities=e=>{let t=e?l.copyRequest(e):{};return t.collection="EntityDefinitions",t.functionName="retrieveEntities",this.retrieveMultiple(t)};this.createAttribute=e=>{i.parameterCheck(e,"DynamicsWebApi.createAttribute","request"),i.parameterCheck(e.data,"DynamicsWebApi.createAttribute","request.data"),i.keyParameterCheck(e.entityKey,"DynamicsWebApi.createAttribute","request.entityKey");let t=l.copyRequest(e);return t.collection="EntityDefinitions",t.functionName="retrieveEntity",t.navigationProperty="Attributes",t.key=e.entityKey,this.create(t)};this.updateAttribute=e=>{i.parameterCheck(e,"DynamicsWebApi.updateAttribute","request"),i.parameterCheck(e.data,"DynamicsWebApi.updateAttribute","request.data"),i.keyParameterCheck(e.entityKey,"DynamicsWebApi.updateAttribute","request.entityKey"),i.guidParameterCheck(e.data.MetadataId,"DynamicsWebApi.updateAttribute","request.data.MetadataId"),e.castType&&i.stringParameterCheck(e.castType,"DynamicsWebApi.updateAttribute","request.castType");let t=l.copyRequest(e);return t.collection="EntityDefinitions",t.navigationProperty="Attributes",t.navigationPropertyKey=e.data.MetadataId,t.metadataAttributeType=e.castType,t.key=e.entityKey,t.functionName="updateAttribute",t.method="PUT",this.update(t)};this.retrieveAttributes=e=>{i.parameterCheck(e,"DynamicsWebApi.retrieveAttributes","request"),i.keyParameterCheck(e.entityKey,"DynamicsWebApi.retrieveAttributes","request.entityKey"),e.castType&&i.stringParameterCheck(e.castType,"DynamicsWebApi.retrieveAttributes","request.castType");let t=l.copyRequest(e);return t.collection="EntityDefinitions",t.navigationProperty="Attributes",t.metadataAttributeType=e.castType,t.key=e.entityKey,t.functionName="retrieveAttributes",this.retrieveMultiple(t)};this.retrieveAttribute=e=>{i.parameterCheck(e,"DynamicsWebApi.retrieveAttributes","request"),i.keyParameterCheck(e.entityKey,"DynamicsWebApi.retrieveAttribute","request.entityKey"),i.keyParameterCheck(e.attributeKey,"DynamicsWebApi.retrieveAttribute","request.attributeKey"),e.castType&&i.stringParameterCheck(e.castType,"DynamicsWebApi.retrieveAttribute","request.castType");let t=l.copyRequest(e);return t.collection="EntityDefinitions",t.navigationProperty="Attributes",t.navigationPropertyKey=e.attributeKey,t.metadataAttributeType=e.castType,t.key=e.entityKey,t.functionName="retrieveAttribute",this.retrieve(t)};this.createRelationship=e=>{i.parameterCheck(e,"DynamicsWebApi.createRelationship","request"),i.parameterCheck(e.data,"DynamicsWebApi.createRelationship","request.data");let t=l.copyRequest(e);return t.collection="RelationshipDefinitions",t.functionName="createRelationship",this.create(t)};this.updateRelationship=e=>{i.parameterCheck(e,"DynamicsWebApi.updateRelationship","request"),i.parameterCheck(e.data,"DynamicsWebApi.updateRelationship","request.data"),i.guidParameterCheck(e.data.MetadataId,"DynamicsWebApi.updateRelationship","request.data.MetadataId"),e.castType&&i.stringParameterCheck(e.castType,"DynamicsWebApi.updateRelationship","request.castType");let t=l.copyRequest(e);return t.collection="RelationshipDefinitions",t.key=e.data.MetadataId,t.navigationProperty=e.castType,t.functionName="updateRelationship",t.method="PUT",this.update(t)};this.deleteRelationship=e=>{i.parameterCheck(e,"DynamicsWebApi.deleteRelationship","request"),i.keyParameterCheck(e.key,"DynamicsWebApi.deleteRelationship","request.key");let t=l.copyRequest(e);return t.collection="RelationshipDefinitions",t.functionName="deleteRelationship",this.deleteRecord(t)};this.retrieveRelationships=e=>{let t=e?l.copyRequest(e):{};return t.collection="RelationshipDefinitions",t.functionName="retrieveRelationships",e&&e.castType&&(i.stringParameterCheck(e.castType,"DynamicsWebApi.retrieveRelationships","request.castType"),t.navigationProperty=e.castType),this.retrieveMultiple(t)};this.retrieveRelationship=e=>{i.parameterCheck(e,"DynamicsWebApi.retrieveRelationship","request"),i.keyParameterCheck(e.key,"DynamicsWebApi.retrieveRelationship","request.key"),e.castType&&i.stringParameterCheck(e.castType,"DynamicsWebApi.retrieveRelationship","request.castType");let t=l.copyRequest(e);return t.collection="RelationshipDefinitions",t.navigationProperty=e.castType,t.functionName="retrieveRelationship",this.retrieve(t)};this.createGlobalOptionSet=e=>{i.parameterCheck(e,"DynamicsWebApi.createGlobalOptionSet","request"),i.parameterCheck(e.data,"DynamicsWebApi.createGlobalOptionSet","request.data");let t=l.copyRequest(e);return t.collection="GlobalOptionSetDefinitions",t.functionName="createGlobalOptionSet",this.create(t)};this.updateGlobalOptionSet=e=>{i.parameterCheck(e,"DynamicsWebApi.updateGlobalOptionSet","request"),i.parameterCheck(e.data,"DynamicsWebApi.updateGlobalOptionSet","request.data"),i.guidParameterCheck(e.data.MetadataId,"DynamicsWebApi.updateGlobalOptionSet","request.data.MetadataId"),e.castType&&i.stringParameterCheck(e.castType,"DynamicsWebApi.updateGlobalOptionSet","request.castType");let t=l.copyRequest(e);return t.collection="GlobalOptionSetDefinitions",t.key=e.data.MetadataId,t.functionName="updateGlobalOptionSet",t.method="PUT",this.update(t)};this.deleteGlobalOptionSet=e=>{i.parameterCheck(e,"DynamicsWebApi.deleteGlobalOptionSet","request");let t=l.copyRequest(e);return t.collection="GlobalOptionSetDefinitions",t.functionName="deleteGlobalOptionSet",this.deleteRecord(t)};this.retrieveGlobalOptionSet=e=>{i.parameterCheck(e,"DynamicsWebApi.retrieveGlobalOptionSet","request"),e.castType&&i.stringParameterCheck(e.castType,"DynamicsWebApi.retrieveGlobalOptionSet","request.castType");let t=l.copyRequest(e);return t.collection="GlobalOptionSetDefinitions",t.navigationProperty=e.castType,t.functionName="retrieveGlobalOptionSet",this.retrieve(t)};this.retrieveGlobalOptionSets=e=>{let t=e?l.copyRequest(e):{};return t.collection="GlobalOptionSetDefinitions",t.functionName="retrieveGlobalOptionSets",e?.castType&&(i.stringParameterCheck(e.castType,"DynamicsWebApi.retrieveGlobalOptionSets","request.castType"),t.navigationProperty=e.castType),this.retrieveMultiple(t)};this.retrieveCsdlMetadata=async e=>{let t=e?l.copyRequest(e):{};return t.collection="$metadata",t.functionName="retrieveCsdlMetadata",e?.addAnnotations&&(i.boolParameterCheck(e.addAnnotations,"DynamicsWebApi.retrieveCsdlMetadata","request.addAnnotations"),t.includeAnnotations="*"),(await this._makeRequest(t))?.data};this.search=async e=>{i.parameterCheck(e,"DynamicsWebApi.search","request");let t=l.isObject(e),n=t?"request.query.search":"term",a=t?l.copyObject(e):{query:{search:e}};return i.parameterCheck(a.query,"DynamicsWebApi.search","request.query"),i.stringParameterCheck(a.query.search,"DynamicsWebApi.search",n),i.maxLengthStringParameterCheck(a.query.search,"DynamicsWebApi.search",n,100),a.collection="query",a.functionName="search",a.method="POST",a.data=a.query,a.apiConfig=this._config.searchApi,delete a.query,(await this._makeRequest(a))?.data};this.suggest=async e=>{i.parameterCheck(e,"DynamicsWebApi.suggest","request");let t=l.isObject(e),n=t?"request.query.search":"term",a=t?l.copyObject(e):{query:{search:e}};return i.parameterCheck(a.query,"DynamicsWebApi.suggest","request.query"),i.stringParameterCheck(a.query.search,"DynamicsWebApi.suggest",n),i.maxLengthStringParameterCheck(a.query.search,"DynamicsWebApi.suggest",n,100),a.functionName=a.collection="suggest",a.method="POST",a.data=a.query,a.apiConfig=this._config.searchApi,delete a.query,(await this._makeRequest(a))?.data};this.autocomplete=async e=>{i.parameterCheck(e,"DynamicsWebApi.autocomplete","request");let t=l.isObject(e),n=t?"request.query.search":"term",a=t?l.copyObject(e):{query:{search:e}};return t&&i.parameterCheck(a.query,"DynamicsWebApi.autocomplete","request.query"),i.stringParameterCheck(a.query.search,"DynamicsWebApi.autocomplete",n),i.maxLengthStringParameterCheck(a.query.search,"DynamicsWebApi.autocomplete",n,100),a.functionName=a.collection="autocomplete",a.method="POST",a.data=a.query,a.apiConfig=this._config.searchApi,delete a.query,(await this._makeRequest(a))?.data};this.startBatch=()=>{this._isBatch=!0,this._batchRequestId=l.generateUUID()};this.executeBatch=async e=>{i.throwBatchNotStarted(this._isBatch);let t=e?l.copyRequest(e):{};return t.collection="$batch",t.method="POST",t.functionName="executeBatch",t.requestId=this._batchRequestId,this._batchRequestId=null,this._isBatch=!1,(await this._makeRequest(t))?.data};this.initializeInstance=e=>new o(e||this._config);this.Utility={getCollectionName:e=>N.getCollectionName(e)};k.merge(this._config,e)}};return X(De);})(); +/*! dynamics-web-api v2.1.5 (c) 2024 Aleksandr Rogov */ +"use strict";var _dynamicsWebApiExports=(()=>{var _=Object.defineProperty;var he=Object.getOwnPropertyDescriptor;var fe=Object.getOwnPropertyNames;var ge=Object.prototype.hasOwnProperty;var f=(n,e)=>()=>(n&&(e=n(n=0)),e);var Z=(n,e)=>{for(var t in e)_(n,t,{get:e[t],enumerable:!0})},Re=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of fe(e))!ge.call(n,a)&&a!==t&&_(n,a,{get:()=>e[a],enumerable:!(i=he(e,a))||i.enumerable});return n};var Y=n=>Re(_({},"__esModule",{value:!0}),n);function be(){return window.crypto}function ee(){return be().getRandomValues(new Uint8Array(1))}var te=f(()=>{"use strict"});function ne(n){return!!new RegExp(M,"i").exec(n)}function W(n){let e=new RegExp("^{?("+M+")}?$","i").exec(n);return e?e[1]:null}function F(n){let e=new RegExp("("+M+")\\)$","i").exec(n);return e?e[1]:null}var M,w=f(()=>{"use strict";M="[0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12}"});var Ae,y,l,D=f(()=>{"use strict";te();w();Ae=4194304,y=class y{static buildFunctionParameters(e){if(e){let t=Object.keys(e),i=[],a=[];for(let o=1;o<=t.length;o++){let c=t[o-1],s=e[c];s!=null&&(typeof s=="string"&&!s.startsWith("Microsoft.Dynamics.CRM")&&!ne(s)?s=`'${s}'`:typeof s=="object"&&(s=JSON.stringify(s)),i.push(`${c}=@p${o}`),a.push(`@p${o}=${W(s)||s}`))}return{key:`(${i.join(",")})`,queryParams:a}}else return{key:"()"}}static getFetchXmlPagingCookie(e="",t=1){e=decodeURIComponent(decodeURIComponent(e));let i=/pagingcookie="()/.exec(e);if(i!=null){let a=parseInt(i[2]);return{cookie:i[1].replace(//g,">").replace(/\"/g,"'").replace(/\'/g,"""),page:a,nextPage:a+1}}else return{cookie:"",page:t,nextPage:t+1}}static convertToReferenceObject(e){let t=/\/(\w+)\(([0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12})/i.exec(e["@odata.id"]);return{id:t[2],collection:t[1],oDataContext:e["@odata.context"]}}static isNull(e){return typeof e>"u"||e==null}static generateUUID(){return([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,e=>(e^ee()[0]&15>>e/4).toString(16))}static getXrmContext(){if(typeof GetGlobalContext<"u")return GetGlobalContext();if(typeof Xrm<"u"){if(!y.isNull(Xrm.Utility)&&!y.isNull(Xrm.Utility.getGlobalContext))return Xrm.Utility.getGlobalContext();if(!y.isNull(Xrm.Page)&&!y.isNull(Xrm.Page.context))return Xrm.Page.context}throw new Error("Xrm Context is not available. In most cases, it can be resolved by adding a reference to a ClientGlobalContext.js.aspx. Please refer to MSDN documentation for more details.")}static getClientUrl(){let t=y.getXrmContext().getClientUrl();return t.match(/\/$/)&&(t=t.substring(0,t.length-1)),t}static isRunningWithinPortals(){return!!window.shell}static isObject(e){return typeof e=="object"&&!!e&&!Array.isArray(e)&&Object.prototype.toString.call(e)!=="[object Date]"}static copyObject(e,t){let i={};for(let a in e)e.hasOwnProperty(a)&&!t?.includes(a)&&(y.isObject(e[a])?i[a]=y.copyObject(e[a]):Array.isArray(e[a])?i[a]=e[a].slice():i[a]=e[a]);return i}static copyRequest(e,t=[]){t.includes("signal")||t.push("signal");let i=y.copyObject(e,t);return i.signal=e.signal,i}static setFileChunk(e,t,i,a){a=a||0;let o=a+i>t.length?t.length%i:i,c;c=new Uint8Array(o);for(let s=0;s{"use strict";w();r=class n{static handleErrorResponse(e){throw new Error(`Error: ${e.status}: ${e.message}`)}static parameterCheck(e,t,i,a){(typeof e>"u"||e===null||e==="")&&g(t,i,a)}static stringParameterCheck(e,t,i){typeof e!="string"&&g(t,i,"String")}static maxLengthStringParameterCheck(e,t,i,a){if(e&&e.length>a)throw new Error(`${i} has a ${a} character limit.`)}static arrayParameterCheck(e,t,i){e.constructor!==Array&&g(t,i,"Array")}static stringOrArrayParameterCheck(e,t,i){e.constructor!==Array&&typeof e!="string"&&g(t,i,"String or Array")}static numberParameterCheck(e,t,i){if(typeof e!="number"){if(typeof e=="string"&&e&&!isNaN(parseInt(e)))return;g(t,i,"Number")}}static batchIsEmpty(){return[new Error("Payload of the batch operation is empty. Please make that you have other operations in between startBatch() and executeBatch() to successfuly build a batch payload.")]}static handleHttpError(e,t){let i=new Error;return Object.keys(e).forEach(a=>{i[a]=e[a]}),t&&Object.keys(t).forEach(a=>{i[a]=t[a]}),i}static boolParameterCheck(e,t,i){typeof e!="boolean"&&g(t,i,"Boolean")}static guidParameterCheck(e,t,i){let a=W(e);return a||g(t,i,"GUID String"),a}static keyParameterCheck(e,t,i){try{n.stringParameterCheck(e,t,i);let a=W(e);if(a)return a;let o=e.split(",");if(o.length)for(let c=0;c{"use strict";O=class O{};O.Prefer=(S=class{static get(e){return`${O.Prefer.IncludeAnnotations}="${e}"`}},S.ReturnRepresentation="return=representation",S.Annotations=(P=class{},P.AssociatedNavigationProperty="Microsoft.Dynamics.CRM.associatednavigationproperty",P.LookupLogicalName="Microsoft.Dynamics.CRM.lookuplogicalname",P.All="*",P.FormattedValue="OData.Community.Display.V1.FormattedValue",P.FetchXmlPagingCookie="Microsoft.Dynamics.CRM.fetchxmlpagingcookie",P),S.IncludeAnnotations="odata.include-annotations",S);b=O});function H(n,e){if(typeof e=="string"){let t=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:Z|[-+]\d{2}:\d{2})$/.exec(e);if(t)return new Date(Date.UTC(+t[1],+t[2]-1,+t[3],+t[4],+t[5],+t[6]))}return e}var re=f(()=>{"use strict"});function X(n,e){let t=null;if(n.indexOf("@")!==-1){let i=n.split("@");switch(i[1]){case"odata.context":t="oDataContext";break;case"odata.count":t="oDataCount",e=e!=null?parseInt(e):0;break;case"odata.nextLink":t="oDataNextLink";break;case"odata.deltaLink":t="oDataDeltaLink";break;case b.Prefer.Annotations.FormattedValue:t=i[0]+"_Formatted";break;case b.Prefer.Annotations.AssociatedNavigationProperty:t=i[0]+"_NavigationProperty";break;case b.Prefer.Annotations.LookupLogicalName:t=i[0]+"_LogicalName";break}}return[t,e]}function B(n,e){if(e){if(e.isRef&&n["@odata.id"]!=null)return l.convertToReferenceObject(n);if(e.toCount)return X("@odata.count",n["@odata.count"])[1]||0}let t=Object.keys(n);for(let a=0;a-1){s=s.trim();let p=s.substring(s.indexOf(`\r +`)+1).trim();o=o.concat(se(p,e,t))}else{let p=/HTTP\/?\s*[\d.]*\s+(\d{3})\s+([\w\s]*)$/gm.exec(s),u=parseInt(p[1]),d=p[2].trim(),I=s.substring(s.indexOf("{"),s.lastIndexOf("}")+1);if(I){let m=B(JSON.parse(I,H),e[t]);if(u>=400){let h=Te(s.substring(s.indexOf(p[0])+p[0].length+1,s.indexOf("{")));o.push(r.handleHttpError(m,{status:u,statusText:d,statusMessage:d,headers:h}))}else o.push(m)}else if(/Content-Type: text\/plain/i.test(s)){let m=/\w+$/gi.exec(s.trim()),h=m&&m.length?m[0]:void 0;o.push(isNaN(Number(h))?h:Number(h))}else if(e.length&&e[t]&&e[t].hasOwnProperty("valueIfEmpty"))o.push(e[t].valueIfEmpty);else{let m=/OData-EntityId.+/i.exec(s);if(m&&m.length){let h=F(m[0]);o.push(h||void 0)}else o.push(void 0)}}t++}return o}function Ne(n){return window.atob(n)}function Se(n,e,t){let i=n;t.hasOwnProperty("parse")&&(i=JSON.parse(i).value,i=Ne(i));var a={value:i};return e["x-ms-file-name"]&&(a.fileName=e["x-ms-file-name"]),e["x-ms-file-size"]&&(a.fileSize=parseInt(e["x-ms-file-size"])),U(e,"Location")&&(a.location=q(e,"Location")),a}function U(n,e){return n.hasOwnProperty(e)||n.hasOwnProperty(e.toLowerCase())}function q(n,e){return n[e]?n[e]:n[e.toLowerCase()]}function j(n,e,t){let i;if(n.length)if(n.indexOf("--batchresponse_")>-1){let a=se(n,t);i=t.length===1&&t[0].convertedToBatch?a[0]:a}else U(e,"Content-Disposition")?i=Se(n,e,t[0]):q(e,"Content-Type").startsWith("application/json")?i=B(JSON.parse(n,H),t[0]):i=isNaN(Number(n))?n:Number(n);else if(t.length&&t[0].hasOwnProperty("valueIfEmpty"))i=t[0].valueIfEmpty;else if(U(e,"OData-EntityId")){let a=q(e,"OData-EntityId"),o=F(a);o&&(i=o)}else U(e,"Location")&&(i={location:q(e,"Location")},e["x-ms-chunk-size"]&&(i.chunkSize=parseInt(e["x-ms-chunk-size"])));return i}var De,oe=f(()=>{"use strict";ie();D();C();re();w();De=/^([^()<>@,;:\\"\/[\]?={} \t]+)\s?:\s?(.*)/});function k(n){let e={};if(!n)return e;let t=n.split(`\r +`);for(let i=0,a=t.length;i0&&(e[o.substring(0,c)]=o.substring(c+2))}return e}var ce=f(()=>{"use strict"});var le={};Z(le,{XhrWrapper:()=>E,executeRequest:()=>Ee});function Ee(n){return new Promise((e,t)=>{Ie(n,e,t)})}function Ie(n,e,t){let i=n.data,a=n.headers,o=n.responseParams,c=n.abortSignal;if(c?.aborted){t(r.handleHttpError({name:"AbortError",code:20,message:"The user aborted a request."}));return}let s=new XMLHttpRequest;s.open(n.method,n.uri,n.isAsync||!1);for(let u in a)s.setRequestHeader(u,a[u]);s.onreadystatechange=function(){if(s.readyState===4)switch(c&&c.removeEventListener("abort",p),s.status){case 200:case 201:case 204:case 206:case 304:{let m=k(s.getAllResponseHeaders()),ye={data:j(s.responseText,m,o[n.requestId]),headers:m,status:s.status};s=null,e(ye);break}case 0:break;default:if(!s)break;let u,d;try{d=k(s.getAllResponseHeaders());let m=j(s.responseText,d,o[n.requestId]);if(Array.isArray(m)){t(m);break}u=m.error}catch{s.response.length>0?u={message:s.response}:u={message:"Unexpected Error"}}let I={status:s.status,statusText:s.statusText,headers:d};s=null,t(r.handleHttpError(u,I));break}},n.timeout&&(s.timeout=n.timeout),s.onerror=function(){let u=k(s.getAllResponseHeaders());t(r.handleHttpError({status:s.status,statusText:s.statusText,message:s.responseText||"Network Error",headers:u})),s=null},s.ontimeout=function(){let u=k(s.getAllResponseHeaders());t(r.handleHttpError({name:"TimeoutError",status:s.status,statusText:s.statusText,message:s.responseText||"Request Timed Out",headers:u})),s=null},s.onabort=function(){if(!s)return;let u=k(s.getAllResponseHeaders());t(r.handleHttpError({status:s.status,statusText:s.statusText,message:"Request aborted",headers:u})),s=null};let p=()=>{if(!s)return;let u=k(s.getAllResponseHeaders());t(r.handleHttpError({name:"AbortError",code:20,status:s.status,statusText:s.statusText,message:"The user aborted a request.",headers:u})),s.abort(),s=null};c&&c.addEventListener("abort",p),i?s.send(i):s.send(),E.afterSendEvent&&E.afterSendEvent()}var E,pe=f(()=>{"use strict";C();oe();ce();E=class{}});var Be={};Z(Be,{DynamicsWebApi:()=>J});D();C();var Ce=(n,e)=>l.isRunningWithinPortals()?new URL("_api",window.location.origin).toString()+"/":(n||(n=l.getClientUrl()),new URL(`api/${e.path}/v${e.version}`,n).toString()+"/"),K=(n,e,t)=>{let i=t[e];n?.version&&(r.stringParameterCheck(n.version,"DynamicsWebApi.setConfig",`config.${e}.version`),i.version=n.version),n?.path&&(r.stringParameterCheck(n.path,"DynamicsWebApi.setConfig",`config.${e}.path`),i.path=n.path),i.url=Ce(t.serverUrl,i)},x=class{static merge(e,t){t?.serverUrl&&(r.stringParameterCheck(t.serverUrl,"DynamicsWebApi.setConfig","config.serverUrl"),e.serverUrl=t.serverUrl),K(t?.dataApi,"dataApi",e),K(t?.searchApi,"searchApi",e),t?.impersonate&&(e.impersonate=r.guidParameterCheck(t.impersonate,"DynamicsWebApi.setConfig","config.impersonate")),t?.impersonateAAD&&(e.impersonateAAD=r.guidParameterCheck(t.impersonateAAD,"DynamicsWebApi.setConfig","config.impersonateAAD")),t?.onTokenRefresh&&(r.callbackParameterCheck(t.onTokenRefresh,"DynamicsWebApi.setConfig","config.onTokenRefresh"),e.onTokenRefresh=t.onTokenRefresh),t?.includeAnnotations&&(r.stringParameterCheck(t.includeAnnotations,"DynamicsWebApi.setConfig","config.includeAnnotations"),e.includeAnnotations=t.includeAnnotations),t?.timeout&&(r.numberParameterCheck(t.timeout,"DynamicsWebApi.setConfig","config.timeout"),e.timeout=t.timeout),t?.maxPageSize&&(r.numberParameterCheck(t.maxPageSize,"DynamicsWebApi.setConfig","config.maxPageSize"),e.maxPageSize=t.maxPageSize),t?.returnRepresentation&&(r.boolParameterCheck(t.returnRepresentation,"DynamicsWebApi.setConfig","config.returnRepresentation"),e.returnRepresentation=t.returnRepresentation),t?.useEntityNames&&(r.boolParameterCheck(t.useEntityNames,"DynamicsWebApi.setConfig","config.useEntityNames"),e.useEntityNames=t.useEntityNames),t?.headers&&(e.headers=t.headers)}static default(){return{serverUrl:null,impersonate:null,impersonateAAD:null,onTokenRefresh:null,includeAnnotations:null,maxPageSize:null,returnRepresentation:null,proxy:null,dataApi:{path:"data",version:"9.2",url:""},searchApi:{path:"search",version:"1.0",url:""}}}};x.mergeApiConfigs=K;D();C();D();D();C();var R=null,G=n=>{R=n},$=(n,e)=>{if(n.path=n.path||"",n.functionName=n.functionName||"",n.url)r.stringParameterCheck(n.url,`DynamicsWebApi.${n.functionName}`,"request.url"),n.path=n.url.replace(e.dataApi.url,"");else if(!n._isUnboundRequest&&!n.contentId&&!n.collection&&r.parameterCheck(n.collection,`DynamicsWebApi.${n.functionName}`,"request.collection"),n.collection!=null&&(r.stringParameterCheck(n.collection,`DynamicsWebApi.${n.functionName}`,"request.collection"),n.path=n.collection,n.key&&(n.key=r.keyParameterCheck(n.key,`DynamicsWebApi.${n.functionName}`,"request.key"),n.path+=`(${n.key})`)),n.contentId&&(r.stringParameterCheck(n.contentId,`DynamicsWebApi.${n.functionName}`,"request.contentId"),n.contentId.startsWith("$")&&(n.path=n.path?`${n.contentId}/${n.path}`:n.contentId)),n.addPath&&(n.path&&(n.path+="/"),n.path+=n.addPath),n.path=ae(n,e,n.path),n.fetchXml){r.stringParameterCheck(n.fetchXml,`DynamicsWebApi.${n.functionName}`,"request.fetchXml");let t=n.path.indexOf("?")===-1?"?":"&";n.path+=`${t}fetchXml=${encodeURIComponent(n.fetchXml)}`}return n.hasOwnProperty("async")&&n.async!=null?r.boolParameterCheck(n.async,`DynamicsWebApi.${n.functionName}`,"request.async"):n.async=!0,n.headers=xe(n,e),n},ae=(n,e,t="",i="&")=>{let a=[];if(n){if(n.navigationProperty){if(r.stringParameterCheck(n.navigationProperty,`DynamicsWebApi.${n.functionName}`,"request.navigationProperty"),t+="/"+n.navigationProperty,n.navigationPropertyKey){let o=r.keyParameterCheck(n.navigationPropertyKey,`DynamicsWebApi.${n.functionName}`,"request.navigationPropertyKey");t+="("+o+")"}n.navigationProperty==="Attributes"&&n.metadataAttributeType&&(r.stringParameterCheck(n.metadataAttributeType,`DynamicsWebApi.${n.functionName}`,"request.metadataAttributeType"),t+="/"+n.metadataAttributeType)}if(n.select?.length&&(r.arrayParameterCheck(n.select,`DynamicsWebApi.${n.functionName}`,"request.select"),n.functionName=="retrieve"&&n.select.length==1&&n.select[0].endsWith("/$ref")?t+="/"+n.select[0]:(n.select[0].startsWith("/")&&n.functionName=="retrieve"&&(n.navigationProperty==null?t+=n.select.shift():n.select.shift()),n.select.length&&a.push("$select="+n.select.join(",")))),n.filter){r.stringParameterCheck(n.filter,`DynamicsWebApi.${n.functionName}`,"request.filter");let o=/[^"']{([\w\d]{8}[-]?(?:[\w\d]{4}[-]?){3}[\w\d]{12})}(?:[^"']|$)/g,c=n.filter,s=null;for(;(s=o.exec(c))!==null;){s.index===o.lastIndex&&o.lastIndex++;let p=s[0].endsWith(")")?")":" ";c=c.replace(s[0]," "+s[1]+p)}a.push("$filter="+encodeURIComponent(c))}if(n.fieldName&&(r.stringParameterCheck(n.fieldName,`DynamicsWebApi.${n.functionName}`,"request.fieldName"),t+="/"+n.fieldName),n.savedQuery&&a.push("savedQuery="+r.guidParameterCheck(n.savedQuery,`DynamicsWebApi.${n.functionName}`,"request.savedQuery")),n.userQuery&&a.push("userQuery="+r.guidParameterCheck(n.userQuery,`DynamicsWebApi.${n.functionName}`,"request.userQuery")),n.apply&&(r.stringParameterCheck(n.apply,`DynamicsWebApi.${n.functionName}`,"request.apply"),a.push("$apply="+n.apply)),n.count&&(r.boolParameterCheck(n.count,`DynamicsWebApi.${n.functionName}`,"request.count"),a.push("$count="+n.count)),n.top&&n.top>0&&(r.numberParameterCheck(n.top,`DynamicsWebApi.${n.functionName}`,"request.top"),a.push("$top="+n.top)),n.orderBy!=null&&n.orderBy.length&&(r.arrayParameterCheck(n.orderBy,`DynamicsWebApi.${n.functionName}`,"request.orderBy"),a.push("$orderby="+n.orderBy.join(","))),n.partitionId&&(r.stringParameterCheck(n.partitionId,`DynamicsWebApi.${n.functionName}`,"request.partitionId"),a.push("partitionid='"+n.partitionId+"'")),n.downloadSize&&(r.stringParameterCheck(n.downloadSize,`DynamicsWebApi.${n.functionName}`,"request.downloadSize"),a.push("size="+n.downloadSize)),n.queryParams?.length&&(r.arrayParameterCheck(n.queryParams,`DynamicsWebApi.${n.functionName}`,"request.queryParams"),a.push(n.queryParams.join("&"))),n.fileName&&(r.stringParameterCheck(n.fileName,`DynamicsWebApi.${n.functionName}`,"request.fileName"),a.push("x-ms-file-name="+n.fileName)),n.data&&r.parameterCheck(n.data,`DynamicsWebApi.${n.functionName}`,"request.data"),n.isBatch&&r.boolParameterCheck(n.isBatch,`DynamicsWebApi.${n.functionName}`,"request.isBatch"),l.isNull(n.inChangeSet)||r.boolParameterCheck(n.inChangeSet,`DynamicsWebApi.${n.functionName}`,"request.inChangeSet"),n.isBatch&&l.isNull(n.inChangeSet)&&(n.inChangeSet=!0),n.timeout&&r.numberParameterCheck(n.timeout,`DynamicsWebApi.${n.functionName}`,"request.timeout"),n.expand?.length)if(r.stringOrArrayParameterCheck(n.expand,`DynamicsWebApi.${n.functionName}`,"request.expand"),typeof n.expand=="string")a.push("$expand="+n.expand);else{let o=[];for(let c=0;c{let t={...e.headers,...n.userHeaders},i=Pe(n,e);if(i.length&&(t.Prefer=i),n.collection==="$metadata"&&(t.Accept="application/xml"),n.transferMode&&(t["x-ms-transfer-mode"]=n.transferMode),n.ifmatch!=null&&n.ifnonematch!=null)throw new Error(`DynamicsWebApi.${n.functionName}. Either one of request.ifmatch or request.ifnonematch parameters should be used in a call, not both.`);return n.ifmatch&&(r.stringParameterCheck(n.ifmatch,`DynamicsWebApi.${n.functionName}`,"request.ifmatch"),t["If-Match"]=n.ifmatch),n.ifnonematch&&(r.stringParameterCheck(n.ifnonematch,`DynamicsWebApi.${n.functionName}`,"request.ifnonematch"),t["If-None-Match"]=n.ifnonematch),n.impersonate&&(r.stringParameterCheck(n.impersonate,`DynamicsWebApi.${n.functionName}`,"request.impersonate"),t.MSCRMCallerID=r.guidParameterCheck(n.impersonate,`DynamicsWebApi.${n.functionName}`,"request.impersonate")),n.impersonateAAD&&(r.stringParameterCheck(n.impersonateAAD,`DynamicsWebApi.${n.functionName}`,"request.impersonateAAD"),t.CallerObjectId=r.guidParameterCheck(n.impersonateAAD,`DynamicsWebApi.${n.functionName}`,"request.impersonateAAD")),n.token&&(r.stringParameterCheck(n.token,`DynamicsWebApi.${n.functionName}`,"request.token"),t.Authorization="Bearer "+n.token),n.duplicateDetection&&(r.boolParameterCheck(n.duplicateDetection,`DynamicsWebApi.${n.functionName}`,"request.duplicateDetection"),t["MSCRM.SuppressDuplicateDetection"]="false"),n.bypassCustomPluginExecution&&(r.boolParameterCheck(n.bypassCustomPluginExecution,`DynamicsWebApi.${n.functionName}`,"request.bypassCustomPluginExecution"),t["MSCRM.BypassCustomPluginExecution"]="true"),n.noCache&&(r.boolParameterCheck(n.noCache,`DynamicsWebApi.${n.functionName}`,"request.noCache"),t["Cache-Control"]="no-cache"),n.mergeLabels&&(r.boolParameterCheck(n.mergeLabels,`DynamicsWebApi.${n.functionName}`,"request.mergeLabels"),t["MSCRM.MergeLabels"]="true"),n.contentId&&(r.stringParameterCheck(n.contentId,`DynamicsWebApi.${n.functionName}`,"request.contentId"),n.contentId.startsWith("$")||(t["Content-ID"]=n.contentId)),n.contentRange&&(r.stringParameterCheck(n.contentRange,`DynamicsWebApi.${n.functionName}`,"request.contentRange"),t["Content-Range"]=n.contentRange),n.range&&(r.stringParameterCheck(n.range,`DynamicsWebApi.${n.functionName}`,"request.range"),t.Range=n.range),t},Pe=(n,e)=>{let t=n.returnRepresentation,i=n.includeAnnotations,a=n.maxPageSize,o=n.trackChanges,c=n.continueOnError,s=[];if(n.prefer&&n.prefer.length){r.stringOrArrayParameterCheck(n.prefer,`DynamicsWebApi.${n.functionName}`,"request.prefer"),typeof n.prefer=="string"&&(s=n.prefer.split(","));for(let p in s){let u=s[p].trim();u==="return=representation"?t=!0:u.includes("odata.include-annotations=")?i=u.replace("odata.include-annotations=","").replace(/"/g,""):u.startsWith("odata.maxpagesize=")?a=Number(u.replace("odata.maxpagesize=","").replace(/"/g,""))||0:u.includes("odata.track-changes")?o=!0:u.includes("odata.continue-on-error")&&(c=!0)}}return s=[],e&&(t==null&&(t=e.returnRepresentation),i=i||e.includeAnnotations,a=a||e.maxPageSize),t&&(r.boolParameterCheck(t,`DynamicsWebApi.${n.functionName}`,"request.returnRepresentation"),s.push("return=representation")),i&&(r.stringParameterCheck(i,`DynamicsWebApi.${n.functionName}`,"request.includeAnnotations"),s.push(`odata.include-annotations="${i}"`)),a&&a>0&&(r.numberParameterCheck(a,`DynamicsWebApi.${n.functionName}`,"request.maxPageSize"),s.push("odata.maxpagesize="+a)),o&&(r.boolParameterCheck(o,`DynamicsWebApi.${n.functionName}`,"request.trackChanges"),s.push("odata.track-changes")),c&&(r.boolParameterCheck(c,`DynamicsWebApi.${n.functionName}`,"request.continueOnError"),s.push("odata.continue-on-error")),s.join(",")},L=(n,e,t)=>{let i=`dwa_batch_${l.generateUUID()}`,a=[],o=null,c=1e5;n.forEach(p=>{p.functionName="executeBatch",t?.inChangeSet===!1&&(p.inChangeSet=!1);let u=p.method==="GET"?!1:!!p.inChangeSet;if(!u&&o&&(a.push(` +--${o}--`),o=null,c=1e5),o||(a.push(` +--${i}`),u&&(o=`changeset_${l.generateUUID()}`,a.push("Content-Type: multipart/mixed;boundary="+o))),u&&a.push(` +--${o}`),a.push("Content-Type: application/http"),a.push("Content-Transfer-Encoding: binary"),u){let d=p.headers.hasOwnProperty("Content-ID")?p.headers["Content-ID"]:++c;a.push(`Content-ID: ${d}`)}p.path?.startsWith("$")?a.push(` +${p.method} ${p.path} HTTP/1.1`):a.push(` +${p.method} ${e.dataApi.url}${p.path} HTTP/1.1`),p.method==="GET"?a.push("Accept: application/json"):a.push("Content-Type: application/json");for(let d in p.headers)d==="Authorization"||d==="Content-ID"||a.push(`${d}: ${p.headers[d]}`);p.data&&a.push(` +${V(p.data,e)}`)}),o&&a.push(` +--${o}--`),a.push(` +--${i}--`);let s=z(t?.userHeaders);return s["Content-Type"]=`multipart/mixed;boundary=${i}`,{headers:s,body:a.join(` +`)}},N=n=>{let e=null;if(!l.isNull(R)&&(e=R[n],!e)){for(let t in R)if(R[t]===n)return n}return e},V=(n,e)=>{let t=null;if(n){if(n instanceof Uint8Array||n instanceof Uint16Array||n instanceof Uint32Array)return n;t=JSON.stringify(n,(i,a)=>{if(i.endsWith("@odata.bind")||i.endsWith("@odata.id")){if(typeof a=="string"&&!a.startsWith("$")){if(/\(\{[\w\d-]+\}\)/g.test(a)&&(a=a.replace(/(.+)\(\{([\w\d-]+)\}\)/g,"$1($2)")),e.useEntityNames){let o=/([\w_]+)(\([\d\w-]+\))$/,c=o.exec(a);if(c&&c.length>2){let s=N(c[1]);l.isNull(s)||(a=a.replace(o,s+"$2"))}}a.startsWith(e.dataApi.url)||(i.endsWith("@odata.bind")?a.startsWith("/")||(a="/"+a):a=e.dataApi.url+a.replace(/^\//,""))}}else(i.startsWith("oData")||i.endsWith("_Formatted")||i.endsWith("_NavigationProperty")||i.endsWith("_LogicalName"))&&(a=void 0);return a}),t=t.replace(/[\u007F-\uFFFF]/g,function(i){return"\\u"+("0000"+i.charCodeAt(0).toString(16)).slice(-4)})}return t},z=(n={})=>(n.Accept||(n.Accept="application/json"),n["OData-MaxVersion"]||(n["OData-MaxVersion"]="4.0"),n["OData-Version"]||(n["OData-Version"]="4.0"),n["Content-Range"]?n["Content-Type"]="application/octet-stream":n["Content-Type"]||(n["Content-Type"]="application/json; charset=utf-8"),n);C();async function ue(n){return(pe(),Y(le)).executeRequest(n)}var me=(n,e)=>{T[n]?T[n].push(e):T[n]=[e]},we=(n,e)=>{A[n]?A[n].push(e):A[n]=[e]},Q=n=>{delete T[n],A.hasOwnProperty(n)&&delete A[n]},de=async(n,e)=>{try{let t=await v.sendRequest(n,e);return Q(n.requestId),t}catch(t){throw Q(n.requestId),t}finally{Q(n.requestId)}},A={},T={},$e=["$metadata","EntityDefinitions","RelationshipDefinitions","GlobalOptionSetDefinitions","ManagedPropertyDefinitions","query","suggest","autocomplete"],Oe=n=>$e.indexOf(n)>-1,Ue=async(n,e)=>{if(!l.isNull(R))return N(n)||n;let t=$({method:"GET",collection:"EntityDefinitions",select:["EntitySetName","LogicalName"],noCache:!0,functionName:"retrieveMultiple"},e),i=await de(t,e);G({});for(let a=0;a{if(!n||Oe(n)||(n=n.toLowerCase(),!e.useEntityNames))return n;try{return await Ue(n,e)}catch(t){throw new Error("Unable to fetch Collection Names. Error: "+t.message)}},v=class{static async sendRequest(e,t){e.headers=e.headers||{},e.responseParameters=e.responseParameters||{},e.requestId=e.requestId||l.generateUUID(),me(e.requestId,e.responseParameters);let i=null,a=e.responseParameters?.convertedToBatch;if(e.path==="$batch"&&!a){let s=A[e.requestId];if(!s)throw r.batchIsEmpty();let p=L(s,t,e);i=p.body,e.headers={...p.headers,...e.headers},delete A[e.requestId]}else i=a?e.data:V(e.data,t),a||(e.headers=z(e.headers));t.impersonate&&!e.headers.MSCRMCallerID&&(e.headers.MSCRMCallerID=t.impersonate),t.impersonateAAD&&!e.headers.CallerObjectId&&(e.headers.CallerObjectId=t.impersonateAAD);let o=null;if(t.onTokenRefresh&&(!e.headers||e.headers&&!e.headers.Authorization)&&(o=await t.onTokenRefresh(),!o))throw new Error("Token is empty. Request is aborted.");o&&(e.headers.Authorization="Bearer "+(o.hasOwnProperty("accessToken")?o.accessToken:o)),l.isRunningWithinPortals()&&(e.headers.__RequestVerificationToken=await window.shell.getTokenDeferred());let c=e.apiConfig?e.apiConfig.url:t.dataApi.url;return await ue({method:e.method,uri:c.toString()+e.path,data:i,proxy:t.proxy,isAsync:e.async,headers:e.headers,requestId:e.requestId,abortSignal:e.signal,responseParams:T,timeout:e.timeout||t.timeout})}static async makeRequest(e,t){if(e.responseParameters=e.responseParameters||{},e.userHeaders=e.headers,delete e.headers,!e.isBatch){let i=await qe(e.collection,t);if(e.collection=i,$(e,t),e.responseParameters.convertedToBatch=!1,e.path.length>2e3){let a=L([e],t);e.headers.Authorization&&(a.headers.Authorization=e.headers.Authorization),e.method="POST",e.path="$batch",e.data=a.body,e.headers={...a.headers,...e.userHeaders},e.responseParameters.convertedToBatch=!0}return de(e,t)}$(e,t),me(e.requestId,e.responseParameters),we(e.requestId,e)}static _clearTestData(){G(null),T={},A={}}static getCollectionName(e){return N(e)}};var J=class n{constructor(e){this._config=x.default();this._isBatch=!1;this._batchRequestId=null;this.setConfig=e=>x.merge(this._config,e);this._makeRequest=async e=>(e.isBatch=this._isBatch,this._batchRequestId&&(e.requestId=this._batchRequestId),v.makeRequest(e,this._config));this.create=async e=>{r.parameterCheck(e,"DynamicsWebApi.create","request");let t;return e.functionName?t=e:(t=l.copyRequest(e),t.functionName="create"),t.method="POST",(await this._makeRequest(t))?.data};this.retrieve=async e=>{r.parameterCheck(e,"DynamicsWebApi.retrieve","request");let t;return e.functionName?t=e:(t=l.copyRequest(e),t.functionName="retrieve"),t.method="GET",t.responseParameters={isRef:t.select?.length===1&&t.select[0].endsWith("/$ref")},(await this._makeRequest(t))?.data};this.update=async e=>{r.parameterCheck(e,"DynamicsWebApi.update","request");let t;e.functionName?t=e:(t=l.copyRequest(e),t.functionName="update"),t.method||(t.method=/EntityDefinitions|RelationshipDefinitions|GlobalOptionSetDefinitions/.test(t.collection||"")?"PUT":"PATCH"),t.responseParameters={valueIfEmpty:!0},t.ifmatch==null&&(t.ifmatch="*");let i=t.ifmatch;try{return(await this._makeRequest(t))?.data}catch(a){if(i&&a.status===412)return!1;throw a}};this.updateSingleProperty=async e=>{r.parameterCheck(e,"DynamicsWebApi.updateSingleProperty","request"),r.parameterCheck(e.fieldValuePair,"DynamicsWebApi.updateSingleProperty","request.fieldValuePair");var t=Object.keys(e.fieldValuePair)[0],i=e.fieldValuePair[t];let a=l.copyRequest(e);return a.navigationProperty=t,a.data={value:i},a.functionName="updateSingleProperty",a.method="PUT",delete a.fieldValuePair,(await this._makeRequest(a))?.data};this.deleteRecord=async e=>{r.parameterCheck(e,"DynamicsWebApi.deleteRecord","request");let t;e.functionName?t=e:(t=l.copyRequest(e),t.functionName="deleteRecord"),t.method="DELETE",t.responseParameters={valueIfEmpty:!0};let i=t.ifmatch;try{return(await this._makeRequest(t))?.data}catch(a){if(i&&a.status===412)return!1;throw a}};this.upsert=async e=>{r.parameterCheck(e,"DynamicsWebApi.upsert","request");let t=l.copyRequest(e);t.method="PATCH",t.functionName="upsert";let i=t.ifnonematch,a=t.ifmatch;try{return(await this._makeRequest(t))?.data}catch(o){if(i&&o.status===412)return null;if(a&&o.status===404)return null;throw o}};this._uploadFileChunk=async(e,t,i,a=0)=>{if(l.setFileChunk(e,t,i,a),await this._makeRequest(e),a+=i,a<=t.length)return this._uploadFileChunk(e,t,i,a)};this.uploadFile=async e=>{r.throwBatchIncompatible("DynamicsWebApi.uploadFile",this._isBatch),r.parameterCheck(e,"DynamicsWebApi.uploadFile","request");let t=l.copyRequest(e,["data"]);t.method="PATCH",t.functionName="uploadFile",t.transferMode="chunked";let i=await this._makeRequest(t);return t.url=i?.data.location,delete t.transferMode,delete t.fieldName,delete t.fileName,this._uploadFileChunk(t,e.data,i?.data.chunkSize)};this._downloadFileChunk=async(e,t=0,i="")=>{e.range="bytes="+t+"-"+(t+l.downloadChunkSize-1),e.downloadSize="full";let a=await this._makeRequest(e);return e.url=a?.data.location,i+=a?.data.value,t+=l.downloadChunkSize,t<=a?.data.fileSize?this._downloadFileChunk(e,t,i):{fileName:a?.data.fileName,fileSize:a?.data.fileSize,data:l.convertToFileBuffer(i)}};this.downloadFile=e=>{r.throwBatchIncompatible("DynamicsWebApi.downloadFile",this._isBatch),r.parameterCheck(e,"DynamicsWebApi.downloadFile","request");let t=l.copyRequest(e);return t.method="GET",t.functionName="downloadFile",t.responseParameters={parse:!0},this._downloadFileChunk(t)};this.retrieveMultiple=async(e,t)=>{r.parameterCheck(e,"DynamicsWebApi.retrieveMultiple","request");let i;return e.functionName?i=e:(i=l.copyRequest(e),i.functionName="retrieveMultiple"),i.method="GET",t&&(r.stringParameterCheck(t,"DynamicsWebApi.retrieveMultiple","nextPageLink"),i.url=t),(await this._makeRequest(i))?.data};this._retrieveAllRequest=async(e,t,i=[])=>{let a=await this.retrieveMultiple(e,t);i=i.concat(a.value);let o=a.oDataNextLink;if(o)return this._retrieveAllRequest(e,o,i);let c={value:i};return a.oDataDeltaLink&&(c["@odata.deltaLink"]=a.oDataDeltaLink,c.oDataDeltaLink=a.oDataDeltaLink),c};this.retrieveAll=e=>(r.throwBatchIncompatible("DynamicsWebApi.retrieveAll",this._isBatch),this._retrieveAllRequest(e));this.count=async e=>{r.parameterCheck(e,"DynamicsWebApi.count","request");let t=l.copyRequest(e);return t.method="GET",t.functionName="count",t.filter?.length?t.count=!0:t.navigationProperty="$count",t.responseParameters={toCount:t.count},(await this._makeRequest(t))?.data};this.countAll=async e=>{r.throwBatchIncompatible("DynamicsWebApi.countAll",this._isBatch),r.parameterCheck(e,"DynamicsWebApi.countAll","request");let t=await this._retrieveAllRequest(e);return t&&t.value?t.value.length:0};this.fetch=async e=>{r.parameterCheck(e,"DynamicsWebApi.fetch","request");let t=l.copyRequest(e);if(t.method="GET",t.functionName="fetch",r.stringParameterCheck(t.fetchXml,"DynamicsWebApi.fetch","request.fetchXml"),t.fetchXml&&!/^{r.parameterCheck(e,"DynamicsWebApi.fetchAll","request");let t=async(i,a=[])=>{let o=await this.fetch(i);return a=a.concat(o.value),o.PagingInfo?(i.pageNumber=o.PagingInfo.nextPage,i.pagingCookie=o.PagingInfo.cookie,t(i,a)):{value:a}};return r.throwBatchIncompatible("DynamicsWebApi.fetchAll",this._isBatch),t(e)};this.associate=async e=>{r.parameterCheck(e,"DynamicsWebApi.associate","request");let t=l.copyRequest(e);t.method="POST",t.functionName="associate",r.stringParameterCheck(e.relatedCollection,"DynamicsWebApi.associate","request.relatedcollection"),r.stringParameterCheck(e.relationshipName,"DynamicsWebApi.associate","request.relationshipName");let i=r.keyParameterCheck(e.primaryKey,"DynamicsWebApi.associate","request.primaryKey"),a=r.keyParameterCheck(e.relatedKey,"DynamicsWebApi.associate","request.relatedKey");t.navigationProperty=e.relationshipName+"/$ref",t.key=i,t.data={"@odata.id":`${e.relatedCollection}(${a})`},await this._makeRequest(t)};this.disassociate=async e=>{r.parameterCheck(e,"DynamicsWebApi.disassociate","request");let t=l.copyRequest(e);t.method="DELETE",t.functionName="disassociate",r.stringParameterCheck(e.relationshipName,"DynamicsWebApi.disassociate","request.relationshipName");let i=r.keyParameterCheck(e.primaryKey,"DynamicsWebApi.disassociate","request.primaryKey"),a=r.keyParameterCheck(e.relatedKey,"DynamicsWebApi.disassociate","request.relatedId");t.key=i,t.navigationProperty=`${e.relationshipName}(${a})/$ref`,await this._makeRequest(t)};this.associateSingleValued=async e=>{r.parameterCheck(e,"DynamicsWebApi.associateSingleValued","request");let t=l.copyRequest(e);t.method="PUT",t.functionName="associateSingleValued";let i=r.keyParameterCheck(e.primaryKey,"DynamicsWebApi.associateSingleValued","request.primaryKey"),a=r.keyParameterCheck(e.relatedKey,"DynamicsWebApi.associateSingleValued","request.relatedKey");r.stringParameterCheck(e.navigationProperty,"DynamicsWebApi.associateSingleValued","request.navigationProperty"),r.stringParameterCheck(e.relatedCollection,"DynamicsWebApi.associateSingleValued","request.relatedcollection"),t.navigationProperty+="/$ref",t.key=i,t.data={"@odata.id":`${e.relatedCollection}(${a})`},await this._makeRequest(t)};this.disassociateSingleValued=async e=>{r.parameterCheck(e,"DynamicsWebApi.disassociateSingleValued","request");let t=l.copyRequest(e);t.method="DELETE",t.functionName="disassociateSingleValued";let i=r.keyParameterCheck(e.primaryKey,"DynamicsWebApi.disassociateSingleValued","request.primaryKey");r.stringParameterCheck(e.navigationProperty,"DynamicsWebApi.disassociateSingleValued","request.navigationProperty"),t.navigationProperty+="/$ref",t.key=i,await this._makeRequest(t)};this.callFunction=async e=>{r.parameterCheck(e,"DynamicsWebApi.callFunction","request");let t=u=>u.name||u.functionName,i=typeof e!="string",a=i?t(e):e,o=i?"request.name":"name",c=i?l.copyObject(e,["name"]):{functionName:a};r.stringParameterCheck(a,"DynamicsWebApi.callFunction",o);let s=l.buildFunctionParameters(c.parameters);return c.method="GET",c.addPath=a+s.key,c.queryParams=s.queryParams,c._isUnboundRequest=!c.collection,c.functionName="callFunction",(await this._makeRequest(c))?.data};this.callAction=async e=>{r.parameterCheck(e,"DynamicsWebApi.callAction","request"),r.stringParameterCheck(e.actionName,"DynamicsWebApi.callAction","request.actionName");let t=l.copyRequest(e,["action"]);return t.method="POST",t.functionName="callAction",t.addPath=e.actionName,t._isUnboundRequest=!t.collection,t.data=e.action,(await this._makeRequest(t))?.data};this.createEntity=e=>{r.parameterCheck(e,"DynamicsWebApi.createEntity","request"),r.parameterCheck(e.data,"DynamicsWebApi.createEntity","request.data");let t=l.copyRequest(e);return t.collection="EntityDefinitions",t.functionName="createEntity",this.create(t)};this.updateEntity=e=>{r.parameterCheck(e,"DynamicsWebApi.updateEntity","request"),r.parameterCheck(e.data,"DynamicsWebApi.updateEntity","request.data"),r.guidParameterCheck(e.data.MetadataId,"DynamicsWebApi.updateEntity","request.data.MetadataId");let t=l.copyRequest(e);return t.collection="EntityDefinitions",t.key=t.data.MetadataId,t.functionName="updateEntity",t.method="PUT",this.update(t)};this.retrieveEntity=e=>{r.parameterCheck(e,"DynamicsWebApi.retrieveEntity","request"),r.keyParameterCheck(e.key,"DynamicsWebApi.retrieveEntity","request.key");let t=l.copyRequest(e);return t.collection="EntityDefinitions",t.functionName="retrieveEntity",this.retrieve(t)};this.retrieveEntities=e=>{let t=e?l.copyRequest(e):{};return t.collection="EntityDefinitions",t.functionName="retrieveEntities",this.retrieveMultiple(t)};this.createAttribute=e=>{r.parameterCheck(e,"DynamicsWebApi.createAttribute","request"),r.parameterCheck(e.data,"DynamicsWebApi.createAttribute","request.data"),r.keyParameterCheck(e.entityKey,"DynamicsWebApi.createAttribute","request.entityKey");let t=l.copyRequest(e);return t.collection="EntityDefinitions",t.functionName="retrieveEntity",t.navigationProperty="Attributes",t.key=e.entityKey,this.create(t)};this.updateAttribute=e=>{r.parameterCheck(e,"DynamicsWebApi.updateAttribute","request"),r.parameterCheck(e.data,"DynamicsWebApi.updateAttribute","request.data"),r.keyParameterCheck(e.entityKey,"DynamicsWebApi.updateAttribute","request.entityKey"),r.guidParameterCheck(e.data.MetadataId,"DynamicsWebApi.updateAttribute","request.data.MetadataId"),e.castType&&r.stringParameterCheck(e.castType,"DynamicsWebApi.updateAttribute","request.castType");let t=l.copyRequest(e);return t.collection="EntityDefinitions",t.navigationProperty="Attributes",t.navigationPropertyKey=e.data.MetadataId,t.metadataAttributeType=e.castType,t.key=e.entityKey,t.functionName="updateAttribute",t.method="PUT",this.update(t)};this.retrieveAttributes=e=>{r.parameterCheck(e,"DynamicsWebApi.retrieveAttributes","request"),r.keyParameterCheck(e.entityKey,"DynamicsWebApi.retrieveAttributes","request.entityKey"),e.castType&&r.stringParameterCheck(e.castType,"DynamicsWebApi.retrieveAttributes","request.castType");let t=l.copyRequest(e);return t.collection="EntityDefinitions",t.navigationProperty="Attributes",t.metadataAttributeType=e.castType,t.key=e.entityKey,t.functionName="retrieveAttributes",this.retrieveMultiple(t)};this.retrieveAttribute=e=>{r.parameterCheck(e,"DynamicsWebApi.retrieveAttributes","request"),r.keyParameterCheck(e.entityKey,"DynamicsWebApi.retrieveAttribute","request.entityKey"),r.keyParameterCheck(e.attributeKey,"DynamicsWebApi.retrieveAttribute","request.attributeKey"),e.castType&&r.stringParameterCheck(e.castType,"DynamicsWebApi.retrieveAttribute","request.castType");let t=l.copyRequest(e);return t.collection="EntityDefinitions",t.navigationProperty="Attributes",t.navigationPropertyKey=e.attributeKey,t.metadataAttributeType=e.castType,t.key=e.entityKey,t.functionName="retrieveAttribute",this.retrieve(t)};this.createRelationship=e=>{r.parameterCheck(e,"DynamicsWebApi.createRelationship","request"),r.parameterCheck(e.data,"DynamicsWebApi.createRelationship","request.data");let t=l.copyRequest(e);return t.collection="RelationshipDefinitions",t.functionName="createRelationship",this.create(t)};this.updateRelationship=e=>{r.parameterCheck(e,"DynamicsWebApi.updateRelationship","request"),r.parameterCheck(e.data,"DynamicsWebApi.updateRelationship","request.data"),r.guidParameterCheck(e.data.MetadataId,"DynamicsWebApi.updateRelationship","request.data.MetadataId"),e.castType&&r.stringParameterCheck(e.castType,"DynamicsWebApi.updateRelationship","request.castType");let t=l.copyRequest(e);return t.collection="RelationshipDefinitions",t.key=e.data.MetadataId,t.navigationProperty=e.castType,t.functionName="updateRelationship",t.method="PUT",this.update(t)};this.deleteRelationship=e=>{r.parameterCheck(e,"DynamicsWebApi.deleteRelationship","request"),r.keyParameterCheck(e.key,"DynamicsWebApi.deleteRelationship","request.key");let t=l.copyRequest(e);return t.collection="RelationshipDefinitions",t.functionName="deleteRelationship",this.deleteRecord(t)};this.retrieveRelationships=e=>{let t=e?l.copyRequest(e):{};return t.collection="RelationshipDefinitions",t.functionName="retrieveRelationships",e&&e.castType&&(r.stringParameterCheck(e.castType,"DynamicsWebApi.retrieveRelationships","request.castType"),t.navigationProperty=e.castType),this.retrieveMultiple(t)};this.retrieveRelationship=e=>{r.parameterCheck(e,"DynamicsWebApi.retrieveRelationship","request"),r.keyParameterCheck(e.key,"DynamicsWebApi.retrieveRelationship","request.key"),e.castType&&r.stringParameterCheck(e.castType,"DynamicsWebApi.retrieveRelationship","request.castType");let t=l.copyRequest(e);return t.collection="RelationshipDefinitions",t.navigationProperty=e.castType,t.functionName="retrieveRelationship",this.retrieve(t)};this.createGlobalOptionSet=e=>{r.parameterCheck(e,"DynamicsWebApi.createGlobalOptionSet","request"),r.parameterCheck(e.data,"DynamicsWebApi.createGlobalOptionSet","request.data");let t=l.copyRequest(e);return t.collection="GlobalOptionSetDefinitions",t.functionName="createGlobalOptionSet",this.create(t)};this.updateGlobalOptionSet=e=>{r.parameterCheck(e,"DynamicsWebApi.updateGlobalOptionSet","request"),r.parameterCheck(e.data,"DynamicsWebApi.updateGlobalOptionSet","request.data"),r.guidParameterCheck(e.data.MetadataId,"DynamicsWebApi.updateGlobalOptionSet","request.data.MetadataId"),e.castType&&r.stringParameterCheck(e.castType,"DynamicsWebApi.updateGlobalOptionSet","request.castType");let t=l.copyRequest(e);return t.collection="GlobalOptionSetDefinitions",t.key=e.data.MetadataId,t.functionName="updateGlobalOptionSet",t.method="PUT",this.update(t)};this.deleteGlobalOptionSet=e=>{r.parameterCheck(e,"DynamicsWebApi.deleteGlobalOptionSet","request");let t=l.copyRequest(e);return t.collection="GlobalOptionSetDefinitions",t.functionName="deleteGlobalOptionSet",this.deleteRecord(t)};this.retrieveGlobalOptionSet=e=>{r.parameterCheck(e,"DynamicsWebApi.retrieveGlobalOptionSet","request"),e.castType&&r.stringParameterCheck(e.castType,"DynamicsWebApi.retrieveGlobalOptionSet","request.castType");let t=l.copyRequest(e);return t.collection="GlobalOptionSetDefinitions",t.navigationProperty=e.castType,t.functionName="retrieveGlobalOptionSet",this.retrieve(t)};this.retrieveGlobalOptionSets=e=>{let t=e?l.copyRequest(e):{};return t.collection="GlobalOptionSetDefinitions",t.functionName="retrieveGlobalOptionSets",e?.castType&&(r.stringParameterCheck(e.castType,"DynamicsWebApi.retrieveGlobalOptionSets","request.castType"),t.navigationProperty=e.castType),this.retrieveMultiple(t)};this.retrieveCsdlMetadata=async e=>{let t=e?l.copyRequest(e):{};return t.collection="$metadata",t.functionName="retrieveCsdlMetadata",e?.addAnnotations&&(r.boolParameterCheck(e.addAnnotations,"DynamicsWebApi.retrieveCsdlMetadata","request.addAnnotations"),t.includeAnnotations="*"),(await this._makeRequest(t))?.data};this.search=async e=>{r.parameterCheck(e,"DynamicsWebApi.search","request");let t=l.isObject(e),i=t?"request.query.search":"term",a=t?l.copyObject(e):{query:{search:e}};return r.parameterCheck(a.query,"DynamicsWebApi.search","request.query"),r.stringParameterCheck(a.query.search,"DynamicsWebApi.search",i),r.maxLengthStringParameterCheck(a.query.search,"DynamicsWebApi.search",i,100),a.collection="query",a.functionName="search",a.method="POST",a.data=a.query,a.apiConfig=this._config.searchApi,delete a.query,(await this._makeRequest(a))?.data};this.suggest=async e=>{r.parameterCheck(e,"DynamicsWebApi.suggest","request");let t=l.isObject(e),i=t?"request.query.search":"term",a=t?l.copyObject(e):{query:{search:e}};return r.parameterCheck(a.query,"DynamicsWebApi.suggest","request.query"),r.stringParameterCheck(a.query.search,"DynamicsWebApi.suggest",i),r.maxLengthStringParameterCheck(a.query.search,"DynamicsWebApi.suggest",i,100),a.functionName=a.collection="suggest",a.method="POST",a.data=a.query,a.apiConfig=this._config.searchApi,delete a.query,(await this._makeRequest(a))?.data};this.autocomplete=async e=>{r.parameterCheck(e,"DynamicsWebApi.autocomplete","request");let t=l.isObject(e),i=t?"request.query.search":"term",a=t?l.copyObject(e):{query:{search:e}};return t&&r.parameterCheck(a.query,"DynamicsWebApi.autocomplete","request.query"),r.stringParameterCheck(a.query.search,"DynamicsWebApi.autocomplete",i),r.maxLengthStringParameterCheck(a.query.search,"DynamicsWebApi.autocomplete",i,100),a.functionName=a.collection="autocomplete",a.method="POST",a.data=a.query,a.apiConfig=this._config.searchApi,delete a.query,(await this._makeRequest(a))?.data};this.startBatch=()=>{this._isBatch=!0,this._batchRequestId=l.generateUUID()};this.executeBatch=async e=>{r.throwBatchNotStarted(this._isBatch);let t=e?l.copyRequest(e):{};return t.collection="$batch",t.method="POST",t.functionName="executeBatch",t.requestId=this._batchRequestId,this._batchRequestId=null,this._isBatch=!1,(await this._makeRequest(t))?.data};this.initializeInstance=e=>new n(e||this._config);this.Utility={getCollectionName:e=>v.getCollectionName(e)};x.merge(this._config,e)}};return Y(Be);})(); var DynamicsWebApi = _dynamicsWebApiExports.DynamicsWebApi //# sourceMappingURL=dynamics-web-api.min.js.map diff --git a/dist/dynamics-web-api.min.js.map b/dist/dynamics-web-api.min.js.map index b81ffbd..660245a 100644 --- a/dist/dynamics-web-api.min.js.map +++ b/dist/dynamics-web-api.min.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/helpers/Crypto.ts", "../src/helpers/Regex.ts", "../src/utils/Utility.ts", "../src/helpers/ErrorHelper.ts", "../src/dwa.ts", "../src/client/helpers/dateReviver.ts", "../src/client/helpers/parseResponse.ts", "../src/client/helpers/parseResponseHeaders.ts", "../src/client/xhr.ts", "../src/dynamics-web-api.ts", "../src/utils/Config.ts", "../src/client/RequestClient.ts", "../src/utils/Request.ts", "../src/client/helpers/executeRequest.ts"], - "sourcesContent": ["export function getCrypto(): T {\r\n return global.DWA_BROWSER ? global.window.crypto : require(\"./crypto/node\").getCrypto();\r\n}\r\n\r\nexport function generateRandomBytes() {\r\n return global.DWA_BROWSER ? getCrypto().getRandomValues(new Uint8Array(1)) : getCrypto().randomBytes(1);\r\n}\r\n", "const uuid = \"[0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12}\";\r\n\r\nexport function isUuid(value: string): boolean {\r\n const match = new RegExp(uuid, \"i\").exec(value);\r\n return !!match;\r\n}\r\n\r\nexport function extractUuid(value: string): string | null {\r\n const match = new RegExp(\"^{?(\" + uuid + \")}?$\", \"i\").exec(value);\r\n return match ? match[1] : null;\r\n}\r\n\r\nexport function extractUuidFromUrl(url: string): string | null {\r\n const match = new RegExp(\"(\" + uuid + \")\\\\)$\", \"i\").exec(url);\r\n return match ? match[1] : null;\r\n}\r\n", "\uFEFFimport { Core } from \"../types\";\r\nimport { generateRandomBytes } from \"../helpers/Crypto\";\r\nimport { isUuid, extractUuid } from \"../helpers/Regex\";\r\n\r\ndeclare var GetGlobalContext: any;\r\ndeclare var Xrm: any;\r\n\r\n// function isNodeEnv(): boolean {\r\n// // tslint:disable:strict-type-predicates\r\n// return Object.prototype.toString.call(typeof process !== \"undefined\" ? process : 0) === \"[object process]\";\r\n// }\r\n\r\n// function getGlobalObject(): T {\r\n// return (isNodeEnv() ? global : typeof window !== \"undefined\" ? window : typeof self !== \"undefined\" ? self : {}) as T;\r\n// }\r\n\r\nconst downloadChunkSize = 4194304;\r\n\r\nexport class Utility {\r\n /**\r\n * Builds parametes for a funciton. Returns '()' (if no parameters) or '([params])?[query]'\r\n *\r\n * @param {Object} [parameters] - Function's input parameters. Example: { param1: \"test\", param2: 3 }.\r\n * @returns {string}\r\n */\r\n static buildFunctionParameters(parameters?: any): Core.FunctionParameters {\r\n if (parameters) {\r\n const parameterNames = Object.keys(parameters);\r\n const functionParams: string[] = [];\r\n const urlQuery: string[] = [];\r\n\r\n for (let i = 1; i <= parameterNames.length; i++) {\r\n const parameterName = parameterNames[i - 1];\r\n let value = parameters[parameterName];\r\n\r\n if (value == null) continue;\r\n\r\n if (typeof value === \"string\" && !value.startsWith(\"Microsoft.Dynamics.CRM\") && !isUuid(value)) {\r\n value = `'${value}'`;\r\n } else if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n\r\n functionParams.push(`${parameterName}=@p${i}`);\r\n urlQuery.push(`@p${i}=${extractUuid(value) || value}`);\r\n }\r\n\r\n return {\r\n key: `(${functionParams.join(\",\")})`,\r\n queryParams: urlQuery,\r\n };\r\n } else {\r\n return {\r\n key: \"()\",\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Parses a paging cookie returned in response\r\n *\r\n * @param {string} pageCookies - Page cookies returned in @Microsoft.Dynamics.CRM.fetchxmlpagingcookie.\r\n * @param {number} currentPageNumber - A current page number. Fix empty paging-cookie for complex fetch xmls.\r\n * @returns {{cookie: \"\", number: 0, next: 1}}\r\n */\r\n static getFetchXmlPagingCookie(pageCookies: string = \"\", currentPageNumber: number = 1): Core.FetchXmlCookie {\r\n //get the page cokies\r\n pageCookies = decodeURIComponent(decodeURIComponent(pageCookies));\r\n\r\n const info = /pagingcookie=\"()/.exec(pageCookies);\r\n\r\n if (info != null) {\r\n let page = parseInt(info[2]);\r\n return {\r\n cookie: info[1]\r\n .replace(//g, \">\")\r\n .replace(/\\\"/g, \"'\")\r\n .replace(/\\'/g, \"&\" + \"quot;\"),\r\n page: page,\r\n nextPage: page + 1,\r\n };\r\n } else {\r\n //http://stackoverflow.com/questions/41262772/execution-of-fetch-xml-using-web-api-dynamics-365 workaround\r\n return {\r\n cookie: \"\",\r\n page: currentPageNumber,\r\n nextPage: currentPageNumber + 1,\r\n };\r\n }\r\n }\r\n\r\n // static isNodeEnv = isNodeEnv;\r\n\r\n static downloadChunkSize = downloadChunkSize;\r\n\r\n /**\r\n * Converts a response to a reference object\r\n *\r\n * @param {Object} responseData - Response object\r\n * @returns {ReferenceObject}\r\n */\r\n static convertToReferenceObject(responseData: any): Core.ReferenceObject {\r\n const result = /\\/(\\w+)\\(([0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12})/i.exec(responseData[\"@odata.id\"]);\r\n return { id: result![2], collection: result![1], oDataContext: responseData[\"@odata.context\"] };\r\n }\r\n\r\n /**\r\n * Checks whether the value is JS Null.\r\n * @param {Object} value\r\n * @returns {boolean}\r\n */\r\n static isNull(value: any): boolean {\r\n return typeof value === \"undefined\" || value == null;\r\n }\r\n\r\n /** Generates UUID */\r\n static generateUUID(): string {\r\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) => (c ^ (generateRandomBytes()[0] & (15 >> (c / 4)))).toString(16));\r\n }\r\n\r\n static getXrmContext(): any {\r\n if (typeof GetGlobalContext !== \"undefined\") {\r\n return GetGlobalContext();\r\n } else {\r\n if (typeof Xrm !== \"undefined\") {\r\n //d365 v.9.0\r\n if (!Utility.isNull(Xrm.Utility) && !Utility.isNull(Xrm.Utility.getGlobalContext)) {\r\n return Xrm.Utility.getGlobalContext();\r\n } else if (!Utility.isNull(Xrm.Page) && !Utility.isNull(Xrm.Page.context)) {\r\n return Xrm.Page.context;\r\n }\r\n }\r\n }\r\n\r\n throw new Error(\r\n \"Xrm Context is not available. In most cases, it can be resolved by adding a reference to a ClientGlobalContext.js.aspx. Please refer to MSDN documentation for more details.\"\r\n );\r\n }\r\n\r\n // static getXrmUtility(): any {\r\n // return typeof Xrm !== \"undefined\" ? Xrm.Utility : null;\r\n // }\r\n\r\n static getClientUrl(): string {\r\n const context = Utility.getXrmContext();\r\n\r\n let clientUrl = context.getClientUrl();\r\n\r\n if (clientUrl.match(/\\/$/)) {\r\n clientUrl = clientUrl.substring(0, clientUrl.length - 1);\r\n }\r\n return clientUrl;\r\n }\r\n\r\n /**\r\n * Checks whether the app is currently running in a Dynamics Portals Environment.\r\n *\r\n * In that case we switch to the Web API for Dynamics Portals.\r\n * @returns {boolean}\r\n */\r\n static isRunningWithinPortals(): boolean {\r\n return global.DWA_BROWSER ? !!global.window.shell : false;\r\n }\r\n\r\n static isObject(obj: any): boolean {\r\n return typeof obj === \"object\" && !!obj && !Array.isArray(obj) && Object.prototype.toString.call(obj) !== \"[object Date]\";\r\n }\r\n\r\n static copyObject(src: any, excludeProps?: string[]): T {\r\n let target = {};\r\n for (let prop in src) {\r\n if (src.hasOwnProperty(prop) && !excludeProps?.includes(prop)) {\r\n // if the value is a nested object, recursively copy all its properties\r\n if (Utility.isObject(src[prop])) {\r\n target[prop] = Utility.copyObject(src[prop]);\r\n } else if (Array.isArray(src[prop])) {\r\n target[prop] = src[prop].slice();\r\n } else {\r\n target[prop] = src[prop];\r\n }\r\n }\r\n }\r\n return target;\r\n }\r\n\r\n static copyRequest(src: any, excludeProps: string[] = []): Core.InternalRequest {\r\n //todo: do we need to include \"data\" in here?\r\n if (!excludeProps.includes(\"signal\")) excludeProps.push(\"signal\");\r\n\r\n const result = Utility.copyObject(src, excludeProps);\r\n result.signal = src.signal;\r\n\r\n return result;\r\n }\r\n\r\n static setFileChunk(request: Core.InternalRequest, fileBuffer: Uint8Array | Buffer, chunkSize: number, offset: number): void {\r\n offset = offset || 0;\r\n\r\n const count = offset + chunkSize > fileBuffer.length ? fileBuffer.length % chunkSize : chunkSize;\r\n\r\n let content: any;\r\n\r\n if (global.DWA_BROWSER) {\r\n content = new Uint8Array(count);\r\n for (let i = 0; i < count; i++) {\r\n content[i] = fileBuffer[offset + i];\r\n }\r\n } else {\r\n content = fileBuffer.slice(offset, offset + count);\r\n }\r\n\r\n request.data = content;\r\n request.contentRange = \"bytes \" + offset + \"-\" + (offset + count - 1) + \"/\" + fileBuffer.length;\r\n }\r\n\r\n static convertToFileBuffer(binaryString: string): Uint8Array | Buffer {\r\n if (!global.DWA_BROWSER) return Buffer.from(binaryString, \"binary\");\r\n\r\n const bytes = new Uint8Array(binaryString.length);\r\n for (var i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n return bytes;\r\n }\r\n}\r\n", "\uFEFFimport { AccessToken } from \"../dynamics-web-api\";\r\nimport { extractUuid } from \"./Regex\";\r\n\r\nexport interface DynamicsWebApiError extends Error {\r\n status: number;\r\n}\r\n\r\nfunction throwParameterError(functionName: string, parameterName: string, type: string | null | undefined): void {\r\n throw new Error(\r\n type ? `${functionName} requires a ${parameterName} parameter to be of type ${type}.` : `${functionName} requires a ${parameterName} parameter.`\r\n );\r\n}\r\n\r\nexport class ErrorHelper {\r\n static handleErrorResponse(req): void {\r\n throw new Error(`Error: ${req.status}: ${req.message}`);\r\n }\r\n\r\n static parameterCheck(parameter: any, functionName: string, parameterName: string, type?: string): void {\r\n if (typeof parameter === \"undefined\" || parameter === null || parameter === \"\") {\r\n throwParameterError(functionName, parameterName, type);\r\n }\r\n }\r\n\r\n static stringParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter !== \"string\") {\r\n throwParameterError(functionName, parameterName, \"String\");\r\n }\r\n }\r\n\r\n static maxLengthStringParameterCheck(parameter: string | null, functionName: string, parameterName: string, maxLength: number): void {\r\n if (!parameter) return;\r\n\r\n if (parameter.length > maxLength) {\r\n throw new Error(`${parameterName} has a ${maxLength} character limit.`);\r\n }\r\n }\r\n\r\n static arrayParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (parameter.constructor !== Array) {\r\n throwParameterError(functionName, parameterName, \"Array\");\r\n }\r\n }\r\n\r\n static stringOrArrayParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (parameter.constructor !== Array && typeof parameter !== \"string\") {\r\n throwParameterError(functionName, parameterName, \"String or Array\");\r\n }\r\n }\r\n\r\n static numberParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter != \"number\") {\r\n if (typeof parameter === \"string\" && parameter) {\r\n if (!isNaN(parseInt(parameter))) {\r\n return;\r\n }\r\n }\r\n throwParameterError(functionName, parameterName, \"Number\");\r\n }\r\n }\r\n\r\n static batchIsEmpty(): Error[] {\r\n return [\r\n new Error(\r\n \"Payload of the batch operation is empty. Please make that you have other operations in between startBatch() and executeBatch() to successfuly build a batch payload.\"\r\n ),\r\n ];\r\n }\r\n\r\n static handleHttpError(parsedError: any, parameters?: any): DynamicsWebApiError {\r\n const error = new Error();\r\n\r\n Object.keys(parsedError).forEach((k) => {\r\n error[k] = parsedError[k];\r\n });\r\n\r\n if (parameters) {\r\n Object.keys(parameters).forEach((k) => {\r\n error[k] = parameters[k];\r\n });\r\n }\r\n\r\n return error;\r\n }\r\n\r\n static boolParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter != \"boolean\") {\r\n throwParameterError(functionName, parameterName, \"Boolean\");\r\n }\r\n }\r\n\r\n /**\r\n * Private function used to check whether required parameter is a valid GUID\r\n * @param parameter The GUID parameter to check\r\n * @param functionName\r\n * @param parameterName\r\n * @returns\r\n */\r\n static guidParameterCheck(parameter: any, functionName: string, parameterName: string): string {\r\n const match = extractUuid(parameter);\r\n if (!match) throwParameterError(functionName, parameterName, \"GUID String\");\r\n\r\n return match!;\r\n }\r\n\r\n static keyParameterCheck(parameter: any, functionName: string, parameterName: string): string | undefined {\r\n try {\r\n ErrorHelper.stringParameterCheck(parameter, functionName, parameterName);\r\n\r\n //check if the param is a guid\r\n const match = extractUuid(parameter);\r\n if (match) return match;\r\n\r\n //check the alternate key\r\n const alternateKeys = parameter.split(\",\");\r\n\r\n if (alternateKeys.length) {\r\n for (let i = 0; i < alternateKeys.length; i++) {\r\n alternateKeys[i] = alternateKeys[i].trim().replace(/\"/g, \"'\");\r\n /^[\\w\\d\\_]+\\=(.+)$/i.exec(alternateKeys[i])![0];\r\n }\r\n }\r\n\r\n return alternateKeys.join(\",\");\r\n } catch (error) {\r\n throwParameterError(functionName, parameterName, \"String representing GUID or Alternate Key\");\r\n }\r\n }\r\n\r\n static callbackParameterCheck(callbackParameter: () => Promise, functionName: string, parameterName: string): void {\r\n if (typeof callbackParameter != \"function\") {\r\n throwParameterError(functionName, parameterName, \"Function\");\r\n }\r\n }\r\n\r\n static throwBatchIncompatible(functionName: string, isBatch: boolean): void {\r\n if (isBatch) {\r\n isBatch = false;\r\n throw new Error(functionName + \" cannot be used in a BATCH request.\");\r\n }\r\n }\r\n\r\n static throwBatchNotStarted(isBatch: boolean): void {\r\n if (!isBatch) {\r\n throw new Error(\r\n \"Batch operation has not been started. Please call a DynamicsWebApi.startBatch() function prior to calling DynamicsWebApi.executeBatch() to perform a batch request correctly.\"\r\n );\r\n }\r\n }\r\n}\r\n", "class DWA {\r\n\tstatic Prefer = class {\r\n\t\tstatic ReturnRepresentation: string = \"return=representation\";\r\n\t\tstatic Annotations = class {\r\n\t\t\tstatic AssociatedNavigationProperty: string = \"Microsoft.Dynamics.CRM.associatednavigationproperty\";\r\n\t\t\tstatic LookupLogicalName: string = \"Microsoft.Dynamics.CRM.lookuplogicalname\";\r\n\t\t\tstatic All: string = \"*\";\r\n\t\t\tstatic FormattedValue: string = \"OData.Community.Display.V1.FormattedValue\";\r\n\t\t\tstatic FetchXmlPagingCookie: string = \"Microsoft.Dynamics.CRM.fetchxmlpagingcookie\";\r\n\t\t};\r\n\t\tstatic IncludeAnnotations: string = \"odata.include-annotations\";\r\n\t\tstatic get(annotation: string) {\r\n\t\t\treturn `${DWA.Prefer.IncludeAnnotations}=\"${annotation}\"`;\r\n\t\t}\r\n\t};\r\n}\r\n\r\nexport { DWA };\r\n", "\uFEFFexport function dateReviver(key: string, value: any): Date {\r\n\tif (typeof value === \"string\") {\r\n\t\tconst a = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:Z|[-+]\\d{2}:\\d{2})$/.exec(value);\r\n\t\tif (a) {\r\n\t\t\treturn new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));\r\n\t\t}\r\n\t}\r\n\treturn value;\r\n}\r\n", "\uFEFFimport { DWA } from \"../../dwa\";\r\nimport { Utility } from \"../../utils/Utility\";\r\nimport { ErrorHelper, DynamicsWebApiError } from \"../../helpers/ErrorHelper\";\r\nimport { dateReviver } from \"./dateReviver\";\r\nimport { Core } from \"../../types\";\r\nimport { extractUuidFromUrl } from \"../../helpers/Regex\";\r\n\r\nfunction getFormattedKeyValue(keyName: string, value: any): any[] {\r\n let newKey: string | null = null;\r\n if (keyName.indexOf(\"@\") !== -1) {\r\n const format = keyName.split(\"@\");\r\n switch (format[1]) {\r\n case \"odata.context\":\r\n newKey = \"oDataContext\";\r\n break;\r\n case \"odata.count\":\r\n newKey = \"oDataCount\";\r\n value = value != null ? parseInt(value) : 0;\r\n break;\r\n case \"odata.nextLink\":\r\n newKey = \"oDataNextLink\";\r\n break;\r\n case \"odata.deltaLink\":\r\n newKey = \"oDataDeltaLink\";\r\n break;\r\n case DWA.Prefer.Annotations.FormattedValue:\r\n newKey = format[0] + \"_Formatted\";\r\n break;\r\n case DWA.Prefer.Annotations.AssociatedNavigationProperty:\r\n newKey = format[0] + \"_NavigationProperty\";\r\n break;\r\n case DWA.Prefer.Annotations.LookupLogicalName:\r\n newKey = format[0] + \"_LogicalName\";\r\n break;\r\n }\r\n }\r\n\r\n return [newKey, value];\r\n}\r\n\r\n/**\r\n *\r\n * @param {any} object - parsed JSON object\r\n * @param {any} parseParams - parameters for parsing the response\r\n * @returns {any} parsed batch response\r\n */\r\nfunction parseData(object: any, parseParams?: any): any {\r\n if (parseParams) {\r\n if (parseParams.isRef && object[\"@odata.id\"] != null) {\r\n return Utility.convertToReferenceObject(object);\r\n }\r\n\r\n if (parseParams.toCount) {\r\n return getFormattedKeyValue(\"@odata.count\", object[\"@odata.count\"])[1] || 0;\r\n }\r\n }\r\n\r\n const keys = Object.keys(object);\r\n\r\n for (let i = 0; i < keys.length; i++) {\r\n const currentKey = keys[i];\r\n\r\n if (object[currentKey] != null) {\r\n if (object[currentKey].constructor === Array) {\r\n for (var j = 0; j < object[currentKey].length; j++) {\r\n object[currentKey][j] = parseData(object[currentKey][j]);\r\n }\r\n } else if (typeof object[currentKey] === \"object\") {\r\n parseData(object[currentKey]);\r\n }\r\n }\r\n\r\n //parse formatted values\r\n let formattedKeyValue = getFormattedKeyValue(currentKey, object[currentKey]);\r\n if (formattedKeyValue[0]) {\r\n object[formattedKeyValue[0]] = formattedKeyValue[1];\r\n }\r\n\r\n //parse aliased values\r\n if (currentKey.indexOf(\"_x002e_\") !== -1) {\r\n const aliasKeys = currentKey.split(\"_x002e_\");\r\n\r\n if (!object.hasOwnProperty(aliasKeys[0])) {\r\n object[aliasKeys[0]] = { _dwaType: \"alias\" };\r\n }\r\n //throw an error if there is already a property which is not an 'alias'\r\n else if (\r\n typeof object[aliasKeys[0]] !== \"object\" ||\r\n (typeof object[aliasKeys[0]] === \"object\" && !object[aliasKeys[0]].hasOwnProperty(\"_dwaType\"))\r\n ) {\r\n throw new Error(\"The alias name of the linked entity must be unique!\");\r\n }\r\n\r\n object[aliasKeys[0]][aliasKeys[1]] = object[currentKey];\r\n\r\n //aliases also contain formatted values\r\n formattedKeyValue = getFormattedKeyValue(aliasKeys[1], object[currentKey]);\r\n if (formattedKeyValue[0]) {\r\n object[aliasKeys[0]][formattedKeyValue[0]] = formattedKeyValue[1];\r\n }\r\n }\r\n }\r\n\r\n if (parseParams) {\r\n if (parseParams.hasOwnProperty(\"pageNumber\") && object[\"@\" + DWA.Prefer.Annotations.FetchXmlPagingCookie] != null) {\r\n object.PagingInfo = Utility.getFetchXmlPagingCookie(object[\"@\" + DWA.Prefer.Annotations.FetchXmlPagingCookie], parseParams.pageNumber);\r\n }\r\n }\r\n\r\n return object;\r\n}\r\n\r\nconst responseHeaderRegex = /^([^()<>@,;:\\\\\"\\/[\\]?={} \\t]+)\\s?:\\s?(.*)/;\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction parseBatchHeaders(text: string): any {\r\n const ctx = { position: 0 };\r\n const headers = {};\r\n let parts;\r\n let line;\r\n let pos;\r\n\r\n do {\r\n pos = ctx.position;\r\n line = readLine(text, ctx);\r\n parts = responseHeaderRegex.exec(line);\r\n if (parts !== null) {\r\n headers[parts[1].toLowerCase()] = parts[2];\r\n } else {\r\n // Whatever was found is not a header, so reset the context position.\r\n ctx.position = pos;\r\n }\r\n } while (line && parts);\r\n\r\n return headers;\r\n}\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction readLine(text: string, ctx: { position: number }): string | null {\r\n return readTo(text, ctx, \"\\r\\n\");\r\n}\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction readTo(text: string, ctx: { position: number }, str: string): string | null {\r\n const start = ctx.position || 0;\r\n let end = text.length;\r\n if (str) {\r\n end = text.indexOf(str, start);\r\n if (end === -1) {\r\n return null;\r\n }\r\n ctx.position = end + str.length;\r\n } else {\r\n ctx.position = end;\r\n }\r\n\r\n return text.substring(start, end);\r\n}\r\n\r\n//partially taken from https://github.com/emiltholin/google-api-batch-utils\r\n/**\r\n *\r\n * @param {string} response - response that needs to be parsed\r\n * @param {Array} parseParams - parameters for parsing the response\r\n * @param {Number} [requestNumber] - number of the request\r\n * @returns {any} parsed batch response\r\n */\r\nfunction parseBatchResponse(response: string, parseParams: any, requestNumber: number = 0): (string | undefined | DynamicsWebApiError | Number)[] {\r\n // Not the same delimiter in the response as we specify ourselves in the request,\r\n // so we have to extract it.\r\n const delimiter = response.substr(0, response.indexOf(\"\\r\\n\"));\r\n const batchResponseParts = response.split(delimiter);\r\n // The first part will always be an empty string. Just remove it.\r\n batchResponseParts.shift();\r\n // The last part will be the \"--\". Just remove it.\r\n batchResponseParts.pop();\r\n\r\n let result: (string | undefined | DynamicsWebApiError | Number)[] = [];\r\n for (let i = 0; i < batchResponseParts.length; i++) {\r\n let batchResponse = batchResponseParts[i];\r\n if (batchResponse.indexOf(\"--changesetresponse_\") > -1) {\r\n batchResponse = batchResponse.trim();\r\n const batchToProcess = batchResponse.substring(batchResponse.indexOf(\"\\r\\n\") + 1).trim();\r\n\r\n result = result.concat(parseBatchResponse(batchToProcess, parseParams, requestNumber));\r\n } else {\r\n //check http status\r\n const httpStatusReg = /HTTP\\/?\\s*[\\d.]*\\s+(\\d{3})\\s+([\\w\\s]*)$/gm.exec(batchResponse);\r\n //todo: add error handler for httpStatus and httpStatusMessage; remove \"!\" operator\r\n const httpStatus = parseInt(httpStatusReg![1]);\r\n const httpStatusMessage = httpStatusReg![2].trim();\r\n\r\n const responseData = batchResponse.substring(batchResponse.indexOf(\"{\"), batchResponse.lastIndexOf(\"}\") + 1);\r\n\r\n if (!responseData) {\r\n if (/Content-Type: text\\/plain/i.test(batchResponse)) {\r\n const plainContentReg = /\\w+$/gi.exec(batchResponse.trim());\r\n const plainContent = plainContentReg && plainContentReg.length ? plainContentReg[0] : undefined;\r\n\r\n //check if a plain content is a number or not\r\n result.push(isNaN(Number(plainContent)) ? plainContent : Number(plainContent));\r\n } else {\r\n if (parseParams.length && parseParams[requestNumber] && parseParams[requestNumber].hasOwnProperty(\"valueIfEmpty\")) {\r\n result.push(parseParams[requestNumber].valueIfEmpty);\r\n } else {\r\n const entityUrl = /OData-EntityId.+/i.exec(batchResponse);\r\n\r\n if (entityUrl && entityUrl.length) {\r\n const guidResult = extractUuidFromUrl(entityUrl[0]);\r\n result.push(guidResult ? guidResult : undefined);\r\n } else {\r\n result.push(undefined);\r\n }\r\n }\r\n }\r\n } else {\r\n const parsedResponse = parseData(JSON.parse(responseData, dateReviver), parseParams[requestNumber]);\r\n\r\n if (httpStatus >= 400) {\r\n const responseHeaders = parseBatchHeaders(\r\n //todo: add error handler for httpStatusReg; remove \"!\" operator\r\n batchResponse.substring(batchResponse.indexOf(httpStatusReg![0]) + httpStatusReg![0].length + 1, batchResponse.indexOf(\"{\"))\r\n );\r\n\r\n result.push(\r\n ErrorHelper.handleHttpError(parsedResponse, {\r\n status: httpStatus,\r\n statusText: httpStatusMessage,\r\n statusMessage: httpStatusMessage,\r\n headers: responseHeaders,\r\n })\r\n );\r\n } else {\r\n result.push(parsedResponse);\r\n }\r\n }\r\n }\r\n\r\n requestNumber++;\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction base64ToString(base64: string): string {\r\n return global.DWA_BROWSER ? global.window.atob(base64) : Buffer.from(base64, \"base64\").toString(\"binary\");\r\n}\r\n\r\nfunction parseFileResponse(response: any, responseHeaders: any, parseParams: any): Core.FileParseResult {\r\n let data = response;\r\n\r\n if (parseParams.hasOwnProperty(\"parse\")) {\r\n data = JSON.parse(data).value;\r\n data = base64ToString(data);\r\n }\r\n\r\n var parseResult: Core.FileParseResult = {\r\n value: data,\r\n };\r\n\r\n if (responseHeaders[\"x-ms-file-name\"]) parseResult.fileName = responseHeaders[\"x-ms-file-name\"];\r\n\r\n if (responseHeaders[\"x-ms-file-size\"]) parseResult.fileSize = parseInt(responseHeaders[\"x-ms-file-size\"]);\r\n\r\n if (hasHeader(responseHeaders, \"Location\")) parseResult.location = getHeader(responseHeaders, \"Location\");\r\n\r\n return parseResult;\r\n}\r\n\r\nfunction hasHeader(headers: any, name: string): boolean {\r\n return headers.hasOwnProperty(name) || headers.hasOwnProperty(name.toLowerCase());\r\n}\r\n\r\nfunction getHeader(headers: any, name: string): string {\r\n if (headers[name]) return headers[name];\r\n\r\n return headers[name.toLowerCase()];\r\n}\r\n\r\n/**\r\n *\r\n * @param {string} response - response that needs to be parsed\r\n * @param {Array} responseHeaders - response headers\r\n * @param {Array} parseParams - parameters for parsing the response\r\n * @returns {any} parsed response\r\n */\r\nexport function parseResponse(response: string, responseHeaders: any, parseParams: any[]): any {\r\n let parseResult: any = undefined;\r\n if (response.length) {\r\n if (response.indexOf(\"--batchresponse_\") > -1) {\r\n const batch = parseBatchResponse(response, parseParams);\r\n\r\n parseResult = parseParams.length === 1 && parseParams[0].convertedToBatch ? batch[0] : batch;\r\n } else {\r\n if (hasHeader(responseHeaders, \"Content-Disposition\")) {\r\n parseResult = parseFileResponse(response, responseHeaders, parseParams[0]);\r\n } else {\r\n const contentType = getHeader(responseHeaders, \"Content-Type\");\r\n if (contentType.startsWith(\"application/json\")) {\r\n parseResult = parseData(JSON.parse(response, dateReviver), parseParams[0]);\r\n } else {\r\n parseResult = isNaN(Number(response)) ? response : Number(response);\r\n }\r\n }\r\n }\r\n } else {\r\n if (parseParams.length && parseParams[0].hasOwnProperty(\"valueIfEmpty\")) {\r\n parseResult = parseParams[0].valueIfEmpty;\r\n } else if (hasHeader(responseHeaders, \"OData-EntityId\")) {\r\n const entityUrl = getHeader(responseHeaders, \"OData-EntityId\");\r\n\r\n const guidResult = extractUuidFromUrl(entityUrl);\r\n\r\n if (guidResult) {\r\n parseResult = guidResult;\r\n }\r\n } else if (hasHeader(responseHeaders, \"Location\")) {\r\n parseResult = {\r\n location: getHeader(responseHeaders, \"Location\"),\r\n };\r\n\r\n if (responseHeaders[\"x-ms-chunk-size\"]) parseResult.chunkSize = parseInt(responseHeaders[\"x-ms-chunk-size\"]);\r\n }\r\n }\r\n\r\n return parseResult;\r\n}\r\n", "\uFEFFexport function parseResponseHeaders(headerStr: string): any {\r\n\tconst headers = {};\r\n\tif (!headerStr) {\r\n\t\treturn headers;\r\n\t}\r\n\tconst headerPairs = headerStr.split(\"\\u000d\\u000a\");\r\n\tfor (let i = 0, ilen = headerPairs.length; i < ilen; i++) {\r\n\t\tconst headerPair = headerPairs[i];\r\n\t\tconst index = headerPair.indexOf(\"\\u003a\\u0020\");\r\n\t\tif (index > 0) {\r\n\t\t\theaders[headerPair.substring(0, index)] = headerPair.substring(index + 2);\r\n\t\t}\r\n\t}\r\n\treturn headers;\r\n}\r\n", "\uFEFFimport { Core } from \"../types\";\r\nimport { ErrorHelper } from \"./../helpers/ErrorHelper\";\r\nimport { parseResponse } from \"./helpers/parseResponse\";\r\nimport { parseResponseHeaders } from \"./helpers/parseResponseHeaders\";\r\n\r\nexport function executeRequest(options: Core.RequestOptions): Promise {\r\n return new Promise((resolve, reject) => {\r\n _executeRequest(options, resolve, reject);\r\n });\r\n}\r\n\r\nfunction _executeRequest(\r\n options: Core.RequestOptions,\r\n successCallback: (response: Core.WebApiResponse) => void,\r\n errorCallback: (error: Core.WebApiErrorResponse | Core.WebApiErrorResponse[]) => void\r\n) {\r\n const data = options.data;\r\n const additionalHeaders = options.additionalHeaders;\r\n const responseParams = options.responseParams;\r\n const signal = options.abortSignal;\r\n\r\n if (signal?.aborted) {\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n name: \"AbortError\",\r\n code: 20,\r\n message: \"The user aborted a request.\",\r\n })\r\n );\r\n\r\n return;\r\n }\r\n\r\n let request = new XMLHttpRequest();\r\n request.open(options.method, options.uri, options.isAsync || false);\r\n\r\n //set additional headers\r\n for (let key in additionalHeaders) {\r\n request.setRequestHeader(key, additionalHeaders[key]);\r\n }\r\n\r\n request.onreadystatechange = function () {\r\n if (request.readyState === 4) {\r\n if (signal) signal.removeEventListener(\"abort\", abort);\r\n\r\n switch (request.status) {\r\n case 200: // Success with content returned in response body.\r\n case 201: // Success with content returned in response body.\r\n case 204: // Success with no content returned in response body.\r\n case 206: // Success with partial content.\r\n case 304: {\r\n // Success with Not Modified\r\n const responseHeaders = parseResponseHeaders(request.getAllResponseHeaders());\r\n const responseData = parseResponse(request.responseText, responseHeaders, responseParams[options.requestId]);\r\n\r\n const response = {\r\n data: responseData,\r\n headers: responseHeaders,\r\n status: request.status,\r\n };\r\n\r\n request = null as any;\r\n\r\n successCallback(response);\r\n break;\r\n }\r\n case 0:\r\n break; //response will be handled by onerror\r\n default:\r\n if (!request) break; //response was handled somewhere else\r\n\r\n // All other statuses are error cases.\r\n let error;\r\n let headers;\r\n try {\r\n headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n const errorParsed = parseResponse(request.responseText, headers, responseParams[options.requestId]);\r\n\r\n if (Array.isArray(errorParsed)) {\r\n errorCallback(errorParsed);\r\n break;\r\n }\r\n\r\n error = errorParsed.error;\r\n } catch (e) {\r\n if (request.response.length > 0) {\r\n error = { message: request.response };\r\n } else {\r\n error = { message: \"Unexpected Error\" };\r\n }\r\n }\r\n\r\n const errorParameters = {\r\n status: request.status,\r\n statusText: request.statusText,\r\n headers: headers,\r\n };\r\n\r\n request = null as any;\r\n\r\n errorCallback(ErrorHelper.handleHttpError(error, errorParameters));\r\n\r\n break;\r\n }\r\n }\r\n };\r\n\r\n if (options.timeout) {\r\n request.timeout = options.timeout;\r\n }\r\n\r\n request.onerror = function () {\r\n const headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n status: request.status,\r\n statusText: request.statusText,\r\n message: request.responseText || \"Network Error\",\r\n headers: headers,\r\n })\r\n );\r\n request = null as any;\r\n };\r\n\r\n request.ontimeout = function () {\r\n const headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n name: \"TimeoutError\",\r\n status: request.status,\r\n statusText: request.statusText,\r\n message: request.responseText || \"Request Timed Out\",\r\n headers: headers,\r\n })\r\n );\r\n request = null as any;\r\n };\r\n\r\n //browser abort\r\n request.onabort = function () {\r\n if (!request) return;\r\n\r\n const headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n status: request.status,\r\n statusText: request.statusText,\r\n message: \"Request aborted\",\r\n headers: headers,\r\n })\r\n );\r\n request = null as any;\r\n };\r\n\r\n //manual abort/cancellation\r\n const abort = () => {\r\n if (!request) return;\r\n\r\n const headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n name: \"AbortError\",\r\n code: 20,\r\n status: request.status,\r\n statusText: request.statusText,\r\n message: \"The user aborted a request.\",\r\n headers: headers,\r\n })\r\n );\r\n\r\n request.abort();\r\n\r\n request = null as any;\r\n };\r\n\r\n if (signal) {\r\n signal.addEventListener(\"abort\", abort);\r\n }\r\n\r\n data ? request.send(data) : request.send();\r\n\r\n //called for testing\r\n if (XhrWrapper.afterSendEvent) XhrWrapper.afterSendEvent();\r\n}\r\n\r\n/**\r\n * Sends a request to given URL with given parameters\r\n */\r\nexport class XhrWrapper {\r\n //for testing\r\n static afterSendEvent: () => void;\r\n}\r\n", "\uFEFFimport { ConfigurationUtility } from \"./utils/Config\";\r\nimport { Utility } from \"./utils/Utility\";\r\nimport { ErrorHelper } from \"./helpers/ErrorHelper\";\r\nimport { RequestClient } from \"./client/RequestClient\";\r\nimport type { Core } from \"./types\";\r\n\r\n/**\r\n * Microsoft Dynamics CRM Web API helper library written in JavaScript.\r\n * It is compatible with: Dynamics 365 (online), Dynamics 365 (on-premise), Dynamics CRM 2016, Dynamics CRM Online.\r\n */\r\nexport class DynamicsWebApi {\r\n private _config = ConfigurationUtility.default();\r\n private _isBatch = false;\r\n private _batchRequestId: string | null = null;\r\n\r\n /**\r\n * Initializes a new instance of DynamicsWebApi\r\n * @param config - Configuration object\r\n */\r\n constructor(config?: Config) {\r\n ConfigurationUtility.merge(this._config, config);\r\n }\r\n\r\n /**\r\n\t * Merges provided configuration properties with an existing one.\r\n\t *\r\n\t * @param {DynamicsWebApi.Config} config - Configuration\r\n\t * @example\r\n\t dynamicsWebApi.setConfig({ serverUrl: 'https://contoso.api.crm.dynamics.com/' });\r\n\t */\r\n setConfig = (config: Config) => ConfigurationUtility.merge(this._config, config);\r\n\r\n private _makeRequest = async (request: Core.InternalRequest): Promise => {\r\n request.isBatch = this._isBatch;\r\n if (this._batchRequestId) request.requestId = this._batchRequestId;\r\n return RequestClient.makeRequest(request, this._config);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a new record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n * @example\r\n *const lead = {\r\n * subject: \"Test WebAPI\",\r\n * firstname: \"Test\",\r\n * lastname: \"WebAPI\",\r\n * jobtitle: \"Title\"\r\n *};\r\n *\r\n *const request = {\r\n * data: lead,\r\n * collection: \"leads\",\r\n * returnRepresentation: true\r\n *}\r\n *\r\n *const response = await dynamicsWebApi.create(request);\r\n *\r\n */\r\n create = async (request: CreateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.create\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"create\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"POST\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n * @example\r\n *const request = {\r\n * key: '7d577253-3ef0-4a0a-bb7f-8335c2596e70',\r\n * collection: \"leads\",\r\n * select: [\"fullname\", \"subject\"],\r\n * ifnonematch: 'W/\"468026\"',\r\n * includeAnnotations: \"OData.Community.Display.V1.FormattedValue\"\r\n *};\r\n *\r\n *const response = await dynamicsWebApi.retrieve(request);\r\n */\r\n retrieve = async (request: RetrieveRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieve\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"retrieve\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"GET\";\r\n internalRequest.responseParameters = {\r\n isRef: internalRequest.select?.length === 1 && internalRequest.select[0].endsWith(\"/$ref\"),\r\n };\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n update = async (request: UpdateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.update\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"update\";\r\n } else internalRequest = request;\r\n\r\n //Metadata definitions, cannot be updated using \"PATCH\" method\r\n if (!internalRequest.method)\r\n internalRequest.method = /EntityDefinitions|RelationshipDefinitions|GlobalOptionSetDefinitions/.test(internalRequest.collection || \"\")\r\n ? \"PUT\"\r\n : \"PATCH\";\r\n\r\n internalRequest.responseParameters = { valueIfEmpty: true };\r\n\r\n if (internalRequest.ifmatch == null) {\r\n internalRequest.ifmatch = \"*\"; //to prevent upsert\r\n }\r\n\r\n //copy locally\r\n const ifmatch = internalRequest.ifmatch;\r\n\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifmatch && error.status === 412) {\r\n //precondition failed - not updated\r\n return false; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a single value in the record.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateSingleProperty = async (request: UpdateSinglePropertyRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateSingleProperty\", \"request\");\r\n ErrorHelper.parameterCheck(request.fieldValuePair, \"DynamicsWebApi.updateSingleProperty\", \"request.fieldValuePair\");\r\n\r\n var field = Object.keys(request.fieldValuePair)[0];\r\n var fieldValue = request.fieldValuePair[field];\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.navigationProperty = field;\r\n internalRequest.data = { value: fieldValue };\r\n internalRequest.functionName = \"updateSingleProperty\";\r\n internalRequest.method = \"PUT\";\r\n\r\n delete internalRequest[\"fieldValuePair\"];\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a record.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteRecord = async (request: DeleteRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteRecord\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"deleteRecord\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.responseParameters = { valueIfEmpty: true };\r\n\r\n //copy locally\r\n const ifmatch = internalRequest.ifmatch;\r\n\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifmatch && error.status === 412) {\r\n //precondition failed - not updated\r\n return false; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to upsert a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n upsert = async (request: UpsertRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.upsert\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"PATCH\";\r\n internalRequest.functionName = \"upsert\";\r\n\r\n //copy locally\r\n const ifnonematch = internalRequest.ifnonematch;\r\n const ifmatch = internalRequest.ifmatch;\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifnonematch && error.status === 412) {\r\n //if prevent update\r\n return null; //todo: check this\r\n } else if (ifmatch && error.status === 404) {\r\n //if prevent create\r\n return null; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n private _uploadFileChunk = async (request: Core.InternalRequest, fileBytes: Uint8Array | Buffer, chunkSize: number, offset: number = 0): Promise => {\r\n // offset = offset || 0;\r\n Utility.setFileChunk(request, fileBytes, chunkSize, offset);\r\n\r\n await this._makeRequest(request);\r\n\r\n offset += chunkSize;\r\n if (offset <= fileBytes.length) {\r\n return this._uploadFileChunk(request, fileBytes, chunkSize, offset);\r\n }\r\n };\r\n\r\n /**\r\n * Upload file to a File Attribute\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n */\r\n uploadFile = async (request: UploadRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.uploadFile\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.uploadFile\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request, [\"data\"]);\r\n internalRequest.method = \"PATCH\";\r\n internalRequest.functionName = \"uploadFile\";\r\n internalRequest.transferMode = \"chunked\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n internalRequest.url = response?.data.location;\r\n delete internalRequest.transferMode;\r\n delete internalRequest.fieldName;\r\n delete internalRequest.fileName;\r\n return this._uploadFileChunk(internalRequest, request.data, response?.data.chunkSize);\r\n };\r\n\r\n private _downloadFileChunk = async (\r\n request: Core.InternalRequest,\r\n bytesDownloaded: number = 0,\r\n // fileSize: number = 0,\r\n data: string = \"\"\r\n ): Promise => {\r\n // bytesDownloaded = bytesDownloaded || 0;\r\n // fileSize = fileSize || 0;\r\n // data = data || \"\";\r\n\r\n request.range = \"bytes=\" + bytesDownloaded + \"-\" + (bytesDownloaded + Utility.downloadChunkSize - 1);\r\n request.downloadSize = \"full\";\r\n\r\n const response = await this._makeRequest(request);\r\n\r\n request.url = response?.data.location;\r\n data += response?.data.value;\r\n\r\n bytesDownloaded += Utility.downloadChunkSize;\r\n\r\n if (bytesDownloaded <= response?.data.fileSize) {\r\n return this._downloadFileChunk(request, bytesDownloaded, data);\r\n }\r\n\r\n return {\r\n fileName: response?.data.fileName,\r\n fileSize: response?.data.fileSize,\r\n data: Utility.convertToFileBuffer(data),\r\n };\r\n };\r\n\r\n /**\r\n * Download a file from a File Attribute\r\n * @param request - An object that represents all possible options for a current request.\r\n */\r\n downloadFile = (request: DownloadRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.downloadFile\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.downloadFile\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"downloadFile\";\r\n internalRequest.responseParameters = { parse: true };\r\n\r\n return this._downloadFileChunk(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve records.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @param {string} [nextPageLink] - Use the value of the @odata.nextLink property with a new GET request to return the next page of data. Pass null to retrieveMultipleOptions.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveMultiple = async (request: RetrieveMultipleRequest, nextPageLink?: string): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveMultiple\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"retrieveMultiple\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"GET\";\r\n\r\n if (nextPageLink) {\r\n ErrorHelper.stringParameterCheck(nextPageLink, \"DynamicsWebApi.retrieveMultiple\", \"nextPageLink\");\r\n internalRequest.url = nextPageLink;\r\n }\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n return response?.data;\r\n };\r\n\r\n private _retrieveAllRequest = async (request: RetrieveMultipleRequest, nextPageLink?: string, records: any[] = []): Promise> => {\r\n const response = await this.retrieveMultiple(request, nextPageLink);\r\n records = records.concat(response.value);\r\n\r\n const pageLink = response.oDataNextLink;\r\n\r\n if (pageLink) {\r\n return this._retrieveAllRequest(request, pageLink, records);\r\n }\r\n\r\n const result: AllResponse = { value: records };\r\n\r\n if (response.oDataDeltaLink) {\r\n result[\"@odata.deltaLink\"] = response.oDataDeltaLink;\r\n result.oDataDeltaLink = response.oDataDeltaLink;\r\n }\r\n\r\n return result;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve all records.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAll = (request: RetrieveMultipleRequest): Promise> => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.retrieveAll\", this._isBatch);\r\n return this._retrieveAllRequest(request);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to count records. IMPORTANT! The count value does not represent the total number of entities in the system. It is limited by the maximum number of entities that can be returned. Returns: Number\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n count = async (request: CountRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.count\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"count\";\r\n\r\n if (internalRequest.filter?.length) {\r\n internalRequest.count = true;\r\n } else {\r\n internalRequest.navigationProperty = \"$count\";\r\n }\r\n\r\n internalRequest.responseParameters = { toCount: internalRequest.count };\r\n\r\n //if filter has not been specified then simplify the request\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to count records. Returns: Number\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n countAll = async (request: CountAllRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.countAll\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.countAll\", \"request\");\r\n\r\n const response = await this._retrieveAllRequest(request);\r\n\r\n return response ? (response.value ? response.value.length : 0) : 0;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to execute FetchXml to retrieve records. Returns: DWA.Types.FetchXmlResponse\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n fetch = async (request: FetchXmlRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.fetch\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"fetch\";\r\n\r\n ErrorHelper.stringParameterCheck(internalRequest.fetchXml, \"DynamicsWebApi.fetch\", \"request.fetchXml\");\r\n\r\n //only add paging if there is no top\r\n if (internalRequest.fetchXml && !/^(request: FetchAllRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.fetchAll\", \"request\");\r\n\r\n const _executeFetchXmlAll = async (request: FetchXmlRequest, records: any[] = []): Promise> => {\r\n // records = records || [];\r\n\r\n const response = await this.fetch(request);\r\n\r\n records = records.concat(response.value);\r\n\r\n if (response.PagingInfo) {\r\n request.pageNumber = response.PagingInfo.nextPage;\r\n request.pagingCookie = response.PagingInfo.cookie;\r\n\r\n return _executeFetchXmlAll(request, records);\r\n }\r\n\r\n return { value: records };\r\n };\r\n\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.fetchAll\", this._isBatch);\r\n return _executeFetchXmlAll(request);\r\n };\r\n\r\n /**\r\n * Associate for a collection-valued navigation property. (1:N or N:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n associate = async (request: AssociateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.associate\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"associate\";\r\n\r\n ErrorHelper.stringParameterCheck(request.relatedCollection, \"DynamicsWebApi.associate\", \"request.relatedcollection\");\r\n ErrorHelper.stringParameterCheck(request.relationshipName, \"DynamicsWebApi.associate\", \"request.relationshipName\");\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.associate\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.associate\", \"request.relatedKey\");\r\n\r\n internalRequest.navigationProperty = request.relationshipName + \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n internalRequest.data = { \"@odata.id\": `${request.relatedCollection}(${relatedKey})` };\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Disassociate for a collection-valued navigation property.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n disassociate = async (request: DisassociateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.disassociate\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.functionName = \"disassociate\";\r\n\r\n ErrorHelper.stringParameterCheck(request.relationshipName, \"DynamicsWebApi.disassociate\", \"request.relationshipName\");\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.disassociate\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.disassociate\", \"request.relatedId\");\r\n\r\n internalRequest.key = primaryKey;\r\n internalRequest.navigationProperty = `${request.relationshipName}(${relatedKey})/$ref`;\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Associate for a single-valued navigation property. (1:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n associateSingleValued = async (request: AssociateSingleValuedRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.associateSingleValued\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"PUT\";\r\n internalRequest.functionName = \"associateSingleValued\";\r\n\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.associateSingleValued\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.associateSingleValued\", \"request.relatedKey\");\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, \"DynamicsWebApi.associateSingleValued\", \"request.navigationProperty\");\r\n ErrorHelper.stringParameterCheck(request.relatedCollection, \"DynamicsWebApi.associateSingleValued\", \"request.relatedcollection\");\r\n\r\n internalRequest.navigationProperty += \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n internalRequest.data = { \"@odata.id\": `${request.relatedCollection}(${relatedKey})` };\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Removes a reference to an entity for a single-valued navigation property. (1:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n disassociateSingleValued = async (request: DisassociateSingleValuedRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.disassociateSingleValued\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.functionName = \"disassociateSingleValued\";\r\n\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.disassociateSingleValued\", \"request.primaryKey\");\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, \"DynamicsWebApi.disassociateSingleValued\", \"request.navigationProperty\");\r\n\r\n internalRequest.navigationProperty += \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Calls a Web API function\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n callFunction: CallFunction = async (request: string | BoundFunctionRequest | UnboundFunctionRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.callFunction`, \"request\");\r\n\r\n const getFunctionName = (request: BoundFunctionRequest | UnboundFunctionRequest) => request.name || request.functionName;\r\n\r\n const isObject = typeof request !== \"string\";\r\n const functionName = isObject ? getFunctionName(request) : request;\r\n const parameterName = isObject ? \"request.name\" : \"name\";\r\n const internalRequest: Core.InternalRequest = isObject ? Utility.copyObject(request, [\"name\"]) : { functionName: functionName };\r\n\r\n ErrorHelper.stringParameterCheck(functionName, `DynamicsWebApi.callFunction`, parameterName);\r\n\r\n const functionParameters = Utility.buildFunctionParameters(internalRequest.parameters);\r\n\r\n internalRequest.method = \"GET\";\r\n internalRequest._additionalUrl = functionName + functionParameters.key;\r\n internalRequest.queryParams = functionParameters.queryParams;\r\n internalRequest._isUnboundRequest = !internalRequest.collection;\r\n internalRequest.functionName = \"callFunction\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Calls a Web API action\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n callAction: CallAction = async (\r\n request: BoundActionRequest | UnboundActionRequest\r\n ): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.callAction`, \"request\");\r\n ErrorHelper.stringParameterCheck(request.actionName, `DynamicsWebApi.callAction`, \"request.actionName\");\r\n\r\n const internalRequest = Utility.copyRequest(request, [\"action\"]);\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"callAction\";\r\n\r\n internalRequest._additionalUrl = request.actionName;\r\n internalRequest._isUnboundRequest = !internalRequest.collection;\r\n internalRequest.data = request.action;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n /**\r\n * Sends an asynchronous request to create an entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createEntity = (request: CreateEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.createEntity`, \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createEntity\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"createEntity\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update an entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateEntity = (request: UpdateEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateEntity\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateEntity\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateEntity\", \"request.data.MetadataId\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.key = internalRequest.data.MetadataId;\r\n internalRequest.functionName = \"updateEntity\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveEntity = (request: RetrieveEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveEntity\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.retrieveEntity\", \"request.key\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntity\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve entity definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveEntities = (request?: RetrieveEntitiesRequest): Promise> => {\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntities\";\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create an attribute.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createAttribute = (request: CreateAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createAttribute\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createAttribute\", \"request.data\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.createAttribute\", \"request.entityKey\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntity\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.key = request.entityKey;\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update an attribute.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateAttribute = (request: UpdateAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateAttribute\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateAttribute\", \"request.data\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.updateAttribute\", \"request.entityKey\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateAttribute\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateAttribute\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.navigationPropertyKey = request.data.MetadataId;\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"updateAttribute\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve attribute metadata for a specified entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAttributes = (request: RetrieveAttributesRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveAttributes\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.retrieveAttributes\", \"request.entityKey\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveAttributes\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"retrieveAttributes\";\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific attribute metadata for a specified entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAttribute = (request: RetrieveAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveAttributes\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.retrieveAttribute\", \"request.entityKey\");\r\n ErrorHelper.keyParameterCheck(request.attributeKey, \"DynamicsWebApi.retrieveAttribute\", \"request.attributeKey\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveAttribute\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.navigationPropertyKey = request.attributeKey;\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"retrieveAttribute\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createRelationship = (request: CreateRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createRelationship\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createRelationship\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"createRelationship\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateRelationship = (request: UpdateRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateRelationship\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateRelationship\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateRelationship\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateRelationship\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.key = request.data.MetadataId;\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"updateRelationship\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteRelationship = (request: DeleteRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteRelationship\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.deleteRelationship\", \"request.key\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"deleteRelationship\";\r\n\r\n return this.deleteRecord(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve relationship definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveRelationships = (request?: RetrieveRelationshipsRequest): Promise> => {\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"retrieveRelationships\";\r\n\r\n if (request) {\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveRelationships\", \"request.castType\");\r\n internalRequest.navigationProperty = request.castType;\r\n }\r\n }\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveRelationship = (request: RetrieveRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveRelationship\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.retrieveRelationship\", \"request.key\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveRelationship\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"retrieveRelationship\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a Global Option Set definition\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createGlobalOptionSet = (request: CreateGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createGlobalOptionSet\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createGlobalOptionSet\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"createGlobalOptionSet\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a Global Option Set.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateGlobalOptionSet = (request: UpdateGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateGlobalOptionSet\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.key = request.data.MetadataId;\r\n internalRequest.functionName = \"updateGlobalOptionSet\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a Global Option Set.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteGlobalOptionSet = (request: DeleteGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteGlobalOptionSet\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"deleteGlobalOptionSet\";\r\n\r\n return this.deleteRecord(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve Global Option Set definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveGlobalOptionSet = (request: RetrieveGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveGlobalOptionSet\", \"request\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveGlobalOptionSet\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"retrieveGlobalOptionSet\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve Global Option Set definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveGlobalOptionSets = (request?: RetrieveGlobalOptionSetsRequest): Promise> => {\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"retrieveGlobalOptionSets\";\r\n\r\n if (request?.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveGlobalOptionSets\", \"request.castType\");\r\n internalRequest.navigationProperty = request.castType;\r\n }\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Retrieves a CSDL Document Metadata\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} A raw CSDL $metadata document.\r\n */\r\n retrieveCsdlMetadata = async (request?: CsdlMetadataRequest): Promise => {\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"$metadata\";\r\n internalRequest.functionName = \"retrieveCsdlMetadata\";\r\n\r\n if (request?.addAnnotations) {\r\n ErrorHelper.boolParameterCheck(request.addAnnotations, \"DynamicsWebApi.retrieveCsdlMetadata\", \"request.addAnnotations\");\r\n internalRequest.includeAnnotations = \"*\";\r\n }\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides a search results page.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Search result\r\n */\r\n search: SearchFunction = async (request: string | SearchRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.search\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: Core.InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.search\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.search\", parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.search\", parameterName, 100);\r\n\r\n internalRequest.collection = \"query\";\r\n internalRequest.functionName = \"search\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Suggestions result\r\n */\r\n suggest: SuggestFunction = async (request: string | SuggestRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.suggest\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: Core.InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.suggest\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.suggest\", parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.suggest\", parameterName, 100);\r\n\r\n internalRequest.functionName = internalRequest.collection = \"suggest\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n autocomplete: AutocompleteFunction = async (request: string | AutocompleteRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.autocomplete\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: Core.InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n if (isObject) ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.autocomplete\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, `DynamicsWebApi.autocomplete`, parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.autocomplete\", parameterName, 100);\r\n\r\n internalRequest.functionName = internalRequest.collection = \"autocomplete\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Starts/executes a batch request.\r\n */\r\n startBatch = (): void => {\r\n this._isBatch = true;\r\n this._batchRequestId = Utility.generateUUID();\r\n };\r\n\r\n /**\r\n * Executes a batch request. Please call DynamicsWebApi.startBatch() first to start a batch request.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n executeBatch = async (request?: BatchRequest): Promise => {\r\n ErrorHelper.throwBatchNotStarted(this._isBatch);\r\n\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"$batch\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"executeBatch\";\r\n internalRequest.requestId = this._batchRequestId;\r\n\r\n this._batchRequestId = null;\r\n this._isBatch = false;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Creates a new instance of DynamicsWebApi. If config is not provided, it is copied from a current instance.\r\n *\r\n * @param {Config} config configuration object.\r\n * @returns {DynamicsWebApi} A new instance of DynamicsWebApi\r\n */\r\n initializeInstance = (config?: Config): DynamicsWebApi => new DynamicsWebApi(config || this._config);\r\n\r\n Utility = {\r\n /**\r\n * Searches for a collection name by provided entity name in a cached entity metadata.\r\n * The returned collection name can be null.\r\n *\r\n * @param {string} entityName entity name\r\n * @returns {string | null} collection name\r\n */\r\n getCollectionName: (entityName: string): string | null => RequestClient.getCollectionName(entityName),\r\n };\r\n}\r\n\r\nexport interface Expand {\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**Limit the number of results returned by using the $top system query option.Do not use $top with $count! */\r\n top?: number;\r\n /**An Array(of Strings) representing the order in which items are returned using the $orderby system query option.Use the asc or desc suffix to specify ascending or descending order respectively.The default is ascending if the suffix isn't applied. */\r\n orderBy?: string[];\r\n /**A name of a single-valued navigation property which needs to be expanded. */\r\n property?: string;\r\n /**An Array of Expand Objects representing the $expand Query Option value to control which related records need to be returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface BaseRequest {\r\n /**XHR requests only! Indicates whether the requests should be made synchronously or asynchronously.Default value is 'true'(asynchronously). */\r\n async?: boolean;\r\n /**Impersonates a user based on their systemuserid by adding \"MSCRMCallerID\" header. A String representing the GUID value for the Dynamics 365 systemuserid. */\r\n impersonate?: string;\r\n /**Impersonates a user based on their Azure Active Directory (AAD) object id by passing that value along with the header \"CallerObjectId\". A String should represent a GUID value. */\r\n impersonateAAD?: string;\r\n /**If set to 'true', DynamicsWebApi adds a request header 'Cache-Control: no-cache'.Default value is 'false'. */\r\n noCache?: boolean;\r\n /** Authorization Token. If set, onTokenRefresh will not be called. */\r\n token?: string;\r\n /**Sets a number of milliseconds before a request times out. */\r\n timeout?: number;\r\n /**The AbortSignal interface represents a signal object that allows you to communicate with a DOM request and abort it if required via an AbortController object. */\r\n signal?: AbortSignal;\r\n /**Indicates if an operation must be included in a Change Set or not. Works in Batch Operations only. By default, it's \"true\", except for GET operations - they are not allowed in Change Sets. */\r\n inChangeSet?: boolean;\r\n /**Headers to supply with a request. These headers will override configuraiton headers if the identical ones were set. */\r\n headers?: HeaderCollection;\r\n /**Custom query parameters. Can be used to set parameter aliases for \"$filter\" and \"$orderBy\". Important! These parameters ARE NOT URI encoded! */\r\n queryParams?: string[];\r\n}\r\n\r\nexport interface BatchRequest extends BaseRequest {\r\n /** Sets Prefer header to \"odata.continue-on-error\" that allows more requests be processed when errors occur. The batch request will return '200 OK' and individual response errors will be returned in the batch response body. */\r\n continueOnError?: boolean;\r\n}\r\n\r\nexport interface Request extends BaseRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection?: string;\r\n}\r\n\r\nexport interface CRUDRequest extends Request {\r\n /**A String representing collection record's Primary Key (GUID) or Alternate Key(s). */\r\n key?: string;\r\n}\r\n\r\nexport interface CountRequest extends Request {\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n}\r\n\r\nexport interface CountAllRequest extends CountRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**An Array (of strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n}\r\n\r\nexport interface FetchAllRequest extends Request {\r\n /**Sets FetchXML - a proprietary query language that provides capabilities to perform aggregation. */\r\n fetchXml: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation. Annotations provide additional information about lookups, options sets and other complex attribute types. For example: * or Microsoft.Dynamics.CRM.fetchxmlpagingcookie */\r\n includeAnnotations?: string;\r\n}\r\n\r\nexport interface FetchXmlRequest extends FetchAllRequest {\r\n /**Page number. */\r\n pageNumber?: number;\r\n /**Paging cookie. To retrive the first page, pagingCookie must be null. */\r\n pagingCookie?: string;\r\n}\r\n\r\nexport interface CreateRequest extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Web API v9+ only! Boolean that enables duplicate detection. */\r\n duplicateDetection?: boolean;\r\n /**A JavaScript object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data?: T;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface UpdateRequestBase extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Web API v9+ only! Boolean that enables duplicate detection. */\r\n duplicateDetection?: boolean;\r\n /**A JavaScript object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data?: T;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**Casts the AttributeMetadata to a specific type. (Used in requests to Attribute Metadata). */\r\n metadataAttributeType?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface UpdateRequest extends UpdateRequestBase {\r\n /**If set to 'true', DynamicsWebApi adds a request header 'MSCRM.MergeLabels: true'. Default value is 'false' */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface UpdateSinglePropertyRequest extends CRUDRequest {\r\n /**Object with a logical name of the field as a key and a value to update with. Example: {subject: \"Update Record\"} */\r\n fieldValuePair: { [key: string]: any };\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n}\r\n\r\nexport interface UpsertRequest extends UpdateRequestBase {\r\n /**Sets If-None-Match header value that enables to use conditional retrieval in applicable requests. */\r\n ifnonematch?: string;\r\n}\r\n\r\nexport interface DeleteRequest extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**Field name that needs to be cleared (for example File Field) */\r\n fieldName?: string;\r\n}\r\n\r\nexport interface RetrieveRequest extends CRUDRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets If-None-Match header value that enables to use conditional retrieval in applicable requests. */\r\n ifnonematch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Casts the AttributeMetadata to a specific type. (Used in requests to Attribute Metadata). */\r\n metadataAttributeType?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**A String representing the GUID value of the saved query. */\r\n savedQuery?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**A String representing the GUID value of the user query. */\r\n userQuery?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface RetrieveMultipleRequest extends Request {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**Use the $apply to aggregate and group your data dynamically */\r\n apply?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Boolean that sets the $count system query option with a value of true to include a count of entities that match the filter criteria up to 5000(per page).Do not use $top with $count! */\r\n count?: boolean;\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets the odata.maxpagesize preference value to request the number of entities returned in the response. */\r\n maxPageSize?: number;\r\n /**An Array(of string) representing the order in which items are returned using the $orderby system query option.Use the asc or desc suffix to specify ascending or descending order respectively.The default is ascending if the suffix isn't applied. */\r\n orderBy?: string[];\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Limit the number of results returned by using the $top system query option.Do not use $top with $count! */\r\n top?: number;\r\n /**Sets Prefer header with value 'odata.track-changes' to request that a delta link be returned which can subsequently be used to retrieve entity changes. */\r\n trackChanges?: boolean;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface AssociateRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Relationship name. */\r\n relationshipName: string;\r\n /**Related name of the Entity Collection or Entity Logical name. */\r\n relatedCollection: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface AssociateSingleValuedRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Navigation property name. */\r\n navigationProperty: string;\r\n /**Related name of the Entity Collection or Entity Logical name. */\r\n relatedCollection: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface DisassociateRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Relationship name. */\r\n relationshipName: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface DisassociateSingleValuedRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Navigation property name. */\r\n navigationProperty: string;\r\n}\r\n\r\nexport interface UnboundFunctionRequest extends BaseRequest {\r\n /**\r\n * Name of the function.\r\n */\r\n name?: string;\r\n /**\r\n * Name of the function. \r\n * @deprecated Use \"name\" parameter.\r\n */\r\n functionName?: string;\r\n /**Function's input parameters. Example: { param1: \"test\", param2: 3 }. */\r\n parameters?: any;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n}\r\n\r\nexport interface BoundFunctionRequest extends UnboundFunctionRequest, Request {\r\n /**A String representing the GUID value for the record. */\r\n key?: string;\r\n}\r\n\r\nexport interface UnboundActionRequest extends BaseRequest {\r\n /**A name of the Web API action. */\r\n actionName: string;\r\n /**An object that represents a Dynamics 365 action. */\r\n action?: TAction;\r\n}\r\n\r\nexport interface BoundActionRequest extends UnboundActionRequest, Request {\r\n /**A String representing the GUID value for the record. */\r\n key?: string;\r\n}\r\n\r\nexport interface CreateEntityRequest extends BaseRequest {\r\n /**An object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateEntityRequest extends CRUDRequest {\r\n /**An object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data: any;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface RetrieveEntityRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveEntitiesRequest extends BaseRequest {\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateAttributeRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Attribute metadata object. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateAttributeRequest extends CreateAttributeRequest {\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface RetrieveAttributesRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveAttributeRequest extends BaseRequest {\r\n /**An Attribute MetadataId or Alternate Key (such as LogicalName). */\r\n attributeKey: string;\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateRelationshipRequest extends BaseRequest {\r\n /**Relationship Definition. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateRelationshipRequest extends CreateRelationshipRequest {\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface DeleteRelationshipRequest extends BaseRequest {\r\n /**A Relationship MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n}\r\n\r\nexport interface RetrieveRelationshipsRequest extends BaseRequest {\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveRelationshipRequest extends BaseRequest {\r\n /**A Relationship MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateGlobalOptionSetRequest extends BaseRequest {\r\n /**Global Option Set Definition. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateGlobalOptionSetRequest extends CreateRelationshipRequest {\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface DeleteGlobalOptionSetRequest extends BaseRequest {\r\n /**A Global Option Set MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n}\r\n\r\nexport interface RetrieveGlobalOptionSetsRequest extends BaseRequest {\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveGlobalOptionSetRequest extends BaseRequest {\r\n /**A Global Option Set MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface UploadRequest extends CRUDRequest {\r\n /**Binary Buffer*/\r\n data: Uint8Array | Buffer;\r\n /**Name of the file */\r\n fileName: string;\r\n /**File Field Name */\r\n fieldName: string;\r\n}\r\n\r\nexport interface DownloadRequest extends CRUDRequest {\r\n /**File Field Name */\r\n fieldName: string;\r\n}\r\n\r\nexport interface CsdlMetadataRequest extends BaseRequest {\r\n /**If set to \"true\" the document will include many different kinds of annotations that can be useful. Most annotations are not included by default because they increase the total size of the document. */\r\n addAnnotations?: boolean;\r\n}\r\n\r\nexport type SearchMode = \"any\" | \"all\";\r\nexport type SearchType = \"simple\" | \"full\";\r\n\r\nexport interface SearchQueryBase {\r\n /**The search parameter value contains the term to be searched for and has a 100-character limit. For suggestions, min 3 characters in addition. */\r\n search: string;\r\n /**The default table list searches across all Dataverse search\u2013configured tables and columns. The default list is configured by your administrator when Dataverse search is enabled. */\r\n entities?: string[];\r\n /**Filters are applied while searching data and are specified in standard OData syntax. */\r\n filter?: string;\r\n}\r\n\r\nexport interface Search extends SearchQueryBase {\r\n /**Facets support the ability to drill down into data results after they've been retrieved. */\r\n facets?: string[];\r\n /**Specify true to return the total record count; otherwise false. The default is false. */\r\n returnTotalRecordCount?: boolean;\r\n /**Specifies the number of search results to skip. */\r\n skip?: number;\r\n /**Specifies the number of search results to retrieve. The default is 50, and the maximum value is 100. */\r\n top?: number;\r\n /**A list of comma-separated clauses where each clause consists of a column name followed by 'asc' (ascending, which is the default) or 'desc' (descending). This list specifies how to order the results in order of precedence. */\r\n orderBy?: string[];\r\n /**Specifies whether any or all the search terms must be matched to count the document as a match. The default is 'any'. */\r\n searchMode?: SearchMode;\r\n /**The search type specifies the syntax of a search query. Using 'simple' selects simple query syntax and 'full' selects Lucene query syntax. The default is 'simple'. */\r\n searchType?: SearchType;\r\n}\r\n\r\nexport interface Suggest extends SearchQueryBase {\r\n /**Use fuzzy search to aid with misspellings. The default is false. */\r\n useFuzzy?: boolean;\r\n /**Number of suggestions to retrieve. The default is 5. */\r\n top?: number;\r\n /**A list of comma-separated clauses where each clause consists of a column name followed by 'asc' (ascending, which is the default) or 'desc' (descending). This list specifies how to order the results in order of precedence. */\r\n orderBy?: string[];\r\n}\r\n\r\nexport interface Autocomplete extends SearchQueryBase {\r\n /**Use fuzzy search to aid with misspellings. The default is false. */\r\n useFuzzy?: boolean;\r\n}\r\n\r\nexport interface SearchRequest extends BaseRequest {\r\n /**Search query object */\r\n query: Search;\r\n}\r\n\r\nexport interface SuggestRequest extends BaseRequest {\r\n /**Suggestion query object */\r\n query: Suggest;\r\n}\r\n\r\nexport interface AutocompleteRequest extends BaseRequest {\r\n /**Autocomplete query object */\r\n query: Autocomplete;\r\n}\r\n\r\nexport interface ApiConfig {\r\n /** API Version to use, for example: \"9.2\" or \"1.0\" */\r\n version?: string;\r\n /** API Path, for example: \"data\" or \"search\" */\r\n path?: string;\r\n}\r\n\r\nexport interface AccessToken {\r\n /** Access Token */\r\n accessToken: string;\r\n}\r\n\r\nexport interface Config {\r\n /**The url to Dataverse API server, for example: https://contoso.api.crm.dynamics.com/. It is required when used in Node.js application. */\r\n serverUrl?: string | null;\r\n /**Impersonates a user based on their systemuserid by adding \"MSCRMCallerID\" header. A String representing the GUID value for the Dynamics 365 systemuserid. */\r\n impersonate?: string | null;\r\n /**Impersonates a user based on their Azure Active Directory (AAD) object id by passing that value along with the header \"CallerObjectId\". A String should represent a GUID value. */\r\n impersonateAAD?: string | null;\r\n /**A function that is called when a security token needs to be refreshed. */\r\n onTokenRefresh?: (() => Promise) | null;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types.*/\r\n includeAnnotations?: string | null;\r\n /**Sets the odata.maxpagesize preference value to request the number of entities returned in the response. */\r\n maxPageSize?: number | null;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request.*/\r\n returnRepresentation?: boolean | null;\r\n /**Indicates whether to use Entity Logical Names instead of Collection Logical Names.*/\r\n useEntityNames?: boolean | null;\r\n /**Sets a number of milliseconds before a request times out. */\r\n timeout?: number | null;\r\n /**Proxy configuration object. */\r\n proxy?: ProxyConfig | null;\r\n /**Configuration object for Dataverse Web API (with path \"data\"). */\r\n dataApi?: ApiConfig;\r\n /**Configuration object for Dataverse Search API (with path \"search\"). */\r\n searchApi?: ApiConfig;\r\n /**Default headers to supply with each request. */\r\n headers?: HeaderCollection;\r\n}\r\n\r\n/**Header collection type */\r\nexport type HeaderCollection = {\r\n /**key-value */\r\n [key: string]: string;\r\n};\r\n\r\nexport interface ProxyConfig {\r\n /**Proxy server url */\r\n url: string;\r\n /**Basic authentication credentials */\r\n auth?: {\r\n /**Username */\r\n username: string;\r\n /**Password */\r\n password: string;\r\n };\r\n}\r\n\r\n/** Callback with an acquired token called by DynamicsWebApi; \"token\" argument can be a string or an object with a property {accessToken: } */\r\n// export interface OnTokenAcquiredCallback {\r\n// (token: any): void;\r\n// }\r\n\r\nexport interface RequestError extends Error {\r\n /**The name of the error */\r\n name: string;\r\n /**This code is not related to the http status code and is frequently empty */\r\n code?: string;\r\n /**A message describing the error */\r\n message: string;\r\n /**HTTP status code */\r\n status?: number;\r\n /**HTTP status text. Frequently empty */\r\n statusText?: string;\r\n /**HTTP Response headers */\r\n headers?: any;\r\n /**Details about an error */\r\n innererror?: {\r\n /**A message describing the error, this is frequently the same as the outer message */\r\n message?: string;\r\n /**Microsoft.Crm.CrmHttpException */\r\n type?: string;\r\n /**Details from the server about where the error occurred */\r\n stacktrace?: string;\r\n };\r\n}\r\n\r\nexport interface MultipleResponse {\r\n /**Multiple respone entities */\r\n value: T[];\r\n oDataCount?: number;\r\n \"@odata.count\"?: number;\r\n oDataContext?: string;\r\n \"@odata.context\"?: number;\r\n}\r\n\r\nexport interface AllResponse extends MultipleResponse {\r\n /**@odata.deltaLink value */\r\n oDataDeltaLink?: string;\r\n}\r\n\r\nexport interface RetrieveMultipleResponse extends MultipleResponse {\r\n \"@Microsoft.Dynamics.CRM.totalrecordcount\"?: number;\r\n \"@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded\"?: boolean;\r\n /**@odata.nextLink value */\r\n oDataNextLink?: string;\r\n /**@odata.deltaLink value */\r\n oDataDeltaLink?: string;\r\n \"@odata.deltaLink\"?: string;\r\n \"@odata.nextLink\"?: string;\r\n}\r\n\r\nexport interface FetchXmlResponse extends MultipleResponse {\r\n \"@Microsoft.Dynamics.CRM.totalrecordcount\"?: number;\r\n \"@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded\"?: boolean;\r\n /**Paging information */\r\n PagingInfo?: {\r\n /**Number of the next page */\r\n nextPage?: number;\r\n /**Next page cookie */\r\n cookie?: string;\r\n };\r\n}\r\n\r\nexport interface DownloadResponse {\r\n /**The name of the file */\r\n fileName: string;\r\n /**File size */\r\n fileSize: number;\r\n /**File Data */\r\n data: Uint8Array | Buffer;\r\n}\r\n\r\nexport interface SearchResponse {\r\n /**Search results*/\r\n value: TValue[];\r\n facets: any | null;\r\n totalrecordcount: number;\r\n querycontext: any | null;\r\n}\r\n\r\nexport interface SuggestResponseValue {\r\n text: string;\r\n document: TDocument;\r\n}\r\n\r\nexport interface SuggestResponse {\r\n /**Suggestions*/\r\n value: SuggestResponseValue[];\r\n querycontext: any | null;\r\n}\r\n\r\nexport interface AutocompleteResponse {\r\n /**Autocomplete result*/\r\n value: string | null;\r\n querycontext: any | null;\r\n}\r\n\r\n//function overloads\r\n\r\ntype CallFunction = {\r\n /**\r\n * Calls a Web API function\r\n *\r\n * @param name - The name of a function.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (name: string): Promise;\r\n /**\r\n * Calls a bound Web API function\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundFunctionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API function (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundFunctionRequest): Promise;\r\n};\r\n\r\ntype CallAction = {\r\n /**\r\n * Calls a bound Web API action (bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {T} Type of the value in a response\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundActionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API action (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {T} Type of the value in a response\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundActionRequest): Promise;\r\n /**\r\n * Calls a bound Web API action (bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {TResponse} Type of the value in a response\r\n * @type {TAction} Type of an action object\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundActionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API action (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {TResponse} Type of the value in a response\r\n * @type {TAction} Type of an action object\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundActionRequest): Promise;\r\n};\r\n\r\ntype SearchFunction = {\r\n /**\r\n * Provides a search results page.\r\n * @param term - The term to be searched for and has a max 100-character limit.\r\n * @returns {Promise} Search result\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides a search results page.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Search result\r\n */\r\n (request: SearchRequest): Promise>;\r\n};\r\n\r\ntype SuggestFunction = {\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param term - The term to be searched for and has min 3 characters to a max 100-character limit.\r\n * @returns {Promise} Suggestions result\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Suggestions result\r\n */\r\n (request: SuggestRequest): Promise>;\r\n};\r\n\r\ntype AutocompleteFunction = {\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param term - The term to be searched for and has a 100-character limit.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n (request: AutocompleteRequest): Promise;\r\n};\r\n", "import { Utility } from \"./Utility\";\r\nimport { ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { ApiConfig, Config } from \"../dynamics-web-api\";\r\n\r\ntype ApiType = \"dataApi\" | \"searchApi\";\r\n\r\nexport interface InternalApiConfig extends ApiConfig {\r\n url: string;\r\n}\r\n\r\nexport interface InternalConfig extends Config {\r\n dataApi: InternalApiConfig;\r\n searchApi: InternalApiConfig;\r\n}\r\n\r\nconst getApiUrl = (serverUrl: string | undefined | null, apiConfig: ApiConfig): string => {\r\n if (Utility.isRunningWithinPortals()) {\r\n return new URL(\"_api\", global.window.location.origin).toString() + \"/\";\r\n } else {\r\n if (!serverUrl) serverUrl = Utility.getClientUrl();\r\n return new URL(`api/${apiConfig.path}/v${apiConfig.version}`, serverUrl).toString() + \"/\";\r\n }\r\n};\r\n\r\nconst mergeApiConfigs = (apiConfig: ApiConfig | undefined, apiType: ApiType, internalConfig: InternalConfig): void => {\r\n const internalApiConfig = internalConfig[apiType] as InternalApiConfig;\r\n\r\n if (apiConfig?.version) {\r\n ErrorHelper.stringParameterCheck(apiConfig.version, \"DynamicsWebApi.setConfig\", `config.${apiType}.version`);\r\n internalApiConfig.version = apiConfig.version;\r\n }\r\n\r\n if (apiConfig?.path) {\r\n ErrorHelper.stringParameterCheck(apiConfig.path, \"DynamicsWebApi.setConfig\", `config.${apiType}.path`);\r\n internalApiConfig.path = apiConfig.path;\r\n }\r\n\r\n internalApiConfig.url = getApiUrl(internalConfig.serverUrl, internalApiConfig);\r\n};\r\n\r\nexport class ConfigurationUtility {\r\n static mergeApiConfigs = mergeApiConfigs;\r\n\r\n static merge(internalConfig: InternalConfig, config?: Config): void {\r\n if (config?.serverUrl) {\r\n ErrorHelper.stringParameterCheck(config.serverUrl, \"DynamicsWebApi.setConfig\", \"config.serverUrl\");\r\n internalConfig.serverUrl = config.serverUrl;\r\n }\r\n\r\n mergeApiConfigs(config?.dataApi, \"dataApi\", internalConfig);\r\n mergeApiConfigs(config?.searchApi, \"searchApi\", internalConfig);\r\n\r\n if (config?.impersonate) {\r\n internalConfig.impersonate = ErrorHelper.guidParameterCheck(config.impersonate, \"DynamicsWebApi.setConfig\", \"config.impersonate\");\r\n }\r\n\r\n if (config?.impersonateAAD) {\r\n internalConfig.impersonateAAD = ErrorHelper.guidParameterCheck(config.impersonateAAD, \"DynamicsWebApi.setConfig\", \"config.impersonateAAD\");\r\n }\r\n\r\n if (config?.onTokenRefresh) {\r\n ErrorHelper.callbackParameterCheck(config.onTokenRefresh, \"DynamicsWebApi.setConfig\", \"config.onTokenRefresh\");\r\n internalConfig.onTokenRefresh = config.onTokenRefresh;\r\n }\r\n\r\n if (config?.includeAnnotations) {\r\n ErrorHelper.stringParameterCheck(config.includeAnnotations, \"DynamicsWebApi.setConfig\", \"config.includeAnnotations\");\r\n internalConfig.includeAnnotations = config.includeAnnotations;\r\n }\r\n\r\n if (config?.timeout) {\r\n ErrorHelper.numberParameterCheck(config.timeout, \"DynamicsWebApi.setConfig\", \"config.timeout\");\r\n internalConfig.timeout = config.timeout;\r\n }\r\n\r\n if (config?.maxPageSize) {\r\n ErrorHelper.numberParameterCheck(config.maxPageSize, \"DynamicsWebApi.setConfig\", \"config.maxPageSize\");\r\n internalConfig.maxPageSize = config.maxPageSize;\r\n }\r\n\r\n if (config?.returnRepresentation) {\r\n ErrorHelper.boolParameterCheck(config.returnRepresentation, \"DynamicsWebApi.setConfig\", \"config.returnRepresentation\");\r\n internalConfig.returnRepresentation = config.returnRepresentation;\r\n }\r\n\r\n if (config?.useEntityNames) {\r\n ErrorHelper.boolParameterCheck(config.useEntityNames, \"DynamicsWebApi.setConfig\", \"config.useEntityNames\");\r\n internalConfig.useEntityNames = config.useEntityNames;\r\n }\r\n\r\n if (config?.headers) {\r\n internalConfig.headers = config.headers;\r\n }\r\n\r\n if (!global.DWA_BROWSER && config?.proxy) {\r\n ErrorHelper.parameterCheck(config.proxy, \"DynamicsWebApi.setConfig\", \"config.proxy\");\r\n\r\n if (config.proxy.url) {\r\n ErrorHelper.stringParameterCheck(config.proxy.url, \"DynamicsWebApi.setConfig\", \"config.proxy.url\");\r\n\r\n if (config.proxy.auth) {\r\n ErrorHelper.parameterCheck(config.proxy.auth, \"DynamicsWebApi.setConfig\", \"config.proxy.auth\");\r\n ErrorHelper.stringParameterCheck(config.proxy.auth.username, \"DynamicsWebApi.setConfig\", \"config.proxy.auth.username\");\r\n ErrorHelper.stringParameterCheck(config.proxy.auth.password, \"DynamicsWebApi.setConfig\", \"config.proxy.auth.password\");\r\n }\r\n }\r\n\r\n internalConfig.proxy = config.proxy;\r\n }\r\n }\r\n\r\n static default(): InternalConfig {\r\n return {\r\n serverUrl: null,\r\n impersonate: null,\r\n impersonateAAD: null,\r\n onTokenRefresh: null,\r\n includeAnnotations: null,\r\n maxPageSize: null,\r\n returnRepresentation: null,\r\n proxy: null,\r\n dataApi: {\r\n path: \"data\",\r\n version: \"9.2\",\r\n url: \"\"\r\n },\r\n searchApi: {\r\n path: \"search\",\r\n version: \"1.0\",\r\n url: \"\"\r\n },\r\n };\r\n }\r\n}\r\n", "import { Utility } from \"../utils/Utility\";\r\nimport { InternalConfig } from \"../utils/Config\";\r\nimport { RequestUtility } from \"../utils/Request\";\r\nimport { DynamicsWebApiError, ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { Core } from \"../types\";\r\nimport { executeRequest } from \"./helpers/executeRequest\";\r\nimport { AccessToken } from \"../dynamics-web-api\";\r\n\r\nconst _addResponseParams = (requestId, responseParams) => {\r\n if (_responseParseParams[requestId]) _responseParseParams[requestId].push(responseParams);\r\n else _responseParseParams[requestId] = [responseParams];\r\n};\r\n\r\nconst _addRequestToBatchCollection = (requestId, request) => {\r\n if (_batchRequestCollection[requestId]) _batchRequestCollection[requestId].push(request);\r\n else _batchRequestCollection[requestId] = [request];\r\n};\r\n\r\nconst _clearRequestData = (requestId: string): void => {\r\n delete _responseParseParams[requestId];\r\n if (_batchRequestCollection.hasOwnProperty(requestId)) delete _batchRequestCollection[requestId];\r\n};\r\n\r\nconst _runRequest = async (request: Core.InternalRequest, config: InternalConfig): Promise => {\r\n try {\r\n const result = await RequestClient.sendRequest(request, config);\r\n _clearRequestData(request.requestId!);\r\n\r\n return result;\r\n } catch (error) {\r\n _clearRequestData(request.requestId!);\r\n throw error;\r\n } finally {\r\n _clearRequestData(request.requestId!);\r\n }\r\n};\r\n\r\nlet _batchRequestCollection: Core.BatchRequestCollection = {};\r\nlet _responseParseParams: { [key: string]: any[] } = {};\r\n\r\nexport class RequestClient {\r\n /**\r\n * Sends a request to given URL with given parameters\r\n *\r\n * @param {InternalRequest} request - Composed request to D365 Web Api\r\n * @param {InternalConfig} config - DynamicsWebApi config.\r\n */\r\n static async sendRequest(request: Core.InternalRequest, config: InternalConfig): Promise {\r\n request.headers = request.headers || {};\r\n request.responseParameters = request.responseParameters || {};\r\n request.requestId = request.requestId || Utility.generateUUID();\r\n\r\n //add response parameters to parse\r\n _addResponseParams(request.requestId, request.responseParameters);\r\n\r\n //stringify passed data\r\n let processedData = null;\r\n\r\n const isBatchConverted = request.responseParameters?.convertedToBatch;\r\n\r\n if (request.path === \"$batch\" && !isBatchConverted) {\r\n const batchRequest = _batchRequestCollection[request.requestId];\r\n\r\n if (!batchRequest) throw ErrorHelper.batchIsEmpty();\r\n\r\n const batchResult = RequestUtility.convertToBatch(batchRequest, config, request);\r\n\r\n processedData = batchResult.body;\r\n request.headers = { ...batchResult.headers, ...request.headers };\r\n\r\n //clear an array of requests\r\n delete _batchRequestCollection[request.requestId];\r\n } else {\r\n processedData = !isBatchConverted ? RequestUtility.processData(request.data, config) : request.data;\r\n\r\n if (!isBatchConverted) request.headers = RequestUtility.setStandardHeaders(request.headers);\r\n }\r\n\r\n if (config.impersonate && !request.headers![\"MSCRMCallerID\"]) {\r\n request.headers![\"MSCRMCallerID\"] = config.impersonate;\r\n }\r\n\r\n if (config.impersonateAAD && !request.headers![\"CallerObjectId\"]) {\r\n request.headers![\"CallerObjectId\"] = config.impersonateAAD;\r\n }\r\n\r\n let token: AccessToken | string | null = null;\r\n\r\n //call a token refresh callback only if it is set and there is no \"Authorization\" header set yet\r\n if (config.onTokenRefresh && (!request.headers || (request.headers && !request.headers[\"Authorization\"]))) {\r\n token = await config.onTokenRefresh();\r\n if (!token) throw new Error(\"Token is empty. Request is aborted.\");\r\n }\r\n\r\n if (token) {\r\n request.headers![\"Authorization\"] = \"Bearer \" + (token.hasOwnProperty(\"accessToken\") ? (token as AccessToken).accessToken : token);\r\n }\r\n\r\n if (Utility.isRunningWithinPortals()) {\r\n request.headers![\"__RequestVerificationToken\"] = await global.window.shell!.getTokenDeferred();\r\n }\r\n\r\n const url = request.apiConfig ? request.apiConfig.url : config.dataApi.url;\r\n\r\n return await executeRequest({\r\n method: request.method!,\r\n uri: url!.toString() + request.path,\r\n data: processedData,\r\n additionalHeaders: request.headers,\r\n responseParams: _responseParseParams,\r\n isAsync: request.async,\r\n timeout: request.timeout || config.timeout,\r\n proxy: config.proxy,\r\n requestId: request.requestId!,\r\n abortSignal: request.signal,\r\n });\r\n }\r\n\r\n private static async _getCollectionNames(entityName: string, config: InternalConfig): Promise {\r\n if (!Utility.isNull(RequestUtility.entityNames)) {\r\n return RequestUtility.findCollectionName(entityName) || entityName;\r\n }\r\n\r\n const request = RequestUtility.compose(\r\n {\r\n method: \"GET\",\r\n collection: \"EntityDefinitions\",\r\n select: [\"EntitySetName\", \"LogicalName\"],\r\n noCache: true,\r\n functionName: \"retrieveMultiple\",\r\n },\r\n config\r\n );\r\n\r\n const result = await _runRequest(request, config);\r\n RequestUtility.entityNames = {};\r\n for (let i = 0; i < result.data.value.length; i++) {\r\n RequestUtility.entityNames[result.data.value[i].LogicalName] = result.data.value[i].EntitySetName;\r\n }\r\n\r\n return RequestUtility.findCollectionName(entityName) || entityName;\r\n }\r\n\r\n private static _isEntityNameException(entityName: string): boolean {\r\n const exceptions = [\r\n \"$metadata\",\r\n \"EntityDefinitions\",\r\n \"RelationshipDefinitions\",\r\n \"GlobalOptionSetDefinitions\",\r\n \"ManagedPropertyDefinitions\",\r\n \"query\",\r\n \"suggest\",\r\n \"autocomplete\",\r\n ];\r\n\r\n return exceptions.indexOf(entityName) > -1;\r\n }\r\n\r\n private static async _checkCollectionName(entityName: string | null | undefined, config: InternalConfig): Promise {\r\n if (!entityName || RequestClient._isEntityNameException(entityName)) {\r\n return entityName;\r\n }\r\n\r\n entityName = entityName.toLowerCase();\r\n\r\n if (!config.useEntityNames) {\r\n return entityName;\r\n }\r\n\r\n try {\r\n return await RequestClient._getCollectionNames(entityName, config);\r\n } catch (error: any) {\r\n throw new Error(\"Unable to fetch Collection Names. Error: \" + (error as DynamicsWebApiError).message);\r\n }\r\n }\r\n\r\n static async makeRequest(request: Core.InternalRequest, config: InternalConfig): Promise {\r\n request.responseParameters = request.responseParameters || {};\r\n //we don't want to mix headers set by the library and by the user\r\n request.userHeaders = request.headers;\r\n delete request.headers;\r\n\r\n if (!request.isBatch) {\r\n const collectionName = await RequestClient._checkCollectionName(request.collection, config);\r\n\r\n request.collection = collectionName;\r\n RequestUtility.compose(request, config);\r\n request.responseParameters.convertedToBatch = false;\r\n\r\n //the URL contains more characters than max possible limit, convert the request to a batch request\r\n if (request.path!.length > 2000) {\r\n const batchRequest = RequestUtility.convertToBatch([request], config);\r\n\r\n request.method = \"POST\";\r\n request.path = \"$batch\";\r\n request.data = batchRequest.body;\r\n request.headers = { ...batchRequest.headers, ...request.userHeaders };\r\n request.responseParameters.convertedToBatch = true;\r\n }\r\n\r\n return _runRequest(request, config);\r\n }\r\n\r\n //no need to make a request to web api if it's a part of batch\r\n RequestUtility.compose(request, config);\r\n //add response parameters to parse\r\n _addResponseParams(request.requestId, request.responseParameters);\r\n _addRequestToBatchCollection(request.requestId, request);\r\n }\r\n\r\n static _clearTestData(): void {\r\n RequestUtility.entityNames = null;\r\n _responseParseParams = {};\r\n _batchRequestCollection = {};\r\n }\r\n\r\n static getCollectionName(entityName: string): string | null {\r\n return RequestUtility.findCollectionName(entityName);\r\n }\r\n}\r\n", "import { Utility } from \"./Utility\";\r\nimport { Config, HeaderCollection } from \"../dynamics-web-api\";\r\nimport { ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { Core } from \"../types\";\r\nimport { InternalConfig } from \"./Config\";\r\n\r\n/**\r\n * @typedef {Object} ConvertedRequestOptions\r\n * @property {string} url URL (without query)\r\n * @property {string} query Query String\r\n * @property {Object} headers Heades object (always an Object; can be empty: {})\r\n */\r\n\r\n/**\r\n * @typedef {Object} ConvertedRequest\r\n * @property {string} url URL (including Query String)\r\n * @property {Object} headers Heades object (always an Object; can be empty: {})\r\n * @property {boolean} async\r\n */\r\n\r\nexport class RequestUtility {\r\n /**\r\n * Converts a request object to URL link\r\n *\r\n * @param {Object} request - Request object\r\n * @param {Object} [config] - DynamicsWebApi config\r\n * @returns {ConvertedRequest} Converted request\r\n */\r\n static compose(request: Core.InternalRequest, config: InternalConfig): Core.InternalRequest {\r\n request.path = request.path || \"\";\r\n request.functionName = request.functionName || \"\";\r\n if (!request.url) {\r\n if (!request._isUnboundRequest && !request.contentId && !request.collection) {\r\n ErrorHelper.parameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, \"request.collection\");\r\n }\r\n if (request.collection != null) {\r\n ErrorHelper.stringParameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, \"request.collection\");\r\n request.path = request.collection;\r\n\r\n //add alternate key feature\r\n if (request.key) {\r\n request.key = ErrorHelper.keyParameterCheck(request.key, `DynamicsWebApi.${request.functionName}`, \"request.key\");\r\n request.path += `(${request.key})`;\r\n }\r\n }\r\n\r\n if (request.contentId) {\r\n ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, \"request.contentId\");\r\n if (request.contentId.startsWith(\"$\")) {\r\n request.path = request.path ? `${request.contentId}/${request.path}` : request.contentId;\r\n }\r\n }\r\n\r\n if (request._additionalUrl) {\r\n if (request.path) {\r\n request.path += \"/\";\r\n }\r\n request.path += request._additionalUrl;\r\n }\r\n\r\n request.path = RequestUtility.composeUrl(request, config, request.path);\r\n\r\n if (request.fetchXml) {\r\n ErrorHelper.stringParameterCheck(request.fetchXml, `DynamicsWebApi.${request.functionName}`, \"request.fetchXml\");\r\n let join = request.path.indexOf(\"?\") === -1 ? \"?\" : \"&\";\r\n request.path += `${join}fetchXml=${encodeURIComponent(request.fetchXml)}`;\r\n }\r\n } else {\r\n ErrorHelper.stringParameterCheck(request.url, `DynamicsWebApi.${request.functionName}`, \"request.url\");\r\n request.path = request.url.replace(config.dataApi.url, \"\");\r\n }\r\n\r\n if (request.hasOwnProperty(\"async\") && request.async != null) {\r\n ErrorHelper.boolParameterCheck(request.async, `DynamicsWebApi.${request.functionName}`, \"request.async\");\r\n } else {\r\n request.async = true;\r\n }\r\n\r\n request.headers = RequestUtility.composeHeaders(request, config);\r\n\r\n return request;\r\n }\r\n\r\n /**\r\n * Converts optional parameters of the request to URL. If expand parameter exists this function is called recursively.\r\n *\r\n * @param {Object} request - Request object\r\n * @param {string} request.functionName - Name of the function that converts a request (for Error Handling)\r\n * @param {string} url - URL beginning (with required parameters)\r\n * @param {string} [joinSymbol] - URL beginning (with required parameters)\r\n * @param {Object} [config] - DynamicsWebApi config\r\n * @returns {ConvertedRequestOptions} Additional options in request\r\n */\r\n static composeUrl(request: Core.InternalRequest, config: Config, url: string = \"\", joinSymbol: string = \"&\"): string {\r\n const queryArray: string[] = [];\r\n\r\n if (request) {\r\n if (request.navigationProperty) {\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, `DynamicsWebApi.${request.functionName}`, \"request.navigationProperty\");\r\n url += \"/\" + request.navigationProperty;\r\n\r\n if (request.navigationPropertyKey) {\r\n let navigationKey = ErrorHelper.keyParameterCheck(\r\n request.navigationPropertyKey,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.navigationPropertyKey\"\r\n );\r\n url += \"(\" + navigationKey + \")\";\r\n }\r\n\r\n if (request.navigationProperty === \"Attributes\") {\r\n if (request.metadataAttributeType) {\r\n ErrorHelper.stringParameterCheck(\r\n request.metadataAttributeType,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.metadataAttributeType\"\r\n );\r\n url += \"/\" + request.metadataAttributeType;\r\n }\r\n }\r\n }\r\n\r\n if (request.select?.length) {\r\n ErrorHelper.arrayParameterCheck(request.select, `DynamicsWebApi.${request.functionName}`, \"request.select\");\r\n\r\n if (request.functionName == \"retrieve\" && request.select.length == 1 && request.select[0].endsWith(\"/$ref\")) {\r\n url += \"/\" + request.select[0];\r\n } else {\r\n if (request.select[0].startsWith(\"/\") && request.functionName == \"retrieve\") {\r\n if (request.navigationProperty == null) {\r\n url += request.select.shift();\r\n } else {\r\n request.select.shift();\r\n }\r\n }\r\n\r\n //check if anything left in the array\r\n if (request.select.length) {\r\n queryArray.push(\"$select=\" + request.select.join(\",\"));\r\n }\r\n }\r\n }\r\n\r\n if (request.filter) {\r\n ErrorHelper.stringParameterCheck(request.filter, `DynamicsWebApi.${request.functionName}`, \"request.filter\");\r\n const removeBracketsFromGuidReg = /[^\"']{([\\w\\d]{8}[-]?(?:[\\w\\d]{4}[-]?){3}[\\w\\d]{12})}(?:[^\"']|$)/g;\r\n let filterResult = request.filter;\r\n\r\n //fix bug 2018-06-11\r\n let m: RegExpExecArray | null = null;\r\n while ((m = removeBracketsFromGuidReg.exec(filterResult)) !== null) {\r\n if (m.index === removeBracketsFromGuidReg.lastIndex) {\r\n removeBracketsFromGuidReg.lastIndex++;\r\n }\r\n\r\n let replacement = m[0].endsWith(\")\") ? \")\" : \" \";\r\n filterResult = filterResult.replace(m[0], \" \" + m[1] + replacement);\r\n }\r\n\r\n queryArray.push(\"$filter=\" + encodeURIComponent(filterResult));\r\n }\r\n\r\n if (request.fieldName) {\r\n ErrorHelper.stringParameterCheck(request.fieldName, `DynamicsWebApi.${request.functionName}`, \"request.fieldName\");\r\n url += \"/\" + request.fieldName;\r\n }\r\n\r\n if (request.savedQuery) {\r\n queryArray.push(\r\n \"savedQuery=\" + ErrorHelper.guidParameterCheck(request.savedQuery, `DynamicsWebApi.${request.functionName}`, \"request.savedQuery\")\r\n );\r\n }\r\n\r\n if (request.userQuery) {\r\n queryArray.push(\r\n \"userQuery=\" + ErrorHelper.guidParameterCheck(request.userQuery, `DynamicsWebApi.${request.functionName}`, \"request.userQuery\")\r\n );\r\n }\r\n\r\n if (request.apply) {\r\n ErrorHelper.stringParameterCheck(request.apply, `DynamicsWebApi.${request.functionName}`, \"request.apply\");\r\n queryArray.push(\"$apply=\" + request.apply);\r\n }\r\n\r\n if (request.count) {\r\n ErrorHelper.boolParameterCheck(request.count, `DynamicsWebApi.${request.functionName}`, \"request.count\");\r\n queryArray.push(\"$count=\" + request.count);\r\n }\r\n\r\n if (request.top && request.top > 0) {\r\n ErrorHelper.numberParameterCheck(request.top, `DynamicsWebApi.${request.functionName}`, \"request.top\");\r\n queryArray.push(\"$top=\" + request.top);\r\n }\r\n\r\n if (request.orderBy != null && request.orderBy.length) {\r\n ErrorHelper.arrayParameterCheck(request.orderBy, `DynamicsWebApi.${request.functionName}`, \"request.orderBy\");\r\n queryArray.push(\"$orderby=\" + request.orderBy.join(\",\"));\r\n }\r\n\r\n if (request.partitionId) {\r\n ErrorHelper.stringParameterCheck(request.partitionId, `DynamicsWebApi.${request.functionName}`, \"request.partitionId\");\r\n queryArray.push(\"partitionid='\" + request.partitionId + \"'\");\r\n }\r\n\r\n if (request.downloadSize) {\r\n ErrorHelper.stringParameterCheck(request.downloadSize, `DynamicsWebApi.${request.functionName}`, \"request.downloadSize\");\r\n queryArray.push(\"size=\" + request.downloadSize);\r\n }\r\n\r\n if (request.queryParams?.length) {\r\n ErrorHelper.arrayParameterCheck(request.queryParams, `DynamicsWebApi.${request.functionName}`, \"request.queryParams\");\r\n queryArray.push(request.queryParams.join(\"&\"));\r\n }\r\n\r\n if (request.fileName) {\r\n ErrorHelper.stringParameterCheck(request.fileName, `DynamicsWebApi.${request.functionName}`, \"request.fileName\");\r\n queryArray.push(\"x-ms-file-name=\" + request.fileName);\r\n }\r\n\r\n if (request.data) {\r\n ErrorHelper.parameterCheck(request.data, `DynamicsWebApi.${request.functionName}`, \"request.data\");\r\n }\r\n\r\n if (request.isBatch) {\r\n ErrorHelper.boolParameterCheck(request.isBatch, `DynamicsWebApi.${request.functionName}`, \"request.isBatch\");\r\n }\r\n\r\n if (!Utility.isNull(request.inChangeSet)) {\r\n ErrorHelper.boolParameterCheck(request.inChangeSet, `DynamicsWebApi.${request.functionName}`, \"request.inChangeSet\");\r\n }\r\n\r\n if (request.isBatch && Utility.isNull(request.inChangeSet)) request.inChangeSet = true;\r\n\r\n if (request.timeout) {\r\n ErrorHelper.numberParameterCheck(request.timeout, `DynamicsWebApi.${request.functionName}`, \"request.timeout\");\r\n }\r\n\r\n if (request.expand?.length) {\r\n ErrorHelper.stringOrArrayParameterCheck(request.expand, `DynamicsWebApi.${request.functionName}`, \"request.expand\");\r\n if (typeof request.expand === \"string\") {\r\n queryArray.push(\"$expand=\" + request.expand);\r\n } else {\r\n const expandQueryArray: string[] = [];\r\n for (let i = 0; i < request.expand.length; i++) {\r\n if (request.expand[i].property) {\r\n const expand = request.expand[i];\r\n expand.functionName = `${request.functionName} $expand`;\r\n let expandConverted = RequestUtility.composeUrl(expand, config, \"\", \";\");\r\n if (expandConverted) {\r\n expandConverted = `(${expandConverted.substr(1)})`;\r\n }\r\n expandQueryArray.push(request.expand[i].property + expandConverted);\r\n }\r\n }\r\n if (expandQueryArray.length) {\r\n queryArray.push(\"$expand=\" + expandQueryArray.join(\",\"));\r\n }\r\n }\r\n }\r\n }\r\n\r\n return !queryArray.length ? url : url + \"?\" + queryArray.join(joinSymbol);\r\n }\r\n\r\n static composeHeaders(request: Core.InternalRequest, config: Config): HeaderCollection {\r\n const headers: HeaderCollection = { ...config.headers, ...request.userHeaders };\r\n\r\n const prefer = RequestUtility.composePreferHeader(request, config);\r\n if (prefer.length) {\r\n headers[\"Prefer\"] = prefer;\r\n }\r\n\r\n if (request.collection === \"$metadata\") {\r\n headers[\"Accept\"] = \"application/xml\";\r\n }\r\n\r\n if (request.transferMode) {\r\n headers[\"x-ms-transfer-mode\"] = request.transferMode;\r\n }\r\n\r\n if (request.ifmatch != null && request.ifnonematch != null) {\r\n throw new Error(\r\n `DynamicsWebApi.${request.functionName}. Either one of request.ifmatch or request.ifnonematch parameters should be used in a call, not both.`\r\n );\r\n }\r\n\r\n if (request.ifmatch) {\r\n ErrorHelper.stringParameterCheck(request.ifmatch, `DynamicsWebApi.${request.functionName}`, \"request.ifmatch\");\r\n headers[\"If-Match\"] = request.ifmatch;\r\n }\r\n\r\n if (request.ifnonematch) {\r\n ErrorHelper.stringParameterCheck(request.ifnonematch, `DynamicsWebApi.${request.functionName}`, \"request.ifnonematch\");\r\n headers[\"If-None-Match\"] = request.ifnonematch;\r\n }\r\n\r\n if (request.impersonate) {\r\n ErrorHelper.stringParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, \"request.impersonate\");\r\n headers[\"MSCRMCallerID\"] = ErrorHelper.guidParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, \"request.impersonate\");\r\n }\r\n\r\n if (request.impersonateAAD) {\r\n ErrorHelper.stringParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, \"request.impersonateAAD\");\r\n headers[\"CallerObjectId\"] = ErrorHelper.guidParameterCheck(\r\n request.impersonateAAD,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.impersonateAAD\"\r\n );\r\n }\r\n\r\n if (request.token) {\r\n ErrorHelper.stringParameterCheck(request.token, `DynamicsWebApi.${request.functionName}`, \"request.token\");\r\n headers[\"Authorization\"] = \"Bearer \" + request.token;\r\n }\r\n\r\n if (request.duplicateDetection) {\r\n ErrorHelper.boolParameterCheck(request.duplicateDetection, `DynamicsWebApi.${request.functionName}`, \"request.duplicateDetection\");\r\n headers[\"MSCRM.SuppressDuplicateDetection\"] = \"false\";\r\n }\r\n\r\n if (request.bypassCustomPluginExecution) {\r\n ErrorHelper.boolParameterCheck(\r\n request.bypassCustomPluginExecution,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.bypassCustomPluginExecution\"\r\n );\r\n headers[\"MSCRM.BypassCustomPluginExecution\"] = \"true\";\r\n }\r\n\r\n if (request.noCache) {\r\n ErrorHelper.boolParameterCheck(request.noCache, `DynamicsWebApi.${request.functionName}`, \"request.noCache\");\r\n headers[\"Cache-Control\"] = \"no-cache\";\r\n }\r\n\r\n if (request.mergeLabels) {\r\n ErrorHelper.boolParameterCheck(request.mergeLabels, `DynamicsWebApi.${request.functionName}`, \"request.mergeLabels\");\r\n headers[\"MSCRM.MergeLabels\"] = \"true\";\r\n }\r\n\r\n if (request.contentId) {\r\n ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, \"request.contentId\");\r\n if (!request.contentId.startsWith(\"$\")) {\r\n headers[\"Content-ID\"] = request.contentId;\r\n }\r\n }\r\n\r\n if (request.contentRange) {\r\n ErrorHelper.stringParameterCheck(request.contentRange, `DynamicsWebApi.${request.functionName}`, \"request.contentRange\");\r\n headers[\"Content-Range\"] = request.contentRange;\r\n }\r\n\r\n if (request.range) {\r\n ErrorHelper.stringParameterCheck(request.range, `DynamicsWebApi.${request.functionName}`, \"request.range\");\r\n headers[\"Range\"] = request.range;\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n static composePreferHeader(request: Core.InternalRequest, config: Config): string {\r\n let returnRepresentation: boolean | null | undefined = request.returnRepresentation;\r\n let includeAnnotations: string | null | undefined = request.includeAnnotations;\r\n let maxPageSize: number | null | undefined = request.maxPageSize;\r\n let trackChanges: boolean | null | undefined = request.trackChanges;\r\n let continueOnError: boolean | null | undefined = request.continueOnError;\r\n\r\n let prefer: string[] = [];\r\n\r\n if (request.prefer && request.prefer.length) {\r\n ErrorHelper.stringOrArrayParameterCheck(request.prefer, `DynamicsWebApi.${request.functionName}`, \"request.prefer\");\r\n if (typeof request.prefer === \"string\") {\r\n prefer = request.prefer.split(\",\");\r\n }\r\n for (let i in prefer) {\r\n let item = prefer[i].trim();\r\n if (item === \"return=representation\") {\r\n returnRepresentation = true;\r\n } else if (item.includes(\"odata.include-annotations=\")) {\r\n includeAnnotations = item.replace(\"odata.include-annotations=\", \"\").replace(/\"/g, \"\");\r\n } else if (item.startsWith(\"odata.maxpagesize=\")) {\r\n maxPageSize = Number(item.replace(\"odata.maxpagesize=\", \"\").replace(/\"/g, \"\")) || 0;\r\n } else if (item.includes(\"odata.track-changes\")) {\r\n trackChanges = true;\r\n } else if (item.includes(\"odata.continue-on-error\")) {\r\n continueOnError = true;\r\n }\r\n }\r\n }\r\n\r\n //clear array\r\n prefer = [];\r\n\r\n if (config) {\r\n if (returnRepresentation == null) {\r\n returnRepresentation = config.returnRepresentation;\r\n }\r\n includeAnnotations = includeAnnotations ? includeAnnotations : config.includeAnnotations;\r\n maxPageSize = maxPageSize ? maxPageSize : config.maxPageSize;\r\n }\r\n\r\n if (returnRepresentation) {\r\n ErrorHelper.boolParameterCheck(returnRepresentation, `DynamicsWebApi.${request.functionName}`, \"request.returnRepresentation\");\r\n prefer.push(\"return=representation\");\r\n }\r\n\r\n if (includeAnnotations) {\r\n ErrorHelper.stringParameterCheck(includeAnnotations, `DynamicsWebApi.${request.functionName}`, \"request.includeAnnotations\");\r\n prefer.push(`odata.include-annotations=\"${includeAnnotations}\"`);\r\n }\r\n\r\n if (maxPageSize && maxPageSize > 0) {\r\n ErrorHelper.numberParameterCheck(maxPageSize, `DynamicsWebApi.${request.functionName}`, \"request.maxPageSize\");\r\n prefer.push(\"odata.maxpagesize=\" + maxPageSize);\r\n }\r\n\r\n if (trackChanges) {\r\n ErrorHelper.boolParameterCheck(trackChanges, `DynamicsWebApi.${request.functionName}`, \"request.trackChanges\");\r\n prefer.push(\"odata.track-changes\");\r\n }\r\n\r\n if (continueOnError) {\r\n ErrorHelper.boolParameterCheck(continueOnError, `DynamicsWebApi.${request.functionName}`, \"request.continueOnError\");\r\n prefer.push(\"odata.continue-on-error\");\r\n }\r\n\r\n return prefer.join(\",\");\r\n }\r\n\r\n static convertToBatch(requests: Core.InternalRequest[], config: InternalConfig, batchRequest?: Core.InternalRequest): Core.InternalBatchRequest {\r\n const batchBoundary = `dwa_batch_${Utility.generateUUID()}`;\r\n\r\n const batchBody: string[] = [];\r\n let currentChangeSet: string | null = null;\r\n let contentId = 100000;\r\n\r\n requests.forEach((internalRequest) => {\r\n internalRequest.functionName = \"executeBatch\";\r\n if (batchRequest?.inChangeSet === false) internalRequest.inChangeSet = false;\r\n const inChangeSet = internalRequest.method === \"GET\" ? false : !!internalRequest.inChangeSet;\r\n\r\n if (!inChangeSet && currentChangeSet) {\r\n //end current change set\r\n batchBody.push(`\\n--${currentChangeSet}--`);\r\n\r\n currentChangeSet = null;\r\n contentId = 100000;\r\n }\r\n\r\n if (!currentChangeSet) {\r\n batchBody.push(`\\n--${batchBoundary}`);\r\n\r\n if (inChangeSet) {\r\n currentChangeSet = `changeset_${Utility.generateUUID()}`;\r\n batchBody.push(\"Content-Type: multipart/mixed;boundary=\" + currentChangeSet);\r\n }\r\n }\r\n\r\n if (inChangeSet) {\r\n batchBody.push(`\\n--${currentChangeSet}`);\r\n }\r\n\r\n batchBody.push(\"Content-Type: application/http\");\r\n batchBody.push(\"Content-Transfer-Encoding: binary\");\r\n\r\n if (inChangeSet) {\r\n const contentIdValue = internalRequest.headers!.hasOwnProperty(\"Content-ID\") ? internalRequest.headers![\"Content-ID\"] : ++contentId;\r\n\r\n batchBody.push(`Content-ID: ${contentIdValue}`);\r\n }\r\n\r\n if (!internalRequest.path?.startsWith(\"$\")) {\r\n batchBody.push(`\\n${internalRequest.method} ${config.dataApi.url}${internalRequest.path} HTTP/1.1`);\r\n } else {\r\n batchBody.push(`\\n${internalRequest.method} ${internalRequest.path} HTTP/1.1`);\r\n }\r\n\r\n if (internalRequest.method === \"GET\") {\r\n batchBody.push(\"Accept: application/json\");\r\n } else {\r\n batchBody.push(\"Content-Type: application/json\");\r\n }\r\n\r\n for (let key in internalRequest.headers) {\r\n if (key === \"Authorization\" || key === \"Content-ID\") continue;\r\n\r\n batchBody.push(`${key}: ${internalRequest.headers[key]}`);\r\n }\r\n\r\n if (internalRequest.data) {\r\n batchBody.push(`\\n${RequestUtility.processData(internalRequest.data, config)}`);\r\n }\r\n });\r\n\r\n if (currentChangeSet) {\r\n batchBody.push(`\\n--${currentChangeSet}--`);\r\n }\r\n\r\n batchBody.push(`\\n--${batchBoundary}--`);\r\n\r\n const headers = RequestUtility.setStandardHeaders(batchRequest?.userHeaders);\r\n headers[\"Content-Type\"] = `multipart/mixed;boundary=${batchBoundary}`;\r\n\r\n return { headers: headers, body: batchBody.join(\"\\n\") };\r\n }\r\n\r\n static entityNames: any = null;\r\n\r\n static findCollectionName(entityName: string): string | null {\r\n let collectionName = null;\r\n\r\n if (!Utility.isNull(RequestUtility.entityNames)) {\r\n collectionName = RequestUtility.entityNames[entityName];\r\n if (Utility.isNull(collectionName)) {\r\n for (let key in RequestUtility.entityNames) {\r\n if (RequestUtility.entityNames[key] === entityName) {\r\n return entityName;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return collectionName;\r\n }\r\n\r\n static processData(data: any, config: InternalConfig): string | Uint8Array | Uint16Array | Uint32Array | null {\r\n let stringifiedData: string | null = null;\r\n if (data) {\r\n if (data instanceof Uint8Array || data instanceof Uint16Array || data instanceof Uint32Array) return data;\r\n\r\n stringifiedData = JSON.stringify(data, (key, value) => {\r\n if (key.endsWith(\"@odata.bind\") || key.endsWith(\"@odata.id\")) {\r\n if (typeof value === \"string\" && !value.startsWith(\"$\")) {\r\n //remove brackets in guid\r\n if (/\\(\\{[\\w\\d-]+\\}\\)/g.test(value)) {\r\n value = value.replace(/(.+)\\(\\{([\\w\\d-]+)\\}\\)/g, \"$1($2)\");\r\n }\r\n\r\n if (config.useEntityNames) {\r\n //replace entity name with collection name\r\n const regularExpression = /([\\w_]+)(\\([\\d\\w-]+\\))$/;\r\n const valueParts = regularExpression.exec(value);\r\n if (valueParts && valueParts.length > 2) {\r\n const collectionName = RequestUtility.findCollectionName(valueParts[1]);\r\n\r\n if (!Utility.isNull(collectionName)) {\r\n value = value.replace(regularExpression, collectionName + \"$2\");\r\n }\r\n }\r\n }\r\n\r\n if (!value.startsWith(config.dataApi.url)) {\r\n //add full web api url if it's not set\r\n if (key.endsWith(\"@odata.bind\")) {\r\n if (!value.startsWith(\"/\")) {\r\n value = \"/\" + value;\r\n }\r\n } else {\r\n value = config.dataApi.url + value.replace(/^\\//, \"\");\r\n }\r\n }\r\n }\r\n } else if (key.startsWith(\"oData\") || key.endsWith(\"_Formatted\") || key.endsWith(\"_NavigationProperty\") || key.endsWith(\"_LogicalName\")) {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n });\r\n\r\n stringifiedData = stringifiedData.replace(/[\\u007F-\\uFFFF]/g, function (chr: string) {\r\n return \"\\\\u\" + (\"0000\" + chr.charCodeAt(0).toString(16)).slice(-4);\r\n });\r\n }\r\n\r\n return stringifiedData;\r\n }\r\n\r\n static setStandardHeaders(headers: HeaderCollection = {}): any {\r\n if (!headers[\"Accept\"]) headers[\"Accept\"] = \"application/json\";\r\n if (!headers[\"OData-MaxVersion\"]) headers[\"OData-MaxVersion\"] = \"4.0\";\r\n if (!headers[\"OData-Version\"]) headers[\"OData-Version\"] = \"4.0\";\r\n if (headers[\"Content-Range\"]) headers[\"Content-Type\"] = \"application/octet-stream\";\r\n else if (!headers[\"Content-Type\"]) headers[\"Content-Type\"] = \"application/json; charset=utf-8\";\r\n\r\n return headers;\r\n }\r\n}\r\n", "import { Core } from \"../../types\";\r\n\r\nexport async function executeRequest(options: Core.RequestOptions): Promise {\r\n return global.DWA_BROWSER ? require(\"../xhr\").executeRequest(options) : require(\"../http\").executeRequest(options);\r\n}\r\n"], - "mappings": "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", - "names": ["getCrypto", "generateRandomBytes", "init_Crypto", "__esmMin", "isUuid", "value", "uuid", "extractUuid", "match", "extractUuidFromUrl", "url", "init_Regex", "__esmMin", "downloadChunkSize", "_Utility", "Utility", "init_Utility", "__esmMin", "init_Crypto", "init_Regex", "parameters", "parameterNames", "functionParams", "urlQuery", "i", "parameterName", "value", "isUuid", "extractUuid", "pageCookies", "currentPageNumber", "info", "page", "responseData", "result", "c", "generateRandomBytes", "clientUrl", "obj", "src", "excludeProps", "target", "prop", "request", "fileBuffer", "chunkSize", "offset", "count", "content", "binaryString", "bytes", "throwParameterError", "functionName", "parameterName", "type", "ErrorHelper", "init_ErrorHelper", "__esmMin", "init_Regex", "_ErrorHelper", "req", "parameter", "maxLength", "parsedError", "parameters", "error", "k", "match", "extractUuid", "alternateKeys", "i", "callbackParameter", "isBatch", "_a", "_b", "_DWA", "DWA", "init_dwa", "__esmMin", "annotation", "dateReviver", "key", "value", "a", "init_dateReviver", "__esmMin", "getFormattedKeyValue", "keyName", "value", "newKey", "format", "DWA", "parseData", "object", "parseParams", "Utility", "keys", "i", "currentKey", "j", "formattedKeyValue", "aliasKeys", "parseBatchHeaders", "text", "ctx", "headers", "parts", "line", "pos", "readLine", "responseHeaderRegex", "readTo", "str", "start", "end", "parseBatchResponse", "response", "requestNumber", "delimiter", "batchResponseParts", "result", "batchResponse", "batchToProcess", "httpStatusReg", "httpStatus", "httpStatusMessage", "responseData", "parsedResponse", "dateReviver", "responseHeaders", "ErrorHelper", "plainContentReg", "plainContent", "entityUrl", "guidResult", "extractUuidFromUrl", "base64ToString", "base64", "parseFileResponse", "data", "parseResult", "hasHeader", "getHeader", "name", "parseResponse", "batch", "init_parseResponse", "__esmMin", "init_dwa", "init_Utility", "init_ErrorHelper", "init_dateReviver", "init_Regex", "parseResponseHeaders", "headerStr", "headers", "headerPairs", "i", "ilen", "headerPair", "index", "init_parseResponseHeaders", "__esmMin", "xhr_exports", "__export", "XhrWrapper", "executeRequest", "options", "resolve", "reject", "_executeRequest", "successCallback", "errorCallback", "data", "additionalHeaders", "responseParams", "signal", "ErrorHelper", "request", "key", "abort", "responseHeaders", "parseResponseHeaders", "response", "parseResponse", "error", "headers", "errorParsed", "errorParameters", "init_xhr", "__esmMin", "init_ErrorHelper", "init_parseResponse", "init_parseResponseHeaders", "dynamics_web_api_exports", "__export", "DynamicsWebApi", "init_Utility", "init_ErrorHelper", "getApiUrl", "serverUrl", "apiConfig", "Utility", "mergeApiConfigs", "apiType", "internalConfig", "internalApiConfig", "ErrorHelper", "ConfigurationUtility", "config", "init_Utility", "init_ErrorHelper", "init_Utility", "init_Utility", "init_ErrorHelper", "_RequestUtility", "request", "config", "ErrorHelper", "join", "url", "joinSymbol", "queryArray", "navigationKey", "removeBracketsFromGuidReg", "filterResult", "m", "replacement", "Utility", "expandQueryArray", "i", "expand", "expandConverted", "headers", "prefer", "returnRepresentation", "includeAnnotations", "maxPageSize", "trackChanges", "continueOnError", "item", "requests", "batchRequest", "batchBoundary", "batchBody", "currentChangeSet", "contentId", "internalRequest", "inChangeSet", "contentIdValue", "key", "entityName", "collectionName", "data", "stringifiedData", "value", "regularExpression", "valueParts", "chr", "RequestUtility", "init_ErrorHelper", "executeRequest", "options", "_addResponseParams", "requestId", "responseParams", "_responseParseParams", "_addRequestToBatchCollection", "request", "_batchRequestCollection", "_clearRequestData", "_runRequest", "config", "result", "RequestClient", "error", "_RequestClient", "Utility", "processedData", "isBatchConverted", "batchRequest", "ErrorHelper", "batchResult", "RequestUtility", "token", "url", "executeRequest", "entityName", "i", "collectionName", "DynamicsWebApi", "_DynamicsWebApi", "config", "ConfigurationUtility", "request", "RequestClient", "ErrorHelper", "internalRequest", "Utility", "ifmatch", "error", "field", "fieldValue", "ifnonematch", "fileBytes", "chunkSize", "offset", "response", "bytesDownloaded", "data", "nextPageLink", "records", "pageLink", "result", "replacementString", "_executeFetchXmlAll", "primaryKey", "relatedKey", "getFunctionName", "isObject", "functionName", "parameterName", "functionParameters", "entityName"] + "sourcesContent": ["export function getCrypto(): T {\r\n return global.DWA_BROWSER ? global.window.crypto : require(\"./crypto/node\").getCrypto();\r\n}\r\n\r\nexport function generateRandomBytes() {\r\n return global.DWA_BROWSER ? getCrypto().getRandomValues(new Uint8Array(1)) : getCrypto().randomBytes(1);\r\n}\r\n", "const uuid = \"[0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12}\";\r\n\r\nexport function isUuid(value: string): boolean {\r\n const match = new RegExp(uuid, \"i\").exec(value);\r\n return !!match;\r\n}\r\n\r\nexport function extractUuid(value: string): string | null {\r\n const match = new RegExp(\"^{?(\" + uuid + \")}?$\", \"i\").exec(value);\r\n return match ? match[1] : null;\r\n}\r\n\r\nexport function extractUuidFromUrl(url: string): string | null {\r\n const match = new RegExp(\"(\" + uuid + \")\\\\)$\", \"i\").exec(url);\r\n return match ? match[1] : null;\r\n}\r\n", "\uFEFFimport type * as Core from \"../types\";\r\nimport { generateRandomBytes } from \"../helpers/Crypto\";\r\nimport { isUuid, extractUuid } from \"../helpers/Regex\";\r\n\r\ndeclare var GetGlobalContext: any;\r\ndeclare var Xrm: any;\r\n\r\n// function isNodeEnv(): boolean {\r\n// // tslint:disable:strict-type-predicates\r\n// return Object.prototype.toString.call(typeof process !== \"undefined\" ? process : 0) === \"[object process]\";\r\n// }\r\n\r\n// function getGlobalObject(): T {\r\n// return (isNodeEnv() ? global : typeof window !== \"undefined\" ? window : typeof self !== \"undefined\" ? self : {}) as T;\r\n// }\r\n\r\nconst downloadChunkSize = 4194304;\r\n\r\nexport class Utility {\r\n /**\r\n * Builds parametes for a funciton. Returns '()' (if no parameters) or '([params])?[query]'\r\n *\r\n * @param {Object} [parameters] - Function's input parameters. Example: { param1: \"test\", param2: 3 }.\r\n * @returns {string}\r\n */\r\n static buildFunctionParameters(parameters?: any): Core.FunctionParameters {\r\n if (parameters) {\r\n const parameterNames = Object.keys(parameters);\r\n const functionParams: string[] = [];\r\n const urlQuery: string[] = [];\r\n\r\n for (let i = 1; i <= parameterNames.length; i++) {\r\n const parameterName = parameterNames[i - 1];\r\n let value = parameters[parameterName];\r\n\r\n if (value == null) continue;\r\n\r\n if (typeof value === \"string\" && !value.startsWith(\"Microsoft.Dynamics.CRM\") && !isUuid(value)) {\r\n value = `'${value}'`;\r\n } else if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n\r\n functionParams.push(`${parameterName}=@p${i}`);\r\n urlQuery.push(`@p${i}=${extractUuid(value) || value}`);\r\n }\r\n\r\n return {\r\n key: `(${functionParams.join(\",\")})`,\r\n queryParams: urlQuery,\r\n };\r\n } else {\r\n return {\r\n key: \"()\",\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Parses a paging cookie returned in response\r\n *\r\n * @param {string} pageCookies - Page cookies returned in @Microsoft.Dynamics.CRM.fetchxmlpagingcookie.\r\n * @param {number} currentPageNumber - A current page number. Fix empty paging-cookie for complex fetch xmls.\r\n * @returns {{cookie: \"\", number: 0, next: 1}}\r\n */\r\n static getFetchXmlPagingCookie(pageCookies: string = \"\", currentPageNumber: number = 1): Core.FetchXmlCookie {\r\n //get the page cokies\r\n pageCookies = decodeURIComponent(decodeURIComponent(pageCookies));\r\n\r\n const info = /pagingcookie=\"()/.exec(pageCookies);\r\n\r\n if (info != null) {\r\n let page = parseInt(info[2]);\r\n return {\r\n cookie: info[1]\r\n .replace(//g, \">\")\r\n .replace(/\\\"/g, \"'\")\r\n .replace(/\\'/g, \"&\" + \"quot;\"),\r\n page: page,\r\n nextPage: page + 1,\r\n };\r\n } else {\r\n //http://stackoverflow.com/questions/41262772/execution-of-fetch-xml-using-web-api-dynamics-365 workaround\r\n return {\r\n cookie: \"\",\r\n page: currentPageNumber,\r\n nextPage: currentPageNumber + 1,\r\n };\r\n }\r\n }\r\n\r\n // static isNodeEnv = isNodeEnv;\r\n\r\n static downloadChunkSize = downloadChunkSize;\r\n\r\n /**\r\n * Converts a response to a reference object\r\n *\r\n * @param {Object} responseData - Response object\r\n * @returns {ReferenceObject}\r\n */\r\n static convertToReferenceObject(responseData: any): Core.ReferenceObject {\r\n const result = /\\/(\\w+)\\(([0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12})/i.exec(responseData[\"@odata.id\"]);\r\n return { id: result![2], collection: result![1], oDataContext: responseData[\"@odata.context\"] };\r\n }\r\n\r\n /**\r\n * Checks whether the value is JS Null.\r\n * @param {Object} value\r\n * @returns {boolean}\r\n */\r\n static isNull(value: any): boolean {\r\n return typeof value === \"undefined\" || value == null;\r\n }\r\n\r\n /** Generates UUID */\r\n static generateUUID(): string {\r\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) => (c ^ (generateRandomBytes()[0] & (15 >> (c / 4)))).toString(16));\r\n }\r\n\r\n static getXrmContext(): any {\r\n if (typeof GetGlobalContext !== \"undefined\") {\r\n return GetGlobalContext();\r\n } else {\r\n if (typeof Xrm !== \"undefined\") {\r\n //d365 v.9.0\r\n if (!Utility.isNull(Xrm.Utility) && !Utility.isNull(Xrm.Utility.getGlobalContext)) {\r\n return Xrm.Utility.getGlobalContext();\r\n } else if (!Utility.isNull(Xrm.Page) && !Utility.isNull(Xrm.Page.context)) {\r\n return Xrm.Page.context;\r\n }\r\n }\r\n }\r\n\r\n throw new Error(\r\n \"Xrm Context is not available. In most cases, it can be resolved by adding a reference to a ClientGlobalContext.js.aspx. Please refer to MSDN documentation for more details.\"\r\n );\r\n }\r\n\r\n // static getXrmUtility(): any {\r\n // return typeof Xrm !== \"undefined\" ? Xrm.Utility : null;\r\n // }\r\n\r\n static getClientUrl(): string {\r\n const context = Utility.getXrmContext();\r\n\r\n let clientUrl = context.getClientUrl();\r\n\r\n if (clientUrl.match(/\\/$/)) {\r\n clientUrl = clientUrl.substring(0, clientUrl.length - 1);\r\n }\r\n return clientUrl;\r\n }\r\n\r\n /**\r\n * Checks whether the app is currently running in a Dynamics Portals Environment.\r\n *\r\n * In that case we switch to the Web API for Dynamics Portals.\r\n * @returns {boolean}\r\n */\r\n static isRunningWithinPortals(): boolean {\r\n return global.DWA_BROWSER ? !!global.window.shell : false;\r\n }\r\n\r\n static isObject(obj: any): boolean {\r\n return typeof obj === \"object\" && !!obj && !Array.isArray(obj) && Object.prototype.toString.call(obj) !== \"[object Date]\";\r\n }\r\n\r\n static copyObject(src: any, excludeProps?: string[]): T {\r\n let target = {};\r\n for (let prop in src) {\r\n if (src.hasOwnProperty(prop) && !excludeProps?.includes(prop)) {\r\n // if the value is a nested object, recursively copy all its properties\r\n if (Utility.isObject(src[prop])) {\r\n target[prop] = Utility.copyObject(src[prop]);\r\n } else if (Array.isArray(src[prop])) {\r\n target[prop] = src[prop].slice();\r\n } else {\r\n target[prop] = src[prop];\r\n }\r\n }\r\n }\r\n return target;\r\n }\r\n\r\n static copyRequest(src: any, excludeProps: string[] = []): Core.InternalRequest {\r\n //todo: do we need to include \"data\" in here?\r\n if (!excludeProps.includes(\"signal\")) excludeProps.push(\"signal\");\r\n\r\n const result = Utility.copyObject(src, excludeProps);\r\n result.signal = src.signal;\r\n\r\n return result;\r\n }\r\n\r\n static setFileChunk(request: Core.InternalRequest, fileBuffer: Uint8Array | Buffer, chunkSize: number, offset: number): void {\r\n offset = offset || 0;\r\n\r\n const count = offset + chunkSize > fileBuffer.length ? fileBuffer.length % chunkSize : chunkSize;\r\n\r\n let content: any;\r\n\r\n if (global.DWA_BROWSER) {\r\n content = new Uint8Array(count);\r\n for (let i = 0; i < count; i++) {\r\n content[i] = fileBuffer[offset + i];\r\n }\r\n } else {\r\n content = fileBuffer.slice(offset, offset + count);\r\n }\r\n\r\n request.data = content;\r\n request.contentRange = \"bytes \" + offset + \"-\" + (offset + count - 1) + \"/\" + fileBuffer.length;\r\n }\r\n\r\n static convertToFileBuffer(binaryString: string): Uint8Array | Buffer {\r\n if (!global.DWA_BROWSER) return Buffer.from(binaryString, \"binary\");\r\n\r\n const bytes = new Uint8Array(binaryString.length);\r\n for (var i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n return bytes;\r\n }\r\n}\r\n", "\uFEFFimport { AccessToken } from \"../dynamics-web-api\";\r\nimport { extractUuid } from \"./Regex\";\r\n\r\nexport interface DynamicsWebApiError extends Error {\r\n status: number;\r\n}\r\n\r\nfunction throwParameterError(functionName: string, parameterName: string, type: string | null | undefined): void {\r\n throw new Error(\r\n type ? `${functionName} requires a ${parameterName} parameter to be of type ${type}.` : `${functionName} requires a ${parameterName} parameter.`\r\n );\r\n}\r\n\r\nexport class ErrorHelper {\r\n static handleErrorResponse(req): void {\r\n throw new Error(`Error: ${req.status}: ${req.message}`);\r\n }\r\n\r\n static parameterCheck(parameter: any, functionName: string, parameterName: string, type?: string): void {\r\n if (typeof parameter === \"undefined\" || parameter === null || parameter === \"\") {\r\n throwParameterError(functionName, parameterName, type);\r\n }\r\n }\r\n\r\n static stringParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter !== \"string\") {\r\n throwParameterError(functionName, parameterName, \"String\");\r\n }\r\n }\r\n\r\n static maxLengthStringParameterCheck(parameter: string | null, functionName: string, parameterName: string, maxLength: number): void {\r\n if (!parameter) return;\r\n\r\n if (parameter.length > maxLength) {\r\n throw new Error(`${parameterName} has a ${maxLength} character limit.`);\r\n }\r\n }\r\n\r\n static arrayParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (parameter.constructor !== Array) {\r\n throwParameterError(functionName, parameterName, \"Array\");\r\n }\r\n }\r\n\r\n static stringOrArrayParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (parameter.constructor !== Array && typeof parameter !== \"string\") {\r\n throwParameterError(functionName, parameterName, \"String or Array\");\r\n }\r\n }\r\n\r\n static numberParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter != \"number\") {\r\n if (typeof parameter === \"string\" && parameter) {\r\n if (!isNaN(parseInt(parameter))) {\r\n return;\r\n }\r\n }\r\n throwParameterError(functionName, parameterName, \"Number\");\r\n }\r\n }\r\n\r\n static batchIsEmpty(): Error[] {\r\n return [\r\n new Error(\r\n \"Payload of the batch operation is empty. Please make that you have other operations in between startBatch() and executeBatch() to successfuly build a batch payload.\"\r\n ),\r\n ];\r\n }\r\n\r\n static handleHttpError(parsedError: any, parameters?: any): DynamicsWebApiError {\r\n const error = new Error();\r\n\r\n Object.keys(parsedError).forEach((k) => {\r\n error[k] = parsedError[k];\r\n });\r\n\r\n if (parameters) {\r\n Object.keys(parameters).forEach((k) => {\r\n error[k] = parameters[k];\r\n });\r\n }\r\n\r\n return error;\r\n }\r\n\r\n static boolParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter != \"boolean\") {\r\n throwParameterError(functionName, parameterName, \"Boolean\");\r\n }\r\n }\r\n\r\n /**\r\n * Private function used to check whether required parameter is a valid GUID\r\n * @param parameter The GUID parameter to check\r\n * @param functionName\r\n * @param parameterName\r\n * @returns\r\n */\r\n static guidParameterCheck(parameter: any, functionName: string, parameterName: string): string {\r\n const match = extractUuid(parameter);\r\n if (!match) throwParameterError(functionName, parameterName, \"GUID String\");\r\n\r\n return match!;\r\n }\r\n\r\n static keyParameterCheck(parameter: any, functionName: string, parameterName: string): string | undefined {\r\n try {\r\n ErrorHelper.stringParameterCheck(parameter, functionName, parameterName);\r\n\r\n //check if the param is a guid\r\n const match = extractUuid(parameter);\r\n if (match) return match;\r\n\r\n //check the alternate key\r\n const alternateKeys = parameter.split(\",\");\r\n\r\n if (alternateKeys.length) {\r\n for (let i = 0; i < alternateKeys.length; i++) {\r\n alternateKeys[i] = alternateKeys[i].trim().replace(/\"/g, \"'\");\r\n /^[\\w\\d\\_]+\\=(.+)$/i.exec(alternateKeys[i])![0];\r\n }\r\n }\r\n\r\n return alternateKeys.join(\",\");\r\n } catch (error) {\r\n throwParameterError(functionName, parameterName, \"String representing GUID or Alternate Key\");\r\n }\r\n }\r\n\r\n static callbackParameterCheck(callbackParameter: () => Promise, functionName: string, parameterName: string): void {\r\n if (typeof callbackParameter != \"function\") {\r\n throwParameterError(functionName, parameterName, \"Function\");\r\n }\r\n }\r\n\r\n static throwBatchIncompatible(functionName: string, isBatch: boolean): void {\r\n if (isBatch) {\r\n isBatch = false;\r\n throw new Error(functionName + \" cannot be used in a BATCH request.\");\r\n }\r\n }\r\n\r\n static throwBatchNotStarted(isBatch: boolean): void {\r\n if (!isBatch) {\r\n throw new Error(\r\n \"Batch operation has not been started. Please call a DynamicsWebApi.startBatch() function prior to calling DynamicsWebApi.executeBatch() to perform a batch request correctly.\"\r\n );\r\n }\r\n }\r\n}\r\n", "class DWA {\r\n\tstatic Prefer = class {\r\n\t\tstatic ReturnRepresentation: string = \"return=representation\";\r\n\t\tstatic Annotations = class {\r\n\t\t\tstatic AssociatedNavigationProperty: string = \"Microsoft.Dynamics.CRM.associatednavigationproperty\";\r\n\t\t\tstatic LookupLogicalName: string = \"Microsoft.Dynamics.CRM.lookuplogicalname\";\r\n\t\t\tstatic All: string = \"*\";\r\n\t\t\tstatic FormattedValue: string = \"OData.Community.Display.V1.FormattedValue\";\r\n\t\t\tstatic FetchXmlPagingCookie: string = \"Microsoft.Dynamics.CRM.fetchxmlpagingcookie\";\r\n\t\t};\r\n\t\tstatic IncludeAnnotations: string = \"odata.include-annotations\";\r\n\t\tstatic get(annotation: string) {\r\n\t\t\treturn `${DWA.Prefer.IncludeAnnotations}=\"${annotation}\"`;\r\n\t\t}\r\n\t};\r\n}\r\n\r\nexport { DWA };\r\n", "\uFEFFexport function dateReviver(key: string, value: any): Date {\r\n\tif (typeof value === \"string\") {\r\n\t\tconst a = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:Z|[-+]\\d{2}:\\d{2})$/.exec(value);\r\n\t\tif (a) {\r\n\t\t\treturn new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));\r\n\t\t}\r\n\t}\r\n\treturn value;\r\n}\r\n", "\uFEFFimport { DWA } from \"../../dwa\";\r\nimport { Utility } from \"../../utils/Utility\";\r\nimport { ErrorHelper, DynamicsWebApiError } from \"../../helpers/ErrorHelper\";\r\nimport { dateReviver } from \"./dateReviver\";\r\nimport type * as Core from \"../../types\";\r\nimport { extractUuidFromUrl } from \"../../helpers/Regex\";\r\n\r\nfunction getFormattedKeyValue(keyName: string, value: any): any[] {\r\n let newKey: string | null = null;\r\n if (keyName.indexOf(\"@\") !== -1) {\r\n const format = keyName.split(\"@\");\r\n switch (format[1]) {\r\n case \"odata.context\":\r\n newKey = \"oDataContext\";\r\n break;\r\n case \"odata.count\":\r\n newKey = \"oDataCount\";\r\n value = value != null ? parseInt(value) : 0;\r\n break;\r\n case \"odata.nextLink\":\r\n newKey = \"oDataNextLink\";\r\n break;\r\n case \"odata.deltaLink\":\r\n newKey = \"oDataDeltaLink\";\r\n break;\r\n case DWA.Prefer.Annotations.FormattedValue:\r\n newKey = format[0] + \"_Formatted\";\r\n break;\r\n case DWA.Prefer.Annotations.AssociatedNavigationProperty:\r\n newKey = format[0] + \"_NavigationProperty\";\r\n break;\r\n case DWA.Prefer.Annotations.LookupLogicalName:\r\n newKey = format[0] + \"_LogicalName\";\r\n break;\r\n }\r\n }\r\n\r\n return [newKey, value];\r\n}\r\n\r\n/**\r\n *\r\n * @param {any} object - parsed JSON object\r\n * @param {any} parseParams - parameters for parsing the response\r\n * @returns {any} parsed batch response\r\n */\r\nfunction parseData(object: any, parseParams?: any): any {\r\n if (parseParams) {\r\n if (parseParams.isRef && object[\"@odata.id\"] != null) {\r\n return Utility.convertToReferenceObject(object);\r\n }\r\n\r\n if (parseParams.toCount) {\r\n return getFormattedKeyValue(\"@odata.count\", object[\"@odata.count\"])[1] || 0;\r\n }\r\n }\r\n\r\n const keys = Object.keys(object);\r\n\r\n for (let i = 0; i < keys.length; i++) {\r\n const currentKey = keys[i];\r\n\r\n if (object[currentKey] != null) {\r\n if (object[currentKey].constructor === Array) {\r\n for (var j = 0; j < object[currentKey].length; j++) {\r\n object[currentKey][j] = parseData(object[currentKey][j]);\r\n }\r\n } else if (typeof object[currentKey] === \"object\") {\r\n parseData(object[currentKey]);\r\n }\r\n }\r\n\r\n //parse formatted values\r\n let formattedKeyValue = getFormattedKeyValue(currentKey, object[currentKey]);\r\n if (formattedKeyValue[0]) {\r\n object[formattedKeyValue[0]] = formattedKeyValue[1];\r\n }\r\n\r\n //parse aliased values\r\n if (currentKey.indexOf(\"_x002e_\") !== -1) {\r\n const aliasKeys = currentKey.split(\"_x002e_\");\r\n\r\n if (!object.hasOwnProperty(aliasKeys[0])) {\r\n object[aliasKeys[0]] = { _dwaType: \"alias\" };\r\n }\r\n //throw an error if there is already a property which is not an 'alias'\r\n else if (\r\n typeof object[aliasKeys[0]] !== \"object\" ||\r\n (typeof object[aliasKeys[0]] === \"object\" && !object[aliasKeys[0]].hasOwnProperty(\"_dwaType\"))\r\n ) {\r\n throw new Error(\"The alias name of the linked entity must be unique!\");\r\n }\r\n\r\n object[aliasKeys[0]][aliasKeys[1]] = object[currentKey];\r\n\r\n //aliases also contain formatted values\r\n formattedKeyValue = getFormattedKeyValue(aliasKeys[1], object[currentKey]);\r\n if (formattedKeyValue[0]) {\r\n object[aliasKeys[0]][formattedKeyValue[0]] = formattedKeyValue[1];\r\n }\r\n }\r\n }\r\n\r\n if (parseParams) {\r\n if (parseParams.hasOwnProperty(\"pageNumber\") && object[\"@\" + DWA.Prefer.Annotations.FetchXmlPagingCookie] != null) {\r\n object.PagingInfo = Utility.getFetchXmlPagingCookie(object[\"@\" + DWA.Prefer.Annotations.FetchXmlPagingCookie], parseParams.pageNumber);\r\n }\r\n }\r\n\r\n return object;\r\n}\r\n\r\nconst responseHeaderRegex = /^([^()<>@,;:\\\\\"\\/[\\]?={} \\t]+)\\s?:\\s?(.*)/;\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction parseBatchHeaders(text: string): any {\r\n const ctx = { position: 0 };\r\n const headers = {};\r\n let parts;\r\n let line;\r\n let pos;\r\n\r\n do {\r\n pos = ctx.position;\r\n line = readLine(text, ctx);\r\n parts = responseHeaderRegex.exec(line);\r\n if (parts !== null) {\r\n headers[parts[1].toLowerCase()] = parts[2];\r\n } else {\r\n // Whatever was found is not a header, so reset the context position.\r\n ctx.position = pos;\r\n }\r\n } while (line && parts);\r\n\r\n return headers;\r\n}\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction readLine(text: string, ctx: { position: number }): string | null {\r\n return readTo(text, ctx, \"\\r\\n\");\r\n}\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction readTo(text: string, ctx: { position: number }, str: string): string | null {\r\n const start = ctx.position || 0;\r\n let end = text.length;\r\n if (str) {\r\n end = text.indexOf(str, start);\r\n if (end === -1) {\r\n return null;\r\n }\r\n ctx.position = end + str.length;\r\n } else {\r\n ctx.position = end;\r\n }\r\n\r\n return text.substring(start, end);\r\n}\r\n\r\n//partially taken from https://github.com/emiltholin/google-api-batch-utils\r\n/**\r\n *\r\n * @param {string} response - response that needs to be parsed\r\n * @param {Array} parseParams - parameters for parsing the response\r\n * @param {Number} [requestNumber] - number of the request\r\n * @returns {any} parsed batch response\r\n */\r\nfunction parseBatchResponse(response: string, parseParams: any, requestNumber: number = 0): (string | undefined | DynamicsWebApiError | Number)[] {\r\n // Not the same delimiter in the response as we specify ourselves in the request,\r\n // so we have to extract it.\r\n const delimiter = response.substr(0, response.indexOf(\"\\r\\n\"));\r\n const batchResponseParts = response.split(delimiter);\r\n // The first part will always be an empty string. Just remove it.\r\n batchResponseParts.shift();\r\n // The last part will be the \"--\". Just remove it.\r\n batchResponseParts.pop();\r\n\r\n let result: (string | undefined | DynamicsWebApiError | Number)[] = [];\r\n for (let i = 0; i < batchResponseParts.length; i++) {\r\n let batchResponse = batchResponseParts[i];\r\n if (batchResponse.indexOf(\"--changesetresponse_\") > -1) {\r\n batchResponse = batchResponse.trim();\r\n const batchToProcess = batchResponse.substring(batchResponse.indexOf(\"\\r\\n\") + 1).trim();\r\n\r\n result = result.concat(parseBatchResponse(batchToProcess, parseParams, requestNumber));\r\n } else {\r\n //check http status\r\n const httpStatusReg = /HTTP\\/?\\s*[\\d.]*\\s+(\\d{3})\\s+([\\w\\s]*)$/gm.exec(batchResponse);\r\n //todo: add error handler for httpStatus and httpStatusMessage; remove \"!\" operator\r\n const httpStatus = parseInt(httpStatusReg![1]);\r\n const httpStatusMessage = httpStatusReg![2].trim();\r\n\r\n const responseData = batchResponse.substring(batchResponse.indexOf(\"{\"), batchResponse.lastIndexOf(\"}\") + 1);\r\n\r\n if (!responseData) {\r\n if (/Content-Type: text\\/plain/i.test(batchResponse)) {\r\n const plainContentReg = /\\w+$/gi.exec(batchResponse.trim());\r\n const plainContent = plainContentReg && plainContentReg.length ? plainContentReg[0] : undefined;\r\n\r\n //check if a plain content is a number or not\r\n result.push(isNaN(Number(plainContent)) ? plainContent : Number(plainContent));\r\n } else {\r\n if (parseParams.length && parseParams[requestNumber] && parseParams[requestNumber].hasOwnProperty(\"valueIfEmpty\")) {\r\n result.push(parseParams[requestNumber].valueIfEmpty);\r\n } else {\r\n const entityUrl = /OData-EntityId.+/i.exec(batchResponse);\r\n\r\n if (entityUrl && entityUrl.length) {\r\n const guidResult = extractUuidFromUrl(entityUrl[0]);\r\n result.push(guidResult ? guidResult : undefined);\r\n } else {\r\n result.push(undefined);\r\n }\r\n }\r\n }\r\n } else {\r\n const parsedResponse = parseData(JSON.parse(responseData, dateReviver), parseParams[requestNumber]);\r\n\r\n if (httpStatus >= 400) {\r\n const responseHeaders = parseBatchHeaders(\r\n //todo: add error handler for httpStatusReg; remove \"!\" operator\r\n batchResponse.substring(batchResponse.indexOf(httpStatusReg![0]) + httpStatusReg![0].length + 1, batchResponse.indexOf(\"{\"))\r\n );\r\n\r\n result.push(\r\n ErrorHelper.handleHttpError(parsedResponse, {\r\n status: httpStatus,\r\n statusText: httpStatusMessage,\r\n statusMessage: httpStatusMessage,\r\n headers: responseHeaders,\r\n })\r\n );\r\n } else {\r\n result.push(parsedResponse);\r\n }\r\n }\r\n }\r\n\r\n requestNumber++;\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction base64ToString(base64: string): string {\r\n return global.DWA_BROWSER ? global.window.atob(base64) : Buffer.from(base64, \"base64\").toString(\"binary\");\r\n}\r\n\r\nfunction parseFileResponse(response: any, responseHeaders: any, parseParams: any): Core.FileParseResult {\r\n let data = response;\r\n\r\n if (parseParams.hasOwnProperty(\"parse\")) {\r\n data = JSON.parse(data).value;\r\n data = base64ToString(data);\r\n }\r\n\r\n var parseResult: Core.FileParseResult = {\r\n value: data,\r\n };\r\n\r\n if (responseHeaders[\"x-ms-file-name\"]) parseResult.fileName = responseHeaders[\"x-ms-file-name\"];\r\n\r\n if (responseHeaders[\"x-ms-file-size\"]) parseResult.fileSize = parseInt(responseHeaders[\"x-ms-file-size\"]);\r\n\r\n if (hasHeader(responseHeaders, \"Location\")) parseResult.location = getHeader(responseHeaders, \"Location\");\r\n\r\n return parseResult;\r\n}\r\n\r\nfunction hasHeader(headers: any, name: string): boolean {\r\n return headers.hasOwnProperty(name) || headers.hasOwnProperty(name.toLowerCase());\r\n}\r\n\r\nfunction getHeader(headers: any, name: string): string {\r\n if (headers[name]) return headers[name];\r\n\r\n return headers[name.toLowerCase()];\r\n}\r\n\r\n/**\r\n *\r\n * @param {string} response - response that needs to be parsed\r\n * @param {Array} responseHeaders - response headers\r\n * @param {Array} parseParams - parameters for parsing the response\r\n * @returns {any} parsed response\r\n */\r\nexport function parseResponse(response: string, responseHeaders: any, parseParams: any[]): any {\r\n let parseResult: any = undefined;\r\n if (response.length) {\r\n if (response.indexOf(\"--batchresponse_\") > -1) {\r\n const batch = parseBatchResponse(response, parseParams);\r\n\r\n parseResult = parseParams.length === 1 && parseParams[0].convertedToBatch ? batch[0] : batch;\r\n } else {\r\n if (hasHeader(responseHeaders, \"Content-Disposition\")) {\r\n parseResult = parseFileResponse(response, responseHeaders, parseParams[0]);\r\n } else {\r\n const contentType = getHeader(responseHeaders, \"Content-Type\");\r\n if (contentType.startsWith(\"application/json\")) {\r\n parseResult = parseData(JSON.parse(response, dateReviver), parseParams[0]);\r\n } else {\r\n parseResult = isNaN(Number(response)) ? response : Number(response);\r\n }\r\n }\r\n }\r\n } else {\r\n if (parseParams.length && parseParams[0].hasOwnProperty(\"valueIfEmpty\")) {\r\n parseResult = parseParams[0].valueIfEmpty;\r\n } else if (hasHeader(responseHeaders, \"OData-EntityId\")) {\r\n const entityUrl = getHeader(responseHeaders, \"OData-EntityId\");\r\n\r\n const guidResult = extractUuidFromUrl(entityUrl);\r\n\r\n if (guidResult) {\r\n parseResult = guidResult;\r\n }\r\n } else if (hasHeader(responseHeaders, \"Location\")) {\r\n parseResult = {\r\n location: getHeader(responseHeaders, \"Location\"),\r\n };\r\n\r\n if (responseHeaders[\"x-ms-chunk-size\"]) parseResult.chunkSize = parseInt(responseHeaders[\"x-ms-chunk-size\"]);\r\n }\r\n }\r\n\r\n return parseResult;\r\n}\r\n", "\uFEFFexport function parseResponseHeaders(headerStr: string): any {\r\n\tconst headers = {};\r\n\tif (!headerStr) {\r\n\t\treturn headers;\r\n\t}\r\n\tconst headerPairs = headerStr.split(\"\\u000d\\u000a\");\r\n\tfor (let i = 0, ilen = headerPairs.length; i < ilen; i++) {\r\n\t\tconst headerPair = headerPairs[i];\r\n\t\tconst index = headerPair.indexOf(\"\\u003a\\u0020\");\r\n\t\tif (index > 0) {\r\n\t\t\theaders[headerPair.substring(0, index)] = headerPair.substring(index + 2);\r\n\t\t}\r\n\t}\r\n\treturn headers;\r\n}\r\n", "\uFEFFimport type * as Core from \"../types\";\r\nimport { ErrorHelper } from \"./../helpers/ErrorHelper\";\r\nimport { parseResponse } from \"./helpers/parseResponse\";\r\nimport { parseResponseHeaders } from \"./helpers/parseResponseHeaders\";\r\n\r\nexport function executeRequest(options: Core.RequestOptions): Promise {\r\n return new Promise((resolve, reject) => {\r\n _executeRequest(options, resolve, reject);\r\n });\r\n}\r\n\r\nfunction _executeRequest(\r\n options: Core.RequestOptions,\r\n successCallback: (response: Core.WebApiResponse) => void,\r\n errorCallback: (error: Core.WebApiErrorResponse | Core.WebApiErrorResponse[]) => void\r\n) {\r\n const data = options.data;\r\n const headers = options.headers;\r\n const responseParams = options.responseParams;\r\n const signal = options.abortSignal;\r\n\r\n if (signal?.aborted) {\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n name: \"AbortError\",\r\n code: 20,\r\n message: \"The user aborted a request.\",\r\n })\r\n );\r\n\r\n return;\r\n }\r\n\r\n let request = new XMLHttpRequest();\r\n request.open(options.method, options.uri, options.isAsync || false);\r\n\r\n //set additional headers\r\n for (let key in headers) {\r\n request.setRequestHeader(key, headers[key]);\r\n }\r\n\r\n request.onreadystatechange = function () {\r\n if (request.readyState === 4) {\r\n if (signal) signal.removeEventListener(\"abort\", abort);\r\n\r\n switch (request.status) {\r\n case 200: // Success with content returned in response body.\r\n case 201: // Success with content returned in response body.\r\n case 204: // Success with no content returned in response body.\r\n case 206: // Success with partial content.\r\n case 304: {\r\n // Success with Not Modified\r\n const responseHeaders = parseResponseHeaders(request.getAllResponseHeaders());\r\n const responseData = parseResponse(request.responseText, responseHeaders, responseParams[options.requestId]);\r\n\r\n const response = {\r\n data: responseData,\r\n headers: responseHeaders,\r\n status: request.status,\r\n };\r\n\r\n request = null as any;\r\n\r\n successCallback(response);\r\n break;\r\n }\r\n case 0:\r\n break; //response will be handled by onerror\r\n default:\r\n if (!request) break; //response was handled somewhere else\r\n\r\n // All other statuses are error cases.\r\n let error;\r\n let headers;\r\n try {\r\n headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n const errorParsed = parseResponse(request.responseText, headers, responseParams[options.requestId]);\r\n\r\n if (Array.isArray(errorParsed)) {\r\n errorCallback(errorParsed);\r\n break;\r\n }\r\n\r\n error = errorParsed.error;\r\n } catch (e) {\r\n if (request.response.length > 0) {\r\n error = { message: request.response };\r\n } else {\r\n error = { message: \"Unexpected Error\" };\r\n }\r\n }\r\n\r\n const errorParameters = {\r\n status: request.status,\r\n statusText: request.statusText,\r\n headers: headers,\r\n };\r\n\r\n request = null as any;\r\n\r\n errorCallback(ErrorHelper.handleHttpError(error, errorParameters));\r\n\r\n break;\r\n }\r\n }\r\n };\r\n\r\n if (options.timeout) {\r\n request.timeout = options.timeout;\r\n }\r\n\r\n request.onerror = function () {\r\n const headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n status: request.status,\r\n statusText: request.statusText,\r\n message: request.responseText || \"Network Error\",\r\n headers: headers,\r\n })\r\n );\r\n request = null as any;\r\n };\r\n\r\n request.ontimeout = function () {\r\n const headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n name: \"TimeoutError\",\r\n status: request.status,\r\n statusText: request.statusText,\r\n message: request.responseText || \"Request Timed Out\",\r\n headers: headers,\r\n })\r\n );\r\n request = null as any;\r\n };\r\n\r\n //browser abort\r\n request.onabort = function () {\r\n if (!request) return;\r\n\r\n const headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n status: request.status,\r\n statusText: request.statusText,\r\n message: \"Request aborted\",\r\n headers: headers,\r\n })\r\n );\r\n request = null as any;\r\n };\r\n\r\n //manual abort/cancellation\r\n const abort = () => {\r\n if (!request) return;\r\n\r\n const headers = parseResponseHeaders(request.getAllResponseHeaders());\r\n\r\n errorCallback(\r\n ErrorHelper.handleHttpError({\r\n name: \"AbortError\",\r\n code: 20,\r\n status: request.status,\r\n statusText: request.statusText,\r\n message: \"The user aborted a request.\",\r\n headers: headers,\r\n })\r\n );\r\n\r\n request.abort();\r\n\r\n request = null as any;\r\n };\r\n\r\n if (signal) {\r\n signal.addEventListener(\"abort\", abort);\r\n }\r\n\r\n data ? request.send(data) : request.send();\r\n\r\n //called for testing\r\n if (XhrWrapper.afterSendEvent) XhrWrapper.afterSendEvent();\r\n}\r\n\r\n/**\r\n * Sends a request to given URL with given parameters\r\n */\r\nexport class XhrWrapper {\r\n //for testing\r\n static afterSendEvent: () => void;\r\n}\r\n", "\uFEFFimport { ConfigurationUtility } from \"./utils/Config\";\r\nimport { Utility } from \"./utils/Utility\";\r\nimport { ErrorHelper } from \"./helpers/ErrorHelper\";\r\nimport { RequestClient } from \"./client/RequestClient\";\r\nimport type { InternalRequest, WebApiResponse } from \"./types\";\r\n\r\n/**\r\n * Microsoft Dynamics CRM Web API helper library written in JavaScript.\r\n * It is compatible with: Dynamics 365 (online), Dynamics 365 (on-premise), Dynamics CRM 2016, Dynamics CRM Online.\r\n */\r\nexport class DynamicsWebApi {\r\n private _config = ConfigurationUtility.default();\r\n private _isBatch = false;\r\n private _batchRequestId: string | null = null;\r\n\r\n /**\r\n * Initializes a new instance of DynamicsWebApi\r\n * @param config - Configuration object\r\n */\r\n constructor(config?: Config) {\r\n ConfigurationUtility.merge(this._config, config);\r\n }\r\n\r\n /**\r\n\t * Merges provided configuration properties with an existing one.\r\n\t *\r\n\t * @param {DynamicsWebApi.Config} config - Configuration\r\n\t * @example\r\n\t dynamicsWebApi.setConfig({ serverUrl: 'https://contoso.api.crm.dynamics.com/' });\r\n\t */\r\n setConfig = (config: Config) => ConfigurationUtility.merge(this._config, config);\r\n\r\n private _makeRequest = async (request: InternalRequest): Promise => {\r\n request.isBatch = this._isBatch;\r\n if (this._batchRequestId) request.requestId = this._batchRequestId;\r\n return RequestClient.makeRequest(request, this._config);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a new record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n * @example\r\n *const lead = {\r\n * subject: \"Test WebAPI\",\r\n * firstname: \"Test\",\r\n * lastname: \"WebAPI\",\r\n * jobtitle: \"Title\"\r\n *};\r\n *\r\n *const request = {\r\n * data: lead,\r\n * collection: \"leads\",\r\n * returnRepresentation: true\r\n *}\r\n *\r\n *const response = await dynamicsWebApi.create(request);\r\n *\r\n */\r\n create = async (request: CreateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.create\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"create\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"POST\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n * @example\r\n *const request = {\r\n * key: '7d577253-3ef0-4a0a-bb7f-8335c2596e70',\r\n * collection: \"leads\",\r\n * select: [\"fullname\", \"subject\"],\r\n * ifnonematch: 'W/\"468026\"',\r\n * includeAnnotations: \"OData.Community.Display.V1.FormattedValue\"\r\n *};\r\n *\r\n *const response = await dynamicsWebApi.retrieve(request);\r\n */\r\n retrieve = async (request: RetrieveRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieve\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"retrieve\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"GET\";\r\n internalRequest.responseParameters = {\r\n isRef: internalRequest.select?.length === 1 && internalRequest.select[0].endsWith(\"/$ref\"),\r\n };\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n update = async (request: UpdateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.update\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"update\";\r\n } else internalRequest = request;\r\n\r\n //Metadata definitions, cannot be updated using \"PATCH\" method\r\n if (!internalRequest.method)\r\n internalRequest.method = /EntityDefinitions|RelationshipDefinitions|GlobalOptionSetDefinitions/.test(internalRequest.collection || \"\")\r\n ? \"PUT\"\r\n : \"PATCH\";\r\n\r\n internalRequest.responseParameters = { valueIfEmpty: true };\r\n\r\n if (internalRequest.ifmatch == null) {\r\n internalRequest.ifmatch = \"*\"; //to prevent upsert\r\n }\r\n\r\n //copy locally\r\n const ifmatch = internalRequest.ifmatch;\r\n\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifmatch && error.status === 412) {\r\n //precondition failed - not updated\r\n return false; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a single value in the record.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateSingleProperty = async (request: UpdateSinglePropertyRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateSingleProperty\", \"request\");\r\n ErrorHelper.parameterCheck(request.fieldValuePair, \"DynamicsWebApi.updateSingleProperty\", \"request.fieldValuePair\");\r\n\r\n var field = Object.keys(request.fieldValuePair)[0];\r\n var fieldValue = request.fieldValuePair[field];\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.navigationProperty = field;\r\n internalRequest.data = { value: fieldValue };\r\n internalRequest.functionName = \"updateSingleProperty\";\r\n internalRequest.method = \"PUT\";\r\n\r\n delete internalRequest[\"fieldValuePair\"];\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a record.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteRecord = async (request: DeleteRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteRecord\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"deleteRecord\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.responseParameters = { valueIfEmpty: true };\r\n\r\n //copy locally\r\n const ifmatch = internalRequest.ifmatch;\r\n\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifmatch && error.status === 412) {\r\n //precondition failed - not updated\r\n return false; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to upsert a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n upsert = async (request: UpsertRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.upsert\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"PATCH\";\r\n internalRequest.functionName = \"upsert\";\r\n\r\n //copy locally\r\n const ifnonematch = internalRequest.ifnonematch;\r\n const ifmatch = internalRequest.ifmatch;\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifnonematch && error.status === 412) {\r\n //if prevent update\r\n return null; //todo: check this\r\n } else if (ifmatch && error.status === 404) {\r\n //if prevent create\r\n return null; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n private _uploadFileChunk = async (request: InternalRequest, fileBytes: Uint8Array | Buffer, chunkSize: number, offset: number = 0): Promise => {\r\n // offset = offset || 0;\r\n Utility.setFileChunk(request, fileBytes, chunkSize, offset);\r\n\r\n await this._makeRequest(request);\r\n\r\n offset += chunkSize;\r\n if (offset <= fileBytes.length) {\r\n return this._uploadFileChunk(request, fileBytes, chunkSize, offset);\r\n }\r\n };\r\n\r\n /**\r\n * Upload file to a File Attribute\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n */\r\n uploadFile = async (request: UploadRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.uploadFile\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.uploadFile\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request, [\"data\"]);\r\n internalRequest.method = \"PATCH\";\r\n internalRequest.functionName = \"uploadFile\";\r\n internalRequest.transferMode = \"chunked\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n internalRequest.url = response?.data.location;\r\n delete internalRequest.transferMode;\r\n delete internalRequest.fieldName;\r\n delete internalRequest.fileName;\r\n return this._uploadFileChunk(internalRequest, request.data, response?.data.chunkSize);\r\n };\r\n\r\n private _downloadFileChunk = async (\r\n request: InternalRequest,\r\n bytesDownloaded: number = 0,\r\n // fileSize: number = 0,\r\n data: string = \"\"\r\n ): Promise => {\r\n // bytesDownloaded = bytesDownloaded || 0;\r\n // fileSize = fileSize || 0;\r\n // data = data || \"\";\r\n\r\n request.range = \"bytes=\" + bytesDownloaded + \"-\" + (bytesDownloaded + Utility.downloadChunkSize - 1);\r\n request.downloadSize = \"full\";\r\n\r\n const response = await this._makeRequest(request);\r\n\r\n request.url = response?.data.location;\r\n data += response?.data.value;\r\n\r\n bytesDownloaded += Utility.downloadChunkSize;\r\n\r\n if (bytesDownloaded <= response?.data.fileSize) {\r\n return this._downloadFileChunk(request, bytesDownloaded, data);\r\n }\r\n\r\n return {\r\n fileName: response?.data.fileName,\r\n fileSize: response?.data.fileSize,\r\n data: Utility.convertToFileBuffer(data),\r\n };\r\n };\r\n\r\n /**\r\n * Download a file from a File Attribute\r\n * @param request - An object that represents all possible options for a current request.\r\n */\r\n downloadFile = (request: DownloadRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.downloadFile\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.downloadFile\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"downloadFile\";\r\n internalRequest.responseParameters = { parse: true };\r\n\r\n return this._downloadFileChunk(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve records.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @param {string} [nextPageLink] - Use the value of the @odata.nextLink property with a new GET request to return the next page of data. Pass null to retrieveMultipleOptions.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveMultiple = async (request: RetrieveMultipleRequest, nextPageLink?: string): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveMultiple\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"retrieveMultiple\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"GET\";\r\n\r\n if (nextPageLink) {\r\n ErrorHelper.stringParameterCheck(nextPageLink, \"DynamicsWebApi.retrieveMultiple\", \"nextPageLink\");\r\n internalRequest.url = nextPageLink;\r\n }\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n return response?.data;\r\n };\r\n\r\n private _retrieveAllRequest = async (request: RetrieveMultipleRequest, nextPageLink?: string, records: any[] = []): Promise> => {\r\n const response = await this.retrieveMultiple(request, nextPageLink);\r\n records = records.concat(response.value);\r\n\r\n const pageLink = response.oDataNextLink;\r\n\r\n if (pageLink) {\r\n return this._retrieveAllRequest(request, pageLink, records);\r\n }\r\n\r\n const result: AllResponse = { value: records };\r\n\r\n if (response.oDataDeltaLink) {\r\n result[\"@odata.deltaLink\"] = response.oDataDeltaLink;\r\n result.oDataDeltaLink = response.oDataDeltaLink;\r\n }\r\n\r\n return result;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve all records.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAll = (request: RetrieveMultipleRequest): Promise> => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.retrieveAll\", this._isBatch);\r\n return this._retrieveAllRequest(request);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to count records. IMPORTANT! The count value does not represent the total number of entities in the system. It is limited by the maximum number of entities that can be returned. Returns: Number\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n count = async (request: CountRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.count\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"count\";\r\n\r\n if (internalRequest.filter?.length) {\r\n internalRequest.count = true;\r\n } else {\r\n internalRequest.navigationProperty = \"$count\";\r\n }\r\n\r\n internalRequest.responseParameters = { toCount: internalRequest.count };\r\n\r\n //if filter has not been specified then simplify the request\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to count records. Returns: Number\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n countAll = async (request: CountAllRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.countAll\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.countAll\", \"request\");\r\n\r\n const response = await this._retrieveAllRequest(request);\r\n\r\n return response ? (response.value ? response.value.length : 0) : 0;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to execute FetchXml to retrieve records. Returns: DWA.Types.FetchXmlResponse\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n fetch = async (request: FetchXmlRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.fetch\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"fetch\";\r\n\r\n ErrorHelper.stringParameterCheck(internalRequest.fetchXml, \"DynamicsWebApi.fetch\", \"request.fetchXml\");\r\n\r\n //only add paging if there is no top\r\n if (internalRequest.fetchXml && !/^(request: FetchAllRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.fetchAll\", \"request\");\r\n\r\n const _executeFetchXmlAll = async (request: FetchXmlRequest, records: any[] = []): Promise> => {\r\n // records = records || [];\r\n\r\n const response = await this.fetch(request);\r\n\r\n records = records.concat(response.value);\r\n\r\n if (response.PagingInfo) {\r\n request.pageNumber = response.PagingInfo.nextPage;\r\n request.pagingCookie = response.PagingInfo.cookie;\r\n\r\n return _executeFetchXmlAll(request, records);\r\n }\r\n\r\n return { value: records };\r\n };\r\n\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.fetchAll\", this._isBatch);\r\n return _executeFetchXmlAll(request);\r\n };\r\n\r\n /**\r\n * Associate for a collection-valued navigation property. (1:N or N:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n associate = async (request: AssociateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.associate\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"associate\";\r\n\r\n ErrorHelper.stringParameterCheck(request.relatedCollection, \"DynamicsWebApi.associate\", \"request.relatedcollection\");\r\n ErrorHelper.stringParameterCheck(request.relationshipName, \"DynamicsWebApi.associate\", \"request.relationshipName\");\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.associate\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.associate\", \"request.relatedKey\");\r\n\r\n internalRequest.navigationProperty = request.relationshipName + \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n internalRequest.data = { \"@odata.id\": `${request.relatedCollection}(${relatedKey})` };\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Disassociate for a collection-valued navigation property.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n disassociate = async (request: DisassociateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.disassociate\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.functionName = \"disassociate\";\r\n\r\n ErrorHelper.stringParameterCheck(request.relationshipName, \"DynamicsWebApi.disassociate\", \"request.relationshipName\");\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.disassociate\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.disassociate\", \"request.relatedId\");\r\n\r\n internalRequest.key = primaryKey;\r\n internalRequest.navigationProperty = `${request.relationshipName}(${relatedKey})/$ref`;\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Associate for a single-valued navigation property. (1:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n associateSingleValued = async (request: AssociateSingleValuedRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.associateSingleValued\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"PUT\";\r\n internalRequest.functionName = \"associateSingleValued\";\r\n\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.associateSingleValued\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.associateSingleValued\", \"request.relatedKey\");\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, \"DynamicsWebApi.associateSingleValued\", \"request.navigationProperty\");\r\n ErrorHelper.stringParameterCheck(request.relatedCollection, \"DynamicsWebApi.associateSingleValued\", \"request.relatedcollection\");\r\n\r\n internalRequest.navigationProperty += \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n internalRequest.data = { \"@odata.id\": `${request.relatedCollection}(${relatedKey})` };\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Removes a reference to an entity for a single-valued navigation property. (1:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n disassociateSingleValued = async (request: DisassociateSingleValuedRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.disassociateSingleValued\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.functionName = \"disassociateSingleValued\";\r\n\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.disassociateSingleValued\", \"request.primaryKey\");\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, \"DynamicsWebApi.disassociateSingleValued\", \"request.navigationProperty\");\r\n\r\n internalRequest.navigationProperty += \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Calls a Web API function\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n callFunction: CallFunction = async (request: string | BoundFunctionRequest | UnboundFunctionRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.callFunction`, \"request\");\r\n\r\n const getFunctionName = (request: BoundFunctionRequest | UnboundFunctionRequest) => request.name || request.functionName;\r\n\r\n const isObject = typeof request !== \"string\";\r\n const functionName = isObject ? getFunctionName(request) : request;\r\n const parameterName = isObject ? \"request.name\" : \"name\";\r\n const internalRequest: InternalRequest = isObject ? Utility.copyObject(request, [\"name\"]) : { functionName: functionName };\r\n\r\n ErrorHelper.stringParameterCheck(functionName, `DynamicsWebApi.callFunction`, parameterName);\r\n\r\n const functionParameters = Utility.buildFunctionParameters(internalRequest.parameters);\r\n\r\n internalRequest.method = \"GET\";\r\n internalRequest.addPath = functionName + functionParameters.key;\r\n internalRequest.queryParams = functionParameters.queryParams;\r\n internalRequest._isUnboundRequest = !internalRequest.collection;\r\n internalRequest.functionName = \"callFunction\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Calls a Web API action\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n callAction: CallAction = async (\r\n request: BoundActionRequest | UnboundActionRequest\r\n ): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.callAction`, \"request\");\r\n ErrorHelper.stringParameterCheck(request.actionName, `DynamicsWebApi.callAction`, \"request.actionName\");\r\n\r\n const internalRequest = Utility.copyRequest(request, [\"action\"]);\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"callAction\";\r\n\r\n internalRequest.addPath = request.actionName;\r\n internalRequest._isUnboundRequest = !internalRequest.collection;\r\n internalRequest.data = request.action;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n /**\r\n * Sends an asynchronous request to create an entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createEntity = (request: CreateEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.createEntity`, \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createEntity\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"createEntity\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update an entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateEntity = (request: UpdateEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateEntity\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateEntity\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateEntity\", \"request.data.MetadataId\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.key = internalRequest.data.MetadataId;\r\n internalRequest.functionName = \"updateEntity\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveEntity = (request: RetrieveEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveEntity\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.retrieveEntity\", \"request.key\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntity\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve entity definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveEntities = (request?: RetrieveEntitiesRequest): Promise> => {\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntities\";\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create an attribute.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createAttribute = (request: CreateAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createAttribute\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createAttribute\", \"request.data\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.createAttribute\", \"request.entityKey\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntity\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.key = request.entityKey;\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update an attribute.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateAttribute = (request: UpdateAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateAttribute\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateAttribute\", \"request.data\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.updateAttribute\", \"request.entityKey\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateAttribute\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateAttribute\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.navigationPropertyKey = request.data.MetadataId;\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"updateAttribute\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve attribute metadata for a specified entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAttributes = (request: RetrieveAttributesRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveAttributes\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.retrieveAttributes\", \"request.entityKey\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveAttributes\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"retrieveAttributes\";\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific attribute metadata for a specified entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAttribute = (request: RetrieveAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveAttributes\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.retrieveAttribute\", \"request.entityKey\");\r\n ErrorHelper.keyParameterCheck(request.attributeKey, \"DynamicsWebApi.retrieveAttribute\", \"request.attributeKey\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveAttribute\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.navigationPropertyKey = request.attributeKey;\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"retrieveAttribute\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createRelationship = (request: CreateRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createRelationship\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createRelationship\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"createRelationship\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateRelationship = (request: UpdateRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateRelationship\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateRelationship\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateRelationship\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateRelationship\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.key = request.data.MetadataId;\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"updateRelationship\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteRelationship = (request: DeleteRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteRelationship\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.deleteRelationship\", \"request.key\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"deleteRelationship\";\r\n\r\n return this.deleteRecord(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve relationship definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveRelationships = (request?: RetrieveRelationshipsRequest): Promise> => {\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"retrieveRelationships\";\r\n\r\n if (request) {\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveRelationships\", \"request.castType\");\r\n internalRequest.navigationProperty = request.castType;\r\n }\r\n }\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveRelationship = (request: RetrieveRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveRelationship\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.retrieveRelationship\", \"request.key\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveRelationship\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"retrieveRelationship\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a Global Option Set definition\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createGlobalOptionSet = (request: CreateGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createGlobalOptionSet\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createGlobalOptionSet\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"createGlobalOptionSet\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a Global Option Set.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateGlobalOptionSet = (request: UpdateGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateGlobalOptionSet\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.key = request.data.MetadataId;\r\n internalRequest.functionName = \"updateGlobalOptionSet\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a Global Option Set.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteGlobalOptionSet = (request: DeleteGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteGlobalOptionSet\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"deleteGlobalOptionSet\";\r\n\r\n return this.deleteRecord(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve Global Option Set definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveGlobalOptionSet = (request: RetrieveGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveGlobalOptionSet\", \"request\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveGlobalOptionSet\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"retrieveGlobalOptionSet\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve Global Option Set definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveGlobalOptionSets = (request?: RetrieveGlobalOptionSetsRequest): Promise> => {\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"retrieveGlobalOptionSets\";\r\n\r\n if (request?.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveGlobalOptionSets\", \"request.castType\");\r\n internalRequest.navigationProperty = request.castType;\r\n }\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Retrieves a CSDL Document Metadata\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} A raw CSDL $metadata document.\r\n */\r\n retrieveCsdlMetadata = async (request?: CsdlMetadataRequest): Promise => {\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"$metadata\";\r\n internalRequest.functionName = \"retrieveCsdlMetadata\";\r\n\r\n if (request?.addAnnotations) {\r\n ErrorHelper.boolParameterCheck(request.addAnnotations, \"DynamicsWebApi.retrieveCsdlMetadata\", \"request.addAnnotations\");\r\n internalRequest.includeAnnotations = \"*\";\r\n }\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides a search results page.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Search result\r\n */\r\n search: SearchFunction = async (request: string | SearchRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.search\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.search\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.search\", parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.search\", parameterName, 100);\r\n\r\n internalRequest.collection = \"query\";\r\n internalRequest.functionName = \"search\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Suggestions result\r\n */\r\n suggest: SuggestFunction = async (request: string | SuggestRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.suggest\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.suggest\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.suggest\", parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.suggest\", parameterName, 100);\r\n\r\n internalRequest.functionName = internalRequest.collection = \"suggest\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n autocomplete: AutocompleteFunction = async (request: string | AutocompleteRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.autocomplete\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n if (isObject) ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.autocomplete\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, `DynamicsWebApi.autocomplete`, parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.autocomplete\", parameterName, 100);\r\n\r\n internalRequest.functionName = internalRequest.collection = \"autocomplete\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Starts/executes a batch request.\r\n */\r\n startBatch = (): void => {\r\n this._isBatch = true;\r\n this._batchRequestId = Utility.generateUUID();\r\n };\r\n\r\n /**\r\n * Executes a batch request. Please call DynamicsWebApi.startBatch() first to start a batch request.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n executeBatch = async (request?: BatchRequest): Promise => {\r\n ErrorHelper.throwBatchNotStarted(this._isBatch);\r\n\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"$batch\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"executeBatch\";\r\n internalRequest.requestId = this._batchRequestId;\r\n\r\n this._batchRequestId = null;\r\n this._isBatch = false;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Creates a new instance of DynamicsWebApi. If config is not provided, it is copied from a current instance.\r\n *\r\n * @param {Config} config configuration object.\r\n * @returns {DynamicsWebApi} A new instance of DynamicsWebApi\r\n */\r\n initializeInstance = (config?: Config): DynamicsWebApi => new DynamicsWebApi(config || this._config);\r\n\r\n Utility = {\r\n /**\r\n * Searches for a collection name by provided entity name in a cached entity metadata.\r\n * The returned collection name can be null.\r\n *\r\n * @param {string} entityName entity name\r\n * @returns {string | null} collection name\r\n */\r\n getCollectionName: (entityName: string): string | null => RequestClient.getCollectionName(entityName),\r\n };\r\n}\r\n\r\nexport interface Expand {\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**Limit the number of results returned by using the $top system query option.Do not use $top with $count! */\r\n top?: number;\r\n /**An Array(of Strings) representing the order in which items are returned using the $orderby system query option.Use the asc or desc suffix to specify ascending or descending order respectively.The default is ascending if the suffix isn't applied. */\r\n orderBy?: string[];\r\n /**A name of a single-valued navigation property which needs to be expanded. */\r\n property?: string;\r\n /**An Array of Expand Objects representing the $expand Query Option value to control which related records need to be returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface BaseRequest {\r\n /**XHR requests only! Indicates whether the requests should be made synchronously or asynchronously.Default value is 'true'(asynchronously). */\r\n async?: boolean;\r\n /**Impersonates a user based on their systemuserid by adding \"MSCRMCallerID\" header. A String representing the GUID value for the Dynamics 365 systemuserid. */\r\n impersonate?: string;\r\n /**Impersonates a user based on their Azure Active Directory (AAD) object id by passing that value along with the header \"CallerObjectId\". A String should represent a GUID value. */\r\n impersonateAAD?: string;\r\n /**If set to 'true', DynamicsWebApi adds a request header 'Cache-Control: no-cache'.Default value is 'false'. */\r\n noCache?: boolean;\r\n /** Authorization Token. If set, onTokenRefresh will not be called. */\r\n token?: string;\r\n /**Sets a number of milliseconds before a request times out. */\r\n timeout?: number;\r\n /**The AbortSignal interface represents a signal object that allows you to communicate with a DOM request and abort it if required via an AbortController object. */\r\n signal?: AbortSignal;\r\n /**Indicates if an operation must be included in a Change Set or not. Works in Batch Operations only. By default, it's \"true\", except for GET operations - they are not allowed in Change Sets. */\r\n inChangeSet?: boolean;\r\n /**Headers to supply with a request. These headers will override configuraiton headers if the identical ones were set. */\r\n headers?: HeaderCollection;\r\n /**Custom query parameters. Can be used to set parameter aliases for \"$filter\" and \"$orderBy\". Important! These parameters ARE NOT URI encoded! */\r\n queryParams?: string[];\r\n}\r\n\r\nexport interface BatchRequest extends BaseRequest {\r\n /** Sets Prefer header to \"odata.continue-on-error\" that allows more requests be processed when errors occur. The batch request will return '200 OK' and individual response errors will be returned in the batch response body. */\r\n continueOnError?: boolean;\r\n}\r\n\r\nexport interface Request extends BaseRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection?: string;\r\n}\r\n\r\nexport interface CRUDRequest extends Request {\r\n /**A String representing collection record's Primary Key (GUID) or Alternate Key(s). */\r\n key?: string;\r\n}\r\n\r\nexport interface CountRequest extends Request {\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n}\r\n\r\nexport interface CountAllRequest extends CountRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**An Array (of strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n}\r\n\r\nexport interface FetchAllRequest extends Request {\r\n /**Sets FetchXML - a proprietary query language that provides capabilities to perform aggregation. */\r\n fetchXml: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation. Annotations provide additional information about lookups, options sets and other complex attribute types. For example: * or Microsoft.Dynamics.CRM.fetchxmlpagingcookie */\r\n includeAnnotations?: string;\r\n}\r\n\r\nexport interface FetchXmlRequest extends FetchAllRequest {\r\n /**Page number. */\r\n pageNumber?: number;\r\n /**Paging cookie. To retrive the first page, pagingCookie must be null. */\r\n pagingCookie?: string;\r\n}\r\n\r\nexport interface CreateRequest extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Web API v9+ only! Boolean that enables duplicate detection. */\r\n duplicateDetection?: boolean;\r\n /**A JavaScript object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data?: T;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface UpdateRequestBase extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Web API v9+ only! Boolean that enables duplicate detection. */\r\n duplicateDetection?: boolean;\r\n /**A JavaScript object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data?: T;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**Casts the AttributeMetadata to a specific type. (Used in requests to Attribute Metadata). */\r\n metadataAttributeType?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface UpdateRequest extends UpdateRequestBase {\r\n /**If set to 'true', DynamicsWebApi adds a request header 'MSCRM.MergeLabels: true'. Default value is 'false' */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface UpdateSinglePropertyRequest extends CRUDRequest {\r\n /**Object with a logical name of the field as a key and a value to update with. Example: {subject: \"Update Record\"} */\r\n fieldValuePair: { [key: string]: any };\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n}\r\n\r\nexport interface UpsertRequest extends UpdateRequestBase {\r\n /**Sets If-None-Match header value that enables to use conditional retrieval in applicable requests. */\r\n ifnonematch?: string;\r\n}\r\n\r\nexport interface DeleteRequest extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**Field name that needs to be cleared (for example File Field) */\r\n fieldName?: string;\r\n}\r\n\r\nexport interface RetrieveRequest extends CRUDRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets If-None-Match header value that enables to use conditional retrieval in applicable requests. */\r\n ifnonematch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Casts the AttributeMetadata to a specific type. (Used in requests to Attribute Metadata). */\r\n metadataAttributeType?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**A String representing the GUID value of the saved query. */\r\n savedQuery?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**A String representing the GUID value of the user query. */\r\n userQuery?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface RetrieveMultipleRequest extends Request {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**Use the $apply to aggregate and group your data dynamically */\r\n apply?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Boolean that sets the $count system query option with a value of true to include a count of entities that match the filter criteria up to 5000(per page).Do not use $top with $count! */\r\n count?: boolean;\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets the odata.maxpagesize preference value to request the number of entities returned in the response. */\r\n maxPageSize?: number;\r\n /**An Array(of string) representing the order in which items are returned using the $orderby system query option.Use the asc or desc suffix to specify ascending or descending order respectively.The default is ascending if the suffix isn't applied. */\r\n orderBy?: string[];\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Limit the number of results returned by using the $top system query option.Do not use $top with $count! */\r\n top?: number;\r\n /**Sets Prefer header with value 'odata.track-changes' to request that a delta link be returned which can subsequently be used to retrieve entity changes. */\r\n trackChanges?: boolean;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface AssociateRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Relationship name. */\r\n relationshipName: string;\r\n /**Related name of the Entity Collection or Entity Logical name. */\r\n relatedCollection: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface AssociateSingleValuedRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Navigation property name. */\r\n navigationProperty: string;\r\n /**Related name of the Entity Collection or Entity Logical name. */\r\n relatedCollection: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface DisassociateRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Relationship name. */\r\n relationshipName: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface DisassociateSingleValuedRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Navigation property name. */\r\n navigationProperty: string;\r\n}\r\n\r\nexport interface UnboundFunctionRequest extends BaseRequest {\r\n /**\r\n * Name of the function.\r\n */\r\n name?: string;\r\n /**\r\n * Name of the function. \r\n * @deprecated Use \"name\" parameter.\r\n */\r\n functionName?: string;\r\n /**Function's input parameters. Example: { param1: \"test\", param2: 3 }. */\r\n parameters?: any;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n}\r\n\r\nexport interface BoundFunctionRequest extends UnboundFunctionRequest, Request {\r\n /**A String representing the GUID value for the record. */\r\n key?: string;\r\n}\r\n\r\nexport interface UnboundActionRequest extends BaseRequest {\r\n /**A name of the Web API action. */\r\n actionName: string;\r\n /**An object that represents a Dynamics 365 action. */\r\n action?: TAction;\r\n}\r\n\r\nexport interface BoundActionRequest extends UnboundActionRequest, Request {\r\n /**A String representing the GUID value for the record. */\r\n key?: string;\r\n}\r\n\r\nexport interface CreateEntityRequest extends BaseRequest {\r\n /**An object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateEntityRequest extends CRUDRequest {\r\n /**An object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data: any;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface RetrieveEntityRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveEntitiesRequest extends BaseRequest {\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateAttributeRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Attribute metadata object. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateAttributeRequest extends CreateAttributeRequest {\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface RetrieveAttributesRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveAttributeRequest extends BaseRequest {\r\n /**An Attribute MetadataId or Alternate Key (such as LogicalName). */\r\n attributeKey: string;\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateRelationshipRequest extends BaseRequest {\r\n /**Relationship Definition. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateRelationshipRequest extends CreateRelationshipRequest {\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface DeleteRelationshipRequest extends BaseRequest {\r\n /**A Relationship MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n}\r\n\r\nexport interface RetrieveRelationshipsRequest extends BaseRequest {\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveRelationshipRequest extends BaseRequest {\r\n /**A Relationship MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateGlobalOptionSetRequest extends BaseRequest {\r\n /**Global Option Set Definition. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateGlobalOptionSetRequest extends CreateRelationshipRequest {\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface DeleteGlobalOptionSetRequest extends BaseRequest {\r\n /**A Global Option Set MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n}\r\n\r\nexport interface RetrieveGlobalOptionSetsRequest extends BaseRequest {\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveGlobalOptionSetRequest extends BaseRequest {\r\n /**A Global Option Set MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface UploadRequest extends CRUDRequest {\r\n /**Binary Buffer*/\r\n data: Uint8Array | Buffer;\r\n /**Name of the file */\r\n fileName: string;\r\n /**File Field Name */\r\n fieldName: string;\r\n}\r\n\r\nexport interface DownloadRequest extends CRUDRequest {\r\n /**File Field Name */\r\n fieldName: string;\r\n}\r\n\r\nexport interface CsdlMetadataRequest extends BaseRequest {\r\n /**If set to \"true\" the document will include many different kinds of annotations that can be useful. Most annotations are not included by default because they increase the total size of the document. */\r\n addAnnotations?: boolean;\r\n}\r\n\r\nexport type SearchMode = \"any\" | \"all\";\r\nexport type SearchType = \"simple\" | \"full\";\r\n\r\nexport interface SearchQueryBase {\r\n /**The search parameter value contains the term to be searched for and has a 100-character limit. For suggestions, min 3 characters in addition. */\r\n search: string;\r\n /**The default table list searches across all Dataverse search\u2013configured tables and columns. The default list is configured by your administrator when Dataverse search is enabled. */\r\n entities?: string[];\r\n /**Filters are applied while searching data and are specified in standard OData syntax. */\r\n filter?: string;\r\n}\r\n\r\nexport interface Search extends SearchQueryBase {\r\n /**Facets support the ability to drill down into data results after they've been retrieved. */\r\n facets?: string[];\r\n /**Specify true to return the total record count; otherwise false. The default is false. */\r\n returnTotalRecordCount?: boolean;\r\n /**Specifies the number of search results to skip. */\r\n skip?: number;\r\n /**Specifies the number of search results to retrieve. The default is 50, and the maximum value is 100. */\r\n top?: number;\r\n /**A list of comma-separated clauses where each clause consists of a column name followed by 'asc' (ascending, which is the default) or 'desc' (descending). This list specifies how to order the results in order of precedence. */\r\n orderBy?: string[];\r\n /**Specifies whether any or all the search terms must be matched to count the document as a match. The default is 'any'. */\r\n searchMode?: SearchMode;\r\n /**The search type specifies the syntax of a search query. Using 'simple' selects simple query syntax and 'full' selects Lucene query syntax. The default is 'simple'. */\r\n searchType?: SearchType;\r\n}\r\n\r\nexport interface Suggest extends SearchQueryBase {\r\n /**Use fuzzy search to aid with misspellings. The default is false. */\r\n useFuzzy?: boolean;\r\n /**Number of suggestions to retrieve. The default is 5. */\r\n top?: number;\r\n /**A list of comma-separated clauses where each clause consists of a column name followed by 'asc' (ascending, which is the default) or 'desc' (descending). This list specifies how to order the results in order of precedence. */\r\n orderBy?: string[];\r\n}\r\n\r\nexport interface Autocomplete extends SearchQueryBase {\r\n /**Use fuzzy search to aid with misspellings. The default is false. */\r\n useFuzzy?: boolean;\r\n}\r\n\r\nexport interface SearchRequest extends BaseRequest {\r\n /**Search query object */\r\n query: Search;\r\n}\r\n\r\nexport interface SuggestRequest extends BaseRequest {\r\n /**Suggestion query object */\r\n query: Suggest;\r\n}\r\n\r\nexport interface AutocompleteRequest extends BaseRequest {\r\n /**Autocomplete query object */\r\n query: Autocomplete;\r\n}\r\n\r\nexport interface ApiConfig {\r\n /** API Version to use, for example: \"9.2\" or \"1.0\" */\r\n version?: string;\r\n /** API Path, for example: \"data\" or \"search\" */\r\n path?: string;\r\n}\r\n\r\nexport interface AccessToken {\r\n /** Access Token */\r\n accessToken: string;\r\n}\r\n\r\nexport interface Config {\r\n /**The url to Dataverse API server, for example: https://contoso.api.crm.dynamics.com/. It is required when used in Node.js application. */\r\n serverUrl?: string | null;\r\n /**Impersonates a user based on their systemuserid by adding \"MSCRMCallerID\" header. A String representing the GUID value for the Dynamics 365 systemuserid. */\r\n impersonate?: string | null;\r\n /**Impersonates a user based on their Azure Active Directory (AAD) object id by passing that value along with the header \"CallerObjectId\". A String should represent a GUID value. */\r\n impersonateAAD?: string | null;\r\n /**A function that is called when a security token needs to be refreshed. */\r\n onTokenRefresh?: (() => Promise) | null;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types.*/\r\n includeAnnotations?: string | null;\r\n /**Sets the odata.maxpagesize preference value to request the number of entities returned in the response. */\r\n maxPageSize?: number | null;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request.*/\r\n returnRepresentation?: boolean | null;\r\n /**Indicates whether to use Entity Logical Names instead of Collection Logical Names.*/\r\n useEntityNames?: boolean | null;\r\n /**Sets a number of milliseconds before a request times out. */\r\n timeout?: number | null;\r\n /**Proxy configuration object. */\r\n proxy?: ProxyConfig | null;\r\n /**Configuration object for Dataverse Web API (with path \"data\"). */\r\n dataApi?: ApiConfig;\r\n /**Configuration object for Dataverse Search API (with path \"search\"). */\r\n searchApi?: ApiConfig;\r\n /**Default headers to supply with each request. */\r\n headers?: HeaderCollection;\r\n}\r\n\r\n/**Header collection type */\r\nexport type HeaderCollection = Record;\r\n\r\nexport interface ProxyConfig {\r\n /**Proxy server url */\r\n url: string;\r\n /**Basic authentication credentials */\r\n auth?: {\r\n /**Username */\r\n username: string;\r\n /**Password */\r\n password: string;\r\n };\r\n}\r\n\r\n/** Callback with an acquired token called by DynamicsWebApi; \"token\" argument can be a string or an object with a property {accessToken: } */\r\n// export interface OnTokenAcquiredCallback {\r\n// (token: any): void;\r\n// }\r\n\r\nexport interface RequestError extends Error {\r\n /**The name of the error */\r\n name: string;\r\n /**This code is not related to the http status code and is frequently empty */\r\n code?: string;\r\n /**A message describing the error */\r\n message: string;\r\n /**HTTP status code */\r\n status?: number;\r\n /**HTTP status text. Frequently empty */\r\n statusText?: string;\r\n /**HTTP Response headers */\r\n headers?: any;\r\n /**Details about an error */\r\n innererror?: {\r\n /**A message describing the error, this is frequently the same as the outer message */\r\n message?: string;\r\n /**Microsoft.Crm.CrmHttpException */\r\n type?: string;\r\n /**Details from the server about where the error occurred */\r\n stacktrace?: string;\r\n };\r\n}\r\n\r\nexport interface MultipleResponse {\r\n /**Multiple respone entities */\r\n value: T[];\r\n oDataCount?: number;\r\n \"@odata.count\"?: number;\r\n oDataContext?: string;\r\n \"@odata.context\"?: number;\r\n}\r\n\r\nexport interface AllResponse extends MultipleResponse {\r\n /**@odata.deltaLink value */\r\n oDataDeltaLink?: string;\r\n}\r\n\r\nexport interface RetrieveMultipleResponse extends MultipleResponse {\r\n \"@Microsoft.Dynamics.CRM.totalrecordcount\"?: number;\r\n \"@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded\"?: boolean;\r\n /**@odata.nextLink value */\r\n oDataNextLink?: string;\r\n /**@odata.deltaLink value */\r\n oDataDeltaLink?: string;\r\n \"@odata.deltaLink\"?: string;\r\n \"@odata.nextLink\"?: string;\r\n}\r\n\r\nexport interface FetchXmlResponse extends MultipleResponse {\r\n \"@Microsoft.Dynamics.CRM.totalrecordcount\"?: number;\r\n \"@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded\"?: boolean;\r\n /**Paging information */\r\n PagingInfo?: {\r\n /**Number of the next page */\r\n nextPage?: number;\r\n /**Next page cookie */\r\n cookie?: string;\r\n };\r\n}\r\n\r\nexport interface DownloadResponse {\r\n /**The name of the file */\r\n fileName: string;\r\n /**File size */\r\n fileSize: number;\r\n /**File Data */\r\n data: Uint8Array | Buffer;\r\n}\r\n\r\nexport interface SearchResponse {\r\n /**Search results*/\r\n value: TValue[];\r\n facets: any | null;\r\n totalrecordcount: number;\r\n querycontext: any | null;\r\n}\r\n\r\nexport interface SuggestResponseValue {\r\n text: string;\r\n document: TDocument;\r\n}\r\n\r\nexport interface SuggestResponse {\r\n /**Suggestions*/\r\n value: SuggestResponseValue[];\r\n querycontext: any | null;\r\n}\r\n\r\nexport interface AutocompleteResponse {\r\n /**Autocomplete result*/\r\n value: string | null;\r\n querycontext: any | null;\r\n}\r\n\r\n//function overloads\r\n\r\ntype CallFunction = {\r\n /**\r\n * Calls a Web API function\r\n *\r\n * @param name - The name of a function.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (name: string): Promise;\r\n /**\r\n * Calls a bound Web API function\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundFunctionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API function (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundFunctionRequest): Promise;\r\n};\r\n\r\ntype CallAction = {\r\n /**\r\n * Calls a bound Web API action (bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {T} Type of the value in a response\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundActionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API action (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {T} Type of the value in a response\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundActionRequest): Promise;\r\n /**\r\n * Calls a bound Web API action (bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {TResponse} Type of the value in a response\r\n * @type {TAction} Type of an action object\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundActionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API action (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {TResponse} Type of the value in a response\r\n * @type {TAction} Type of an action object\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundActionRequest): Promise;\r\n};\r\n\r\ntype SearchFunction = {\r\n /**\r\n * Provides a search results page.\r\n * @param term - The term to be searched for and has a max 100-character limit.\r\n * @returns {Promise} Search result\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides a search results page.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Search result\r\n */\r\n (request: SearchRequest): Promise>;\r\n};\r\n\r\ntype SuggestFunction = {\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param term - The term to be searched for and has min 3 characters to a max 100-character limit.\r\n * @returns {Promise} Suggestions result\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Suggestions result\r\n */\r\n (request: SuggestRequest): Promise>;\r\n};\r\n\r\ntype AutocompleteFunction = {\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param term - The term to be searched for and has a 100-character limit.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n (request: AutocompleteRequest): Promise;\r\n};\r\n", "import { Utility } from \"./Utility\";\r\nimport { ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { ApiConfig, Config } from \"../dynamics-web-api\";\r\n\r\ntype ApiType = \"dataApi\" | \"searchApi\";\r\n\r\nexport interface InternalApiConfig extends ApiConfig {\r\n url: string;\r\n}\r\n\r\nexport interface InternalConfig extends Config {\r\n dataApi: InternalApiConfig;\r\n searchApi: InternalApiConfig;\r\n}\r\n\r\nconst getApiUrl = (serverUrl: string | undefined | null, apiConfig: ApiConfig): string => {\r\n if (Utility.isRunningWithinPortals()) {\r\n return new URL(\"_api\", global.window.location.origin).toString() + \"/\";\r\n } else {\r\n if (!serverUrl) serverUrl = Utility.getClientUrl();\r\n return new URL(`api/${apiConfig.path}/v${apiConfig.version}`, serverUrl).toString() + \"/\";\r\n }\r\n};\r\n\r\nconst mergeApiConfigs = (apiConfig: ApiConfig | undefined, apiType: ApiType, internalConfig: InternalConfig): void => {\r\n const internalApiConfig = internalConfig[apiType] as InternalApiConfig;\r\n\r\n if (apiConfig?.version) {\r\n ErrorHelper.stringParameterCheck(apiConfig.version, \"DynamicsWebApi.setConfig\", `config.${apiType}.version`);\r\n internalApiConfig.version = apiConfig.version;\r\n }\r\n\r\n if (apiConfig?.path) {\r\n ErrorHelper.stringParameterCheck(apiConfig.path, \"DynamicsWebApi.setConfig\", `config.${apiType}.path`);\r\n internalApiConfig.path = apiConfig.path;\r\n }\r\n\r\n internalApiConfig.url = getApiUrl(internalConfig.serverUrl, internalApiConfig);\r\n};\r\n\r\nexport class ConfigurationUtility {\r\n static mergeApiConfigs = mergeApiConfigs;\r\n\r\n static merge(internalConfig: InternalConfig, config?: Config): void {\r\n if (config?.serverUrl) {\r\n ErrorHelper.stringParameterCheck(config.serverUrl, \"DynamicsWebApi.setConfig\", \"config.serverUrl\");\r\n internalConfig.serverUrl = config.serverUrl;\r\n }\r\n\r\n mergeApiConfigs(config?.dataApi, \"dataApi\", internalConfig);\r\n mergeApiConfigs(config?.searchApi, \"searchApi\", internalConfig);\r\n\r\n if (config?.impersonate) {\r\n internalConfig.impersonate = ErrorHelper.guidParameterCheck(config.impersonate, \"DynamicsWebApi.setConfig\", \"config.impersonate\");\r\n }\r\n\r\n if (config?.impersonateAAD) {\r\n internalConfig.impersonateAAD = ErrorHelper.guidParameterCheck(config.impersonateAAD, \"DynamicsWebApi.setConfig\", \"config.impersonateAAD\");\r\n }\r\n\r\n if (config?.onTokenRefresh) {\r\n ErrorHelper.callbackParameterCheck(config.onTokenRefresh, \"DynamicsWebApi.setConfig\", \"config.onTokenRefresh\");\r\n internalConfig.onTokenRefresh = config.onTokenRefresh;\r\n }\r\n\r\n if (config?.includeAnnotations) {\r\n ErrorHelper.stringParameterCheck(config.includeAnnotations, \"DynamicsWebApi.setConfig\", \"config.includeAnnotations\");\r\n internalConfig.includeAnnotations = config.includeAnnotations;\r\n }\r\n\r\n if (config?.timeout) {\r\n ErrorHelper.numberParameterCheck(config.timeout, \"DynamicsWebApi.setConfig\", \"config.timeout\");\r\n internalConfig.timeout = config.timeout;\r\n }\r\n\r\n if (config?.maxPageSize) {\r\n ErrorHelper.numberParameterCheck(config.maxPageSize, \"DynamicsWebApi.setConfig\", \"config.maxPageSize\");\r\n internalConfig.maxPageSize = config.maxPageSize;\r\n }\r\n\r\n if (config?.returnRepresentation) {\r\n ErrorHelper.boolParameterCheck(config.returnRepresentation, \"DynamicsWebApi.setConfig\", \"config.returnRepresentation\");\r\n internalConfig.returnRepresentation = config.returnRepresentation;\r\n }\r\n\r\n if (config?.useEntityNames) {\r\n ErrorHelper.boolParameterCheck(config.useEntityNames, \"DynamicsWebApi.setConfig\", \"config.useEntityNames\");\r\n internalConfig.useEntityNames = config.useEntityNames;\r\n }\r\n\r\n if (config?.headers) {\r\n internalConfig.headers = config.headers;\r\n }\r\n\r\n if (!global.DWA_BROWSER && config?.proxy) {\r\n ErrorHelper.parameterCheck(config.proxy, \"DynamicsWebApi.setConfig\", \"config.proxy\");\r\n\r\n if (config.proxy.url) {\r\n ErrorHelper.stringParameterCheck(config.proxy.url, \"DynamicsWebApi.setConfig\", \"config.proxy.url\");\r\n\r\n if (config.proxy.auth) {\r\n ErrorHelper.parameterCheck(config.proxy.auth, \"DynamicsWebApi.setConfig\", \"config.proxy.auth\");\r\n ErrorHelper.stringParameterCheck(config.proxy.auth.username, \"DynamicsWebApi.setConfig\", \"config.proxy.auth.username\");\r\n ErrorHelper.stringParameterCheck(config.proxy.auth.password, \"DynamicsWebApi.setConfig\", \"config.proxy.auth.password\");\r\n }\r\n }\r\n\r\n internalConfig.proxy = config.proxy;\r\n }\r\n }\r\n\r\n static default(): InternalConfig {\r\n return {\r\n serverUrl: null,\r\n impersonate: null,\r\n impersonateAAD: null,\r\n onTokenRefresh: null,\r\n includeAnnotations: null,\r\n maxPageSize: null,\r\n returnRepresentation: null,\r\n proxy: null,\r\n dataApi: {\r\n path: \"data\",\r\n version: \"9.2\",\r\n url: \"\"\r\n },\r\n searchApi: {\r\n path: \"search\",\r\n version: \"1.0\",\r\n url: \"\"\r\n },\r\n };\r\n }\r\n}\r\n", "import type * as Core from \"../types\";\r\nimport { Utility } from \"../utils/Utility\";\r\nimport { InternalConfig } from \"../utils/Config\";\r\nimport * as RequestUtility from \"../utils/Request\";\r\nimport { DynamicsWebApiError, ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { executeRequest } from \"./helpers/executeRequest\";\r\nimport { AccessToken } from \"../dynamics-web-api\";\r\n\r\nconst _addResponseParams = (requestId: string, responseParams: Record) => {\r\n if (_responseParseParams[requestId]) _responseParseParams[requestId].push(responseParams);\r\n else _responseParseParams[requestId] = [responseParams];\r\n};\r\n\r\nconst _addRequestToBatchCollection = (requestId: string, request: Core.InternalRequest) => {\r\n if (_batchRequestCollection[requestId]) _batchRequestCollection[requestId].push(request);\r\n else _batchRequestCollection[requestId] = [request];\r\n};\r\n\r\nconst _clearRequestData = (requestId: string): void => {\r\n delete _responseParseParams[requestId];\r\n if (_batchRequestCollection.hasOwnProperty(requestId)) delete _batchRequestCollection[requestId];\r\n};\r\n\r\nconst _runRequest = async (request: Core.InternalRequest, config: InternalConfig): Promise => {\r\n try {\r\n const result = await RequestClient.sendRequest(request, config);\r\n _clearRequestData(request.requestId!);\r\n\r\n return result;\r\n } catch (error) {\r\n _clearRequestData(request.requestId!);\r\n throw error;\r\n } finally {\r\n _clearRequestData(request.requestId!);\r\n }\r\n};\r\n\r\nlet _batchRequestCollection: Core.BatchRequestCollection = {};\r\nlet _responseParseParams: { [key: string]: any[] } = {};\r\n\r\nconst _nameExceptions = [\r\n \"$metadata\",\r\n \"EntityDefinitions\",\r\n \"RelationshipDefinitions\",\r\n \"GlobalOptionSetDefinitions\",\r\n \"ManagedPropertyDefinitions\",\r\n \"query\",\r\n \"suggest\",\r\n \"autocomplete\",\r\n];\r\n\r\nconst _isEntityNameException = (entityName: string): boolean => {\r\n return _nameExceptions.indexOf(entityName) > -1;\r\n};\r\n\r\nconst _getCollectionNames = async (entityName: string, config: InternalConfig): Promise => {\r\n if (!Utility.isNull(RequestUtility.entityNames)) {\r\n return RequestUtility.findCollectionName(entityName) || entityName;\r\n }\r\n\r\n const request = RequestUtility.compose(\r\n {\r\n method: \"GET\",\r\n collection: \"EntityDefinitions\",\r\n select: [\"EntitySetName\", \"LogicalName\"],\r\n noCache: true,\r\n functionName: \"retrieveMultiple\",\r\n },\r\n config\r\n );\r\n\r\n const result = await _runRequest(request, config);\r\n RequestUtility.setEntityNames({});\r\n for (let i = 0; i < result.data.value.length; i++) {\r\n RequestUtility.entityNames![result.data.value[i].LogicalName] = result.data.value[i].EntitySetName;\r\n }\r\n\r\n return RequestUtility.findCollectionName(entityName) || entityName;\r\n};\r\n\r\nconst _checkCollectionName = async (entityName: string | null | undefined, config: InternalConfig): Promise => {\r\n if (!entityName || _isEntityNameException(entityName)) {\r\n return entityName;\r\n }\r\n\r\n entityName = entityName.toLowerCase();\r\n\r\n if (!config.useEntityNames) {\r\n return entityName;\r\n }\r\n\r\n try {\r\n return await _getCollectionNames(entityName, config);\r\n } catch (error: any) {\r\n throw new Error(\"Unable to fetch Collection Names. Error: \" + (error as DynamicsWebApiError).message);\r\n }\r\n};\r\n\r\nexport class RequestClient {\r\n /**\r\n * Sends a request to given URL with given parameters\r\n *\r\n * @param {InternalRequest} request - Composed request to D365 Web Api\r\n * @param {InternalConfig} config - DynamicsWebApi config.\r\n */\r\n static async sendRequest(request: Core.InternalRequest, config: InternalConfig): Promise {\r\n request.headers = request.headers || {};\r\n request.responseParameters = request.responseParameters || {};\r\n request.requestId = request.requestId || Utility.generateUUID();\r\n\r\n //add response parameters to parse\r\n _addResponseParams(request.requestId, request.responseParameters);\r\n\r\n //stringify passed data\r\n let processedData = null;\r\n\r\n const isBatchConverted = request.responseParameters?.convertedToBatch;\r\n\r\n if (request.path === \"$batch\" && !isBatchConverted) {\r\n const batchRequest = _batchRequestCollection[request.requestId];\r\n\r\n if (!batchRequest) throw ErrorHelper.batchIsEmpty();\r\n\r\n const batchResult = RequestUtility.convertToBatch(batchRequest, config, request);\r\n\r\n processedData = batchResult.body;\r\n request.headers = { ...batchResult.headers, ...request.headers };\r\n\r\n //clear an array of requests\r\n delete _batchRequestCollection[request.requestId];\r\n } else {\r\n processedData = !isBatchConverted ? RequestUtility.processData(request.data, config) : request.data;\r\n\r\n if (!isBatchConverted) request.headers = RequestUtility.setStandardHeaders(request.headers);\r\n }\r\n\r\n if (config.impersonate && !request.headers![\"MSCRMCallerID\"]) {\r\n request.headers![\"MSCRMCallerID\"] = config.impersonate;\r\n }\r\n\r\n if (config.impersonateAAD && !request.headers![\"CallerObjectId\"]) {\r\n request.headers![\"CallerObjectId\"] = config.impersonateAAD;\r\n }\r\n\r\n let token: AccessToken | string | null = null;\r\n\r\n //call a token refresh callback only if it is set and there is no \"Authorization\" header set yet\r\n if (config.onTokenRefresh && (!request.headers || (request.headers && !request.headers[\"Authorization\"]))) {\r\n token = await config.onTokenRefresh();\r\n if (!token) throw new Error(\"Token is empty. Request is aborted.\");\r\n }\r\n\r\n if (token) {\r\n request.headers![\"Authorization\"] = \"Bearer \" + (token.hasOwnProperty(\"accessToken\") ? (token as AccessToken).accessToken : token);\r\n }\r\n\r\n if (Utility.isRunningWithinPortals()) {\r\n request.headers![\"__RequestVerificationToken\"] = await global.window.shell!.getTokenDeferred();\r\n }\r\n\r\n const url = request.apiConfig ? request.apiConfig.url : config.dataApi.url;\r\n\r\n return await executeRequest({\r\n method: request.method!,\r\n uri: url!.toString() + request.path,\r\n data: processedData,\r\n proxy: config.proxy,\r\n isAsync: request.async,\r\n headers: request.headers!,\r\n requestId: request.requestId!,\r\n abortSignal: request.signal,\r\n responseParams: _responseParseParams,\r\n timeout: request.timeout || config.timeout,\r\n });\r\n }\r\n\r\n static async makeRequest(request: Core.InternalRequest, config: InternalConfig): Promise {\r\n request.responseParameters = request.responseParameters || {};\r\n //we don't want to mix headers set by the library and by the user\r\n request.userHeaders = request.headers;\r\n delete request.headers;\r\n\r\n if (!request.isBatch) {\r\n const collectionName = await _checkCollectionName(request.collection, config);\r\n\r\n request.collection = collectionName;\r\n RequestUtility.compose(request, config);\r\n request.responseParameters.convertedToBatch = false;\r\n\r\n //the URL contains more characters than max possible limit, convert the request to a batch request\r\n if (request.path!.length > 2000) {\r\n const batchRequest = RequestUtility.convertToBatch([request], config);\r\n\r\n //#175 authorization header must be copied as well. \r\n //todo: is it the only one that needs to be copied?\r\n if (request.headers![\"Authorization\"]) {\r\n batchRequest.headers[\"Authorization\"] = request.headers![\"Authorization\"];\r\n }\r\n\r\n request.method = \"POST\";\r\n request.path = \"$batch\";\r\n request.data = batchRequest.body;\r\n request.headers = { ...batchRequest.headers, ...request.userHeaders };\r\n request.responseParameters.convertedToBatch = true;\r\n }\r\n\r\n return _runRequest(request, config);\r\n }\r\n\r\n //no need to make a request to web api if it's a part of batch\r\n RequestUtility.compose(request, config);\r\n //add response parameters to parse\r\n _addResponseParams(request.requestId!, request.responseParameters);\r\n _addRequestToBatchCollection(request.requestId!, request);\r\n }\r\n\r\n static _clearTestData(): void {\r\n RequestUtility.setEntityNames(null);\r\n _responseParseParams = {};\r\n _batchRequestCollection = {};\r\n }\r\n\r\n static getCollectionName(entityName: string): string | null {\r\n return RequestUtility.findCollectionName(entityName);\r\n }\r\n}\r\n", "import type { InternalRequest, InternalBatchRequest } from \"../types\";\r\n\r\nimport { Utility } from \"./Utility\";\r\nimport { Config, HeaderCollection } from \"../dynamics-web-api\";\r\nimport { ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { InternalConfig } from \"./Config\";\r\n\r\nexport let entityNames: Record | null = null;\r\n\r\nexport const setEntityNames = (newEntityNames: Record | null) => {\r\n entityNames = newEntityNames;\r\n};\r\n\r\n/**\r\n * Converts a request object to URL link\r\n * @param request Internal request object\r\n * @param config Internal configuration object\r\n * @returns Modified internal request object\r\n */\r\nexport const compose = (request: InternalRequest, config: InternalConfig): InternalRequest => {\r\n request.path = request.path || \"\";\r\n request.functionName = request.functionName || \"\";\r\n if (!request.url) {\r\n if (!request._isUnboundRequest && !request.contentId && !request.collection) {\r\n ErrorHelper.parameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, \"request.collection\");\r\n }\r\n if (request.collection != null) {\r\n ErrorHelper.stringParameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, \"request.collection\");\r\n request.path = request.collection;\r\n\r\n //add alternate key feature\r\n if (request.key) {\r\n request.key = ErrorHelper.keyParameterCheck(request.key, `DynamicsWebApi.${request.functionName}`, \"request.key\");\r\n request.path += `(${request.key})`;\r\n }\r\n }\r\n\r\n if (request.contentId) {\r\n ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, \"request.contentId\");\r\n if (request.contentId.startsWith(\"$\")) {\r\n request.path = request.path ? `${request.contentId}/${request.path}` : request.contentId;\r\n }\r\n }\r\n\r\n if (request.addPath) {\r\n if (request.path) {\r\n request.path += \"/\";\r\n }\r\n request.path += request.addPath;\r\n }\r\n\r\n request.path = composeUrl(request, config, request.path);\r\n\r\n if (request.fetchXml) {\r\n ErrorHelper.stringParameterCheck(request.fetchXml, `DynamicsWebApi.${request.functionName}`, \"request.fetchXml\");\r\n let join = request.path.indexOf(\"?\") === -1 ? \"?\" : \"&\";\r\n request.path += `${join}fetchXml=${encodeURIComponent(request.fetchXml)}`;\r\n }\r\n } else {\r\n ErrorHelper.stringParameterCheck(request.url, `DynamicsWebApi.${request.functionName}`, \"request.url\");\r\n request.path = request.url.replace(config.dataApi.url, \"\");\r\n }\r\n\r\n if (request.hasOwnProperty(\"async\") && request.async != null) {\r\n ErrorHelper.boolParameterCheck(request.async, `DynamicsWebApi.${request.functionName}`, \"request.async\");\r\n } else {\r\n request.async = true;\r\n }\r\n\r\n request.headers = composeHeaders(request, config);\r\n\r\n return request;\r\n};\r\n\r\n/**\r\n * Converts optional parameters of the request to URL. If expand parameter exists this function is called recursively.\r\n * @param request Internal request object\r\n * @param config Internal configuration object\r\n * @param url Starting url\r\n * @param joinSymbol Join symbol. \"&\" by default and \";\" inside an expand query parameter\r\n * @returns Request URL\r\n */\r\nexport const composeUrl = (request: InternalRequest, config: Config, url: string = \"\", joinSymbol: \"&\" | \";\" = \"&\"): string => {\r\n const queryArray: string[] = [];\r\n\r\n if (request) {\r\n if (request.navigationProperty) {\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, `DynamicsWebApi.${request.functionName}`, \"request.navigationProperty\");\r\n url += \"/\" + request.navigationProperty;\r\n\r\n if (request.navigationPropertyKey) {\r\n let navigationKey = ErrorHelper.keyParameterCheck(\r\n request.navigationPropertyKey,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.navigationPropertyKey\"\r\n );\r\n url += \"(\" + navigationKey + \")\";\r\n }\r\n\r\n if (request.navigationProperty === \"Attributes\") {\r\n if (request.metadataAttributeType) {\r\n ErrorHelper.stringParameterCheck(request.metadataAttributeType, `DynamicsWebApi.${request.functionName}`, \"request.metadataAttributeType\");\r\n url += \"/\" + request.metadataAttributeType;\r\n }\r\n }\r\n }\r\n\r\n if (request.select?.length) {\r\n ErrorHelper.arrayParameterCheck(request.select, `DynamicsWebApi.${request.functionName}`, \"request.select\");\r\n\r\n if (request.functionName == \"retrieve\" && request.select.length == 1 && request.select[0].endsWith(\"/$ref\")) {\r\n url += \"/\" + request.select[0];\r\n } else {\r\n if (request.select[0].startsWith(\"/\") && request.functionName == \"retrieve\") {\r\n if (request.navigationProperty == null) {\r\n url += request.select.shift();\r\n } else {\r\n request.select.shift();\r\n }\r\n }\r\n\r\n //check if anything left in the array\r\n if (request.select.length) {\r\n queryArray.push(\"$select=\" + request.select.join(\",\"));\r\n }\r\n }\r\n }\r\n\r\n if (request.filter) {\r\n ErrorHelper.stringParameterCheck(request.filter, `DynamicsWebApi.${request.functionName}`, \"request.filter\");\r\n const removeBracketsFromGuidReg = /[^\"']{([\\w\\d]{8}[-]?(?:[\\w\\d]{4}[-]?){3}[\\w\\d]{12})}(?:[^\"']|$)/g;\r\n let filterResult = request.filter;\r\n\r\n //fix bug 2018-06-11\r\n let m: RegExpExecArray | null = null;\r\n while ((m = removeBracketsFromGuidReg.exec(filterResult)) !== null) {\r\n if (m.index === removeBracketsFromGuidReg.lastIndex) {\r\n removeBracketsFromGuidReg.lastIndex++;\r\n }\r\n\r\n let replacement = m[0].endsWith(\")\") ? \")\" : \" \";\r\n filterResult = filterResult.replace(m[0], \" \" + m[1] + replacement);\r\n }\r\n\r\n queryArray.push(\"$filter=\" + encodeURIComponent(filterResult));\r\n }\r\n\r\n if (request.fieldName) {\r\n ErrorHelper.stringParameterCheck(request.fieldName, `DynamicsWebApi.${request.functionName}`, \"request.fieldName\");\r\n url += \"/\" + request.fieldName;\r\n }\r\n\r\n if (request.savedQuery) {\r\n queryArray.push(\"savedQuery=\" + ErrorHelper.guidParameterCheck(request.savedQuery, `DynamicsWebApi.${request.functionName}`, \"request.savedQuery\"));\r\n }\r\n\r\n if (request.userQuery) {\r\n queryArray.push(\"userQuery=\" + ErrorHelper.guidParameterCheck(request.userQuery, `DynamicsWebApi.${request.functionName}`, \"request.userQuery\"));\r\n }\r\n\r\n if (request.apply) {\r\n ErrorHelper.stringParameterCheck(request.apply, `DynamicsWebApi.${request.functionName}`, \"request.apply\");\r\n queryArray.push(\"$apply=\" + request.apply);\r\n }\r\n\r\n if (request.count) {\r\n ErrorHelper.boolParameterCheck(request.count, `DynamicsWebApi.${request.functionName}`, \"request.count\");\r\n queryArray.push(\"$count=\" + request.count);\r\n }\r\n\r\n if (request.top && request.top > 0) {\r\n ErrorHelper.numberParameterCheck(request.top, `DynamicsWebApi.${request.functionName}`, \"request.top\");\r\n queryArray.push(\"$top=\" + request.top);\r\n }\r\n\r\n if (request.orderBy != null && request.orderBy.length) {\r\n ErrorHelper.arrayParameterCheck(request.orderBy, `DynamicsWebApi.${request.functionName}`, \"request.orderBy\");\r\n queryArray.push(\"$orderby=\" + request.orderBy.join(\",\"));\r\n }\r\n\r\n if (request.partitionId) {\r\n ErrorHelper.stringParameterCheck(request.partitionId, `DynamicsWebApi.${request.functionName}`, \"request.partitionId\");\r\n queryArray.push(\"partitionid='\" + request.partitionId + \"'\");\r\n }\r\n\r\n if (request.downloadSize) {\r\n ErrorHelper.stringParameterCheck(request.downloadSize, `DynamicsWebApi.${request.functionName}`, \"request.downloadSize\");\r\n queryArray.push(\"size=\" + request.downloadSize);\r\n }\r\n\r\n if (request.queryParams?.length) {\r\n ErrorHelper.arrayParameterCheck(request.queryParams, `DynamicsWebApi.${request.functionName}`, \"request.queryParams\");\r\n queryArray.push(request.queryParams.join(\"&\"));\r\n }\r\n\r\n if (request.fileName) {\r\n ErrorHelper.stringParameterCheck(request.fileName, `DynamicsWebApi.${request.functionName}`, \"request.fileName\");\r\n queryArray.push(\"x-ms-file-name=\" + request.fileName);\r\n }\r\n\r\n if (request.data) {\r\n ErrorHelper.parameterCheck(request.data, `DynamicsWebApi.${request.functionName}`, \"request.data\");\r\n }\r\n\r\n if (request.isBatch) {\r\n ErrorHelper.boolParameterCheck(request.isBatch, `DynamicsWebApi.${request.functionName}`, \"request.isBatch\");\r\n }\r\n\r\n if (!Utility.isNull(request.inChangeSet)) {\r\n ErrorHelper.boolParameterCheck(request.inChangeSet, `DynamicsWebApi.${request.functionName}`, \"request.inChangeSet\");\r\n }\r\n\r\n if (request.isBatch && Utility.isNull(request.inChangeSet)) request.inChangeSet = true;\r\n\r\n if (request.timeout) {\r\n ErrorHelper.numberParameterCheck(request.timeout, `DynamicsWebApi.${request.functionName}`, \"request.timeout\");\r\n }\r\n\r\n if (request.expand?.length) {\r\n ErrorHelper.stringOrArrayParameterCheck(request.expand, `DynamicsWebApi.${request.functionName}`, \"request.expand\");\r\n if (typeof request.expand === \"string\") {\r\n queryArray.push(\"$expand=\" + request.expand);\r\n } else {\r\n const expandQueryArray: string[] = [];\r\n for (let i = 0; i < request.expand.length; i++) {\r\n if (request.expand[i].property) {\r\n const expand = request.expand[i];\r\n expand.functionName = `${request.functionName} $expand`;\r\n let expandConverted = composeUrl(expand, config, \"\", \";\");\r\n if (expandConverted) {\r\n expandConverted = `(${expandConverted.substr(1)})`;\r\n }\r\n expandQueryArray.push(request.expand[i].property + expandConverted);\r\n }\r\n }\r\n if (expandQueryArray.length) {\r\n queryArray.push(\"$expand=\" + expandQueryArray.join(\",\"));\r\n }\r\n }\r\n }\r\n }\r\n\r\n return !queryArray.length ? url : url + \"?\" + queryArray.join(joinSymbol);\r\n};\r\n\r\nexport const composeHeaders = (request: InternalRequest, config: Config): HeaderCollection => {\r\n const headers: HeaderCollection = { ...config.headers, ...request.userHeaders };\r\n\r\n const prefer = composePreferHeader(request, config);\r\n if (prefer.length) {\r\n headers[\"Prefer\"] = prefer;\r\n }\r\n\r\n if (request.collection === \"$metadata\") {\r\n headers[\"Accept\"] = \"application/xml\";\r\n }\r\n\r\n if (request.transferMode) {\r\n headers[\"x-ms-transfer-mode\"] = request.transferMode;\r\n }\r\n\r\n if (request.ifmatch != null && request.ifnonematch != null) {\r\n throw new Error(\r\n `DynamicsWebApi.${request.functionName}. Either one of request.ifmatch or request.ifnonematch parameters should be used in a call, not both.`\r\n );\r\n }\r\n\r\n if (request.ifmatch) {\r\n ErrorHelper.stringParameterCheck(request.ifmatch, `DynamicsWebApi.${request.functionName}`, \"request.ifmatch\");\r\n headers[\"If-Match\"] = request.ifmatch;\r\n }\r\n\r\n if (request.ifnonematch) {\r\n ErrorHelper.stringParameterCheck(request.ifnonematch, `DynamicsWebApi.${request.functionName}`, \"request.ifnonematch\");\r\n headers[\"If-None-Match\"] = request.ifnonematch;\r\n }\r\n\r\n if (request.impersonate) {\r\n ErrorHelper.stringParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, \"request.impersonate\");\r\n headers[\"MSCRMCallerID\"] = ErrorHelper.guidParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, \"request.impersonate\");\r\n }\r\n\r\n if (request.impersonateAAD) {\r\n ErrorHelper.stringParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, \"request.impersonateAAD\");\r\n headers[\"CallerObjectId\"] = ErrorHelper.guidParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, \"request.impersonateAAD\");\r\n }\r\n\r\n if (request.token) {\r\n ErrorHelper.stringParameterCheck(request.token, `DynamicsWebApi.${request.functionName}`, \"request.token\");\r\n headers[\"Authorization\"] = \"Bearer \" + request.token;\r\n }\r\n\r\n if (request.duplicateDetection) {\r\n ErrorHelper.boolParameterCheck(request.duplicateDetection, `DynamicsWebApi.${request.functionName}`, \"request.duplicateDetection\");\r\n headers[\"MSCRM.SuppressDuplicateDetection\"] = \"false\";\r\n }\r\n\r\n if (request.bypassCustomPluginExecution) {\r\n ErrorHelper.boolParameterCheck(request.bypassCustomPluginExecution, `DynamicsWebApi.${request.functionName}`, \"request.bypassCustomPluginExecution\");\r\n headers[\"MSCRM.BypassCustomPluginExecution\"] = \"true\";\r\n }\r\n\r\n if (request.noCache) {\r\n ErrorHelper.boolParameterCheck(request.noCache, `DynamicsWebApi.${request.functionName}`, \"request.noCache\");\r\n headers[\"Cache-Control\"] = \"no-cache\";\r\n }\r\n\r\n if (request.mergeLabels) {\r\n ErrorHelper.boolParameterCheck(request.mergeLabels, `DynamicsWebApi.${request.functionName}`, \"request.mergeLabels\");\r\n headers[\"MSCRM.MergeLabels\"] = \"true\";\r\n }\r\n\r\n if (request.contentId) {\r\n ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, \"request.contentId\");\r\n if (!request.contentId.startsWith(\"$\")) {\r\n headers[\"Content-ID\"] = request.contentId;\r\n }\r\n }\r\n\r\n if (request.contentRange) {\r\n ErrorHelper.stringParameterCheck(request.contentRange, `DynamicsWebApi.${request.functionName}`, \"request.contentRange\");\r\n headers[\"Content-Range\"] = request.contentRange;\r\n }\r\n\r\n if (request.range) {\r\n ErrorHelper.stringParameterCheck(request.range, `DynamicsWebApi.${request.functionName}`, \"request.range\");\r\n headers[\"Range\"] = request.range;\r\n }\r\n\r\n return headers;\r\n};\r\n\r\nexport const composePreferHeader = (request: InternalRequest, config: Config): string => {\r\n let returnRepresentation: boolean | null | undefined = request.returnRepresentation;\r\n let includeAnnotations: string | null | undefined = request.includeAnnotations;\r\n let maxPageSize: number | null | undefined = request.maxPageSize;\r\n let trackChanges: boolean | null | undefined = request.trackChanges;\r\n let continueOnError: boolean | null | undefined = request.continueOnError;\r\n\r\n let prefer: string[] = [];\r\n\r\n if (request.prefer && request.prefer.length) {\r\n ErrorHelper.stringOrArrayParameterCheck(request.prefer, `DynamicsWebApi.${request.functionName}`, \"request.prefer\");\r\n if (typeof request.prefer === \"string\") {\r\n prefer = request.prefer.split(\",\");\r\n }\r\n for (let i in prefer) {\r\n let item = prefer[i].trim();\r\n if (item === \"return=representation\") {\r\n returnRepresentation = true;\r\n } else if (item.includes(\"odata.include-annotations=\")) {\r\n includeAnnotations = item.replace(\"odata.include-annotations=\", \"\").replace(/\"/g, \"\");\r\n } else if (item.startsWith(\"odata.maxpagesize=\")) {\r\n maxPageSize = Number(item.replace(\"odata.maxpagesize=\", \"\").replace(/\"/g, \"\")) || 0;\r\n } else if (item.includes(\"odata.track-changes\")) {\r\n trackChanges = true;\r\n } else if (item.includes(\"odata.continue-on-error\")) {\r\n continueOnError = true;\r\n }\r\n }\r\n }\r\n\r\n //clear array\r\n prefer = [];\r\n\r\n if (config) {\r\n if (returnRepresentation == null) {\r\n returnRepresentation = config.returnRepresentation;\r\n }\r\n includeAnnotations = includeAnnotations ? includeAnnotations : config.includeAnnotations;\r\n maxPageSize = maxPageSize ? maxPageSize : config.maxPageSize;\r\n }\r\n\r\n if (returnRepresentation) {\r\n ErrorHelper.boolParameterCheck(returnRepresentation, `DynamicsWebApi.${request.functionName}`, \"request.returnRepresentation\");\r\n prefer.push(\"return=representation\");\r\n }\r\n\r\n if (includeAnnotations) {\r\n ErrorHelper.stringParameterCheck(includeAnnotations, `DynamicsWebApi.${request.functionName}`, \"request.includeAnnotations\");\r\n prefer.push(`odata.include-annotations=\"${includeAnnotations}\"`);\r\n }\r\n\r\n if (maxPageSize && maxPageSize > 0) {\r\n ErrorHelper.numberParameterCheck(maxPageSize, `DynamicsWebApi.${request.functionName}`, \"request.maxPageSize\");\r\n prefer.push(\"odata.maxpagesize=\" + maxPageSize);\r\n }\r\n\r\n if (trackChanges) {\r\n ErrorHelper.boolParameterCheck(trackChanges, `DynamicsWebApi.${request.functionName}`, \"request.trackChanges\");\r\n prefer.push(\"odata.track-changes\");\r\n }\r\n\r\n if (continueOnError) {\r\n ErrorHelper.boolParameterCheck(continueOnError, `DynamicsWebApi.${request.functionName}`, \"request.continueOnError\");\r\n prefer.push(\"odata.continue-on-error\");\r\n }\r\n\r\n return prefer.join(\",\");\r\n};\r\n\r\nexport const convertToBatch = (requests: InternalRequest[], config: InternalConfig, batchRequest?: InternalRequest): InternalBatchRequest => {\r\n const batchBoundary = `dwa_batch_${Utility.generateUUID()}`;\r\n\r\n const batchBody: string[] = [];\r\n let currentChangeSet: string | null = null;\r\n let contentId = 100000;\r\n\r\n requests.forEach((internalRequest) => {\r\n internalRequest.functionName = \"executeBatch\";\r\n if (batchRequest?.inChangeSet === false) internalRequest.inChangeSet = false;\r\n const inChangeSet = internalRequest.method === \"GET\" ? false : !!internalRequest.inChangeSet;\r\n\r\n if (!inChangeSet && currentChangeSet) {\r\n //end current change set\r\n batchBody.push(`\\n--${currentChangeSet}--`);\r\n\r\n currentChangeSet = null;\r\n contentId = 100000;\r\n }\r\n\r\n if (!currentChangeSet) {\r\n batchBody.push(`\\n--${batchBoundary}`);\r\n\r\n if (inChangeSet) {\r\n currentChangeSet = `changeset_${Utility.generateUUID()}`;\r\n batchBody.push(\"Content-Type: multipart/mixed;boundary=\" + currentChangeSet);\r\n }\r\n }\r\n\r\n if (inChangeSet) {\r\n batchBody.push(`\\n--${currentChangeSet}`);\r\n }\r\n\r\n batchBody.push(\"Content-Type: application/http\");\r\n batchBody.push(\"Content-Transfer-Encoding: binary\");\r\n\r\n if (inChangeSet) {\r\n const contentIdValue = internalRequest.headers!.hasOwnProperty(\"Content-ID\") ? internalRequest.headers![\"Content-ID\"] : ++contentId;\r\n\r\n batchBody.push(`Content-ID: ${contentIdValue}`);\r\n }\r\n\r\n if (!internalRequest.path?.startsWith(\"$\")) {\r\n batchBody.push(`\\n${internalRequest.method} ${config.dataApi.url}${internalRequest.path} HTTP/1.1`);\r\n } else {\r\n batchBody.push(`\\n${internalRequest.method} ${internalRequest.path} HTTP/1.1`);\r\n }\r\n\r\n if (internalRequest.method === \"GET\") {\r\n batchBody.push(\"Accept: application/json\");\r\n } else {\r\n batchBody.push(\"Content-Type: application/json\");\r\n }\r\n\r\n for (let key in internalRequest.headers) {\r\n if (key === \"Authorization\" || key === \"Content-ID\") continue;\r\n\r\n batchBody.push(`${key}: ${internalRequest.headers[key]}`);\r\n }\r\n\r\n if (internalRequest.data) {\r\n batchBody.push(`\\n${processData(internalRequest.data, config)}`);\r\n }\r\n });\r\n\r\n if (currentChangeSet) {\r\n batchBody.push(`\\n--${currentChangeSet}--`);\r\n }\r\n\r\n batchBody.push(`\\n--${batchBoundary}--`);\r\n\r\n const headers = setStandardHeaders(batchRequest?.userHeaders);\r\n headers[\"Content-Type\"] = `multipart/mixed;boundary=${batchBoundary}`;\r\n\r\n return { headers: headers, body: batchBody.join(\"\\n\") };\r\n};\r\n\r\nexport const findCollectionName = (entityName: string): string | null => {\r\n let collectionName: string | null = null;\r\n\r\n if (!Utility.isNull(entityNames)) {\r\n collectionName = entityNames![entityName];\r\n if (!collectionName) {\r\n for (let key in entityNames!) {\r\n if (entityNames[key] === entityName) {\r\n return entityName;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return collectionName;\r\n};\r\n\r\nexport const processData = (data: any, config: InternalConfig): string | Uint8Array | Uint16Array | Uint32Array | null => {\r\n let stringifiedData: string | null = null;\r\n if (data) {\r\n if (data instanceof Uint8Array || data instanceof Uint16Array || data instanceof Uint32Array) return data;\r\n\r\n stringifiedData = JSON.stringify(data, (key, value) => {\r\n if (key.endsWith(\"@odata.bind\") || key.endsWith(\"@odata.id\")) {\r\n if (typeof value === \"string\" && !value.startsWith(\"$\")) {\r\n //remove brackets in guid\r\n if (/\\(\\{[\\w\\d-]+\\}\\)/g.test(value)) {\r\n value = value.replace(/(.+)\\(\\{([\\w\\d-]+)\\}\\)/g, \"$1($2)\");\r\n }\r\n\r\n if (config.useEntityNames) {\r\n //replace entity name with collection name\r\n const regularExpression = /([\\w_]+)(\\([\\d\\w-]+\\))$/;\r\n const valueParts = regularExpression.exec(value);\r\n if (valueParts && valueParts.length > 2) {\r\n const collectionName = findCollectionName(valueParts[1]);\r\n\r\n if (!Utility.isNull(collectionName)) {\r\n value = value.replace(regularExpression, collectionName + \"$2\");\r\n }\r\n }\r\n }\r\n\r\n if (!value.startsWith(config.dataApi.url)) {\r\n //add full web api url if it's not set\r\n if (key.endsWith(\"@odata.bind\")) {\r\n if (!value.startsWith(\"/\")) {\r\n value = \"/\" + value;\r\n }\r\n } else {\r\n value = config.dataApi.url + value.replace(/^\\//, \"\");\r\n }\r\n }\r\n }\r\n } else if (key.startsWith(\"oData\") || key.endsWith(\"_Formatted\") || key.endsWith(\"_NavigationProperty\") || key.endsWith(\"_LogicalName\")) {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n });\r\n\r\n stringifiedData = stringifiedData.replace(/[\\u007F-\\uFFFF]/g, function (chr: string) {\r\n return \"\\\\u\" + (\"0000\" + chr.charCodeAt(0).toString(16)).slice(-4);\r\n });\r\n }\r\n\r\n return stringifiedData;\r\n};\r\n\r\nexport const setStandardHeaders = (headers: HeaderCollection = {}): HeaderCollection => {\r\n if (!headers[\"Accept\"]) headers[\"Accept\"] = \"application/json\";\r\n if (!headers[\"OData-MaxVersion\"]) headers[\"OData-MaxVersion\"] = \"4.0\";\r\n if (!headers[\"OData-Version\"]) headers[\"OData-Version\"] = \"4.0\";\r\n if (headers[\"Content-Range\"]) headers[\"Content-Type\"] = \"application/octet-stream\";\r\n else if (!headers[\"Content-Type\"]) headers[\"Content-Type\"] = \"application/json; charset=utf-8\";\r\n\r\n return headers;\r\n};\r\n", "import type { RequestOptions, WebApiResponse } from \"../../types\";\r\n\r\nexport async function executeRequest(options: RequestOptions): Promise {\r\n return global.DWA_BROWSER ? require(\"../xhr\").executeRequest(options) : require(\"../http\").executeRequest(options);\r\n}\r\n"], + "mappings": "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", + "names": ["getCrypto", "generateRandomBytes", "init_Crypto", "__esmMin", "isUuid", "value", "uuid", "extractUuid", "match", "extractUuidFromUrl", "url", "init_Regex", "__esmMin", "downloadChunkSize", "_Utility", "Utility", "init_Utility", "__esmMin", "init_Crypto", "init_Regex", "parameters", "parameterNames", "functionParams", "urlQuery", "i", "parameterName", "value", "isUuid", "extractUuid", "pageCookies", "currentPageNumber", "info", "page", "responseData", "result", "c", "generateRandomBytes", "clientUrl", "obj", "src", "excludeProps", "target", "prop", "request", "fileBuffer", "chunkSize", "offset", "count", "content", "binaryString", "bytes", "throwParameterError", "functionName", "parameterName", "type", "ErrorHelper", "init_ErrorHelper", "__esmMin", "init_Regex", "_ErrorHelper", "req", "parameter", "maxLength", "parsedError", "parameters", "error", "k", "match", "extractUuid", "alternateKeys", "i", "callbackParameter", "isBatch", "_a", "_b", "_DWA", "DWA", "init_dwa", "__esmMin", "annotation", "dateReviver", "key", "value", "a", "init_dateReviver", "__esmMin", "getFormattedKeyValue", "keyName", "value", "newKey", "format", "DWA", "parseData", "object", "parseParams", "Utility", "keys", "i", "currentKey", "j", "formattedKeyValue", "aliasKeys", "parseBatchHeaders", "text", "ctx", "headers", "parts", "line", "pos", "readLine", "responseHeaderRegex", "readTo", "str", "start", "end", "parseBatchResponse", "response", "requestNumber", "delimiter", "batchResponseParts", "result", "batchResponse", "batchToProcess", "httpStatusReg", "httpStatus", "httpStatusMessage", "responseData", "parsedResponse", "dateReviver", "responseHeaders", "ErrorHelper", "plainContentReg", "plainContent", "entityUrl", "guidResult", "extractUuidFromUrl", "base64ToString", "base64", "parseFileResponse", "data", "parseResult", "hasHeader", "getHeader", "name", "parseResponse", "batch", "init_parseResponse", "__esmMin", "init_dwa", "init_Utility", "init_ErrorHelper", "init_dateReviver", "init_Regex", "parseResponseHeaders", "headerStr", "headers", "headerPairs", "ilen", "headerPair", "index", "init_parseResponseHeaders", "__esmMin", "xhr_exports", "__export", "XhrWrapper", "executeRequest", "options", "resolve", "reject", "_executeRequest", "successCallback", "errorCallback", "data", "headers", "responseParams", "signal", "ErrorHelper", "request", "key", "abort", "responseHeaders", "parseResponseHeaders", "response", "parseResponse", "error", "errorParsed", "errorParameters", "init_xhr", "__esmMin", "init_ErrorHelper", "init_parseResponse", "init_parseResponseHeaders", "dynamics_web_api_exports", "__export", "DynamicsWebApi", "init_Utility", "init_ErrorHelper", "getApiUrl", "serverUrl", "apiConfig", "Utility", "mergeApiConfigs", "apiType", "internalConfig", "internalApiConfig", "ErrorHelper", "ConfigurationUtility", "config", "init_Utility", "init_ErrorHelper", "init_Utility", "init_Utility", "init_ErrorHelper", "entityNames", "setEntityNames", "newEntityNames", "compose", "request", "config", "ErrorHelper", "composeUrl", "join", "composeHeaders", "url", "joinSymbol", "queryArray", "navigationKey", "removeBracketsFromGuidReg", "filterResult", "m", "replacement", "Utility", "expandQueryArray", "i", "expand", "expandConverted", "headers", "prefer", "composePreferHeader", "returnRepresentation", "includeAnnotations", "maxPageSize", "trackChanges", "continueOnError", "item", "convertToBatch", "requests", "batchRequest", "batchBoundary", "batchBody", "currentChangeSet", "contentId", "internalRequest", "inChangeSet", "contentIdValue", "key", "processData", "setStandardHeaders", "findCollectionName", "entityName", "collectionName", "data", "stringifiedData", "value", "regularExpression", "valueParts", "chr", "init_ErrorHelper", "executeRequest", "options", "_addResponseParams", "requestId", "responseParams", "_responseParseParams", "_addRequestToBatchCollection", "request", "_batchRequestCollection", "_clearRequestData", "_runRequest", "config", "result", "RequestClient", "error", "_nameExceptions", "_isEntityNameException", "entityName", "_getCollectionNames", "Utility", "entityNames", "findCollectionName", "compose", "setEntityNames", "i", "_checkCollectionName", "processedData", "isBatchConverted", "batchRequest", "ErrorHelper", "batchResult", "convertToBatch", "processData", "setStandardHeaders", "token", "url", "executeRequest", "collectionName", "DynamicsWebApi", "_DynamicsWebApi", "config", "ConfigurationUtility", "request", "RequestClient", "ErrorHelper", "internalRequest", "Utility", "ifmatch", "error", "field", "fieldValue", "ifnonematch", "fileBytes", "chunkSize", "offset", "response", "bytesDownloaded", "data", "nextPageLink", "records", "pageLink", "result", "replacementString", "_executeFetchXmlAll", "primaryKey", "relatedKey", "getFunctionName", "isObject", "functionName", "parameterName", "functionParameters", "entityName"] } diff --git a/dist/esm/dynamics-web-api.mjs b/dist/esm/dynamics-web-api.mjs index 7206079..25d8cbf 100644 --- a/dist/esm/dynamics-web-api.mjs +++ b/dist/esm/dynamics-web-api.mjs @@ -1,4 +1,4 @@ -/*! dynamics-web-api v2.1.4 (c) 2024 Aleksandr Rogov */ +/*! dynamics-web-api v2.1.5 (c) 2024 Aleksandr Rogov */ var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; @@ -680,17 +680,17 @@ function executeRequest(options) { function _executeRequest(options, successCallback, errorCallback) { var _a2; const data = options.data; - const additionalHeaders = options.additionalHeaders; + const headers = options.headers; const responseParams = options.responseParams; const signal = options.abortSignal; - const headers = {}; + const httpHeaders = {}; if (data) { - headers["Content-Type"] = additionalHeaders["Content-Type"]; - headers["Content-Length"] = data.length; - delete additionalHeaders["Content-Type"]; + httpHeaders["Content-Type"] = headers["Content-Type"]; + httpHeaders["Content-Length"] = data.length; + delete headers["Content-Type"]; } - for (let key in additionalHeaders) { - headers[key] = additionalHeaders[key]; + for (let key in headers) { + httpHeaders[key] = headers[key]; } const parsedUrl = new URL(options.uri); const protocol = ((_a2 = parsedUrl.protocol) == null ? void 0 : _a2.slice(0, -1)) || "https"; @@ -701,7 +701,7 @@ function _executeRequest(options, successCallback, errorCallback) { path: parsedUrl.pathname + parsedUrl.search, method: options.method, timeout: options.timeout || 0, - headers, + headers: httpHeaders, signal }; if (!options.proxy && process.env[`${protocol}_proxy`]) { @@ -713,7 +713,7 @@ function _executeRequest(options, successCallback, errorCallback) { if (options.proxy) { const hostHeader = new URL(options.proxy.url).host; if (hostHeader) - headers.host = hostHeader; + httpHeaders.host = hostHeader; } const request = protocolInterface.request(internalOptions, function(res) { let rawData = ""; @@ -929,484 +929,451 @@ init_Utility(); // src/utils/Request.ts init_Utility(); init_ErrorHelper(); -var _RequestUtility = class _RequestUtility { - /** - * Converts a request object to URL link - * - * @param {Object} request - Request object - * @param {Object} [config] - DynamicsWebApi config - * @returns {ConvertedRequest} Converted request - */ - static compose(request, config) { - request.path = request.path || ""; - request.functionName = request.functionName || ""; - if (!request.url) { - if (!request._isUnboundRequest && !request.contentId && !request.collection) { - ErrorHelper.parameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, "request.collection"); - } - if (request.collection != null) { - ErrorHelper.stringParameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, "request.collection"); - request.path = request.collection; - if (request.key) { - request.key = ErrorHelper.keyParameterCheck(request.key, `DynamicsWebApi.${request.functionName}`, "request.key"); - request.path += `(${request.key})`; - } - } - if (request.contentId) { - ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, "request.contentId"); - if (request.contentId.startsWith("$")) { - request.path = request.path ? `${request.contentId}/${request.path}` : request.contentId; - } +var entityNames = null; +var setEntityNames = (newEntityNames) => { + entityNames = newEntityNames; +}; +var compose = (request, config) => { + request.path = request.path || ""; + request.functionName = request.functionName || ""; + if (!request.url) { + if (!request._isUnboundRequest && !request.contentId && !request.collection) { + ErrorHelper.parameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, "request.collection"); + } + if (request.collection != null) { + ErrorHelper.stringParameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, "request.collection"); + request.path = request.collection; + if (request.key) { + request.key = ErrorHelper.keyParameterCheck(request.key, `DynamicsWebApi.${request.functionName}`, "request.key"); + request.path += `(${request.key})`; } - if (request._additionalUrl) { - if (request.path) { - request.path += "/"; - } - request.path += request._additionalUrl; + } + if (request.contentId) { + ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, "request.contentId"); + if (request.contentId.startsWith("$")) { + request.path = request.path ? `${request.contentId}/${request.path}` : request.contentId; } - request.path = _RequestUtility.composeUrl(request, config, request.path); - if (request.fetchXml) { - ErrorHelper.stringParameterCheck(request.fetchXml, `DynamicsWebApi.${request.functionName}`, "request.fetchXml"); - let join = request.path.indexOf("?") === -1 ? "?" : "&"; - request.path += `${join}fetchXml=${encodeURIComponent(request.fetchXml)}`; + } + if (request.addPath) { + if (request.path) { + request.path += "/"; } - } else { - ErrorHelper.stringParameterCheck(request.url, `DynamicsWebApi.${request.functionName}`, "request.url"); - request.path = request.url.replace(config.dataApi.url, ""); + request.path += request.addPath; } - if (request.hasOwnProperty("async") && request.async != null) { - ErrorHelper.boolParameterCheck(request.async, `DynamicsWebApi.${request.functionName}`, "request.async"); - } else { - request.async = true; + request.path = composeUrl(request, config, request.path); + if (request.fetchXml) { + ErrorHelper.stringParameterCheck(request.fetchXml, `DynamicsWebApi.${request.functionName}`, "request.fetchXml"); + let join = request.path.indexOf("?") === -1 ? "?" : "&"; + request.path += `${join}fetchXml=${encodeURIComponent(request.fetchXml)}`; } - request.headers = _RequestUtility.composeHeaders(request, config); - return request; + } else { + ErrorHelper.stringParameterCheck(request.url, `DynamicsWebApi.${request.functionName}`, "request.url"); + request.path = request.url.replace(config.dataApi.url, ""); } - /** - * Converts optional parameters of the request to URL. If expand parameter exists this function is called recursively. - * - * @param {Object} request - Request object - * @param {string} request.functionName - Name of the function that converts a request (for Error Handling) - * @param {string} url - URL beginning (with required parameters) - * @param {string} [joinSymbol] - URL beginning (with required parameters) - * @param {Object} [config] - DynamicsWebApi config - * @returns {ConvertedRequestOptions} Additional options in request - */ - static composeUrl(request, config, url = "", joinSymbol = "&") { - var _a2, _b2, _c; - const queryArray = []; - if (request) { - if (request.navigationProperty) { - ErrorHelper.stringParameterCheck(request.navigationProperty, `DynamicsWebApi.${request.functionName}`, "request.navigationProperty"); - url += "/" + request.navigationProperty; - if (request.navigationPropertyKey) { - let navigationKey = ErrorHelper.keyParameterCheck( - request.navigationPropertyKey, - `DynamicsWebApi.${request.functionName}`, - "request.navigationPropertyKey" - ); - url += "(" + navigationKey + ")"; - } - if (request.navigationProperty === "Attributes") { - if (request.metadataAttributeType) { - ErrorHelper.stringParameterCheck( - request.metadataAttributeType, - `DynamicsWebApi.${request.functionName}`, - "request.metadataAttributeType" - ); - url += "/" + request.metadataAttributeType; - } - } + if (request.hasOwnProperty("async") && request.async != null) { + ErrorHelper.boolParameterCheck(request.async, `DynamicsWebApi.${request.functionName}`, "request.async"); + } else { + request.async = true; + } + request.headers = composeHeaders(request, config); + return request; +}; +var composeUrl = (request, config, url = "", joinSymbol = "&") => { + var _a2, _b2, _c; + const queryArray = []; + if (request) { + if (request.navigationProperty) { + ErrorHelper.stringParameterCheck(request.navigationProperty, `DynamicsWebApi.${request.functionName}`, "request.navigationProperty"); + url += "/" + request.navigationProperty; + if (request.navigationPropertyKey) { + let navigationKey = ErrorHelper.keyParameterCheck( + request.navigationPropertyKey, + `DynamicsWebApi.${request.functionName}`, + "request.navigationPropertyKey" + ); + url += "(" + navigationKey + ")"; } - if ((_a2 = request.select) == null ? void 0 : _a2.length) { - ErrorHelper.arrayParameterCheck(request.select, `DynamicsWebApi.${request.functionName}`, "request.select"); - if (request.functionName == "retrieve" && request.select.length == 1 && request.select[0].endsWith("/$ref")) { - url += "/" + request.select[0]; - } else { - if (request.select[0].startsWith("/") && request.functionName == "retrieve") { - if (request.navigationProperty == null) { - url += request.select.shift(); - } else { - request.select.shift(); - } - } - if (request.select.length) { - queryArray.push("$select=" + request.select.join(",")); - } + if (request.navigationProperty === "Attributes") { + if (request.metadataAttributeType) { + ErrorHelper.stringParameterCheck(request.metadataAttributeType, `DynamicsWebApi.${request.functionName}`, "request.metadataAttributeType"); + url += "/" + request.metadataAttributeType; } } - if (request.filter) { - ErrorHelper.stringParameterCheck(request.filter, `DynamicsWebApi.${request.functionName}`, "request.filter"); - const removeBracketsFromGuidReg = /[^"']{([\w\d]{8}[-]?(?:[\w\d]{4}[-]?){3}[\w\d]{12})}(?:[^"']|$)/g; - let filterResult = request.filter; - let m = null; - while ((m = removeBracketsFromGuidReg.exec(filterResult)) !== null) { - if (m.index === removeBracketsFromGuidReg.lastIndex) { - removeBracketsFromGuidReg.lastIndex++; + } + if ((_a2 = request.select) == null ? void 0 : _a2.length) { + ErrorHelper.arrayParameterCheck(request.select, `DynamicsWebApi.${request.functionName}`, "request.select"); + if (request.functionName == "retrieve" && request.select.length == 1 && request.select[0].endsWith("/$ref")) { + url += "/" + request.select[0]; + } else { + if (request.select[0].startsWith("/") && request.functionName == "retrieve") { + if (request.navigationProperty == null) { + url += request.select.shift(); + } else { + request.select.shift(); } - let replacement = m[0].endsWith(")") ? ")" : " "; - filterResult = filterResult.replace(m[0], " " + m[1] + replacement); } - queryArray.push("$filter=" + encodeURIComponent(filterResult)); - } - if (request.fieldName) { - ErrorHelper.stringParameterCheck(request.fieldName, `DynamicsWebApi.${request.functionName}`, "request.fieldName"); - url += "/" + request.fieldName; - } - if (request.savedQuery) { - queryArray.push( - "savedQuery=" + ErrorHelper.guidParameterCheck(request.savedQuery, `DynamicsWebApi.${request.functionName}`, "request.savedQuery") - ); - } - if (request.userQuery) { - queryArray.push( - "userQuery=" + ErrorHelper.guidParameterCheck(request.userQuery, `DynamicsWebApi.${request.functionName}`, "request.userQuery") - ); - } - if (request.apply) { - ErrorHelper.stringParameterCheck(request.apply, `DynamicsWebApi.${request.functionName}`, "request.apply"); - queryArray.push("$apply=" + request.apply); - } - if (request.count) { - ErrorHelper.boolParameterCheck(request.count, `DynamicsWebApi.${request.functionName}`, "request.count"); - queryArray.push("$count=" + request.count); - } - if (request.top && request.top > 0) { - ErrorHelper.numberParameterCheck(request.top, `DynamicsWebApi.${request.functionName}`, "request.top"); - queryArray.push("$top=" + request.top); - } - if (request.orderBy != null && request.orderBy.length) { - ErrorHelper.arrayParameterCheck(request.orderBy, `DynamicsWebApi.${request.functionName}`, "request.orderBy"); - queryArray.push("$orderby=" + request.orderBy.join(",")); - } - if (request.partitionId) { - ErrorHelper.stringParameterCheck(request.partitionId, `DynamicsWebApi.${request.functionName}`, "request.partitionId"); - queryArray.push("partitionid='" + request.partitionId + "'"); - } - if (request.downloadSize) { - ErrorHelper.stringParameterCheck(request.downloadSize, `DynamicsWebApi.${request.functionName}`, "request.downloadSize"); - queryArray.push("size=" + request.downloadSize); - } - if ((_b2 = request.queryParams) == null ? void 0 : _b2.length) { - ErrorHelper.arrayParameterCheck(request.queryParams, `DynamicsWebApi.${request.functionName}`, "request.queryParams"); - queryArray.push(request.queryParams.join("&")); - } - if (request.fileName) { - ErrorHelper.stringParameterCheck(request.fileName, `DynamicsWebApi.${request.functionName}`, "request.fileName"); - queryArray.push("x-ms-file-name=" + request.fileName); - } - if (request.data) { - ErrorHelper.parameterCheck(request.data, `DynamicsWebApi.${request.functionName}`, "request.data"); - } - if (request.isBatch) { - ErrorHelper.boolParameterCheck(request.isBatch, `DynamicsWebApi.${request.functionName}`, "request.isBatch"); - } - if (!Utility.isNull(request.inChangeSet)) { - ErrorHelper.boolParameterCheck(request.inChangeSet, `DynamicsWebApi.${request.functionName}`, "request.inChangeSet"); - } - if (request.isBatch && Utility.isNull(request.inChangeSet)) - request.inChangeSet = true; - if (request.timeout) { - ErrorHelper.numberParameterCheck(request.timeout, `DynamicsWebApi.${request.functionName}`, "request.timeout"); - } - if ((_c = request.expand) == null ? void 0 : _c.length) { - ErrorHelper.stringOrArrayParameterCheck(request.expand, `DynamicsWebApi.${request.functionName}`, "request.expand"); - if (typeof request.expand === "string") { - queryArray.push("$expand=" + request.expand); - } else { - const expandQueryArray = []; - for (let i = 0; i < request.expand.length; i++) { - if (request.expand[i].property) { - const expand = request.expand[i]; - expand.functionName = `${request.functionName} $expand`; - let expandConverted = _RequestUtility.composeUrl(expand, config, "", ";"); - if (expandConverted) { - expandConverted = `(${expandConverted.substr(1)})`; - } - expandQueryArray.push(request.expand[i].property + expandConverted); - } - } - if (expandQueryArray.length) { - queryArray.push("$expand=" + expandQueryArray.join(",")); - } + if (request.select.length) { + queryArray.push("$select=" + request.select.join(",")); } } } - return !queryArray.length ? url : url + "?" + queryArray.join(joinSymbol); - } - static composeHeaders(request, config) { - const headers = { ...config.headers, ...request.userHeaders }; - const prefer = _RequestUtility.composePreferHeader(request, config); - if (prefer.length) { - headers["Prefer"] = prefer; + if (request.filter) { + ErrorHelper.stringParameterCheck(request.filter, `DynamicsWebApi.${request.functionName}`, "request.filter"); + const removeBracketsFromGuidReg = /[^"']{([\w\d]{8}[-]?(?:[\w\d]{4}[-]?){3}[\w\d]{12})}(?:[^"']|$)/g; + let filterResult = request.filter; + let m = null; + while ((m = removeBracketsFromGuidReg.exec(filterResult)) !== null) { + if (m.index === removeBracketsFromGuidReg.lastIndex) { + removeBracketsFromGuidReg.lastIndex++; + } + let replacement = m[0].endsWith(")") ? ")" : " "; + filterResult = filterResult.replace(m[0], " " + m[1] + replacement); + } + queryArray.push("$filter=" + encodeURIComponent(filterResult)); } - if (request.collection === "$metadata") { - headers["Accept"] = "application/xml"; + if (request.fieldName) { + ErrorHelper.stringParameterCheck(request.fieldName, `DynamicsWebApi.${request.functionName}`, "request.fieldName"); + url += "/" + request.fieldName; } - if (request.transferMode) { - headers["x-ms-transfer-mode"] = request.transferMode; + if (request.savedQuery) { + queryArray.push("savedQuery=" + ErrorHelper.guidParameterCheck(request.savedQuery, `DynamicsWebApi.${request.functionName}`, "request.savedQuery")); } - if (request.ifmatch != null && request.ifnonematch != null) { - throw new Error( - `DynamicsWebApi.${request.functionName}. Either one of request.ifmatch or request.ifnonematch parameters should be used in a call, not both.` - ); + if (request.userQuery) { + queryArray.push("userQuery=" + ErrorHelper.guidParameterCheck(request.userQuery, `DynamicsWebApi.${request.functionName}`, "request.userQuery")); } - if (request.ifmatch) { - ErrorHelper.stringParameterCheck(request.ifmatch, `DynamicsWebApi.${request.functionName}`, "request.ifmatch"); - headers["If-Match"] = request.ifmatch; + if (request.apply) { + ErrorHelper.stringParameterCheck(request.apply, `DynamicsWebApi.${request.functionName}`, "request.apply"); + queryArray.push("$apply=" + request.apply); } - if (request.ifnonematch) { - ErrorHelper.stringParameterCheck(request.ifnonematch, `DynamicsWebApi.${request.functionName}`, "request.ifnonematch"); - headers["If-None-Match"] = request.ifnonematch; + if (request.count) { + ErrorHelper.boolParameterCheck(request.count, `DynamicsWebApi.${request.functionName}`, "request.count"); + queryArray.push("$count=" + request.count); } - if (request.impersonate) { - ErrorHelper.stringParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, "request.impersonate"); - headers["MSCRMCallerID"] = ErrorHelper.guidParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, "request.impersonate"); + if (request.top && request.top > 0) { + ErrorHelper.numberParameterCheck(request.top, `DynamicsWebApi.${request.functionName}`, "request.top"); + queryArray.push("$top=" + request.top); } - if (request.impersonateAAD) { - ErrorHelper.stringParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, "request.impersonateAAD"); - headers["CallerObjectId"] = ErrorHelper.guidParameterCheck( - request.impersonateAAD, - `DynamicsWebApi.${request.functionName}`, - "request.impersonateAAD" - ); + if (request.orderBy != null && request.orderBy.length) { + ErrorHelper.arrayParameterCheck(request.orderBy, `DynamicsWebApi.${request.functionName}`, "request.orderBy"); + queryArray.push("$orderby=" + request.orderBy.join(",")); } - if (request.token) { - ErrorHelper.stringParameterCheck(request.token, `DynamicsWebApi.${request.functionName}`, "request.token"); - headers["Authorization"] = "Bearer " + request.token; + if (request.partitionId) { + ErrorHelper.stringParameterCheck(request.partitionId, `DynamicsWebApi.${request.functionName}`, "request.partitionId"); + queryArray.push("partitionid='" + request.partitionId + "'"); } - if (request.duplicateDetection) { - ErrorHelper.boolParameterCheck(request.duplicateDetection, `DynamicsWebApi.${request.functionName}`, "request.duplicateDetection"); - headers["MSCRM.SuppressDuplicateDetection"] = "false"; + if (request.downloadSize) { + ErrorHelper.stringParameterCheck(request.downloadSize, `DynamicsWebApi.${request.functionName}`, "request.downloadSize"); + queryArray.push("size=" + request.downloadSize); } - if (request.bypassCustomPluginExecution) { - ErrorHelper.boolParameterCheck( - request.bypassCustomPluginExecution, - `DynamicsWebApi.${request.functionName}`, - "request.bypassCustomPluginExecution" - ); - headers["MSCRM.BypassCustomPluginExecution"] = "true"; + if ((_b2 = request.queryParams) == null ? void 0 : _b2.length) { + ErrorHelper.arrayParameterCheck(request.queryParams, `DynamicsWebApi.${request.functionName}`, "request.queryParams"); + queryArray.push(request.queryParams.join("&")); } - if (request.noCache) { - ErrorHelper.boolParameterCheck(request.noCache, `DynamicsWebApi.${request.functionName}`, "request.noCache"); - headers["Cache-Control"] = "no-cache"; + if (request.fileName) { + ErrorHelper.stringParameterCheck(request.fileName, `DynamicsWebApi.${request.functionName}`, "request.fileName"); + queryArray.push("x-ms-file-name=" + request.fileName); } - if (request.mergeLabels) { - ErrorHelper.boolParameterCheck(request.mergeLabels, `DynamicsWebApi.${request.functionName}`, "request.mergeLabels"); - headers["MSCRM.MergeLabels"] = "true"; + if (request.data) { + ErrorHelper.parameterCheck(request.data, `DynamicsWebApi.${request.functionName}`, "request.data"); } - if (request.contentId) { - ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, "request.contentId"); - if (!request.contentId.startsWith("$")) { - headers["Content-ID"] = request.contentId; - } - } - if (request.contentRange) { - ErrorHelper.stringParameterCheck(request.contentRange, `DynamicsWebApi.${request.functionName}`, "request.contentRange"); - headers["Content-Range"] = request.contentRange; - } - if (request.range) { - ErrorHelper.stringParameterCheck(request.range, `DynamicsWebApi.${request.functionName}`, "request.range"); - headers["Range"] = request.range; - } - return headers; - } - static composePreferHeader(request, config) { - let returnRepresentation = request.returnRepresentation; - let includeAnnotations = request.includeAnnotations; - let maxPageSize = request.maxPageSize; - let trackChanges = request.trackChanges; - let continueOnError = request.continueOnError; - let prefer = []; - if (request.prefer && request.prefer.length) { - ErrorHelper.stringOrArrayParameterCheck(request.prefer, `DynamicsWebApi.${request.functionName}`, "request.prefer"); - if (typeof request.prefer === "string") { - prefer = request.prefer.split(","); - } - for (let i in prefer) { - let item = prefer[i].trim(); - if (item === "return=representation") { - returnRepresentation = true; - } else if (item.includes("odata.include-annotations=")) { - includeAnnotations = item.replace("odata.include-annotations=", "").replace(/"/g, ""); - } else if (item.startsWith("odata.maxpagesize=")) { - maxPageSize = Number(item.replace("odata.maxpagesize=", "").replace(/"/g, "")) || 0; - } else if (item.includes("odata.track-changes")) { - trackChanges = true; - } else if (item.includes("odata.continue-on-error")) { - continueOnError = true; - } - } + if (request.isBatch) { + ErrorHelper.boolParameterCheck(request.isBatch, `DynamicsWebApi.${request.functionName}`, "request.isBatch"); } - prefer = []; - if (config) { - if (returnRepresentation == null) { - returnRepresentation = config.returnRepresentation; - } - includeAnnotations = includeAnnotations ? includeAnnotations : config.includeAnnotations; - maxPageSize = maxPageSize ? maxPageSize : config.maxPageSize; + if (!Utility.isNull(request.inChangeSet)) { + ErrorHelper.boolParameterCheck(request.inChangeSet, `DynamicsWebApi.${request.functionName}`, "request.inChangeSet"); } - if (returnRepresentation) { - ErrorHelper.boolParameterCheck(returnRepresentation, `DynamicsWebApi.${request.functionName}`, "request.returnRepresentation"); - prefer.push("return=representation"); + if (request.isBatch && Utility.isNull(request.inChangeSet)) + request.inChangeSet = true; + if (request.timeout) { + ErrorHelper.numberParameterCheck(request.timeout, `DynamicsWebApi.${request.functionName}`, "request.timeout"); } - if (includeAnnotations) { - ErrorHelper.stringParameterCheck(includeAnnotations, `DynamicsWebApi.${request.functionName}`, "request.includeAnnotations"); - prefer.push(`odata.include-annotations="${includeAnnotations}"`); + if ((_c = request.expand) == null ? void 0 : _c.length) { + ErrorHelper.stringOrArrayParameterCheck(request.expand, `DynamicsWebApi.${request.functionName}`, "request.expand"); + if (typeof request.expand === "string") { + queryArray.push("$expand=" + request.expand); + } else { + const expandQueryArray = []; + for (let i = 0; i < request.expand.length; i++) { + if (request.expand[i].property) { + const expand = request.expand[i]; + expand.functionName = `${request.functionName} $expand`; + let expandConverted = composeUrl(expand, config, "", ";"); + if (expandConverted) { + expandConverted = `(${expandConverted.substr(1)})`; + } + expandQueryArray.push(request.expand[i].property + expandConverted); + } + } + if (expandQueryArray.length) { + queryArray.push("$expand=" + expandQueryArray.join(",")); + } + } } - if (maxPageSize && maxPageSize > 0) { - ErrorHelper.numberParameterCheck(maxPageSize, `DynamicsWebApi.${request.functionName}`, "request.maxPageSize"); - prefer.push("odata.maxpagesize=" + maxPageSize); + } + return !queryArray.length ? url : url + "?" + queryArray.join(joinSymbol); +}; +var composeHeaders = (request, config) => { + const headers = { ...config.headers, ...request.userHeaders }; + const prefer = composePreferHeader(request, config); + if (prefer.length) { + headers["Prefer"] = prefer; + } + if (request.collection === "$metadata") { + headers["Accept"] = "application/xml"; + } + if (request.transferMode) { + headers["x-ms-transfer-mode"] = request.transferMode; + } + if (request.ifmatch != null && request.ifnonematch != null) { + throw new Error( + `DynamicsWebApi.${request.functionName}. Either one of request.ifmatch or request.ifnonematch parameters should be used in a call, not both.` + ); + } + if (request.ifmatch) { + ErrorHelper.stringParameterCheck(request.ifmatch, `DynamicsWebApi.${request.functionName}`, "request.ifmatch"); + headers["If-Match"] = request.ifmatch; + } + if (request.ifnonematch) { + ErrorHelper.stringParameterCheck(request.ifnonematch, `DynamicsWebApi.${request.functionName}`, "request.ifnonematch"); + headers["If-None-Match"] = request.ifnonematch; + } + if (request.impersonate) { + ErrorHelper.stringParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, "request.impersonate"); + headers["MSCRMCallerID"] = ErrorHelper.guidParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, "request.impersonate"); + } + if (request.impersonateAAD) { + ErrorHelper.stringParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, "request.impersonateAAD"); + headers["CallerObjectId"] = ErrorHelper.guidParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, "request.impersonateAAD"); + } + if (request.token) { + ErrorHelper.stringParameterCheck(request.token, `DynamicsWebApi.${request.functionName}`, "request.token"); + headers["Authorization"] = "Bearer " + request.token; + } + if (request.duplicateDetection) { + ErrorHelper.boolParameterCheck(request.duplicateDetection, `DynamicsWebApi.${request.functionName}`, "request.duplicateDetection"); + headers["MSCRM.SuppressDuplicateDetection"] = "false"; + } + if (request.bypassCustomPluginExecution) { + ErrorHelper.boolParameterCheck(request.bypassCustomPluginExecution, `DynamicsWebApi.${request.functionName}`, "request.bypassCustomPluginExecution"); + headers["MSCRM.BypassCustomPluginExecution"] = "true"; + } + if (request.noCache) { + ErrorHelper.boolParameterCheck(request.noCache, `DynamicsWebApi.${request.functionName}`, "request.noCache"); + headers["Cache-Control"] = "no-cache"; + } + if (request.mergeLabels) { + ErrorHelper.boolParameterCheck(request.mergeLabels, `DynamicsWebApi.${request.functionName}`, "request.mergeLabels"); + headers["MSCRM.MergeLabels"] = "true"; + } + if (request.contentId) { + ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, "request.contentId"); + if (!request.contentId.startsWith("$")) { + headers["Content-ID"] = request.contentId; } - if (trackChanges) { - ErrorHelper.boolParameterCheck(trackChanges, `DynamicsWebApi.${request.functionName}`, "request.trackChanges"); - prefer.push("odata.track-changes"); + } + if (request.contentRange) { + ErrorHelper.stringParameterCheck(request.contentRange, `DynamicsWebApi.${request.functionName}`, "request.contentRange"); + headers["Content-Range"] = request.contentRange; + } + if (request.range) { + ErrorHelper.stringParameterCheck(request.range, `DynamicsWebApi.${request.functionName}`, "request.range"); + headers["Range"] = request.range; + } + return headers; +}; +var composePreferHeader = (request, config) => { + let returnRepresentation = request.returnRepresentation; + let includeAnnotations = request.includeAnnotations; + let maxPageSize = request.maxPageSize; + let trackChanges = request.trackChanges; + let continueOnError = request.continueOnError; + let prefer = []; + if (request.prefer && request.prefer.length) { + ErrorHelper.stringOrArrayParameterCheck(request.prefer, `DynamicsWebApi.${request.functionName}`, "request.prefer"); + if (typeof request.prefer === "string") { + prefer = request.prefer.split(","); + } + for (let i in prefer) { + let item = prefer[i].trim(); + if (item === "return=representation") { + returnRepresentation = true; + } else if (item.includes("odata.include-annotations=")) { + includeAnnotations = item.replace("odata.include-annotations=", "").replace(/"/g, ""); + } else if (item.startsWith("odata.maxpagesize=")) { + maxPageSize = Number(item.replace("odata.maxpagesize=", "").replace(/"/g, "")) || 0; + } else if (item.includes("odata.track-changes")) { + trackChanges = true; + } else if (item.includes("odata.continue-on-error")) { + continueOnError = true; + } } - if (continueOnError) { - ErrorHelper.boolParameterCheck(continueOnError, `DynamicsWebApi.${request.functionName}`, "request.continueOnError"); - prefer.push("odata.continue-on-error"); + } + prefer = []; + if (config) { + if (returnRepresentation == null) { + returnRepresentation = config.returnRepresentation; } - return prefer.join(","); + includeAnnotations = includeAnnotations ? includeAnnotations : config.includeAnnotations; + maxPageSize = maxPageSize ? maxPageSize : config.maxPageSize; } - static convertToBatch(requests, config, batchRequest) { - const batchBoundary = `dwa_batch_${Utility.generateUUID()}`; - const batchBody = []; - let currentChangeSet = null; - let contentId = 1e5; - requests.forEach((internalRequest) => { - var _a2; - internalRequest.functionName = "executeBatch"; - if ((batchRequest == null ? void 0 : batchRequest.inChangeSet) === false) - internalRequest.inChangeSet = false; - const inChangeSet = internalRequest.method === "GET" ? false : !!internalRequest.inChangeSet; - if (!inChangeSet && currentChangeSet) { - batchBody.push(` + if (returnRepresentation) { + ErrorHelper.boolParameterCheck(returnRepresentation, `DynamicsWebApi.${request.functionName}`, "request.returnRepresentation"); + prefer.push("return=representation"); + } + if (includeAnnotations) { + ErrorHelper.stringParameterCheck(includeAnnotations, `DynamicsWebApi.${request.functionName}`, "request.includeAnnotations"); + prefer.push(`odata.include-annotations="${includeAnnotations}"`); + } + if (maxPageSize && maxPageSize > 0) { + ErrorHelper.numberParameterCheck(maxPageSize, `DynamicsWebApi.${request.functionName}`, "request.maxPageSize"); + prefer.push("odata.maxpagesize=" + maxPageSize); + } + if (trackChanges) { + ErrorHelper.boolParameterCheck(trackChanges, `DynamicsWebApi.${request.functionName}`, "request.trackChanges"); + prefer.push("odata.track-changes"); + } + if (continueOnError) { + ErrorHelper.boolParameterCheck(continueOnError, `DynamicsWebApi.${request.functionName}`, "request.continueOnError"); + prefer.push("odata.continue-on-error"); + } + return prefer.join(","); +}; +var convertToBatch = (requests, config, batchRequest) => { + const batchBoundary = `dwa_batch_${Utility.generateUUID()}`; + const batchBody = []; + let currentChangeSet = null; + let contentId = 1e5; + requests.forEach((internalRequest) => { + var _a2; + internalRequest.functionName = "executeBatch"; + if ((batchRequest == null ? void 0 : batchRequest.inChangeSet) === false) + internalRequest.inChangeSet = false; + const inChangeSet = internalRequest.method === "GET" ? false : !!internalRequest.inChangeSet; + if (!inChangeSet && currentChangeSet) { + batchBody.push(` --${currentChangeSet}--`); - currentChangeSet = null; - contentId = 1e5; - } - if (!currentChangeSet) { - batchBody.push(` + currentChangeSet = null; + contentId = 1e5; + } + if (!currentChangeSet) { + batchBody.push(` --${batchBoundary}`); - if (inChangeSet) { - currentChangeSet = `changeset_${Utility.generateUUID()}`; - batchBody.push("Content-Type: multipart/mixed;boundary=" + currentChangeSet); - } - } if (inChangeSet) { - batchBody.push(` ---${currentChangeSet}`); + currentChangeSet = `changeset_${Utility.generateUUID()}`; + batchBody.push("Content-Type: multipart/mixed;boundary=" + currentChangeSet); } - batchBody.push("Content-Type: application/http"); - batchBody.push("Content-Transfer-Encoding: binary"); - if (inChangeSet) { - const contentIdValue = internalRequest.headers.hasOwnProperty("Content-ID") ? internalRequest.headers["Content-ID"] : ++contentId; - batchBody.push(`Content-ID: ${contentIdValue}`); - } - if (!((_a2 = internalRequest.path) == null ? void 0 : _a2.startsWith("$"))) { - batchBody.push(` + } + if (inChangeSet) { + batchBody.push(` +--${currentChangeSet}`); + } + batchBody.push("Content-Type: application/http"); + batchBody.push("Content-Transfer-Encoding: binary"); + if (inChangeSet) { + const contentIdValue = internalRequest.headers.hasOwnProperty("Content-ID") ? internalRequest.headers["Content-ID"] : ++contentId; + batchBody.push(`Content-ID: ${contentIdValue}`); + } + if (!((_a2 = internalRequest.path) == null ? void 0 : _a2.startsWith("$"))) { + batchBody.push(` ${internalRequest.method} ${config.dataApi.url}${internalRequest.path} HTTP/1.1`); - } else { - batchBody.push(` + } else { + batchBody.push(` ${internalRequest.method} ${internalRequest.path} HTTP/1.1`); - } - if (internalRequest.method === "GET") { - batchBody.push("Accept: application/json"); - } else { - batchBody.push("Content-Type: application/json"); - } - for (let key in internalRequest.headers) { - if (key === "Authorization" || key === "Content-ID") - continue; - batchBody.push(`${key}: ${internalRequest.headers[key]}`); - } - if (internalRequest.data) { - batchBody.push(` -${_RequestUtility.processData(internalRequest.data, config)}`); - } - }); - if (currentChangeSet) { + } + if (internalRequest.method === "GET") { + batchBody.push("Accept: application/json"); + } else { + batchBody.push("Content-Type: application/json"); + } + for (let key in internalRequest.headers) { + if (key === "Authorization" || key === "Content-ID") + continue; + batchBody.push(`${key}: ${internalRequest.headers[key]}`); + } + if (internalRequest.data) { batchBody.push(` ---${currentChangeSet}--`); +${processData(internalRequest.data, config)}`); } + }); + if (currentChangeSet) { batchBody.push(` +--${currentChangeSet}--`); + } + batchBody.push(` --${batchBoundary}--`); - const headers = _RequestUtility.setStandardHeaders(batchRequest == null ? void 0 : batchRequest.userHeaders); - headers["Content-Type"] = `multipart/mixed;boundary=${batchBoundary}`; - return { headers, body: batchBody.join("\n") }; - } - static findCollectionName(entityName) { - let collectionName = null; - if (!Utility.isNull(_RequestUtility.entityNames)) { - collectionName = _RequestUtility.entityNames[entityName]; - if (Utility.isNull(collectionName)) { - for (let key in _RequestUtility.entityNames) { - if (_RequestUtility.entityNames[key] === entityName) { - return entityName; - } + const headers = setStandardHeaders(batchRequest == null ? void 0 : batchRequest.userHeaders); + headers["Content-Type"] = `multipart/mixed;boundary=${batchBoundary}`; + return { headers, body: batchBody.join("\n") }; +}; +var findCollectionName = (entityName) => { + let collectionName = null; + if (!Utility.isNull(entityNames)) { + collectionName = entityNames[entityName]; + if (!collectionName) { + for (let key in entityNames) { + if (entityNames[key] === entityName) { + return entityName; } } } - return collectionName; } - static processData(data, config) { - let stringifiedData = null; - if (data) { - if (data instanceof Uint8Array || data instanceof Uint16Array || data instanceof Uint32Array) - return data; - stringifiedData = JSON.stringify(data, (key, value) => { - if (key.endsWith("@odata.bind") || key.endsWith("@odata.id")) { - if (typeof value === "string" && !value.startsWith("$")) { - if (/\(\{[\w\d-]+\}\)/g.test(value)) { - value = value.replace(/(.+)\(\{([\w\d-]+)\}\)/g, "$1($2)"); - } - if (config.useEntityNames) { - const regularExpression = /([\w_]+)(\([\d\w-]+\))$/; - const valueParts = regularExpression.exec(value); - if (valueParts && valueParts.length > 2) { - const collectionName = _RequestUtility.findCollectionName(valueParts[1]); - if (!Utility.isNull(collectionName)) { - value = value.replace(regularExpression, collectionName + "$2"); - } + return collectionName; +}; +var processData = (data, config) => { + let stringifiedData = null; + if (data) { + if (data instanceof Uint8Array || data instanceof Uint16Array || data instanceof Uint32Array) + return data; + stringifiedData = JSON.stringify(data, (key, value) => { + if (key.endsWith("@odata.bind") || key.endsWith("@odata.id")) { + if (typeof value === "string" && !value.startsWith("$")) { + if (/\(\{[\w\d-]+\}\)/g.test(value)) { + value = value.replace(/(.+)\(\{([\w\d-]+)\}\)/g, "$1($2)"); + } + if (config.useEntityNames) { + const regularExpression = /([\w_]+)(\([\d\w-]+\))$/; + const valueParts = regularExpression.exec(value); + if (valueParts && valueParts.length > 2) { + const collectionName = findCollectionName(valueParts[1]); + if (!Utility.isNull(collectionName)) { + value = value.replace(regularExpression, collectionName + "$2"); } } - if (!value.startsWith(config.dataApi.url)) { - if (key.endsWith("@odata.bind")) { - if (!value.startsWith("/")) { - value = "/" + value; - } - } else { - value = config.dataApi.url + value.replace(/^\//, ""); + } + if (!value.startsWith(config.dataApi.url)) { + if (key.endsWith("@odata.bind")) { + if (!value.startsWith("/")) { + value = "/" + value; } + } else { + value = config.dataApi.url + value.replace(/^\//, ""); } } - } else if (key.startsWith("oData") || key.endsWith("_Formatted") || key.endsWith("_NavigationProperty") || key.endsWith("_LogicalName")) { - value = void 0; } - return value; - }); - stringifiedData = stringifiedData.replace(/[\u007F-\uFFFF]/g, function(chr) { - return "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).slice(-4); - }); - } - return stringifiedData; - } - static setStandardHeaders(headers = {}) { - if (!headers["Accept"]) - headers["Accept"] = "application/json"; - if (!headers["OData-MaxVersion"]) - headers["OData-MaxVersion"] = "4.0"; - if (!headers["OData-Version"]) - headers["OData-Version"] = "4.0"; - if (headers["Content-Range"]) - headers["Content-Type"] = "application/octet-stream"; - else if (!headers["Content-Type"]) - headers["Content-Type"] = "application/json; charset=utf-8"; - return headers; + } else if (key.startsWith("oData") || key.endsWith("_Formatted") || key.endsWith("_NavigationProperty") || key.endsWith("_LogicalName")) { + value = void 0; + } + return value; + }); + stringifiedData = stringifiedData.replace(/[\u007F-\uFFFF]/g, function(chr) { + return "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).slice(-4); + }); } + return stringifiedData; +}; +var setStandardHeaders = (headers = {}) => { + if (!headers["Accept"]) + headers["Accept"] = "application/json"; + if (!headers["OData-MaxVersion"]) + headers["OData-MaxVersion"] = "4.0"; + if (!headers["OData-Version"]) + headers["OData-Version"] = "4.0"; + if (headers["Content-Range"]) + headers["Content-Type"] = "application/octet-stream"; + else if (!headers["Content-Type"]) + headers["Content-Type"] = "application/json; charset=utf-8"; + return headers; }; -_RequestUtility.entityNames = null; -var RequestUtility = _RequestUtility; // src/client/RequestClient.ts init_ErrorHelper(); @@ -1448,7 +1415,55 @@ var _runRequest = async (request, config) => { }; var _batchRequestCollection = {}; var _responseParseParams = {}; -var RequestClient = class _RequestClient { +var _nameExceptions = [ + "$metadata", + "EntityDefinitions", + "RelationshipDefinitions", + "GlobalOptionSetDefinitions", + "ManagedPropertyDefinitions", + "query", + "suggest", + "autocomplete" +]; +var _isEntityNameException = (entityName) => { + return _nameExceptions.indexOf(entityName) > -1; +}; +var _getCollectionNames = async (entityName, config) => { + if (!Utility.isNull(entityNames)) { + return findCollectionName(entityName) || entityName; + } + const request = compose( + { + method: "GET", + collection: "EntityDefinitions", + select: ["EntitySetName", "LogicalName"], + noCache: true, + functionName: "retrieveMultiple" + }, + config + ); + const result = await _runRequest(request, config); + setEntityNames({}); + for (let i = 0; i < result.data.value.length; i++) { + entityNames[result.data.value[i].LogicalName] = result.data.value[i].EntitySetName; + } + return findCollectionName(entityName) || entityName; +}; +var _checkCollectionName = async (entityName, config) => { + if (!entityName || _isEntityNameException(entityName)) { + return entityName; + } + entityName = entityName.toLowerCase(); + if (!config.useEntityNames) { + return entityName; + } + try { + return await _getCollectionNames(entityName, config); + } catch (error) { + throw new Error("Unable to fetch Collection Names. Error: " + error.message); + } +}; +var RequestClient = class { /** * Sends a request to given URL with given parameters * @@ -1467,14 +1482,14 @@ var RequestClient = class _RequestClient { const batchRequest = _batchRequestCollection[request.requestId]; if (!batchRequest) throw ErrorHelper.batchIsEmpty(); - const batchResult = RequestUtility.convertToBatch(batchRequest, config, request); + const batchResult = convertToBatch(batchRequest, config, request); processedData = batchResult.body; request.headers = { ...batchResult.headers, ...request.headers }; delete _batchRequestCollection[request.requestId]; } else { - processedData = !isBatchConverted ? RequestUtility.processData(request.data, config) : request.data; + processedData = !isBatchConverted ? processData(request.data, config) : request.data; if (!isBatchConverted) - request.headers = RequestUtility.setStandardHeaders(request.headers); + request.headers = setStandardHeaders(request.headers); } if (config.impersonate && !request.headers["MSCRMCallerID"]) { request.headers["MSCRMCallerID"] = config.impersonate; @@ -1499,74 +1514,29 @@ var RequestClient = class _RequestClient { method: request.method, uri: url.toString() + request.path, data: processedData, - additionalHeaders: request.headers, - responseParams: _responseParseParams, - isAsync: request.async, - timeout: request.timeout || config.timeout, proxy: config.proxy, + isAsync: request.async, + headers: request.headers, requestId: request.requestId, - abortSignal: request.signal + abortSignal: request.signal, + responseParams: _responseParseParams, + timeout: request.timeout || config.timeout }); } - static async _getCollectionNames(entityName, config) { - if (!Utility.isNull(RequestUtility.entityNames)) { - return RequestUtility.findCollectionName(entityName) || entityName; - } - const request = RequestUtility.compose( - { - method: "GET", - collection: "EntityDefinitions", - select: ["EntitySetName", "LogicalName"], - noCache: true, - functionName: "retrieveMultiple" - }, - config - ); - const result = await _runRequest(request, config); - RequestUtility.entityNames = {}; - for (let i = 0; i < result.data.value.length; i++) { - RequestUtility.entityNames[result.data.value[i].LogicalName] = result.data.value[i].EntitySetName; - } - return RequestUtility.findCollectionName(entityName) || entityName; - } - static _isEntityNameException(entityName) { - const exceptions = [ - "$metadata", - "EntityDefinitions", - "RelationshipDefinitions", - "GlobalOptionSetDefinitions", - "ManagedPropertyDefinitions", - "query", - "suggest", - "autocomplete" - ]; - return exceptions.indexOf(entityName) > -1; - } - static async _checkCollectionName(entityName, config) { - if (!entityName || _RequestClient._isEntityNameException(entityName)) { - return entityName; - } - entityName = entityName.toLowerCase(); - if (!config.useEntityNames) { - return entityName; - } - try { - return await _RequestClient._getCollectionNames(entityName, config); - } catch (error) { - throw new Error("Unable to fetch Collection Names. Error: " + error.message); - } - } static async makeRequest(request, config) { request.responseParameters = request.responseParameters || {}; request.userHeaders = request.headers; delete request.headers; if (!request.isBatch) { - const collectionName = await _RequestClient._checkCollectionName(request.collection, config); + const collectionName = await _checkCollectionName(request.collection, config); request.collection = collectionName; - RequestUtility.compose(request, config); + compose(request, config); request.responseParameters.convertedToBatch = false; if (request.path.length > 2e3) { - const batchRequest = RequestUtility.convertToBatch([request], config); + const batchRequest = convertToBatch([request], config); + if (request.headers["Authorization"]) { + batchRequest.headers["Authorization"] = request.headers["Authorization"]; + } request.method = "POST"; request.path = "$batch"; request.data = batchRequest.body; @@ -1575,17 +1545,17 @@ var RequestClient = class _RequestClient { } return _runRequest(request, config); } - RequestUtility.compose(request, config); + compose(request, config); _addResponseParams(request.requestId, request.responseParameters); _addRequestToBatchCollection(request.requestId, request); } static _clearTestData() { - RequestUtility.entityNames = null; + setEntityNames(null); _responseParseParams = {}; _batchRequestCollection = {}; } static getCollectionName(entityName) { - return RequestUtility.findCollectionName(entityName); + return findCollectionName(entityName); } }; @@ -2059,7 +2029,7 @@ var DynamicsWebApi = class _DynamicsWebApi { ErrorHelper.stringParameterCheck(functionName, `DynamicsWebApi.callFunction`, parameterName); const functionParameters = Utility.buildFunctionParameters(internalRequest.parameters); internalRequest.method = "GET"; - internalRequest._additionalUrl = functionName + functionParameters.key; + internalRequest.addPath = functionName + functionParameters.key; internalRequest.queryParams = functionParameters.queryParams; internalRequest._isUnboundRequest = !internalRequest.collection; internalRequest.functionName = "callFunction"; @@ -2078,7 +2048,7 @@ var DynamicsWebApi = class _DynamicsWebApi { const internalRequest = Utility.copyRequest(request, ["action"]); internalRequest.method = "POST"; internalRequest.functionName = "callAction"; - internalRequest._additionalUrl = request.actionName; + internalRequest.addPath = request.actionName; internalRequest._isUnboundRequest = !internalRequest.collection; internalRequest.data = request.action; const response = await this._makeRequest(internalRequest); diff --git a/dist/esm/dynamics-web-api.mjs.map b/dist/esm/dynamics-web-api.mjs.map index 221a28e..ed861bb 100644 --- a/dist/esm/dynamics-web-api.mjs.map +++ b/dist/esm/dynamics-web-api.mjs.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../src/helpers/crypto/node.ts", "../../src/helpers/Crypto.ts", "../../src/helpers/Regex.ts", "../../src/utils/Utility.ts", "../../src/helpers/ErrorHelper.ts", "../../src/dwa.ts", "../../src/client/helpers/dateReviver.ts", "../../src/client/helpers/parseResponse.ts", "../../src/client/http.ts", "../../src/utils/Config.ts", "../../src/dynamics-web-api.ts", "../../src/client/RequestClient.ts", "../../src/utils/Request.ts", "../../src/client/helpers/executeRequest.ts"], - "sourcesContent": ["//had to move getCrypto for node to a different local module,\r\n//because esbuild does not support external require in esm format\r\nimport nCrypto from \"node:crypto\";\r\n\r\nexport function getCrypto () {\r\n return nCrypto;\r\n}", "export function getCrypto(): T {\r\n return global.DWA_BROWSER ? global.window.crypto : require(\"./crypto/node\").getCrypto();\r\n}\r\n\r\nexport function generateRandomBytes() {\r\n return global.DWA_BROWSER ? getCrypto().getRandomValues(new Uint8Array(1)) : getCrypto().randomBytes(1);\r\n}\r\n", "const uuid = \"[0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12}\";\r\n\r\nexport function isUuid(value: string): boolean {\r\n const match = new RegExp(uuid, \"i\").exec(value);\r\n return !!match;\r\n}\r\n\r\nexport function extractUuid(value: string): string | null {\r\n const match = new RegExp(\"^{?(\" + uuid + \")}?$\", \"i\").exec(value);\r\n return match ? match[1] : null;\r\n}\r\n\r\nexport function extractUuidFromUrl(url: string): string | null {\r\n const match = new RegExp(\"(\" + uuid + \")\\\\)$\", \"i\").exec(url);\r\n return match ? match[1] : null;\r\n}\r\n", "\uFEFFimport { Core } from \"../types\";\r\nimport { generateRandomBytes } from \"../helpers/Crypto\";\r\nimport { isUuid, extractUuid } from \"../helpers/Regex\";\r\n\r\ndeclare var GetGlobalContext: any;\r\ndeclare var Xrm: any;\r\n\r\n// function isNodeEnv(): boolean {\r\n// // tslint:disable:strict-type-predicates\r\n// return Object.prototype.toString.call(typeof process !== \"undefined\" ? process : 0) === \"[object process]\";\r\n// }\r\n\r\n// function getGlobalObject(): T {\r\n// return (isNodeEnv() ? global : typeof window !== \"undefined\" ? window : typeof self !== \"undefined\" ? self : {}) as T;\r\n// }\r\n\r\nconst downloadChunkSize = 4194304;\r\n\r\nexport class Utility {\r\n /**\r\n * Builds parametes for a funciton. Returns '()' (if no parameters) or '([params])?[query]'\r\n *\r\n * @param {Object} [parameters] - Function's input parameters. Example: { param1: \"test\", param2: 3 }.\r\n * @returns {string}\r\n */\r\n static buildFunctionParameters(parameters?: any): Core.FunctionParameters {\r\n if (parameters) {\r\n const parameterNames = Object.keys(parameters);\r\n const functionParams: string[] = [];\r\n const urlQuery: string[] = [];\r\n\r\n for (let i = 1; i <= parameterNames.length; i++) {\r\n const parameterName = parameterNames[i - 1];\r\n let value = parameters[parameterName];\r\n\r\n if (value == null) continue;\r\n\r\n if (typeof value === \"string\" && !value.startsWith(\"Microsoft.Dynamics.CRM\") && !isUuid(value)) {\r\n value = `'${value}'`;\r\n } else if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n\r\n functionParams.push(`${parameterName}=@p${i}`);\r\n urlQuery.push(`@p${i}=${extractUuid(value) || value}`);\r\n }\r\n\r\n return {\r\n key: `(${functionParams.join(\",\")})`,\r\n queryParams: urlQuery,\r\n };\r\n } else {\r\n return {\r\n key: \"()\",\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Parses a paging cookie returned in response\r\n *\r\n * @param {string} pageCookies - Page cookies returned in @Microsoft.Dynamics.CRM.fetchxmlpagingcookie.\r\n * @param {number} currentPageNumber - A current page number. Fix empty paging-cookie for complex fetch xmls.\r\n * @returns {{cookie: \"\", number: 0, next: 1}}\r\n */\r\n static getFetchXmlPagingCookie(pageCookies: string = \"\", currentPageNumber: number = 1): Core.FetchXmlCookie {\r\n //get the page cokies\r\n pageCookies = decodeURIComponent(decodeURIComponent(pageCookies));\r\n\r\n const info = /pagingcookie=\"()/.exec(pageCookies);\r\n\r\n if (info != null) {\r\n let page = parseInt(info[2]);\r\n return {\r\n cookie: info[1]\r\n .replace(//g, \">\")\r\n .replace(/\\\"/g, \"'\")\r\n .replace(/\\'/g, \"&\" + \"quot;\"),\r\n page: page,\r\n nextPage: page + 1,\r\n };\r\n } else {\r\n //http://stackoverflow.com/questions/41262772/execution-of-fetch-xml-using-web-api-dynamics-365 workaround\r\n return {\r\n cookie: \"\",\r\n page: currentPageNumber,\r\n nextPage: currentPageNumber + 1,\r\n };\r\n }\r\n }\r\n\r\n // static isNodeEnv = isNodeEnv;\r\n\r\n static downloadChunkSize = downloadChunkSize;\r\n\r\n /**\r\n * Converts a response to a reference object\r\n *\r\n * @param {Object} responseData - Response object\r\n * @returns {ReferenceObject}\r\n */\r\n static convertToReferenceObject(responseData: any): Core.ReferenceObject {\r\n const result = /\\/(\\w+)\\(([0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12})/i.exec(responseData[\"@odata.id\"]);\r\n return { id: result![2], collection: result![1], oDataContext: responseData[\"@odata.context\"] };\r\n }\r\n\r\n /**\r\n * Checks whether the value is JS Null.\r\n * @param {Object} value\r\n * @returns {boolean}\r\n */\r\n static isNull(value: any): boolean {\r\n return typeof value === \"undefined\" || value == null;\r\n }\r\n\r\n /** Generates UUID */\r\n static generateUUID(): string {\r\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) => (c ^ (generateRandomBytes()[0] & (15 >> (c / 4)))).toString(16));\r\n }\r\n\r\n static getXrmContext(): any {\r\n if (typeof GetGlobalContext !== \"undefined\") {\r\n return GetGlobalContext();\r\n } else {\r\n if (typeof Xrm !== \"undefined\") {\r\n //d365 v.9.0\r\n if (!Utility.isNull(Xrm.Utility) && !Utility.isNull(Xrm.Utility.getGlobalContext)) {\r\n return Xrm.Utility.getGlobalContext();\r\n } else if (!Utility.isNull(Xrm.Page) && !Utility.isNull(Xrm.Page.context)) {\r\n return Xrm.Page.context;\r\n }\r\n }\r\n }\r\n\r\n throw new Error(\r\n \"Xrm Context is not available. In most cases, it can be resolved by adding a reference to a ClientGlobalContext.js.aspx. Please refer to MSDN documentation for more details.\"\r\n );\r\n }\r\n\r\n // static getXrmUtility(): any {\r\n // return typeof Xrm !== \"undefined\" ? Xrm.Utility : null;\r\n // }\r\n\r\n static getClientUrl(): string {\r\n const context = Utility.getXrmContext();\r\n\r\n let clientUrl = context.getClientUrl();\r\n\r\n if (clientUrl.match(/\\/$/)) {\r\n clientUrl = clientUrl.substring(0, clientUrl.length - 1);\r\n }\r\n return clientUrl;\r\n }\r\n\r\n /**\r\n * Checks whether the app is currently running in a Dynamics Portals Environment.\r\n *\r\n * In that case we switch to the Web API for Dynamics Portals.\r\n * @returns {boolean}\r\n */\r\n static isRunningWithinPortals(): boolean {\r\n return global.DWA_BROWSER ? !!global.window.shell : false;\r\n }\r\n\r\n static isObject(obj: any): boolean {\r\n return typeof obj === \"object\" && !!obj && !Array.isArray(obj) && Object.prototype.toString.call(obj) !== \"[object Date]\";\r\n }\r\n\r\n static copyObject(src: any, excludeProps?: string[]): T {\r\n let target = {};\r\n for (let prop in src) {\r\n if (src.hasOwnProperty(prop) && !excludeProps?.includes(prop)) {\r\n // if the value is a nested object, recursively copy all its properties\r\n if (Utility.isObject(src[prop])) {\r\n target[prop] = Utility.copyObject(src[prop]);\r\n } else if (Array.isArray(src[prop])) {\r\n target[prop] = src[prop].slice();\r\n } else {\r\n target[prop] = src[prop];\r\n }\r\n }\r\n }\r\n return target;\r\n }\r\n\r\n static copyRequest(src: any, excludeProps: string[] = []): Core.InternalRequest {\r\n //todo: do we need to include \"data\" in here?\r\n if (!excludeProps.includes(\"signal\")) excludeProps.push(\"signal\");\r\n\r\n const result = Utility.copyObject(src, excludeProps);\r\n result.signal = src.signal;\r\n\r\n return result;\r\n }\r\n\r\n static setFileChunk(request: Core.InternalRequest, fileBuffer: Uint8Array | Buffer, chunkSize: number, offset: number): void {\r\n offset = offset || 0;\r\n\r\n const count = offset + chunkSize > fileBuffer.length ? fileBuffer.length % chunkSize : chunkSize;\r\n\r\n let content: any;\r\n\r\n if (global.DWA_BROWSER) {\r\n content = new Uint8Array(count);\r\n for (let i = 0; i < count; i++) {\r\n content[i] = fileBuffer[offset + i];\r\n }\r\n } else {\r\n content = fileBuffer.slice(offset, offset + count);\r\n }\r\n\r\n request.data = content;\r\n request.contentRange = \"bytes \" + offset + \"-\" + (offset + count - 1) + \"/\" + fileBuffer.length;\r\n }\r\n\r\n static convertToFileBuffer(binaryString: string): Uint8Array | Buffer {\r\n if (!global.DWA_BROWSER) return Buffer.from(binaryString, \"binary\");\r\n\r\n const bytes = new Uint8Array(binaryString.length);\r\n for (var i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n return bytes;\r\n }\r\n}\r\n", "\uFEFFimport { AccessToken } from \"../dynamics-web-api\";\r\nimport { extractUuid } from \"./Regex\";\r\n\r\nexport interface DynamicsWebApiError extends Error {\r\n status: number;\r\n}\r\n\r\nfunction throwParameterError(functionName: string, parameterName: string, type: string | null | undefined): void {\r\n throw new Error(\r\n type ? `${functionName} requires a ${parameterName} parameter to be of type ${type}.` : `${functionName} requires a ${parameterName} parameter.`\r\n );\r\n}\r\n\r\nexport class ErrorHelper {\r\n static handleErrorResponse(req): void {\r\n throw new Error(`Error: ${req.status}: ${req.message}`);\r\n }\r\n\r\n static parameterCheck(parameter: any, functionName: string, parameterName: string, type?: string): void {\r\n if (typeof parameter === \"undefined\" || parameter === null || parameter === \"\") {\r\n throwParameterError(functionName, parameterName, type);\r\n }\r\n }\r\n\r\n static stringParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter !== \"string\") {\r\n throwParameterError(functionName, parameterName, \"String\");\r\n }\r\n }\r\n\r\n static maxLengthStringParameterCheck(parameter: string | null, functionName: string, parameterName: string, maxLength: number): void {\r\n if (!parameter) return;\r\n\r\n if (parameter.length > maxLength) {\r\n throw new Error(`${parameterName} has a ${maxLength} character limit.`);\r\n }\r\n }\r\n\r\n static arrayParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (parameter.constructor !== Array) {\r\n throwParameterError(functionName, parameterName, \"Array\");\r\n }\r\n }\r\n\r\n static stringOrArrayParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (parameter.constructor !== Array && typeof parameter !== \"string\") {\r\n throwParameterError(functionName, parameterName, \"String or Array\");\r\n }\r\n }\r\n\r\n static numberParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter != \"number\") {\r\n if (typeof parameter === \"string\" && parameter) {\r\n if (!isNaN(parseInt(parameter))) {\r\n return;\r\n }\r\n }\r\n throwParameterError(functionName, parameterName, \"Number\");\r\n }\r\n }\r\n\r\n static batchIsEmpty(): Error[] {\r\n return [\r\n new Error(\r\n \"Payload of the batch operation is empty. Please make that you have other operations in between startBatch() and executeBatch() to successfuly build a batch payload.\"\r\n ),\r\n ];\r\n }\r\n\r\n static handleHttpError(parsedError: any, parameters?: any): DynamicsWebApiError {\r\n const error = new Error();\r\n\r\n Object.keys(parsedError).forEach((k) => {\r\n error[k] = parsedError[k];\r\n });\r\n\r\n if (parameters) {\r\n Object.keys(parameters).forEach((k) => {\r\n error[k] = parameters[k];\r\n });\r\n }\r\n\r\n return error;\r\n }\r\n\r\n static boolParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter != \"boolean\") {\r\n throwParameterError(functionName, parameterName, \"Boolean\");\r\n }\r\n }\r\n\r\n /**\r\n * Private function used to check whether required parameter is a valid GUID\r\n * @param parameter The GUID parameter to check\r\n * @param functionName\r\n * @param parameterName\r\n * @returns\r\n */\r\n static guidParameterCheck(parameter: any, functionName: string, parameterName: string): string {\r\n const match = extractUuid(parameter);\r\n if (!match) throwParameterError(functionName, parameterName, \"GUID String\");\r\n\r\n return match!;\r\n }\r\n\r\n static keyParameterCheck(parameter: any, functionName: string, parameterName: string): string | undefined {\r\n try {\r\n ErrorHelper.stringParameterCheck(parameter, functionName, parameterName);\r\n\r\n //check if the param is a guid\r\n const match = extractUuid(parameter);\r\n if (match) return match;\r\n\r\n //check the alternate key\r\n const alternateKeys = parameter.split(\",\");\r\n\r\n if (alternateKeys.length) {\r\n for (let i = 0; i < alternateKeys.length; i++) {\r\n alternateKeys[i] = alternateKeys[i].trim().replace(/\"/g, \"'\");\r\n /^[\\w\\d\\_]+\\=(.+)$/i.exec(alternateKeys[i])![0];\r\n }\r\n }\r\n\r\n return alternateKeys.join(\",\");\r\n } catch (error) {\r\n throwParameterError(functionName, parameterName, \"String representing GUID or Alternate Key\");\r\n }\r\n }\r\n\r\n static callbackParameterCheck(callbackParameter: () => Promise, functionName: string, parameterName: string): void {\r\n if (typeof callbackParameter != \"function\") {\r\n throwParameterError(functionName, parameterName, \"Function\");\r\n }\r\n }\r\n\r\n static throwBatchIncompatible(functionName: string, isBatch: boolean): void {\r\n if (isBatch) {\r\n isBatch = false;\r\n throw new Error(functionName + \" cannot be used in a BATCH request.\");\r\n }\r\n }\r\n\r\n static throwBatchNotStarted(isBatch: boolean): void {\r\n if (!isBatch) {\r\n throw new Error(\r\n \"Batch operation has not been started. Please call a DynamicsWebApi.startBatch() function prior to calling DynamicsWebApi.executeBatch() to perform a batch request correctly.\"\r\n );\r\n }\r\n }\r\n}\r\n", "class DWA {\r\n\tstatic Prefer = class {\r\n\t\tstatic ReturnRepresentation: string = \"return=representation\";\r\n\t\tstatic Annotations = class {\r\n\t\t\tstatic AssociatedNavigationProperty: string = \"Microsoft.Dynamics.CRM.associatednavigationproperty\";\r\n\t\t\tstatic LookupLogicalName: string = \"Microsoft.Dynamics.CRM.lookuplogicalname\";\r\n\t\t\tstatic All: string = \"*\";\r\n\t\t\tstatic FormattedValue: string = \"OData.Community.Display.V1.FormattedValue\";\r\n\t\t\tstatic FetchXmlPagingCookie: string = \"Microsoft.Dynamics.CRM.fetchxmlpagingcookie\";\r\n\t\t};\r\n\t\tstatic IncludeAnnotations: string = \"odata.include-annotations\";\r\n\t\tstatic get(annotation: string) {\r\n\t\t\treturn `${DWA.Prefer.IncludeAnnotations}=\"${annotation}\"`;\r\n\t\t}\r\n\t};\r\n}\r\n\r\nexport { DWA };\r\n", "\uFEFFexport function dateReviver(key: string, value: any): Date {\r\n\tif (typeof value === \"string\") {\r\n\t\tconst a = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:Z|[-+]\\d{2}:\\d{2})$/.exec(value);\r\n\t\tif (a) {\r\n\t\t\treturn new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));\r\n\t\t}\r\n\t}\r\n\treturn value;\r\n}\r\n", "\uFEFFimport { DWA } from \"../../dwa\";\r\nimport { Utility } from \"../../utils/Utility\";\r\nimport { ErrorHelper, DynamicsWebApiError } from \"../../helpers/ErrorHelper\";\r\nimport { dateReviver } from \"./dateReviver\";\r\nimport { Core } from \"../../types\";\r\nimport { extractUuidFromUrl } from \"../../helpers/Regex\";\r\n\r\nfunction getFormattedKeyValue(keyName: string, value: any): any[] {\r\n let newKey: string | null = null;\r\n if (keyName.indexOf(\"@\") !== -1) {\r\n const format = keyName.split(\"@\");\r\n switch (format[1]) {\r\n case \"odata.context\":\r\n newKey = \"oDataContext\";\r\n break;\r\n case \"odata.count\":\r\n newKey = \"oDataCount\";\r\n value = value != null ? parseInt(value) : 0;\r\n break;\r\n case \"odata.nextLink\":\r\n newKey = \"oDataNextLink\";\r\n break;\r\n case \"odata.deltaLink\":\r\n newKey = \"oDataDeltaLink\";\r\n break;\r\n case DWA.Prefer.Annotations.FormattedValue:\r\n newKey = format[0] + \"_Formatted\";\r\n break;\r\n case DWA.Prefer.Annotations.AssociatedNavigationProperty:\r\n newKey = format[0] + \"_NavigationProperty\";\r\n break;\r\n case DWA.Prefer.Annotations.LookupLogicalName:\r\n newKey = format[0] + \"_LogicalName\";\r\n break;\r\n }\r\n }\r\n\r\n return [newKey, value];\r\n}\r\n\r\n/**\r\n *\r\n * @param {any} object - parsed JSON object\r\n * @param {any} parseParams - parameters for parsing the response\r\n * @returns {any} parsed batch response\r\n */\r\nfunction parseData(object: any, parseParams?: any): any {\r\n if (parseParams) {\r\n if (parseParams.isRef && object[\"@odata.id\"] != null) {\r\n return Utility.convertToReferenceObject(object);\r\n }\r\n\r\n if (parseParams.toCount) {\r\n return getFormattedKeyValue(\"@odata.count\", object[\"@odata.count\"])[1] || 0;\r\n }\r\n }\r\n\r\n const keys = Object.keys(object);\r\n\r\n for (let i = 0; i < keys.length; i++) {\r\n const currentKey = keys[i];\r\n\r\n if (object[currentKey] != null) {\r\n if (object[currentKey].constructor === Array) {\r\n for (var j = 0; j < object[currentKey].length; j++) {\r\n object[currentKey][j] = parseData(object[currentKey][j]);\r\n }\r\n } else if (typeof object[currentKey] === \"object\") {\r\n parseData(object[currentKey]);\r\n }\r\n }\r\n\r\n //parse formatted values\r\n let formattedKeyValue = getFormattedKeyValue(currentKey, object[currentKey]);\r\n if (formattedKeyValue[0]) {\r\n object[formattedKeyValue[0]] = formattedKeyValue[1];\r\n }\r\n\r\n //parse aliased values\r\n if (currentKey.indexOf(\"_x002e_\") !== -1) {\r\n const aliasKeys = currentKey.split(\"_x002e_\");\r\n\r\n if (!object.hasOwnProperty(aliasKeys[0])) {\r\n object[aliasKeys[0]] = { _dwaType: \"alias\" };\r\n }\r\n //throw an error if there is already a property which is not an 'alias'\r\n else if (\r\n typeof object[aliasKeys[0]] !== \"object\" ||\r\n (typeof object[aliasKeys[0]] === \"object\" && !object[aliasKeys[0]].hasOwnProperty(\"_dwaType\"))\r\n ) {\r\n throw new Error(\"The alias name of the linked entity must be unique!\");\r\n }\r\n\r\n object[aliasKeys[0]][aliasKeys[1]] = object[currentKey];\r\n\r\n //aliases also contain formatted values\r\n formattedKeyValue = getFormattedKeyValue(aliasKeys[1], object[currentKey]);\r\n if (formattedKeyValue[0]) {\r\n object[aliasKeys[0]][formattedKeyValue[0]] = formattedKeyValue[1];\r\n }\r\n }\r\n }\r\n\r\n if (parseParams) {\r\n if (parseParams.hasOwnProperty(\"pageNumber\") && object[\"@\" + DWA.Prefer.Annotations.FetchXmlPagingCookie] != null) {\r\n object.PagingInfo = Utility.getFetchXmlPagingCookie(object[\"@\" + DWA.Prefer.Annotations.FetchXmlPagingCookie], parseParams.pageNumber);\r\n }\r\n }\r\n\r\n return object;\r\n}\r\n\r\nconst responseHeaderRegex = /^([^()<>@,;:\\\\\"\\/[\\]?={} \\t]+)\\s?:\\s?(.*)/;\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction parseBatchHeaders(text: string): any {\r\n const ctx = { position: 0 };\r\n const headers = {};\r\n let parts;\r\n let line;\r\n let pos;\r\n\r\n do {\r\n pos = ctx.position;\r\n line = readLine(text, ctx);\r\n parts = responseHeaderRegex.exec(line);\r\n if (parts !== null) {\r\n headers[parts[1].toLowerCase()] = parts[2];\r\n } else {\r\n // Whatever was found is not a header, so reset the context position.\r\n ctx.position = pos;\r\n }\r\n } while (line && parts);\r\n\r\n return headers;\r\n}\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction readLine(text: string, ctx: { position: number }): string | null {\r\n return readTo(text, ctx, \"\\r\\n\");\r\n}\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction readTo(text: string, ctx: { position: number }, str: string): string | null {\r\n const start = ctx.position || 0;\r\n let end = text.length;\r\n if (str) {\r\n end = text.indexOf(str, start);\r\n if (end === -1) {\r\n return null;\r\n }\r\n ctx.position = end + str.length;\r\n } else {\r\n ctx.position = end;\r\n }\r\n\r\n return text.substring(start, end);\r\n}\r\n\r\n//partially taken from https://github.com/emiltholin/google-api-batch-utils\r\n/**\r\n *\r\n * @param {string} response - response that needs to be parsed\r\n * @param {Array} parseParams - parameters for parsing the response\r\n * @param {Number} [requestNumber] - number of the request\r\n * @returns {any} parsed batch response\r\n */\r\nfunction parseBatchResponse(response: string, parseParams: any, requestNumber: number = 0): (string | undefined | DynamicsWebApiError | Number)[] {\r\n // Not the same delimiter in the response as we specify ourselves in the request,\r\n // so we have to extract it.\r\n const delimiter = response.substr(0, response.indexOf(\"\\r\\n\"));\r\n const batchResponseParts = response.split(delimiter);\r\n // The first part will always be an empty string. Just remove it.\r\n batchResponseParts.shift();\r\n // The last part will be the \"--\". Just remove it.\r\n batchResponseParts.pop();\r\n\r\n let result: (string | undefined | DynamicsWebApiError | Number)[] = [];\r\n for (let i = 0; i < batchResponseParts.length; i++) {\r\n let batchResponse = batchResponseParts[i];\r\n if (batchResponse.indexOf(\"--changesetresponse_\") > -1) {\r\n batchResponse = batchResponse.trim();\r\n const batchToProcess = batchResponse.substring(batchResponse.indexOf(\"\\r\\n\") + 1).trim();\r\n\r\n result = result.concat(parseBatchResponse(batchToProcess, parseParams, requestNumber));\r\n } else {\r\n //check http status\r\n const httpStatusReg = /HTTP\\/?\\s*[\\d.]*\\s+(\\d{3})\\s+([\\w\\s]*)$/gm.exec(batchResponse);\r\n //todo: add error handler for httpStatus and httpStatusMessage; remove \"!\" operator\r\n const httpStatus = parseInt(httpStatusReg![1]);\r\n const httpStatusMessage = httpStatusReg![2].trim();\r\n\r\n const responseData = batchResponse.substring(batchResponse.indexOf(\"{\"), batchResponse.lastIndexOf(\"}\") + 1);\r\n\r\n if (!responseData) {\r\n if (/Content-Type: text\\/plain/i.test(batchResponse)) {\r\n const plainContentReg = /\\w+$/gi.exec(batchResponse.trim());\r\n const plainContent = plainContentReg && plainContentReg.length ? plainContentReg[0] : undefined;\r\n\r\n //check if a plain content is a number or not\r\n result.push(isNaN(Number(plainContent)) ? plainContent : Number(plainContent));\r\n } else {\r\n if (parseParams.length && parseParams[requestNumber] && parseParams[requestNumber].hasOwnProperty(\"valueIfEmpty\")) {\r\n result.push(parseParams[requestNumber].valueIfEmpty);\r\n } else {\r\n const entityUrl = /OData-EntityId.+/i.exec(batchResponse);\r\n\r\n if (entityUrl && entityUrl.length) {\r\n const guidResult = extractUuidFromUrl(entityUrl[0]);\r\n result.push(guidResult ? guidResult : undefined);\r\n } else {\r\n result.push(undefined);\r\n }\r\n }\r\n }\r\n } else {\r\n const parsedResponse = parseData(JSON.parse(responseData, dateReviver), parseParams[requestNumber]);\r\n\r\n if (httpStatus >= 400) {\r\n const responseHeaders = parseBatchHeaders(\r\n //todo: add error handler for httpStatusReg; remove \"!\" operator\r\n batchResponse.substring(batchResponse.indexOf(httpStatusReg![0]) + httpStatusReg![0].length + 1, batchResponse.indexOf(\"{\"))\r\n );\r\n\r\n result.push(\r\n ErrorHelper.handleHttpError(parsedResponse, {\r\n status: httpStatus,\r\n statusText: httpStatusMessage,\r\n statusMessage: httpStatusMessage,\r\n headers: responseHeaders,\r\n })\r\n );\r\n } else {\r\n result.push(parsedResponse);\r\n }\r\n }\r\n }\r\n\r\n requestNumber++;\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction base64ToString(base64: string): string {\r\n return global.DWA_BROWSER ? global.window.atob(base64) : Buffer.from(base64, \"base64\").toString(\"binary\");\r\n}\r\n\r\nfunction parseFileResponse(response: any, responseHeaders: any, parseParams: any): Core.FileParseResult {\r\n let data = response;\r\n\r\n if (parseParams.hasOwnProperty(\"parse\")) {\r\n data = JSON.parse(data).value;\r\n data = base64ToString(data);\r\n }\r\n\r\n var parseResult: Core.FileParseResult = {\r\n value: data,\r\n };\r\n\r\n if (responseHeaders[\"x-ms-file-name\"]) parseResult.fileName = responseHeaders[\"x-ms-file-name\"];\r\n\r\n if (responseHeaders[\"x-ms-file-size\"]) parseResult.fileSize = parseInt(responseHeaders[\"x-ms-file-size\"]);\r\n\r\n if (hasHeader(responseHeaders, \"Location\")) parseResult.location = getHeader(responseHeaders, \"Location\");\r\n\r\n return parseResult;\r\n}\r\n\r\nfunction hasHeader(headers: any, name: string): boolean {\r\n return headers.hasOwnProperty(name) || headers.hasOwnProperty(name.toLowerCase());\r\n}\r\n\r\nfunction getHeader(headers: any, name: string): string {\r\n if (headers[name]) return headers[name];\r\n\r\n return headers[name.toLowerCase()];\r\n}\r\n\r\n/**\r\n *\r\n * @param {string} response - response that needs to be parsed\r\n * @param {Array} responseHeaders - response headers\r\n * @param {Array} parseParams - parameters for parsing the response\r\n * @returns {any} parsed response\r\n */\r\nexport function parseResponse(response: string, responseHeaders: any, parseParams: any[]): any {\r\n let parseResult: any = undefined;\r\n if (response.length) {\r\n if (response.indexOf(\"--batchresponse_\") > -1) {\r\n const batch = parseBatchResponse(response, parseParams);\r\n\r\n parseResult = parseParams.length === 1 && parseParams[0].convertedToBatch ? batch[0] : batch;\r\n } else {\r\n if (hasHeader(responseHeaders, \"Content-Disposition\")) {\r\n parseResult = parseFileResponse(response, responseHeaders, parseParams[0]);\r\n } else {\r\n const contentType = getHeader(responseHeaders, \"Content-Type\");\r\n if (contentType.startsWith(\"application/json\")) {\r\n parseResult = parseData(JSON.parse(response, dateReviver), parseParams[0]);\r\n } else {\r\n parseResult = isNaN(Number(response)) ? response : Number(response);\r\n }\r\n }\r\n }\r\n } else {\r\n if (parseParams.length && parseParams[0].hasOwnProperty(\"valueIfEmpty\")) {\r\n parseResult = parseParams[0].valueIfEmpty;\r\n } else if (hasHeader(responseHeaders, \"OData-EntityId\")) {\r\n const entityUrl = getHeader(responseHeaders, \"OData-EntityId\");\r\n\r\n const guidResult = extractUuidFromUrl(entityUrl);\r\n\r\n if (guidResult) {\r\n parseResult = guidResult;\r\n }\r\n } else if (hasHeader(responseHeaders, \"Location\")) {\r\n parseResult = {\r\n location: getHeader(responseHeaders, \"Location\"),\r\n };\r\n\r\n if (responseHeaders[\"x-ms-chunk-size\"]) parseResult.chunkSize = parseInt(responseHeaders[\"x-ms-chunk-size\"]);\r\n }\r\n }\r\n\r\n return parseResult;\r\n}\r\n", "\uFEFFimport * as http from \"http\";\r\nimport * as https from \"https\";\r\nimport HttpProxyAgent from \"http-proxy-agent\";\r\nimport HttpsProxyAgent from \"https-proxy-agent\";\r\nimport { Core } from \"../types\";\r\nimport { ErrorHelper } from \"./../helpers/ErrorHelper\";\r\nimport { parseResponse } from \"./helpers/parseResponse\";\r\n\r\nconst agents: { [key: string]: http.Agent } = {};\r\n\r\nconst getAgent = (options: Core.RequestOptions, protocol: string): http.Agent => {\r\n const isHttp = protocol === \"http\";\r\n const proxy = options.proxy;\r\n const agentName = proxy ? proxy.url : protocol;\r\n\r\n if (!agents[agentName]) {\r\n if (proxy) {\r\n const parsedProxyUrl = new URL(proxy.url);\r\n const proxyAgent = isHttp ? HttpProxyAgent.HttpProxyAgent : HttpsProxyAgent.HttpsProxyAgent;\r\n\r\n const proxyOptions: HttpProxyAgent.HttpProxyAgentOptions | HttpsProxyAgent.HttpsProxyAgentOptions = {\r\n host: parsedProxyUrl.hostname,\r\n port: parsedProxyUrl.port,\r\n protocol: parsedProxyUrl.protocol,\r\n };\r\n\r\n if (proxy.auth) proxyOptions.auth = proxy.auth.username + \":\" + proxy.auth.password;\r\n else if (parsedProxyUrl.username && parsedProxyUrl.password) proxyOptions.auth = `${parsedProxyUrl.username}:${parsedProxyUrl.password}`;\r\n\r\n agents[agentName] = new proxyAgent(proxyOptions);\r\n } else {\r\n const protocolInterface = isHttp ? http : https;\r\n\r\n agents[agentName] = new protocolInterface.Agent({\r\n keepAlive: true,\r\n maxSockets: Infinity,\r\n });\r\n }\r\n }\r\n\r\n return agents[agentName];\r\n};\r\n\r\nexport function executeRequest(options: Core.RequestOptions): Promise {\r\n return new Promise((resolve, reject) => {\r\n _executeRequest(options, resolve, reject);\r\n });\r\n}\r\n\r\n/**\r\n * Sends a request to given URL with given parameters\r\n *\r\n */\r\nfunction _executeRequest(\r\n options: Core.RequestOptions,\r\n successCallback: (response: Core.WebApiResponse) => void,\r\n errorCallback: (error: Core.WebApiErrorResponse | Core.WebApiErrorResponse[]) => void\r\n) {\r\n const data = options.data;\r\n const additionalHeaders = options.additionalHeaders;\r\n const responseParams = options.responseParams;\r\n const signal = options.abortSignal;\r\n\r\n const headers: http.OutgoingHttpHeaders = {};\r\n\r\n if (data) {\r\n headers[\"Content-Type\"] = additionalHeaders[\"Content-Type\"];\r\n headers[\"Content-Length\"] = data.length;\r\n\r\n delete additionalHeaders[\"Content-Type\"];\r\n }\r\n\r\n //set additional headers\r\n for (let key in additionalHeaders) {\r\n headers[key] = additionalHeaders[key];\r\n }\r\n const parsedUrl = new URL(options.uri);\r\n const protocol = parsedUrl.protocol?.slice(0, -1) || \"https\";\r\n const protocolInterface = protocol === \"http\" ? http : https;\r\n\r\n const internalOptions: http.RequestOptions = {\r\n hostname: parsedUrl.hostname,\r\n port: parsedUrl.port,\r\n path: parsedUrl.pathname + parsedUrl.search,\r\n method: options.method,\r\n timeout: options.timeout || 0,\r\n headers: headers,\r\n signal: signal,\r\n };\r\n\r\n //support environment variables\r\n if (!options.proxy && process.env[`${protocol}_proxy`]) {\r\n options.proxy = {\r\n url: process.env[`${protocol}_proxy`]!,\r\n };\r\n }\r\n\r\n internalOptions.agent = getAgent(options, protocol);\r\n\r\n if (options.proxy) {\r\n const hostHeader = new URL(options.proxy.url).host;\r\n if (hostHeader) headers.host = hostHeader;\r\n }\r\n\r\n const request = protocolInterface.request(internalOptions, function (res) {\r\n let rawData = \"\";\r\n res.setEncoding(\"utf8\");\r\n res.on(\"data\", function (chunk) {\r\n rawData += chunk;\r\n });\r\n res.on(\"end\", function () {\r\n switch (res.statusCode) {\r\n case 200: // Success with content returned in response body.\r\n case 201: // Success with content returned in response body.\r\n case 204: // Success with no content returned in response body.\r\n case 206: //Success with partial content\r\n case 304: {\r\n // Success with Not Modified\r\n let responseData = parseResponse(rawData, res.headers, responseParams[options.requestId]);\r\n\r\n let response = {\r\n data: responseData,\r\n headers: res.headers as any,\r\n status: res.statusCode,\r\n };\r\n\r\n successCallback(response);\r\n break;\r\n }\r\n default:\r\n // All other statuses are error cases.\r\n let crmError;\r\n try {\r\n var errorParsed = parseResponse(rawData, res.headers, responseParams[options.requestId]);\r\n\r\n if (Array.isArray(errorParsed)) {\r\n errorCallback(errorParsed);\r\n break;\r\n }\r\n\r\n crmError = errorParsed.hasOwnProperty(\"error\") && errorParsed.error ? errorParsed.error : { message: errorParsed.Message };\r\n } catch (e) {\r\n if (rawData.length > 0) {\r\n crmError = { message: rawData };\r\n } else {\r\n crmError = { message: \"Unexpected Error\" };\r\n }\r\n }\r\n\r\n errorCallback(\r\n ErrorHelper.handleHttpError(crmError, {\r\n status: res.statusCode,\r\n statusText: \"\",\r\n statusMessage: res.statusMessage,\r\n headers: res.headers,\r\n })\r\n );\r\n break;\r\n }\r\n });\r\n });\r\n\r\n if (internalOptions.timeout) {\r\n request.setTimeout(internalOptions.timeout, function () {\r\n request.destroy();\r\n });\r\n }\r\n\r\n request.on(\"error\", function (error) {\r\n errorCallback(error);\r\n });\r\n\r\n if (data) {\r\n request.write(data);\r\n }\r\n\r\n request.end();\r\n}\r\n", "import { Utility } from \"./Utility\";\r\nimport { ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { ApiConfig, Config } from \"../dynamics-web-api\";\r\n\r\ntype ApiType = \"dataApi\" | \"searchApi\";\r\n\r\nexport interface InternalApiConfig extends ApiConfig {\r\n url: string;\r\n}\r\n\r\nexport interface InternalConfig extends Config {\r\n dataApi: InternalApiConfig;\r\n searchApi: InternalApiConfig;\r\n}\r\n\r\nconst getApiUrl = (serverUrl: string | undefined | null, apiConfig: ApiConfig): string => {\r\n if (Utility.isRunningWithinPortals()) {\r\n return new URL(\"_api\", global.window.location.origin).toString() + \"/\";\r\n } else {\r\n if (!serverUrl) serverUrl = Utility.getClientUrl();\r\n return new URL(`api/${apiConfig.path}/v${apiConfig.version}`, serverUrl).toString() + \"/\";\r\n }\r\n};\r\n\r\nconst mergeApiConfigs = (apiConfig: ApiConfig | undefined, apiType: ApiType, internalConfig: InternalConfig): void => {\r\n const internalApiConfig = internalConfig[apiType] as InternalApiConfig;\r\n\r\n if (apiConfig?.version) {\r\n ErrorHelper.stringParameterCheck(apiConfig.version, \"DynamicsWebApi.setConfig\", `config.${apiType}.version`);\r\n internalApiConfig.version = apiConfig.version;\r\n }\r\n\r\n if (apiConfig?.path) {\r\n ErrorHelper.stringParameterCheck(apiConfig.path, \"DynamicsWebApi.setConfig\", `config.${apiType}.path`);\r\n internalApiConfig.path = apiConfig.path;\r\n }\r\n\r\n internalApiConfig.url = getApiUrl(internalConfig.serverUrl, internalApiConfig);\r\n};\r\n\r\nexport class ConfigurationUtility {\r\n static mergeApiConfigs = mergeApiConfigs;\r\n\r\n static merge(internalConfig: InternalConfig, config?: Config): void {\r\n if (config?.serverUrl) {\r\n ErrorHelper.stringParameterCheck(config.serverUrl, \"DynamicsWebApi.setConfig\", \"config.serverUrl\");\r\n internalConfig.serverUrl = config.serverUrl;\r\n }\r\n\r\n mergeApiConfigs(config?.dataApi, \"dataApi\", internalConfig);\r\n mergeApiConfigs(config?.searchApi, \"searchApi\", internalConfig);\r\n\r\n if (config?.impersonate) {\r\n internalConfig.impersonate = ErrorHelper.guidParameterCheck(config.impersonate, \"DynamicsWebApi.setConfig\", \"config.impersonate\");\r\n }\r\n\r\n if (config?.impersonateAAD) {\r\n internalConfig.impersonateAAD = ErrorHelper.guidParameterCheck(config.impersonateAAD, \"DynamicsWebApi.setConfig\", \"config.impersonateAAD\");\r\n }\r\n\r\n if (config?.onTokenRefresh) {\r\n ErrorHelper.callbackParameterCheck(config.onTokenRefresh, \"DynamicsWebApi.setConfig\", \"config.onTokenRefresh\");\r\n internalConfig.onTokenRefresh = config.onTokenRefresh;\r\n }\r\n\r\n if (config?.includeAnnotations) {\r\n ErrorHelper.stringParameterCheck(config.includeAnnotations, \"DynamicsWebApi.setConfig\", \"config.includeAnnotations\");\r\n internalConfig.includeAnnotations = config.includeAnnotations;\r\n }\r\n\r\n if (config?.timeout) {\r\n ErrorHelper.numberParameterCheck(config.timeout, \"DynamicsWebApi.setConfig\", \"config.timeout\");\r\n internalConfig.timeout = config.timeout;\r\n }\r\n\r\n if (config?.maxPageSize) {\r\n ErrorHelper.numberParameterCheck(config.maxPageSize, \"DynamicsWebApi.setConfig\", \"config.maxPageSize\");\r\n internalConfig.maxPageSize = config.maxPageSize;\r\n }\r\n\r\n if (config?.returnRepresentation) {\r\n ErrorHelper.boolParameterCheck(config.returnRepresentation, \"DynamicsWebApi.setConfig\", \"config.returnRepresentation\");\r\n internalConfig.returnRepresentation = config.returnRepresentation;\r\n }\r\n\r\n if (config?.useEntityNames) {\r\n ErrorHelper.boolParameterCheck(config.useEntityNames, \"DynamicsWebApi.setConfig\", \"config.useEntityNames\");\r\n internalConfig.useEntityNames = config.useEntityNames;\r\n }\r\n\r\n if (config?.headers) {\r\n internalConfig.headers = config.headers;\r\n }\r\n\r\n if (!global.DWA_BROWSER && config?.proxy) {\r\n ErrorHelper.parameterCheck(config.proxy, \"DynamicsWebApi.setConfig\", \"config.proxy\");\r\n\r\n if (config.proxy.url) {\r\n ErrorHelper.stringParameterCheck(config.proxy.url, \"DynamicsWebApi.setConfig\", \"config.proxy.url\");\r\n\r\n if (config.proxy.auth) {\r\n ErrorHelper.parameterCheck(config.proxy.auth, \"DynamicsWebApi.setConfig\", \"config.proxy.auth\");\r\n ErrorHelper.stringParameterCheck(config.proxy.auth.username, \"DynamicsWebApi.setConfig\", \"config.proxy.auth.username\");\r\n ErrorHelper.stringParameterCheck(config.proxy.auth.password, \"DynamicsWebApi.setConfig\", \"config.proxy.auth.password\");\r\n }\r\n }\r\n\r\n internalConfig.proxy = config.proxy;\r\n }\r\n }\r\n\r\n static default(): InternalConfig {\r\n return {\r\n serverUrl: null,\r\n impersonate: null,\r\n impersonateAAD: null,\r\n onTokenRefresh: null,\r\n includeAnnotations: null,\r\n maxPageSize: null,\r\n returnRepresentation: null,\r\n proxy: null,\r\n dataApi: {\r\n path: \"data\",\r\n version: \"9.2\",\r\n url: \"\"\r\n },\r\n searchApi: {\r\n path: \"search\",\r\n version: \"1.0\",\r\n url: \"\"\r\n },\r\n };\r\n }\r\n}\r\n", "\uFEFFimport { ConfigurationUtility } from \"./utils/Config\";\r\nimport { Utility } from \"./utils/Utility\";\r\nimport { ErrorHelper } from \"./helpers/ErrorHelper\";\r\nimport { RequestClient } from \"./client/RequestClient\";\r\nimport type { Core } from \"./types\";\r\n\r\n/**\r\n * Microsoft Dynamics CRM Web API helper library written in JavaScript.\r\n * It is compatible with: Dynamics 365 (online), Dynamics 365 (on-premise), Dynamics CRM 2016, Dynamics CRM Online.\r\n */\r\nexport class DynamicsWebApi {\r\n private _config = ConfigurationUtility.default();\r\n private _isBatch = false;\r\n private _batchRequestId: string | null = null;\r\n\r\n /**\r\n * Initializes a new instance of DynamicsWebApi\r\n * @param config - Configuration object\r\n */\r\n constructor(config?: Config) {\r\n ConfigurationUtility.merge(this._config, config);\r\n }\r\n\r\n /**\r\n\t * Merges provided configuration properties with an existing one.\r\n\t *\r\n\t * @param {DynamicsWebApi.Config} config - Configuration\r\n\t * @example\r\n\t dynamicsWebApi.setConfig({ serverUrl: 'https://contoso.api.crm.dynamics.com/' });\r\n\t */\r\n setConfig = (config: Config) => ConfigurationUtility.merge(this._config, config);\r\n\r\n private _makeRequest = async (request: Core.InternalRequest): Promise => {\r\n request.isBatch = this._isBatch;\r\n if (this._batchRequestId) request.requestId = this._batchRequestId;\r\n return RequestClient.makeRequest(request, this._config);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a new record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n * @example\r\n *const lead = {\r\n * subject: \"Test WebAPI\",\r\n * firstname: \"Test\",\r\n * lastname: \"WebAPI\",\r\n * jobtitle: \"Title\"\r\n *};\r\n *\r\n *const request = {\r\n * data: lead,\r\n * collection: \"leads\",\r\n * returnRepresentation: true\r\n *}\r\n *\r\n *const response = await dynamicsWebApi.create(request);\r\n *\r\n */\r\n create = async (request: CreateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.create\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"create\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"POST\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n * @example\r\n *const request = {\r\n * key: '7d577253-3ef0-4a0a-bb7f-8335c2596e70',\r\n * collection: \"leads\",\r\n * select: [\"fullname\", \"subject\"],\r\n * ifnonematch: 'W/\"468026\"',\r\n * includeAnnotations: \"OData.Community.Display.V1.FormattedValue\"\r\n *};\r\n *\r\n *const response = await dynamicsWebApi.retrieve(request);\r\n */\r\n retrieve = async (request: RetrieveRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieve\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"retrieve\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"GET\";\r\n internalRequest.responseParameters = {\r\n isRef: internalRequest.select?.length === 1 && internalRequest.select[0].endsWith(\"/$ref\"),\r\n };\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n update = async (request: UpdateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.update\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"update\";\r\n } else internalRequest = request;\r\n\r\n //Metadata definitions, cannot be updated using \"PATCH\" method\r\n if (!internalRequest.method)\r\n internalRequest.method = /EntityDefinitions|RelationshipDefinitions|GlobalOptionSetDefinitions/.test(internalRequest.collection || \"\")\r\n ? \"PUT\"\r\n : \"PATCH\";\r\n\r\n internalRequest.responseParameters = { valueIfEmpty: true };\r\n\r\n if (internalRequest.ifmatch == null) {\r\n internalRequest.ifmatch = \"*\"; //to prevent upsert\r\n }\r\n\r\n //copy locally\r\n const ifmatch = internalRequest.ifmatch;\r\n\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifmatch && error.status === 412) {\r\n //precondition failed - not updated\r\n return false; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a single value in the record.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateSingleProperty = async (request: UpdateSinglePropertyRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateSingleProperty\", \"request\");\r\n ErrorHelper.parameterCheck(request.fieldValuePair, \"DynamicsWebApi.updateSingleProperty\", \"request.fieldValuePair\");\r\n\r\n var field = Object.keys(request.fieldValuePair)[0];\r\n var fieldValue = request.fieldValuePair[field];\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.navigationProperty = field;\r\n internalRequest.data = { value: fieldValue };\r\n internalRequest.functionName = \"updateSingleProperty\";\r\n internalRequest.method = \"PUT\";\r\n\r\n delete internalRequest[\"fieldValuePair\"];\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a record.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteRecord = async (request: DeleteRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteRecord\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"deleteRecord\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.responseParameters = { valueIfEmpty: true };\r\n\r\n //copy locally\r\n const ifmatch = internalRequest.ifmatch;\r\n\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifmatch && error.status === 412) {\r\n //precondition failed - not updated\r\n return false; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to upsert a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n upsert = async (request: UpsertRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.upsert\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"PATCH\";\r\n internalRequest.functionName = \"upsert\";\r\n\r\n //copy locally\r\n const ifnonematch = internalRequest.ifnonematch;\r\n const ifmatch = internalRequest.ifmatch;\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifnonematch && error.status === 412) {\r\n //if prevent update\r\n return null; //todo: check this\r\n } else if (ifmatch && error.status === 404) {\r\n //if prevent create\r\n return null; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n private _uploadFileChunk = async (request: Core.InternalRequest, fileBytes: Uint8Array | Buffer, chunkSize: number, offset: number = 0): Promise => {\r\n // offset = offset || 0;\r\n Utility.setFileChunk(request, fileBytes, chunkSize, offset);\r\n\r\n await this._makeRequest(request);\r\n\r\n offset += chunkSize;\r\n if (offset <= fileBytes.length) {\r\n return this._uploadFileChunk(request, fileBytes, chunkSize, offset);\r\n }\r\n };\r\n\r\n /**\r\n * Upload file to a File Attribute\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n */\r\n uploadFile = async (request: UploadRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.uploadFile\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.uploadFile\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request, [\"data\"]);\r\n internalRequest.method = \"PATCH\";\r\n internalRequest.functionName = \"uploadFile\";\r\n internalRequest.transferMode = \"chunked\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n internalRequest.url = response?.data.location;\r\n delete internalRequest.transferMode;\r\n delete internalRequest.fieldName;\r\n delete internalRequest.fileName;\r\n return this._uploadFileChunk(internalRequest, request.data, response?.data.chunkSize);\r\n };\r\n\r\n private _downloadFileChunk = async (\r\n request: Core.InternalRequest,\r\n bytesDownloaded: number = 0,\r\n // fileSize: number = 0,\r\n data: string = \"\"\r\n ): Promise => {\r\n // bytesDownloaded = bytesDownloaded || 0;\r\n // fileSize = fileSize || 0;\r\n // data = data || \"\";\r\n\r\n request.range = \"bytes=\" + bytesDownloaded + \"-\" + (bytesDownloaded + Utility.downloadChunkSize - 1);\r\n request.downloadSize = \"full\";\r\n\r\n const response = await this._makeRequest(request);\r\n\r\n request.url = response?.data.location;\r\n data += response?.data.value;\r\n\r\n bytesDownloaded += Utility.downloadChunkSize;\r\n\r\n if (bytesDownloaded <= response?.data.fileSize) {\r\n return this._downloadFileChunk(request, bytesDownloaded, data);\r\n }\r\n\r\n return {\r\n fileName: response?.data.fileName,\r\n fileSize: response?.data.fileSize,\r\n data: Utility.convertToFileBuffer(data),\r\n };\r\n };\r\n\r\n /**\r\n * Download a file from a File Attribute\r\n * @param request - An object that represents all possible options for a current request.\r\n */\r\n downloadFile = (request: DownloadRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.downloadFile\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.downloadFile\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"downloadFile\";\r\n internalRequest.responseParameters = { parse: true };\r\n\r\n return this._downloadFileChunk(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve records.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @param {string} [nextPageLink] - Use the value of the @odata.nextLink property with a new GET request to return the next page of data. Pass null to retrieveMultipleOptions.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveMultiple = async (request: RetrieveMultipleRequest, nextPageLink?: string): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveMultiple\", \"request\");\r\n\r\n let internalRequest: Core.InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"retrieveMultiple\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"GET\";\r\n\r\n if (nextPageLink) {\r\n ErrorHelper.stringParameterCheck(nextPageLink, \"DynamicsWebApi.retrieveMultiple\", \"nextPageLink\");\r\n internalRequest.url = nextPageLink;\r\n }\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n return response?.data;\r\n };\r\n\r\n private _retrieveAllRequest = async (request: RetrieveMultipleRequest, nextPageLink?: string, records: any[] = []): Promise> => {\r\n const response = await this.retrieveMultiple(request, nextPageLink);\r\n records = records.concat(response.value);\r\n\r\n const pageLink = response.oDataNextLink;\r\n\r\n if (pageLink) {\r\n return this._retrieveAllRequest(request, pageLink, records);\r\n }\r\n\r\n const result: AllResponse = { value: records };\r\n\r\n if (response.oDataDeltaLink) {\r\n result[\"@odata.deltaLink\"] = response.oDataDeltaLink;\r\n result.oDataDeltaLink = response.oDataDeltaLink;\r\n }\r\n\r\n return result;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve all records.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAll = (request: RetrieveMultipleRequest): Promise> => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.retrieveAll\", this._isBatch);\r\n return this._retrieveAllRequest(request);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to count records. IMPORTANT! The count value does not represent the total number of entities in the system. It is limited by the maximum number of entities that can be returned. Returns: Number\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n count = async (request: CountRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.count\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"count\";\r\n\r\n if (internalRequest.filter?.length) {\r\n internalRequest.count = true;\r\n } else {\r\n internalRequest.navigationProperty = \"$count\";\r\n }\r\n\r\n internalRequest.responseParameters = { toCount: internalRequest.count };\r\n\r\n //if filter has not been specified then simplify the request\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to count records. Returns: Number\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n countAll = async (request: CountAllRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.countAll\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.countAll\", \"request\");\r\n\r\n const response = await this._retrieveAllRequest(request);\r\n\r\n return response ? (response.value ? response.value.length : 0) : 0;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to execute FetchXml to retrieve records. Returns: DWA.Types.FetchXmlResponse\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n fetch = async (request: FetchXmlRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.fetch\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"fetch\";\r\n\r\n ErrorHelper.stringParameterCheck(internalRequest.fetchXml, \"DynamicsWebApi.fetch\", \"request.fetchXml\");\r\n\r\n //only add paging if there is no top\r\n if (internalRequest.fetchXml && !/^(request: FetchAllRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.fetchAll\", \"request\");\r\n\r\n const _executeFetchXmlAll = async (request: FetchXmlRequest, records: any[] = []): Promise> => {\r\n // records = records || [];\r\n\r\n const response = await this.fetch(request);\r\n\r\n records = records.concat(response.value);\r\n\r\n if (response.PagingInfo) {\r\n request.pageNumber = response.PagingInfo.nextPage;\r\n request.pagingCookie = response.PagingInfo.cookie;\r\n\r\n return _executeFetchXmlAll(request, records);\r\n }\r\n\r\n return { value: records };\r\n };\r\n\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.fetchAll\", this._isBatch);\r\n return _executeFetchXmlAll(request);\r\n };\r\n\r\n /**\r\n * Associate for a collection-valued navigation property. (1:N or N:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n associate = async (request: AssociateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.associate\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"associate\";\r\n\r\n ErrorHelper.stringParameterCheck(request.relatedCollection, \"DynamicsWebApi.associate\", \"request.relatedcollection\");\r\n ErrorHelper.stringParameterCheck(request.relationshipName, \"DynamicsWebApi.associate\", \"request.relationshipName\");\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.associate\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.associate\", \"request.relatedKey\");\r\n\r\n internalRequest.navigationProperty = request.relationshipName + \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n internalRequest.data = { \"@odata.id\": `${request.relatedCollection}(${relatedKey})` };\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Disassociate for a collection-valued navigation property.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n disassociate = async (request: DisassociateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.disassociate\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.functionName = \"disassociate\";\r\n\r\n ErrorHelper.stringParameterCheck(request.relationshipName, \"DynamicsWebApi.disassociate\", \"request.relationshipName\");\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.disassociate\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.disassociate\", \"request.relatedId\");\r\n\r\n internalRequest.key = primaryKey;\r\n internalRequest.navigationProperty = `${request.relationshipName}(${relatedKey})/$ref`;\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Associate for a single-valued navigation property. (1:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n associateSingleValued = async (request: AssociateSingleValuedRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.associateSingleValued\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"PUT\";\r\n internalRequest.functionName = \"associateSingleValued\";\r\n\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.associateSingleValued\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.associateSingleValued\", \"request.relatedKey\");\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, \"DynamicsWebApi.associateSingleValued\", \"request.navigationProperty\");\r\n ErrorHelper.stringParameterCheck(request.relatedCollection, \"DynamicsWebApi.associateSingleValued\", \"request.relatedcollection\");\r\n\r\n internalRequest.navigationProperty += \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n internalRequest.data = { \"@odata.id\": `${request.relatedCollection}(${relatedKey})` };\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Removes a reference to an entity for a single-valued navigation property. (1:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n disassociateSingleValued = async (request: DisassociateSingleValuedRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.disassociateSingleValued\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.functionName = \"disassociateSingleValued\";\r\n\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.disassociateSingleValued\", \"request.primaryKey\");\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, \"DynamicsWebApi.disassociateSingleValued\", \"request.navigationProperty\");\r\n\r\n internalRequest.navigationProperty += \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Calls a Web API function\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n callFunction: CallFunction = async (request: string | BoundFunctionRequest | UnboundFunctionRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.callFunction`, \"request\");\r\n\r\n const getFunctionName = (request: BoundFunctionRequest | UnboundFunctionRequest) => request.name || request.functionName;\r\n\r\n const isObject = typeof request !== \"string\";\r\n const functionName = isObject ? getFunctionName(request) : request;\r\n const parameterName = isObject ? \"request.name\" : \"name\";\r\n const internalRequest: Core.InternalRequest = isObject ? Utility.copyObject(request, [\"name\"]) : { functionName: functionName };\r\n\r\n ErrorHelper.stringParameterCheck(functionName, `DynamicsWebApi.callFunction`, parameterName);\r\n\r\n const functionParameters = Utility.buildFunctionParameters(internalRequest.parameters);\r\n\r\n internalRequest.method = \"GET\";\r\n internalRequest._additionalUrl = functionName + functionParameters.key;\r\n internalRequest.queryParams = functionParameters.queryParams;\r\n internalRequest._isUnboundRequest = !internalRequest.collection;\r\n internalRequest.functionName = \"callFunction\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Calls a Web API action\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n callAction: CallAction = async (\r\n request: BoundActionRequest | UnboundActionRequest\r\n ): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.callAction`, \"request\");\r\n ErrorHelper.stringParameterCheck(request.actionName, `DynamicsWebApi.callAction`, \"request.actionName\");\r\n\r\n const internalRequest = Utility.copyRequest(request, [\"action\"]);\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"callAction\";\r\n\r\n internalRequest._additionalUrl = request.actionName;\r\n internalRequest._isUnboundRequest = !internalRequest.collection;\r\n internalRequest.data = request.action;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n /**\r\n * Sends an asynchronous request to create an entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createEntity = (request: CreateEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.createEntity`, \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createEntity\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"createEntity\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update an entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateEntity = (request: UpdateEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateEntity\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateEntity\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateEntity\", \"request.data.MetadataId\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.key = internalRequest.data.MetadataId;\r\n internalRequest.functionName = \"updateEntity\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveEntity = (request: RetrieveEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveEntity\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.retrieveEntity\", \"request.key\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntity\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve entity definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveEntities = (request?: RetrieveEntitiesRequest): Promise> => {\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntities\";\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create an attribute.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createAttribute = (request: CreateAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createAttribute\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createAttribute\", \"request.data\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.createAttribute\", \"request.entityKey\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntity\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.key = request.entityKey;\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update an attribute.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateAttribute = (request: UpdateAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateAttribute\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateAttribute\", \"request.data\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.updateAttribute\", \"request.entityKey\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateAttribute\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateAttribute\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.navigationPropertyKey = request.data.MetadataId;\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"updateAttribute\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve attribute metadata for a specified entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAttributes = (request: RetrieveAttributesRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveAttributes\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.retrieveAttributes\", \"request.entityKey\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveAttributes\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"retrieveAttributes\";\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific attribute metadata for a specified entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAttribute = (request: RetrieveAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveAttributes\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.retrieveAttribute\", \"request.entityKey\");\r\n ErrorHelper.keyParameterCheck(request.attributeKey, \"DynamicsWebApi.retrieveAttribute\", \"request.attributeKey\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveAttribute\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.navigationPropertyKey = request.attributeKey;\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"retrieveAttribute\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createRelationship = (request: CreateRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createRelationship\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createRelationship\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"createRelationship\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateRelationship = (request: UpdateRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateRelationship\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateRelationship\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateRelationship\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateRelationship\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.key = request.data.MetadataId;\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"updateRelationship\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteRelationship = (request: DeleteRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteRelationship\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.deleteRelationship\", \"request.key\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"deleteRelationship\";\r\n\r\n return this.deleteRecord(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve relationship definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveRelationships = (request?: RetrieveRelationshipsRequest): Promise> => {\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"retrieveRelationships\";\r\n\r\n if (request) {\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveRelationships\", \"request.castType\");\r\n internalRequest.navigationProperty = request.castType;\r\n }\r\n }\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveRelationship = (request: RetrieveRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveRelationship\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.retrieveRelationship\", \"request.key\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveRelationship\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"retrieveRelationship\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a Global Option Set definition\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createGlobalOptionSet = (request: CreateGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createGlobalOptionSet\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createGlobalOptionSet\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"createGlobalOptionSet\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a Global Option Set.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateGlobalOptionSet = (request: UpdateGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateGlobalOptionSet\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.key = request.data.MetadataId;\r\n internalRequest.functionName = \"updateGlobalOptionSet\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a Global Option Set.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteGlobalOptionSet = (request: DeleteGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteGlobalOptionSet\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"deleteGlobalOptionSet\";\r\n\r\n return this.deleteRecord(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve Global Option Set definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveGlobalOptionSet = (request: RetrieveGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveGlobalOptionSet\", \"request\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveGlobalOptionSet\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"retrieveGlobalOptionSet\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve Global Option Set definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveGlobalOptionSets = (request?: RetrieveGlobalOptionSetsRequest): Promise> => {\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"retrieveGlobalOptionSets\";\r\n\r\n if (request?.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveGlobalOptionSets\", \"request.castType\");\r\n internalRequest.navigationProperty = request.castType;\r\n }\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Retrieves a CSDL Document Metadata\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} A raw CSDL $metadata document.\r\n */\r\n retrieveCsdlMetadata = async (request?: CsdlMetadataRequest): Promise => {\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"$metadata\";\r\n internalRequest.functionName = \"retrieveCsdlMetadata\";\r\n\r\n if (request?.addAnnotations) {\r\n ErrorHelper.boolParameterCheck(request.addAnnotations, \"DynamicsWebApi.retrieveCsdlMetadata\", \"request.addAnnotations\");\r\n internalRequest.includeAnnotations = \"*\";\r\n }\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides a search results page.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Search result\r\n */\r\n search: SearchFunction = async (request: string | SearchRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.search\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: Core.InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.search\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.search\", parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.search\", parameterName, 100);\r\n\r\n internalRequest.collection = \"query\";\r\n internalRequest.functionName = \"search\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Suggestions result\r\n */\r\n suggest: SuggestFunction = async (request: string | SuggestRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.suggest\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: Core.InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.suggest\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.suggest\", parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.suggest\", parameterName, 100);\r\n\r\n internalRequest.functionName = internalRequest.collection = \"suggest\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n autocomplete: AutocompleteFunction = async (request: string | AutocompleteRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.autocomplete\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: Core.InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n if (isObject) ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.autocomplete\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, `DynamicsWebApi.autocomplete`, parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.autocomplete\", parameterName, 100);\r\n\r\n internalRequest.functionName = internalRequest.collection = \"autocomplete\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Starts/executes a batch request.\r\n */\r\n startBatch = (): void => {\r\n this._isBatch = true;\r\n this._batchRequestId = Utility.generateUUID();\r\n };\r\n\r\n /**\r\n * Executes a batch request. Please call DynamicsWebApi.startBatch() first to start a batch request.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n executeBatch = async (request?: BatchRequest): Promise => {\r\n ErrorHelper.throwBatchNotStarted(this._isBatch);\r\n\r\n const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"$batch\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"executeBatch\";\r\n internalRequest.requestId = this._batchRequestId;\r\n\r\n this._batchRequestId = null;\r\n this._isBatch = false;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Creates a new instance of DynamicsWebApi. If config is not provided, it is copied from a current instance.\r\n *\r\n * @param {Config} config configuration object.\r\n * @returns {DynamicsWebApi} A new instance of DynamicsWebApi\r\n */\r\n initializeInstance = (config?: Config): DynamicsWebApi => new DynamicsWebApi(config || this._config);\r\n\r\n Utility = {\r\n /**\r\n * Searches for a collection name by provided entity name in a cached entity metadata.\r\n * The returned collection name can be null.\r\n *\r\n * @param {string} entityName entity name\r\n * @returns {string | null} collection name\r\n */\r\n getCollectionName: (entityName: string): string | null => RequestClient.getCollectionName(entityName),\r\n };\r\n}\r\n\r\nexport interface Expand {\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**Limit the number of results returned by using the $top system query option.Do not use $top with $count! */\r\n top?: number;\r\n /**An Array(of Strings) representing the order in which items are returned using the $orderby system query option.Use the asc or desc suffix to specify ascending or descending order respectively.The default is ascending if the suffix isn't applied. */\r\n orderBy?: string[];\r\n /**A name of a single-valued navigation property which needs to be expanded. */\r\n property?: string;\r\n /**An Array of Expand Objects representing the $expand Query Option value to control which related records need to be returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface BaseRequest {\r\n /**XHR requests only! Indicates whether the requests should be made synchronously or asynchronously.Default value is 'true'(asynchronously). */\r\n async?: boolean;\r\n /**Impersonates a user based on their systemuserid by adding \"MSCRMCallerID\" header. A String representing the GUID value for the Dynamics 365 systemuserid. */\r\n impersonate?: string;\r\n /**Impersonates a user based on their Azure Active Directory (AAD) object id by passing that value along with the header \"CallerObjectId\". A String should represent a GUID value. */\r\n impersonateAAD?: string;\r\n /**If set to 'true', DynamicsWebApi adds a request header 'Cache-Control: no-cache'.Default value is 'false'. */\r\n noCache?: boolean;\r\n /** Authorization Token. If set, onTokenRefresh will not be called. */\r\n token?: string;\r\n /**Sets a number of milliseconds before a request times out. */\r\n timeout?: number;\r\n /**The AbortSignal interface represents a signal object that allows you to communicate with a DOM request and abort it if required via an AbortController object. */\r\n signal?: AbortSignal;\r\n /**Indicates if an operation must be included in a Change Set or not. Works in Batch Operations only. By default, it's \"true\", except for GET operations - they are not allowed in Change Sets. */\r\n inChangeSet?: boolean;\r\n /**Headers to supply with a request. These headers will override configuraiton headers if the identical ones were set. */\r\n headers?: HeaderCollection;\r\n /**Custom query parameters. Can be used to set parameter aliases for \"$filter\" and \"$orderBy\". Important! These parameters ARE NOT URI encoded! */\r\n queryParams?: string[];\r\n}\r\n\r\nexport interface BatchRequest extends BaseRequest {\r\n /** Sets Prefer header to \"odata.continue-on-error\" that allows more requests be processed when errors occur. The batch request will return '200 OK' and individual response errors will be returned in the batch response body. */\r\n continueOnError?: boolean;\r\n}\r\n\r\nexport interface Request extends BaseRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection?: string;\r\n}\r\n\r\nexport interface CRUDRequest extends Request {\r\n /**A String representing collection record's Primary Key (GUID) or Alternate Key(s). */\r\n key?: string;\r\n}\r\n\r\nexport interface CountRequest extends Request {\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n}\r\n\r\nexport interface CountAllRequest extends CountRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**An Array (of strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n}\r\n\r\nexport interface FetchAllRequest extends Request {\r\n /**Sets FetchXML - a proprietary query language that provides capabilities to perform aggregation. */\r\n fetchXml: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation. Annotations provide additional information about lookups, options sets and other complex attribute types. For example: * or Microsoft.Dynamics.CRM.fetchxmlpagingcookie */\r\n includeAnnotations?: string;\r\n}\r\n\r\nexport interface FetchXmlRequest extends FetchAllRequest {\r\n /**Page number. */\r\n pageNumber?: number;\r\n /**Paging cookie. To retrive the first page, pagingCookie must be null. */\r\n pagingCookie?: string;\r\n}\r\n\r\nexport interface CreateRequest extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Web API v9+ only! Boolean that enables duplicate detection. */\r\n duplicateDetection?: boolean;\r\n /**A JavaScript object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data?: T;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface UpdateRequestBase extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Web API v9+ only! Boolean that enables duplicate detection. */\r\n duplicateDetection?: boolean;\r\n /**A JavaScript object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data?: T;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**Casts the AttributeMetadata to a specific type. (Used in requests to Attribute Metadata). */\r\n metadataAttributeType?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface UpdateRequest extends UpdateRequestBase {\r\n /**If set to 'true', DynamicsWebApi adds a request header 'MSCRM.MergeLabels: true'. Default value is 'false' */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface UpdateSinglePropertyRequest extends CRUDRequest {\r\n /**Object with a logical name of the field as a key and a value to update with. Example: {subject: \"Update Record\"} */\r\n fieldValuePair: { [key: string]: any };\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n}\r\n\r\nexport interface UpsertRequest extends UpdateRequestBase {\r\n /**Sets If-None-Match header value that enables to use conditional retrieval in applicable requests. */\r\n ifnonematch?: string;\r\n}\r\n\r\nexport interface DeleteRequest extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**Field name that needs to be cleared (for example File Field) */\r\n fieldName?: string;\r\n}\r\n\r\nexport interface RetrieveRequest extends CRUDRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets If-None-Match header value that enables to use conditional retrieval in applicable requests. */\r\n ifnonematch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Casts the AttributeMetadata to a specific type. (Used in requests to Attribute Metadata). */\r\n metadataAttributeType?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**A String representing the GUID value of the saved query. */\r\n savedQuery?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**A String representing the GUID value of the user query. */\r\n userQuery?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface RetrieveMultipleRequest extends Request {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**Use the $apply to aggregate and group your data dynamically */\r\n apply?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Boolean that sets the $count system query option with a value of true to include a count of entities that match the filter criteria up to 5000(per page).Do not use $top with $count! */\r\n count?: boolean;\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets the odata.maxpagesize preference value to request the number of entities returned in the response. */\r\n maxPageSize?: number;\r\n /**An Array(of string) representing the order in which items are returned using the $orderby system query option.Use the asc or desc suffix to specify ascending or descending order respectively.The default is ascending if the suffix isn't applied. */\r\n orderBy?: string[];\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Limit the number of results returned by using the $top system query option.Do not use $top with $count! */\r\n top?: number;\r\n /**Sets Prefer header with value 'odata.track-changes' to request that a delta link be returned which can subsequently be used to retrieve entity changes. */\r\n trackChanges?: boolean;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface AssociateRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Relationship name. */\r\n relationshipName: string;\r\n /**Related name of the Entity Collection or Entity Logical name. */\r\n relatedCollection: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface AssociateSingleValuedRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Navigation property name. */\r\n navigationProperty: string;\r\n /**Related name of the Entity Collection or Entity Logical name. */\r\n relatedCollection: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface DisassociateRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Relationship name. */\r\n relationshipName: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface DisassociateSingleValuedRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Navigation property name. */\r\n navigationProperty: string;\r\n}\r\n\r\nexport interface UnboundFunctionRequest extends BaseRequest {\r\n /**\r\n * Name of the function.\r\n */\r\n name?: string;\r\n /**\r\n * Name of the function. \r\n * @deprecated Use \"name\" parameter.\r\n */\r\n functionName?: string;\r\n /**Function's input parameters. Example: { param1: \"test\", param2: 3 }. */\r\n parameters?: any;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n}\r\n\r\nexport interface BoundFunctionRequest extends UnboundFunctionRequest, Request {\r\n /**A String representing the GUID value for the record. */\r\n key?: string;\r\n}\r\n\r\nexport interface UnboundActionRequest extends BaseRequest {\r\n /**A name of the Web API action. */\r\n actionName: string;\r\n /**An object that represents a Dynamics 365 action. */\r\n action?: TAction;\r\n}\r\n\r\nexport interface BoundActionRequest extends UnboundActionRequest, Request {\r\n /**A String representing the GUID value for the record. */\r\n key?: string;\r\n}\r\n\r\nexport interface CreateEntityRequest extends BaseRequest {\r\n /**An object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateEntityRequest extends CRUDRequest {\r\n /**An object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data: any;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface RetrieveEntityRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveEntitiesRequest extends BaseRequest {\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateAttributeRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Attribute metadata object. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateAttributeRequest extends CreateAttributeRequest {\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface RetrieveAttributesRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveAttributeRequest extends BaseRequest {\r\n /**An Attribute MetadataId or Alternate Key (such as LogicalName). */\r\n attributeKey: string;\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateRelationshipRequest extends BaseRequest {\r\n /**Relationship Definition. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateRelationshipRequest extends CreateRelationshipRequest {\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface DeleteRelationshipRequest extends BaseRequest {\r\n /**A Relationship MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n}\r\n\r\nexport interface RetrieveRelationshipsRequest extends BaseRequest {\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveRelationshipRequest extends BaseRequest {\r\n /**A Relationship MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateGlobalOptionSetRequest extends BaseRequest {\r\n /**Global Option Set Definition. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateGlobalOptionSetRequest extends CreateRelationshipRequest {\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface DeleteGlobalOptionSetRequest extends BaseRequest {\r\n /**A Global Option Set MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n}\r\n\r\nexport interface RetrieveGlobalOptionSetsRequest extends BaseRequest {\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveGlobalOptionSetRequest extends BaseRequest {\r\n /**A Global Option Set MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface UploadRequest extends CRUDRequest {\r\n /**Binary Buffer*/\r\n data: Uint8Array | Buffer;\r\n /**Name of the file */\r\n fileName: string;\r\n /**File Field Name */\r\n fieldName: string;\r\n}\r\n\r\nexport interface DownloadRequest extends CRUDRequest {\r\n /**File Field Name */\r\n fieldName: string;\r\n}\r\n\r\nexport interface CsdlMetadataRequest extends BaseRequest {\r\n /**If set to \"true\" the document will include many different kinds of annotations that can be useful. Most annotations are not included by default because they increase the total size of the document. */\r\n addAnnotations?: boolean;\r\n}\r\n\r\nexport type SearchMode = \"any\" | \"all\";\r\nexport type SearchType = \"simple\" | \"full\";\r\n\r\nexport interface SearchQueryBase {\r\n /**The search parameter value contains the term to be searched for and has a 100-character limit. For suggestions, min 3 characters in addition. */\r\n search: string;\r\n /**The default table list searches across all Dataverse search\u2013configured tables and columns. The default list is configured by your administrator when Dataverse search is enabled. */\r\n entities?: string[];\r\n /**Filters are applied while searching data and are specified in standard OData syntax. */\r\n filter?: string;\r\n}\r\n\r\nexport interface Search extends SearchQueryBase {\r\n /**Facets support the ability to drill down into data results after they've been retrieved. */\r\n facets?: string[];\r\n /**Specify true to return the total record count; otherwise false. The default is false. */\r\n returnTotalRecordCount?: boolean;\r\n /**Specifies the number of search results to skip. */\r\n skip?: number;\r\n /**Specifies the number of search results to retrieve. The default is 50, and the maximum value is 100. */\r\n top?: number;\r\n /**A list of comma-separated clauses where each clause consists of a column name followed by 'asc' (ascending, which is the default) or 'desc' (descending). This list specifies how to order the results in order of precedence. */\r\n orderBy?: string[];\r\n /**Specifies whether any or all the search terms must be matched to count the document as a match. The default is 'any'. */\r\n searchMode?: SearchMode;\r\n /**The search type specifies the syntax of a search query. Using 'simple' selects simple query syntax and 'full' selects Lucene query syntax. The default is 'simple'. */\r\n searchType?: SearchType;\r\n}\r\n\r\nexport interface Suggest extends SearchQueryBase {\r\n /**Use fuzzy search to aid with misspellings. The default is false. */\r\n useFuzzy?: boolean;\r\n /**Number of suggestions to retrieve. The default is 5. */\r\n top?: number;\r\n /**A list of comma-separated clauses where each clause consists of a column name followed by 'asc' (ascending, which is the default) or 'desc' (descending). This list specifies how to order the results in order of precedence. */\r\n orderBy?: string[];\r\n}\r\n\r\nexport interface Autocomplete extends SearchQueryBase {\r\n /**Use fuzzy search to aid with misspellings. The default is false. */\r\n useFuzzy?: boolean;\r\n}\r\n\r\nexport interface SearchRequest extends BaseRequest {\r\n /**Search query object */\r\n query: Search;\r\n}\r\n\r\nexport interface SuggestRequest extends BaseRequest {\r\n /**Suggestion query object */\r\n query: Suggest;\r\n}\r\n\r\nexport interface AutocompleteRequest extends BaseRequest {\r\n /**Autocomplete query object */\r\n query: Autocomplete;\r\n}\r\n\r\nexport interface ApiConfig {\r\n /** API Version to use, for example: \"9.2\" or \"1.0\" */\r\n version?: string;\r\n /** API Path, for example: \"data\" or \"search\" */\r\n path?: string;\r\n}\r\n\r\nexport interface AccessToken {\r\n /** Access Token */\r\n accessToken: string;\r\n}\r\n\r\nexport interface Config {\r\n /**The url to Dataverse API server, for example: https://contoso.api.crm.dynamics.com/. It is required when used in Node.js application. */\r\n serverUrl?: string | null;\r\n /**Impersonates a user based on their systemuserid by adding \"MSCRMCallerID\" header. A String representing the GUID value for the Dynamics 365 systemuserid. */\r\n impersonate?: string | null;\r\n /**Impersonates a user based on their Azure Active Directory (AAD) object id by passing that value along with the header \"CallerObjectId\". A String should represent a GUID value. */\r\n impersonateAAD?: string | null;\r\n /**A function that is called when a security token needs to be refreshed. */\r\n onTokenRefresh?: (() => Promise) | null;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types.*/\r\n includeAnnotations?: string | null;\r\n /**Sets the odata.maxpagesize preference value to request the number of entities returned in the response. */\r\n maxPageSize?: number | null;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request.*/\r\n returnRepresentation?: boolean | null;\r\n /**Indicates whether to use Entity Logical Names instead of Collection Logical Names.*/\r\n useEntityNames?: boolean | null;\r\n /**Sets a number of milliseconds before a request times out. */\r\n timeout?: number | null;\r\n /**Proxy configuration object. */\r\n proxy?: ProxyConfig | null;\r\n /**Configuration object for Dataverse Web API (with path \"data\"). */\r\n dataApi?: ApiConfig;\r\n /**Configuration object for Dataverse Search API (with path \"search\"). */\r\n searchApi?: ApiConfig;\r\n /**Default headers to supply with each request. */\r\n headers?: HeaderCollection;\r\n}\r\n\r\n/**Header collection type */\r\nexport type HeaderCollection = {\r\n /**key-value */\r\n [key: string]: string;\r\n};\r\n\r\nexport interface ProxyConfig {\r\n /**Proxy server url */\r\n url: string;\r\n /**Basic authentication credentials */\r\n auth?: {\r\n /**Username */\r\n username: string;\r\n /**Password */\r\n password: string;\r\n };\r\n}\r\n\r\n/** Callback with an acquired token called by DynamicsWebApi; \"token\" argument can be a string or an object with a property {accessToken: } */\r\n// export interface OnTokenAcquiredCallback {\r\n// (token: any): void;\r\n// }\r\n\r\nexport interface RequestError extends Error {\r\n /**The name of the error */\r\n name: string;\r\n /**This code is not related to the http status code and is frequently empty */\r\n code?: string;\r\n /**A message describing the error */\r\n message: string;\r\n /**HTTP status code */\r\n status?: number;\r\n /**HTTP status text. Frequently empty */\r\n statusText?: string;\r\n /**HTTP Response headers */\r\n headers?: any;\r\n /**Details about an error */\r\n innererror?: {\r\n /**A message describing the error, this is frequently the same as the outer message */\r\n message?: string;\r\n /**Microsoft.Crm.CrmHttpException */\r\n type?: string;\r\n /**Details from the server about where the error occurred */\r\n stacktrace?: string;\r\n };\r\n}\r\n\r\nexport interface MultipleResponse {\r\n /**Multiple respone entities */\r\n value: T[];\r\n oDataCount?: number;\r\n \"@odata.count\"?: number;\r\n oDataContext?: string;\r\n \"@odata.context\"?: number;\r\n}\r\n\r\nexport interface AllResponse extends MultipleResponse {\r\n /**@odata.deltaLink value */\r\n oDataDeltaLink?: string;\r\n}\r\n\r\nexport interface RetrieveMultipleResponse extends MultipleResponse {\r\n \"@Microsoft.Dynamics.CRM.totalrecordcount\"?: number;\r\n \"@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded\"?: boolean;\r\n /**@odata.nextLink value */\r\n oDataNextLink?: string;\r\n /**@odata.deltaLink value */\r\n oDataDeltaLink?: string;\r\n \"@odata.deltaLink\"?: string;\r\n \"@odata.nextLink\"?: string;\r\n}\r\n\r\nexport interface FetchXmlResponse extends MultipleResponse {\r\n \"@Microsoft.Dynamics.CRM.totalrecordcount\"?: number;\r\n \"@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded\"?: boolean;\r\n /**Paging information */\r\n PagingInfo?: {\r\n /**Number of the next page */\r\n nextPage?: number;\r\n /**Next page cookie */\r\n cookie?: string;\r\n };\r\n}\r\n\r\nexport interface DownloadResponse {\r\n /**The name of the file */\r\n fileName: string;\r\n /**File size */\r\n fileSize: number;\r\n /**File Data */\r\n data: Uint8Array | Buffer;\r\n}\r\n\r\nexport interface SearchResponse {\r\n /**Search results*/\r\n value: TValue[];\r\n facets: any | null;\r\n totalrecordcount: number;\r\n querycontext: any | null;\r\n}\r\n\r\nexport interface SuggestResponseValue {\r\n text: string;\r\n document: TDocument;\r\n}\r\n\r\nexport interface SuggestResponse {\r\n /**Suggestions*/\r\n value: SuggestResponseValue[];\r\n querycontext: any | null;\r\n}\r\n\r\nexport interface AutocompleteResponse {\r\n /**Autocomplete result*/\r\n value: string | null;\r\n querycontext: any | null;\r\n}\r\n\r\n//function overloads\r\n\r\ntype CallFunction = {\r\n /**\r\n * Calls a Web API function\r\n *\r\n * @param name - The name of a function.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (name: string): Promise;\r\n /**\r\n * Calls a bound Web API function\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundFunctionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API function (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundFunctionRequest): Promise;\r\n};\r\n\r\ntype CallAction = {\r\n /**\r\n * Calls a bound Web API action (bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {T} Type of the value in a response\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundActionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API action (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {T} Type of the value in a response\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundActionRequest): Promise;\r\n /**\r\n * Calls a bound Web API action (bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {TResponse} Type of the value in a response\r\n * @type {TAction} Type of an action object\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundActionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API action (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {TResponse} Type of the value in a response\r\n * @type {TAction} Type of an action object\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundActionRequest): Promise;\r\n};\r\n\r\ntype SearchFunction = {\r\n /**\r\n * Provides a search results page.\r\n * @param term - The term to be searched for and has a max 100-character limit.\r\n * @returns {Promise} Search result\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides a search results page.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Search result\r\n */\r\n (request: SearchRequest): Promise>;\r\n};\r\n\r\ntype SuggestFunction = {\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param term - The term to be searched for and has min 3 characters to a max 100-character limit.\r\n * @returns {Promise} Suggestions result\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Suggestions result\r\n */\r\n (request: SuggestRequest): Promise>;\r\n};\r\n\r\ntype AutocompleteFunction = {\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param term - The term to be searched for and has a 100-character limit.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n (request: AutocompleteRequest): Promise;\r\n};\r\n", "import { Utility } from \"../utils/Utility\";\r\nimport { InternalConfig } from \"../utils/Config\";\r\nimport { RequestUtility } from \"../utils/Request\";\r\nimport { DynamicsWebApiError, ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { Core } from \"../types\";\r\nimport { executeRequest } from \"./helpers/executeRequest\";\r\nimport { AccessToken } from \"../dynamics-web-api\";\r\n\r\nconst _addResponseParams = (requestId, responseParams) => {\r\n if (_responseParseParams[requestId]) _responseParseParams[requestId].push(responseParams);\r\n else _responseParseParams[requestId] = [responseParams];\r\n};\r\n\r\nconst _addRequestToBatchCollection = (requestId, request) => {\r\n if (_batchRequestCollection[requestId]) _batchRequestCollection[requestId].push(request);\r\n else _batchRequestCollection[requestId] = [request];\r\n};\r\n\r\nconst _clearRequestData = (requestId: string): void => {\r\n delete _responseParseParams[requestId];\r\n if (_batchRequestCollection.hasOwnProperty(requestId)) delete _batchRequestCollection[requestId];\r\n};\r\n\r\nconst _runRequest = async (request: Core.InternalRequest, config: InternalConfig): Promise => {\r\n try {\r\n const result = await RequestClient.sendRequest(request, config);\r\n _clearRequestData(request.requestId!);\r\n\r\n return result;\r\n } catch (error) {\r\n _clearRequestData(request.requestId!);\r\n throw error;\r\n } finally {\r\n _clearRequestData(request.requestId!);\r\n }\r\n};\r\n\r\nlet _batchRequestCollection: Core.BatchRequestCollection = {};\r\nlet _responseParseParams: { [key: string]: any[] } = {};\r\n\r\nexport class RequestClient {\r\n /**\r\n * Sends a request to given URL with given parameters\r\n *\r\n * @param {InternalRequest} request - Composed request to D365 Web Api\r\n * @param {InternalConfig} config - DynamicsWebApi config.\r\n */\r\n static async sendRequest(request: Core.InternalRequest, config: InternalConfig): Promise {\r\n request.headers = request.headers || {};\r\n request.responseParameters = request.responseParameters || {};\r\n request.requestId = request.requestId || Utility.generateUUID();\r\n\r\n //add response parameters to parse\r\n _addResponseParams(request.requestId, request.responseParameters);\r\n\r\n //stringify passed data\r\n let processedData = null;\r\n\r\n const isBatchConverted = request.responseParameters?.convertedToBatch;\r\n\r\n if (request.path === \"$batch\" && !isBatchConverted) {\r\n const batchRequest = _batchRequestCollection[request.requestId];\r\n\r\n if (!batchRequest) throw ErrorHelper.batchIsEmpty();\r\n\r\n const batchResult = RequestUtility.convertToBatch(batchRequest, config, request);\r\n\r\n processedData = batchResult.body;\r\n request.headers = { ...batchResult.headers, ...request.headers };\r\n\r\n //clear an array of requests\r\n delete _batchRequestCollection[request.requestId];\r\n } else {\r\n processedData = !isBatchConverted ? RequestUtility.processData(request.data, config) : request.data;\r\n\r\n if (!isBatchConverted) request.headers = RequestUtility.setStandardHeaders(request.headers);\r\n }\r\n\r\n if (config.impersonate && !request.headers![\"MSCRMCallerID\"]) {\r\n request.headers![\"MSCRMCallerID\"] = config.impersonate;\r\n }\r\n\r\n if (config.impersonateAAD && !request.headers![\"CallerObjectId\"]) {\r\n request.headers![\"CallerObjectId\"] = config.impersonateAAD;\r\n }\r\n\r\n let token: AccessToken | string | null = null;\r\n\r\n //call a token refresh callback only if it is set and there is no \"Authorization\" header set yet\r\n if (config.onTokenRefresh && (!request.headers || (request.headers && !request.headers[\"Authorization\"]))) {\r\n token = await config.onTokenRefresh();\r\n if (!token) throw new Error(\"Token is empty. Request is aborted.\");\r\n }\r\n\r\n if (token) {\r\n request.headers![\"Authorization\"] = \"Bearer \" + (token.hasOwnProperty(\"accessToken\") ? (token as AccessToken).accessToken : token);\r\n }\r\n\r\n if (Utility.isRunningWithinPortals()) {\r\n request.headers![\"__RequestVerificationToken\"] = await global.window.shell!.getTokenDeferred();\r\n }\r\n\r\n const url = request.apiConfig ? request.apiConfig.url : config.dataApi.url;\r\n\r\n return await executeRequest({\r\n method: request.method!,\r\n uri: url!.toString() + request.path,\r\n data: processedData,\r\n additionalHeaders: request.headers,\r\n responseParams: _responseParseParams,\r\n isAsync: request.async,\r\n timeout: request.timeout || config.timeout,\r\n proxy: config.proxy,\r\n requestId: request.requestId!,\r\n abortSignal: request.signal,\r\n });\r\n }\r\n\r\n private static async _getCollectionNames(entityName: string, config: InternalConfig): Promise {\r\n if (!Utility.isNull(RequestUtility.entityNames)) {\r\n return RequestUtility.findCollectionName(entityName) || entityName;\r\n }\r\n\r\n const request = RequestUtility.compose(\r\n {\r\n method: \"GET\",\r\n collection: \"EntityDefinitions\",\r\n select: [\"EntitySetName\", \"LogicalName\"],\r\n noCache: true,\r\n functionName: \"retrieveMultiple\",\r\n },\r\n config\r\n );\r\n\r\n const result = await _runRequest(request, config);\r\n RequestUtility.entityNames = {};\r\n for (let i = 0; i < result.data.value.length; i++) {\r\n RequestUtility.entityNames[result.data.value[i].LogicalName] = result.data.value[i].EntitySetName;\r\n }\r\n\r\n return RequestUtility.findCollectionName(entityName) || entityName;\r\n }\r\n\r\n private static _isEntityNameException(entityName: string): boolean {\r\n const exceptions = [\r\n \"$metadata\",\r\n \"EntityDefinitions\",\r\n \"RelationshipDefinitions\",\r\n \"GlobalOptionSetDefinitions\",\r\n \"ManagedPropertyDefinitions\",\r\n \"query\",\r\n \"suggest\",\r\n \"autocomplete\",\r\n ];\r\n\r\n return exceptions.indexOf(entityName) > -1;\r\n }\r\n\r\n private static async _checkCollectionName(entityName: string | null | undefined, config: InternalConfig): Promise {\r\n if (!entityName || RequestClient._isEntityNameException(entityName)) {\r\n return entityName;\r\n }\r\n\r\n entityName = entityName.toLowerCase();\r\n\r\n if (!config.useEntityNames) {\r\n return entityName;\r\n }\r\n\r\n try {\r\n return await RequestClient._getCollectionNames(entityName, config);\r\n } catch (error: any) {\r\n throw new Error(\"Unable to fetch Collection Names. Error: \" + (error as DynamicsWebApiError).message);\r\n }\r\n }\r\n\r\n static async makeRequest(request: Core.InternalRequest, config: InternalConfig): Promise {\r\n request.responseParameters = request.responseParameters || {};\r\n //we don't want to mix headers set by the library and by the user\r\n request.userHeaders = request.headers;\r\n delete request.headers;\r\n\r\n if (!request.isBatch) {\r\n const collectionName = await RequestClient._checkCollectionName(request.collection, config);\r\n\r\n request.collection = collectionName;\r\n RequestUtility.compose(request, config);\r\n request.responseParameters.convertedToBatch = false;\r\n\r\n //the URL contains more characters than max possible limit, convert the request to a batch request\r\n if (request.path!.length > 2000) {\r\n const batchRequest = RequestUtility.convertToBatch([request], config);\r\n\r\n request.method = \"POST\";\r\n request.path = \"$batch\";\r\n request.data = batchRequest.body;\r\n request.headers = { ...batchRequest.headers, ...request.userHeaders };\r\n request.responseParameters.convertedToBatch = true;\r\n }\r\n\r\n return _runRequest(request, config);\r\n }\r\n\r\n //no need to make a request to web api if it's a part of batch\r\n RequestUtility.compose(request, config);\r\n //add response parameters to parse\r\n _addResponseParams(request.requestId, request.responseParameters);\r\n _addRequestToBatchCollection(request.requestId, request);\r\n }\r\n\r\n static _clearTestData(): void {\r\n RequestUtility.entityNames = null;\r\n _responseParseParams = {};\r\n _batchRequestCollection = {};\r\n }\r\n\r\n static getCollectionName(entityName: string): string | null {\r\n return RequestUtility.findCollectionName(entityName);\r\n }\r\n}\r\n", "import { Utility } from \"./Utility\";\r\nimport { Config, HeaderCollection } from \"../dynamics-web-api\";\r\nimport { ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { Core } from \"../types\";\r\nimport { InternalConfig } from \"./Config\";\r\n\r\n/**\r\n * @typedef {Object} ConvertedRequestOptions\r\n * @property {string} url URL (without query)\r\n * @property {string} query Query String\r\n * @property {Object} headers Heades object (always an Object; can be empty: {})\r\n */\r\n\r\n/**\r\n * @typedef {Object} ConvertedRequest\r\n * @property {string} url URL (including Query String)\r\n * @property {Object} headers Heades object (always an Object; can be empty: {})\r\n * @property {boolean} async\r\n */\r\n\r\nexport class RequestUtility {\r\n /**\r\n * Converts a request object to URL link\r\n *\r\n * @param {Object} request - Request object\r\n * @param {Object} [config] - DynamicsWebApi config\r\n * @returns {ConvertedRequest} Converted request\r\n */\r\n static compose(request: Core.InternalRequest, config: InternalConfig): Core.InternalRequest {\r\n request.path = request.path || \"\";\r\n request.functionName = request.functionName || \"\";\r\n if (!request.url) {\r\n if (!request._isUnboundRequest && !request.contentId && !request.collection) {\r\n ErrorHelper.parameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, \"request.collection\");\r\n }\r\n if (request.collection != null) {\r\n ErrorHelper.stringParameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, \"request.collection\");\r\n request.path = request.collection;\r\n\r\n //add alternate key feature\r\n if (request.key) {\r\n request.key = ErrorHelper.keyParameterCheck(request.key, `DynamicsWebApi.${request.functionName}`, \"request.key\");\r\n request.path += `(${request.key})`;\r\n }\r\n }\r\n\r\n if (request.contentId) {\r\n ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, \"request.contentId\");\r\n if (request.contentId.startsWith(\"$\")) {\r\n request.path = request.path ? `${request.contentId}/${request.path}` : request.contentId;\r\n }\r\n }\r\n\r\n if (request._additionalUrl) {\r\n if (request.path) {\r\n request.path += \"/\";\r\n }\r\n request.path += request._additionalUrl;\r\n }\r\n\r\n request.path = RequestUtility.composeUrl(request, config, request.path);\r\n\r\n if (request.fetchXml) {\r\n ErrorHelper.stringParameterCheck(request.fetchXml, `DynamicsWebApi.${request.functionName}`, \"request.fetchXml\");\r\n let join = request.path.indexOf(\"?\") === -1 ? \"?\" : \"&\";\r\n request.path += `${join}fetchXml=${encodeURIComponent(request.fetchXml)}`;\r\n }\r\n } else {\r\n ErrorHelper.stringParameterCheck(request.url, `DynamicsWebApi.${request.functionName}`, \"request.url\");\r\n request.path = request.url.replace(config.dataApi.url, \"\");\r\n }\r\n\r\n if (request.hasOwnProperty(\"async\") && request.async != null) {\r\n ErrorHelper.boolParameterCheck(request.async, `DynamicsWebApi.${request.functionName}`, \"request.async\");\r\n } else {\r\n request.async = true;\r\n }\r\n\r\n request.headers = RequestUtility.composeHeaders(request, config);\r\n\r\n return request;\r\n }\r\n\r\n /**\r\n * Converts optional parameters of the request to URL. If expand parameter exists this function is called recursively.\r\n *\r\n * @param {Object} request - Request object\r\n * @param {string} request.functionName - Name of the function that converts a request (for Error Handling)\r\n * @param {string} url - URL beginning (with required parameters)\r\n * @param {string} [joinSymbol] - URL beginning (with required parameters)\r\n * @param {Object} [config] - DynamicsWebApi config\r\n * @returns {ConvertedRequestOptions} Additional options in request\r\n */\r\n static composeUrl(request: Core.InternalRequest, config: Config, url: string = \"\", joinSymbol: string = \"&\"): string {\r\n const queryArray: string[] = [];\r\n\r\n if (request) {\r\n if (request.navigationProperty) {\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, `DynamicsWebApi.${request.functionName}`, \"request.navigationProperty\");\r\n url += \"/\" + request.navigationProperty;\r\n\r\n if (request.navigationPropertyKey) {\r\n let navigationKey = ErrorHelper.keyParameterCheck(\r\n request.navigationPropertyKey,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.navigationPropertyKey\"\r\n );\r\n url += \"(\" + navigationKey + \")\";\r\n }\r\n\r\n if (request.navigationProperty === \"Attributes\") {\r\n if (request.metadataAttributeType) {\r\n ErrorHelper.stringParameterCheck(\r\n request.metadataAttributeType,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.metadataAttributeType\"\r\n );\r\n url += \"/\" + request.metadataAttributeType;\r\n }\r\n }\r\n }\r\n\r\n if (request.select?.length) {\r\n ErrorHelper.arrayParameterCheck(request.select, `DynamicsWebApi.${request.functionName}`, \"request.select\");\r\n\r\n if (request.functionName == \"retrieve\" && request.select.length == 1 && request.select[0].endsWith(\"/$ref\")) {\r\n url += \"/\" + request.select[0];\r\n } else {\r\n if (request.select[0].startsWith(\"/\") && request.functionName == \"retrieve\") {\r\n if (request.navigationProperty == null) {\r\n url += request.select.shift();\r\n } else {\r\n request.select.shift();\r\n }\r\n }\r\n\r\n //check if anything left in the array\r\n if (request.select.length) {\r\n queryArray.push(\"$select=\" + request.select.join(\",\"));\r\n }\r\n }\r\n }\r\n\r\n if (request.filter) {\r\n ErrorHelper.stringParameterCheck(request.filter, `DynamicsWebApi.${request.functionName}`, \"request.filter\");\r\n const removeBracketsFromGuidReg = /[^\"']{([\\w\\d]{8}[-]?(?:[\\w\\d]{4}[-]?){3}[\\w\\d]{12})}(?:[^\"']|$)/g;\r\n let filterResult = request.filter;\r\n\r\n //fix bug 2018-06-11\r\n let m: RegExpExecArray | null = null;\r\n while ((m = removeBracketsFromGuidReg.exec(filterResult)) !== null) {\r\n if (m.index === removeBracketsFromGuidReg.lastIndex) {\r\n removeBracketsFromGuidReg.lastIndex++;\r\n }\r\n\r\n let replacement = m[0].endsWith(\")\") ? \")\" : \" \";\r\n filterResult = filterResult.replace(m[0], \" \" + m[1] + replacement);\r\n }\r\n\r\n queryArray.push(\"$filter=\" + encodeURIComponent(filterResult));\r\n }\r\n\r\n if (request.fieldName) {\r\n ErrorHelper.stringParameterCheck(request.fieldName, `DynamicsWebApi.${request.functionName}`, \"request.fieldName\");\r\n url += \"/\" + request.fieldName;\r\n }\r\n\r\n if (request.savedQuery) {\r\n queryArray.push(\r\n \"savedQuery=\" + ErrorHelper.guidParameterCheck(request.savedQuery, `DynamicsWebApi.${request.functionName}`, \"request.savedQuery\")\r\n );\r\n }\r\n\r\n if (request.userQuery) {\r\n queryArray.push(\r\n \"userQuery=\" + ErrorHelper.guidParameterCheck(request.userQuery, `DynamicsWebApi.${request.functionName}`, \"request.userQuery\")\r\n );\r\n }\r\n\r\n if (request.apply) {\r\n ErrorHelper.stringParameterCheck(request.apply, `DynamicsWebApi.${request.functionName}`, \"request.apply\");\r\n queryArray.push(\"$apply=\" + request.apply);\r\n }\r\n\r\n if (request.count) {\r\n ErrorHelper.boolParameterCheck(request.count, `DynamicsWebApi.${request.functionName}`, \"request.count\");\r\n queryArray.push(\"$count=\" + request.count);\r\n }\r\n\r\n if (request.top && request.top > 0) {\r\n ErrorHelper.numberParameterCheck(request.top, `DynamicsWebApi.${request.functionName}`, \"request.top\");\r\n queryArray.push(\"$top=\" + request.top);\r\n }\r\n\r\n if (request.orderBy != null && request.orderBy.length) {\r\n ErrorHelper.arrayParameterCheck(request.orderBy, `DynamicsWebApi.${request.functionName}`, \"request.orderBy\");\r\n queryArray.push(\"$orderby=\" + request.orderBy.join(\",\"));\r\n }\r\n\r\n if (request.partitionId) {\r\n ErrorHelper.stringParameterCheck(request.partitionId, `DynamicsWebApi.${request.functionName}`, \"request.partitionId\");\r\n queryArray.push(\"partitionid='\" + request.partitionId + \"'\");\r\n }\r\n\r\n if (request.downloadSize) {\r\n ErrorHelper.stringParameterCheck(request.downloadSize, `DynamicsWebApi.${request.functionName}`, \"request.downloadSize\");\r\n queryArray.push(\"size=\" + request.downloadSize);\r\n }\r\n\r\n if (request.queryParams?.length) {\r\n ErrorHelper.arrayParameterCheck(request.queryParams, `DynamicsWebApi.${request.functionName}`, \"request.queryParams\");\r\n queryArray.push(request.queryParams.join(\"&\"));\r\n }\r\n\r\n if (request.fileName) {\r\n ErrorHelper.stringParameterCheck(request.fileName, `DynamicsWebApi.${request.functionName}`, \"request.fileName\");\r\n queryArray.push(\"x-ms-file-name=\" + request.fileName);\r\n }\r\n\r\n if (request.data) {\r\n ErrorHelper.parameterCheck(request.data, `DynamicsWebApi.${request.functionName}`, \"request.data\");\r\n }\r\n\r\n if (request.isBatch) {\r\n ErrorHelper.boolParameterCheck(request.isBatch, `DynamicsWebApi.${request.functionName}`, \"request.isBatch\");\r\n }\r\n\r\n if (!Utility.isNull(request.inChangeSet)) {\r\n ErrorHelper.boolParameterCheck(request.inChangeSet, `DynamicsWebApi.${request.functionName}`, \"request.inChangeSet\");\r\n }\r\n\r\n if (request.isBatch && Utility.isNull(request.inChangeSet)) request.inChangeSet = true;\r\n\r\n if (request.timeout) {\r\n ErrorHelper.numberParameterCheck(request.timeout, `DynamicsWebApi.${request.functionName}`, \"request.timeout\");\r\n }\r\n\r\n if (request.expand?.length) {\r\n ErrorHelper.stringOrArrayParameterCheck(request.expand, `DynamicsWebApi.${request.functionName}`, \"request.expand\");\r\n if (typeof request.expand === \"string\") {\r\n queryArray.push(\"$expand=\" + request.expand);\r\n } else {\r\n const expandQueryArray: string[] = [];\r\n for (let i = 0; i < request.expand.length; i++) {\r\n if (request.expand[i].property) {\r\n const expand = request.expand[i];\r\n expand.functionName = `${request.functionName} $expand`;\r\n let expandConverted = RequestUtility.composeUrl(expand, config, \"\", \";\");\r\n if (expandConverted) {\r\n expandConverted = `(${expandConverted.substr(1)})`;\r\n }\r\n expandQueryArray.push(request.expand[i].property + expandConverted);\r\n }\r\n }\r\n if (expandQueryArray.length) {\r\n queryArray.push(\"$expand=\" + expandQueryArray.join(\",\"));\r\n }\r\n }\r\n }\r\n }\r\n\r\n return !queryArray.length ? url : url + \"?\" + queryArray.join(joinSymbol);\r\n }\r\n\r\n static composeHeaders(request: Core.InternalRequest, config: Config): HeaderCollection {\r\n const headers: HeaderCollection = { ...config.headers, ...request.userHeaders };\r\n\r\n const prefer = RequestUtility.composePreferHeader(request, config);\r\n if (prefer.length) {\r\n headers[\"Prefer\"] = prefer;\r\n }\r\n\r\n if (request.collection === \"$metadata\") {\r\n headers[\"Accept\"] = \"application/xml\";\r\n }\r\n\r\n if (request.transferMode) {\r\n headers[\"x-ms-transfer-mode\"] = request.transferMode;\r\n }\r\n\r\n if (request.ifmatch != null && request.ifnonematch != null) {\r\n throw new Error(\r\n `DynamicsWebApi.${request.functionName}. Either one of request.ifmatch or request.ifnonematch parameters should be used in a call, not both.`\r\n );\r\n }\r\n\r\n if (request.ifmatch) {\r\n ErrorHelper.stringParameterCheck(request.ifmatch, `DynamicsWebApi.${request.functionName}`, \"request.ifmatch\");\r\n headers[\"If-Match\"] = request.ifmatch;\r\n }\r\n\r\n if (request.ifnonematch) {\r\n ErrorHelper.stringParameterCheck(request.ifnonematch, `DynamicsWebApi.${request.functionName}`, \"request.ifnonematch\");\r\n headers[\"If-None-Match\"] = request.ifnonematch;\r\n }\r\n\r\n if (request.impersonate) {\r\n ErrorHelper.stringParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, \"request.impersonate\");\r\n headers[\"MSCRMCallerID\"] = ErrorHelper.guidParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, \"request.impersonate\");\r\n }\r\n\r\n if (request.impersonateAAD) {\r\n ErrorHelper.stringParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, \"request.impersonateAAD\");\r\n headers[\"CallerObjectId\"] = ErrorHelper.guidParameterCheck(\r\n request.impersonateAAD,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.impersonateAAD\"\r\n );\r\n }\r\n\r\n if (request.token) {\r\n ErrorHelper.stringParameterCheck(request.token, `DynamicsWebApi.${request.functionName}`, \"request.token\");\r\n headers[\"Authorization\"] = \"Bearer \" + request.token;\r\n }\r\n\r\n if (request.duplicateDetection) {\r\n ErrorHelper.boolParameterCheck(request.duplicateDetection, `DynamicsWebApi.${request.functionName}`, \"request.duplicateDetection\");\r\n headers[\"MSCRM.SuppressDuplicateDetection\"] = \"false\";\r\n }\r\n\r\n if (request.bypassCustomPluginExecution) {\r\n ErrorHelper.boolParameterCheck(\r\n request.bypassCustomPluginExecution,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.bypassCustomPluginExecution\"\r\n );\r\n headers[\"MSCRM.BypassCustomPluginExecution\"] = \"true\";\r\n }\r\n\r\n if (request.noCache) {\r\n ErrorHelper.boolParameterCheck(request.noCache, `DynamicsWebApi.${request.functionName}`, \"request.noCache\");\r\n headers[\"Cache-Control\"] = \"no-cache\";\r\n }\r\n\r\n if (request.mergeLabels) {\r\n ErrorHelper.boolParameterCheck(request.mergeLabels, `DynamicsWebApi.${request.functionName}`, \"request.mergeLabels\");\r\n headers[\"MSCRM.MergeLabels\"] = \"true\";\r\n }\r\n\r\n if (request.contentId) {\r\n ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, \"request.contentId\");\r\n if (!request.contentId.startsWith(\"$\")) {\r\n headers[\"Content-ID\"] = request.contentId;\r\n }\r\n }\r\n\r\n if (request.contentRange) {\r\n ErrorHelper.stringParameterCheck(request.contentRange, `DynamicsWebApi.${request.functionName}`, \"request.contentRange\");\r\n headers[\"Content-Range\"] = request.contentRange;\r\n }\r\n\r\n if (request.range) {\r\n ErrorHelper.stringParameterCheck(request.range, `DynamicsWebApi.${request.functionName}`, \"request.range\");\r\n headers[\"Range\"] = request.range;\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n static composePreferHeader(request: Core.InternalRequest, config: Config): string {\r\n let returnRepresentation: boolean | null | undefined = request.returnRepresentation;\r\n let includeAnnotations: string | null | undefined = request.includeAnnotations;\r\n let maxPageSize: number | null | undefined = request.maxPageSize;\r\n let trackChanges: boolean | null | undefined = request.trackChanges;\r\n let continueOnError: boolean | null | undefined = request.continueOnError;\r\n\r\n let prefer: string[] = [];\r\n\r\n if (request.prefer && request.prefer.length) {\r\n ErrorHelper.stringOrArrayParameterCheck(request.prefer, `DynamicsWebApi.${request.functionName}`, \"request.prefer\");\r\n if (typeof request.prefer === \"string\") {\r\n prefer = request.prefer.split(\",\");\r\n }\r\n for (let i in prefer) {\r\n let item = prefer[i].trim();\r\n if (item === \"return=representation\") {\r\n returnRepresentation = true;\r\n } else if (item.includes(\"odata.include-annotations=\")) {\r\n includeAnnotations = item.replace(\"odata.include-annotations=\", \"\").replace(/\"/g, \"\");\r\n } else if (item.startsWith(\"odata.maxpagesize=\")) {\r\n maxPageSize = Number(item.replace(\"odata.maxpagesize=\", \"\").replace(/\"/g, \"\")) || 0;\r\n } else if (item.includes(\"odata.track-changes\")) {\r\n trackChanges = true;\r\n } else if (item.includes(\"odata.continue-on-error\")) {\r\n continueOnError = true;\r\n }\r\n }\r\n }\r\n\r\n //clear array\r\n prefer = [];\r\n\r\n if (config) {\r\n if (returnRepresentation == null) {\r\n returnRepresentation = config.returnRepresentation;\r\n }\r\n includeAnnotations = includeAnnotations ? includeAnnotations : config.includeAnnotations;\r\n maxPageSize = maxPageSize ? maxPageSize : config.maxPageSize;\r\n }\r\n\r\n if (returnRepresentation) {\r\n ErrorHelper.boolParameterCheck(returnRepresentation, `DynamicsWebApi.${request.functionName}`, \"request.returnRepresentation\");\r\n prefer.push(\"return=representation\");\r\n }\r\n\r\n if (includeAnnotations) {\r\n ErrorHelper.stringParameterCheck(includeAnnotations, `DynamicsWebApi.${request.functionName}`, \"request.includeAnnotations\");\r\n prefer.push(`odata.include-annotations=\"${includeAnnotations}\"`);\r\n }\r\n\r\n if (maxPageSize && maxPageSize > 0) {\r\n ErrorHelper.numberParameterCheck(maxPageSize, `DynamicsWebApi.${request.functionName}`, \"request.maxPageSize\");\r\n prefer.push(\"odata.maxpagesize=\" + maxPageSize);\r\n }\r\n\r\n if (trackChanges) {\r\n ErrorHelper.boolParameterCheck(trackChanges, `DynamicsWebApi.${request.functionName}`, \"request.trackChanges\");\r\n prefer.push(\"odata.track-changes\");\r\n }\r\n\r\n if (continueOnError) {\r\n ErrorHelper.boolParameterCheck(continueOnError, `DynamicsWebApi.${request.functionName}`, \"request.continueOnError\");\r\n prefer.push(\"odata.continue-on-error\");\r\n }\r\n\r\n return prefer.join(\",\");\r\n }\r\n\r\n static convertToBatch(requests: Core.InternalRequest[], config: InternalConfig, batchRequest?: Core.InternalRequest): Core.InternalBatchRequest {\r\n const batchBoundary = `dwa_batch_${Utility.generateUUID()}`;\r\n\r\n const batchBody: string[] = [];\r\n let currentChangeSet: string | null = null;\r\n let contentId = 100000;\r\n\r\n requests.forEach((internalRequest) => {\r\n internalRequest.functionName = \"executeBatch\";\r\n if (batchRequest?.inChangeSet === false) internalRequest.inChangeSet = false;\r\n const inChangeSet = internalRequest.method === \"GET\" ? false : !!internalRequest.inChangeSet;\r\n\r\n if (!inChangeSet && currentChangeSet) {\r\n //end current change set\r\n batchBody.push(`\\n--${currentChangeSet}--`);\r\n\r\n currentChangeSet = null;\r\n contentId = 100000;\r\n }\r\n\r\n if (!currentChangeSet) {\r\n batchBody.push(`\\n--${batchBoundary}`);\r\n\r\n if (inChangeSet) {\r\n currentChangeSet = `changeset_${Utility.generateUUID()}`;\r\n batchBody.push(\"Content-Type: multipart/mixed;boundary=\" + currentChangeSet);\r\n }\r\n }\r\n\r\n if (inChangeSet) {\r\n batchBody.push(`\\n--${currentChangeSet}`);\r\n }\r\n\r\n batchBody.push(\"Content-Type: application/http\");\r\n batchBody.push(\"Content-Transfer-Encoding: binary\");\r\n\r\n if (inChangeSet) {\r\n const contentIdValue = internalRequest.headers!.hasOwnProperty(\"Content-ID\") ? internalRequest.headers![\"Content-ID\"] : ++contentId;\r\n\r\n batchBody.push(`Content-ID: ${contentIdValue}`);\r\n }\r\n\r\n if (!internalRequest.path?.startsWith(\"$\")) {\r\n batchBody.push(`\\n${internalRequest.method} ${config.dataApi.url}${internalRequest.path} HTTP/1.1`);\r\n } else {\r\n batchBody.push(`\\n${internalRequest.method} ${internalRequest.path} HTTP/1.1`);\r\n }\r\n\r\n if (internalRequest.method === \"GET\") {\r\n batchBody.push(\"Accept: application/json\");\r\n } else {\r\n batchBody.push(\"Content-Type: application/json\");\r\n }\r\n\r\n for (let key in internalRequest.headers) {\r\n if (key === \"Authorization\" || key === \"Content-ID\") continue;\r\n\r\n batchBody.push(`${key}: ${internalRequest.headers[key]}`);\r\n }\r\n\r\n if (internalRequest.data) {\r\n batchBody.push(`\\n${RequestUtility.processData(internalRequest.data, config)}`);\r\n }\r\n });\r\n\r\n if (currentChangeSet) {\r\n batchBody.push(`\\n--${currentChangeSet}--`);\r\n }\r\n\r\n batchBody.push(`\\n--${batchBoundary}--`);\r\n\r\n const headers = RequestUtility.setStandardHeaders(batchRequest?.userHeaders);\r\n headers[\"Content-Type\"] = `multipart/mixed;boundary=${batchBoundary}`;\r\n\r\n return { headers: headers, body: batchBody.join(\"\\n\") };\r\n }\r\n\r\n static entityNames: any = null;\r\n\r\n static findCollectionName(entityName: string): string | null {\r\n let collectionName = null;\r\n\r\n if (!Utility.isNull(RequestUtility.entityNames)) {\r\n collectionName = RequestUtility.entityNames[entityName];\r\n if (Utility.isNull(collectionName)) {\r\n for (let key in RequestUtility.entityNames) {\r\n if (RequestUtility.entityNames[key] === entityName) {\r\n return entityName;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return collectionName;\r\n }\r\n\r\n static processData(data: any, config: InternalConfig): string | Uint8Array | Uint16Array | Uint32Array | null {\r\n let stringifiedData: string | null = null;\r\n if (data) {\r\n if (data instanceof Uint8Array || data instanceof Uint16Array || data instanceof Uint32Array) return data;\r\n\r\n stringifiedData = JSON.stringify(data, (key, value) => {\r\n if (key.endsWith(\"@odata.bind\") || key.endsWith(\"@odata.id\")) {\r\n if (typeof value === \"string\" && !value.startsWith(\"$\")) {\r\n //remove brackets in guid\r\n if (/\\(\\{[\\w\\d-]+\\}\\)/g.test(value)) {\r\n value = value.replace(/(.+)\\(\\{([\\w\\d-]+)\\}\\)/g, \"$1($2)\");\r\n }\r\n\r\n if (config.useEntityNames) {\r\n //replace entity name with collection name\r\n const regularExpression = /([\\w_]+)(\\([\\d\\w-]+\\))$/;\r\n const valueParts = regularExpression.exec(value);\r\n if (valueParts && valueParts.length > 2) {\r\n const collectionName = RequestUtility.findCollectionName(valueParts[1]);\r\n\r\n if (!Utility.isNull(collectionName)) {\r\n value = value.replace(regularExpression, collectionName + \"$2\");\r\n }\r\n }\r\n }\r\n\r\n if (!value.startsWith(config.dataApi.url)) {\r\n //add full web api url if it's not set\r\n if (key.endsWith(\"@odata.bind\")) {\r\n if (!value.startsWith(\"/\")) {\r\n value = \"/\" + value;\r\n }\r\n } else {\r\n value = config.dataApi.url + value.replace(/^\\//, \"\");\r\n }\r\n }\r\n }\r\n } else if (key.startsWith(\"oData\") || key.endsWith(\"_Formatted\") || key.endsWith(\"_NavigationProperty\") || key.endsWith(\"_LogicalName\")) {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n });\r\n\r\n stringifiedData = stringifiedData.replace(/[\\u007F-\\uFFFF]/g, function (chr: string) {\r\n return \"\\\\u\" + (\"0000\" + chr.charCodeAt(0).toString(16)).slice(-4);\r\n });\r\n }\r\n\r\n return stringifiedData;\r\n }\r\n\r\n static setStandardHeaders(headers: HeaderCollection = {}): any {\r\n if (!headers[\"Accept\"]) headers[\"Accept\"] = \"application/json\";\r\n if (!headers[\"OData-MaxVersion\"]) headers[\"OData-MaxVersion\"] = \"4.0\";\r\n if (!headers[\"OData-Version\"]) headers[\"OData-Version\"] = \"4.0\";\r\n if (headers[\"Content-Range\"]) headers[\"Content-Type\"] = \"application/octet-stream\";\r\n else if (!headers[\"Content-Type\"]) headers[\"Content-Type\"] = \"application/json; charset=utf-8\";\r\n\r\n return headers;\r\n }\r\n}\r\n", "import { Core } from \"../../types\";\r\n\r\nexport async function executeRequest(options: Core.RequestOptions): Promise {\r\n return global.DWA_BROWSER ? require(\"../xhr\").executeRequest(options) : require(\"../http\").executeRequest(options);\r\n}\r\n"], - "mappings": "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", + "sourcesContent": ["//had to move getCrypto for node to a different local module,\r\n//because esbuild does not support external require in esm format\r\nimport nCrypto from \"node:crypto\";\r\n\r\nexport function getCrypto () {\r\n return nCrypto;\r\n}", "export function getCrypto(): T {\r\n return global.DWA_BROWSER ? global.window.crypto : require(\"./crypto/node\").getCrypto();\r\n}\r\n\r\nexport function generateRandomBytes() {\r\n return global.DWA_BROWSER ? getCrypto().getRandomValues(new Uint8Array(1)) : getCrypto().randomBytes(1);\r\n}\r\n", "const uuid = \"[0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12}\";\r\n\r\nexport function isUuid(value: string): boolean {\r\n const match = new RegExp(uuid, \"i\").exec(value);\r\n return !!match;\r\n}\r\n\r\nexport function extractUuid(value: string): string | null {\r\n const match = new RegExp(\"^{?(\" + uuid + \")}?$\", \"i\").exec(value);\r\n return match ? match[1] : null;\r\n}\r\n\r\nexport function extractUuidFromUrl(url: string): string | null {\r\n const match = new RegExp(\"(\" + uuid + \")\\\\)$\", \"i\").exec(url);\r\n return match ? match[1] : null;\r\n}\r\n", "\uFEFFimport type * as Core from \"../types\";\r\nimport { generateRandomBytes } from \"../helpers/Crypto\";\r\nimport { isUuid, extractUuid } from \"../helpers/Regex\";\r\n\r\ndeclare var GetGlobalContext: any;\r\ndeclare var Xrm: any;\r\n\r\n// function isNodeEnv(): boolean {\r\n// // tslint:disable:strict-type-predicates\r\n// return Object.prototype.toString.call(typeof process !== \"undefined\" ? process : 0) === \"[object process]\";\r\n// }\r\n\r\n// function getGlobalObject(): T {\r\n// return (isNodeEnv() ? global : typeof window !== \"undefined\" ? window : typeof self !== \"undefined\" ? self : {}) as T;\r\n// }\r\n\r\nconst downloadChunkSize = 4194304;\r\n\r\nexport class Utility {\r\n /**\r\n * Builds parametes for a funciton. Returns '()' (if no parameters) or '([params])?[query]'\r\n *\r\n * @param {Object} [parameters] - Function's input parameters. Example: { param1: \"test\", param2: 3 }.\r\n * @returns {string}\r\n */\r\n static buildFunctionParameters(parameters?: any): Core.FunctionParameters {\r\n if (parameters) {\r\n const parameterNames = Object.keys(parameters);\r\n const functionParams: string[] = [];\r\n const urlQuery: string[] = [];\r\n\r\n for (let i = 1; i <= parameterNames.length; i++) {\r\n const parameterName = parameterNames[i - 1];\r\n let value = parameters[parameterName];\r\n\r\n if (value == null) continue;\r\n\r\n if (typeof value === \"string\" && !value.startsWith(\"Microsoft.Dynamics.CRM\") && !isUuid(value)) {\r\n value = `'${value}'`;\r\n } else if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n\r\n functionParams.push(`${parameterName}=@p${i}`);\r\n urlQuery.push(`@p${i}=${extractUuid(value) || value}`);\r\n }\r\n\r\n return {\r\n key: `(${functionParams.join(\",\")})`,\r\n queryParams: urlQuery,\r\n };\r\n } else {\r\n return {\r\n key: \"()\",\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Parses a paging cookie returned in response\r\n *\r\n * @param {string} pageCookies - Page cookies returned in @Microsoft.Dynamics.CRM.fetchxmlpagingcookie.\r\n * @param {number} currentPageNumber - A current page number. Fix empty paging-cookie for complex fetch xmls.\r\n * @returns {{cookie: \"\", number: 0, next: 1}}\r\n */\r\n static getFetchXmlPagingCookie(pageCookies: string = \"\", currentPageNumber: number = 1): Core.FetchXmlCookie {\r\n //get the page cokies\r\n pageCookies = decodeURIComponent(decodeURIComponent(pageCookies));\r\n\r\n const info = /pagingcookie=\"()/.exec(pageCookies);\r\n\r\n if (info != null) {\r\n let page = parseInt(info[2]);\r\n return {\r\n cookie: info[1]\r\n .replace(//g, \">\")\r\n .replace(/\\\"/g, \"'\")\r\n .replace(/\\'/g, \"&\" + \"quot;\"),\r\n page: page,\r\n nextPage: page + 1,\r\n };\r\n } else {\r\n //http://stackoverflow.com/questions/41262772/execution-of-fetch-xml-using-web-api-dynamics-365 workaround\r\n return {\r\n cookie: \"\",\r\n page: currentPageNumber,\r\n nextPage: currentPageNumber + 1,\r\n };\r\n }\r\n }\r\n\r\n // static isNodeEnv = isNodeEnv;\r\n\r\n static downloadChunkSize = downloadChunkSize;\r\n\r\n /**\r\n * Converts a response to a reference object\r\n *\r\n * @param {Object} responseData - Response object\r\n * @returns {ReferenceObject}\r\n */\r\n static convertToReferenceObject(responseData: any): Core.ReferenceObject {\r\n const result = /\\/(\\w+)\\(([0-9A-F]{8}[-]?([0-9A-F]{4}[-]?){3}[0-9A-F]{12})/i.exec(responseData[\"@odata.id\"]);\r\n return { id: result![2], collection: result![1], oDataContext: responseData[\"@odata.context\"] };\r\n }\r\n\r\n /**\r\n * Checks whether the value is JS Null.\r\n * @param {Object} value\r\n * @returns {boolean}\r\n */\r\n static isNull(value: any): boolean {\r\n return typeof value === \"undefined\" || value == null;\r\n }\r\n\r\n /** Generates UUID */\r\n static generateUUID(): string {\r\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) => (c ^ (generateRandomBytes()[0] & (15 >> (c / 4)))).toString(16));\r\n }\r\n\r\n static getXrmContext(): any {\r\n if (typeof GetGlobalContext !== \"undefined\") {\r\n return GetGlobalContext();\r\n } else {\r\n if (typeof Xrm !== \"undefined\") {\r\n //d365 v.9.0\r\n if (!Utility.isNull(Xrm.Utility) && !Utility.isNull(Xrm.Utility.getGlobalContext)) {\r\n return Xrm.Utility.getGlobalContext();\r\n } else if (!Utility.isNull(Xrm.Page) && !Utility.isNull(Xrm.Page.context)) {\r\n return Xrm.Page.context;\r\n }\r\n }\r\n }\r\n\r\n throw new Error(\r\n \"Xrm Context is not available. In most cases, it can be resolved by adding a reference to a ClientGlobalContext.js.aspx. Please refer to MSDN documentation for more details.\"\r\n );\r\n }\r\n\r\n // static getXrmUtility(): any {\r\n // return typeof Xrm !== \"undefined\" ? Xrm.Utility : null;\r\n // }\r\n\r\n static getClientUrl(): string {\r\n const context = Utility.getXrmContext();\r\n\r\n let clientUrl = context.getClientUrl();\r\n\r\n if (clientUrl.match(/\\/$/)) {\r\n clientUrl = clientUrl.substring(0, clientUrl.length - 1);\r\n }\r\n return clientUrl;\r\n }\r\n\r\n /**\r\n * Checks whether the app is currently running in a Dynamics Portals Environment.\r\n *\r\n * In that case we switch to the Web API for Dynamics Portals.\r\n * @returns {boolean}\r\n */\r\n static isRunningWithinPortals(): boolean {\r\n return global.DWA_BROWSER ? !!global.window.shell : false;\r\n }\r\n\r\n static isObject(obj: any): boolean {\r\n return typeof obj === \"object\" && !!obj && !Array.isArray(obj) && Object.prototype.toString.call(obj) !== \"[object Date]\";\r\n }\r\n\r\n static copyObject(src: any, excludeProps?: string[]): T {\r\n let target = {};\r\n for (let prop in src) {\r\n if (src.hasOwnProperty(prop) && !excludeProps?.includes(prop)) {\r\n // if the value is a nested object, recursively copy all its properties\r\n if (Utility.isObject(src[prop])) {\r\n target[prop] = Utility.copyObject(src[prop]);\r\n } else if (Array.isArray(src[prop])) {\r\n target[prop] = src[prop].slice();\r\n } else {\r\n target[prop] = src[prop];\r\n }\r\n }\r\n }\r\n return target;\r\n }\r\n\r\n static copyRequest(src: any, excludeProps: string[] = []): Core.InternalRequest {\r\n //todo: do we need to include \"data\" in here?\r\n if (!excludeProps.includes(\"signal\")) excludeProps.push(\"signal\");\r\n\r\n const result = Utility.copyObject(src, excludeProps);\r\n result.signal = src.signal;\r\n\r\n return result;\r\n }\r\n\r\n static setFileChunk(request: Core.InternalRequest, fileBuffer: Uint8Array | Buffer, chunkSize: number, offset: number): void {\r\n offset = offset || 0;\r\n\r\n const count = offset + chunkSize > fileBuffer.length ? fileBuffer.length % chunkSize : chunkSize;\r\n\r\n let content: any;\r\n\r\n if (global.DWA_BROWSER) {\r\n content = new Uint8Array(count);\r\n for (let i = 0; i < count; i++) {\r\n content[i] = fileBuffer[offset + i];\r\n }\r\n } else {\r\n content = fileBuffer.slice(offset, offset + count);\r\n }\r\n\r\n request.data = content;\r\n request.contentRange = \"bytes \" + offset + \"-\" + (offset + count - 1) + \"/\" + fileBuffer.length;\r\n }\r\n\r\n static convertToFileBuffer(binaryString: string): Uint8Array | Buffer {\r\n if (!global.DWA_BROWSER) return Buffer.from(binaryString, \"binary\");\r\n\r\n const bytes = new Uint8Array(binaryString.length);\r\n for (var i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n return bytes;\r\n }\r\n}\r\n", "\uFEFFimport { AccessToken } from \"../dynamics-web-api\";\r\nimport { extractUuid } from \"./Regex\";\r\n\r\nexport interface DynamicsWebApiError extends Error {\r\n status: number;\r\n}\r\n\r\nfunction throwParameterError(functionName: string, parameterName: string, type: string | null | undefined): void {\r\n throw new Error(\r\n type ? `${functionName} requires a ${parameterName} parameter to be of type ${type}.` : `${functionName} requires a ${parameterName} parameter.`\r\n );\r\n}\r\n\r\nexport class ErrorHelper {\r\n static handleErrorResponse(req): void {\r\n throw new Error(`Error: ${req.status}: ${req.message}`);\r\n }\r\n\r\n static parameterCheck(parameter: any, functionName: string, parameterName: string, type?: string): void {\r\n if (typeof parameter === \"undefined\" || parameter === null || parameter === \"\") {\r\n throwParameterError(functionName, parameterName, type);\r\n }\r\n }\r\n\r\n static stringParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter !== \"string\") {\r\n throwParameterError(functionName, parameterName, \"String\");\r\n }\r\n }\r\n\r\n static maxLengthStringParameterCheck(parameter: string | null, functionName: string, parameterName: string, maxLength: number): void {\r\n if (!parameter) return;\r\n\r\n if (parameter.length > maxLength) {\r\n throw new Error(`${parameterName} has a ${maxLength} character limit.`);\r\n }\r\n }\r\n\r\n static arrayParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (parameter.constructor !== Array) {\r\n throwParameterError(functionName, parameterName, \"Array\");\r\n }\r\n }\r\n\r\n static stringOrArrayParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (parameter.constructor !== Array && typeof parameter !== \"string\") {\r\n throwParameterError(functionName, parameterName, \"String or Array\");\r\n }\r\n }\r\n\r\n static numberParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter != \"number\") {\r\n if (typeof parameter === \"string\" && parameter) {\r\n if (!isNaN(parseInt(parameter))) {\r\n return;\r\n }\r\n }\r\n throwParameterError(functionName, parameterName, \"Number\");\r\n }\r\n }\r\n\r\n static batchIsEmpty(): Error[] {\r\n return [\r\n new Error(\r\n \"Payload of the batch operation is empty. Please make that you have other operations in between startBatch() and executeBatch() to successfuly build a batch payload.\"\r\n ),\r\n ];\r\n }\r\n\r\n static handleHttpError(parsedError: any, parameters?: any): DynamicsWebApiError {\r\n const error = new Error();\r\n\r\n Object.keys(parsedError).forEach((k) => {\r\n error[k] = parsedError[k];\r\n });\r\n\r\n if (parameters) {\r\n Object.keys(parameters).forEach((k) => {\r\n error[k] = parameters[k];\r\n });\r\n }\r\n\r\n return error;\r\n }\r\n\r\n static boolParameterCheck(parameter: any, functionName: string, parameterName: string): void {\r\n if (typeof parameter != \"boolean\") {\r\n throwParameterError(functionName, parameterName, \"Boolean\");\r\n }\r\n }\r\n\r\n /**\r\n * Private function used to check whether required parameter is a valid GUID\r\n * @param parameter The GUID parameter to check\r\n * @param functionName\r\n * @param parameterName\r\n * @returns\r\n */\r\n static guidParameterCheck(parameter: any, functionName: string, parameterName: string): string {\r\n const match = extractUuid(parameter);\r\n if (!match) throwParameterError(functionName, parameterName, \"GUID String\");\r\n\r\n return match!;\r\n }\r\n\r\n static keyParameterCheck(parameter: any, functionName: string, parameterName: string): string | undefined {\r\n try {\r\n ErrorHelper.stringParameterCheck(parameter, functionName, parameterName);\r\n\r\n //check if the param is a guid\r\n const match = extractUuid(parameter);\r\n if (match) return match;\r\n\r\n //check the alternate key\r\n const alternateKeys = parameter.split(\",\");\r\n\r\n if (alternateKeys.length) {\r\n for (let i = 0; i < alternateKeys.length; i++) {\r\n alternateKeys[i] = alternateKeys[i].trim().replace(/\"/g, \"'\");\r\n /^[\\w\\d\\_]+\\=(.+)$/i.exec(alternateKeys[i])![0];\r\n }\r\n }\r\n\r\n return alternateKeys.join(\",\");\r\n } catch (error) {\r\n throwParameterError(functionName, parameterName, \"String representing GUID or Alternate Key\");\r\n }\r\n }\r\n\r\n static callbackParameterCheck(callbackParameter: () => Promise, functionName: string, parameterName: string): void {\r\n if (typeof callbackParameter != \"function\") {\r\n throwParameterError(functionName, parameterName, \"Function\");\r\n }\r\n }\r\n\r\n static throwBatchIncompatible(functionName: string, isBatch: boolean): void {\r\n if (isBatch) {\r\n isBatch = false;\r\n throw new Error(functionName + \" cannot be used in a BATCH request.\");\r\n }\r\n }\r\n\r\n static throwBatchNotStarted(isBatch: boolean): void {\r\n if (!isBatch) {\r\n throw new Error(\r\n \"Batch operation has not been started. Please call a DynamicsWebApi.startBatch() function prior to calling DynamicsWebApi.executeBatch() to perform a batch request correctly.\"\r\n );\r\n }\r\n }\r\n}\r\n", "class DWA {\r\n\tstatic Prefer = class {\r\n\t\tstatic ReturnRepresentation: string = \"return=representation\";\r\n\t\tstatic Annotations = class {\r\n\t\t\tstatic AssociatedNavigationProperty: string = \"Microsoft.Dynamics.CRM.associatednavigationproperty\";\r\n\t\t\tstatic LookupLogicalName: string = \"Microsoft.Dynamics.CRM.lookuplogicalname\";\r\n\t\t\tstatic All: string = \"*\";\r\n\t\t\tstatic FormattedValue: string = \"OData.Community.Display.V1.FormattedValue\";\r\n\t\t\tstatic FetchXmlPagingCookie: string = \"Microsoft.Dynamics.CRM.fetchxmlpagingcookie\";\r\n\t\t};\r\n\t\tstatic IncludeAnnotations: string = \"odata.include-annotations\";\r\n\t\tstatic get(annotation: string) {\r\n\t\t\treturn `${DWA.Prefer.IncludeAnnotations}=\"${annotation}\"`;\r\n\t\t}\r\n\t};\r\n}\r\n\r\nexport { DWA };\r\n", "\uFEFFexport function dateReviver(key: string, value: any): Date {\r\n\tif (typeof value === \"string\") {\r\n\t\tconst a = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:Z|[-+]\\d{2}:\\d{2})$/.exec(value);\r\n\t\tif (a) {\r\n\t\t\treturn new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));\r\n\t\t}\r\n\t}\r\n\treturn value;\r\n}\r\n", "\uFEFFimport { DWA } from \"../../dwa\";\r\nimport { Utility } from \"../../utils/Utility\";\r\nimport { ErrorHelper, DynamicsWebApiError } from \"../../helpers/ErrorHelper\";\r\nimport { dateReviver } from \"./dateReviver\";\r\nimport type * as Core from \"../../types\";\r\nimport { extractUuidFromUrl } from \"../../helpers/Regex\";\r\n\r\nfunction getFormattedKeyValue(keyName: string, value: any): any[] {\r\n let newKey: string | null = null;\r\n if (keyName.indexOf(\"@\") !== -1) {\r\n const format = keyName.split(\"@\");\r\n switch (format[1]) {\r\n case \"odata.context\":\r\n newKey = \"oDataContext\";\r\n break;\r\n case \"odata.count\":\r\n newKey = \"oDataCount\";\r\n value = value != null ? parseInt(value) : 0;\r\n break;\r\n case \"odata.nextLink\":\r\n newKey = \"oDataNextLink\";\r\n break;\r\n case \"odata.deltaLink\":\r\n newKey = \"oDataDeltaLink\";\r\n break;\r\n case DWA.Prefer.Annotations.FormattedValue:\r\n newKey = format[0] + \"_Formatted\";\r\n break;\r\n case DWA.Prefer.Annotations.AssociatedNavigationProperty:\r\n newKey = format[0] + \"_NavigationProperty\";\r\n break;\r\n case DWA.Prefer.Annotations.LookupLogicalName:\r\n newKey = format[0] + \"_LogicalName\";\r\n break;\r\n }\r\n }\r\n\r\n return [newKey, value];\r\n}\r\n\r\n/**\r\n *\r\n * @param {any} object - parsed JSON object\r\n * @param {any} parseParams - parameters for parsing the response\r\n * @returns {any} parsed batch response\r\n */\r\nfunction parseData(object: any, parseParams?: any): any {\r\n if (parseParams) {\r\n if (parseParams.isRef && object[\"@odata.id\"] != null) {\r\n return Utility.convertToReferenceObject(object);\r\n }\r\n\r\n if (parseParams.toCount) {\r\n return getFormattedKeyValue(\"@odata.count\", object[\"@odata.count\"])[1] || 0;\r\n }\r\n }\r\n\r\n const keys = Object.keys(object);\r\n\r\n for (let i = 0; i < keys.length; i++) {\r\n const currentKey = keys[i];\r\n\r\n if (object[currentKey] != null) {\r\n if (object[currentKey].constructor === Array) {\r\n for (var j = 0; j < object[currentKey].length; j++) {\r\n object[currentKey][j] = parseData(object[currentKey][j]);\r\n }\r\n } else if (typeof object[currentKey] === \"object\") {\r\n parseData(object[currentKey]);\r\n }\r\n }\r\n\r\n //parse formatted values\r\n let formattedKeyValue = getFormattedKeyValue(currentKey, object[currentKey]);\r\n if (formattedKeyValue[0]) {\r\n object[formattedKeyValue[0]] = formattedKeyValue[1];\r\n }\r\n\r\n //parse aliased values\r\n if (currentKey.indexOf(\"_x002e_\") !== -1) {\r\n const aliasKeys = currentKey.split(\"_x002e_\");\r\n\r\n if (!object.hasOwnProperty(aliasKeys[0])) {\r\n object[aliasKeys[0]] = { _dwaType: \"alias\" };\r\n }\r\n //throw an error if there is already a property which is not an 'alias'\r\n else if (\r\n typeof object[aliasKeys[0]] !== \"object\" ||\r\n (typeof object[aliasKeys[0]] === \"object\" && !object[aliasKeys[0]].hasOwnProperty(\"_dwaType\"))\r\n ) {\r\n throw new Error(\"The alias name of the linked entity must be unique!\");\r\n }\r\n\r\n object[aliasKeys[0]][aliasKeys[1]] = object[currentKey];\r\n\r\n //aliases also contain formatted values\r\n formattedKeyValue = getFormattedKeyValue(aliasKeys[1], object[currentKey]);\r\n if (formattedKeyValue[0]) {\r\n object[aliasKeys[0]][formattedKeyValue[0]] = formattedKeyValue[1];\r\n }\r\n }\r\n }\r\n\r\n if (parseParams) {\r\n if (parseParams.hasOwnProperty(\"pageNumber\") && object[\"@\" + DWA.Prefer.Annotations.FetchXmlPagingCookie] != null) {\r\n object.PagingInfo = Utility.getFetchXmlPagingCookie(object[\"@\" + DWA.Prefer.Annotations.FetchXmlPagingCookie], parseParams.pageNumber);\r\n }\r\n }\r\n\r\n return object;\r\n}\r\n\r\nconst responseHeaderRegex = /^([^()<>@,;:\\\\\"\\/[\\]?={} \\t]+)\\s?:\\s?(.*)/;\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction parseBatchHeaders(text: string): any {\r\n const ctx = { position: 0 };\r\n const headers = {};\r\n let parts;\r\n let line;\r\n let pos;\r\n\r\n do {\r\n pos = ctx.position;\r\n line = readLine(text, ctx);\r\n parts = responseHeaderRegex.exec(line);\r\n if (parts !== null) {\r\n headers[parts[1].toLowerCase()] = parts[2];\r\n } else {\r\n // Whatever was found is not a header, so reset the context position.\r\n ctx.position = pos;\r\n }\r\n } while (line && parts);\r\n\r\n return headers;\r\n}\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction readLine(text: string, ctx: { position: number }): string | null {\r\n return readTo(text, ctx, \"\\r\\n\");\r\n}\r\n\r\n//partially taken from http://olingo.apache.org/doc/javascript/apidoc/batch.js.html\r\nfunction readTo(text: string, ctx: { position: number }, str: string): string | null {\r\n const start = ctx.position || 0;\r\n let end = text.length;\r\n if (str) {\r\n end = text.indexOf(str, start);\r\n if (end === -1) {\r\n return null;\r\n }\r\n ctx.position = end + str.length;\r\n } else {\r\n ctx.position = end;\r\n }\r\n\r\n return text.substring(start, end);\r\n}\r\n\r\n//partially taken from https://github.com/emiltholin/google-api-batch-utils\r\n/**\r\n *\r\n * @param {string} response - response that needs to be parsed\r\n * @param {Array} parseParams - parameters for parsing the response\r\n * @param {Number} [requestNumber] - number of the request\r\n * @returns {any} parsed batch response\r\n */\r\nfunction parseBatchResponse(response: string, parseParams: any, requestNumber: number = 0): (string | undefined | DynamicsWebApiError | Number)[] {\r\n // Not the same delimiter in the response as we specify ourselves in the request,\r\n // so we have to extract it.\r\n const delimiter = response.substr(0, response.indexOf(\"\\r\\n\"));\r\n const batchResponseParts = response.split(delimiter);\r\n // The first part will always be an empty string. Just remove it.\r\n batchResponseParts.shift();\r\n // The last part will be the \"--\". Just remove it.\r\n batchResponseParts.pop();\r\n\r\n let result: (string | undefined | DynamicsWebApiError | Number)[] = [];\r\n for (let i = 0; i < batchResponseParts.length; i++) {\r\n let batchResponse = batchResponseParts[i];\r\n if (batchResponse.indexOf(\"--changesetresponse_\") > -1) {\r\n batchResponse = batchResponse.trim();\r\n const batchToProcess = batchResponse.substring(batchResponse.indexOf(\"\\r\\n\") + 1).trim();\r\n\r\n result = result.concat(parseBatchResponse(batchToProcess, parseParams, requestNumber));\r\n } else {\r\n //check http status\r\n const httpStatusReg = /HTTP\\/?\\s*[\\d.]*\\s+(\\d{3})\\s+([\\w\\s]*)$/gm.exec(batchResponse);\r\n //todo: add error handler for httpStatus and httpStatusMessage; remove \"!\" operator\r\n const httpStatus = parseInt(httpStatusReg![1]);\r\n const httpStatusMessage = httpStatusReg![2].trim();\r\n\r\n const responseData = batchResponse.substring(batchResponse.indexOf(\"{\"), batchResponse.lastIndexOf(\"}\") + 1);\r\n\r\n if (!responseData) {\r\n if (/Content-Type: text\\/plain/i.test(batchResponse)) {\r\n const plainContentReg = /\\w+$/gi.exec(batchResponse.trim());\r\n const plainContent = plainContentReg && plainContentReg.length ? plainContentReg[0] : undefined;\r\n\r\n //check if a plain content is a number or not\r\n result.push(isNaN(Number(plainContent)) ? plainContent : Number(plainContent));\r\n } else {\r\n if (parseParams.length && parseParams[requestNumber] && parseParams[requestNumber].hasOwnProperty(\"valueIfEmpty\")) {\r\n result.push(parseParams[requestNumber].valueIfEmpty);\r\n } else {\r\n const entityUrl = /OData-EntityId.+/i.exec(batchResponse);\r\n\r\n if (entityUrl && entityUrl.length) {\r\n const guidResult = extractUuidFromUrl(entityUrl[0]);\r\n result.push(guidResult ? guidResult : undefined);\r\n } else {\r\n result.push(undefined);\r\n }\r\n }\r\n }\r\n } else {\r\n const parsedResponse = parseData(JSON.parse(responseData, dateReviver), parseParams[requestNumber]);\r\n\r\n if (httpStatus >= 400) {\r\n const responseHeaders = parseBatchHeaders(\r\n //todo: add error handler for httpStatusReg; remove \"!\" operator\r\n batchResponse.substring(batchResponse.indexOf(httpStatusReg![0]) + httpStatusReg![0].length + 1, batchResponse.indexOf(\"{\"))\r\n );\r\n\r\n result.push(\r\n ErrorHelper.handleHttpError(parsedResponse, {\r\n status: httpStatus,\r\n statusText: httpStatusMessage,\r\n statusMessage: httpStatusMessage,\r\n headers: responseHeaders,\r\n })\r\n );\r\n } else {\r\n result.push(parsedResponse);\r\n }\r\n }\r\n }\r\n\r\n requestNumber++;\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction base64ToString(base64: string): string {\r\n return global.DWA_BROWSER ? global.window.atob(base64) : Buffer.from(base64, \"base64\").toString(\"binary\");\r\n}\r\n\r\nfunction parseFileResponse(response: any, responseHeaders: any, parseParams: any): Core.FileParseResult {\r\n let data = response;\r\n\r\n if (parseParams.hasOwnProperty(\"parse\")) {\r\n data = JSON.parse(data).value;\r\n data = base64ToString(data);\r\n }\r\n\r\n var parseResult: Core.FileParseResult = {\r\n value: data,\r\n };\r\n\r\n if (responseHeaders[\"x-ms-file-name\"]) parseResult.fileName = responseHeaders[\"x-ms-file-name\"];\r\n\r\n if (responseHeaders[\"x-ms-file-size\"]) parseResult.fileSize = parseInt(responseHeaders[\"x-ms-file-size\"]);\r\n\r\n if (hasHeader(responseHeaders, \"Location\")) parseResult.location = getHeader(responseHeaders, \"Location\");\r\n\r\n return parseResult;\r\n}\r\n\r\nfunction hasHeader(headers: any, name: string): boolean {\r\n return headers.hasOwnProperty(name) || headers.hasOwnProperty(name.toLowerCase());\r\n}\r\n\r\nfunction getHeader(headers: any, name: string): string {\r\n if (headers[name]) return headers[name];\r\n\r\n return headers[name.toLowerCase()];\r\n}\r\n\r\n/**\r\n *\r\n * @param {string} response - response that needs to be parsed\r\n * @param {Array} responseHeaders - response headers\r\n * @param {Array} parseParams - parameters for parsing the response\r\n * @returns {any} parsed response\r\n */\r\nexport function parseResponse(response: string, responseHeaders: any, parseParams: any[]): any {\r\n let parseResult: any = undefined;\r\n if (response.length) {\r\n if (response.indexOf(\"--batchresponse_\") > -1) {\r\n const batch = parseBatchResponse(response, parseParams);\r\n\r\n parseResult = parseParams.length === 1 && parseParams[0].convertedToBatch ? batch[0] : batch;\r\n } else {\r\n if (hasHeader(responseHeaders, \"Content-Disposition\")) {\r\n parseResult = parseFileResponse(response, responseHeaders, parseParams[0]);\r\n } else {\r\n const contentType = getHeader(responseHeaders, \"Content-Type\");\r\n if (contentType.startsWith(\"application/json\")) {\r\n parseResult = parseData(JSON.parse(response, dateReviver), parseParams[0]);\r\n } else {\r\n parseResult = isNaN(Number(response)) ? response : Number(response);\r\n }\r\n }\r\n }\r\n } else {\r\n if (parseParams.length && parseParams[0].hasOwnProperty(\"valueIfEmpty\")) {\r\n parseResult = parseParams[0].valueIfEmpty;\r\n } else if (hasHeader(responseHeaders, \"OData-EntityId\")) {\r\n const entityUrl = getHeader(responseHeaders, \"OData-EntityId\");\r\n\r\n const guidResult = extractUuidFromUrl(entityUrl);\r\n\r\n if (guidResult) {\r\n parseResult = guidResult;\r\n }\r\n } else if (hasHeader(responseHeaders, \"Location\")) {\r\n parseResult = {\r\n location: getHeader(responseHeaders, \"Location\"),\r\n };\r\n\r\n if (responseHeaders[\"x-ms-chunk-size\"]) parseResult.chunkSize = parseInt(responseHeaders[\"x-ms-chunk-size\"]);\r\n }\r\n }\r\n\r\n return parseResult;\r\n}\r\n", "\uFEFFimport * as http from \"http\";\r\nimport * as https from \"https\";\r\nimport HttpProxyAgent from \"http-proxy-agent\";\r\nimport HttpsProxyAgent from \"https-proxy-agent\";\r\nimport type * as Core from \"../types\";\r\nimport { ErrorHelper } from \"./../helpers/ErrorHelper\";\r\nimport { parseResponse } from \"./helpers/parseResponse\";\r\n\r\nconst agents: { [key: string]: http.Agent } = {};\r\n\r\nconst getAgent = (options: Core.RequestOptions, protocol: string): http.Agent => {\r\n const isHttp = protocol === \"http\";\r\n const proxy = options.proxy;\r\n const agentName = proxy ? proxy.url : protocol;\r\n\r\n if (!agents[agentName]) {\r\n if (proxy) {\r\n const parsedProxyUrl = new URL(proxy.url);\r\n const proxyAgent = isHttp ? HttpProxyAgent.HttpProxyAgent : HttpsProxyAgent.HttpsProxyAgent;\r\n\r\n const proxyOptions: HttpProxyAgent.HttpProxyAgentOptions | HttpsProxyAgent.HttpsProxyAgentOptions = {\r\n host: parsedProxyUrl.hostname,\r\n port: parsedProxyUrl.port,\r\n protocol: parsedProxyUrl.protocol,\r\n };\r\n\r\n if (proxy.auth) proxyOptions.auth = proxy.auth.username + \":\" + proxy.auth.password;\r\n else if (parsedProxyUrl.username && parsedProxyUrl.password) proxyOptions.auth = `${parsedProxyUrl.username}:${parsedProxyUrl.password}`;\r\n\r\n agents[agentName] = new proxyAgent(proxyOptions);\r\n } else {\r\n const protocolInterface = isHttp ? http : https;\r\n\r\n agents[agentName] = new protocolInterface.Agent({\r\n keepAlive: true,\r\n maxSockets: Infinity,\r\n });\r\n }\r\n }\r\n\r\n return agents[agentName];\r\n};\r\n\r\nexport function executeRequest(options: Core.RequestOptions): Promise {\r\n return new Promise((resolve, reject) => {\r\n _executeRequest(options, resolve, reject);\r\n });\r\n}\r\n\r\n/**\r\n * Sends a request to given URL with given parameters\r\n *\r\n */\r\nfunction _executeRequest(\r\n options: Core.RequestOptions,\r\n successCallback: (response: Core.WebApiResponse) => void,\r\n errorCallback: (error: Core.WebApiErrorResponse | Core.WebApiErrorResponse[]) => void\r\n) {\r\n const data = options.data;\r\n const headers = options.headers;\r\n const responseParams = options.responseParams;\r\n const signal = options.abortSignal;\r\n\r\n const httpHeaders: http.OutgoingHttpHeaders = {};\r\n\r\n if (data) {\r\n httpHeaders[\"Content-Type\"] = headers[\"Content-Type\"];\r\n httpHeaders[\"Content-Length\"] = data.length;\r\n\r\n delete headers[\"Content-Type\"];\r\n }\r\n\r\n //set additional headers\r\n for (let key in headers) {\r\n httpHeaders[key] = headers[key];\r\n }\r\n const parsedUrl = new URL(options.uri);\r\n const protocol = parsedUrl.protocol?.slice(0, -1) || \"https\";\r\n const protocolInterface = protocol === \"http\" ? http : https;\r\n\r\n const internalOptions: http.RequestOptions = {\r\n hostname: parsedUrl.hostname,\r\n port: parsedUrl.port,\r\n path: parsedUrl.pathname + parsedUrl.search,\r\n method: options.method,\r\n timeout: options.timeout || 0,\r\n headers: httpHeaders,\r\n signal: signal,\r\n };\r\n\r\n //support environment variables\r\n if (!options.proxy && process.env[`${protocol}_proxy`]) {\r\n options.proxy = {\r\n url: process.env[`${protocol}_proxy`]!,\r\n };\r\n }\r\n\r\n internalOptions.agent = getAgent(options, protocol);\r\n\r\n if (options.proxy) {\r\n const hostHeader = new URL(options.proxy.url).host;\r\n if (hostHeader) httpHeaders.host = hostHeader;\r\n }\r\n\r\n const request = protocolInterface.request(internalOptions, function (res) {\r\n let rawData = \"\";\r\n res.setEncoding(\"utf8\");\r\n res.on(\"data\", function (chunk) {\r\n rawData += chunk;\r\n });\r\n res.on(\"end\", function () {\r\n switch (res.statusCode) {\r\n case 200: // Success with content returned in response body.\r\n case 201: // Success with content returned in response body.\r\n case 204: // Success with no content returned in response body.\r\n case 206: //Success with partial content\r\n case 304: {\r\n // Success with Not Modified\r\n let responseData = parseResponse(rawData, res.headers, responseParams[options.requestId]);\r\n\r\n let response = {\r\n data: responseData,\r\n headers: res.headers as any,\r\n status: res.statusCode,\r\n };\r\n\r\n successCallback(response);\r\n break;\r\n }\r\n default:\r\n // All other statuses are error cases.\r\n let crmError;\r\n try {\r\n var errorParsed = parseResponse(rawData, res.headers, responseParams[options.requestId]);\r\n\r\n if (Array.isArray(errorParsed)) {\r\n errorCallback(errorParsed);\r\n break;\r\n }\r\n\r\n crmError = errorParsed.hasOwnProperty(\"error\") && errorParsed.error ? errorParsed.error : { message: errorParsed.Message };\r\n } catch (e) {\r\n if (rawData.length > 0) {\r\n crmError = { message: rawData };\r\n } else {\r\n crmError = { message: \"Unexpected Error\" };\r\n }\r\n }\r\n\r\n errorCallback(\r\n ErrorHelper.handleHttpError(crmError, {\r\n status: res.statusCode,\r\n statusText: \"\",\r\n statusMessage: res.statusMessage,\r\n headers: res.headers,\r\n })\r\n );\r\n break;\r\n }\r\n });\r\n });\r\n\r\n if (internalOptions.timeout) {\r\n request.setTimeout(internalOptions.timeout, function () {\r\n request.destroy();\r\n });\r\n }\r\n\r\n request.on(\"error\", function (error) {\r\n errorCallback(error);\r\n });\r\n\r\n if (data) {\r\n request.write(data);\r\n }\r\n\r\n request.end();\r\n}\r\n", "import { Utility } from \"./Utility\";\r\nimport { ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { ApiConfig, Config } from \"../dynamics-web-api\";\r\n\r\ntype ApiType = \"dataApi\" | \"searchApi\";\r\n\r\nexport interface InternalApiConfig extends ApiConfig {\r\n url: string;\r\n}\r\n\r\nexport interface InternalConfig extends Config {\r\n dataApi: InternalApiConfig;\r\n searchApi: InternalApiConfig;\r\n}\r\n\r\nconst getApiUrl = (serverUrl: string | undefined | null, apiConfig: ApiConfig): string => {\r\n if (Utility.isRunningWithinPortals()) {\r\n return new URL(\"_api\", global.window.location.origin).toString() + \"/\";\r\n } else {\r\n if (!serverUrl) serverUrl = Utility.getClientUrl();\r\n return new URL(`api/${apiConfig.path}/v${apiConfig.version}`, serverUrl).toString() + \"/\";\r\n }\r\n};\r\n\r\nconst mergeApiConfigs = (apiConfig: ApiConfig | undefined, apiType: ApiType, internalConfig: InternalConfig): void => {\r\n const internalApiConfig = internalConfig[apiType] as InternalApiConfig;\r\n\r\n if (apiConfig?.version) {\r\n ErrorHelper.stringParameterCheck(apiConfig.version, \"DynamicsWebApi.setConfig\", `config.${apiType}.version`);\r\n internalApiConfig.version = apiConfig.version;\r\n }\r\n\r\n if (apiConfig?.path) {\r\n ErrorHelper.stringParameterCheck(apiConfig.path, \"DynamicsWebApi.setConfig\", `config.${apiType}.path`);\r\n internalApiConfig.path = apiConfig.path;\r\n }\r\n\r\n internalApiConfig.url = getApiUrl(internalConfig.serverUrl, internalApiConfig);\r\n};\r\n\r\nexport class ConfigurationUtility {\r\n static mergeApiConfigs = mergeApiConfigs;\r\n\r\n static merge(internalConfig: InternalConfig, config?: Config): void {\r\n if (config?.serverUrl) {\r\n ErrorHelper.stringParameterCheck(config.serverUrl, \"DynamicsWebApi.setConfig\", \"config.serverUrl\");\r\n internalConfig.serverUrl = config.serverUrl;\r\n }\r\n\r\n mergeApiConfigs(config?.dataApi, \"dataApi\", internalConfig);\r\n mergeApiConfigs(config?.searchApi, \"searchApi\", internalConfig);\r\n\r\n if (config?.impersonate) {\r\n internalConfig.impersonate = ErrorHelper.guidParameterCheck(config.impersonate, \"DynamicsWebApi.setConfig\", \"config.impersonate\");\r\n }\r\n\r\n if (config?.impersonateAAD) {\r\n internalConfig.impersonateAAD = ErrorHelper.guidParameterCheck(config.impersonateAAD, \"DynamicsWebApi.setConfig\", \"config.impersonateAAD\");\r\n }\r\n\r\n if (config?.onTokenRefresh) {\r\n ErrorHelper.callbackParameterCheck(config.onTokenRefresh, \"DynamicsWebApi.setConfig\", \"config.onTokenRefresh\");\r\n internalConfig.onTokenRefresh = config.onTokenRefresh;\r\n }\r\n\r\n if (config?.includeAnnotations) {\r\n ErrorHelper.stringParameterCheck(config.includeAnnotations, \"DynamicsWebApi.setConfig\", \"config.includeAnnotations\");\r\n internalConfig.includeAnnotations = config.includeAnnotations;\r\n }\r\n\r\n if (config?.timeout) {\r\n ErrorHelper.numberParameterCheck(config.timeout, \"DynamicsWebApi.setConfig\", \"config.timeout\");\r\n internalConfig.timeout = config.timeout;\r\n }\r\n\r\n if (config?.maxPageSize) {\r\n ErrorHelper.numberParameterCheck(config.maxPageSize, \"DynamicsWebApi.setConfig\", \"config.maxPageSize\");\r\n internalConfig.maxPageSize = config.maxPageSize;\r\n }\r\n\r\n if (config?.returnRepresentation) {\r\n ErrorHelper.boolParameterCheck(config.returnRepresentation, \"DynamicsWebApi.setConfig\", \"config.returnRepresentation\");\r\n internalConfig.returnRepresentation = config.returnRepresentation;\r\n }\r\n\r\n if (config?.useEntityNames) {\r\n ErrorHelper.boolParameterCheck(config.useEntityNames, \"DynamicsWebApi.setConfig\", \"config.useEntityNames\");\r\n internalConfig.useEntityNames = config.useEntityNames;\r\n }\r\n\r\n if (config?.headers) {\r\n internalConfig.headers = config.headers;\r\n }\r\n\r\n if (!global.DWA_BROWSER && config?.proxy) {\r\n ErrorHelper.parameterCheck(config.proxy, \"DynamicsWebApi.setConfig\", \"config.proxy\");\r\n\r\n if (config.proxy.url) {\r\n ErrorHelper.stringParameterCheck(config.proxy.url, \"DynamicsWebApi.setConfig\", \"config.proxy.url\");\r\n\r\n if (config.proxy.auth) {\r\n ErrorHelper.parameterCheck(config.proxy.auth, \"DynamicsWebApi.setConfig\", \"config.proxy.auth\");\r\n ErrorHelper.stringParameterCheck(config.proxy.auth.username, \"DynamicsWebApi.setConfig\", \"config.proxy.auth.username\");\r\n ErrorHelper.stringParameterCheck(config.proxy.auth.password, \"DynamicsWebApi.setConfig\", \"config.proxy.auth.password\");\r\n }\r\n }\r\n\r\n internalConfig.proxy = config.proxy;\r\n }\r\n }\r\n\r\n static default(): InternalConfig {\r\n return {\r\n serverUrl: null,\r\n impersonate: null,\r\n impersonateAAD: null,\r\n onTokenRefresh: null,\r\n includeAnnotations: null,\r\n maxPageSize: null,\r\n returnRepresentation: null,\r\n proxy: null,\r\n dataApi: {\r\n path: \"data\",\r\n version: \"9.2\",\r\n url: \"\"\r\n },\r\n searchApi: {\r\n path: \"search\",\r\n version: \"1.0\",\r\n url: \"\"\r\n },\r\n };\r\n }\r\n}\r\n", "\uFEFFimport { ConfigurationUtility } from \"./utils/Config\";\r\nimport { Utility } from \"./utils/Utility\";\r\nimport { ErrorHelper } from \"./helpers/ErrorHelper\";\r\nimport { RequestClient } from \"./client/RequestClient\";\r\nimport type { InternalRequest, WebApiResponse } from \"./types\";\r\n\r\n/**\r\n * Microsoft Dynamics CRM Web API helper library written in JavaScript.\r\n * It is compatible with: Dynamics 365 (online), Dynamics 365 (on-premise), Dynamics CRM 2016, Dynamics CRM Online.\r\n */\r\nexport class DynamicsWebApi {\r\n private _config = ConfigurationUtility.default();\r\n private _isBatch = false;\r\n private _batchRequestId: string | null = null;\r\n\r\n /**\r\n * Initializes a new instance of DynamicsWebApi\r\n * @param config - Configuration object\r\n */\r\n constructor(config?: Config) {\r\n ConfigurationUtility.merge(this._config, config);\r\n }\r\n\r\n /**\r\n\t * Merges provided configuration properties with an existing one.\r\n\t *\r\n\t * @param {DynamicsWebApi.Config} config - Configuration\r\n\t * @example\r\n\t dynamicsWebApi.setConfig({ serverUrl: 'https://contoso.api.crm.dynamics.com/' });\r\n\t */\r\n setConfig = (config: Config) => ConfigurationUtility.merge(this._config, config);\r\n\r\n private _makeRequest = async (request: InternalRequest): Promise => {\r\n request.isBatch = this._isBatch;\r\n if (this._batchRequestId) request.requestId = this._batchRequestId;\r\n return RequestClient.makeRequest(request, this._config);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a new record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n * @example\r\n *const lead = {\r\n * subject: \"Test WebAPI\",\r\n * firstname: \"Test\",\r\n * lastname: \"WebAPI\",\r\n * jobtitle: \"Title\"\r\n *};\r\n *\r\n *const request = {\r\n * data: lead,\r\n * collection: \"leads\",\r\n * returnRepresentation: true\r\n *}\r\n *\r\n *const response = await dynamicsWebApi.create(request);\r\n *\r\n */\r\n create = async (request: CreateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.create\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"create\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"POST\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n * @example\r\n *const request = {\r\n * key: '7d577253-3ef0-4a0a-bb7f-8335c2596e70',\r\n * collection: \"leads\",\r\n * select: [\"fullname\", \"subject\"],\r\n * ifnonematch: 'W/\"468026\"',\r\n * includeAnnotations: \"OData.Community.Display.V1.FormattedValue\"\r\n *};\r\n *\r\n *const response = await dynamicsWebApi.retrieve(request);\r\n */\r\n retrieve = async (request: RetrieveRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieve\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"retrieve\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"GET\";\r\n internalRequest.responseParameters = {\r\n isRef: internalRequest.select?.length === 1 && internalRequest.select[0].endsWith(\"/$ref\"),\r\n };\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n update = async (request: UpdateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.update\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"update\";\r\n } else internalRequest = request;\r\n\r\n //Metadata definitions, cannot be updated using \"PATCH\" method\r\n if (!internalRequest.method)\r\n internalRequest.method = /EntityDefinitions|RelationshipDefinitions|GlobalOptionSetDefinitions/.test(internalRequest.collection || \"\")\r\n ? \"PUT\"\r\n : \"PATCH\";\r\n\r\n internalRequest.responseParameters = { valueIfEmpty: true };\r\n\r\n if (internalRequest.ifmatch == null) {\r\n internalRequest.ifmatch = \"*\"; //to prevent upsert\r\n }\r\n\r\n //copy locally\r\n const ifmatch = internalRequest.ifmatch;\r\n\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifmatch && error.status === 412) {\r\n //precondition failed - not updated\r\n return false; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a single value in the record.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateSingleProperty = async (request: UpdateSinglePropertyRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateSingleProperty\", \"request\");\r\n ErrorHelper.parameterCheck(request.fieldValuePair, \"DynamicsWebApi.updateSingleProperty\", \"request.fieldValuePair\");\r\n\r\n var field = Object.keys(request.fieldValuePair)[0];\r\n var fieldValue = request.fieldValuePair[field];\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.navigationProperty = field;\r\n internalRequest.data = { value: fieldValue };\r\n internalRequest.functionName = \"updateSingleProperty\";\r\n internalRequest.method = \"PUT\";\r\n\r\n delete internalRequest[\"fieldValuePair\"];\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a record.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteRecord = async (request: DeleteRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteRecord\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"deleteRecord\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.responseParameters = { valueIfEmpty: true };\r\n\r\n //copy locally\r\n const ifmatch = internalRequest.ifmatch;\r\n\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifmatch && error.status === 412) {\r\n //precondition failed - not updated\r\n return false; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to upsert a record.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n upsert = async (request: UpsertRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.upsert\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"PATCH\";\r\n internalRequest.functionName = \"upsert\";\r\n\r\n //copy locally\r\n const ifnonematch = internalRequest.ifnonematch;\r\n const ifmatch = internalRequest.ifmatch;\r\n try {\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n } catch (error: any) {\r\n if (ifnonematch && error.status === 412) {\r\n //if prevent update\r\n return null; //todo: check this\r\n } else if (ifmatch && error.status === 404) {\r\n //if prevent create\r\n return null; //todo: check this\r\n }\r\n //rethrow error otherwise\r\n throw error;\r\n }\r\n };\r\n\r\n private _uploadFileChunk = async (request: InternalRequest, fileBytes: Uint8Array | Buffer, chunkSize: number, offset: number = 0): Promise => {\r\n // offset = offset || 0;\r\n Utility.setFileChunk(request, fileBytes, chunkSize, offset);\r\n\r\n await this._makeRequest(request);\r\n\r\n offset += chunkSize;\r\n if (offset <= fileBytes.length) {\r\n return this._uploadFileChunk(request, fileBytes, chunkSize, offset);\r\n }\r\n };\r\n\r\n /**\r\n * Upload file to a File Attribute\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n */\r\n uploadFile = async (request: UploadRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.uploadFile\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.uploadFile\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request, [\"data\"]);\r\n internalRequest.method = \"PATCH\";\r\n internalRequest.functionName = \"uploadFile\";\r\n internalRequest.transferMode = \"chunked\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n internalRequest.url = response?.data.location;\r\n delete internalRequest.transferMode;\r\n delete internalRequest.fieldName;\r\n delete internalRequest.fileName;\r\n return this._uploadFileChunk(internalRequest, request.data, response?.data.chunkSize);\r\n };\r\n\r\n private _downloadFileChunk = async (\r\n request: InternalRequest,\r\n bytesDownloaded: number = 0,\r\n // fileSize: number = 0,\r\n data: string = \"\"\r\n ): Promise => {\r\n // bytesDownloaded = bytesDownloaded || 0;\r\n // fileSize = fileSize || 0;\r\n // data = data || \"\";\r\n\r\n request.range = \"bytes=\" + bytesDownloaded + \"-\" + (bytesDownloaded + Utility.downloadChunkSize - 1);\r\n request.downloadSize = \"full\";\r\n\r\n const response = await this._makeRequest(request);\r\n\r\n request.url = response?.data.location;\r\n data += response?.data.value;\r\n\r\n bytesDownloaded += Utility.downloadChunkSize;\r\n\r\n if (bytesDownloaded <= response?.data.fileSize) {\r\n return this._downloadFileChunk(request, bytesDownloaded, data);\r\n }\r\n\r\n return {\r\n fileName: response?.data.fileName,\r\n fileSize: response?.data.fileSize,\r\n data: Utility.convertToFileBuffer(data),\r\n };\r\n };\r\n\r\n /**\r\n * Download a file from a File Attribute\r\n * @param request - An object that represents all possible options for a current request.\r\n */\r\n downloadFile = (request: DownloadRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.downloadFile\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.downloadFile\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"downloadFile\";\r\n internalRequest.responseParameters = { parse: true };\r\n\r\n return this._downloadFileChunk(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve records.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @param {string} [nextPageLink] - Use the value of the @odata.nextLink property with a new GET request to return the next page of data. Pass null to retrieveMultipleOptions.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveMultiple = async (request: RetrieveMultipleRequest, nextPageLink?: string): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveMultiple\", \"request\");\r\n\r\n let internalRequest: InternalRequest;\r\n\r\n if (!(request).functionName) {\r\n internalRequest = Utility.copyRequest(request);\r\n internalRequest.functionName = \"retrieveMultiple\";\r\n } else internalRequest = request;\r\n\r\n internalRequest.method = \"GET\";\r\n\r\n if (nextPageLink) {\r\n ErrorHelper.stringParameterCheck(nextPageLink, \"DynamicsWebApi.retrieveMultiple\", \"nextPageLink\");\r\n internalRequest.url = nextPageLink;\r\n }\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n\r\n return response?.data;\r\n };\r\n\r\n private _retrieveAllRequest = async (request: RetrieveMultipleRequest, nextPageLink?: string, records: any[] = []): Promise> => {\r\n const response = await this.retrieveMultiple(request, nextPageLink);\r\n records = records.concat(response.value);\r\n\r\n const pageLink = response.oDataNextLink;\r\n\r\n if (pageLink) {\r\n return this._retrieveAllRequest(request, pageLink, records);\r\n }\r\n\r\n const result: AllResponse = { value: records };\r\n\r\n if (response.oDataDeltaLink) {\r\n result[\"@odata.deltaLink\"] = response.oDataDeltaLink;\r\n result.oDataDeltaLink = response.oDataDeltaLink;\r\n }\r\n\r\n return result;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve all records.\r\n *\r\n * @param {DWARequest} request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAll = (request: RetrieveMultipleRequest): Promise> => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.retrieveAll\", this._isBatch);\r\n return this._retrieveAllRequest(request);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to count records. IMPORTANT! The count value does not represent the total number of entities in the system. It is limited by the maximum number of entities that can be returned. Returns: Number\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n count = async (request: CountRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.count\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"count\";\r\n\r\n if (internalRequest.filter?.length) {\r\n internalRequest.count = true;\r\n } else {\r\n internalRequest.navigationProperty = \"$count\";\r\n }\r\n\r\n internalRequest.responseParameters = { toCount: internalRequest.count };\r\n\r\n //if filter has not been specified then simplify the request\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to count records. Returns: Number\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n countAll = async (request: CountAllRequest): Promise => {\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.countAll\", this._isBatch);\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.countAll\", \"request\");\r\n\r\n const response = await this._retrieveAllRequest(request);\r\n\r\n return response ? (response.value ? response.value.length : 0) : 0;\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to execute FetchXml to retrieve records. Returns: DWA.Types.FetchXmlResponse\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n fetch = async (request: FetchXmlRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.fetch\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"GET\";\r\n internalRequest.functionName = \"fetch\";\r\n\r\n ErrorHelper.stringParameterCheck(internalRequest.fetchXml, \"DynamicsWebApi.fetch\", \"request.fetchXml\");\r\n\r\n //only add paging if there is no top\r\n if (internalRequest.fetchXml && !/^(request: FetchAllRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.fetchAll\", \"request\");\r\n\r\n const _executeFetchXmlAll = async (request: FetchXmlRequest, records: any[] = []): Promise> => {\r\n // records = records || [];\r\n\r\n const response = await this.fetch(request);\r\n\r\n records = records.concat(response.value);\r\n\r\n if (response.PagingInfo) {\r\n request.pageNumber = response.PagingInfo.nextPage;\r\n request.pagingCookie = response.PagingInfo.cookie;\r\n\r\n return _executeFetchXmlAll(request, records);\r\n }\r\n\r\n return { value: records };\r\n };\r\n\r\n ErrorHelper.throwBatchIncompatible(\"DynamicsWebApi.fetchAll\", this._isBatch);\r\n return _executeFetchXmlAll(request);\r\n };\r\n\r\n /**\r\n * Associate for a collection-valued navigation property. (1:N or N:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n associate = async (request: AssociateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.associate\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"associate\";\r\n\r\n ErrorHelper.stringParameterCheck(request.relatedCollection, \"DynamicsWebApi.associate\", \"request.relatedcollection\");\r\n ErrorHelper.stringParameterCheck(request.relationshipName, \"DynamicsWebApi.associate\", \"request.relationshipName\");\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.associate\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.associate\", \"request.relatedKey\");\r\n\r\n internalRequest.navigationProperty = request.relationshipName + \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n internalRequest.data = { \"@odata.id\": `${request.relatedCollection}(${relatedKey})` };\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Disassociate for a collection-valued navigation property.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n disassociate = async (request: DisassociateRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.disassociate\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.functionName = \"disassociate\";\r\n\r\n ErrorHelper.stringParameterCheck(request.relationshipName, \"DynamicsWebApi.disassociate\", \"request.relationshipName\");\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.disassociate\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.disassociate\", \"request.relatedId\");\r\n\r\n internalRequest.key = primaryKey;\r\n internalRequest.navigationProperty = `${request.relationshipName}(${relatedKey})/$ref`;\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Associate for a single-valued navigation property. (1:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n associateSingleValued = async (request: AssociateSingleValuedRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.associateSingleValued\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"PUT\";\r\n internalRequest.functionName = \"associateSingleValued\";\r\n\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.associateSingleValued\", \"request.primaryKey\");\r\n const relatedKey = ErrorHelper.keyParameterCheck(request.relatedKey, \"DynamicsWebApi.associateSingleValued\", \"request.relatedKey\");\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, \"DynamicsWebApi.associateSingleValued\", \"request.navigationProperty\");\r\n ErrorHelper.stringParameterCheck(request.relatedCollection, \"DynamicsWebApi.associateSingleValued\", \"request.relatedcollection\");\r\n\r\n internalRequest.navigationProperty += \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n internalRequest.data = { \"@odata.id\": `${request.relatedCollection}(${relatedKey})` };\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Removes a reference to an entity for a single-valued navigation property. (1:N)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n disassociateSingleValued = async (request: DisassociateSingleValuedRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.disassociateSingleValued\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.method = \"DELETE\";\r\n internalRequest.functionName = \"disassociateSingleValued\";\r\n\r\n const primaryKey = ErrorHelper.keyParameterCheck(request.primaryKey, \"DynamicsWebApi.disassociateSingleValued\", \"request.primaryKey\");\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, \"DynamicsWebApi.disassociateSingleValued\", \"request.navigationProperty\");\r\n\r\n internalRequest.navigationProperty += \"/$ref\";\r\n internalRequest.key = primaryKey;\r\n\r\n await this._makeRequest(internalRequest);\r\n };\r\n\r\n /**\r\n * Calls a Web API function\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n callFunction: CallFunction = async (request: string | BoundFunctionRequest | UnboundFunctionRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.callFunction`, \"request\");\r\n\r\n const getFunctionName = (request: BoundFunctionRequest | UnboundFunctionRequest) => request.name || request.functionName;\r\n\r\n const isObject = typeof request !== \"string\";\r\n const functionName = isObject ? getFunctionName(request) : request;\r\n const parameterName = isObject ? \"request.name\" : \"name\";\r\n const internalRequest: InternalRequest = isObject ? Utility.copyObject(request, [\"name\"]) : { functionName: functionName };\r\n\r\n ErrorHelper.stringParameterCheck(functionName, `DynamicsWebApi.callFunction`, parameterName);\r\n\r\n const functionParameters = Utility.buildFunctionParameters(internalRequest.parameters);\r\n\r\n internalRequest.method = \"GET\";\r\n internalRequest.addPath = functionName + functionParameters.key;\r\n internalRequest.queryParams = functionParameters.queryParams;\r\n internalRequest._isUnboundRequest = !internalRequest.collection;\r\n internalRequest.functionName = \"callFunction\";\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Calls a Web API action\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n callAction: CallAction = async (\r\n request: BoundActionRequest | UnboundActionRequest\r\n ): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.callAction`, \"request\");\r\n ErrorHelper.stringParameterCheck(request.actionName, `DynamicsWebApi.callAction`, \"request.actionName\");\r\n\r\n const internalRequest = Utility.copyRequest(request, [\"action\"]);\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"callAction\";\r\n\r\n internalRequest.addPath = request.actionName;\r\n internalRequest._isUnboundRequest = !internalRequest.collection;\r\n internalRequest.data = request.action;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n /**\r\n * Sends an asynchronous request to create an entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createEntity = (request: CreateEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, `DynamicsWebApi.createEntity`, \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createEntity\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"createEntity\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update an entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateEntity = (request: UpdateEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateEntity\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateEntity\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateEntity\", \"request.data.MetadataId\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.key = internalRequest.data.MetadataId;\r\n internalRequest.functionName = \"updateEntity\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveEntity = (request: RetrieveEntityRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveEntity\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.retrieveEntity\", \"request.key\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntity\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve entity definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveEntities = (request?: RetrieveEntitiesRequest): Promise> => {\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntities\";\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create an attribute.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createAttribute = (request: CreateAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createAttribute\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createAttribute\", \"request.data\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.createAttribute\", \"request.entityKey\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.functionName = \"retrieveEntity\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.key = request.entityKey;\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update an attribute.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateAttribute = (request: UpdateAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateAttribute\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateAttribute\", \"request.data\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.updateAttribute\", \"request.entityKey\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateAttribute\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateAttribute\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.navigationPropertyKey = request.data.MetadataId;\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"updateAttribute\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve attribute metadata for a specified entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAttributes = (request: RetrieveAttributesRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveAttributes\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.retrieveAttributes\", \"request.entityKey\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveAttributes\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"retrieveAttributes\";\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific attribute metadata for a specified entity definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveAttribute = (request: RetrieveAttributeRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveAttributes\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.entityKey, \"DynamicsWebApi.retrieveAttribute\", \"request.entityKey\");\r\n ErrorHelper.keyParameterCheck(request.attributeKey, \"DynamicsWebApi.retrieveAttribute\", \"request.attributeKey\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveAttribute\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"EntityDefinitions\";\r\n internalRequest.navigationProperty = \"Attributes\";\r\n internalRequest.navigationPropertyKey = request.attributeKey;\r\n internalRequest.metadataAttributeType = request.castType;\r\n internalRequest.key = request.entityKey;\r\n internalRequest.functionName = \"retrieveAttribute\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createRelationship = (request: CreateRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createRelationship\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createRelationship\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"createRelationship\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateRelationship = (request: UpdateRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateRelationship\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateRelationship\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateRelationship\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateRelationship\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.key = request.data.MetadataId;\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"updateRelationship\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteRelationship = (request: DeleteRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteRelationship\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.deleteRelationship\", \"request.key\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"deleteRelationship\";\r\n\r\n return this.deleteRecord(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve relationship definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveRelationships = (request?: RetrieveRelationshipsRequest): Promise> => {\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.functionName = \"retrieveRelationships\";\r\n\r\n if (request) {\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveRelationships\", \"request.castType\");\r\n internalRequest.navigationProperty = request.castType;\r\n }\r\n }\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve a specific relationship definition.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveRelationship = (request: RetrieveRelationshipRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveRelationship\", \"request\");\r\n ErrorHelper.keyParameterCheck(request.key, \"DynamicsWebApi.retrieveRelationship\", \"request.key\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveRelationship\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"RelationshipDefinitions\";\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"retrieveRelationship\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to create a Global Option Set definition\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n createGlobalOptionSet = (request: CreateGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.createGlobalOptionSet\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.createGlobalOptionSet\", \"request.data\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"createGlobalOptionSet\";\r\n\r\n return this.create(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to update a Global Option Set.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n updateGlobalOptionSet = (request: UpdateGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.updateGlobalOptionSet\", \"request\");\r\n ErrorHelper.parameterCheck(request.data, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.data\");\r\n ErrorHelper.guidParameterCheck(request.data.MetadataId, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.data.MetadataId\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.updateGlobalOptionSet\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.key = request.data.MetadataId;\r\n internalRequest.functionName = \"updateGlobalOptionSet\";\r\n internalRequest.method = \"PUT\";\r\n\r\n return this.update(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to delete a Global Option Set.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n deleteGlobalOptionSet = (request: DeleteGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.deleteGlobalOptionSet\", \"request\");\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"deleteGlobalOptionSet\";\r\n\r\n return this.deleteRecord(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve Global Option Set definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveGlobalOptionSet = (request: RetrieveGlobalOptionSetRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.retrieveGlobalOptionSet\", \"request\");\r\n\r\n if (request.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveGlobalOptionSet\", \"request.castType\");\r\n }\r\n\r\n const internalRequest = Utility.copyRequest(request);\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.navigationProperty = request.castType;\r\n internalRequest.functionName = \"retrieveGlobalOptionSet\";\r\n\r\n return this.retrieve(internalRequest);\r\n };\r\n\r\n /**\r\n * Sends an asynchronous request to retrieve Global Option Set definitions.\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n retrieveGlobalOptionSets = (request?: RetrieveGlobalOptionSetsRequest): Promise> => {\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"GlobalOptionSetDefinitions\";\r\n internalRequest.functionName = \"retrieveGlobalOptionSets\";\r\n\r\n if (request?.castType) {\r\n ErrorHelper.stringParameterCheck(request.castType, \"DynamicsWebApi.retrieveGlobalOptionSets\", \"request.castType\");\r\n internalRequest.navigationProperty = request.castType;\r\n }\r\n\r\n return this.retrieveMultiple(internalRequest);\r\n };\r\n\r\n /**\r\n * Retrieves a CSDL Document Metadata\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} A raw CSDL $metadata document.\r\n */\r\n retrieveCsdlMetadata = async (request?: CsdlMetadataRequest): Promise => {\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"$metadata\";\r\n internalRequest.functionName = \"retrieveCsdlMetadata\";\r\n\r\n if (request?.addAnnotations) {\r\n ErrorHelper.boolParameterCheck(request.addAnnotations, \"DynamicsWebApi.retrieveCsdlMetadata\", \"request.addAnnotations\");\r\n internalRequest.includeAnnotations = \"*\";\r\n }\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides a search results page.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Search result\r\n */\r\n search: SearchFunction = async (request: string | SearchRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.search\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.search\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.search\", parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.search\", parameterName, 100);\r\n\r\n internalRequest.collection = \"query\";\r\n internalRequest.functionName = \"search\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Suggestions result\r\n */\r\n suggest: SuggestFunction = async (request: string | SuggestRequest): Promise> => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.suggest\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.suggest\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.suggest\", parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.suggest\", parameterName, 100);\r\n\r\n internalRequest.functionName = internalRequest.collection = \"suggest\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n autocomplete: AutocompleteFunction = async (request: string | AutocompleteRequest): Promise => {\r\n ErrorHelper.parameterCheck(request, \"DynamicsWebApi.autocomplete\", \"request\");\r\n\r\n const isObject = Utility.isObject(request);\r\n const parameterName = isObject ? \"request.query.search\" : \"term\";\r\n const internalRequest: InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } };\r\n\r\n if (isObject) ErrorHelper.parameterCheck(internalRequest.query, \"DynamicsWebApi.autocomplete\", \"request.query\");\r\n ErrorHelper.stringParameterCheck(internalRequest.query.search, `DynamicsWebApi.autocomplete`, parameterName);\r\n ErrorHelper.maxLengthStringParameterCheck(internalRequest.query.search, \"DynamicsWebApi.autocomplete\", parameterName, 100);\r\n\r\n internalRequest.functionName = internalRequest.collection = \"autocomplete\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.data = internalRequest.query;\r\n internalRequest.apiConfig = this._config.searchApi;\r\n\r\n delete internalRequest.query;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Starts/executes a batch request.\r\n */\r\n startBatch = (): void => {\r\n this._isBatch = true;\r\n this._batchRequestId = Utility.generateUUID();\r\n };\r\n\r\n /**\r\n * Executes a batch request. Please call DynamicsWebApi.startBatch() first to start a batch request.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n executeBatch = async (request?: BatchRequest): Promise => {\r\n ErrorHelper.throwBatchNotStarted(this._isBatch);\r\n\r\n const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request);\r\n\r\n internalRequest.collection = \"$batch\";\r\n internalRequest.method = \"POST\";\r\n internalRequest.functionName = \"executeBatch\";\r\n internalRequest.requestId = this._batchRequestId;\r\n\r\n this._batchRequestId = null;\r\n this._isBatch = false;\r\n\r\n const response = await this._makeRequest(internalRequest);\r\n return response?.data;\r\n };\r\n\r\n /**\r\n * Creates a new instance of DynamicsWebApi. If config is not provided, it is copied from a current instance.\r\n *\r\n * @param {Config} config configuration object.\r\n * @returns {DynamicsWebApi} A new instance of DynamicsWebApi\r\n */\r\n initializeInstance = (config?: Config): DynamicsWebApi => new DynamicsWebApi(config || this._config);\r\n\r\n Utility = {\r\n /**\r\n * Searches for a collection name by provided entity name in a cached entity metadata.\r\n * The returned collection name can be null.\r\n *\r\n * @param {string} entityName entity name\r\n * @returns {string | null} collection name\r\n */\r\n getCollectionName: (entityName: string): string | null => RequestClient.getCollectionName(entityName),\r\n };\r\n}\r\n\r\nexport interface Expand {\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**Limit the number of results returned by using the $top system query option.Do not use $top with $count! */\r\n top?: number;\r\n /**An Array(of Strings) representing the order in which items are returned using the $orderby system query option.Use the asc or desc suffix to specify ascending or descending order respectively.The default is ascending if the suffix isn't applied. */\r\n orderBy?: string[];\r\n /**A name of a single-valued navigation property which needs to be expanded. */\r\n property?: string;\r\n /**An Array of Expand Objects representing the $expand Query Option value to control which related records need to be returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface BaseRequest {\r\n /**XHR requests only! Indicates whether the requests should be made synchronously or asynchronously.Default value is 'true'(asynchronously). */\r\n async?: boolean;\r\n /**Impersonates a user based on their systemuserid by adding \"MSCRMCallerID\" header. A String representing the GUID value for the Dynamics 365 systemuserid. */\r\n impersonate?: string;\r\n /**Impersonates a user based on their Azure Active Directory (AAD) object id by passing that value along with the header \"CallerObjectId\". A String should represent a GUID value. */\r\n impersonateAAD?: string;\r\n /**If set to 'true', DynamicsWebApi adds a request header 'Cache-Control: no-cache'.Default value is 'false'. */\r\n noCache?: boolean;\r\n /** Authorization Token. If set, onTokenRefresh will not be called. */\r\n token?: string;\r\n /**Sets a number of milliseconds before a request times out. */\r\n timeout?: number;\r\n /**The AbortSignal interface represents a signal object that allows you to communicate with a DOM request and abort it if required via an AbortController object. */\r\n signal?: AbortSignal;\r\n /**Indicates if an operation must be included in a Change Set or not. Works in Batch Operations only. By default, it's \"true\", except for GET operations - they are not allowed in Change Sets. */\r\n inChangeSet?: boolean;\r\n /**Headers to supply with a request. These headers will override configuraiton headers if the identical ones were set. */\r\n headers?: HeaderCollection;\r\n /**Custom query parameters. Can be used to set parameter aliases for \"$filter\" and \"$orderBy\". Important! These parameters ARE NOT URI encoded! */\r\n queryParams?: string[];\r\n}\r\n\r\nexport interface BatchRequest extends BaseRequest {\r\n /** Sets Prefer header to \"odata.continue-on-error\" that allows more requests be processed when errors occur. The batch request will return '200 OK' and individual response errors will be returned in the batch response body. */\r\n continueOnError?: boolean;\r\n}\r\n\r\nexport interface Request extends BaseRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection?: string;\r\n}\r\n\r\nexport interface CRUDRequest extends Request {\r\n /**A String representing collection record's Primary Key (GUID) or Alternate Key(s). */\r\n key?: string;\r\n}\r\n\r\nexport interface CountRequest extends Request {\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n}\r\n\r\nexport interface CountAllRequest extends CountRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**An Array (of strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n}\r\n\r\nexport interface FetchAllRequest extends Request {\r\n /**Sets FetchXML - a proprietary query language that provides capabilities to perform aggregation. */\r\n fetchXml: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation. Annotations provide additional information about lookups, options sets and other complex attribute types. For example: * or Microsoft.Dynamics.CRM.fetchxmlpagingcookie */\r\n includeAnnotations?: string;\r\n}\r\n\r\nexport interface FetchXmlRequest extends FetchAllRequest {\r\n /**Page number. */\r\n pageNumber?: number;\r\n /**Paging cookie. To retrive the first page, pagingCookie must be null. */\r\n pagingCookie?: string;\r\n}\r\n\r\nexport interface CreateRequest extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Web API v9+ only! Boolean that enables duplicate detection. */\r\n duplicateDetection?: boolean;\r\n /**A JavaScript object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data?: T;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface UpdateRequestBase extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Web API v9+ only! Boolean that enables duplicate detection. */\r\n duplicateDetection?: boolean;\r\n /**A JavaScript object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data?: T;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**Casts the AttributeMetadata to a specific type. (Used in requests to Attribute Metadata). */\r\n metadataAttributeType?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface UpdateRequest extends UpdateRequestBase {\r\n /**If set to 'true', DynamicsWebApi adds a request header 'MSCRM.MergeLabels: true'. Default value is 'false' */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface UpdateSinglePropertyRequest extends CRUDRequest {\r\n /**Object with a logical name of the field as a key and a value to update with. Example: {subject: \"Update Record\"} */\r\n fieldValuePair: { [key: string]: any };\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request. */\r\n returnRepresentation?: boolean;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n}\r\n\r\nexport interface UpsertRequest extends UpdateRequestBase {\r\n /**Sets If-None-Match header value that enables to use conditional retrieval in applicable requests. */\r\n ifnonematch?: string;\r\n}\r\n\r\nexport interface DeleteRequest extends CRUDRequest {\r\n /**If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */\r\n bypassCustomPluginExecution?: boolean;\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */\r\n contentId?: string;\r\n /**Field name that needs to be cleared (for example File Field) */\r\n fieldName?: string;\r\n}\r\n\r\nexport interface RetrieveRequest extends CRUDRequest {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/\r\n ifmatch?: string;\r\n /**Sets If-None-Match header value that enables to use conditional retrieval in applicable requests. */\r\n ifnonematch?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Casts the AttributeMetadata to a specific type. (Used in requests to Attribute Metadata). */\r\n metadataAttributeType?: string;\r\n /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */\r\n navigationProperty?: string;\r\n /**A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */\r\n navigationPropertyKey?: string;\r\n /**A String representing the GUID value of the saved query. */\r\n savedQuery?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**A String representing the GUID value of the user query. */\r\n userQuery?: string;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface RetrieveMultipleRequest extends Request {\r\n /**A name of the Entity Collection or Entity Logical name. */\r\n collection: string;\r\n /**Use the $apply to aggregate and group your data dynamically */\r\n apply?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n /**Boolean that sets the $count system query option with a value of true to include a count of entities that match the filter criteria up to 5000(per page).Do not use $top with $count! */\r\n count?: boolean;\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */\r\n includeAnnotations?: string;\r\n /**Sets the odata.maxpagesize preference value to request the number of entities returned in the response. */\r\n maxPageSize?: number;\r\n /**An Array(of string) representing the order in which items are returned using the $orderby system query option.Use the asc or desc suffix to specify ascending or descending order respectively.The default is ascending if the suffix isn't applied. */\r\n orderBy?: string[];\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Limit the number of results returned by using the $top system query option.Do not use $top with $count! */\r\n top?: number;\r\n /**Sets Prefer header with value 'odata.track-changes' to request that a delta link be returned which can subsequently be used to retrieve entity changes. */\r\n trackChanges?: boolean;\r\n /**A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */\r\n partitionId?: string;\r\n}\r\n\r\nexport interface AssociateRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Relationship name. */\r\n relationshipName: string;\r\n /**Related name of the Entity Collection or Entity Logical name. */\r\n relatedCollection: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface AssociateSingleValuedRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Navigation property name. */\r\n navigationProperty: string;\r\n /**Related name of the Entity Collection or Entity Logical name. */\r\n relatedCollection: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface DisassociateRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Relationship name. */\r\n relationshipName: string;\r\n /**Related entity record id/key. */\r\n relatedKey: string;\r\n}\r\n\r\nexport interface DisassociateSingleValuedRequest extends Request {\r\n /**Primary entity record id/key. */\r\n primaryKey: string;\r\n /**Navigation property name. */\r\n navigationProperty: string;\r\n}\r\n\r\nexport interface UnboundFunctionRequest extends BaseRequest {\r\n /**\r\n * Name of the function.\r\n */\r\n name?: string;\r\n /**\r\n * Name of the function. \r\n * @deprecated Use \"name\" parameter.\r\n */\r\n functionName?: string;\r\n /**Function's input parameters. Example: { param1: \"test\", param2: 3 }. */\r\n parameters?: any;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n}\r\n\r\nexport interface BoundFunctionRequest extends UnboundFunctionRequest, Request {\r\n /**A String representing the GUID value for the record. */\r\n key?: string;\r\n}\r\n\r\nexport interface UnboundActionRequest extends BaseRequest {\r\n /**A name of the Web API action. */\r\n actionName: string;\r\n /**An object that represents a Dynamics 365 action. */\r\n action?: TAction;\r\n}\r\n\r\nexport interface BoundActionRequest extends UnboundActionRequest, Request {\r\n /**A String representing the GUID value for the record. */\r\n key?: string;\r\n}\r\n\r\nexport interface CreateEntityRequest extends BaseRequest {\r\n /**An object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateEntityRequest extends CRUDRequest {\r\n /**An object with properties corresponding to the logical name of entity attributes(exceptions are lookups and single-valued navigation properties). */\r\n data: any;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface RetrieveEntityRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveEntitiesRequest extends BaseRequest {\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateAttributeRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Attribute metadata object. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateAttributeRequest extends CreateAttributeRequest {\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface RetrieveAttributesRequest extends BaseRequest {\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveAttributeRequest extends BaseRequest {\r\n /**An Attribute MetadataId or Alternate Key (such as LogicalName). */\r\n attributeKey: string;\r\n /**An Entity MetadataId or Alternate Key (such as LogicalName). */\r\n entityKey: string;\r\n /**Use this parameter to cast the Attribute to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateRelationshipRequest extends BaseRequest {\r\n /**Relationship Definition. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateRelationshipRequest extends CreateRelationshipRequest {\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface DeleteRelationshipRequest extends BaseRequest {\r\n /**A Relationship MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n}\r\n\r\nexport interface RetrieveRelationshipsRequest extends BaseRequest {\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveRelationshipRequest extends BaseRequest {\r\n /**A Relationship MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**Use this parameter to cast the Relationship metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface CreateGlobalOptionSetRequest extends BaseRequest {\r\n /**Global Option Set Definition. */\r\n data: any;\r\n}\r\n\r\nexport interface UpdateGlobalOptionSetRequest extends CreateRelationshipRequest {\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**Sets MSCRM.MergeLabels header that controls whether to overwrite the existing labels or merge your new label with any existing language labels. Default value is false. */\r\n mergeLabels?: boolean;\r\n}\r\n\r\nexport interface DeleteGlobalOptionSetRequest extends BaseRequest {\r\n /**A Global Option Set MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n}\r\n\r\nexport interface RetrieveGlobalOptionSetsRequest extends BaseRequest {\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**Use the $filter system query option to set criteria for which entities will be returned. */\r\n filter?: string;\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface RetrieveGlobalOptionSetRequest extends BaseRequest {\r\n /**A Global Option Set MetadataId or Alternate Key (such as LogicalName). */\r\n key: string;\r\n /**Use this parameter to cast the Global Option Set metadata to a specific type. */\r\n castType?: string;\r\n /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */\r\n select?: string[];\r\n /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */\r\n expand?: Expand[];\r\n}\r\n\r\nexport interface UploadRequest extends CRUDRequest {\r\n /**Binary Buffer*/\r\n data: Uint8Array | Buffer;\r\n /**Name of the file */\r\n fileName: string;\r\n /**File Field Name */\r\n fieldName: string;\r\n}\r\n\r\nexport interface DownloadRequest extends CRUDRequest {\r\n /**File Field Name */\r\n fieldName: string;\r\n}\r\n\r\nexport interface CsdlMetadataRequest extends BaseRequest {\r\n /**If set to \"true\" the document will include many different kinds of annotations that can be useful. Most annotations are not included by default because they increase the total size of the document. */\r\n addAnnotations?: boolean;\r\n}\r\n\r\nexport type SearchMode = \"any\" | \"all\";\r\nexport type SearchType = \"simple\" | \"full\";\r\n\r\nexport interface SearchQueryBase {\r\n /**The search parameter value contains the term to be searched for and has a 100-character limit. For suggestions, min 3 characters in addition. */\r\n search: string;\r\n /**The default table list searches across all Dataverse search\u2013configured tables and columns. The default list is configured by your administrator when Dataverse search is enabled. */\r\n entities?: string[];\r\n /**Filters are applied while searching data and are specified in standard OData syntax. */\r\n filter?: string;\r\n}\r\n\r\nexport interface Search extends SearchQueryBase {\r\n /**Facets support the ability to drill down into data results after they've been retrieved. */\r\n facets?: string[];\r\n /**Specify true to return the total record count; otherwise false. The default is false. */\r\n returnTotalRecordCount?: boolean;\r\n /**Specifies the number of search results to skip. */\r\n skip?: number;\r\n /**Specifies the number of search results to retrieve. The default is 50, and the maximum value is 100. */\r\n top?: number;\r\n /**A list of comma-separated clauses where each clause consists of a column name followed by 'asc' (ascending, which is the default) or 'desc' (descending). This list specifies how to order the results in order of precedence. */\r\n orderBy?: string[];\r\n /**Specifies whether any or all the search terms must be matched to count the document as a match. The default is 'any'. */\r\n searchMode?: SearchMode;\r\n /**The search type specifies the syntax of a search query. Using 'simple' selects simple query syntax and 'full' selects Lucene query syntax. The default is 'simple'. */\r\n searchType?: SearchType;\r\n}\r\n\r\nexport interface Suggest extends SearchQueryBase {\r\n /**Use fuzzy search to aid with misspellings. The default is false. */\r\n useFuzzy?: boolean;\r\n /**Number of suggestions to retrieve. The default is 5. */\r\n top?: number;\r\n /**A list of comma-separated clauses where each clause consists of a column name followed by 'asc' (ascending, which is the default) or 'desc' (descending). This list specifies how to order the results in order of precedence. */\r\n orderBy?: string[];\r\n}\r\n\r\nexport interface Autocomplete extends SearchQueryBase {\r\n /**Use fuzzy search to aid with misspellings. The default is false. */\r\n useFuzzy?: boolean;\r\n}\r\n\r\nexport interface SearchRequest extends BaseRequest {\r\n /**Search query object */\r\n query: Search;\r\n}\r\n\r\nexport interface SuggestRequest extends BaseRequest {\r\n /**Suggestion query object */\r\n query: Suggest;\r\n}\r\n\r\nexport interface AutocompleteRequest extends BaseRequest {\r\n /**Autocomplete query object */\r\n query: Autocomplete;\r\n}\r\n\r\nexport interface ApiConfig {\r\n /** API Version to use, for example: \"9.2\" or \"1.0\" */\r\n version?: string;\r\n /** API Path, for example: \"data\" or \"search\" */\r\n path?: string;\r\n}\r\n\r\nexport interface AccessToken {\r\n /** Access Token */\r\n accessToken: string;\r\n}\r\n\r\nexport interface Config {\r\n /**The url to Dataverse API server, for example: https://contoso.api.crm.dynamics.com/. It is required when used in Node.js application. */\r\n serverUrl?: string | null;\r\n /**Impersonates a user based on their systemuserid by adding \"MSCRMCallerID\" header. A String representing the GUID value for the Dynamics 365 systemuserid. */\r\n impersonate?: string | null;\r\n /**Impersonates a user based on their Azure Active Directory (AAD) object id by passing that value along with the header \"CallerObjectId\". A String should represent a GUID value. */\r\n impersonateAAD?: string | null;\r\n /**A function that is called when a security token needs to be refreshed. */\r\n onTokenRefresh?: (() => Promise) | null;\r\n /**Sets Prefer header with value \"odata.include-annotations=\" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types.*/\r\n includeAnnotations?: string | null;\r\n /**Sets the odata.maxpagesize preference value to request the number of entities returned in the response. */\r\n maxPageSize?: number | null;\r\n /**Sets Prefer header request with value \"return=representation\".Use this property to return just created or updated entity in a single request.*/\r\n returnRepresentation?: boolean | null;\r\n /**Indicates whether to use Entity Logical Names instead of Collection Logical Names.*/\r\n useEntityNames?: boolean | null;\r\n /**Sets a number of milliseconds before a request times out. */\r\n timeout?: number | null;\r\n /**Proxy configuration object. */\r\n proxy?: ProxyConfig | null;\r\n /**Configuration object for Dataverse Web API (with path \"data\"). */\r\n dataApi?: ApiConfig;\r\n /**Configuration object for Dataverse Search API (with path \"search\"). */\r\n searchApi?: ApiConfig;\r\n /**Default headers to supply with each request. */\r\n headers?: HeaderCollection;\r\n}\r\n\r\n/**Header collection type */\r\nexport type HeaderCollection = Record;\r\n\r\nexport interface ProxyConfig {\r\n /**Proxy server url */\r\n url: string;\r\n /**Basic authentication credentials */\r\n auth?: {\r\n /**Username */\r\n username: string;\r\n /**Password */\r\n password: string;\r\n };\r\n}\r\n\r\n/** Callback with an acquired token called by DynamicsWebApi; \"token\" argument can be a string or an object with a property {accessToken: } */\r\n// export interface OnTokenAcquiredCallback {\r\n// (token: any): void;\r\n// }\r\n\r\nexport interface RequestError extends Error {\r\n /**The name of the error */\r\n name: string;\r\n /**This code is not related to the http status code and is frequently empty */\r\n code?: string;\r\n /**A message describing the error */\r\n message: string;\r\n /**HTTP status code */\r\n status?: number;\r\n /**HTTP status text. Frequently empty */\r\n statusText?: string;\r\n /**HTTP Response headers */\r\n headers?: any;\r\n /**Details about an error */\r\n innererror?: {\r\n /**A message describing the error, this is frequently the same as the outer message */\r\n message?: string;\r\n /**Microsoft.Crm.CrmHttpException */\r\n type?: string;\r\n /**Details from the server about where the error occurred */\r\n stacktrace?: string;\r\n };\r\n}\r\n\r\nexport interface MultipleResponse {\r\n /**Multiple respone entities */\r\n value: T[];\r\n oDataCount?: number;\r\n \"@odata.count\"?: number;\r\n oDataContext?: string;\r\n \"@odata.context\"?: number;\r\n}\r\n\r\nexport interface AllResponse extends MultipleResponse {\r\n /**@odata.deltaLink value */\r\n oDataDeltaLink?: string;\r\n}\r\n\r\nexport interface RetrieveMultipleResponse extends MultipleResponse {\r\n \"@Microsoft.Dynamics.CRM.totalrecordcount\"?: number;\r\n \"@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded\"?: boolean;\r\n /**@odata.nextLink value */\r\n oDataNextLink?: string;\r\n /**@odata.deltaLink value */\r\n oDataDeltaLink?: string;\r\n \"@odata.deltaLink\"?: string;\r\n \"@odata.nextLink\"?: string;\r\n}\r\n\r\nexport interface FetchXmlResponse extends MultipleResponse {\r\n \"@Microsoft.Dynamics.CRM.totalrecordcount\"?: number;\r\n \"@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded\"?: boolean;\r\n /**Paging information */\r\n PagingInfo?: {\r\n /**Number of the next page */\r\n nextPage?: number;\r\n /**Next page cookie */\r\n cookie?: string;\r\n };\r\n}\r\n\r\nexport interface DownloadResponse {\r\n /**The name of the file */\r\n fileName: string;\r\n /**File size */\r\n fileSize: number;\r\n /**File Data */\r\n data: Uint8Array | Buffer;\r\n}\r\n\r\nexport interface SearchResponse {\r\n /**Search results*/\r\n value: TValue[];\r\n facets: any | null;\r\n totalrecordcount: number;\r\n querycontext: any | null;\r\n}\r\n\r\nexport interface SuggestResponseValue {\r\n text: string;\r\n document: TDocument;\r\n}\r\n\r\nexport interface SuggestResponse {\r\n /**Suggestions*/\r\n value: SuggestResponseValue[];\r\n querycontext: any | null;\r\n}\r\n\r\nexport interface AutocompleteResponse {\r\n /**Autocomplete result*/\r\n value: string | null;\r\n querycontext: any | null;\r\n}\r\n\r\n//function overloads\r\n\r\ntype CallFunction = {\r\n /**\r\n * Calls a Web API function\r\n *\r\n * @param name - The name of a function.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (name: string): Promise;\r\n /**\r\n * Calls a bound Web API function\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundFunctionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API function (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundFunctionRequest): Promise;\r\n};\r\n\r\ntype CallAction = {\r\n /**\r\n * Calls a bound Web API action (bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {T} Type of the value in a response\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundActionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API action (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {T} Type of the value in a response\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundActionRequest): Promise;\r\n /**\r\n * Calls a bound Web API action (bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {TResponse} Type of the value in a response\r\n * @type {TAction} Type of an action object\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: BoundActionRequest): Promise;\r\n /**\r\n * Calls an unbound Web API action (not bound to a particular table row)\r\n *\r\n * @param request - An object that represents all possible options for a current request.\r\n * @type {TResponse} Type of the value in a response\r\n * @type {TAction} Type of an action object\r\n * @returns {Promise} D365 Web Api Response\r\n */\r\n (request: UnboundActionRequest): Promise;\r\n};\r\n\r\ntype SearchFunction = {\r\n /**\r\n * Provides a search results page.\r\n * @param term - The term to be searched for and has a max 100-character limit.\r\n * @returns {Promise} Search result\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides a search results page.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Search result\r\n */\r\n (request: SearchRequest): Promise>;\r\n};\r\n\r\ntype SuggestFunction = {\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param term - The term to be searched for and has min 3 characters to a max 100-character limit.\r\n * @returns {Promise} Suggestions result\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides suggestions as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise>} Suggestions result\r\n */\r\n (request: SuggestRequest): Promise>;\r\n};\r\n\r\ntype AutocompleteFunction = {\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param term - The term to be searched for and has a 100-character limit.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n (term: string): Promise;\r\n /**\r\n * Provides autocompletion of input as the user enters text into a form field.\r\n * @param request - An object that represents all possible options for a current request.\r\n * @returns {Promise} Result of autocomplete\r\n */\r\n (request: AutocompleteRequest): Promise;\r\n};\r\n", "import type * as Core from \"../types\";\r\nimport { Utility } from \"../utils/Utility\";\r\nimport { InternalConfig } from \"../utils/Config\";\r\nimport * as RequestUtility from \"../utils/Request\";\r\nimport { DynamicsWebApiError, ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { executeRequest } from \"./helpers/executeRequest\";\r\nimport { AccessToken } from \"../dynamics-web-api\";\r\n\r\nconst _addResponseParams = (requestId: string, responseParams: Record) => {\r\n if (_responseParseParams[requestId]) _responseParseParams[requestId].push(responseParams);\r\n else _responseParseParams[requestId] = [responseParams];\r\n};\r\n\r\nconst _addRequestToBatchCollection = (requestId: string, request: Core.InternalRequest) => {\r\n if (_batchRequestCollection[requestId]) _batchRequestCollection[requestId].push(request);\r\n else _batchRequestCollection[requestId] = [request];\r\n};\r\n\r\nconst _clearRequestData = (requestId: string): void => {\r\n delete _responseParseParams[requestId];\r\n if (_batchRequestCollection.hasOwnProperty(requestId)) delete _batchRequestCollection[requestId];\r\n};\r\n\r\nconst _runRequest = async (request: Core.InternalRequest, config: InternalConfig): Promise => {\r\n try {\r\n const result = await RequestClient.sendRequest(request, config);\r\n _clearRequestData(request.requestId!);\r\n\r\n return result;\r\n } catch (error) {\r\n _clearRequestData(request.requestId!);\r\n throw error;\r\n } finally {\r\n _clearRequestData(request.requestId!);\r\n }\r\n};\r\n\r\nlet _batchRequestCollection: Core.BatchRequestCollection = {};\r\nlet _responseParseParams: { [key: string]: any[] } = {};\r\n\r\nconst _nameExceptions = [\r\n \"$metadata\",\r\n \"EntityDefinitions\",\r\n \"RelationshipDefinitions\",\r\n \"GlobalOptionSetDefinitions\",\r\n \"ManagedPropertyDefinitions\",\r\n \"query\",\r\n \"suggest\",\r\n \"autocomplete\",\r\n];\r\n\r\nconst _isEntityNameException = (entityName: string): boolean => {\r\n return _nameExceptions.indexOf(entityName) > -1;\r\n};\r\n\r\nconst _getCollectionNames = async (entityName: string, config: InternalConfig): Promise => {\r\n if (!Utility.isNull(RequestUtility.entityNames)) {\r\n return RequestUtility.findCollectionName(entityName) || entityName;\r\n }\r\n\r\n const request = RequestUtility.compose(\r\n {\r\n method: \"GET\",\r\n collection: \"EntityDefinitions\",\r\n select: [\"EntitySetName\", \"LogicalName\"],\r\n noCache: true,\r\n functionName: \"retrieveMultiple\",\r\n },\r\n config\r\n );\r\n\r\n const result = await _runRequest(request, config);\r\n RequestUtility.setEntityNames({});\r\n for (let i = 0; i < result.data.value.length; i++) {\r\n RequestUtility.entityNames![result.data.value[i].LogicalName] = result.data.value[i].EntitySetName;\r\n }\r\n\r\n return RequestUtility.findCollectionName(entityName) || entityName;\r\n};\r\n\r\nconst _checkCollectionName = async (entityName: string | null | undefined, config: InternalConfig): Promise => {\r\n if (!entityName || _isEntityNameException(entityName)) {\r\n return entityName;\r\n }\r\n\r\n entityName = entityName.toLowerCase();\r\n\r\n if (!config.useEntityNames) {\r\n return entityName;\r\n }\r\n\r\n try {\r\n return await _getCollectionNames(entityName, config);\r\n } catch (error: any) {\r\n throw new Error(\"Unable to fetch Collection Names. Error: \" + (error as DynamicsWebApiError).message);\r\n }\r\n};\r\n\r\nexport class RequestClient {\r\n /**\r\n * Sends a request to given URL with given parameters\r\n *\r\n * @param {InternalRequest} request - Composed request to D365 Web Api\r\n * @param {InternalConfig} config - DynamicsWebApi config.\r\n */\r\n static async sendRequest(request: Core.InternalRequest, config: InternalConfig): Promise {\r\n request.headers = request.headers || {};\r\n request.responseParameters = request.responseParameters || {};\r\n request.requestId = request.requestId || Utility.generateUUID();\r\n\r\n //add response parameters to parse\r\n _addResponseParams(request.requestId, request.responseParameters);\r\n\r\n //stringify passed data\r\n let processedData = null;\r\n\r\n const isBatchConverted = request.responseParameters?.convertedToBatch;\r\n\r\n if (request.path === \"$batch\" && !isBatchConverted) {\r\n const batchRequest = _batchRequestCollection[request.requestId];\r\n\r\n if (!batchRequest) throw ErrorHelper.batchIsEmpty();\r\n\r\n const batchResult = RequestUtility.convertToBatch(batchRequest, config, request);\r\n\r\n processedData = batchResult.body;\r\n request.headers = { ...batchResult.headers, ...request.headers };\r\n\r\n //clear an array of requests\r\n delete _batchRequestCollection[request.requestId];\r\n } else {\r\n processedData = !isBatchConverted ? RequestUtility.processData(request.data, config) : request.data;\r\n\r\n if (!isBatchConverted) request.headers = RequestUtility.setStandardHeaders(request.headers);\r\n }\r\n\r\n if (config.impersonate && !request.headers![\"MSCRMCallerID\"]) {\r\n request.headers![\"MSCRMCallerID\"] = config.impersonate;\r\n }\r\n\r\n if (config.impersonateAAD && !request.headers![\"CallerObjectId\"]) {\r\n request.headers![\"CallerObjectId\"] = config.impersonateAAD;\r\n }\r\n\r\n let token: AccessToken | string | null = null;\r\n\r\n //call a token refresh callback only if it is set and there is no \"Authorization\" header set yet\r\n if (config.onTokenRefresh && (!request.headers || (request.headers && !request.headers[\"Authorization\"]))) {\r\n token = await config.onTokenRefresh();\r\n if (!token) throw new Error(\"Token is empty. Request is aborted.\");\r\n }\r\n\r\n if (token) {\r\n request.headers![\"Authorization\"] = \"Bearer \" + (token.hasOwnProperty(\"accessToken\") ? (token as AccessToken).accessToken : token);\r\n }\r\n\r\n if (Utility.isRunningWithinPortals()) {\r\n request.headers![\"__RequestVerificationToken\"] = await global.window.shell!.getTokenDeferred();\r\n }\r\n\r\n const url = request.apiConfig ? request.apiConfig.url : config.dataApi.url;\r\n\r\n return await executeRequest({\r\n method: request.method!,\r\n uri: url!.toString() + request.path,\r\n data: processedData,\r\n proxy: config.proxy,\r\n isAsync: request.async,\r\n headers: request.headers!,\r\n requestId: request.requestId!,\r\n abortSignal: request.signal,\r\n responseParams: _responseParseParams,\r\n timeout: request.timeout || config.timeout,\r\n });\r\n }\r\n\r\n static async makeRequest(request: Core.InternalRequest, config: InternalConfig): Promise {\r\n request.responseParameters = request.responseParameters || {};\r\n //we don't want to mix headers set by the library and by the user\r\n request.userHeaders = request.headers;\r\n delete request.headers;\r\n\r\n if (!request.isBatch) {\r\n const collectionName = await _checkCollectionName(request.collection, config);\r\n\r\n request.collection = collectionName;\r\n RequestUtility.compose(request, config);\r\n request.responseParameters.convertedToBatch = false;\r\n\r\n //the URL contains more characters than max possible limit, convert the request to a batch request\r\n if (request.path!.length > 2000) {\r\n const batchRequest = RequestUtility.convertToBatch([request], config);\r\n\r\n //#175 authorization header must be copied as well. \r\n //todo: is it the only one that needs to be copied?\r\n if (request.headers![\"Authorization\"]) {\r\n batchRequest.headers[\"Authorization\"] = request.headers![\"Authorization\"];\r\n }\r\n\r\n request.method = \"POST\";\r\n request.path = \"$batch\";\r\n request.data = batchRequest.body;\r\n request.headers = { ...batchRequest.headers, ...request.userHeaders };\r\n request.responseParameters.convertedToBatch = true;\r\n }\r\n\r\n return _runRequest(request, config);\r\n }\r\n\r\n //no need to make a request to web api if it's a part of batch\r\n RequestUtility.compose(request, config);\r\n //add response parameters to parse\r\n _addResponseParams(request.requestId!, request.responseParameters);\r\n _addRequestToBatchCollection(request.requestId!, request);\r\n }\r\n\r\n static _clearTestData(): void {\r\n RequestUtility.setEntityNames(null);\r\n _responseParseParams = {};\r\n _batchRequestCollection = {};\r\n }\r\n\r\n static getCollectionName(entityName: string): string | null {\r\n return RequestUtility.findCollectionName(entityName);\r\n }\r\n}\r\n", "import type { InternalRequest, InternalBatchRequest } from \"../types\";\r\n\r\nimport { Utility } from \"./Utility\";\r\nimport { Config, HeaderCollection } from \"../dynamics-web-api\";\r\nimport { ErrorHelper } from \"../helpers/ErrorHelper\";\r\nimport { InternalConfig } from \"./Config\";\r\n\r\nexport let entityNames: Record | null = null;\r\n\r\nexport const setEntityNames = (newEntityNames: Record | null) => {\r\n entityNames = newEntityNames;\r\n};\r\n\r\n/**\r\n * Converts a request object to URL link\r\n * @param request Internal request object\r\n * @param config Internal configuration object\r\n * @returns Modified internal request object\r\n */\r\nexport const compose = (request: InternalRequest, config: InternalConfig): InternalRequest => {\r\n request.path = request.path || \"\";\r\n request.functionName = request.functionName || \"\";\r\n if (!request.url) {\r\n if (!request._isUnboundRequest && !request.contentId && !request.collection) {\r\n ErrorHelper.parameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, \"request.collection\");\r\n }\r\n if (request.collection != null) {\r\n ErrorHelper.stringParameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, \"request.collection\");\r\n request.path = request.collection;\r\n\r\n //add alternate key feature\r\n if (request.key) {\r\n request.key = ErrorHelper.keyParameterCheck(request.key, `DynamicsWebApi.${request.functionName}`, \"request.key\");\r\n request.path += `(${request.key})`;\r\n }\r\n }\r\n\r\n if (request.contentId) {\r\n ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, \"request.contentId\");\r\n if (request.contentId.startsWith(\"$\")) {\r\n request.path = request.path ? `${request.contentId}/${request.path}` : request.contentId;\r\n }\r\n }\r\n\r\n if (request.addPath) {\r\n if (request.path) {\r\n request.path += \"/\";\r\n }\r\n request.path += request.addPath;\r\n }\r\n\r\n request.path = composeUrl(request, config, request.path);\r\n\r\n if (request.fetchXml) {\r\n ErrorHelper.stringParameterCheck(request.fetchXml, `DynamicsWebApi.${request.functionName}`, \"request.fetchXml\");\r\n let join = request.path.indexOf(\"?\") === -1 ? \"?\" : \"&\";\r\n request.path += `${join}fetchXml=${encodeURIComponent(request.fetchXml)}`;\r\n }\r\n } else {\r\n ErrorHelper.stringParameterCheck(request.url, `DynamicsWebApi.${request.functionName}`, \"request.url\");\r\n request.path = request.url.replace(config.dataApi.url, \"\");\r\n }\r\n\r\n if (request.hasOwnProperty(\"async\") && request.async != null) {\r\n ErrorHelper.boolParameterCheck(request.async, `DynamicsWebApi.${request.functionName}`, \"request.async\");\r\n } else {\r\n request.async = true;\r\n }\r\n\r\n request.headers = composeHeaders(request, config);\r\n\r\n return request;\r\n};\r\n\r\n/**\r\n * Converts optional parameters of the request to URL. If expand parameter exists this function is called recursively.\r\n * @param request Internal request object\r\n * @param config Internal configuration object\r\n * @param url Starting url\r\n * @param joinSymbol Join symbol. \"&\" by default and \";\" inside an expand query parameter\r\n * @returns Request URL\r\n */\r\nexport const composeUrl = (request: InternalRequest, config: Config, url: string = \"\", joinSymbol: \"&\" | \";\" = \"&\"): string => {\r\n const queryArray: string[] = [];\r\n\r\n if (request) {\r\n if (request.navigationProperty) {\r\n ErrorHelper.stringParameterCheck(request.navigationProperty, `DynamicsWebApi.${request.functionName}`, \"request.navigationProperty\");\r\n url += \"/\" + request.navigationProperty;\r\n\r\n if (request.navigationPropertyKey) {\r\n let navigationKey = ErrorHelper.keyParameterCheck(\r\n request.navigationPropertyKey,\r\n `DynamicsWebApi.${request.functionName}`,\r\n \"request.navigationPropertyKey\"\r\n );\r\n url += \"(\" + navigationKey + \")\";\r\n }\r\n\r\n if (request.navigationProperty === \"Attributes\") {\r\n if (request.metadataAttributeType) {\r\n ErrorHelper.stringParameterCheck(request.metadataAttributeType, `DynamicsWebApi.${request.functionName}`, \"request.metadataAttributeType\");\r\n url += \"/\" + request.metadataAttributeType;\r\n }\r\n }\r\n }\r\n\r\n if (request.select?.length) {\r\n ErrorHelper.arrayParameterCheck(request.select, `DynamicsWebApi.${request.functionName}`, \"request.select\");\r\n\r\n if (request.functionName == \"retrieve\" && request.select.length == 1 && request.select[0].endsWith(\"/$ref\")) {\r\n url += \"/\" + request.select[0];\r\n } else {\r\n if (request.select[0].startsWith(\"/\") && request.functionName == \"retrieve\") {\r\n if (request.navigationProperty == null) {\r\n url += request.select.shift();\r\n } else {\r\n request.select.shift();\r\n }\r\n }\r\n\r\n //check if anything left in the array\r\n if (request.select.length) {\r\n queryArray.push(\"$select=\" + request.select.join(\",\"));\r\n }\r\n }\r\n }\r\n\r\n if (request.filter) {\r\n ErrorHelper.stringParameterCheck(request.filter, `DynamicsWebApi.${request.functionName}`, \"request.filter\");\r\n const removeBracketsFromGuidReg = /[^\"']{([\\w\\d]{8}[-]?(?:[\\w\\d]{4}[-]?){3}[\\w\\d]{12})}(?:[^\"']|$)/g;\r\n let filterResult = request.filter;\r\n\r\n //fix bug 2018-06-11\r\n let m: RegExpExecArray | null = null;\r\n while ((m = removeBracketsFromGuidReg.exec(filterResult)) !== null) {\r\n if (m.index === removeBracketsFromGuidReg.lastIndex) {\r\n removeBracketsFromGuidReg.lastIndex++;\r\n }\r\n\r\n let replacement = m[0].endsWith(\")\") ? \")\" : \" \";\r\n filterResult = filterResult.replace(m[0], \" \" + m[1] + replacement);\r\n }\r\n\r\n queryArray.push(\"$filter=\" + encodeURIComponent(filterResult));\r\n }\r\n\r\n if (request.fieldName) {\r\n ErrorHelper.stringParameterCheck(request.fieldName, `DynamicsWebApi.${request.functionName}`, \"request.fieldName\");\r\n url += \"/\" + request.fieldName;\r\n }\r\n\r\n if (request.savedQuery) {\r\n queryArray.push(\"savedQuery=\" + ErrorHelper.guidParameterCheck(request.savedQuery, `DynamicsWebApi.${request.functionName}`, \"request.savedQuery\"));\r\n }\r\n\r\n if (request.userQuery) {\r\n queryArray.push(\"userQuery=\" + ErrorHelper.guidParameterCheck(request.userQuery, `DynamicsWebApi.${request.functionName}`, \"request.userQuery\"));\r\n }\r\n\r\n if (request.apply) {\r\n ErrorHelper.stringParameterCheck(request.apply, `DynamicsWebApi.${request.functionName}`, \"request.apply\");\r\n queryArray.push(\"$apply=\" + request.apply);\r\n }\r\n\r\n if (request.count) {\r\n ErrorHelper.boolParameterCheck(request.count, `DynamicsWebApi.${request.functionName}`, \"request.count\");\r\n queryArray.push(\"$count=\" + request.count);\r\n }\r\n\r\n if (request.top && request.top > 0) {\r\n ErrorHelper.numberParameterCheck(request.top, `DynamicsWebApi.${request.functionName}`, \"request.top\");\r\n queryArray.push(\"$top=\" + request.top);\r\n }\r\n\r\n if (request.orderBy != null && request.orderBy.length) {\r\n ErrorHelper.arrayParameterCheck(request.orderBy, `DynamicsWebApi.${request.functionName}`, \"request.orderBy\");\r\n queryArray.push(\"$orderby=\" + request.orderBy.join(\",\"));\r\n }\r\n\r\n if (request.partitionId) {\r\n ErrorHelper.stringParameterCheck(request.partitionId, `DynamicsWebApi.${request.functionName}`, \"request.partitionId\");\r\n queryArray.push(\"partitionid='\" + request.partitionId + \"'\");\r\n }\r\n\r\n if (request.downloadSize) {\r\n ErrorHelper.stringParameterCheck(request.downloadSize, `DynamicsWebApi.${request.functionName}`, \"request.downloadSize\");\r\n queryArray.push(\"size=\" + request.downloadSize);\r\n }\r\n\r\n if (request.queryParams?.length) {\r\n ErrorHelper.arrayParameterCheck(request.queryParams, `DynamicsWebApi.${request.functionName}`, \"request.queryParams\");\r\n queryArray.push(request.queryParams.join(\"&\"));\r\n }\r\n\r\n if (request.fileName) {\r\n ErrorHelper.stringParameterCheck(request.fileName, `DynamicsWebApi.${request.functionName}`, \"request.fileName\");\r\n queryArray.push(\"x-ms-file-name=\" + request.fileName);\r\n }\r\n\r\n if (request.data) {\r\n ErrorHelper.parameterCheck(request.data, `DynamicsWebApi.${request.functionName}`, \"request.data\");\r\n }\r\n\r\n if (request.isBatch) {\r\n ErrorHelper.boolParameterCheck(request.isBatch, `DynamicsWebApi.${request.functionName}`, \"request.isBatch\");\r\n }\r\n\r\n if (!Utility.isNull(request.inChangeSet)) {\r\n ErrorHelper.boolParameterCheck(request.inChangeSet, `DynamicsWebApi.${request.functionName}`, \"request.inChangeSet\");\r\n }\r\n\r\n if (request.isBatch && Utility.isNull(request.inChangeSet)) request.inChangeSet = true;\r\n\r\n if (request.timeout) {\r\n ErrorHelper.numberParameterCheck(request.timeout, `DynamicsWebApi.${request.functionName}`, \"request.timeout\");\r\n }\r\n\r\n if (request.expand?.length) {\r\n ErrorHelper.stringOrArrayParameterCheck(request.expand, `DynamicsWebApi.${request.functionName}`, \"request.expand\");\r\n if (typeof request.expand === \"string\") {\r\n queryArray.push(\"$expand=\" + request.expand);\r\n } else {\r\n const expandQueryArray: string[] = [];\r\n for (let i = 0; i < request.expand.length; i++) {\r\n if (request.expand[i].property) {\r\n const expand = request.expand[i];\r\n expand.functionName = `${request.functionName} $expand`;\r\n let expandConverted = composeUrl(expand, config, \"\", \";\");\r\n if (expandConverted) {\r\n expandConverted = `(${expandConverted.substr(1)})`;\r\n }\r\n expandQueryArray.push(request.expand[i].property + expandConverted);\r\n }\r\n }\r\n if (expandQueryArray.length) {\r\n queryArray.push(\"$expand=\" + expandQueryArray.join(\",\"));\r\n }\r\n }\r\n }\r\n }\r\n\r\n return !queryArray.length ? url : url + \"?\" + queryArray.join(joinSymbol);\r\n};\r\n\r\nexport const composeHeaders = (request: InternalRequest, config: Config): HeaderCollection => {\r\n const headers: HeaderCollection = { ...config.headers, ...request.userHeaders };\r\n\r\n const prefer = composePreferHeader(request, config);\r\n if (prefer.length) {\r\n headers[\"Prefer\"] = prefer;\r\n }\r\n\r\n if (request.collection === \"$metadata\") {\r\n headers[\"Accept\"] = \"application/xml\";\r\n }\r\n\r\n if (request.transferMode) {\r\n headers[\"x-ms-transfer-mode\"] = request.transferMode;\r\n }\r\n\r\n if (request.ifmatch != null && request.ifnonematch != null) {\r\n throw new Error(\r\n `DynamicsWebApi.${request.functionName}. Either one of request.ifmatch or request.ifnonematch parameters should be used in a call, not both.`\r\n );\r\n }\r\n\r\n if (request.ifmatch) {\r\n ErrorHelper.stringParameterCheck(request.ifmatch, `DynamicsWebApi.${request.functionName}`, \"request.ifmatch\");\r\n headers[\"If-Match\"] = request.ifmatch;\r\n }\r\n\r\n if (request.ifnonematch) {\r\n ErrorHelper.stringParameterCheck(request.ifnonematch, `DynamicsWebApi.${request.functionName}`, \"request.ifnonematch\");\r\n headers[\"If-None-Match\"] = request.ifnonematch;\r\n }\r\n\r\n if (request.impersonate) {\r\n ErrorHelper.stringParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, \"request.impersonate\");\r\n headers[\"MSCRMCallerID\"] = ErrorHelper.guidParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, \"request.impersonate\");\r\n }\r\n\r\n if (request.impersonateAAD) {\r\n ErrorHelper.stringParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, \"request.impersonateAAD\");\r\n headers[\"CallerObjectId\"] = ErrorHelper.guidParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, \"request.impersonateAAD\");\r\n }\r\n\r\n if (request.token) {\r\n ErrorHelper.stringParameterCheck(request.token, `DynamicsWebApi.${request.functionName}`, \"request.token\");\r\n headers[\"Authorization\"] = \"Bearer \" + request.token;\r\n }\r\n\r\n if (request.duplicateDetection) {\r\n ErrorHelper.boolParameterCheck(request.duplicateDetection, `DynamicsWebApi.${request.functionName}`, \"request.duplicateDetection\");\r\n headers[\"MSCRM.SuppressDuplicateDetection\"] = \"false\";\r\n }\r\n\r\n if (request.bypassCustomPluginExecution) {\r\n ErrorHelper.boolParameterCheck(request.bypassCustomPluginExecution, `DynamicsWebApi.${request.functionName}`, \"request.bypassCustomPluginExecution\");\r\n headers[\"MSCRM.BypassCustomPluginExecution\"] = \"true\";\r\n }\r\n\r\n if (request.noCache) {\r\n ErrorHelper.boolParameterCheck(request.noCache, `DynamicsWebApi.${request.functionName}`, \"request.noCache\");\r\n headers[\"Cache-Control\"] = \"no-cache\";\r\n }\r\n\r\n if (request.mergeLabels) {\r\n ErrorHelper.boolParameterCheck(request.mergeLabels, `DynamicsWebApi.${request.functionName}`, \"request.mergeLabels\");\r\n headers[\"MSCRM.MergeLabels\"] = \"true\";\r\n }\r\n\r\n if (request.contentId) {\r\n ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, \"request.contentId\");\r\n if (!request.contentId.startsWith(\"$\")) {\r\n headers[\"Content-ID\"] = request.contentId;\r\n }\r\n }\r\n\r\n if (request.contentRange) {\r\n ErrorHelper.stringParameterCheck(request.contentRange, `DynamicsWebApi.${request.functionName}`, \"request.contentRange\");\r\n headers[\"Content-Range\"] = request.contentRange;\r\n }\r\n\r\n if (request.range) {\r\n ErrorHelper.stringParameterCheck(request.range, `DynamicsWebApi.${request.functionName}`, \"request.range\");\r\n headers[\"Range\"] = request.range;\r\n }\r\n\r\n return headers;\r\n};\r\n\r\nexport const composePreferHeader = (request: InternalRequest, config: Config): string => {\r\n let returnRepresentation: boolean | null | undefined = request.returnRepresentation;\r\n let includeAnnotations: string | null | undefined = request.includeAnnotations;\r\n let maxPageSize: number | null | undefined = request.maxPageSize;\r\n let trackChanges: boolean | null | undefined = request.trackChanges;\r\n let continueOnError: boolean | null | undefined = request.continueOnError;\r\n\r\n let prefer: string[] = [];\r\n\r\n if (request.prefer && request.prefer.length) {\r\n ErrorHelper.stringOrArrayParameterCheck(request.prefer, `DynamicsWebApi.${request.functionName}`, \"request.prefer\");\r\n if (typeof request.prefer === \"string\") {\r\n prefer = request.prefer.split(\",\");\r\n }\r\n for (let i in prefer) {\r\n let item = prefer[i].trim();\r\n if (item === \"return=representation\") {\r\n returnRepresentation = true;\r\n } else if (item.includes(\"odata.include-annotations=\")) {\r\n includeAnnotations = item.replace(\"odata.include-annotations=\", \"\").replace(/\"/g, \"\");\r\n } else if (item.startsWith(\"odata.maxpagesize=\")) {\r\n maxPageSize = Number(item.replace(\"odata.maxpagesize=\", \"\").replace(/\"/g, \"\")) || 0;\r\n } else if (item.includes(\"odata.track-changes\")) {\r\n trackChanges = true;\r\n } else if (item.includes(\"odata.continue-on-error\")) {\r\n continueOnError = true;\r\n }\r\n }\r\n }\r\n\r\n //clear array\r\n prefer = [];\r\n\r\n if (config) {\r\n if (returnRepresentation == null) {\r\n returnRepresentation = config.returnRepresentation;\r\n }\r\n includeAnnotations = includeAnnotations ? includeAnnotations : config.includeAnnotations;\r\n maxPageSize = maxPageSize ? maxPageSize : config.maxPageSize;\r\n }\r\n\r\n if (returnRepresentation) {\r\n ErrorHelper.boolParameterCheck(returnRepresentation, `DynamicsWebApi.${request.functionName}`, \"request.returnRepresentation\");\r\n prefer.push(\"return=representation\");\r\n }\r\n\r\n if (includeAnnotations) {\r\n ErrorHelper.stringParameterCheck(includeAnnotations, `DynamicsWebApi.${request.functionName}`, \"request.includeAnnotations\");\r\n prefer.push(`odata.include-annotations=\"${includeAnnotations}\"`);\r\n }\r\n\r\n if (maxPageSize && maxPageSize > 0) {\r\n ErrorHelper.numberParameterCheck(maxPageSize, `DynamicsWebApi.${request.functionName}`, \"request.maxPageSize\");\r\n prefer.push(\"odata.maxpagesize=\" + maxPageSize);\r\n }\r\n\r\n if (trackChanges) {\r\n ErrorHelper.boolParameterCheck(trackChanges, `DynamicsWebApi.${request.functionName}`, \"request.trackChanges\");\r\n prefer.push(\"odata.track-changes\");\r\n }\r\n\r\n if (continueOnError) {\r\n ErrorHelper.boolParameterCheck(continueOnError, `DynamicsWebApi.${request.functionName}`, \"request.continueOnError\");\r\n prefer.push(\"odata.continue-on-error\");\r\n }\r\n\r\n return prefer.join(\",\");\r\n};\r\n\r\nexport const convertToBatch = (requests: InternalRequest[], config: InternalConfig, batchRequest?: InternalRequest): InternalBatchRequest => {\r\n const batchBoundary = `dwa_batch_${Utility.generateUUID()}`;\r\n\r\n const batchBody: string[] = [];\r\n let currentChangeSet: string | null = null;\r\n let contentId = 100000;\r\n\r\n requests.forEach((internalRequest) => {\r\n internalRequest.functionName = \"executeBatch\";\r\n if (batchRequest?.inChangeSet === false) internalRequest.inChangeSet = false;\r\n const inChangeSet = internalRequest.method === \"GET\" ? false : !!internalRequest.inChangeSet;\r\n\r\n if (!inChangeSet && currentChangeSet) {\r\n //end current change set\r\n batchBody.push(`\\n--${currentChangeSet}--`);\r\n\r\n currentChangeSet = null;\r\n contentId = 100000;\r\n }\r\n\r\n if (!currentChangeSet) {\r\n batchBody.push(`\\n--${batchBoundary}`);\r\n\r\n if (inChangeSet) {\r\n currentChangeSet = `changeset_${Utility.generateUUID()}`;\r\n batchBody.push(\"Content-Type: multipart/mixed;boundary=\" + currentChangeSet);\r\n }\r\n }\r\n\r\n if (inChangeSet) {\r\n batchBody.push(`\\n--${currentChangeSet}`);\r\n }\r\n\r\n batchBody.push(\"Content-Type: application/http\");\r\n batchBody.push(\"Content-Transfer-Encoding: binary\");\r\n\r\n if (inChangeSet) {\r\n const contentIdValue = internalRequest.headers!.hasOwnProperty(\"Content-ID\") ? internalRequest.headers![\"Content-ID\"] : ++contentId;\r\n\r\n batchBody.push(`Content-ID: ${contentIdValue}`);\r\n }\r\n\r\n if (!internalRequest.path?.startsWith(\"$\")) {\r\n batchBody.push(`\\n${internalRequest.method} ${config.dataApi.url}${internalRequest.path} HTTP/1.1`);\r\n } else {\r\n batchBody.push(`\\n${internalRequest.method} ${internalRequest.path} HTTP/1.1`);\r\n }\r\n\r\n if (internalRequest.method === \"GET\") {\r\n batchBody.push(\"Accept: application/json\");\r\n } else {\r\n batchBody.push(\"Content-Type: application/json\");\r\n }\r\n\r\n for (let key in internalRequest.headers) {\r\n if (key === \"Authorization\" || key === \"Content-ID\") continue;\r\n\r\n batchBody.push(`${key}: ${internalRequest.headers[key]}`);\r\n }\r\n\r\n if (internalRequest.data) {\r\n batchBody.push(`\\n${processData(internalRequest.data, config)}`);\r\n }\r\n });\r\n\r\n if (currentChangeSet) {\r\n batchBody.push(`\\n--${currentChangeSet}--`);\r\n }\r\n\r\n batchBody.push(`\\n--${batchBoundary}--`);\r\n\r\n const headers = setStandardHeaders(batchRequest?.userHeaders);\r\n headers[\"Content-Type\"] = `multipart/mixed;boundary=${batchBoundary}`;\r\n\r\n return { headers: headers, body: batchBody.join(\"\\n\") };\r\n};\r\n\r\nexport const findCollectionName = (entityName: string): string | null => {\r\n let collectionName: string | null = null;\r\n\r\n if (!Utility.isNull(entityNames)) {\r\n collectionName = entityNames![entityName];\r\n if (!collectionName) {\r\n for (let key in entityNames!) {\r\n if (entityNames[key] === entityName) {\r\n return entityName;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return collectionName;\r\n};\r\n\r\nexport const processData = (data: any, config: InternalConfig): string | Uint8Array | Uint16Array | Uint32Array | null => {\r\n let stringifiedData: string | null = null;\r\n if (data) {\r\n if (data instanceof Uint8Array || data instanceof Uint16Array || data instanceof Uint32Array) return data;\r\n\r\n stringifiedData = JSON.stringify(data, (key, value) => {\r\n if (key.endsWith(\"@odata.bind\") || key.endsWith(\"@odata.id\")) {\r\n if (typeof value === \"string\" && !value.startsWith(\"$\")) {\r\n //remove brackets in guid\r\n if (/\\(\\{[\\w\\d-]+\\}\\)/g.test(value)) {\r\n value = value.replace(/(.+)\\(\\{([\\w\\d-]+)\\}\\)/g, \"$1($2)\");\r\n }\r\n\r\n if (config.useEntityNames) {\r\n //replace entity name with collection name\r\n const regularExpression = /([\\w_]+)(\\([\\d\\w-]+\\))$/;\r\n const valueParts = regularExpression.exec(value);\r\n if (valueParts && valueParts.length > 2) {\r\n const collectionName = findCollectionName(valueParts[1]);\r\n\r\n if (!Utility.isNull(collectionName)) {\r\n value = value.replace(regularExpression, collectionName + \"$2\");\r\n }\r\n }\r\n }\r\n\r\n if (!value.startsWith(config.dataApi.url)) {\r\n //add full web api url if it's not set\r\n if (key.endsWith(\"@odata.bind\")) {\r\n if (!value.startsWith(\"/\")) {\r\n value = \"/\" + value;\r\n }\r\n } else {\r\n value = config.dataApi.url + value.replace(/^\\//, \"\");\r\n }\r\n }\r\n }\r\n } else if (key.startsWith(\"oData\") || key.endsWith(\"_Formatted\") || key.endsWith(\"_NavigationProperty\") || key.endsWith(\"_LogicalName\")) {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n });\r\n\r\n stringifiedData = stringifiedData.replace(/[\\u007F-\\uFFFF]/g, function (chr: string) {\r\n return \"\\\\u\" + (\"0000\" + chr.charCodeAt(0).toString(16)).slice(-4);\r\n });\r\n }\r\n\r\n return stringifiedData;\r\n};\r\n\r\nexport const setStandardHeaders = (headers: HeaderCollection = {}): HeaderCollection => {\r\n if (!headers[\"Accept\"]) headers[\"Accept\"] = \"application/json\";\r\n if (!headers[\"OData-MaxVersion\"]) headers[\"OData-MaxVersion\"] = \"4.0\";\r\n if (!headers[\"OData-Version\"]) headers[\"OData-Version\"] = \"4.0\";\r\n if (headers[\"Content-Range\"]) headers[\"Content-Type\"] = \"application/octet-stream\";\r\n else if (!headers[\"Content-Type\"]) headers[\"Content-Type\"] = \"application/json; charset=utf-8\";\r\n\r\n return headers;\r\n};\r\n", "import type { RequestOptions, WebApiResponse } from \"../../types\";\r\n\r\nexport async function executeRequest(options: RequestOptions): Promise {\r\n return global.DWA_BROWSER ? require(\"../xhr\").executeRequest(options) : require(\"../http\").executeRequest(options);\r\n}\r\n"], + "mappings": "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", "names": ["getCrypto", "_a", "_a", "_b", "executeRequest", "_a", "executeRequest", "_a", "request"] } diff --git a/package-lock.json b/package-lock.json index 71d1c5c..27f61e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "dynamics-web-api", - "version": "2.1.1", + "version": "2.1.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "dynamics-web-api", - "version": "2.1.1", + "version": "2.1.4", "license": "MIT", "dependencies": { "http-proxy-agent": "^4.0.1", @@ -1340,12 +1340,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -1969,9 +1969,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -6337,12 +6337,12 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "browser-stdout": { @@ -6799,9 +6799,9 @@ "dev": true }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "requires": { "to-regex-range": "^5.0.1" diff --git a/package.json b/package.json index 7ae9a16..6519a13 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dynamics-web-api", - "version": "2.1.4", + "version": "2.1.5", "description": "DynamicsWebApi is a Microsoft Dynamics CRM Web API helper library", "keywords": [ "d365", diff --git a/src/client/RequestClient.ts b/src/client/RequestClient.ts index c7590df..502ac2c 100644 --- a/src/client/RequestClient.ts +++ b/src/client/RequestClient.ts @@ -1,17 +1,17 @@ +import type * as Core from "../types"; import { Utility } from "../utils/Utility"; import { InternalConfig } from "../utils/Config"; -import { RequestUtility } from "../utils/Request"; +import * as RequestUtility from "../utils/Request"; import { DynamicsWebApiError, ErrorHelper } from "../helpers/ErrorHelper"; -import { Core } from "../types"; import { executeRequest } from "./helpers/executeRequest"; import { AccessToken } from "../dynamics-web-api"; -const _addResponseParams = (requestId, responseParams) => { +const _addResponseParams = (requestId: string, responseParams: Record) => { if (_responseParseParams[requestId]) _responseParseParams[requestId].push(responseParams); else _responseParseParams[requestId] = [responseParams]; }; -const _addRequestToBatchCollection = (requestId, request) => { +const _addRequestToBatchCollection = (requestId: string, request: Core.InternalRequest) => { if (_batchRequestCollection[requestId]) _batchRequestCollection[requestId].push(request); else _batchRequestCollection[requestId] = [request]; }; @@ -38,6 +38,64 @@ const _runRequest = async (request: Core.InternalRequest, config: InternalConfig let _batchRequestCollection: Core.BatchRequestCollection = {}; let _responseParseParams: { [key: string]: any[] } = {}; +const _nameExceptions = [ + "$metadata", + "EntityDefinitions", + "RelationshipDefinitions", + "GlobalOptionSetDefinitions", + "ManagedPropertyDefinitions", + "query", + "suggest", + "autocomplete", +]; + +const _isEntityNameException = (entityName: string): boolean => { + return _nameExceptions.indexOf(entityName) > -1; +}; + +const _getCollectionNames = async (entityName: string, config: InternalConfig): Promise => { + if (!Utility.isNull(RequestUtility.entityNames)) { + return RequestUtility.findCollectionName(entityName) || entityName; + } + + const request = RequestUtility.compose( + { + method: "GET", + collection: "EntityDefinitions", + select: ["EntitySetName", "LogicalName"], + noCache: true, + functionName: "retrieveMultiple", + }, + config + ); + + const result = await _runRequest(request, config); + RequestUtility.setEntityNames({}); + for (let i = 0; i < result.data.value.length; i++) { + RequestUtility.entityNames![result.data.value[i].LogicalName] = result.data.value[i].EntitySetName; + } + + return RequestUtility.findCollectionName(entityName) || entityName; +}; + +const _checkCollectionName = async (entityName: string | null | undefined, config: InternalConfig): Promise => { + if (!entityName || _isEntityNameException(entityName)) { + return entityName; + } + + entityName = entityName.toLowerCase(); + + if (!config.useEntityNames) { + return entityName; + } + + try { + return await _getCollectionNames(entityName, config); + } catch (error: any) { + throw new Error("Unable to fetch Collection Names. Error: " + (error as DynamicsWebApiError).message); + } +}; + export class RequestClient { /** * Sends a request to given URL with given parameters @@ -106,74 +164,16 @@ export class RequestClient { method: request.method!, uri: url!.toString() + request.path, data: processedData, - additionalHeaders: request.headers, - responseParams: _responseParseParams, - isAsync: request.async, - timeout: request.timeout || config.timeout, proxy: config.proxy, + isAsync: request.async, + headers: request.headers!, requestId: request.requestId!, abortSignal: request.signal, + responseParams: _responseParseParams, + timeout: request.timeout || config.timeout, }); } - private static async _getCollectionNames(entityName: string, config: InternalConfig): Promise { - if (!Utility.isNull(RequestUtility.entityNames)) { - return RequestUtility.findCollectionName(entityName) || entityName; - } - - const request = RequestUtility.compose( - { - method: "GET", - collection: "EntityDefinitions", - select: ["EntitySetName", "LogicalName"], - noCache: true, - functionName: "retrieveMultiple", - }, - config - ); - - const result = await _runRequest(request, config); - RequestUtility.entityNames = {}; - for (let i = 0; i < result.data.value.length; i++) { - RequestUtility.entityNames[result.data.value[i].LogicalName] = result.data.value[i].EntitySetName; - } - - return RequestUtility.findCollectionName(entityName) || entityName; - } - - private static _isEntityNameException(entityName: string): boolean { - const exceptions = [ - "$metadata", - "EntityDefinitions", - "RelationshipDefinitions", - "GlobalOptionSetDefinitions", - "ManagedPropertyDefinitions", - "query", - "suggest", - "autocomplete", - ]; - - return exceptions.indexOf(entityName) > -1; - } - - private static async _checkCollectionName(entityName: string | null | undefined, config: InternalConfig): Promise { - if (!entityName || RequestClient._isEntityNameException(entityName)) { - return entityName; - } - - entityName = entityName.toLowerCase(); - - if (!config.useEntityNames) { - return entityName; - } - - try { - return await RequestClient._getCollectionNames(entityName, config); - } catch (error: any) { - throw new Error("Unable to fetch Collection Names. Error: " + (error as DynamicsWebApiError).message); - } - } - static async makeRequest(request: Core.InternalRequest, config: InternalConfig): Promise { request.responseParameters = request.responseParameters || {}; //we don't want to mix headers set by the library and by the user @@ -181,7 +181,7 @@ export class RequestClient { delete request.headers; if (!request.isBatch) { - const collectionName = await RequestClient._checkCollectionName(request.collection, config); + const collectionName = await _checkCollectionName(request.collection, config); request.collection = collectionName; RequestUtility.compose(request, config); @@ -191,6 +191,12 @@ export class RequestClient { if (request.path!.length > 2000) { const batchRequest = RequestUtility.convertToBatch([request], config); + //#175 authorization header must be copied as well. + //todo: is it the only one that needs to be copied? + if (request.headers!["Authorization"]) { + batchRequest.headers["Authorization"] = request.headers!["Authorization"]; + } + request.method = "POST"; request.path = "$batch"; request.data = batchRequest.body; @@ -204,12 +210,12 @@ export class RequestClient { //no need to make a request to web api if it's a part of batch RequestUtility.compose(request, config); //add response parameters to parse - _addResponseParams(request.requestId, request.responseParameters); - _addRequestToBatchCollection(request.requestId, request); + _addResponseParams(request.requestId!, request.responseParameters); + _addRequestToBatchCollection(request.requestId!, request); } static _clearTestData(): void { - RequestUtility.entityNames = null; + RequestUtility.setEntityNames(null); _responseParseParams = {}; _batchRequestCollection = {}; } diff --git a/src/client/helpers/executeRequest.ts b/src/client/helpers/executeRequest.ts index d34fcad..defe2f8 100644 --- a/src/client/helpers/executeRequest.ts +++ b/src/client/helpers/executeRequest.ts @@ -1,5 +1,5 @@ -import { Core } from "../../types"; +import type { RequestOptions, WebApiResponse } from "../../types"; -export async function executeRequest(options: Core.RequestOptions): Promise { +export async function executeRequest(options: RequestOptions): Promise { return global.DWA_BROWSER ? require("../xhr").executeRequest(options) : require("../http").executeRequest(options); } diff --git a/src/client/helpers/parseResponse.ts b/src/client/helpers/parseResponse.ts index b39d86d..a8c75fd 100644 --- a/src/client/helpers/parseResponse.ts +++ b/src/client/helpers/parseResponse.ts @@ -2,7 +2,7 @@ import { Utility } from "../../utils/Utility"; import { ErrorHelper, DynamicsWebApiError } from "../../helpers/ErrorHelper"; import { dateReviver } from "./dateReviver"; -import { Core } from "../../types"; +import type * as Core from "../../types"; import { extractUuidFromUrl } from "../../helpers/Regex"; function getFormattedKeyValue(keyName: string, value: any): any[] { diff --git a/src/client/http.ts b/src/client/http.ts index 93f4335..8ebf36a 100644 --- a/src/client/http.ts +++ b/src/client/http.ts @@ -2,7 +2,7 @@ import * as https from "https"; import HttpProxyAgent from "http-proxy-agent"; import HttpsProxyAgent from "https-proxy-agent"; -import { Core } from "../types"; +import type * as Core from "../types"; import { ErrorHelper } from "./../helpers/ErrorHelper"; import { parseResponse } from "./helpers/parseResponse"; @@ -57,22 +57,22 @@ function _executeRequest( errorCallback: (error: Core.WebApiErrorResponse | Core.WebApiErrorResponse[]) => void ) { const data = options.data; - const additionalHeaders = options.additionalHeaders; + const headers = options.headers; const responseParams = options.responseParams; const signal = options.abortSignal; - const headers: http.OutgoingHttpHeaders = {}; + const httpHeaders: http.OutgoingHttpHeaders = {}; if (data) { - headers["Content-Type"] = additionalHeaders["Content-Type"]; - headers["Content-Length"] = data.length; + httpHeaders["Content-Type"] = headers["Content-Type"]; + httpHeaders["Content-Length"] = data.length; - delete additionalHeaders["Content-Type"]; + delete headers["Content-Type"]; } //set additional headers - for (let key in additionalHeaders) { - headers[key] = additionalHeaders[key]; + for (let key in headers) { + httpHeaders[key] = headers[key]; } const parsedUrl = new URL(options.uri); const protocol = parsedUrl.protocol?.slice(0, -1) || "https"; @@ -84,7 +84,7 @@ function _executeRequest( path: parsedUrl.pathname + parsedUrl.search, method: options.method, timeout: options.timeout || 0, - headers: headers, + headers: httpHeaders, signal: signal, }; @@ -99,7 +99,7 @@ function _executeRequest( if (options.proxy) { const hostHeader = new URL(options.proxy.url).host; - if (hostHeader) headers.host = hostHeader; + if (hostHeader) httpHeaders.host = hostHeader; } const request = protocolInterface.request(internalOptions, function (res) { diff --git a/src/client/xhr.ts b/src/client/xhr.ts index b54e4e5..9bc8b6e 100644 --- a/src/client/xhr.ts +++ b/src/client/xhr.ts @@ -1,4 +1,4 @@ -import { Core } from "../types"; +import type * as Core from "../types"; import { ErrorHelper } from "./../helpers/ErrorHelper"; import { parseResponse } from "./helpers/parseResponse"; import { parseResponseHeaders } from "./helpers/parseResponseHeaders"; @@ -15,7 +15,7 @@ function _executeRequest( errorCallback: (error: Core.WebApiErrorResponse | Core.WebApiErrorResponse[]) => void ) { const data = options.data; - const additionalHeaders = options.additionalHeaders; + const headers = options.headers; const responseParams = options.responseParams; const signal = options.abortSignal; @@ -35,8 +35,8 @@ function _executeRequest( request.open(options.method, options.uri, options.isAsync || false); //set additional headers - for (let key in additionalHeaders) { - request.setRequestHeader(key, additionalHeaders[key]); + for (let key in headers) { + request.setRequestHeader(key, headers[key]); } request.onreadystatechange = function () { diff --git a/src/dynamics-web-api.ts b/src/dynamics-web-api.ts index 9df8a89..b750f7a 100644 --- a/src/dynamics-web-api.ts +++ b/src/dynamics-web-api.ts @@ -2,7 +2,7 @@ import { Utility } from "./utils/Utility"; import { ErrorHelper } from "./helpers/ErrorHelper"; import { RequestClient } from "./client/RequestClient"; -import type { Core } from "./types"; +import type { InternalRequest, WebApiResponse } from "./types"; /** * Microsoft Dynamics CRM Web API helper library written in JavaScript. @@ -30,7 +30,7 @@ export class DynamicsWebApi { */ setConfig = (config: Config) => ConfigurationUtility.merge(this._config, config); - private _makeRequest = async (request: Core.InternalRequest): Promise => { + private _makeRequest = async (request: InternalRequest): Promise => { request.isBatch = this._isBatch; if (this._batchRequestId) request.requestId = this._batchRequestId; return RequestClient.makeRequest(request, this._config); @@ -61,12 +61,12 @@ export class DynamicsWebApi { create = async (request: CreateRequest): Promise => { ErrorHelper.parameterCheck(request, "DynamicsWebApi.create", "request"); - let internalRequest: Core.InternalRequest; + let internalRequest: InternalRequest; - if (!(request).functionName) { + if (!(request).functionName) { internalRequest = Utility.copyRequest(request); internalRequest.functionName = "create"; - } else internalRequest = request; + } else internalRequest = request; internalRequest.method = "POST"; @@ -94,9 +94,9 @@ export class DynamicsWebApi { retrieve = async (request: RetrieveRequest): Promise => { ErrorHelper.parameterCheck(request, "DynamicsWebApi.retrieve", "request"); - let internalRequest: Core.InternalRequest; + let internalRequest: InternalRequest; - if (!(request).functionName) { + if (!(request).functionName) { internalRequest = Utility.copyRequest(request); internalRequest.functionName = "retrieve"; } else internalRequest = request; @@ -119,9 +119,9 @@ export class DynamicsWebApi { update = async (request: UpdateRequest): Promise => { ErrorHelper.parameterCheck(request, "DynamicsWebApi.update", "request"); - let internalRequest: Core.InternalRequest; + let internalRequest: InternalRequest; - if (!(request).functionName) { + if (!(request).functionName) { internalRequest = Utility.copyRequest(request); internalRequest.functionName = "update"; } else internalRequest = request; @@ -188,9 +188,9 @@ export class DynamicsWebApi { deleteRecord = async (request: DeleteRequest): Promise => { ErrorHelper.parameterCheck(request, "DynamicsWebApi.deleteRecord", "request"); - let internalRequest: Core.InternalRequest; + let internalRequest: InternalRequest; - if (!(request).functionName) { + if (!(request).functionName) { internalRequest = Utility.copyRequest(request); internalRequest.functionName = "deleteRecord"; } else internalRequest = request; @@ -246,7 +246,7 @@ export class DynamicsWebApi { } }; - private _uploadFileChunk = async (request: Core.InternalRequest, fileBytes: Uint8Array | Buffer, chunkSize: number, offset: number = 0): Promise => { + private _uploadFileChunk = async (request: InternalRequest, fileBytes: Uint8Array | Buffer, chunkSize: number, offset: number = 0): Promise => { // offset = offset || 0; Utility.setFileChunk(request, fileBytes, chunkSize, offset); @@ -282,7 +282,7 @@ export class DynamicsWebApi { }; private _downloadFileChunk = async ( - request: Core.InternalRequest, + request: InternalRequest, bytesDownloaded: number = 0, // fileSize: number = 0, data: string = "" @@ -338,9 +338,9 @@ export class DynamicsWebApi { retrieveMultiple = async (request: RetrieveMultipleRequest, nextPageLink?: string): Promise> => { ErrorHelper.parameterCheck(request, "DynamicsWebApi.retrieveMultiple", "request"); - let internalRequest: Core.InternalRequest; + let internalRequest: InternalRequest; - if (!(request).functionName) { + if (!(request).functionName) { internalRequest = Utility.copyRequest(request); internalRequest.functionName = "retrieveMultiple"; } else internalRequest = request; @@ -609,14 +609,14 @@ export class DynamicsWebApi { const isObject = typeof request !== "string"; const functionName = isObject ? getFunctionName(request) : request; const parameterName = isObject ? "request.name" : "name"; - const internalRequest: Core.InternalRequest = isObject ? Utility.copyObject(request, ["name"]) : { functionName: functionName }; + const internalRequest: InternalRequest = isObject ? Utility.copyObject(request, ["name"]) : { functionName: functionName }; ErrorHelper.stringParameterCheck(functionName, `DynamicsWebApi.callFunction`, parameterName); const functionParameters = Utility.buildFunctionParameters(internalRequest.parameters); internalRequest.method = "GET"; - internalRequest._additionalUrl = functionName + functionParameters.key; + internalRequest.addPath = functionName + functionParameters.key; internalRequest.queryParams = functionParameters.queryParams; internalRequest._isUnboundRequest = !internalRequest.collection; internalRequest.functionName = "callFunction"; @@ -641,7 +641,7 @@ export class DynamicsWebApi { internalRequest.method = "POST"; internalRequest.functionName = "callAction"; - internalRequest._additionalUrl = request.actionName; + internalRequest.addPath = request.actionName; internalRequest._isUnboundRequest = !internalRequest.collection; internalRequest.data = request.action; @@ -709,7 +709,7 @@ export class DynamicsWebApi { * @returns {Promise} D365 Web Api Response */ retrieveEntities = (request?: RetrieveEntitiesRequest): Promise> => { - const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request); + const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request); internalRequest.collection = "EntityDefinitions"; internalRequest.functionName = "retrieveEntities"; @@ -881,7 +881,7 @@ export class DynamicsWebApi { * @returns {Promise} D365 Web Api Response */ retrieveRelationships = (request?: RetrieveRelationshipsRequest): Promise> => { - const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request); + const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request); internalRequest.collection = "RelationshipDefinitions"; internalRequest.functionName = "retrieveRelationships"; @@ -1003,7 +1003,7 @@ export class DynamicsWebApi { * @returns {Promise} D365 Web Api Response */ retrieveGlobalOptionSets = (request?: RetrieveGlobalOptionSetsRequest): Promise> => { - const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request); + const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request); internalRequest.collection = "GlobalOptionSetDefinitions"; internalRequest.functionName = "retrieveGlobalOptionSets"; @@ -1022,7 +1022,7 @@ export class DynamicsWebApi { * @returns {Promise} A raw CSDL $metadata document. */ retrieveCsdlMetadata = async (request?: CsdlMetadataRequest): Promise => { - const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request); + const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request); internalRequest.collection = "$metadata"; internalRequest.functionName = "retrieveCsdlMetadata"; @@ -1046,7 +1046,7 @@ export class DynamicsWebApi { const isObject = Utility.isObject(request); const parameterName = isObject ? "request.query.search" : "term"; - const internalRequest: Core.InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } }; + const internalRequest: InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } }; ErrorHelper.parameterCheck(internalRequest.query, "DynamicsWebApi.search", "request.query"); ErrorHelper.stringParameterCheck(internalRequest.query.search, "DynamicsWebApi.search", parameterName); @@ -1074,7 +1074,7 @@ export class DynamicsWebApi { const isObject = Utility.isObject(request); const parameterName = isObject ? "request.query.search" : "term"; - const internalRequest: Core.InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } }; + const internalRequest: InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } }; ErrorHelper.parameterCheck(internalRequest.query, "DynamicsWebApi.suggest", "request.query"); ErrorHelper.stringParameterCheck(internalRequest.query.search, "DynamicsWebApi.suggest", parameterName); @@ -1101,7 +1101,7 @@ export class DynamicsWebApi { const isObject = Utility.isObject(request); const parameterName = isObject ? "request.query.search" : "term"; - const internalRequest: Core.InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } }; + const internalRequest: InternalRequest = isObject ? Utility.copyObject(request) : { query: { search: request as string } }; if (isObject) ErrorHelper.parameterCheck(internalRequest.query, "DynamicsWebApi.autocomplete", "request.query"); ErrorHelper.stringParameterCheck(internalRequest.query.search, `DynamicsWebApi.autocomplete`, parameterName); @@ -1134,7 +1134,7 @@ export class DynamicsWebApi { executeBatch = async (request?: BatchRequest): Promise => { ErrorHelper.throwBatchNotStarted(this._isBatch); - const internalRequest: Core.InternalRequest = !request ? {} : Utility.copyRequest(request); + const internalRequest: InternalRequest = !request ? {} : Utility.copyRequest(request); internalRequest.collection = "$batch"; internalRequest.method = "POST"; @@ -1733,10 +1733,7 @@ export interface Config { } /**Header collection type */ -export type HeaderCollection = { - /**key-value */ - [key: string]: string; -}; +export type HeaderCollection = Record; export interface ProxyConfig { /**Proxy server url */ diff --git a/src/types.ts b/src/types.ts index c7a58aa..a7e1dfd 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,178 +1,175 @@ import type { ProxyConfig, Expand, RequestError, HeaderCollection } from "./dynamics-web-api"; import type { InternalApiConfig } from "./utils/Config"; -export declare namespace Core { - interface RequestOptions { - method: string; - uri: string; - data: string | null; - additionalHeaders: any; - responseParams: { - [key: string]: any[]; - }; - timeout?: number | null; - isAsync?: boolean; - requestId: string; - proxy?: ProxyConfig | null; - abortSignal?: AbortSignal; - } +export interface RequestOptions { + method: RequestMethod; + uri: string; + data: string | null; + headers: HeaderCollection; + responseParams: Record; + timeout?: number | null; + isAsync?: boolean; + requestId: string; + proxy?: ProxyConfig | null; + abortSignal?: AbortSignal; +} - interface WebApiResponse { - data: any; - headers: { [key: string]: string }; - status: number; - } +export interface WebApiResponse { + data: any; + headers: HeaderCollection; + status: number; +} - interface WebApiErrorResponse extends RequestError {} +export interface WebApiErrorResponse extends RequestError {} - interface BatchRequestCollection { - [key: string]: InternalRequest[]; - } +export type BatchRequestCollection = Record; - interface ConvertedRequest { - path?: string; - headers?: any; - async?: boolean; - method?: string; - data?: any; - responseParams?: any; - isAsync?: boolean; - } +export interface ConvertedRequest { + path?: string; + headers?: any; + async?: boolean; + method?: string; + data?: any; + responseParams?: any; + isAsync?: boolean; +} - interface InternalBatchRequest { - body: any; - headers: HeaderCollection; - } +export interface InternalBatchRequest { + body: any; + headers: HeaderCollection; +} - interface InternalRequest { - /**XHR requests only! Indicates whether the requests should be made synchronously or asynchronously.Default value is 'true'(asynchronously). */ - async?: boolean; - /**Sets the $apply system query option to aggregate and group your data dynamically. */ - apply?: string; - /**The name of the Entity Collection or Entity Logical name. */ - collection?: string | null; - /**Impersonates a user based on their systemuserid by adding "MSCRMCallerID" header. A String representing the GUID value for the Dynamics 365 systemuserid. */ - impersonate?: string; - /**Impersonates a user based on their Azure Active Directory (AAD) object id by passing that value along with the header "CallerObjectId". A String should represent a GUID value. */ - impersonateAAD?: string; - /** If set to 'true', DynamicsWebApi adds a request header 'Cache-Control: no-cache'.Default value is 'false'. */ - noCache?: boolean; - /** Authorization Token. If set, onTokenRefresh will not be called. */ - token?: string; - /**A String representing collection record's Primary Key (GUID) or Alternate Key(s). */ - key?: string; - /**v.1.7.5+ If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */ - bypassCustomPluginExecution?: boolean; - /**v.1.3.4+ Web API v9+ only! Boolean that enables duplicate detection. */ - duplicateDetection?: boolean; - /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */ - navigationProperty?: string; - /**v.1.4.3 + A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */ - navigationPropertyKey?: string; - /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */ - expand?: Expand[]; - /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/ - ifmatch?: string; - /**Sets Prefer header with value "odata.include-annotations=" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */ - includeAnnotations?: string; - /**Sets Prefer header request with value "return=representation".Use this property to return just created or updated entity in a single request. */ - returnRepresentation?: boolean; - /**Prefer header values */ - prefer?: string | string[]; - /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */ - select?: string[]; - /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */ - contentId?: string; - /**v.1.4.3 + Casts the AttributeMetadata to a specific type. (Used in requests to Attribute Metadata). */ - metadataAttributeType?: string; - /**If set to 'true', DynamicsWebApi adds a request header 'MSCRM.MergeLabels: true'. Default value is 'false' */ - mergeLabels?: boolean; - /**Sets If-None-Match header value that enables to use conditional retrieval in applicable requests. */ - ifnonematch?: string; - /**Use the $filter system query option to set criteria for which entities will be returned. */ - filter?: string; - /**A String representing the GUID value of the saved query. */ - savedQuery?: string; - /**A String representing the GUID value of the user query. */ - userQuery?: string; - /**Boolean that sets the $count system query option with a value of true to include a count of entities that match the filter criteria up to 5000(per page).Do not use $top with $count! */ - count?: boolean; - /**Sets the odata.maxpagesize preference value to request the number of entities returned in the response. */ - maxPageSize?: number; - /**An Array(of string) representing the order in which items are returned using the $orderby system query option.Use the asc or desc suffix to specify ascending or descending order respectively.The default is ascending if the suffix isn't applied. */ - orderBy?: string[]; - /**Limit the number of results returned by using the $top system query option.Do not use $top with $count! */ - top?: number; - /**Sets Prefer header with value 'odata.track-changes' to request that a delta link be returned which can subsequently be used to retrieve entity changes. */ - trackChanges?: boolean; - /**v.1.7.0+ Web API v9.1+ only! Use this option to specify the name of the file attribute in Dynamics 365. */ - fieldName?: string; - /**v.1.7.0+ Web API v9.1+ only! Specifies the name of the file */ - fileName?: string; - /**v.1.7.7+ A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */ - partitionId?: string; - /**v.1.7.7+ Additional query parameters that either have not been implemented yet or they are parameter aliases for "$filter" and "$orderBy". Important! These parameters ARE NOT URI encoded! */ - queryParams?: string[]; - contentRange?: string; - url?: string; - parameters?: { [key: string]: any }; - _isUnboundRequest?: boolean; - _additionalUrl?: string; - fetchXml?: string; - isBatch?: boolean; - data?: any; - timeout?: number; - method?: string; - functionName?: string; - responseParameters?: any; - path?: string; - headers?: HeaderCollection; - userHeaders?: HeaderCollection; - pageNumber?: number; - pagingCookie?: string; - requestId?: string | null; - inChangeSet?: boolean | null; - transferMode?: string; - range?: string; - downloadSize?: string; - /**Set a specific api config for a request. Default is dataApi. */ - apiConfig?: InternalApiConfig; - query?: any; - signal?: AbortSignal; - continueOnError?: boolean; - } +export type RequestMethod = "POST"| "PUT" | "PATCH" | "DELETE" | "GET"; - interface FileParseResult { - value: any; - fileName?: string; - fileSize?: number; - location?: string; - } +export interface InternalRequest { + /**XHR requests only! Indicates whether the requests should be made synchronously or asynchronously.Default value is 'true'(asynchronously). */ + async?: boolean; + /**Sets the $apply system query option to aggregate and group your data dynamically. */ + apply?: string; + /**The name of the Entity Collection or Entity Logical name. */ + collection?: string | null; + /**Impersonates a user based on their systemuserid by adding "MSCRMCallerID" header. A String representing the GUID value for the Dynamics 365 systemuserid. */ + impersonate?: string; + /**Impersonates a user based on their Azure Active Directory (AAD) object id by passing that value along with the header "CallerObjectId". A String should represent a GUID value. */ + impersonateAAD?: string; + /** If set to 'true', DynamicsWebApi adds a request header 'Cache-Control: no-cache'.Default value is 'false'. */ + noCache?: boolean; + /** Authorization Token. If set, onTokenRefresh will not be called. */ + token?: string; + /**A String representing collection record's Primary Key (GUID) or Alternate Key(s). */ + key?: string; + /**v.1.7.5+ If set to true, the request bypasses custom business logic, all synchronous plug-ins and real-time workflows are disabled. Check for special exceptions in Microsft Docs. */ + bypassCustomPluginExecution?: boolean; + /**v.1.3.4+ Web API v9+ only! Boolean that enables duplicate detection. */ + duplicateDetection?: boolean; + /**A String representing the name of a single - valued navigation property.Useful when needed to retrieve information about a related record in a single request. */ + navigationProperty?: string; + /**v.1.4.3 + A String representing navigation property's Primary Key (GUID) or Alternate Key(s). (For example, to retrieve Attribute Metadata). */ + navigationPropertyKey?: string; + /**An array of Expand Objects(described below the table) representing the $expand OData System Query Option value to control which related records are also returned. */ + expand?: Expand[]; + /**Sets If-Match header value that enables to use conditional retrieval or optimistic concurrency in applicable requests.*/ + ifmatch?: string; + /**Sets Prefer header with value "odata.include-annotations=" and the specified annotation.Annotations provide additional information about lookups, options sets and other complex attribute types. */ + includeAnnotations?: string; + /**Sets Prefer header request with value "return=representation".Use this property to return just created or updated entity in a single request. */ + returnRepresentation?: boolean; + /**Prefer header values */ + prefer?: string | string[]; + /**An Array(of Strings) representing the $select OData System Query Option to control which attributes will be returned. */ + select?: string[]; + /**BATCH REQUESTS ONLY! Sets Content-ID header or references request in a Change Set. */ + contentId?: string; + /**v.1.4.3 + Casts the AttributeMetadata to a specific type. (Used in requests to Attribute Metadata). */ + metadataAttributeType?: string; + /**If set to 'true', DynamicsWebApi adds a request header 'MSCRM.MergeLabels: true'. Default value is 'false' */ + mergeLabels?: boolean; + /**Sets If-None-Match header value that enables to use conditional retrieval in applicable requests. */ + ifnonematch?: string; + /**Use the $filter system query option to set criteria for which entities will be returned. */ + filter?: string; + /**A String representing the GUID value of the saved query. */ + savedQuery?: string; + /**A String representing the GUID value of the user query. */ + userQuery?: string; + /**Boolean that sets the $count system query option with a value of true to include a count of entities that match the filter criteria up to 5000(per page).Do not use $top with $count! */ + count?: boolean; + /**Sets the odata.maxpagesize preference value to request the number of entities returned in the response. */ + maxPageSize?: number; + /**An Array(of string) representing the order in which items are returned using the $orderby system query option.Use the asc or desc suffix to specify ascending or descending order respectively.The default is ascending if the suffix isn't applied. */ + orderBy?: string[]; + /**Limit the number of results returned by using the $top system query option.Do not use $top with $count! */ + top?: number; + /**Sets Prefer header with value 'odata.track-changes' to request that a delta link be returned which can subsequently be used to retrieve entity changes. */ + trackChanges?: boolean; + /**v.1.7.0+ Web API v9.1+ only! Use this option to specify the name of the file attribute in Dynamics 365. */ + fieldName?: string; + /**v.1.7.0+ Web API v9.1+ only! Specifies the name of the file */ + fileName?: string; + /**v.1.7.7+ A unique partition key value of a logical partition for non-relational custom entity data stored in NoSql tables of Azure heterogenous storage. */ + partitionId?: string; + /**v.1.7.7+ Additional query parameters that either have not been implemented yet or they are parameter aliases for "$filter" and "$orderBy". Important! These parameters ARE NOT URI encoded! */ + queryParams?: string[]; + contentRange?: string; + url?: string; + parameters?: Record; + _isUnboundRequest?: boolean; + /**Sets an additional URL path after collection (EntitySet name), key and contentId if those are set */ + addPath?: string; + fetchXml?: string; + isBatch?: boolean; + data?: any; + timeout?: number; + method?: RequestMethod; + functionName?: string; + responseParameters?: any; + path?: string; + headers?: HeaderCollection; + userHeaders?: HeaderCollection; + pageNumber?: number; + pagingCookie?: string; + requestId?: string | null; + inChangeSet?: boolean | null; + transferMode?: string; + range?: string; + downloadSize?: string; + /**Set a specific api config for a request. Default is dataApi. */ + apiConfig?: InternalApiConfig; + query?: any; + signal?: AbortSignal; + continueOnError?: boolean; +} - interface FetchXmlCookie { - cookie: string; - page: number; - nextPage: number; - } +export interface FileParseResult { + value: any; + fileName?: string; + fileSize?: number; + location?: string; +} - interface ReferenceObject { - id: string; - collection: string; - oDataContext: string; - } +export interface FetchXmlCookie { + cookie: string; + page: number; + nextPage: number; +} - interface WebApiRequest { - requestUrl: string; - headers: any; - async?: boolean; - } +export interface ReferenceObject { + id: string; + collection: string; + oDataContext: string; +} - type FunctionParameters = { - key: string, - queryParams?: string[] - } +export interface WebApiRequest { + requestUrl: string; + headers: any; + async?: boolean; } +export type FunctionParameters = { + key: string; + queryParams?: string[]; +}; + declare global { interface Window { shell?: { diff --git a/src/utils/Request.ts b/src/utils/Request.ts index 6819d88..a4ccf44 100644 --- a/src/utils/Request.ts +++ b/src/utils/Request.ts @@ -1,586 +1,556 @@ +import type { InternalRequest, InternalBatchRequest } from "../types"; + import { Utility } from "./Utility"; import { Config, HeaderCollection } from "../dynamics-web-api"; import { ErrorHelper } from "../helpers/ErrorHelper"; -import { Core } from "../types"; import { InternalConfig } from "./Config"; -/** - * @typedef {Object} ConvertedRequestOptions - * @property {string} url URL (without query) - * @property {string} query Query String - * @property {Object} headers Heades object (always an Object; can be empty: {}) - */ +export let entityNames: Record | null = null; + +export const setEntityNames = (newEntityNames: Record | null) => { + entityNames = newEntityNames; +}; /** - * @typedef {Object} ConvertedRequest - * @property {string} url URL (including Query String) - * @property {Object} headers Heades object (always an Object; can be empty: {}) - * @property {boolean} async + * Converts a request object to URL link + * @param request Internal request object + * @param config Internal configuration object + * @returns Modified internal request object */ +export const compose = (request: InternalRequest, config: InternalConfig): InternalRequest => { + request.path = request.path || ""; + request.functionName = request.functionName || ""; + if (!request.url) { + if (!request._isUnboundRequest && !request.contentId && !request.collection) { + ErrorHelper.parameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, "request.collection"); + } + if (request.collection != null) { + ErrorHelper.stringParameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, "request.collection"); + request.path = request.collection; -export class RequestUtility { - /** - * Converts a request object to URL link - * - * @param {Object} request - Request object - * @param {Object} [config] - DynamicsWebApi config - * @returns {ConvertedRequest} Converted request - */ - static compose(request: Core.InternalRequest, config: InternalConfig): Core.InternalRequest { - request.path = request.path || ""; - request.functionName = request.functionName || ""; - if (!request.url) { - if (!request._isUnboundRequest && !request.contentId && !request.collection) { - ErrorHelper.parameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, "request.collection"); - } - if (request.collection != null) { - ErrorHelper.stringParameterCheck(request.collection, `DynamicsWebApi.${request.functionName}`, "request.collection"); - request.path = request.collection; - - //add alternate key feature - if (request.key) { - request.key = ErrorHelper.keyParameterCheck(request.key, `DynamicsWebApi.${request.functionName}`, "request.key"); - request.path += `(${request.key})`; - } + //add alternate key feature + if (request.key) { + request.key = ErrorHelper.keyParameterCheck(request.key, `DynamicsWebApi.${request.functionName}`, "request.key"); + request.path += `(${request.key})`; } + } - if (request.contentId) { - ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, "request.contentId"); - if (request.contentId.startsWith("$")) { - request.path = request.path ? `${request.contentId}/${request.path}` : request.contentId; - } + if (request.contentId) { + ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, "request.contentId"); + if (request.contentId.startsWith("$")) { + request.path = request.path ? `${request.contentId}/${request.path}` : request.contentId; } + } - if (request._additionalUrl) { - if (request.path) { - request.path += "/"; - } - request.path += request._additionalUrl; + if (request.addPath) { + if (request.path) { + request.path += "/"; } + request.path += request.addPath; + } - request.path = RequestUtility.composeUrl(request, config, request.path); + request.path = composeUrl(request, config, request.path); - if (request.fetchXml) { - ErrorHelper.stringParameterCheck(request.fetchXml, `DynamicsWebApi.${request.functionName}`, "request.fetchXml"); - let join = request.path.indexOf("?") === -1 ? "?" : "&"; - request.path += `${join}fetchXml=${encodeURIComponent(request.fetchXml)}`; - } - } else { - ErrorHelper.stringParameterCheck(request.url, `DynamicsWebApi.${request.functionName}`, "request.url"); - request.path = request.url.replace(config.dataApi.url, ""); + if (request.fetchXml) { + ErrorHelper.stringParameterCheck(request.fetchXml, `DynamicsWebApi.${request.functionName}`, "request.fetchXml"); + let join = request.path.indexOf("?") === -1 ? "?" : "&"; + request.path += `${join}fetchXml=${encodeURIComponent(request.fetchXml)}`; } + } else { + ErrorHelper.stringParameterCheck(request.url, `DynamicsWebApi.${request.functionName}`, "request.url"); + request.path = request.url.replace(config.dataApi.url, ""); + } - if (request.hasOwnProperty("async") && request.async != null) { - ErrorHelper.boolParameterCheck(request.async, `DynamicsWebApi.${request.functionName}`, "request.async"); - } else { - request.async = true; - } + if (request.hasOwnProperty("async") && request.async != null) { + ErrorHelper.boolParameterCheck(request.async, `DynamicsWebApi.${request.functionName}`, "request.async"); + } else { + request.async = true; + } - request.headers = RequestUtility.composeHeaders(request, config); + request.headers = composeHeaders(request, config); - return request; - } + return request; +}; - /** - * Converts optional parameters of the request to URL. If expand parameter exists this function is called recursively. - * - * @param {Object} request - Request object - * @param {string} request.functionName - Name of the function that converts a request (for Error Handling) - * @param {string} url - URL beginning (with required parameters) - * @param {string} [joinSymbol] - URL beginning (with required parameters) - * @param {Object} [config] - DynamicsWebApi config - * @returns {ConvertedRequestOptions} Additional options in request - */ - static composeUrl(request: Core.InternalRequest, config: Config, url: string = "", joinSymbol: string = "&"): string { - const queryArray: string[] = []; - - if (request) { - if (request.navigationProperty) { - ErrorHelper.stringParameterCheck(request.navigationProperty, `DynamicsWebApi.${request.functionName}`, "request.navigationProperty"); - url += "/" + request.navigationProperty; - - if (request.navigationPropertyKey) { - let navigationKey = ErrorHelper.keyParameterCheck( - request.navigationPropertyKey, - `DynamicsWebApi.${request.functionName}`, - "request.navigationPropertyKey" - ); - url += "(" + navigationKey + ")"; - } +/** + * Converts optional parameters of the request to URL. If expand parameter exists this function is called recursively. + * @param request Internal request object + * @param config Internal configuration object + * @param url Starting url + * @param joinSymbol Join symbol. "&" by default and ";" inside an expand query parameter + * @returns Request URL + */ +export const composeUrl = (request: InternalRequest, config: Config, url: string = "", joinSymbol: "&" | ";" = "&"): string => { + const queryArray: string[] = []; + + if (request) { + if (request.navigationProperty) { + ErrorHelper.stringParameterCheck(request.navigationProperty, `DynamicsWebApi.${request.functionName}`, "request.navigationProperty"); + url += "/" + request.navigationProperty; + + if (request.navigationPropertyKey) { + let navigationKey = ErrorHelper.keyParameterCheck( + request.navigationPropertyKey, + `DynamicsWebApi.${request.functionName}`, + "request.navigationPropertyKey" + ); + url += "(" + navigationKey + ")"; + } - if (request.navigationProperty === "Attributes") { - if (request.metadataAttributeType) { - ErrorHelper.stringParameterCheck( - request.metadataAttributeType, - `DynamicsWebApi.${request.functionName}`, - "request.metadataAttributeType" - ); - url += "/" + request.metadataAttributeType; - } + if (request.navigationProperty === "Attributes") { + if (request.metadataAttributeType) { + ErrorHelper.stringParameterCheck(request.metadataAttributeType, `DynamicsWebApi.${request.functionName}`, "request.metadataAttributeType"); + url += "/" + request.metadataAttributeType; } } + } - if (request.select?.length) { - ErrorHelper.arrayParameterCheck(request.select, `DynamicsWebApi.${request.functionName}`, "request.select"); + if (request.select?.length) { + ErrorHelper.arrayParameterCheck(request.select, `DynamicsWebApi.${request.functionName}`, "request.select"); - if (request.functionName == "retrieve" && request.select.length == 1 && request.select[0].endsWith("/$ref")) { - url += "/" + request.select[0]; - } else { - if (request.select[0].startsWith("/") && request.functionName == "retrieve") { - if (request.navigationProperty == null) { - url += request.select.shift(); - } else { - request.select.shift(); - } + if (request.functionName == "retrieve" && request.select.length == 1 && request.select[0].endsWith("/$ref")) { + url += "/" + request.select[0]; + } else { + if (request.select[0].startsWith("/") && request.functionName == "retrieve") { + if (request.navigationProperty == null) { + url += request.select.shift(); + } else { + request.select.shift(); } + } - //check if anything left in the array - if (request.select.length) { - queryArray.push("$select=" + request.select.join(",")); - } + //check if anything left in the array + if (request.select.length) { + queryArray.push("$select=" + request.select.join(",")); } } + } - if (request.filter) { - ErrorHelper.stringParameterCheck(request.filter, `DynamicsWebApi.${request.functionName}`, "request.filter"); - const removeBracketsFromGuidReg = /[^"']{([\w\d]{8}[-]?(?:[\w\d]{4}[-]?){3}[\w\d]{12})}(?:[^"']|$)/g; - let filterResult = request.filter; + if (request.filter) { + ErrorHelper.stringParameterCheck(request.filter, `DynamicsWebApi.${request.functionName}`, "request.filter"); + const removeBracketsFromGuidReg = /[^"']{([\w\d]{8}[-]?(?:[\w\d]{4}[-]?){3}[\w\d]{12})}(?:[^"']|$)/g; + let filterResult = request.filter; - //fix bug 2018-06-11 - let m: RegExpExecArray | null = null; - while ((m = removeBracketsFromGuidReg.exec(filterResult)) !== null) { - if (m.index === removeBracketsFromGuidReg.lastIndex) { - removeBracketsFromGuidReg.lastIndex++; - } - - let replacement = m[0].endsWith(")") ? ")" : " "; - filterResult = filterResult.replace(m[0], " " + m[1] + replacement); + //fix bug 2018-06-11 + let m: RegExpExecArray | null = null; + while ((m = removeBracketsFromGuidReg.exec(filterResult)) !== null) { + if (m.index === removeBracketsFromGuidReg.lastIndex) { + removeBracketsFromGuidReg.lastIndex++; } - queryArray.push("$filter=" + encodeURIComponent(filterResult)); + let replacement = m[0].endsWith(")") ? ")" : " "; + filterResult = filterResult.replace(m[0], " " + m[1] + replacement); } - if (request.fieldName) { - ErrorHelper.stringParameterCheck(request.fieldName, `DynamicsWebApi.${request.functionName}`, "request.fieldName"); - url += "/" + request.fieldName; - } + queryArray.push("$filter=" + encodeURIComponent(filterResult)); + } - if (request.savedQuery) { - queryArray.push( - "savedQuery=" + ErrorHelper.guidParameterCheck(request.savedQuery, `DynamicsWebApi.${request.functionName}`, "request.savedQuery") - ); - } + if (request.fieldName) { + ErrorHelper.stringParameterCheck(request.fieldName, `DynamicsWebApi.${request.functionName}`, "request.fieldName"); + url += "/" + request.fieldName; + } - if (request.userQuery) { - queryArray.push( - "userQuery=" + ErrorHelper.guidParameterCheck(request.userQuery, `DynamicsWebApi.${request.functionName}`, "request.userQuery") - ); - } + if (request.savedQuery) { + queryArray.push("savedQuery=" + ErrorHelper.guidParameterCheck(request.savedQuery, `DynamicsWebApi.${request.functionName}`, "request.savedQuery")); + } - if (request.apply) { - ErrorHelper.stringParameterCheck(request.apply, `DynamicsWebApi.${request.functionName}`, "request.apply"); - queryArray.push("$apply=" + request.apply); - } + if (request.userQuery) { + queryArray.push("userQuery=" + ErrorHelper.guidParameterCheck(request.userQuery, `DynamicsWebApi.${request.functionName}`, "request.userQuery")); + } - if (request.count) { - ErrorHelper.boolParameterCheck(request.count, `DynamicsWebApi.${request.functionName}`, "request.count"); - queryArray.push("$count=" + request.count); - } + if (request.apply) { + ErrorHelper.stringParameterCheck(request.apply, `DynamicsWebApi.${request.functionName}`, "request.apply"); + queryArray.push("$apply=" + request.apply); + } - if (request.top && request.top > 0) { - ErrorHelper.numberParameterCheck(request.top, `DynamicsWebApi.${request.functionName}`, "request.top"); - queryArray.push("$top=" + request.top); - } + if (request.count) { + ErrorHelper.boolParameterCheck(request.count, `DynamicsWebApi.${request.functionName}`, "request.count"); + queryArray.push("$count=" + request.count); + } - if (request.orderBy != null && request.orderBy.length) { - ErrorHelper.arrayParameterCheck(request.orderBy, `DynamicsWebApi.${request.functionName}`, "request.orderBy"); - queryArray.push("$orderby=" + request.orderBy.join(",")); - } + if (request.top && request.top > 0) { + ErrorHelper.numberParameterCheck(request.top, `DynamicsWebApi.${request.functionName}`, "request.top"); + queryArray.push("$top=" + request.top); + } - if (request.partitionId) { - ErrorHelper.stringParameterCheck(request.partitionId, `DynamicsWebApi.${request.functionName}`, "request.partitionId"); - queryArray.push("partitionid='" + request.partitionId + "'"); - } + if (request.orderBy != null && request.orderBy.length) { + ErrorHelper.arrayParameterCheck(request.orderBy, `DynamicsWebApi.${request.functionName}`, "request.orderBy"); + queryArray.push("$orderby=" + request.orderBy.join(",")); + } - if (request.downloadSize) { - ErrorHelper.stringParameterCheck(request.downloadSize, `DynamicsWebApi.${request.functionName}`, "request.downloadSize"); - queryArray.push("size=" + request.downloadSize); - } + if (request.partitionId) { + ErrorHelper.stringParameterCheck(request.partitionId, `DynamicsWebApi.${request.functionName}`, "request.partitionId"); + queryArray.push("partitionid='" + request.partitionId + "'"); + } - if (request.queryParams?.length) { - ErrorHelper.arrayParameterCheck(request.queryParams, `DynamicsWebApi.${request.functionName}`, "request.queryParams"); - queryArray.push(request.queryParams.join("&")); - } + if (request.downloadSize) { + ErrorHelper.stringParameterCheck(request.downloadSize, `DynamicsWebApi.${request.functionName}`, "request.downloadSize"); + queryArray.push("size=" + request.downloadSize); + } - if (request.fileName) { - ErrorHelper.stringParameterCheck(request.fileName, `DynamicsWebApi.${request.functionName}`, "request.fileName"); - queryArray.push("x-ms-file-name=" + request.fileName); - } + if (request.queryParams?.length) { + ErrorHelper.arrayParameterCheck(request.queryParams, `DynamicsWebApi.${request.functionName}`, "request.queryParams"); + queryArray.push(request.queryParams.join("&")); + } - if (request.data) { - ErrorHelper.parameterCheck(request.data, `DynamicsWebApi.${request.functionName}`, "request.data"); - } + if (request.fileName) { + ErrorHelper.stringParameterCheck(request.fileName, `DynamicsWebApi.${request.functionName}`, "request.fileName"); + queryArray.push("x-ms-file-name=" + request.fileName); + } - if (request.isBatch) { - ErrorHelper.boolParameterCheck(request.isBatch, `DynamicsWebApi.${request.functionName}`, "request.isBatch"); - } + if (request.data) { + ErrorHelper.parameterCheck(request.data, `DynamicsWebApi.${request.functionName}`, "request.data"); + } - if (!Utility.isNull(request.inChangeSet)) { - ErrorHelper.boolParameterCheck(request.inChangeSet, `DynamicsWebApi.${request.functionName}`, "request.inChangeSet"); - } + if (request.isBatch) { + ErrorHelper.boolParameterCheck(request.isBatch, `DynamicsWebApi.${request.functionName}`, "request.isBatch"); + } - if (request.isBatch && Utility.isNull(request.inChangeSet)) request.inChangeSet = true; + if (!Utility.isNull(request.inChangeSet)) { + ErrorHelper.boolParameterCheck(request.inChangeSet, `DynamicsWebApi.${request.functionName}`, "request.inChangeSet"); + } - if (request.timeout) { - ErrorHelper.numberParameterCheck(request.timeout, `DynamicsWebApi.${request.functionName}`, "request.timeout"); - } + if (request.isBatch && Utility.isNull(request.inChangeSet)) request.inChangeSet = true; - if (request.expand?.length) { - ErrorHelper.stringOrArrayParameterCheck(request.expand, `DynamicsWebApi.${request.functionName}`, "request.expand"); - if (typeof request.expand === "string") { - queryArray.push("$expand=" + request.expand); - } else { - const expandQueryArray: string[] = []; - for (let i = 0; i < request.expand.length; i++) { - if (request.expand[i].property) { - const expand = request.expand[i]; - expand.functionName = `${request.functionName} $expand`; - let expandConverted = RequestUtility.composeUrl(expand, config, "", ";"); - if (expandConverted) { - expandConverted = `(${expandConverted.substr(1)})`; - } - expandQueryArray.push(request.expand[i].property + expandConverted); + if (request.timeout) { + ErrorHelper.numberParameterCheck(request.timeout, `DynamicsWebApi.${request.functionName}`, "request.timeout"); + } + + if (request.expand?.length) { + ErrorHelper.stringOrArrayParameterCheck(request.expand, `DynamicsWebApi.${request.functionName}`, "request.expand"); + if (typeof request.expand === "string") { + queryArray.push("$expand=" + request.expand); + } else { + const expandQueryArray: string[] = []; + for (let i = 0; i < request.expand.length; i++) { + if (request.expand[i].property) { + const expand = request.expand[i]; + expand.functionName = `${request.functionName} $expand`; + let expandConverted = composeUrl(expand, config, "", ";"); + if (expandConverted) { + expandConverted = `(${expandConverted.substr(1)})`; } - } - if (expandQueryArray.length) { - queryArray.push("$expand=" + expandQueryArray.join(",")); + expandQueryArray.push(request.expand[i].property + expandConverted); } } + if (expandQueryArray.length) { + queryArray.push("$expand=" + expandQueryArray.join(",")); + } } } - - return !queryArray.length ? url : url + "?" + queryArray.join(joinSymbol); } - static composeHeaders(request: Core.InternalRequest, config: Config): HeaderCollection { - const headers: HeaderCollection = { ...config.headers, ...request.userHeaders }; + return !queryArray.length ? url : url + "?" + queryArray.join(joinSymbol); +}; - const prefer = RequestUtility.composePreferHeader(request, config); - if (prefer.length) { - headers["Prefer"] = prefer; - } - - if (request.collection === "$metadata") { - headers["Accept"] = "application/xml"; - } +export const composeHeaders = (request: InternalRequest, config: Config): HeaderCollection => { + const headers: HeaderCollection = { ...config.headers, ...request.userHeaders }; - if (request.transferMode) { - headers["x-ms-transfer-mode"] = request.transferMode; - } + const prefer = composePreferHeader(request, config); + if (prefer.length) { + headers["Prefer"] = prefer; + } - if (request.ifmatch != null && request.ifnonematch != null) { - throw new Error( - `DynamicsWebApi.${request.functionName}. Either one of request.ifmatch or request.ifnonematch parameters should be used in a call, not both.` - ); - } + if (request.collection === "$metadata") { + headers["Accept"] = "application/xml"; + } - if (request.ifmatch) { - ErrorHelper.stringParameterCheck(request.ifmatch, `DynamicsWebApi.${request.functionName}`, "request.ifmatch"); - headers["If-Match"] = request.ifmatch; - } + if (request.transferMode) { + headers["x-ms-transfer-mode"] = request.transferMode; + } - if (request.ifnonematch) { - ErrorHelper.stringParameterCheck(request.ifnonematch, `DynamicsWebApi.${request.functionName}`, "request.ifnonematch"); - headers["If-None-Match"] = request.ifnonematch; - } + if (request.ifmatch != null && request.ifnonematch != null) { + throw new Error( + `DynamicsWebApi.${request.functionName}. Either one of request.ifmatch or request.ifnonematch parameters should be used in a call, not both.` + ); + } - if (request.impersonate) { - ErrorHelper.stringParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, "request.impersonate"); - headers["MSCRMCallerID"] = ErrorHelper.guidParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, "request.impersonate"); - } + if (request.ifmatch) { + ErrorHelper.stringParameterCheck(request.ifmatch, `DynamicsWebApi.${request.functionName}`, "request.ifmatch"); + headers["If-Match"] = request.ifmatch; + } - if (request.impersonateAAD) { - ErrorHelper.stringParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, "request.impersonateAAD"); - headers["CallerObjectId"] = ErrorHelper.guidParameterCheck( - request.impersonateAAD, - `DynamicsWebApi.${request.functionName}`, - "request.impersonateAAD" - ); - } + if (request.ifnonematch) { + ErrorHelper.stringParameterCheck(request.ifnonematch, `DynamicsWebApi.${request.functionName}`, "request.ifnonematch"); + headers["If-None-Match"] = request.ifnonematch; + } - if (request.token) { - ErrorHelper.stringParameterCheck(request.token, `DynamicsWebApi.${request.functionName}`, "request.token"); - headers["Authorization"] = "Bearer " + request.token; - } + if (request.impersonate) { + ErrorHelper.stringParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, "request.impersonate"); + headers["MSCRMCallerID"] = ErrorHelper.guidParameterCheck(request.impersonate, `DynamicsWebApi.${request.functionName}`, "request.impersonate"); + } - if (request.duplicateDetection) { - ErrorHelper.boolParameterCheck(request.duplicateDetection, `DynamicsWebApi.${request.functionName}`, "request.duplicateDetection"); - headers["MSCRM.SuppressDuplicateDetection"] = "false"; - } + if (request.impersonateAAD) { + ErrorHelper.stringParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, "request.impersonateAAD"); + headers["CallerObjectId"] = ErrorHelper.guidParameterCheck(request.impersonateAAD, `DynamicsWebApi.${request.functionName}`, "request.impersonateAAD"); + } - if (request.bypassCustomPluginExecution) { - ErrorHelper.boolParameterCheck( - request.bypassCustomPluginExecution, - `DynamicsWebApi.${request.functionName}`, - "request.bypassCustomPluginExecution" - ); - headers["MSCRM.BypassCustomPluginExecution"] = "true"; - } + if (request.token) { + ErrorHelper.stringParameterCheck(request.token, `DynamicsWebApi.${request.functionName}`, "request.token"); + headers["Authorization"] = "Bearer " + request.token; + } - if (request.noCache) { - ErrorHelper.boolParameterCheck(request.noCache, `DynamicsWebApi.${request.functionName}`, "request.noCache"); - headers["Cache-Control"] = "no-cache"; - } + if (request.duplicateDetection) { + ErrorHelper.boolParameterCheck(request.duplicateDetection, `DynamicsWebApi.${request.functionName}`, "request.duplicateDetection"); + headers["MSCRM.SuppressDuplicateDetection"] = "false"; + } - if (request.mergeLabels) { - ErrorHelper.boolParameterCheck(request.mergeLabels, `DynamicsWebApi.${request.functionName}`, "request.mergeLabels"); - headers["MSCRM.MergeLabels"] = "true"; - } + if (request.bypassCustomPluginExecution) { + ErrorHelper.boolParameterCheck(request.bypassCustomPluginExecution, `DynamicsWebApi.${request.functionName}`, "request.bypassCustomPluginExecution"); + headers["MSCRM.BypassCustomPluginExecution"] = "true"; + } - if (request.contentId) { - ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, "request.contentId"); - if (!request.contentId.startsWith("$")) { - headers["Content-ID"] = request.contentId; - } - } + if (request.noCache) { + ErrorHelper.boolParameterCheck(request.noCache, `DynamicsWebApi.${request.functionName}`, "request.noCache"); + headers["Cache-Control"] = "no-cache"; + } - if (request.contentRange) { - ErrorHelper.stringParameterCheck(request.contentRange, `DynamicsWebApi.${request.functionName}`, "request.contentRange"); - headers["Content-Range"] = request.contentRange; - } + if (request.mergeLabels) { + ErrorHelper.boolParameterCheck(request.mergeLabels, `DynamicsWebApi.${request.functionName}`, "request.mergeLabels"); + headers["MSCRM.MergeLabels"] = "true"; + } - if (request.range) { - ErrorHelper.stringParameterCheck(request.range, `DynamicsWebApi.${request.functionName}`, "request.range"); - headers["Range"] = request.range; + if (request.contentId) { + ErrorHelper.stringParameterCheck(request.contentId, `DynamicsWebApi.${request.functionName}`, "request.contentId"); + if (!request.contentId.startsWith("$")) { + headers["Content-ID"] = request.contentId; } + } - return headers; + if (request.contentRange) { + ErrorHelper.stringParameterCheck(request.contentRange, `DynamicsWebApi.${request.functionName}`, "request.contentRange"); + headers["Content-Range"] = request.contentRange; } - static composePreferHeader(request: Core.InternalRequest, config: Config): string { - let returnRepresentation: boolean | null | undefined = request.returnRepresentation; - let includeAnnotations: string | null | undefined = request.includeAnnotations; - let maxPageSize: number | null | undefined = request.maxPageSize; - let trackChanges: boolean | null | undefined = request.trackChanges; - let continueOnError: boolean | null | undefined = request.continueOnError; + if (request.range) { + ErrorHelper.stringParameterCheck(request.range, `DynamicsWebApi.${request.functionName}`, "request.range"); + headers["Range"] = request.range; + } - let prefer: string[] = []; + return headers; +}; - if (request.prefer && request.prefer.length) { - ErrorHelper.stringOrArrayParameterCheck(request.prefer, `DynamicsWebApi.${request.functionName}`, "request.prefer"); - if (typeof request.prefer === "string") { - prefer = request.prefer.split(","); - } - for (let i in prefer) { - let item = prefer[i].trim(); - if (item === "return=representation") { - returnRepresentation = true; - } else if (item.includes("odata.include-annotations=")) { - includeAnnotations = item.replace("odata.include-annotations=", "").replace(/"/g, ""); - } else if (item.startsWith("odata.maxpagesize=")) { - maxPageSize = Number(item.replace("odata.maxpagesize=", "").replace(/"/g, "")) || 0; - } else if (item.includes("odata.track-changes")) { - trackChanges = true; - } else if (item.includes("odata.continue-on-error")) { - continueOnError = true; - } - } - } +export const composePreferHeader = (request: InternalRequest, config: Config): string => { + let returnRepresentation: boolean | null | undefined = request.returnRepresentation; + let includeAnnotations: string | null | undefined = request.includeAnnotations; + let maxPageSize: number | null | undefined = request.maxPageSize; + let trackChanges: boolean | null | undefined = request.trackChanges; + let continueOnError: boolean | null | undefined = request.continueOnError; - //clear array - prefer = []; + let prefer: string[] = []; - if (config) { - if (returnRepresentation == null) { - returnRepresentation = config.returnRepresentation; + if (request.prefer && request.prefer.length) { + ErrorHelper.stringOrArrayParameterCheck(request.prefer, `DynamicsWebApi.${request.functionName}`, "request.prefer"); + if (typeof request.prefer === "string") { + prefer = request.prefer.split(","); + } + for (let i in prefer) { + let item = prefer[i].trim(); + if (item === "return=representation") { + returnRepresentation = true; + } else if (item.includes("odata.include-annotations=")) { + includeAnnotations = item.replace("odata.include-annotations=", "").replace(/"/g, ""); + } else if (item.startsWith("odata.maxpagesize=")) { + maxPageSize = Number(item.replace("odata.maxpagesize=", "").replace(/"/g, "")) || 0; + } else if (item.includes("odata.track-changes")) { + trackChanges = true; + } else if (item.includes("odata.continue-on-error")) { + continueOnError = true; } - includeAnnotations = includeAnnotations ? includeAnnotations : config.includeAnnotations; - maxPageSize = maxPageSize ? maxPageSize : config.maxPageSize; } + } - if (returnRepresentation) { - ErrorHelper.boolParameterCheck(returnRepresentation, `DynamicsWebApi.${request.functionName}`, "request.returnRepresentation"); - prefer.push("return=representation"); - } + //clear array + prefer = []; - if (includeAnnotations) { - ErrorHelper.stringParameterCheck(includeAnnotations, `DynamicsWebApi.${request.functionName}`, "request.includeAnnotations"); - prefer.push(`odata.include-annotations="${includeAnnotations}"`); + if (config) { + if (returnRepresentation == null) { + returnRepresentation = config.returnRepresentation; } + includeAnnotations = includeAnnotations ? includeAnnotations : config.includeAnnotations; + maxPageSize = maxPageSize ? maxPageSize : config.maxPageSize; + } - if (maxPageSize && maxPageSize > 0) { - ErrorHelper.numberParameterCheck(maxPageSize, `DynamicsWebApi.${request.functionName}`, "request.maxPageSize"); - prefer.push("odata.maxpagesize=" + maxPageSize); - } + if (returnRepresentation) { + ErrorHelper.boolParameterCheck(returnRepresentation, `DynamicsWebApi.${request.functionName}`, "request.returnRepresentation"); + prefer.push("return=representation"); + } - if (trackChanges) { - ErrorHelper.boolParameterCheck(trackChanges, `DynamicsWebApi.${request.functionName}`, "request.trackChanges"); - prefer.push("odata.track-changes"); - } + if (includeAnnotations) { + ErrorHelper.stringParameterCheck(includeAnnotations, `DynamicsWebApi.${request.functionName}`, "request.includeAnnotations"); + prefer.push(`odata.include-annotations="${includeAnnotations}"`); + } - if (continueOnError) { - ErrorHelper.boolParameterCheck(continueOnError, `DynamicsWebApi.${request.functionName}`, "request.continueOnError"); - prefer.push("odata.continue-on-error"); - } + if (maxPageSize && maxPageSize > 0) { + ErrorHelper.numberParameterCheck(maxPageSize, `DynamicsWebApi.${request.functionName}`, "request.maxPageSize"); + prefer.push("odata.maxpagesize=" + maxPageSize); + } + + if (trackChanges) { + ErrorHelper.boolParameterCheck(trackChanges, `DynamicsWebApi.${request.functionName}`, "request.trackChanges"); + prefer.push("odata.track-changes"); + } - return prefer.join(","); + if (continueOnError) { + ErrorHelper.boolParameterCheck(continueOnError, `DynamicsWebApi.${request.functionName}`, "request.continueOnError"); + prefer.push("odata.continue-on-error"); } - static convertToBatch(requests: Core.InternalRequest[], config: InternalConfig, batchRequest?: Core.InternalRequest): Core.InternalBatchRequest { - const batchBoundary = `dwa_batch_${Utility.generateUUID()}`; + return prefer.join(","); +}; - const batchBody: string[] = []; - let currentChangeSet: string | null = null; - let contentId = 100000; +export const convertToBatch = (requests: InternalRequest[], config: InternalConfig, batchRequest?: InternalRequest): InternalBatchRequest => { + const batchBoundary = `dwa_batch_${Utility.generateUUID()}`; - requests.forEach((internalRequest) => { - internalRequest.functionName = "executeBatch"; - if (batchRequest?.inChangeSet === false) internalRequest.inChangeSet = false; - const inChangeSet = internalRequest.method === "GET" ? false : !!internalRequest.inChangeSet; + const batchBody: string[] = []; + let currentChangeSet: string | null = null; + let contentId = 100000; - if (!inChangeSet && currentChangeSet) { - //end current change set - batchBody.push(`\n--${currentChangeSet}--`); + requests.forEach((internalRequest) => { + internalRequest.functionName = "executeBatch"; + if (batchRequest?.inChangeSet === false) internalRequest.inChangeSet = false; + const inChangeSet = internalRequest.method === "GET" ? false : !!internalRequest.inChangeSet; - currentChangeSet = null; - contentId = 100000; - } + if (!inChangeSet && currentChangeSet) { + //end current change set + batchBody.push(`\n--${currentChangeSet}--`); - if (!currentChangeSet) { - batchBody.push(`\n--${batchBoundary}`); + currentChangeSet = null; + contentId = 100000; + } - if (inChangeSet) { - currentChangeSet = `changeset_${Utility.generateUUID()}`; - batchBody.push("Content-Type: multipart/mixed;boundary=" + currentChangeSet); - } - } + if (!currentChangeSet) { + batchBody.push(`\n--${batchBoundary}`); if (inChangeSet) { - batchBody.push(`\n--${currentChangeSet}`); + currentChangeSet = `changeset_${Utility.generateUUID()}`; + batchBody.push("Content-Type: multipart/mixed;boundary=" + currentChangeSet); } + } - batchBody.push("Content-Type: application/http"); - batchBody.push("Content-Transfer-Encoding: binary"); + if (inChangeSet) { + batchBody.push(`\n--${currentChangeSet}`); + } - if (inChangeSet) { - const contentIdValue = internalRequest.headers!.hasOwnProperty("Content-ID") ? internalRequest.headers!["Content-ID"] : ++contentId; + batchBody.push("Content-Type: application/http"); + batchBody.push("Content-Transfer-Encoding: binary"); - batchBody.push(`Content-ID: ${contentIdValue}`); - } + if (inChangeSet) { + const contentIdValue = internalRequest.headers!.hasOwnProperty("Content-ID") ? internalRequest.headers!["Content-ID"] : ++contentId; - if (!internalRequest.path?.startsWith("$")) { - batchBody.push(`\n${internalRequest.method} ${config.dataApi.url}${internalRequest.path} HTTP/1.1`); - } else { - batchBody.push(`\n${internalRequest.method} ${internalRequest.path} HTTP/1.1`); - } + batchBody.push(`Content-ID: ${contentIdValue}`); + } - if (internalRequest.method === "GET") { - batchBody.push("Accept: application/json"); - } else { - batchBody.push("Content-Type: application/json"); - } + if (!internalRequest.path?.startsWith("$")) { + batchBody.push(`\n${internalRequest.method} ${config.dataApi.url}${internalRequest.path} HTTP/1.1`); + } else { + batchBody.push(`\n${internalRequest.method} ${internalRequest.path} HTTP/1.1`); + } - for (let key in internalRequest.headers) { - if (key === "Authorization" || key === "Content-ID") continue; + if (internalRequest.method === "GET") { + batchBody.push("Accept: application/json"); + } else { + batchBody.push("Content-Type: application/json"); + } - batchBody.push(`${key}: ${internalRequest.headers[key]}`); - } + for (let key in internalRequest.headers) { + if (key === "Authorization" || key === "Content-ID") continue; - if (internalRequest.data) { - batchBody.push(`\n${RequestUtility.processData(internalRequest.data, config)}`); - } - }); + batchBody.push(`${key}: ${internalRequest.headers[key]}`); + } - if (currentChangeSet) { - batchBody.push(`\n--${currentChangeSet}--`); + if (internalRequest.data) { + batchBody.push(`\n${processData(internalRequest.data, config)}`); } + }); - batchBody.push(`\n--${batchBoundary}--`); + if (currentChangeSet) { + batchBody.push(`\n--${currentChangeSet}--`); + } - const headers = RequestUtility.setStandardHeaders(batchRequest?.userHeaders); - headers["Content-Type"] = `multipart/mixed;boundary=${batchBoundary}`; + batchBody.push(`\n--${batchBoundary}--`); - return { headers: headers, body: batchBody.join("\n") }; - } + const headers = setStandardHeaders(batchRequest?.userHeaders); + headers["Content-Type"] = `multipart/mixed;boundary=${batchBoundary}`; - static entityNames: any = null; + return { headers: headers, body: batchBody.join("\n") }; +}; - static findCollectionName(entityName: string): string | null { - let collectionName = null; +export const findCollectionName = (entityName: string): string | null => { + let collectionName: string | null = null; - if (!Utility.isNull(RequestUtility.entityNames)) { - collectionName = RequestUtility.entityNames[entityName]; - if (Utility.isNull(collectionName)) { - for (let key in RequestUtility.entityNames) { - if (RequestUtility.entityNames[key] === entityName) { - return entityName; - } + if (!Utility.isNull(entityNames)) { + collectionName = entityNames![entityName]; + if (!collectionName) { + for (let key in entityNames!) { + if (entityNames[key] === entityName) { + return entityName; } } } - - return collectionName; } - static processData(data: any, config: InternalConfig): string | Uint8Array | Uint16Array | Uint32Array | null { - let stringifiedData: string | null = null; - if (data) { - if (data instanceof Uint8Array || data instanceof Uint16Array || data instanceof Uint32Array) return data; - - stringifiedData = JSON.stringify(data, (key, value) => { - if (key.endsWith("@odata.bind") || key.endsWith("@odata.id")) { - if (typeof value === "string" && !value.startsWith("$")) { - //remove brackets in guid - if (/\(\{[\w\d-]+\}\)/g.test(value)) { - value = value.replace(/(.+)\(\{([\w\d-]+)\}\)/g, "$1($2)"); - } + return collectionName; +}; + +export const processData = (data: any, config: InternalConfig): string | Uint8Array | Uint16Array | Uint32Array | null => { + let stringifiedData: string | null = null; + if (data) { + if (data instanceof Uint8Array || data instanceof Uint16Array || data instanceof Uint32Array) return data; + + stringifiedData = JSON.stringify(data, (key, value) => { + if (key.endsWith("@odata.bind") || key.endsWith("@odata.id")) { + if (typeof value === "string" && !value.startsWith("$")) { + //remove brackets in guid + if (/\(\{[\w\d-]+\}\)/g.test(value)) { + value = value.replace(/(.+)\(\{([\w\d-]+)\}\)/g, "$1($2)"); + } - if (config.useEntityNames) { - //replace entity name with collection name - const regularExpression = /([\w_]+)(\([\d\w-]+\))$/; - const valueParts = regularExpression.exec(value); - if (valueParts && valueParts.length > 2) { - const collectionName = RequestUtility.findCollectionName(valueParts[1]); + if (config.useEntityNames) { + //replace entity name with collection name + const regularExpression = /([\w_]+)(\([\d\w-]+\))$/; + const valueParts = regularExpression.exec(value); + if (valueParts && valueParts.length > 2) { + const collectionName = findCollectionName(valueParts[1]); - if (!Utility.isNull(collectionName)) { - value = value.replace(regularExpression, collectionName + "$2"); - } + if (!Utility.isNull(collectionName)) { + value = value.replace(regularExpression, collectionName + "$2"); } } + } - if (!value.startsWith(config.dataApi.url)) { - //add full web api url if it's not set - if (key.endsWith("@odata.bind")) { - if (!value.startsWith("/")) { - value = "/" + value; - } - } else { - value = config.dataApi.url + value.replace(/^\//, ""); + if (!value.startsWith(config.dataApi.url)) { + //add full web api url if it's not set + if (key.endsWith("@odata.bind")) { + if (!value.startsWith("/")) { + value = "/" + value; } + } else { + value = config.dataApi.url + value.replace(/^\//, ""); } } - } else if (key.startsWith("oData") || key.endsWith("_Formatted") || key.endsWith("_NavigationProperty") || key.endsWith("_LogicalName")) { - value = undefined; } + } else if (key.startsWith("oData") || key.endsWith("_Formatted") || key.endsWith("_NavigationProperty") || key.endsWith("_LogicalName")) { + value = undefined; + } - return value; - }); - - stringifiedData = stringifiedData.replace(/[\u007F-\uFFFF]/g, function (chr: string) { - return "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).slice(-4); - }); - } + return value; + }); - return stringifiedData; + stringifiedData = stringifiedData.replace(/[\u007F-\uFFFF]/g, function (chr: string) { + return "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).slice(-4); + }); } - static setStandardHeaders(headers: HeaderCollection = {}): any { - if (!headers["Accept"]) headers["Accept"] = "application/json"; - if (!headers["OData-MaxVersion"]) headers["OData-MaxVersion"] = "4.0"; - if (!headers["OData-Version"]) headers["OData-Version"] = "4.0"; - if (headers["Content-Range"]) headers["Content-Type"] = "application/octet-stream"; - else if (!headers["Content-Type"]) headers["Content-Type"] = "application/json; charset=utf-8"; + return stringifiedData; +}; - return headers; - } -} +export const setStandardHeaders = (headers: HeaderCollection = {}): HeaderCollection => { + if (!headers["Accept"]) headers["Accept"] = "application/json"; + if (!headers["OData-MaxVersion"]) headers["OData-MaxVersion"] = "4.0"; + if (!headers["OData-Version"]) headers["OData-Version"] = "4.0"; + if (headers["Content-Range"]) headers["Content-Type"] = "application/octet-stream"; + else if (!headers["Content-Type"]) headers["Content-Type"] = "application/json; charset=utf-8"; + + return headers; +}; diff --git a/src/utils/Utility.ts b/src/utils/Utility.ts index df1dfbf..49088f5 100644 --- a/src/utils/Utility.ts +++ b/src/utils/Utility.ts @@ -1,4 +1,4 @@ -import { Core } from "../types"; +import type * as Core from "../types"; import { generateRandomBytes } from "../helpers/Crypto"; import { isUuid, extractUuid } from "../helpers/Regex"; diff --git a/tests/common.spec.js b/tests/common.spec.js index 74831a6..4f8761f 100644 --- a/tests/common.spec.js +++ b/tests/common.spec.js @@ -6,7 +6,7 @@ var sinon = require("sinon"); var { DWA } = require("../lib/dwa"); var { Utility } = require("../lib/utils/Utility"); -var { RequestUtility } = require("../lib/utils/Request"); +var RequestUtility = require("../lib/utils/Request"); var { ErrorHelper } = require("../lib/helpers/ErrorHelper"); var mocks = require("./stubs"); var { dateReviver } = require("../lib/client/helpers/dateReviver"); diff --git a/tests/common.spec.ts b/tests/common.spec.ts index e0fd724..a042fe8 100644 --- a/tests/common.spec.ts +++ b/tests/common.spec.ts @@ -4,9 +4,9 @@ import stubs, * as mocks from "./stubs"; import { RequestClient } from "../src/client/RequestClient"; import { InternalConfig } from "../src/utils/Config"; -import { Core } from "../src/types"; +import * as Core from "../src/types"; import * as Regex from "../src/helpers/Regex"; -import { RequestUtility } from "../src/utils/Request"; +import * as RequestUtility from "../src/utils/Request"; describe("Regex.", () => { describe("isUuid -", () => { @@ -112,6 +112,80 @@ describe("RequestClient.makeRequest", () => { expect(scope.isDone()).to.be.false; }); }); + describe("when url is long, request is converted to batch - includes token", function () { + let scope: nock.Scope; + let url = "test"; + const testToken = "testToken"; + + while (url.length < 2001) { + url += "test"; + } + const rBody = mocks.data.batch.replace("{0}", mocks.webApiUrl + url); + const rBodys = rBody.split("\n"); + let checkBody = ""; + for (let i = 0; i < rBodys.length; i++) { + checkBody += rBodys[i]; + } + + before(function () { + const response = mocks.responses.batch; + scope = nock(mocks.webApiUrl, { + reqheaders: { + Authorization: `Bearer ${testToken}`, + } + }) + .filteringRequestBody(function (body) { + body = body.replace(/dwa_batch_[\d\w]{8}-[\d\w]{4}-[\d\w]{4}-[\d\w]{4}-[\d\w]{12}/g, "dwa_batch_XXX"); + const bodys = body.split("\n"); + + let resultBody = ""; + for (let i = 0; i < bodys.length; i++) { + resultBody += bodys[i]; + } + return resultBody; + }) + .post("/$batch", checkBody) + .reply(response.status, response.responseText, response.responseHeaders); + }); + + after(function () { + nock.cleanAll(); + RequestClient._clearTestData(); + }); + + it("returns a correct response", async () => { + const request: Core.InternalRequest = { + method: "GET", + functionName: "test", + collection: url, + token: testToken + }; + const config: InternalConfig = { + searchApi: { url: "" }, + dataApi: { url: mocks.webApiUrl }, + }; + + try { + const object = await RequestClient.makeRequest(request, config); + + const multiple = mocks.responses.multiple(); + //delete multiple.oDataContext; + const expectedO = { + status: 200, + headers: mocks.data.defaultTextPlainResponseHeaders, + data: multiple, + }; + expect(object).to.deep.equal(expectedO); + } catch (error) { + console.error(error); + throw error; + } + }); + + it("all requests have been made", function () { + expect(scope.isDone()).to.be.true; + }); + }); }); describe("RequestUtility.", () => { diff --git a/tests/main.spec.ts b/tests/main.spec.ts index 4d5ff56..01e9736 100644 --- a/tests/main.spec.ts +++ b/tests/main.spec.ts @@ -3,6 +3,7 @@ import nock from "nock"; import * as mocks from "./stubs"; import { DynamicsWebApi, type RetrieveMultipleRequest } from "../src/dynamics-web-api"; +import { DWA } from "../lib/dwa"; const dynamicsWebApiTest = new DynamicsWebApi({ dataApi: { @@ -167,6 +168,93 @@ describe("dynamicsWebApi.retrieveMultiple -", () => { }); }); +describe("dynamicsWebApi.fetch -", () => { + describe("with token", function () { + let scope: nock.Scope; + const testToken = "test token"; + before(function () { + const response = mocks.responses.fetchXmlResponsePage2Cookie; + scope = nock(mocks.webApiUrl, { + reqheaders: { + Authorization: `Bearer ${testToken}`, + Prefer: DWA.Prefer.get(DWA.Prefer.Annotations.FormattedValue), + }, + }) + .get(mocks.responses.collectionUrl + "?fetchXml=" + encodeURIComponent(mocks.data.fetchXmls.fetchXml2cookie)) + .reply(response.status, response.responseText, response.responseHeaders); + }); + + after(function () { + nock.cleanAll(); + }); + + it("returns a correct response", async () => { + const pagingInfo = mocks.data.fetchXmls.fetchXmlResultPage1Cookie.PagingInfo; + + try { + const object = await dynamicsWebApiTest.fetch({ + collection: "tests", + fetchXml: mocks.data.fetchXmls.fetchXml, + includeAnnotations: DWA.Prefer.Annotations.FormattedValue, + pageNumber: pagingInfo.nextPage, + pagingCookie: pagingInfo.cookie, + token: testToken, + }); + + expect(object).to.deep.equal(mocks.data.fetchXmls.fetchXmlResultPage2Cookie); + } catch (error) { + console.error(error); + throw error; + } + }); + + it("all requests have been made", function () { + expect(scope.isDone()).to.be.true; + }); + }); +}); + +describe("dynamicsWebApi.fetchAll -", () => { + describe("with token", function () { + let scope: nock.Scope; + const testToken = "test token"; + before(function () { + var response = mocks.responses.fetchXmlResponsePage1Cookie; + var response2 = mocks.responses.fetchXmlResponsePage2NoCookie; + scope = nock(mocks.webApiUrl, { + reqheaders: { + Authorization: `Bearer ${testToken}`, + }, + }) + .get(mocks.responses.collectionUrl + "?fetchXml=" + encodeURIComponent(mocks.data.fetchXmls.fetchXml1)) + .reply(response.status, response.responseText, response.responseHeaders) + .get(mocks.responses.collectionUrl + "?fetchXml=" + encodeURIComponent(mocks.data.fetchXmls.fetchXml2cookie)) + .reply(response2.status, response2.responseText, response2.responseHeaders); + }); + + after(function () { + nock.cleanAll(); + }); + + it("returns a correct response", async () => { + try { + const object = await dynamicsWebApiTest.fetchAll({ collection: "tests", fetchXml: mocks.data.fetchXmls.fetchXml, token: testToken }); + + let checkResponse = mocks.data.fetchXmls.fetchXmlResultPage1Cookie.value; + checkResponse = checkResponse.concat(mocks.data.fetchXmls.fetchXmlResultPage2Cookie.value); + expect(object).to.deep.equal({ value: checkResponse }); + } catch (error) { + console.error(error); + throw error; + } + }); + + it("all requests have been made", function () { + expect(scope.isDone()).to.be.true; + }); + }); +}); + describe("dynamicsWebApi.executeBatch -", () => { describe("non-atomic global - create / create (Content-ID in a header gets cleared)", function () { let scope; @@ -621,7 +709,7 @@ describe("dynamicsWebApi.callFunction -", () => { name: "FUN", parameters: { param1: "value1", param2: 2 }, select: ["field1", "field2"], - filter: "field1 eq 1" + filter: "field1 eq 1", }); expect(object).to.deep.equal(mocks.data.testEntity); @@ -655,7 +743,7 @@ describe("dynamicsWebApi.callFunction -", () => { functionName: "FUN", parameters: { param1: "value1", param2: 2 }, select: ["field1", "field2"], - filter: "field1 eq 1" + filter: "field1 eq 1", }); expect(object).to.deep.equal(mocks.data.testEntity); @@ -690,7 +778,7 @@ describe("dynamicsWebApi.callFunction -", () => { collection: "tests", parameters: { param1: "value1", param2: 2 }, select: ["field1", "field2"], - filter: "field1 eq 1" + filter: "field1 eq 1", }); expect(object).to.deep.equal(mocks.data.testEntity);