gooddata-js v13.5.0

File: src/config.ts

                        // (C) 2007-2014 GoodData Corporation
                        import set from "lodash/set";
                        import get from "lodash/get";
                        
                        /**
                         * Config module holds SDK configuration variables
                         *
                         * Currently its only custom domain - which enabled using
                         * sdk from different domain (using CORS)
                         *
                         * Never set properties directly - always use setter methods
                         *
                         * @module config
                         * @class config
                         */
                        
                        const URL_REGEXP = "(?:(https)://+|(www\\.)?)\\w[:;,\\.?\\[\\]\\w/~%&=+#-@!]*";
                        
                        export function sanitizeDomain(domain: string | null) {
                            if (domain === null) {
                                return undefined;
                            }
                        
                            const sanitizedDomain = domain || "";
                            const link = sanitizedDomain.match(URL_REGEXP);
                            if (!link) {
                                throw new Error(`${domain} is not a valid url`);
                            }
                        
                            // ensure https:// prefix and strip possible trailing /
                            return `https://${link[0].replace(/^https?:\/\/|\/$/g, "")}`;
                        }
                        
                        /**
                         * Returns sanitized config
                         *
                         * @method sanitizeConfig
                         * @return {object|undefined} config with sanitized domain
                         */
                        export function sanitizeConfig(config: any) {
                            const sanitized = { ...config };
                            if (config.domain) {
                                sanitized.domain = sanitizeDomain(config.domain);
                            }
                            return sanitized;
                        }
                        
                        export interface IOriginPackage {
                            name: string;
                            version: string;
                        }
                        
                        export interface IConfigStorage {
                            domain?: string;
                            originPackage?: IOriginPackage;
                        }
                        
                        /**
                         * Config factory
                         *
                         * @param {object|null} configStorage config object
                         * @method createModule
                         * @return SDK config module
                         */
                        export class ConfigModule {
                            constructor(private configStorage: IConfigStorage) {
                                if (arguments.length !== 1) {
                                    throw new Error("Config module has to be called with exactly one argument.");
                                }
                            }
                        
                            /**
                             * Sets custom domain. Parameter is url which has always to be https://
                             * (if you don't provide it, we will do it for you).
                             *
                             * RegExp inspired taken from
                             * https://github.com/jarib/google-closure-library/blob/master/closure/goog/string/linkify.js
                             * @param {String|null} domain valid domain starting with https:// or null for removing
                             * @method setCustomDomain
                             */
                            public setCustomDomain(domain: string) {
                                this.configStorage.domain = sanitizeDomain(domain);
                            }
                        
                            /**
                             * Returns current domain
                             *
                             * @method getCustomDomain
                             */
                            public getCustomDomain() {
                                return this.configStorage.domain;
                            }
                        
                            /**
                             * Sets JS package and version info
                             *
                             * @method setJsPackage
                             * @param {String} name package name
                             * @param {String} version package version (semver)
                             * @private
                             */
                            public setJsPackage(name: string, version: string) {
                                if (!this.configStorage.originPackage) {
                                    // only set the first (topmost) package
                                    this.configStorage.originPackage = { name, version };
                                }
                            }
                        
                            /**
                             * Returns JS package and version info
                             *
                             * @method getJsPackage
                             * @return {object} with 'name' and 'version' properties
                             * @private
                             */
                            public getJsPackage() {
                                return this.configStorage.originPackage;
                            }
                        
                            public setRequestHeader(key: string, value: string) {
                                set(this.configStorage, ["xhrSettings", "headers", key], value);
                            }
                        
                            public getRequestHeader(key: string) {
                                return get(this.configStorage, ["xhrSettings", "headers", key]);
                            }
                        }