///
import string from '../string/index';
import array from '../array/index';
import fn from '../fn/index';
/**
* @obj
* @desc desc
* @method parseParams - 解析URL的参数部分的函数
* @method parseUrl - 解析URL的函数
*/
const net: NetModule = {
parseParams: function (locationSearch: string): object {
let first = (arr: any[]) => arr[0];
let last = (arr: any[]) => arr[arr.length - 1];
let hasQuestionMark = (locationSearch: string) => locationSearch.includes('?') ? locationSearch : `?${locationSearch}`;
let separateOutParams = fn.compose(last, string.split('?'), hasQuestionMark);
let groupingParams: (paramsStr: string) => string[][] = fn.compose(array.map(string.split('=')), string.split('&'));
let getParams = (paramsArr: string[][]) => {
let params: any = {};
paramsArr.forEach((param: string[]) => {
if (first(param)) {
params[first(param)] = last(param);
}
});
return params;
};
let paramsStr: string = separateOutParams(locationSearch);
let paramsArr: string[][] = groupingParams(paramsStr);
let params: object = getParams(paramsArr);
return params;
},
parseUrl: function (url: string): UrlInfoObject {
const HOST_PORT_REGEXP = /^(http:\/\/|https:\/\/)[0-9a-zA-Z.:]+/;
const HOST_REGEXP = /^(http:\/\/|https:\/\/)[0-9a-zA-Z.]+/;
/* function */
let first = (arr: any[]) => arr[0];
let last = (arr: any[]) => arr[arr.length - 1];
let checkPort = (port: string) => port ? port : 80;
let checkPath = (path: string) => path ? path : '/';
let checkParams = (url: string) => url.includes('?') ? url : '';
let separateOutHref: Fn = fn.compose(first, string.split('?'));
let separateOutParams: Fn = fn.compose(last, string.split('?'), checkParams);
let matchHost: Fn = fn.compose(first, string.match(HOST_PORT_REGEXP));
let groupingParams: (paramsStr: string) => string[][] = fn.compose(array.map(string.split('=')), string.split('&'));
let getParams = (paramsArr: string[][]) => {
let params: ArrayObject = {};
paramsArr.forEach((param: string[]) => {
if (first(param)) {
params[first(param)] = last(param);
}
});
return params;
};
let getHost: Fn = fn.compose(first, string.match(HOST_REGEXP));
let getPort: (host: string) => Fn = (host: string) => fn.compose(checkPort, last, string.split(':'), last, string.split(host));
/* var */
let href: string = separateOutHref(url);
let paramsStr: string = separateOutParams(url);
let hostWithPort: string = matchHost(href);
let host: string = getHost(hostWithPort);
let port: number = getPort(host)(hostWithPort);
let path: string = fn.compose(checkPath, last, string.split(hostWithPort))(href);
let paramsArr: string[][] = groupingParams(paramsStr);
let params: object = getParams(paramsArr);
const urlMsg: UrlInfoObject = { url, host, port, path, params };
return urlMsg;
}
};
export default net;
export const parseParams = net.parseParams;
export const parseUrl = net.parseUrl;