@pnp/cli-microsoft365
Version:
Manage Microsoft 365 and SharePoint Framework projects on any platform
215 lines • 9.75 kB
JavaScript
export const urlUtil = {
/**
* Returns server relative path.
* @param webUrl web full or web relative url e.g. https://contoso.sharepoint.com/sites/team1
* @param folderRelativePath folder relative path e.g. /Shared Documents
* @example
* // returns "/sites/team1"
* urlUtil.getServerRelativePath("https://contoso.sharepoint.com/sites/team1", "");
* @example
* // returns "/sites/team1/Shared Documents"
* urlUtil.getServerRelativePath("https://contoso.sharepoint.com/sites/team1", "/Shared Documents");
* @example
* // returns "/sites/team1/Shared Documents"
* urlUtil.getServerRelativePath("/sites/team1/", "/Shared Documents");
*/
getServerRelativePath(webUrl, folderRelativePath) {
let webRelativePath = this.getUrlRelativePath(webUrl);
let relativePathToRemove = webRelativePath;
// add '/' at 0
if (webRelativePath[0] !== '/') {
webRelativePath = `/${webRelativePath}`;
}
else {
relativePathToRemove = webRelativePath.substring(1);
}
// remove last '/' of webRelativePath
const webPathLastCharPos = webRelativePath.length - 1;
if (webRelativePath.length > 1 &&
webRelativePath[webPathLastCharPos] === '/') {
webRelativePath = webRelativePath.substring(0, webPathLastCharPos);
}
// remove the web relative path if it is contained in the folder relative path
const relativePathToRemoveIdx = folderRelativePath.toLowerCase().indexOf(relativePathToRemove.toLowerCase());
if (relativePathToRemoveIdx > -1) {
const pos = relativePathToRemoveIdx + relativePathToRemove.length;
folderRelativePath = folderRelativePath.substring(pos, folderRelativePath.length);
}
if (folderRelativePath !== '') {
// add '/' at 0 for siteRelativePath
if (folderRelativePath[0] !== '/') {
folderRelativePath = `/${folderRelativePath}`;
}
// remove last '/' of siteRelativePath
const folderPathLastCharPos = folderRelativePath.length - 1;
if (folderRelativePath[folderPathLastCharPos] === '/') {
folderRelativePath = folderRelativePath.substring(0, folderPathLastCharPos);
}
if (webRelativePath === '/' && folderRelativePath !== '') {
webRelativePath = folderRelativePath;
}
else {
webRelativePath = `${webRelativePath}${folderRelativePath}`;
}
}
return webRelativePath.replace('//', '/');
},
/**
* Returns server relative site url.
* @param webUrl web full or web relative url e.g. https://contoso.sharepoint.com/sites/team1
* @example
* // returns "/sites/team1"
* urlUtil.getServerRelativeSiteUrl("https://contoso.sharepoint.com/sites/team1";
* @example
* // returns ""
* urlUtil.getServerRelativeSiteUrl("https://contoso.sharepoint.com");
* @example
* // returns "/sites/team1/Shared Documents"
* urlUtil.getServerRelativePath("/sites/team1/", "/Shared Documents");
*/
getServerRelativeSiteUrl(webUrl) {
const serverRelativeSiteUrl = urlUtil.getServerRelativePath(webUrl, '');
// return an empty string instead of / to prevent // replies
return serverRelativeSiteUrl === '/' ? "" : serverRelativeSiteUrl;
},
/**
* Returns web relative path from webUrl and folderUrl.
* @param webUrl web full or web relative url e.g. https://contoso.sharepoint.com/sites/team1/
* @param folderUrl folder server relative url e.g. /sites/team1/Lists/MyList
* @example
* // returns "/Lists/MyList"
* Utils.getWebRelativePath("https://contoso.sharepoint.com/sites/team1/", "/sites/team1/Lists/MyList");
* @example
* // returns "/Shared Documents"
* Utils.getWebRelativePath("/sites/team1/", "/sites/team1/Shared Documents");
*/
getWebRelativePath(webUrl, folderUrl) {
let webRelativePath = this.getUrlRelativePath(webUrl);
let folderWebRelativePath = '';
// will be used to remove relative path from the folderRelativePath
// in case the web relative url is included
let relativePathToRemove = webRelativePath;
// add '/' at 0
if (webRelativePath[0] !== '/') {
webRelativePath = `/${webRelativePath}`;
}
else {
relativePathToRemove = webRelativePath.substring(1);
}
// remove last '/' of webRelativePath
const webPathLastCharPos = webRelativePath.length - 1;
if (webRelativePath.length > 1 &&
webRelativePath[webPathLastCharPos] === '/') {
webRelativePath = webRelativePath.substring(0, webPathLastCharPos);
}
// remove the web relative path if it is contained in the folder relative path
const relativePathToRemoveIdx = folderUrl.toLowerCase().indexOf(relativePathToRemove.toLowerCase());
if (relativePathToRemoveIdx > -1) {
const pos = relativePathToRemoveIdx + relativePathToRemove.length;
folderWebRelativePath = folderUrl.substring(pos, folderUrl.length);
}
else {
folderWebRelativePath = folderUrl;
}
// add '/' at 0 for folderWebRelativePath
if (folderWebRelativePath[0] !== '/') {
folderWebRelativePath = `/${folderWebRelativePath}`;
}
// remove last '/' of folderWebRelativePath
const folderPathLastCharPos = folderWebRelativePath.length - 1;
if (folderWebRelativePath.length > 1 && folderWebRelativePath[folderPathLastCharPos] === '/') {
folderWebRelativePath = folderWebRelativePath.substring(0, folderPathLastCharPos);
}
return folderWebRelativePath.replace('//', '/');
},
/**
* Returns the absolute URL according to a Web URL and the server relative URL of a folder
* @param webUrl The full URL of a web
* @param serverRelativeUrl The server relative URL of a folder
* @example
* // returns "https://contoso.sharepoint.com/sites/team1/Lists/MyList"
* urlUtil.getAbsoluteUrl("https://contoso.sharepoint.com/sites/team1/", "/sites/team1/Lists/MyList");
*/
getAbsoluteUrl(webUrl, serverRelativeUrl) {
const parsedUrl = new URL(webUrl);
if (serverRelativeUrl[0] !== '/') {
serverRelativeUrl = `/${serverRelativeUrl}`;
}
return `${parsedUrl.origin}${serverRelativeUrl}`;
},
/**
* Combines base and relative url considering any missing slashes
* @param baseUrl https://contoso.com
* @param relativeUrl sites/abc
*/
urlCombine(baseUrl, relativeUrl) {
// remove last '/' of base if exists
if (baseUrl.lastIndexOf('/') === baseUrl.length - 1) {
baseUrl = baseUrl.substring(0, baseUrl.length - 1);
}
// remove '/' at 0
if (relativeUrl.charAt(0) === '/') {
relativeUrl = relativeUrl.substring(1, relativeUrl.length);
}
// remove last '/' of next if exists
if (relativeUrl.lastIndexOf('/') === relativeUrl.length - 1) {
relativeUrl = relativeUrl.substring(0, relativeUrl.length - 1);
}
return `${baseUrl}/${relativeUrl}`;
},
/**
* Get the absolute URL from the target SharePoint URL.
* @param {string} webUrl - The base web URL.
* @param {string} url - The target SharePoint URL.
* @returns {string} - The target site absolute URL.
*
* Example Scenarios:
* - webUrl = "https://contoso.sharepoint.com" and targetUrl = "/teams/sales/Shared Documents/temp/123/234",
* returns "https://contoso.sharepoint.com/teams/sales".
* - webUrl = "https://contoso.sharepoint.com" and targetUrl = "https://contoso-my.sharepoint.com/personal/john_contoso_onmicrosoft_com/Documents/123",
* returns "https://contoso-my.sharepoint.com/personal/john_contoso_onmicrosoft_com".
* - webUrl = "https://contoso.sharepoint.com/teams/sales" and targetUrl = "/Shared Documents/temp",
* returns "https://contoso.sharepoint.com".
* - webUrl = "https://contoso.sharepoint.com" and targetUrl = "/teams/sales/Shared Documents/temp",
* returns "https://contoso.sharepoint.com/teams/sales".
*/
getTargetSiteAbsoluteUrl(webUrl, url) {
const fullUrl = url.startsWith('https://') ? url : urlUtil.getAbsoluteUrl(webUrl, url);
// Pattern to match SharePoint URLs
const urlPattern = /https:\/\/[\w\-]+\.sharepoint\.com\/(teams|sites|personal)\/([\w\-]+)/;
const match = fullUrl.match(urlPattern);
if (match) {
// If a match is found, return the matched URL
return match[0];
}
else {
// Extract the root URL
const rootUrl = new URL(fullUrl);
return rootUrl.origin;
}
},
/**
* Removes leading slashes from the URL.
* @param url The URL to process.
* @returns The URL without leading slashes.
*/
removeLeadingSlashes(url) {
return url.replace(/^\/+/, '');
},
/**
* Removes trailing slashes from the URL.
* @param url The URL to process.
* @returns The URL without trailing slashes.
*/
removeTrailingSlashes(url) {
return url.replace(/\/+$/, '');
},
getUrlRelativePath(url) {
if (url.includes('://')) {
const parsedUrl = new URL(url);
return url.substring(parsedUrl.origin.length);
}
return url;
}
};
//# sourceMappingURL=urlUtil.js.map