UNPKG

@kwiz/common

Version:

KWIZ common utilities and helpers for M365 platform

1,045 lines 61.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.WebHasUniquePermissions = exports.ensureLegacyProps = exports.getFormDigest = exports.GetWebPropertyByName = exports.GetAllWebProperties = exports.GetRegionalSettings = exports.DeleteUserCustomAction = exports.UpdateUserCustomAction = exports.AddUserCustomAction = exports.GetUserCustomActionByName = exports.GetUserCustomActionById = exports.GetUserCustomActions = exports.GetContextWebInformationSync = exports.SPServerLocalToday = exports.SPServerLocalTime = exports.SPServerLocalTimeSync = exports.UTCToSPServerLocalTimeSync = exports.UTCToSPServerLocalTime = exports.SPServerLocalTimeToUTCSync = exports.SPServerLocalTimeToUTC = exports.SPServerLocalTimeToUTCDateSync = exports.SPServerLocalTimeToUTCDate = exports.GetServerTimeZoneSync = exports.GetServerTimeZone = exports.GetAppTilesSync = exports.GetAppTiles = exports.GetSubWebs = exports.GetRoleAssignments = exports.GetWebRoleDefinitions = exports.GetWebInfoSync = exports.GetWebInfo = exports.__getSubSites = exports.GetAllSubWebs = exports.GetListsSync = exports.GetLists = exports.GetContentTypesSync = exports.GetContentTypes = exports.UserHasManageSitePermissions = exports.UserHasAllPermissions = exports.IsRootWeb = exports.GetWebIdSync = exports.GetWebId = exports.GetWebTitle = exports.GetRootWebInfo = exports.GetSiteIdSync = exports.GetSiteId = exports.GetPortalUrl = exports.GetTenantId = exports.GetSiteInfoSync = exports.GetSiteInfo = void 0; exports.GetWebAssociatedGroups = exports.SetWelcomePage = exports.GetWelcomePage = exports.DectivateFeature = exports.ActivateFeature = exports.GetActiveFeatures = exports.GetAvailableTagsForSiteSync = exports.GetAvailableTagsForSite = exports.SetUserAsSiteAdmin = exports.RemoveWebPermission = exports.AssignWebPermission = exports.BreakWebPermissionInheritance = exports.RestoreWebPermissionInheritance = void 0; const exports_index_1 = require("../../exports-index"); const collections_base_1 = require("../../helpers/collections.base"); const json_1 = require("../../helpers/json"); const objects_1 = require("../../helpers/objects"); const sharepoint_1 = require("../../helpers/sharepoint"); const strings_1 = require("../../helpers/strings"); const typecheckers_1 = require("../../helpers/typecheckers"); const url_1 = require("../../helpers/url"); const rest_types_1 = require("../../types/rest.types"); const sharepoint_types_1 = require("../../types/sharepoint.types"); const sharepoint_utils_types_1 = require("../../types/sharepoint.utils.types"); const discovery_1 = require("../auth/discovery"); const consolelogger_1 = require("../consolelogger"); const date_1 = require("../date"); const rest_1 = require("../rest"); const common_1 = require("./common"); const list_1 = require("./list"); const timzone_map_1 = require("./timzone-map"); const logger = consolelogger_1.ConsoleLogger.get("SharePoint.Rest.Web"); async function GetSiteInfo(siteUrl) { siteUrl = (0, common_1.GetSiteUrl)(siteUrl); try { const r = await (0, rest_1.GetJson)((0, common_1.GetRestBaseUrl)(siteUrl) + "/site?$select=id,serverRelativeUrl", null, { ...rest_1.longLocalCache }); var id = (0, strings_1.normalizeGuid)(r.d.Id); var serverRelativeUrl = (0, url_1.normalizeUrl)(r.d.ServerRelativeUrl); if ((0, typecheckers_1.isNullOrEmptyString)(serverRelativeUrl)) serverRelativeUrl = "/"; //can't return "" since it will be treated as current sub site, when tyring to access the root site from a sub-site return { Id: id, ServerRelativeUrl: serverRelativeUrl }; } catch { return null; } } exports.GetSiteInfo = GetSiteInfo; function GetSiteInfoSync(siteUrl) { siteUrl = (0, common_1.GetSiteUrl)(siteUrl); let result = (0, rest_1.GetJsonSync)((0, common_1.GetRestBaseUrl)(siteUrl) + "/site?$select=id,serverRelativeUrl", null, { ...rest_1.longLocalCache }); if (result.success) { var id = (0, strings_1.normalizeGuid)(result.result.d.Id); var serverRelativeUrl = (0, url_1.normalizeUrl)(result.result.d.ServerRelativeUrl); return { Id: id, ServerRelativeUrl: serverRelativeUrl }; } return null; } exports.GetSiteInfoSync = GetSiteInfoSync; function _getSiteIdFromContext(siteUrl) { if ((0, common_1.hasGlobalContext)()) { //issue 7295 //make sure we return false for /sites/ab/c is not under /sites/a by adding a / at the end let normalizedWebUrl = (0, url_1.normalizeUrl)((0, url_1.makeServerRelativeUrl)(siteUrl), true).toLowerCase(); let normalizedCurrentSiteUrl = (0, url_1.normalizeUrl)(_spPageContextInfo.siteServerRelativeUrl, true).toLowerCase(); //test cases //if (!testSub("/", "/hello")) console.error("1"); //if (testSub("/", "/sites/hello")) console.error("2"); //if (testSub("/sites/a", "/sites/b")) console.error("3"); //if (!testSub("/sites/a", "/sites/a/b")) console.error("4"); //if (!testSub("/", "/")) console.error("5"); //if (!testSub("/sites/a", "/sites/a")) console.error("6"); //if (testSub("/sites/a", "/hello")) console.error("7"); if ((0, typecheckers_1.isNullOrUndefined)(siteUrl) || normalizedCurrentSiteUrl === "/" && !normalizedWebUrl.startsWith("/sites") || normalizedCurrentSiteUrl !== "/" && normalizedWebUrl.startsWith(normalizedCurrentSiteUrl)) { if (!(0, typecheckers_1.isNullOrEmptyString)(_spPageContextInfo.siteId)) { return (0, strings_1.normalizeGuid)(_spPageContextInfo.siteId); } } } return null; } /** Get tenant id lower case no {} */ function GetTenantId() { if (!(0, typecheckers_1.isTypeofFullNameNullOrUndefined)("_spPageContextInfo")) { return (0, strings_1.normalizeGuid)(_spPageContextInfo.aadTenantId); } let info = (0, discovery_1.AutoDiscoverTenantInfo)(true); if (!(0, typecheckers_1.isNullOrUndefined)(info) && (0, typecheckers_1.isValidGuid)(info.idOrName)) { return (0, strings_1.normalizeGuid)(info.idOrName); } return null; } exports.GetTenantId = GetTenantId; /** Get tenant id lower case no {} */ function GetPortalUrl() { return _spPageContextInfo.portalUrl; } exports.GetPortalUrl = GetPortalUrl; /** Get site id lower case no {} */ async function GetSiteId(siteUrl) { let siteId = _getSiteIdFromContext(siteUrl); if (!(0, typecheckers_1.isNullOrEmptyString)(siteId)) { return siteId; } return GetSiteInfo(siteUrl).then((info) => { if (!(0, typecheckers_1.isNullOrUndefined)(info) && !(0, typecheckers_1.isNullOrEmptyString)(info.Id)) { return (0, strings_1.normalizeGuid)(info.Id); } return null; }).catch(() => { return null; }); } exports.GetSiteId = GetSiteId; /** Get site id lower case no {} */ function GetSiteIdSync(siteUrl) { let siteId = _getSiteIdFromContext(siteUrl); if (!(0, typecheckers_1.isNullOrEmptyString)(siteId)) { return siteId; } let result = GetSiteInfoSync(siteUrl); return !(0, typecheckers_1.isNullOrUndefined)(result) ? (0, strings_1.normalizeGuid)(result.Id) : null; } exports.GetSiteIdSync = GetSiteIdSync; /** Get root web id lower case no {} */ function GetRootWebInfo(siteUrl) { siteUrl = (0, common_1.GetSiteUrl)(siteUrl); return (0, rest_1.GetJson)((0, common_1.GetRestBaseUrl)(siteUrl) + "/site/rootWeb?$select=id,serverRelativeUrl", null, { ...rest_1.longLocalCache }) .then(r => { var id = (0, strings_1.normalizeGuid)(r.d.Id); var serverRelativeUrl = (0, url_1.normalizeUrl)(r.d.ServerRelativeUrl); //console.log("site id: " + id); return { Id: id, ServerRelativeUrl: serverRelativeUrl }; }) .catch(() => null); } exports.GetRootWebInfo = GetRootWebInfo; /** Return the web Title */ function GetWebTitle(siteUrl) { siteUrl = (0, common_1.GetSiteUrl)(siteUrl); return (0, rest_1.GetJson)((0, common_1.GetRestBaseUrl)(siteUrl) + `/web/Title`, null, { ...rest_1.shortLocalCache }) .then(r => { return r.d.Title; }) .catch(() => null); } exports.GetWebTitle = GetWebTitle; function _getWebIdRequestUrl(siteUrl) { return `${(0, common_1.GetRestBaseUrl)(siteUrl)}/web/Id`; } /** Return the web id */ function GetWebId(siteUrl) { return (0, rest_1.GetJson)(_getWebIdRequestUrl(siteUrl), null, { ...rest_1.longLocalCache }) .then(r => { return (0, strings_1.normalizeGuid)(r.d.Id); }) .catch(() => null); } exports.GetWebId = GetWebId; /** Return the web id */ function GetWebIdSync(siteUrl) { let syncResult = (0, rest_1.GetJsonSync)(_getWebIdRequestUrl(siteUrl), null, { ...rest_1.longLocalCache }); if (syncResult.success) return syncResult.result.d.Id; else return null; } exports.GetWebIdSync = GetWebIdSync; /** Return the web id */ async function IsRootWeb(siteUrl) { siteUrl = (0, common_1.GetSiteUrl)(siteUrl); let webId = await GetWebId(siteUrl); let rootWeb = await GetRootWebInfo(siteUrl); return webId === rootWeb.Id; } exports.IsRootWeb = IsRootWeb; function UserHasAllPermissions(siteUrl, permissions) { siteUrl = (0, common_1.GetSiteUrl)(siteUrl); return (0, rest_1.GetJson)((0, common_1.GetRestBaseUrl)(siteUrl) + `/web/EffectiveBasePermissions`, null, { ...rest_1.shortLocalCache }) .then(r => { var effectivePermissions = new sharepoint_1.SPBasePermissions(r.d.EffectiveBasePermissions); return permissions.every((perm) => { return effectivePermissions.has(perm); }); }) .catch(() => null); } exports.UserHasAllPermissions = UserHasAllPermissions; function UserHasManageSitePermissions(siteUrl) { siteUrl = (0, common_1.GetSiteUrl)(siteUrl); if (!(0, typecheckers_1.isTypeofFullNameNullOrUndefined)("_spPageContextInfo")) { if (siteUrl.startsWith(_spPageContextInfo.siteServerRelativeUrl)) if (_spPageContextInfo.isSiteAdmin || _spPageContextInfo["isSiteOwner"]) return Promise.resolve(true); } return (0, rest_1.GetJson)((0, common_1.GetRestBaseUrl)(siteUrl) + `/web/EffectiveBasePermissions`, null, { ...rest_1.shortLocalCache }) .then(r => { return new sharepoint_1.SPBasePermissions(r.d.EffectiveBasePermissions).has(sharepoint_types_1.SPBasePermissionKind.ManageWeb); }) .catch(() => null); } exports.UserHasManageSitePermissions = UserHasManageSitePermissions; function _getContentTypesRequestUrl(siteUrl, options = {}) { const { fromRootWeb, includeFields, listIdOrTitle } = options; let query = `$select=${includeFields === true ? common_1.CONTENT_TYPES_SELECT : common_1.CONTENT_TYPES_SELECT_WITH_FIELDS}${includeFields === true ? "&$expand=Fields" : ""}`; if (!(0, typecheckers_1.isNullOrEmptyString)(listIdOrTitle)) { return `${(0, list_1.GetListRestUrl)(siteUrl, listIdOrTitle)}/contenttypes?${query}`; } else if (fromRootWeb) { return `${(0, common_1.GetRestBaseUrl)(siteUrl)}/site/rootweb/contenttypes?${query}`; } else { return `${(0, common_1.GetRestBaseUrl)(siteUrl)}/web/contenttypes?${query}`; } } function _postProcessGetContentTypes(contentTypes, options = {}, allListFields) { const { ignoreHidden, ignoreFolders, includeFields } = options; if (!(0, typecheckers_1.isNullOrEmptyArray)(contentTypes)) { if (ignoreFolders === true || ignoreHidden === true) { contentTypes = contentTypes.filter(rr => { if (options.ignoreFolders && rr.StringId.startsWith('0x0120')) return false; if (options.ignoreHidden && rr.Hidden) return false; return true; }); } if (includeFields === true) { contentTypes.forEach((result) => { if (!(0, typecheckers_1.isNullOrEmptyArray)(result.Fields)) { result.Fields = result.Fields.map((field) => { return (0, sharepoint_1.extendFieldInfo)(field, allListFields || result.Fields); }); } }); } return contentTypes; } return null; } async function GetContentTypes(siteUrl, options = {}, refreshCache = false) { let url = _getContentTypesRequestUrl(siteUrl, options); let allListFields = null; if (options.includeFields) { allListFields = await (0, list_1.GetListFields)(siteUrl, options.listIdOrTitle); } return (0, rest_1.GetJson)(url, null, { allowCache: refreshCache !== true, jsonMetadata: rest_types_1.jsonTypes.nometadata }) .then(result => { if (!(0, typecheckers_1.isNullOrUndefined)(result)) { return _postProcessGetContentTypes(result.value, options, allListFields); } return null; }) .catch(() => null); } exports.GetContentTypes = GetContentTypes; function GetContentTypesSync(siteUrl, options = {}, refreshCache = false) { let url = _getContentTypesRequestUrl(siteUrl, options); let allListFields = null; if (options.includeFields) { allListFields = (0, list_1.GetListFieldsSync)(siteUrl, options.listIdOrTitle); } let result = (0, rest_1.GetJsonSync)(url, null, { allowCache: refreshCache !== true, jsonMetadata: rest_types_1.jsonTypes.nometadata }); if (!(0, typecheckers_1.isNullOrUndefined)(result) && result.success === true && !(0, typecheckers_1.isNullOrUndefined)(result.result)) { return _postProcessGetContentTypes(result.result.value, options, allListFields); } return null; } exports.GetContentTypesSync = GetContentTypesSync; function _getListsRequestUrl(siteUrl, options) { let select = common_1.LIST_SELECT; let expand = common_1.LIST_EXPAND; if (options.includeRootFolders === true) { select += ",RootFolder/Name,RootFolder/ServerRelativeUrl"; expand += ",RootFolder"; } if (options.includeViews === true) { expand += ",Views"; } return (0, common_1.GetRestBaseUrl)(siteUrl) + `/web/lists?$select=${select}&$expand=${expand}`; } function _postProcessGetLists(lists, options = {}) { lists = lists || []; if (options && options.includeViews) { lists.forEach(l => { if ((0, typecheckers_1.isNullOrEmptyArray)(l.Views)) { l.Views = []; } l.Views.forEach(v => { v.Id = (0, strings_1.normalizeGuid)(v.Id); }); }); } lists.forEach((list) => { if (list.EffectiveBasePermissions && ((0, typecheckers_1.isString)(list.EffectiveBasePermissions.High) || (0, typecheckers_1.isString)(list.EffectiveBasePermissions.Low))) { list.EffectiveBasePermissions = { High: Number(list.EffectiveBasePermissions.High), Low: Number(list.EffectiveBasePermissions.Low) }; } }); return lists; } function GetLists(siteUrl, options = {}) { let url = _getListsRequestUrl(siteUrl, options); return (0, rest_1.GetJson)(url, null, { allowCache: true, jsonMetadata: rest_types_1.jsonTypes.nometadata }) .then(result => { return _postProcessGetLists(result.value, options); }) .catch(() => []); } exports.GetLists = GetLists; function GetListsSync(siteUrl, options = {}) { let url = _getListsRequestUrl(siteUrl, options); let response = (0, rest_1.GetJsonSync)(url, null, { ...rest_1.shortLocalCache, jsonMetadata: rest_types_1.jsonTypes.nometadata }); if (response && response.success && response.result && (0, typecheckers_1.isNotEmptyArray)(response.result.value)) { return _postProcessGetLists(response.result.value, options); } return []; } exports.GetListsSync = GetListsSync; /** * Get all sub webs. Results will be cached in memory and sorted * @param siteUrl the starting URL you want to get the sites for * @param allowAppWebs send true if you would like to inlucde app webs as well */ async function GetAllSubWebs(siteUrl, options) { siteUrl = (0, common_1.GetSiteUrl)(siteUrl); let sites = []; options = options || {}; var currentSite; var queryFailed = false; try { currentSite = await GetWebInfo(siteUrl); let queryFilter = ''; if (!options.allSiteCollections) { //filter by site id let siteId = await GetSiteId(siteUrl); queryFilter = `SiteId:${siteId}`; } //Issue 6735 missing WebId for some customer (US, government GCC tenant will not return WebId) let queryUrl = `${(0, common_1.GetRestBaseUrl)(siteUrl)}/search/query?querytext=%27${queryFilter}(contentclass:STS_Site)%20(contentclass:STS_Web)%27&trimduplicates=false&rowlimit=5000&selectproperties=%27Title,Url,WebTemplate,WebId%27`; let response = await (0, rest_1.GetJson)(queryUrl, null, { ...rest_1.shortLocalCache }); let results = response && response.d && response.d.query && response.d.query.PrimaryQueryResult; let addedSites = []; if (results && results.RelevantResults.RowCount >= 0) { let allPropsFound = false; results.RelevantResults.Table.Rows.results.forEach(row => { let Title = null; let Url = null; let WebId = null; let WebTemplate = null; let skip = false; for (var i = 0; i < row.Cells.results.length; i++) { let cell = row.Cells.results[i]; let value = (0, typecheckers_1.isNullOrEmptyString)(cell.Value) ? "" : cell.Value; switch (cell.Key) { case "WebTemplate": WebTemplate = value; if (!options.allowAppWebs && value === "APP") skip = true; break; case "Title": Title = value; break; case "WebId": WebId = (0, strings_1.normalizeGuid)(value); break; case "Url": if (addedSites.indexOf(value.toLowerCase()) >= 0) { //duplicate, skip skip = true; } else { Url = value; } break; } if (skip) break; //stop the cells loop allPropsFound = Title !== null && Url !== null && WebId !== null && WebTemplate !== null; if (allPropsFound) break; } if (!skip && allPropsFound) //don't skip, and we found all needed props { sites.push({ Title: Title, ServerRelativeUrl: (0, url_1.makeServerRelativeUrl)(Url), WebId: WebId, WebTemplate: WebTemplate, WebType: WebTemplate === "APP" ? sharepoint_utils_types_1.WebTypes.App : WebTemplate === "GROUP" ? sharepoint_utils_types_1.WebTypes.Group : WebTemplate === "STS" ? sharepoint_utils_types_1.WebTypes.Team : sharepoint_utils_types_1.WebTypes.Other }); } }); } //Issue 7161 if (sites.length === 1 || (!(0, typecheckers_1.isNullOrUndefined)(currentSite) && !sites.filter((site) => { return site.WebId !== currentSite.WebId; })[0])) { queryFailed = true; } } catch (e) { queryFailed = true; } if (queryFailed) { // Igor: Issue #7702 if (_spPageContextInfo && _spPageContextInfo.siteServerRelativeUrl.toLowerCase() !== siteUrl.toLowerCase()) { //siteUrl = _spPageContextInfo.siteServerRelativeUrl; //currentSite = await GetWebInfo(siteUrl); //Kevin: Issue 1028 //The user may not have permission to the site collection root web. Instead of overwirting the currentSite/siteUrl, //we make a request for the site collection root web. If we get a valid response, replace currentSite/siteUrl with //the site collection root web info. let currentSiteCollection = await GetWebInfo(_spPageContextInfo.siteServerRelativeUrl); if (currentSiteCollection && !(0, typecheckers_1.isNullOrEmptyString)(currentSiteCollection.ServerRelativeUrl)) { currentSite = currentSiteCollection; siteUrl = _spPageContextInfo.siteServerRelativeUrl; } } //add current site if (currentSite && (options.allowAppWebs || currentSite.WebType !== sharepoint_utils_types_1.WebTypes.App)) { sites.push(currentSite); } //Issue 6651 //add sub sites //if the query failed, we can't rely on search to get the subwebs var currentSiteSubSites = await __getSubSites(siteUrl, options.allowAppWebs); if ((0, typecheckers_1.isNotEmptyArray)(currentSiteSubSites)) { sites = [...sites, ...currentSiteSubSites]; } } var webIds = []; var filteredSites = []; for (let site of sites) { if (webIds.indexOf(site.WebId) === -1) { webIds.push(site.WebId); filteredSites.push(site); } } (0, collections_base_1.sortArray)(filteredSites, s => s.ServerRelativeUrl); return filteredSites; } exports.GetAllSubWebs = GetAllSubWebs; async function __getSubSites(siteUrl, allowAppWebs) { siteUrl = (0, common_1.GetSiteUrl)(siteUrl); let sites = []; //try { //maybe search is not wokring? use regular REST API let restUrl = `${(0, common_1.GetRestBaseUrl)(siteUrl)}/web/getsubwebsfilteredforcurrentuser(nwebtemplatefilter=-1,nconfigurationfilter=0)?$Select=Title,ServerRelativeUrl,Id,WebTemplate`; let result = await (0, rest_1.GetJson)(restUrl, null, { ...rest_1.shortLocalCache }); if (result && result.d && (0, typecheckers_1.isNotEmptyArray)(result.d.results)) { let results = (allowAppWebs) ? result.d.results : result.d.results.filter(s => s.WebTemplate !== "APP"); let promises = []; results.forEach(s => { sites.push({ Title: s.Title, ServerRelativeUrl: s.ServerRelativeUrl, WebId: s.Id, WebTemplate: s.WebTemplate, WebType: s.WebTemplate === "APP" ? sharepoint_utils_types_1.WebTypes.App : s.WebTemplate === "GROUP" ? sharepoint_utils_types_1.WebTypes.Group : s.WebTemplate === "STS" ? sharepoint_utils_types_1.WebTypes.Team : sharepoint_utils_types_1.WebTypes.Other }); promises.push(__getSubSites(s.ServerRelativeUrl, allowAppWebs)); }); //loop and add all sub sites let allSubs = await Promise.all(promises); allSubs.forEach(subSubs => { sites.push(...subSubs); }); } //} //catch { //} return sites; } exports.__getSubSites = __getSubSites; function _getWebInfoByIdRequestUrl(siteUrl, webId) { return `${(0, common_1.GetRestBaseUrl)(siteUrl)}/site/openWebById('${webId}')?$Select=${common_1.WEB_SELECT}`; } function _getCurrentWebInfoRequestUrl(siteUrl) { return `${(0, common_1.GetRestBaseUrl)(siteUrl)}/web?$Select=${common_1.WEB_SELECT}`; } function _postProcessGetWebInfo(webInfo) { if (!(0, typecheckers_1.isNullOrUndefined)(webInfo)) { return { Title: webInfo.Title, ServerRelativeUrl: webInfo.ServerRelativeUrl, WebId: webInfo.Id, WebTemplate: webInfo.WebTemplate, WebType: GetWebType(webInfo.WebTemplate), Description: webInfo.Description, SiteLogoUrl: webInfo.SiteLogoUrl }; } return null; } async function GetWebInfo(siteUrl, webId, refreshCache) { let webInfoResponse = null; try { if (!(0, typecheckers_1.isNullOrEmptyString)(webId) && (0, typecheckers_1.isValidGuid)(webId)) { webId = (0, strings_1.normalizeGuid)(webId); let currentWebId = await GetWebId(siteUrl); if (currentWebId !== webId) { let url = _getWebInfoByIdRequestUrl(siteUrl, webId); webInfoResponse = await (0, rest_1.GetJson)(url, null, { method: "POST", spWebUrl: (0, common_1.GetSiteUrl)(siteUrl), ...rest_1.shortLocalCache, jsonMetadata: rest_types_1.jsonTypes.nometadata, allowCache: refreshCache !== true }); } } if ((0, typecheckers_1.isNullOrUndefined)(webInfoResponse)) { let url = _getCurrentWebInfoRequestUrl(siteUrl); webInfoResponse = await (0, rest_1.GetJson)(url, null, { ...rest_1.shortLocalCache, jsonMetadata: rest_types_1.jsonTypes.nometadata, allowCache: refreshCache !== true }); } } catch (e) { } return _postProcessGetWebInfo(webInfoResponse); } exports.GetWebInfo = GetWebInfo; function GetWebInfoSync(siteUrl, webId) { let webInfoResponse = null; if (!(0, typecheckers_1.isNullOrEmptyString)(webId) && (0, typecheckers_1.isValidGuid)(webId)) { webId = (0, strings_1.normalizeGuid)(webId); let currentWebId = GetWebIdSync(siteUrl); if (currentWebId !== webId) { let url = _getWebInfoByIdRequestUrl(siteUrl, webId); let syncResult = (0, rest_1.GetJsonSync)(url, null, { method: "POST", spWebUrl: (0, common_1.GetSiteUrl)(siteUrl), ...rest_1.shortLocalCache, jsonMetadata: rest_types_1.jsonTypes.nometadata }); if (syncResult.success) { webInfoResponse = syncResult.result; } } } if ((0, typecheckers_1.isNullOrUndefined)(webInfoResponse)) { let url = _getCurrentWebInfoRequestUrl(siteUrl); let syncResult = (0, rest_1.GetJsonSync)(url, null, { ...rest_1.shortLocalCache, jsonMetadata: rest_types_1.jsonTypes.nometadata }); if (syncResult.success) { webInfoResponse = syncResult.result; } } return _postProcessGetWebInfo(webInfoResponse); } exports.GetWebInfoSync = GetWebInfoSync; async function GetWebRoleDefinitions(siteUrl) { return (0, rest_1.GetJson)((0, common_1.GetRestBaseUrl)(siteUrl) + `/web/RoleDefinitions?filter=Hidden ne true`, null, { ...rest_1.longLocalCache }) .then(r => { return r.d.results || []; }) .catch(() => []); } exports.GetWebRoleDefinitions = GetWebRoleDefinitions; ; /** get roles for site or list */ async function GetRoleAssignments(siteUrl, listIdOrTitle, itemId) { const url = `${(0, typecheckers_1.isNullOrEmptyString)(listIdOrTitle) ? (0, common_1.GetRestBaseUrl)(siteUrl) + "/web" : (0, list_1.GetListRestUrl)(siteUrl, listIdOrTitle)}/${(0, typecheckers_1.isNullOrNaN)(itemId) ? '' : `items(${itemId})/`}roleassignments?$expand=Member/users,RoleDefinitionBindings`; const result = await (0, rest_1.GetJson)(url, undefined, { jsonMetadata: rest_types_1.jsonTypes.nometadata }); return result.value; } exports.GetRoleAssignments = GetRoleAssignments; /** Web sub webs for the selected site */ async function GetSubWebs(siteUrl, options) { return (0, rest_1.GetJson)((0, common_1.GetRestBaseUrl)(siteUrl) + `/web/webs${options && options.allowAppWebs ? "" : "&$filter=WebTemplate ne 'APP'"}`, null, { ...rest_1.shortLocalCache }) .then(r => { return r.d.results; }) .catch(() => []); } exports.GetSubWebs = GetSubWebs; /** Web sub webs for the selected site */ async function GetAppTiles(siteUrl) { //Issue 933 this api does not work in a classic app web if ((0, common_1.hasGlobalContext)() && _spPageContextInfo.isAppWeb) { logger.warn('GetAppTiles does not work in an app web'); return null; } return (0, rest_1.GetJson)((0, common_1.GetRestBaseUrl)(siteUrl) + "/web/AppTiles?$filter=AppType%20eq%203&$select=Title,ProductId", null, { ...rest_1.shortLocalCache, jsonMetadata: rest_types_1.jsonTypes.nometadata }) .then(r => { return (0, typecheckers_1.isNotEmptyArray)(r.value) ? r.value.map(t => { return { Title: t.Title, ProductId: (0, strings_1.normalizeGuid)(t.ProductId) }; }) : []; }) .catch(() => []); } exports.GetAppTiles = GetAppTiles; /** Web sub webs for the selected site */ function GetAppTilesSync(siteUrl) { siteUrl = (0, common_1.GetSiteUrl)(siteUrl); //Issue 933 this api does not work in a classic app web if ((0, common_1.hasGlobalContext)() && _spPageContextInfo.isAppWeb) { logger.warn('GetAppTiles does not work in an app web'); return null; } let r = (0, rest_1.GetJsonSync)((0, common_1.GetRestBaseUrl)(siteUrl) + "/web/AppTiles?$filter=AppType%20eq%203&$select=Title,ProductId", null, { ...rest_1.shortLocalCache, jsonMetadata: rest_types_1.jsonTypes.nometadata }); return r.success && r.result && (0, typecheckers_1.isNotEmptyArray)(r.result.value) ? r.result.value.map(t => { return { Title: t.Title, ProductId: (0, strings_1.normalizeGuid)(t.ProductId) }; }) : []; } exports.GetAppTilesSync = GetAppTilesSync; function GetWebType(WebTemplate) { return WebTemplate === "APP" ? sharepoint_utils_types_1.WebTypes.App : WebTemplate === "GROUP" ? sharepoint_utils_types_1.WebTypes.Group : WebTemplate === "STS" ? sharepoint_utils_types_1.WebTypes.Team : sharepoint_utils_types_1.WebTypes.Other; } async function GetServerTimeZone(siteUrl) { siteUrl = (0, common_1.GetSiteUrl)(siteUrl); let getTimeZoneUrl = `${(0, common_1.GetRestBaseUrl)(siteUrl)}/web/regionalSettings/timeZone`; let result = await (0, rest_1.GetJson)(getTimeZoneUrl, null, { ...rest_1.extraLongLocalCache }); if (result && result.d && !(0, typecheckers_1.isNullOrUndefined)(result.d)) { return result.d; } else return null; } exports.GetServerTimeZone = GetServerTimeZone; function GetServerTimeZoneSync(siteUrl) { siteUrl = (0, common_1.GetSiteUrl)(siteUrl); let getTimeZoneUrl = `${(0, common_1.GetRestBaseUrl)(siteUrl)}/web/regionalSettings/timeZone`; let response = (0, rest_1.GetJsonSync)(getTimeZoneUrl, null, { ...rest_1.extraLongLocalCache }); if (response && response.result.d && !(0, typecheckers_1.isNullOrUndefined)(response.result.d)) { return response.result.d; } else return null; } exports.GetServerTimeZoneSync = GetServerTimeZoneSync; /** * to be used when parsing string date to date object in JavaScript like so: * var clientTimezoneOffset = new Date().getTimezoneOffset() * 60 * 1000; * var clientDate = new Date(value); * var serverDate = new Date(clientDate.getTime() + clientTimezoneOffset + GetServerTimeOffset); * We must send a date in, since places like Israel have different offset for specific dates (GMT+2 or GMT+3) * or just call SPServerLocalTimeToUTCDate */ async function GetServerTimeOffset(siteUrl, date) { siteUrl = (0, common_1.GetSiteUrl)(siteUrl); let dateStr = (0, date_1.toIsoDateFormat)(date, { zeroTime: true, omitZ: true }); let inputDate = new Date(dateStr); let getTimeZoneOffsetUrl = `${(0, common_1.GetRestBaseUrl)(siteUrl)}/web/regionalSettings/timeZone/localTimeToUTC(@date)?@date='${encodeURIComponent(dateStr)}'`; let result = await (0, rest_1.GetJson)(getTimeZoneOffsetUrl, null, { ...rest_1.weeekLongLocalCache, jsonMetadata: rest_types_1.jsonTypes.nometadata }); if (result && !(0, typecheckers_1.isNullOrEmptyString)(result.value)) { let resultDate = new Date(result.value.slice(0, result.value.length - 1)); //remove Z and get as date. return (resultDate.getTime() - inputDate.getTime()); } else return 0; } /** * to be used when parsing string date to date object in JavaScript like so: * var clientTimezoneOffset = new Date().getTimezoneOffset() * 60 * 1000; * var clientDate = new Date(value); * var serverDate = new Date(clientDate.getTime() + clientTimezoneOffset + GetServerTimeOffset); * We must send a date in, since places like Israel have different offset for specific dates (GMT+2 or GMT+3) * or just call SPServerLocalTimeToUTCDate */ function GetServerTimeOffsetSync(siteUrl, date) { siteUrl = (0, common_1.GetSiteUrl)(siteUrl); let dateStr = (0, date_1.toIsoDateFormat)(date, { zeroTime: true, omitZ: true }); let inputDate = new Date(dateStr); let getTimeZoneOffsetUrl = `${(0, common_1.GetRestBaseUrl)(siteUrl)}/web/regionalSettings/timeZone/localTimeToUTC(@date)?@date='${encodeURIComponent(dateStr)}'`; let result = (0, rest_1.GetJsonSync)(getTimeZoneOffsetUrl, null, { ...rest_1.weeekLongLocalCache, jsonMetadata: rest_types_1.jsonTypes.nometadata }); if (result && result.success && !(0, typecheckers_1.isNullOrEmptyString)(result.result.value)) { let resultDate = new Date(result.result.value.slice(0, result.result.value.length - 1)); //remove Z and get as date. return (resultDate.getTime() - inputDate.getTime()); } else return 0; } /** get date yyyy:MM:ddTHH:mm:ss NO ZED, or a date object created in the server local time, and return a date object of the corrected UTC time */ async function SPServerLocalTimeToUTCDate(siteUrl, date) { //used in 7700 if ((0, typecheckers_1.isNullOrEmptyString)(date)) return null; siteUrl = (0, common_1.GetSiteUrl)(siteUrl); if (!(0, typecheckers_1.isDate)(date)) date = new Date(date); let serverTimeOffset = await GetServerTimeOffset(siteUrl, date); return _SPServerLocalTimeToUTCDate(date, serverTimeOffset); } exports.SPServerLocalTimeToUTCDate = SPServerLocalTimeToUTCDate; /** get date yyyy:MM:ddTHH:mm:ss NO ZED, or a date object created in the server local time, and return a date object of the corrected UTC time */ function SPServerLocalTimeToUTCDateSync(siteUrl, date) { //used in 7700 if ((0, typecheckers_1.isNullOrEmptyString)(date)) return null; siteUrl = (0, common_1.GetSiteUrl)(siteUrl); if (!(0, typecheckers_1.isDate)(date)) date = new Date(date); let serverTimeOffset = GetServerTimeOffsetSync(siteUrl, date); return _SPServerLocalTimeToUTCDate(date, serverTimeOffset); } exports.SPServerLocalTimeToUTCDateSync = SPServerLocalTimeToUTCDateSync; function _SPServerLocalTimeToUTCDate(date, serverTimeOffset) { let localTimeOffset = date.getTimezoneOffset() * 60000; return new Date(serverTimeOffset - localTimeOffset + date.getTime()); } /** get date yyyy:MM:ddTHH:mm:ss NO ZED * returns yyyy:MM:ddTHH:mm:ssZ * expensive, but works. for faster bulk parsing use toIsoDateFormat(new Date(GetServerTimeOffset + date.getTime())) * or: SPServerLocalTimeToUTCDate */ async function SPServerLocalTimeToUTC(siteUrl, date) { siteUrl = (0, common_1.GetSiteUrl)(siteUrl); if ((0, typecheckers_1.isDate)(date)) { date = (0, date_1.toIsoDateFormat)(date, { omitZ: true }); } let restUrl = `${(0, common_1.GetRestBaseUrl)(siteUrl)}/web/regionalSettings/timeZone/localTimeToUTC(@date)?@date='${encodeURIComponent(date)}'`; let result = await (0, rest_1.GetJson)(restUrl, null, { ...rest_1.weeekLongLocalCache, jsonMetadata: rest_types_1.jsonTypes.nometadata }); return result && result.value || null; } exports.SPServerLocalTimeToUTC = SPServerLocalTimeToUTC; /** * convert date in ISO format (yyyy:MM:ddTHH:mm:ss) or SPServerLocalTime (5/27/2020 11:34, 5-27-2020 11:34) * returns date in ISO UTC (yyyy:MM:ddTHH:mm:ssZ) * expensive, but works. for faster bulk parsing use toIsoDateFormat(new Date(GetServerTimeOffset + date.getTime())) * or: SPServerLocalTimeToUTCDateSync */ function SPServerLocalTimeToUTCSync(siteUrl, date) { siteUrl = (0, common_1.GetSiteUrl)(siteUrl); if ((0, typecheckers_1.isDate)(date)) { date = (0, date_1.toIsoDateFormat)(date, { omitZ: true }); } let restUrl = `${(0, common_1.GetRestBaseUrl)(siteUrl)}/web/regionalSettings/timeZone/localTimeToUTC(@date)?@date='${encodeURIComponent(date)}'`; let result = (0, rest_1.GetJsonSync)(restUrl, null, { ...rest_1.weeekLongLocalCache, jsonMetadata: rest_types_1.jsonTypes.nometadata }); return result.success && result.result.value || null; } exports.SPServerLocalTimeToUTCSync = SPServerLocalTimeToUTCSync; /** get utc date yyyy:MM:ddTHH:mm:ssZ * returns yyyy:MM:ddTHH:mm:ss NO ZED * expensive, but works. for faster bulk parsing use toIsoDateFormat(new Date(date.getTime()-GetServerTimeOffset,{omitZ:true})) */ async function UTCToSPServerLocalTime(siteUrl, date) { siteUrl = (0, common_1.GetSiteUrl)(siteUrl); if ((0, typecheckers_1.isDate)(date)) { date = (0, date_1.toIsoDateFormat)(date); } let supportedLocale = _getSupportedLocaleForUTCToSPServerTime(); if (!(0, typecheckers_1.isNullOrEmptyString)(supportedLocale)) { try { let regionalSettings = await GetServerTimeZone(siteUrl); let timeZone = timzone_map_1.SPTimeZoneIdToIANATimeZoneName[`${regionalSettings.Id}`]; if (!(0, typecheckers_1.isNullOrEmptyString)(timeZone)) { let result = _UTCDateStringToSPServerLocalDateString(date, timeZone, supportedLocale); if (!(0, typecheckers_1.isNullOrEmptyString)(result)) { return result; } } } catch { } } let restUrl = `${(0, common_1.GetRestBaseUrl)(siteUrl)}/web/regionalSettings/timeZone/utcToLocalTime(@date)?@date='${encodeURIComponent(date)}'`; let result = await (0, rest_1.GetJson)(restUrl, null, { ...rest_1.longLocalCache, jsonMetadata: rest_types_1.jsonTypes.nometadata }); return result && result.value || null; } exports.UTCToSPServerLocalTime = UTCToSPServerLocalTime; /** get utc date yyyy:MM:ddTHH:mm:ssZ * returns yyyy:MM:ddTHH:mm:ss NO ZED * expensive, but works. for faster bulk parsing use toIsoDateFormat(new Date(date.getTime()-GetServerTimeOffset,{omitZ:true})) */ function UTCToSPServerLocalTimeSync(siteUrl, date) { siteUrl = (0, common_1.GetSiteUrl)(siteUrl); if ((0, typecheckers_1.isDate)(date)) { date = (0, date_1.toIsoDateFormat)(date); } let supportedLocale = _getSupportedLocaleForUTCToSPServerTime(); if (!(0, typecheckers_1.isNullOrEmptyString)(supportedLocale)) { try { let regionalSettings = GetServerTimeZoneSync(siteUrl); let timeZone = timzone_map_1.SPTimeZoneIdToIANATimeZoneName[`${regionalSettings.Id}`]; if (!(0, typecheckers_1.isNullOrEmptyString)(timeZone)) { let result = _UTCDateStringToSPServerLocalDateString(date, timeZone, supportedLocale); if (!(0, typecheckers_1.isNullOrEmptyString)(result)) { return result; } } } catch { } } let restUrl = `${(0, common_1.GetRestBaseUrl)(siteUrl)}/web/regionalSettings/timeZone/utcToLocalTime(@date)?@date='${encodeURIComponent(date)}'`; let result = (0, rest_1.GetJsonSync)(restUrl, null, { ...rest_1.longLocalCache, jsonMetadata: rest_types_1.jsonTypes.nometadata }); return result.success && result.result.value || null; } exports.UTCToSPServerLocalTimeSync = UTCToSPServerLocalTimeSync; function _getSupportedLocaleForUTCToSPServerTime() { try { let supportedLocales = Intl.DateTimeFormat.supportedLocalesOf(["en-CA", "sv-SE"]); return supportedLocales[0]; } catch { } return null; } function _UTCDateStringToSPServerLocalDateString(utcISODate, targetIanaTimeZone, supportedLocale) { let formatter = new Intl.DateTimeFormat(supportedLocale, { timeZone: targetIanaTimeZone, year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit", fractionalSecondDigits: 3, hour12: false }); let value1 = formatter.format(new Date(utcISODate)); if (supportedLocale.toLowerCase() === "en-ca") { value1 = value1.replace(",", "").replace(" ", "T").split(".000")[0]; } else { value1 = value1.replace(",", ".").replace(" ", "T").split(".000")[0]; } return (0, exports_index_1.isISODate)(value1) ? value1 : null; } function SPServerLocalTimeSync(siteUrl) { siteUrl = (0, common_1.GetSiteUrl)(siteUrl); var clientNowServerDeltas = (0, objects_1.getGlobal)("ClientNowServerDeltas"); var clientNowServerDelta = clientNowServerDeltas[siteUrl]; var now = new Date(); if ((0, typecheckers_1.isNullOrUndefined)(clientNowServerDelta)) { var local = UTCToSPServerLocalTimeSync(siteUrl, now.toISOString()); clientNowServerDelta = (+now - +(new Date(local))); clientNowServerDeltas[siteUrl] = clientNowServerDelta; } var newdate = new Date(+now - clientNowServerDelta); return (0, date_1.toIsoDateFormat)(newdate, { omitZ: true }); } exports.SPServerLocalTimeSync = SPServerLocalTimeSync; async function SPServerLocalTime(siteUrl) { siteUrl = (0, common_1.GetSiteUrl)(siteUrl); var clientNowServerDeltas = (0, objects_1.getGlobal)("ClientNowServerDeltas"); var clientNowServerDelta = clientNowServerDeltas[siteUrl]; var now = new Date(); if ((0, typecheckers_1.isNullOrUndefined)(clientNowServerDelta)) { var local = await UTCToSPServerLocalTime(siteUrl, now.toISOString()); clientNowServerDelta = (+now - +(new Date(local))); clientNowServerDeltas[siteUrl] = clientNowServerDelta; } var newdate = new Date(+now - clientNowServerDelta); return (0, date_1.toIsoDateFormat)(newdate, { omitZ: true }); } exports.SPServerLocalTime = SPServerLocalTime; async function SPServerLocalToday(siteUrl) { siteUrl = (0, common_1.GetSiteUrl)(siteUrl); return (0, exports_index_1.promiseLock)(`SPServerLocalToday)_${siteUrl}`, async () => { return SPServerLocalTime(siteUrl); }, 30000); } exports.SPServerLocalToday = SPServerLocalToday; function GetContextWebInformationSync(siteUrl) { var siteId = null; if (_spPageContextInfo && _spPageContextInfo.isAppWeb) { //inside an app web you can't get the contextinfo for any other site siteUrl = _spPageContextInfo.webServerRelativeUrl; siteId = _spPageContextInfo.siteId; } else { siteId = GetSiteIdSync(siteUrl); if ((0, typecheckers_1.isNullOrEmptyString)(siteId)) { return null; } } let result = (0, rest_1.GetJsonSync)(`${(0, common_1.GetRestBaseUrl)(siteUrl)}/contextinfo`, null, { method: "POST", maxAge: 5 * 60, includeDigestInPost: false, allowCache: true, postCacheKey: `GetContextWebInformation_${(0, strings_1.normalizeGuid)(siteId)}` }); if (result && result.success) { return result.result.d.GetContextWebInformation; } else { return null; } } exports.GetContextWebInformationSync = GetContextWebInformationSync; function _getCustomActionsBaseRestUrl(siteUrl, options = {}) { const { listId, actionId } = { ...options }; let restUrl = `${(0, common_1.GetRestBaseUrl)(siteUrl)}/web`; if (!(0, typecheckers_1.isNullOrEmptyString)(listId)) { restUrl += `/lists('${(0, strings_1.normalizeGuid)(listId)}')`; } restUrl += `/UserCustomActions`; if (!(0, typecheckers_1.isNullOrEmptyString)(actionId)) { restUrl += `('${actionId}')`; } return restUrl; } function _parseCustomActionReponse(action) { if ((0, typecheckers_1.isNullOrUndefined)(action)) { return action; } if (!(0, typecheckers_1.isNullOrUndefined)(action.Rights)) { if ((0, typecheckers_1.isNumeric)(action.Rights.High)) { action.Rights.High = Number(action.Rights.High); } if ((0, typecheckers_1.isNumeric)(action.Rights.Low)) { action.Rights.Low = Number(action.Rights.Low); } } return action; } function _convertCustomActionToPostData(action) { //The rest end point expects the rights in string format for some odd reason despite IBasePermissions being stored //as High/Low numbers and the methods using numbers (ie. SPBasePermission). Even EffectiveBasePermissions on //a list are stored using numbers. let hasRights = !(0, typecheckers_1.isNullOrUndefined)(action.Rights); let partialAction; if (hasRights) { partialAction = { Rights: { High: `${action.Rights.High}`, Low: `${action.Rights.Low}` } }; delete action.Rights; } let data = { ...action, ...partialAction }; return data; } /** Get UserCustomActions for web/list */ async function GetUserCustomActions(siteUrl, listId, allowCache = true) { let restUrl = _getCustomActionsBaseRestUrl(siteUrl, { listId: listId }); let cacheOptions = allowCache === true ? rest_1.shortLocalCache : { allowCache: false }; let restOptions = { jsonMetadata: rest_types_1.jsonTypes.nometadata, ...cacheOptions }; try { let response = await (0, rest_1.GetJson)(restUrl, null, restOptions); if (!(0, typecheckers_1.isNullOrUndefined)(response) && !(0, typecheckers_1.isNullOrEmptyArray)(response.value)) { return response.value.map(_parseCustomActionReponse); } } catch { } return []; } exports.GetUserCustomActions = GetUserCustomActions; /** Get UserCustomAction by id from web/list */ async function GetUserCustomActionById(siteUrl, customActionId, listId, allowCache = true) { let restUrl = _getCustomActionsBaseRestUrl(siteUrl, { listId: listId, actionId: customActionId }); let cacheOptions = allowCache === true ? rest_1.shortLocalCache : { allowCache: false }; let restOptions = { jsonMetadata: rest_types_1.jsonTypes.nometadata, ...cacheOptions }; try { let response = await (0, rest_1.GetJson)(restUrl, null, restOptions); if (!(0, typecheckers_1.isNullOrUndefined)(response)) { return _parseCustomActionReponse(response); } } catch { } return null; } exports.GetUserCustomActionById = GetUserCustomActionById; /** Get UserCustomAction by name from web/list */ async function GetUserCustomActionByName(siteUrl, name, listId, allowCache = true) { let restUrl = `${_getCustomActionsBaseRestUrl(siteUrl, { listId: listId })}?$filter=Name eq '${encodeURIComponent(name)}'`; let cacheOptions = allowCache === true ? rest_1.shortLocalCache : { allowCache: false }; let restOptions = { jsonMetadata: rest_types_1.jsonTypes.nometadata, ...cacheOptions }; try { let response = await (0, rest_1.GetJson)(restUrl, null, restOptions); if (!(0, typecheckers_1.isNullOrUndefined)(response) && !(0, typecheckers_1.isNullOrEmptyArray)(response.value)) { return response.value.map(_parseCustomActionReponse); } } catch { } return []; } exports.GetUserCustomActionByName = GetUserCustomActionByName; /** Add UserCustomAction to web/list */ async function AddUserCustomAction(siteUrl, userCustomActionInfo, listId) { let restUrl = _getCustomActionsBaseRestUrl(siteUrl, { listId: listId }); let restOptions = { jsonMetadata: rest_types_1.jsonTypes.nometadata, method: "POST", includeDigestInPost: true }; try { let data = _convertCustomActionToPostData(userCustomActionInfo); let response = await (0, rest_1.GetJson)(restUrl, JSON.stringify(data), restOptions); if (!(0, typecheckers_1.isNullOrUndefined)(response)) { return _parseCustomActionReponse(response); } } catch { } return null; } exports.AddUserCustomAction = AddUserCustomAction; /** Update UserCustomAction to web/list */ async function UpdateUserCustomAction(siteUrl, customActionId, userCustomActionInfo, listId) { let restUrl = _getCustomActionsBaseRestUrl(siteUrl, { listId: listId, actionId: customActionId }); let restOptions = { jsonMetadata: rest_types_1.jsonTypes.nometadata, method: "POST", xHttpMethod: "MERGE", includeDigestInPost: true }; try { let data = _convertCustomActionToPostData(userCustomActionInfo); let result = await (0, rest_1.GetJson)(restUrl, JSON.stringify(data), restOptions); return !(0, typecheckers_1.isNullOrUndefined)(result) && result["odata.null"] === true || (0, typecheckers_1.isNullOrEmptyString)(result); } catch { } return false; } exports.UpdateUserCustomAction = UpdateUserCustomAction; /** Delete UserCustomAction from web/list */ async function DeleteUserCustomAction(siteUrl, customActionId, listId) { let restUrl = _getCustomActionsBaseRestUrl(siteUrl, { listId: listId, actionId: customActionId }); let restOptions = { jsonMetadata: rest_types_1.jsonTypes.nometadata, method: "POST", xHttpMethod: "DELETE", includeDigestInPo