UNPKG

@roxi/routify

Version:

55 lines (49 loc) 2.25 kB
/** * @typedef { Object } RouterOptionsNormalizedOverlay * @prop { UrlRewrite[] } urlRewrite hook: transforms paths to and from router and browser * @prop { RouterInitCallback[] } beforeRouterInit hook: runs before each router initiation * @prop { RouterInitCallback[] } afterRouterInit hook: runs after each router initiation * @prop { AfterRouteRenderedCallback[] } afterRouteRendered hook: runs after each router initiation * @prop { BeforeUrlChangeCallback[] } beforeUrlChange hook: guard that runs before url changes * @prop { AfterUrlChangeCallback[] } afterUrlChange hook: runs after url has changed * @prop { AfterRouteRenderedCallback[] } afterUrlChange hook: runs after route has been rendered * @prop { TransformFragmentsCallback[] } transformFragments hook: transform route fragments after navigation * @prop { OnMountRouterCallback[] } onMount hook: runs when router is mounted * @prop { OnDestroyRouterCallback[] } onDestroy hook: runs before router is destroyed */ /** * @typedef { RoutifyRuntimeOptions & RouterOptionsNormalizedOverlay } RouterOptionsNormalized */ /** * merges options.plugin into options * @param {Partial<RoutifyRuntimeOptions>} options * @param {Partial<RouterOptionsNormalized>=} config */ export const normalizeRouterOptions = (options, config) => { config = config || { name: '', beforeRouterInit: [], afterRouterInit: [], urlRewrite: [], beforeUrlChange: [], afterUrlChange: [], afterRouteRendered: [], transformFragments: [], onMount: [], onDestroy: [], } // separate plugins and options const { plugins, ...optionsOnly } = options /** @type {Partial<RoutifyRuntimeOptions>[]} */ const optionsGroups = [...(plugins || []), optionsOnly] optionsGroups.forEach(pluginOptions => { pluginOptions.plugins?.forEach(plugin => normalizeRouterOptions(plugin, config)) delete pluginOptions.plugins Object.entries(pluginOptions).forEach(([field, value]) => { if (Array.isArray(config[field])) config[field].push(...[value].flat().filter(Boolean)) else config[field] = value || config[field] }) }) return config }