import type { NavItem } from '@nuxt/content/dist/runtime/types'; import { parseURL } from 'ufo'; /** * オブジェクトのパス文字列からオブジェクトの内部を参照 * @param o オブジェクト * @param s パス * @returns パスの先にあるもの */ export function resolveObjPath(o: object, s: string): any { s = s.replace(/\[(\w+)\]/g, '.$1'); // convert indexes to properties s = s.replace(/^\./, ''); // strip a leading dot var a = s.split('.'); for (var i = 0, n = a.length; i < n; ++i) { var k = a[i]; if (k in o) { o = o[k]; } else { return; } } return o; } /** * URLがドメイン内部かどうかを判別 * @param link 判別したいURL * @param base ローカルの基準となるドメイン */ export function isLocalPath(link: string, base?: string): boolean { let baseUrl; if (base) { baseUrl = base; } else { const runtimeConfig = useRuntimeConfig(); baseUrl = runtimeConfig.public.baseUrl; } const rootDomain = parseURL(base); const url = parseURL(link); return (!url.host || rootDomain.host === url.host); } /** * ナビゲーションObjectを合致する条件まで深掘り * @param obj ナビゲーションObject * @param condition 深掘りを停止する条件 * @returns 深掘りしたナビゲーションObject */ export const findDeepObject = (obj: NavItem, condition: (v: NavItem) => boolean): NavItem | null => { if (condition(obj)) { return obj; } if (obj?.children && obj.children.length > 0) { for (let i = 0; i < obj.children.length; i++) { const result = findDeepObject(obj.children[i], condition); if (result) { return result; } } } return null; };