{"version":3,"sources":["../../../packages/core/data/uri-builder.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,qBAAa,UAAU;IACnB,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,WAAW,CAA6B;IAEhD;;;OAGG;gBACS,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG;IAiC9B,oDAAoD;IAC7C,QAAQ,EAAE,MAAM,CAAC;IAExB,qFAAqF;IAC9E,IAAI,EAAE,MAAM,CAAC;IAEpB,2DAA2D;IAC3D,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,2DAA2D;IAC3D,IAAW,IAAI,CAAC,KAAK,EAAE,MAAM,EA0B5B;IAED,+CAA+C;IACxC,IAAI,EAAE,MAAM,CAAC;IAEpB,sDAAsD;IACtD,IAAW,KAAK,IAAI,MAAM,CAmBzB;IAED,sDAAsD;IACtD,IAAW,KAAK,CAAC,KAAK,EAAE,MAAM,EAuB7B;IAED,+CAA+C;IACxC,MAAM,EAAE,MAAM,CAAC;IAEtB,wDAAwD;IACxD,IAAW,GAAG,IAAI,GAAG,CAEpB;IAED,OAAO,KAAK,gBAAgB,GA6B3B;IAED;;;OAGG;IACI,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3C;;;;;OAKG;IACI,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI3D,oDAAoD;IAC7C,QAAQ,IAAI,MAAM;IAsCzB,8DAA8D;IACvD,KAAK,IAAI,UAAU;CAkB7B","file":"uri-builder.d.ts","sourcesContent":["/** Represents an object that builds Uniform Resource Identifiers (URIs). */\r\nexport class UriBuilder {\r\n    private segments = new Array<string>();\r\n    private queryParams = new Map<string, string>();\r\n\r\n    /**\r\n     * Initializes a new instance of the UriBuilder.\r\n     * @param uri The optional string or URL to initialize the builder from.\r\n     */\r\n    constructor(uri?: string | URL) {\r\n        if (uri === undefined) {\r\n            this.fragment = '';\r\n            this.host = '';\r\n            this.scheme = '';\r\n            this.port = -1;\r\n            return;\r\n        }\r\n\r\n        const url: URL = typeof uri === 'string' ? new URL(uri) : uri;\r\n\r\n        this.fragment = url.hash ? url.hash.substring(1) : '';\r\n        this.host = url.hostname || '';\r\n        this.scheme = url.protocol ? url.protocol.substring(0, url.protocol.length - 1) : '';\r\n        this.port = url.port ? this.port = Number.parseInt(url.port, 10) : -1;\r\n\r\n        if (url.pathname) {\r\n            const paths = url.pathname.substring(1).split('/');\r\n\r\n            for (let i = 0; i < paths.length; i++) {\r\n                const segment = paths[i];\r\n\r\n                if (segment) {\r\n                    this.segments.push(segment);\r\n                }\r\n            }\r\n        }\r\n\r\n        url.searchParams.forEach((v, k) => {\r\n            this.queryParams.set(k, v);\r\n        });\r\n    }\r\n\r\n    /** Gets or sets the fragment portion of the URI. */\r\n    public fragment: string;\r\n\r\n    /** Gets or sets the Domain Name System (DNS) host name or IP address of a server. */\r\n    public host: string;\r\n\r\n    /** Gets the path to the resource referenced by the URI. */\r\n    public get path(): string {\r\n        return this.segments.join('/');\r\n    }\r\n\r\n    /** Sets the path to the resource referenced by the URI. */\r\n    public set path(value: string) {\r\n        this.segments = new Array<string>();\r\n\r\n        if (!value) {\r\n            return;\r\n        }\r\n\r\n        value = value.trim();\r\n\r\n        if (value.length === 0) {\r\n            return;\r\n        }\r\n\r\n        if (value[0] === '/') {\r\n            value = value.substring(1, value.length);\r\n        }\r\n\r\n        if (value[value.length - 1] === '/') {\r\n            value = value.substring(0, value.length - 1);\r\n        }\r\n\r\n        const newSegments = value.split('/');\r\n\r\n        for (let i = 0; i < newSegments.length; i++) {\r\n            this.segments.push(newSegments[i]);\r\n        }\r\n    }\r\n\r\n    /** Gets or sets the port number of the URI. */\r\n    public port: number;\r\n\r\n    /** Gets any query information included in the URI. */\r\n    public get query(): string {\r\n        let value = '';\r\n\r\n        const iterator = this.queryParams.entries();\r\n        let result = iterator.next();\r\n\r\n        if (!result.done) {\r\n            let [k, v] = result.value;\r\n            value += `${k}=${v}`;\r\n            result = iterator.next();\r\n\r\n            while (!result.done) {\r\n                [k, v] = result.value;\r\n                value += `&${k}=${v}`;\r\n                result = iterator.next();\r\n            }\r\n        }\r\n\r\n        return value;\r\n    }\r\n\r\n    /** Sets the query information included in the URI. */\r\n    public set query(value: string) {\r\n        this.queryParams.clear();\r\n\r\n        if (!value) {\r\n            return;\r\n        }\r\n\r\n        value = value.trim();\r\n\r\n        if (value[0] === '?') {\r\n            value = value.substring(1).trim();\r\n        }\r\n\r\n        if (value.length === 0) {\r\n            return;\r\n        }\r\n\r\n        const pairs = value.split('&');\r\n\r\n        for (let i = 0; i < pairs.length; i++) {\r\n            const pair = pairs[i].trim().split('=');\r\n            this.queryParams.set(pair[0], pair[1]);\r\n        }\r\n    }\r\n\r\n    /** Gets or sets the scheme name of the URI. */\r\n    public scheme: string;\r\n\r\n    /** Gets the URL instance constructed by the builder. */\r\n    public get uri(): URL {\r\n        return new URL(this.toString());\r\n    }\r\n\r\n    private get usingDefaultPort(): boolean {\r\n\r\n        if (!this.scheme) {\r\n            return false;\r\n        }\r\n\r\n        // non-exhaustive list of common application protocol ports\r\n        switch (this.scheme.toUpperCase()) {\r\n            case 'HTTP':\r\n                return this.port === 80;\r\n            case 'HTTPS':\r\n                return this.port === 443;\r\n            case 'FTP':\r\n                return this.port === 20 || this.port === 21;\r\n            case 'SSH':\r\n                return this.port === 22;\r\n            case 'TELNET':\r\n                return this.port === 23;\r\n            case 'SMTP':\r\n                return this.port === 25;\r\n            case 'DNS':\r\n                return this.port === 53;\r\n            case 'POP3':\r\n                return this.port === 113;\r\n            case 'LDAP':\r\n                return this.port === 389;\r\n        }\r\n\r\n        return false;\r\n    }\r\n\r\n    /**\r\n     * Appends the specified segment to the path.\r\n     * @param segment The segment to append.\r\n     */\r\n    public appendSegment(segment: string): void {\r\n        this.segments.push(segment);\r\n    }\r\n\r\n    /**\r\n     * Sets the specified name/value pair in the query string.\r\n     * Duplicate query parameters are not supported.\r\n     * @param name The name of the query parameter.\r\n     * @param value The value of the query parameter.\r\n     */\r\n    public setQueryParameter(name: string, value: string): void {\r\n        this.queryParams.set(name, value);\r\n    }\r\n\r\n    /** Returns the string equivalent of the builder. */\r\n    public toString(): string {\r\n        let uri = '';\r\n\r\n        if (this.scheme) {\r\n            uri = this.scheme;\r\n        }\r\n\r\n        if (this.host) {\r\n            if (uri.length > 0) {\r\n                uri += '://';\r\n            }\r\n\r\n            uri += this.host;\r\n\r\n            if (this.port >= 0 && !this.usingDefaultPort) {\r\n                uri += ':' + this.port.toString();\r\n            }\r\n        }\r\n\r\n        if (this.segments.length > 0) {\r\n            if (uri.length > 0) {\r\n                uri += '/';\r\n            }\r\n\r\n            uri += this.path;\r\n\r\n            if (this.queryParams.size > 0) {\r\n                uri += '?' + this.query;\r\n            }\r\n\r\n            if (this.fragment) {\r\n                uri += '#' + this.fragment;\r\n            }\r\n        }\r\n\r\n        return uri;\r\n    }\r\n\r\n    /** Creates and returns a deep copy of the current builder. */\r\n    public clone(): UriBuilder {\r\n        const builder = new UriBuilder();\r\n\r\n        builder.fragment = this.fragment;\r\n        builder.host = this.host;\r\n        builder.scheme = this.scheme;\r\n        builder.port = this.port;\r\n\r\n        for (let i = 0; i < this.segments.length; i++) {\r\n            builder.segments.push(this.segments[i]);\r\n        }\r\n\r\n        this.queryParams.forEach((v, k) => {\r\n            builder.queryParams.set(k, v);\r\n        });\r\n\r\n        return builder;\r\n    }\r\n}\r\n"]}