@spartacus/core
Version:
Spartacus - the core framework
64 lines • 8.55 kB
JavaScript
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "../config/page-meta.config";
import * as i2 from "../../../window/window-ref";
/**
* Service to add links to the page meta data, such canonical URLs.
*/
export class PageLinkService {
constructor(pageMetaConfig, winRef) {
this.pageMetaConfig = pageMetaConfig;
this.winRef = winRef;
}
/**
* Returns the canonical for the page.
*
* The canonical url is created by the help of the default `CanonicalUrlOptions` from
* the pageMeta options. The options can be further adjusted by the options argument.
*/
getCanonicalUrl(options, url) {
var _a, _b, _c;
const config = Object.assign(Object.assign({}, (_b = (_a = this.pageMetaConfig) === null || _a === void 0 ? void 0 : _a.pageMeta) === null || _b === void 0 ? void 0 : _b.canonicalUrl), options);
return this.buildCanonicalUrl((_c = url !== null && url !== void 0 ? url : this.winRef.location.href) !== null && _c !== void 0 ? _c : '', config);
}
buildCanonicalUrl(url, options) {
if (options.forceHttps) {
url = url.replace(/^http(?!s):/i, 'https:');
}
if (options.forceWww) {
// this will not allow for not adding wwww. in case of a subdomain
url = url.replace(/^(https?:\/\/)(?!www\.)(.*)/i, '$1www.$2');
}
if (options.removeQueryParams) {
url = this.removeQueryParams(url, options);
}
if (options.forceTrailingSlash) {
url = url.replace(/^([^\?]+[^\/\?]$)$/i, '$1/');
}
return url;
}
removeQueryParams(url, config) {
const queryPos = url.indexOf('?');
if (queryPos > -1) {
const urlBeforeQueryParam = url.substr(0, queryPos);
const params = new URLSearchParams(url.substr(queryPos));
url = urlBeforeQueryParam;
if (Array.isArray(config.removeQueryParams)) {
config.removeQueryParams.forEach((param) => {
params.delete(param);
});
if (params.toString().length > 0) {
url = `${urlBeforeQueryParam}?${params.toString()}`;
}
}
}
return url;
}
}
PageLinkService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: PageLinkService, deps: [{ token: i1.PageMetaConfig }, { token: i2.WindowRef }], target: i0.ɵɵFactoryTarget.Injectable });
PageLinkService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: PageLinkService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: PageLinkService, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}], ctorParameters: function () { return [{ type: i1.PageMetaConfig }, { type: i2.WindowRef }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1saW5rLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL3NyYy9jbXMvcGFnZS9yb3V0aW5nL3BhZ2UtbGluay5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUFPM0M7O0dBRUc7QUFFSCxNQUFNLE9BQU8sZUFBZTtJQUMxQixZQUNZLGNBQThCLEVBQzlCLE1BQWlCO1FBRGpCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixXQUFNLEdBQU4sTUFBTSxDQUFXO0lBQzFCLENBQUM7SUFFSjs7Ozs7T0FLRztJQUNILGVBQWUsQ0FBQyxPQUE2QixFQUFFLEdBQVk7O1FBQ3pELE1BQU0sTUFBTSxtQ0FDUCxNQUFBLE1BQUEsSUFBSSxDQUFDLGNBQWMsMENBQUUsUUFBUSwwQ0FBRSxZQUFZLEdBQzNDLE9BQU8sQ0FDWCxDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQzNCLE1BQUEsR0FBRyxhQUFILEdBQUcsY0FBSCxHQUFHLEdBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxtQ0FBSSxFQUFFLEVBQ3RDLE1BQU0sQ0FDUCxDQUFDO0lBQ0osQ0FBQztJQUVTLGlCQUFpQixDQUN6QixHQUFXLEVBQ1gsT0FBNEI7UUFFNUIsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFO1lBQ3RCLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUM3QztRQUVELElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRTtZQUNwQixrRUFBa0U7WUFDbEUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsOEJBQThCLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDL0Q7UUFFRCxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRTtZQUM3QixHQUFHLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUM1QztRQUVELElBQUksT0FBTyxDQUFDLGtCQUFrQixFQUFFO1lBQzlCLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ2pEO1FBRUQsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRVMsaUJBQWlCLENBQ3pCLEdBQVcsRUFDWCxNQUEyQjtRQUUzQixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ2pCLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDcEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBRXpELEdBQUcsR0FBRyxtQkFBbUIsQ0FBQztZQUUxQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEVBQUU7Z0JBQzNDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDekMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdkIsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDaEMsR0FBRyxHQUFHLEdBQUcsbUJBQW1CLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7aUJBQ3JEO2FBQ0Y7U0FDRjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQzs7NEdBcEVVLGVBQWU7Z0hBQWYsZUFBZSxjQURGLE1BQU07MkZBQ25CLGVBQWU7a0JBRDNCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgV2luZG93UmVmIH0gZnJvbSAnLi4vLi4vLi4vd2luZG93L3dpbmRvdy1yZWYnO1xuaW1wb3J0IHtcbiAgQ2Fub25pY2FsVXJsT3B0aW9ucyxcbiAgUGFnZU1ldGFDb25maWcsXG59IGZyb20gJy4uL2NvbmZpZy9wYWdlLW1ldGEuY29uZmlnJztcblxuLyoqXG4gKiBTZXJ2aWNlIHRvIGFkZCBsaW5rcyB0byB0aGUgcGFnZSBtZXRhIGRhdGEsIHN1Y2ggY2Fub25pY2FsIFVSTHMuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgUGFnZUxpbmtTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHBhZ2VNZXRhQ29uZmlnOiBQYWdlTWV0YUNvbmZpZyxcbiAgICBwcm90ZWN0ZWQgd2luUmVmOiBXaW5kb3dSZWZcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjYW5vbmljYWwgZm9yIHRoZSBwYWdlLlxuICAgKlxuICAgKiBUaGUgY2Fub25pY2FsIHVybCBpcyBjcmVhdGVkIGJ5IHRoZSBoZWxwIG9mIHRoZSBkZWZhdWx0IGBDYW5vbmljYWxVcmxPcHRpb25zYCBmcm9tXG4gICAqIHRoZSBwYWdlTWV0YSBvcHRpb25zLiBUaGUgb3B0aW9ucyBjYW4gYmUgZnVydGhlciBhZGp1c3RlZCBieSB0aGUgb3B0aW9ucyBhcmd1bWVudC5cbiAgICovXG4gIGdldENhbm9uaWNhbFVybChvcHRpb25zPzogQ2Fub25pY2FsVXJsT3B0aW9ucywgdXJsPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb25maWc6IENhbm9uaWNhbFVybE9wdGlvbnMgPSB7XG4gICAgICAuLi50aGlzLnBhZ2VNZXRhQ29uZmlnPy5wYWdlTWV0YT8uY2Fub25pY2FsVXJsLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmJ1aWxkQ2Fub25pY2FsVXJsKFxuICAgICAgdXJsID8/IHRoaXMud2luUmVmLmxvY2F0aW9uLmhyZWYgPz8gJycsXG4gICAgICBjb25maWdcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkQ2Fub25pY2FsVXJsKFxuICAgIHVybDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IENhbm9uaWNhbFVybE9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICBpZiAob3B0aW9ucy5mb3JjZUh0dHBzKSB7XG4gICAgICB1cmwgPSB1cmwucmVwbGFjZSgvXmh0dHAoPyFzKTovaSwgJ2h0dHBzOicpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmZvcmNlV3d3KSB7XG4gICAgICAvLyB0aGlzIHdpbGwgbm90IGFsbG93IGZvciBub3QgYWRkaW5nIHd3d3cuIGluIGNhc2Ugb2YgYSBzdWJkb21haW5cbiAgICAgIHVybCA9IHVybC5yZXBsYWNlKC9eKGh0dHBzPzpcXC9cXC8pKD8hd3d3XFwuKSguKikvaSwgJyQxd3d3LiQyJyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucmVtb3ZlUXVlcnlQYXJhbXMpIHtcbiAgICAgIHVybCA9IHRoaXMucmVtb3ZlUXVlcnlQYXJhbXModXJsLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5mb3JjZVRyYWlsaW5nU2xhc2gpIHtcbiAgICAgIHVybCA9IHVybC5yZXBsYWNlKC9eKFteXFw/XStbXlxcL1xcP10kKSQvaSwgJyQxLycpO1xuICAgIH1cblxuICAgIHJldHVybiB1cmw7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVtb3ZlUXVlcnlQYXJhbXMoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgY29uZmlnOiBDYW5vbmljYWxVcmxPcHRpb25zXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgcXVlcnlQb3MgPSB1cmwuaW5kZXhPZignPycpO1xuICAgIGlmIChxdWVyeVBvcyA+IC0xKSB7XG4gICAgICBjb25zdCB1cmxCZWZvcmVRdWVyeVBhcmFtID0gdXJsLnN1YnN0cigwLCBxdWVyeVBvcyk7XG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5zdWJzdHIocXVlcnlQb3MpKTtcblxuICAgICAgdXJsID0gdXJsQmVmb3JlUXVlcnlQYXJhbTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLnJlbW92ZVF1ZXJ5UGFyYW1zKSkge1xuICAgICAgICBjb25maWcucmVtb3ZlUXVlcnlQYXJhbXMuZm9yRWFjaCgocGFyYW0pID0+IHtcbiAgICAgICAgICBwYXJhbXMuZGVsZXRlKHBhcmFtKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChwYXJhbXMudG9TdHJpbmcoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdXJsID0gYCR7dXJsQmVmb3JlUXVlcnlQYXJhbX0/JHtwYXJhbXMudG9TdHJpbmcoKX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1cmw7XG4gIH1cbn1cbiJdfQ==