// Copyright © onWidget // SPDX-License-Identifier: MIT import merge from "lodash.merge"; import type { MetaData } from "~/types"; export type Config = { site?: SiteConfig; metadata?: MetaDataConfig; i18n?: I18NConfig; apps?: { blog?: AppBlogConfig; }; ui?: unknown; analytics?: unknown; }; export interface SiteConfig { name: string; site?: string; base?: string; trailingSlash?: boolean; googleSiteVerificationId?: string; } export interface MetaDataConfig extends Omit { title?: { default: string; template: string; }; } export interface I18NConfig { language: string; textDirection: string; dateFormatter?: Intl.DateTimeFormat; } export interface AppBlogConfig { isEnabled: boolean; postsPerPage: number; isRelatedPostsEnabled: boolean; relatedPostsCount: number; post: { isEnabled: boolean; permalink: string; robots: { index: boolean; follow: boolean; }; }; list: { isEnabled: boolean; pathname: string; robots: { index: boolean; follow: boolean; }; }; category: { isEnabled: boolean; pathname: string; robots: { index: boolean; follow: boolean; }; }; tag: { isEnabled: boolean; pathname: string; robots: { index: boolean; follow: boolean; }; }; } export interface AnalyticsConfig { vendors: { googleAnalytics: { id?: string; partytown?: boolean; }; }; } export interface UIConfig { theme: string; } const DEFAULT_SITE_NAME = "Website"; const getSite = (config: Config) => { const _default = { name: DEFAULT_SITE_NAME, site: undefined, base: "/", trailingSlash: true, googleSiteVerificationId: "", }; return merge({}, _default, config?.site ?? {}) as SiteConfig; }; const getMetadata = (config: Config) => { const siteConfig = getSite(config); const _default = { title: { default: siteConfig?.name || DEFAULT_SITE_NAME, template: "%s", }, description: "", robots: { index: false, follow: false, }, openGraph: { type: "website", }, }; return merge({}, _default, config?.metadata ?? {}) as MetaDataConfig; }; const getI18N = (config: Config) => { const _default = { language: "en", textDirection: "ltr", }; const value = merge({}, _default, config?.i18n ?? {}); return value as I18NConfig; }; const getAppBlog = (config: Config) => { const _default = { isEnabled: false, postsPerPage: 6, isRelatedPostsEnabled: false, relatedPostsCount: 4, post: { isEnabled: true, permalink: "/blog/%slug%", robots: { index: true, follow: true, }, }, list: { isEnabled: true, pathname: "blog", robots: { index: true, follow: true, }, }, category: { isEnabled: true, pathname: "category", robots: { index: true, follow: true, }, }, tag: { isEnabled: true, pathname: "tag", robots: { index: false, follow: true, }, }, }; return merge({}, _default, config?.apps?.blog ?? {}) as AppBlogConfig; }; const getUI = (config: Config) => { const _default = { theme: "system", }; return merge({}, _default, config?.ui ?? {}); }; const getAnalytics = (config: Config) => { const _default = { vendors: { googleAnalytics: { id: undefined, partytown: true, }, }, }; return merge({}, _default, config?.analytics ?? {}) as AnalyticsConfig; }; export default (config: Config) => ({ SITE: getSite(config), I18N: getI18N(config), METADATA: getMetadata(config), APP_BLOG: getAppBlog(config), UI: getUI(config), ANALYTICS: getAnalytics(config), });