feature/host-overrides (#161)
* configurable host overrides * base host overrides on name of service instead of key and hide the options by default * added unit tests * review changes * Refactor options * Refactor * Update Readme * Pump version and update Changelog Co-authored-by: Tobias Jacksteit <me@xtj7.de>
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import UrlPattern from "url-pattern"
|
||||
import { isFunction, isUndefined, compose, toPairs, map, pipe, isNil } from "lodash/fp"
|
||||
import { isFunction, isUndefined, compose, toPairs, map, pipe, isNil, reduce } from "lodash/fp"
|
||||
import { asArray } from "./index"
|
||||
import queryString from "query-string"
|
||||
|
||||
@@ -19,7 +19,7 @@ function parseUrl(url) {
|
||||
|
||||
function extractQueryParams(queryParams, query) {
|
||||
return toPairs(queryParams).reduce((acc, [key, params]) => {
|
||||
const param = asArray(params).find(param => !isNil(query[param]))
|
||||
const param = asArray(params).find((param) => !isNil(query[param]))
|
||||
if (param) {
|
||||
acc[key] = query[param]
|
||||
}
|
||||
@@ -27,7 +27,7 @@ function extractQueryParams(queryParams, query) {
|
||||
}, {})
|
||||
}
|
||||
|
||||
const createEvaluator = args => fnOrValue => {
|
||||
const createEvaluator = (args) => (fnOrValue) => {
|
||||
if (isUndefined(fnOrValue)) {
|
||||
return
|
||||
}
|
||||
@@ -39,21 +39,35 @@ const createEvaluator = args => fnOrValue => {
|
||||
return fnOrValue
|
||||
}
|
||||
|
||||
const prepareHostForRegExp = (host) => {
|
||||
return host.replace(":", "\\:")
|
||||
}
|
||||
|
||||
const replaceHostInPattern = (host, pattern) => {
|
||||
if (typeof pattern === "string") {
|
||||
return pattern.replace(":host:", prepareHostForRegExp(host))
|
||||
} else if (pattern instanceof RegExp) {
|
||||
return new RegExp(pattern.source.replace(":host:", prepareHostForRegExp(host)))
|
||||
} else {
|
||||
return pattern
|
||||
}
|
||||
}
|
||||
|
||||
const parseServices = compose(
|
||||
map(([key, config]) => ({
|
||||
...config,
|
||||
key,
|
||||
patterns: config.urlPatterns.map(pattern => {
|
||||
patterns: config.urlPatterns.map((pattern) => {
|
||||
if (Array.isArray(pattern)) {
|
||||
return new UrlPattern(...pattern)
|
||||
return new UrlPattern(...pattern.map((p) => replaceHostInPattern(config.host, p)))
|
||||
}
|
||||
return new UrlPattern(pattern)
|
||||
return new UrlPattern(replaceHostInPattern(config.host, pattern))
|
||||
}),
|
||||
})),
|
||||
toPairs,
|
||||
)
|
||||
|
||||
export const createEnhancer = document => service => {
|
||||
export const createEnhancer = (document) => (service) => {
|
||||
if (!service) {
|
||||
return
|
||||
}
|
||||
@@ -72,18 +86,34 @@ export const createEnhancer = document => service => {
|
||||
}
|
||||
}
|
||||
|
||||
export const createMatcher = remoteServices => {
|
||||
const services = parseServices(remoteServices)
|
||||
return tabUrl => {
|
||||
const applyHostOverrides = (remoteServices, hostOverrides) =>
|
||||
pipe(
|
||||
toPairs,
|
||||
reduce((acc, [key, remoteService]) => {
|
||||
acc[key] = {
|
||||
...remoteService,
|
||||
key,
|
||||
host: hostOverrides[remoteService.name] || remoteService.host,
|
||||
}
|
||||
return acc
|
||||
}, {}),
|
||||
)(remoteServices)
|
||||
|
||||
export const createMatcher = (remoteServices, hostOverrides) => {
|
||||
const services = parseServices(applyHostOverrides(remoteServices, hostOverrides))
|
||||
|
||||
return (tabUrl) => {
|
||||
const { origin, pathname, hash, query } = parseUrl(tabUrl)
|
||||
const url = `${origin}${pathname}${hash}`
|
||||
const service = services.find(service => service.patterns.some(pattern => pattern.match(url)))
|
||||
const service = services.find((service) => {
|
||||
return service.patterns.some((pattern) => pattern.match(url))
|
||||
})
|
||||
|
||||
if (!service) {
|
||||
return
|
||||
}
|
||||
|
||||
const pattern = service.patterns.find(pattern => pattern.match(url))
|
||||
const pattern = service.patterns.find((pattern) => pattern.match(url))
|
||||
let match = pattern.match(url)
|
||||
if (service.queryParams) {
|
||||
const extractedQueryParams = extractQueryParams(service.queryParams, query)
|
||||
@@ -99,11 +129,8 @@ export const createMatcher = remoteServices => {
|
||||
}
|
||||
}
|
||||
|
||||
export const createServiceFinder = remoteServices => document => {
|
||||
const matcher = createMatcher(remoteServices)
|
||||
export const createServiceFinder = (remoteServices, hostOverrides) => (document) => {
|
||||
const matcher = createMatcher(remoteServices, hostOverrides)
|
||||
const enhancer = createEnhancer(document)
|
||||
return pipe(
|
||||
matcher,
|
||||
enhancer,
|
||||
)
|
||||
return pipe(matcher, enhancer)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user