diff --git a/lib/core/config-defaults.ts b/lib/core/config-defaults.ts index 15a8934..7ac6624 100644 --- a/lib/core/config-defaults.ts +++ b/lib/core/config-defaults.ts @@ -2,7 +2,9 @@ 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?: FluentUrlConfig): FluentUrlConfig { +export function normalizeConfig( + config?: Partial, +): FluentUrlConfig { return { parseQuery: config?.parseQuery ?? parseQuery, stringifyQuery: config?.stringifyQuery ?? stringifyQuery, @@ -31,3 +33,27 @@ export function normalizeOptions(args: { queries: deepClone(urlOrOptions?.queries) ?? Object.create(null), } } + +export function mergeConfig( + current: FluentUrlConfig, + merge?: Partial, +): FluentUrlConfig { + return { + parseQuery: merge?.parseQuery ?? current.parseQuery, + stringifyQuery: merge?.stringifyQuery ?? current.stringifyQuery, + } +} + +export function mergeOptions( + current: FLuentUrlPlainObject, + merge?: Partial, +): 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, + } +} diff --git a/lib/core/fluent-url.ts b/lib/core/fluent-url.ts index 8244500..65b3faa 100644 --- a/lib/core/fluent-url.ts +++ b/lib/core/fluent-url.ts @@ -1,4 +1,9 @@ -import { normalizeConfig, normalizeOptions } from '@/core/config-defaults' +import { + mergeConfig, + mergeOptions, + normalizeConfig, + normalizeOptions, +} from '@/core/config-defaults' import { deepClone } from '@/shared/helpers/deep-clone' import { stringifyUrl } from './serializer/url-serializer' @@ -13,7 +18,7 @@ export class FluentUrl { constructor( urlOrOptions?: Partial | string, - config?: FluentUrlConfig, + config?: Partial, ) { this.config = normalizeConfig(config) @@ -69,18 +74,18 @@ export class FluentUrl { config?: FluentUrlConfig, ): FluentUrl { return new FluentUrl( - { - protocol: options?.protocol ?? this.protocol, - hostname: options?.hostname ?? this.hostname, - paths: options?.paths ?? this.paths, - port: options?.port ?? this.port, - fragment: options?.fragment ?? this.fragment, - queries: options?.queries ?? this.queries, - }, - { - parseQuery: config?.parseQuery ?? this.config.parseQuery, - stringifyQuery: config?.stringifyQuery ?? this.config.stringifyQuery, - }, + mergeOptions( + { + protocol: this.protocol, + hostname: this.hostname, + paths: this.paths, + port: this.port, + fragment: this.fragment, + queries: this.queries, + }, + options, + ), + mergeConfig(this.config, config), ) } }