vike-metadata-vue
Version:
A hook to manage metadata for your Vike + Vue app.
1 lines • 26.5 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../../internals/src/parse-utilities.ts"],"names":["parseFormatDetection","value","content","parseRobotsInfo"],"mappings":"AAAA,guBAA0B,0BACmB,SCC7BA,CAAAA,CAAqBC,CAAAA,CAA6C,CAChF,EAAA,CAAI,CAACA,CAAAA,CAAO,MAAA,CAEZ,IAAIC,CAAAA,CAAU,EAAA,CAEd,OAAI,uBAAOD,CAAAA,2BAAO,OAAA,CAAU,GAAA,EAAA,CACtBA,CAAAA,CAAM,KAAA,CAAOC,CAAAA,EAAW,YAAA,CACvBA,CAAAA,EAAW,WAAA,CAAA,CAGd,uBAAOD,CAAAA,6BAAO,WAAA,CAAc,GAAA,EAAA,CAC1BA,CAAAA,CAAM,SAAA,CAAWC,CAAAA,EAAW,gBAAA,CAC3BA,CAAAA,EAAW,eAAA,CAAA,CAGd,uBAAOD,CAAAA,6BAAO,SAAA,CAAY,GAAA,EAAA,CACxBA,CAAAA,CAAM,OAAA,CAASC,CAAAA,EAAW,cAAA,CACzBA,CAAAA,EAAW,aAAA,CAAA,CAGd,uBAAOD,CAAAA,6BAAO,KAAA,CAAQ,GAAA,EAAA,CACpBA,CAAAA,CAAM,GAAA,CAAKC,CAAAA,EAAW,UAAA,CACrBA,CAAAA,EAAW,SAAA,CAAA,CAGd,uBAAOD,CAAAA,6BAAO,MAAA,CAAS,GAAA,EAAA,CACrBA,CAAAA,CAAM,IAAA,CAAMC,CAAAA,EAAW,UAAA,CACtBA,CAAAA,EAAW,SAAA,CAAA,CAGXA,CACT,CAEO,SAASC,CAAAA,CAAgBF,CAAAA,CAA6C,CAC3E,EAAA,CAAI,CAACA,CAAAA,CAAO,OAAO,IAAA,CACnB,EAAA,CAAI,OAAOA,CAAAA,EAAU,QAAA,CAAU,OAAOA,CAAAA,CAEtC,IAAMC,CAAAA,CAAU,CAAC,CAAA,CAEjB,MAAA,iBAAID,CAAAA,6BAAO,QAAA,GAAW,KAAA,CAAA,kBAAaA,CAAAA,6BAAO,UAAA,GAAa,KAAA,CAAA,CAAA,EAAA,CACjDA,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAA,EAAQA,CAAAA,CAAM,QAAA,GAAa,CAAA,CAAA,CAAOC,CAAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,CACvEA,CAAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,CAAA,CAAA,iBAG1BD,CAAAA,6BAAO,OAAA,GAAU,KAAA,CAAA,kBAAaA,CAAAA,6BAAO,SAAA,GAAY,KAAA,CAAA,CAAA,EAAA,CAC/CA,CAAAA,CAAM,KAAA,GAAU,CAAA,CAAA,EAAQA,CAAAA,CAAM,OAAA,GAAY,CAAA,CAAA,CAAOC,CAAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,CACpEA,CAAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,CAAA,iBAGzBD,CAAAA,+BAAO,iBAAA,GAAoB,CAAA,CAAA,EAC7BC,CAAAA,CAAQ,IAAA,CAAK,iBAAiB,CAAA,iBAG5BD,CAAAA,8BAAAA,CAAQ,mBAAmB,GAAA,GAAM,KAAA,CAAA,EACnCC,CAAAA,CAAQ,IAAA,CAAK,CAAA,kBAAA,EAAqBD,CAAAA,CAAM,mBAAmB,CAAC,CAAA,CAAA","file":"/home/runner/work/vike-metadata/vike-metadata/packages/vue/dist/index.cjs","sourcesContent":["import { useConfig } from 'vike-vue/useConfig';\nimport { h, VNode, VNodeArrayChildren } from 'vue';\n\nimport {\n _RemoveArray,\n Twitter,\n UseMetadataParams as UseMetadataParamsBase,\n} from '../../internals/src/types';\n\nimport {\n parseFormatDetection,\n parseKeywords,\n parseRobotsInfo,\n parseViewport,\n} from '../../internals/src/parse-utilities';\n\nimport {\n createIfNotExistsMetaName,\n createIfNotExistsMetaProperty,\n} from '../../internals/src/vanilla-utilities';\n\n// ===========================================================================\n// Hook\n// ===========================================================================\n\nexport interface UseMetadataParams extends UseMetadataParamsBase {\n /**\n * If you prefer not using the type-safe data format and just want to copy-paste\n * whatever meta you currently have. You can also just paste it here.\n *\n * otherJSX: [\n * h('meta', { ... }),\n * h('meta', { ... }),\n * h('meta', { ... }),\n * ]\n */\n otherJSX?: () => VNodeArrayChildren;\n}\n\nfunction _useMetadata(params: UseMetadataParams, DEFAULT_CONFIG: UseMetadataParams) {\n const setConfig = useConfig();\n\n const values = {\n // Sensible Title & Description Defaults for HTML, OG, and Twitter.\n title: params.title ?? DEFAULT_CONFIG.title,\n description: params.description ?? DEFAULT_CONFIG.description,\n\n // Other values here:\n generator: params.generator ?? DEFAULT_CONFIG.generator,\n applicationName: params.applicationName ?? DEFAULT_CONFIG.applicationName,\n referrer: params.referrer ?? DEFAULT_CONFIG.referrer,\n keywords: params.keywords ?? DEFAULT_CONFIG.keywords,\n authors: params.authors ?? DEFAULT_CONFIG.authors,\n creator: params.creator ?? DEFAULT_CONFIG.creator,\n publisher: params.publisher ?? DEFAULT_CONFIG.publisher,\n formatDetection: params.formatDetection ?? DEFAULT_CONFIG.formatDetection,\n\n // Open Graph\n openGraph: {\n title: params.openGraph?.title ?? params.title ?? DEFAULT_CONFIG.title,\n description:\n params.openGraph?.description ?? params.description ?? DEFAULT_CONFIG.description,\n url: params.openGraph?.url ?? DEFAULT_CONFIG?.openGraph?.url,\n siteName: params.openGraph?.siteName ?? DEFAULT_CONFIG?.openGraph?.siteName,\n images: params.openGraph?.images ?? DEFAULT_CONFIG?.openGraph?.images,\n videos: params.openGraph?.videos ?? DEFAULT_CONFIG?.openGraph?.videos,\n audio: params.openGraph?.audio ?? DEFAULT_CONFIG?.openGraph?.audio,\n locale: params.openGraph?.locale ?? DEFAULT_CONFIG?.openGraph?.locale,\n type: ((params.openGraph as any)?.type ?? (DEFAULT_CONFIG?.openGraph as any)?.type) as\n | string\n | undefined,\n },\n\n // Robots\n robots: params.robots ?? DEFAULT_CONFIG.robots,\n\n // Manifest\n manifest: params.manifest ?? DEFAULT_CONFIG.manifest,\n\n // Twitter\n twitter: {\n // Metadata\n creator: params.twitter?.creator ?? DEFAULT_CONFIG?.twitter?.creator,\n creatorId: params.twitter?.creatorId ?? DEFAULT_CONFIG?.twitter?.creatorId,\n description: params.twitter?.description ?? params.description ?? DEFAULT_CONFIG.description,\n images: params.twitter?.images ?? DEFAULT_CONFIG?.twitter?.images,\n site: params.twitter?.site ?? DEFAULT_CONFIG?.twitter?.site,\n siteId: params.twitter?.siteId ?? DEFAULT_CONFIG?.twitter?.siteId,\n title: params.twitter?.title ?? params.title ?? DEFAULT_CONFIG.title,\n\n // Card\n card: ((params.twitter as any)?.card ?? (DEFAULT_CONFIG?.twitter as any)?.card) as\n | string\n | undefined,\n\n // Player\n players:\n (params.twitter as Extract<Twitter, { card: 'player' }>)?.players ??\n (DEFAULT_CONFIG?.twitter as any)?.players,\n\n // App\n app:\n (params?.twitter as Extract<Twitter, { card: 'app' }>)?.app ??\n (DEFAULT_CONFIG?.twitter as any)?.app,\n },\n\n // ViewPort\n viewport: params.viewport ?? DEFAULT_CONFIG.viewport,\n\n // Verification\n verification: params.verification ?? DEFAULT_CONFIG.verification,\n\n // Other\n other: params.other ?? DEFAULT_CONFIG.other,\n\n // Other JSX\n otherJSX: params.otherJSX ?? DEFAULT_CONFIG.otherJSX,\n };\n\n const Head_: VNodeArrayChildren = [\n renderMetaName('generator', values.generator),\n renderMetaName('application-name', values.applicationName),\n renderMetaName('referrer', values.referrer),\n renderMetaName('keywords', values?.keywords?.length ? parseKeywords(values.keywords) : null),\n renderArrayable(values?.authors, (item) => [\n renderMetaName('author', item.name),\n item.url ? h('link', { rel: 'author', href: item.url?.toString() }) : null,\n ]),\n renderMetaName('creator', values?.creator),\n renderMetaName('publisher', values?.publisher),\n renderMetaName(\n 'format-detection',\n values?.formatDetection ? parseFormatDetection(values.formatDetection) : null,\n ),\n\n renderOpenGraphMetadata(values?.openGraph),\n\n renderMetaName('robots', values?.robots ? parseRobotsInfo(values.robots) : null),\n\n renderMetaName(\n 'googlebot',\n (values?.robots as any)?.googleBot\n ? parseRobotsInfo((values?.robots as any)?.googleBot)\n : null,\n ),\n\n values?.manifest ? h('link', { rel: 'manifest', href: values.manifest?.toString() }) : null,\n\n renderTwitterMetadata(values.twitter),\n\n renderViewPortMetadata(values.viewport),\n\n renderMetaNameMap(values?.verification),\n\n renderMetaNameMap(values?.other),\n\n values.otherJSX?.(),\n ];\n\n setConfig({\n title: values.title,\n description: values.description,\n Head: Head_,\n /** @ts-ignore */\n });\n\n // Special Workarounds\n\n // > Server-side\n if (typeof window === 'undefined') {\n }\n // > Client-side\n else {\n if (values.openGraph.title) {\n createIfNotExistsMetaProperty('og:title', values.openGraph.title);\n }\n if (values.description) {\n createIfNotExistsMetaName('description', values.description);\n }\n\n if (values.openGraph.description) {\n createIfNotExistsMetaProperty('og:description', values.openGraph.description);\n }\n\n if (values.twitter.title) {\n createIfNotExistsMetaName('twitter:title', values.twitter.title);\n }\n\n if (values.twitter.description) {\n createIfNotExistsMetaName('twitter:description', values.twitter.description);\n }\n\n if (values.keywords?.length) {\n createIfNotExistsMetaName('keywords', parseKeywords(values.keywords));\n }\n }\n}\n\n/**\n * Alternative way to set default values via a factory pattern.\n *\n * @example\n * import { initUseMetadata } from 'vike-metadata-vue';\n *\n * export const useMetadata = initUseMeta({\n * // Add defaults here...\n * })\n */\nexport function initUseMetadata(config: UseMetadataParams) {\n return (params: UseMetadataParams) => _useMetadata(params, config);\n}\n\nlet GLOBAL_DEFAULTS: UseMetadataParams = {};\nfunction setGlobalDefaults(config: UseMetadataParams) {\n GLOBAL_DEFAULTS = config;\n}\n\nexport type UseMetadataFunctionType = ((params: UseMetadataParams) => void) & {\n /**\n * Recommended way to set default values.\n *\n * @example\n * import { useMetadata } from 'vike-metadata-vue';\n *\n * useMetadata.setGlobalDefaults({\n * title: 'Home | Solid Launch',\n * description: 'An awesome app template by Carlo Taleon.',\n * })\n */\n setGlobalDefaults: (config: UseMetadataParams) => void;\n};\n\n/**\n *\n * @example\n * import { useMetadata } from 'vike-metadata-vue';\n *\n * useMetadata.setGlobalDefaults({\n * title: 'Home | Solid Launch',\n * description: 'An awesome app template by Carlo Taleon.'\n * });\n *\n * export default function Page() {\n * useMetadata({\n * title: 'About | Solid Launch',\n * description: 'An awesome about page template by Carlo Taleon.'\n * })\n * }\n */\nexport const useMetadata: UseMetadataFunctionType = (params) => {\n return _useMetadata(params, GLOBAL_DEFAULTS);\n};\n\nuseMetadata.setGlobalDefaults = setGlobalDefaults;\n\n// ===========================================================================\n// Utilities\n// ===========================================================================\n\n// >>> Utilities for Server-Side (JS-framework specific)\nfunction renderMetaName(name: string, value: any) {\n return value ? h('meta', { name: name, content: value }) : null;\n}\n\nfunction renderMetaProperty(property: string, value: any) {\n return value ? h('meta', { property: property, content: value }) : null;\n}\n\nfunction renderArrayable<T>(\n value: T,\n render: (item: _RemoveArray<T>, index: number) => VNode | null | (VNode | null)[],\n) {\n if (!value) return null;\n\n if (Array.isArray(value)) {\n return value.map(render);\n }\n\n return render(value as any, 0);\n}\n\nfunction renderOpenGraphMetadata(value: UseMetadataParams['openGraph']) {\n if (!value) return null;\n\n function _renderOGArticle(value: Extract<UseMetadataParams['openGraph'], { type: 'article' }>) {\n if (value.type !== 'article') return null;\n\n return [\n renderArrayable(value.authors, (item) => renderMetaProperty('article:author', item)),\n renderMetaProperty('article:expiration_time', value.expirationTime),\n renderMetaProperty('article:modified_time', value.modifiedTime),\n renderMetaProperty('article:published_time', value.publishedTime),\n renderMetaProperty('article:section', value.section),\n renderArrayable(value.tags, (item) => renderMetaProperty('article:tag', item)),\n ];\n }\n\n function _renderOGBook(value: Extract<UseMetadataParams['openGraph'], { type: 'book' }>) {\n if (value.type !== 'book') return null;\n return [\n renderArrayable(value.authors, (item) => renderMetaProperty('article:author', item)),\n renderMetaProperty('book:isbn', value.isbn),\n renderMetaProperty('book:release_date', value.releaseDate),\n renderArrayable(value.tags, (item) => renderMetaProperty('article:tag', item)),\n ];\n }\n\n function _renderOGProfile(value: Extract<UseMetadataParams['openGraph'], { type: 'profile' }>) {\n if (value.type !== 'profile') return null;\n return [\n renderMetaProperty('profile:first_name', value.firstName),\n renderMetaProperty('profile:last_name', value.lastName),\n renderMetaProperty('profile:username', value.username),\n renderMetaProperty('profile:gender', value.gender),\n ];\n }\n\n function _renderOGMusicSong(\n value: Extract<UseMetadataParams['openGraph'], { type: 'music.song' }>,\n ) {\n if (value.type !== 'music.song') return null;\n return [\n renderArrayable(value.albums, (item) => {\n if (typeof item === 'string' || item instanceof URL) {\n return renderMetaProperty('music:album', item);\n }\n\n return [\n renderMetaProperty('music:album:disc', item?.disc),\n renderMetaProperty('music:album:track', item?.track),\n renderMetaProperty('music:album', item?.url),\n ];\n }),\n renderMetaProperty('music:duration', value.duration),\n renderArrayable(value.musicians, (item) => renderMetaProperty('music:musician', item)),\n ];\n }\n\n function _renderOGMusicAlbum(\n value: Extract<UseMetadataParams['openGraph'], { type: 'music.album' }>,\n ) {\n if (value.type !== 'music.album') return null;\n return [\n renderArrayable(value.musicians, (item) => renderMetaProperty('music:musician', item)),\n renderMetaProperty('music:release_date', value.releaseDate),\n renderArrayable(value.songs, (item) => {\n if (typeof item === 'string' || item instanceof URL) {\n return renderMetaProperty('music:song', item);\n }\n\n return [\n renderMetaProperty('music:song:disc', item?.disc),\n renderMetaProperty('music:song:track', item?.track),\n renderMetaProperty('music:song', item?.url),\n ];\n }),\n ];\n }\n\n function _renderOGMusicPlaylist(\n value: Extract<UseMetadataParams['openGraph'], { type: 'music.playlist' }>,\n ) {\n if (value.type !== 'music.playlist') return null;\n return [\n renderArrayable(value.creators, (item) => renderMetaProperty('music:creator', item)),\n renderArrayable(value.songs, (item) => {\n if (typeof item === 'string' || item instanceof URL) {\n return renderMetaProperty('music:song', item);\n }\n\n return [\n renderMetaProperty('music:song:disc', item?.disc),\n renderMetaProperty('music:song:track', item?.track),\n renderMetaProperty('music:song', item?.url),\n ];\n }),\n ];\n }\n\n function _renderOGMusicRadioStation(\n value: Extract<UseMetadataParams['openGraph'], { type: 'music.radio_station' }>,\n ) {\n if (value.type !== 'music.radio_station') return null;\n return renderArrayable(value.creators, (item) => renderMetaProperty('music:creator', item));\n }\n\n function _renderOGVideoMovie(\n value: Extract<UseMetadataParams['openGraph'], { type: 'video.movie' }>,\n ) {\n if (value.type !== 'video.movie') return null;\n return [\n renderArrayable(value.actors, (item) => {\n if (typeof item === 'string' || item instanceof URL) {\n return renderMetaProperty('video:actor', item);\n }\n\n return [\n renderMetaProperty('video:actor:role', item?.role),\n renderMetaProperty('video:actor', item?.url),\n ];\n }),\n\n renderArrayable(value.directors, (item) => renderMetaProperty('video:director', item)),\n\n renderMetaProperty('video:duration', value.duration),\n renderMetaProperty('video:release_date', value.releaseDate),\n\n renderArrayable(value.tags, (item) => renderMetaProperty('video.tag', item)),\n renderArrayable(value.writers, (item) => renderMetaProperty('video:writer', item)),\n ];\n }\n\n function _renderOGVideoEpisode(\n value: Extract<UseMetadataParams['openGraph'], { type: 'video.episode' }>,\n ) {\n if (value.type !== 'video.episode') return null;\n return [\n renderArrayable(value.actors, (item) => {\n if (typeof item === 'string' || item instanceof URL) {\n return renderMetaProperty('video:actor', item);\n }\n\n return [\n renderMetaProperty('video:actor:role', item?.role),\n renderMetaProperty('video:actor', item?.url),\n ];\n }),\n\n renderArrayable(value.directors, (item) => renderMetaProperty('video:director', item)),\n\n renderMetaProperty('video:duration', value.duration),\n renderMetaProperty('video:release_date', value.releaseDate),\n renderMetaProperty('video:series', value.series),\n\n renderArrayable(value.tags, (item) => renderMetaProperty('video.tag', item)),\n renderArrayable(value.writers, (item) => renderMetaProperty('video:writer', item)),\n ];\n }\n\n return [\n renderArrayable(value?.alternateLocale, (item) =>\n renderMetaProperty('og:locale:alternate', item),\n ),\n renderArrayable(value?.audio, (item) => {\n if (typeof item === 'string' || item instanceof URL) {\n return renderMetaProperty('og:audio', item?.toString());\n }\n\n return [\n renderMetaProperty('og:audio', item?.url),\n renderMetaProperty('og:audio:type', item?.type),\n ];\n }),\n renderMetaProperty('og:country-name', value?.countryName),\n renderMetaProperty('og:determiner', value?.determiner),\n renderArrayable(value?.emails, (item) => renderMetaProperty('og:email', item)),\n renderArrayable(value?.faxNumbers, (item) => renderMetaProperty('og:fax_number', item)),\n\n renderArrayable(value?.images, (item) => {\n if (typeof item === 'string' || item instanceof URL) {\n return renderMetaProperty('og:image', item?.toString());\n }\n\n return [\n renderMetaProperty('og:image', item?.url),\n renderMetaProperty('og:image:secure_url', item?.secureUrl),\n renderMetaProperty('og:image:width', item?.width),\n renderMetaProperty('og:image:height', item?.height),\n renderMetaProperty('og:image:alt', item?.alt),\n ];\n }),\n renderMetaProperty('og:locale', value?.locale),\n renderArrayable(value?.phoneNumbers, (item) => renderMetaProperty('og:phone_number', item)),\n renderMetaProperty('og:site_name', value?.siteName),\n renderMetaProperty('og:ttl', value?.ttl),\n renderMetaProperty('og:url', value?.url),\n\n renderArrayable(value?.videos, (item) => {\n if (typeof item === 'string' || item instanceof URL) {\n return renderMetaProperty('og:video', item?.toString());\n }\n\n return [\n renderMetaProperty('og:video', item?.url),\n renderMetaProperty('og:video:secure_url', item?.secureUrl),\n renderMetaProperty('og:video:type', item?.type),\n renderMetaProperty('og:video:width', item?.width),\n renderMetaProperty('og:video:height', item?.height),\n ];\n }),\n\n renderMetaProperty('og:type', (value as any)?.type),\n\n _renderOGArticle(value as any),\n _renderOGBook(value as any),\n _renderOGProfile(value as any),\n _renderOGMusicSong(value as any),\n _renderOGMusicAlbum(value as any),\n _renderOGMusicPlaylist(value as any),\n _renderOGMusicRadioStation(value as any),\n _renderOGVideoMovie(value as any),\n _renderOGVideoEpisode(value as any),\n ];\n}\n\nfunction renderTwitterMetadata(value: UseMetadataParams['twitter']) {\n if (!value) return null;\n\n function renderTwitterAppMetadata(value: Extract<Twitter, { card: 'app' }>['app']) {\n if (!value) return null;\n\n return [\n renderMetaName('twitter:app:id:googleplay', value?.id?.googleplay),\n renderMetaName('twitter:app:url:googleplay', value?.url?.googleplay),\n\n renderMetaName('twitter:app:id:iphone', value?.id?.iphone),\n renderMetaName('twitter:app:url:iphone', value?.url?.iphone),\n\n renderMetaName('twitter:app:id:ipad', value?.id?.ipad),\n renderMetaName('twitter:app:url:ipad', value?.url?.ipad),\n\n renderMetaName(\n 'twitter:app:name:googleplay',\n value?.id?.googleplay ? value?.name : undefined,\n ),\n renderMetaName('twitter:app:name:iphone', value?.id?.iphone ? value?.name : undefined),\n renderMetaName('twitter:app:name:ipad', value?.id?.ipad ? value?.name : undefined),\n ];\n }\n\n return [\n renderMetaName('twitter:creator', value.creator),\n renderMetaName('twitter:creator:id', value.creatorId),\n renderMetaName('twitter:description', value.description),\n renderMetaName('twitter:site', value.site),\n renderMetaName('twitter:site:id', value.siteId),\n renderMetaName('twitter:title', value.title),\n\n renderMetaName('twitter:card', (value as any).card),\n\n renderArrayable(value?.images, (item) => {\n if (typeof item === 'string' || item instanceof URL) {\n return renderMetaName('twitter:image', item?.toString());\n }\n\n return [\n renderMetaName('twitter:image', item.url?.toString()),\n renderMetaName('twitter:image:alt', item.alt),\n ];\n }),\n\n renderArrayable((value as Extract<Twitter, { card: 'player' }>)?.players, (item) => [\n renderMetaName('twitter:player', item.playerUrl),\n renderMetaName('twitter:player:width', item.width),\n renderMetaName('twitter:player:height', item.height),\n renderMetaName('twitter:player:stream', item.streamUrl),\n ]),\n\n renderTwitterAppMetadata((value as any)?.app),\n ];\n}\n\nfunction renderViewPortMetadata(value: UseMetadataParams['viewport']) {\n if (!value) return null;\n\n return [\n renderMetaName('color-scheme', value.colorScheme),\n renderArrayable(value.themeColor, (item) => {\n if (typeof item === 'string') {\n return renderMetaName('theme-color', item);\n }\n\n if (item.media) {\n return h('meta', { name: 'theme-color', media: item.media, content: item.color });\n }\n\n return h('meta', { name: 'theme-color', content: item.color });\n }),\n renderMetaName('viewport', parseViewport(value)),\n ];\n}\n\nfunction renderMetaNameMap(records?: { [key: string]: string | number | (string | number)[] }) {\n if (!records) return null;\n\n return Object.entries(records).map(([_key, _value]) => {\n if (Array.isArray(_value)) {\n return renderArrayable(_value, (item) => renderMetaName(_key, item));\n }\n\n return renderMetaName(_key, _value);\n });\n}\n","import { UseMetadataParams } from './types';\n\nexport function parseFormatDetection(value: UseMetadataParams['formatDetection']) {\n if (!value) return undefined;\n\n let content = '';\n\n if (typeof value?.email !== 'undefined') {\n if (value.email) content += 'email=yes,';\n else content += 'email=no,';\n }\n\n if (typeof value?.telephone !== 'undefined') {\n if (value.telephone) content += 'telephone=yes,';\n else content += 'telephone=no,';\n }\n\n if (typeof value?.address !== 'undefined') {\n if (value.address) content += 'address=yes,';\n else content += 'address=no,';\n }\n\n if (typeof value?.url !== 'undefined') {\n if (value.url) content += 'url=yes,';\n else content += 'url=no,';\n }\n\n if (typeof value?.date !== 'undefined') {\n if (value.date) content += 'date=yes';\n else content += 'date=no';\n }\n\n return content;\n}\n\nexport function parseRobotsInfo(value: UseMetadataParams['robots'] | string) {\n if (!value) return null;\n if (typeof value === 'string') return value;\n\n const content = [];\n\n if (value?.follow !== undefined || value?.nofollow !== undefined) {\n if (value.follow === true || value.nofollow === false) content.push('follow');\n else content.push('nofollow');\n }\n\n if (value?.index !== undefined || value?.noindex !== undefined) {\n if (value.index === true || value.noindex === false) content.push('index');\n else content.push('noindex');\n }\n\n if (value?.indexifembedded === true) {\n content.push('indexifembedded');\n }\n\n if (value?.['max-image-preview'] !== undefined) {\n content.push(`max-image-preview:${value['max-image-preview']}`);\n }\n\n if (value?.['max-snippet'] !== undefined) {\n content.push(`max-snippet:${value['max-snippet']}`);\n }\n\n if (value?.['max-video-preview'] !== undefined) {\n content.push(`max-video-preview:${value['max-video-preview']}`);\n }\n\n if (value?.noarchive === true) {\n content.push('noarchive');\n }\n\n if (value?.nocache === true) {\n content.push('nocache');\n }\n\n if (value?.noimageindex === true) {\n content.push('noimageindex');\n }\n\n if (value?.nositelinkssearchbox === true) {\n content.push('nositelinkssearchbox');\n }\n\n if (value?.nosnippet === true) {\n content.push('nosnippet');\n }\n\n if (value?.notranslate === true) {\n content.push('notranslate');\n }\n\n if (value?.unavailable_after !== undefined) {\n content.push(`unavailable_after: ${value.unavailable_after}`);\n }\n\n return content.join(', ');\n}\n\nexport function parseViewport(value: UseMetadataParams['viewport']) {\n if (!value) return null;\n\n const content = [];\n\n if (value.width !== undefined) {\n content.push(`width=${value.width}`);\n }\n\n if (value.height !== undefined) {\n content.push(`height=${value.height}`);\n }\n\n if (value.initialScale !== undefined) {\n content.push(`initial-scale=${value.initialScale}`);\n }\n\n if (value.interactiveWidget !== undefined) {\n content.push(`interactive-widget=${value.interactiveWidget}`);\n }\n\n if (value.maximumScale !== undefined) {\n content.push(`maximum-scale=${value.maximumScale}`);\n }\n\n if (value.minimumScale !== undefined) {\n content.push(`minimum-scale=${value.minimumScale}`);\n }\n\n if (value.userScalable !== undefined) {\n if (value.userScalable === true) content.push('user-scalable=yes');\n content.push('user-scalable=no');\n }\n\n if (value.viewportFit !== undefined) {\n content.push(`viewport-fit=${value.viewportFit}`);\n }\n\n return content.join(', ');\n}\n\n/** Used by keywords. */\nexport function parseKeywords(value: string | string[]) {\n if (typeof value === 'string') {\n return value;\n }\n return value.join(',');\n}\n"]}