Files
fluent-url/lib/core/config-defaults.ts

60 lines
1.7 KiB
TypeScript

import { parseQuery, stringifyQuery } from '@/core/serializer/query-serializer'
import { deepClone } from '@/shared/helpers/deep-clone'
import { parseUrl } from './serializer/url-serializer'
export function normalizeConfig(
config?: Partial<FluentUrlConfig>,
): FluentUrlConfig {
return {
parseQuery: config?.parseQuery ?? parseQuery,
stringifyQuery: config?.stringifyQuery ?? stringifyQuery,
}
}
export function normalizeOptions(args: {
urlOptions?: Partial<FLuentUrlPlainObject> | string
parseQuery: QuerySerializer['parseQuery']
}): FLuentUrlPlainObject {
const { urlOptions: urlOrOptions, parseQuery } = args
if (typeof urlOrOptions === 'string') {
return parseUrl({
str: urlOrOptions,
parseQuery: parseQuery,
})
}
return {
protocol: urlOrOptions?.protocol,
hostname: urlOrOptions?.hostname,
paths: deepClone(urlOrOptions?.paths) ?? [],
port: urlOrOptions?.port,
fragment: urlOrOptions?.fragment,
queries: deepClone(urlOrOptions?.queries) ?? Object.create(null),
}
}
export function mergeConfig(
current: FluentUrlConfig,
merge?: Partial<FluentUrlConfig>,
): FluentUrlConfig {
return {
parseQuery: merge?.parseQuery ?? current.parseQuery,
stringifyQuery: merge?.stringifyQuery ?? current.stringifyQuery,
}
}
export function mergeOptions(
current: FLuentUrlPlainObject,
merge?: Partial<FLuentUrlPlainObject>,
): FLuentUrlPlainObject {
return {
protocol: merge?.protocol ?? current.protocol,
hostname: merge?.hostname ?? current.hostname,
paths: merge?.paths ?? current.paths,
port: merge?.port ?? current.port,
fragment: merge?.fragment ?? current.fragment,
queries: merge?.queries ?? current.queries,
}
}