UNPKG

@tanstack/solid-router

Version:

Modern and scalable routing for Solid applications

1 lines 10.2 kB
{"version":3,"file":"headContentUtils.cjs","names":["Solid","_getAssetMatches","appendUniqueUserTags","escapeHtml","getAssetCrossOrigin","getScriptPreloadAttrs","resolveManifestCssLink","useRouter","AssetCrossOriginConfig","RouterManagedTag","useTags","assetCrossOrigin","router","nonce","options","ssr","createMemo","prev","Array","matches","stores","get","resultMeta","metaByAttribute","Record","title","i","length","metas","meta","j","m","tag","children","json","JSON","stringify","push","attrs","type","attribute","name","property","content","reverse","next","manifest","preloads","match","preload","routes","routeId","links","link","undefined","css","resolvedLink","rel","crossOrigin","inlineStyle","inlineCss","styles","headScripts","style","script","replaceEqualTags","prevByKey","Map","set","isEqual","result","map","index","existing"],"sources":["../../src/headContentUtils.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport {\n _getAssetMatches,\n appendUniqueUserTags,\n escapeHtml,\n getAssetCrossOrigin,\n getScriptPreloadAttrs,\n resolveManifestCssLink,\n} from '@tanstack/router-core'\nimport { useRouter } from './useRouter'\nimport type {\n AssetCrossOriginConfig,\n RouterManagedTag,\n} from '@tanstack/router-core'\n\n/**\n * Build the head/link/meta/script tags from the renderable presented prefix.\n * Used internally by `HeadContent`.\n */\nexport const useTags = (assetCrossOrigin?: AssetCrossOriginConfig) => {\n const router = useRouter()\n const nonce = router.options.ssr?.nonce\n return Solid.createMemo((prev: Array<RouterManagedTag> | undefined) => {\n const matches = _getAssetMatches(router.stores.matches.get())\n const resultMeta: Array<RouterManagedTag> = []\n const metaByAttribute: Record<string, true> = {}\n let title: RouterManagedTag | undefined\n for (let i = matches.length - 1; i >= 0; i--) {\n const metas = matches[i]!.meta\n if (!metas) {\n continue\n }\n for (let j = metas.length - 1; j >= 0; j--) {\n const m = metas[j]\n if (!m) {\n continue\n }\n\n if (m.title) {\n if (!title) {\n title = {\n tag: 'title',\n children: m.title,\n }\n }\n } else if ('script:ld+json' in m) {\n // Handle JSON-LD structured data\n // Content is HTML-escaped to prevent XSS when injected via innerHTML\n try {\n const json = JSON.stringify(m['script:ld+json'])\n resultMeta.push({\n tag: 'script',\n attrs: {\n type: 'application/ld+json',\n },\n children: escapeHtml(json),\n })\n } catch {\n // Skip invalid JSON-LD objects\n }\n } else {\n const attribute = m.name ?? m.property\n if (attribute) {\n if (metaByAttribute[attribute]) {\n continue\n } else {\n metaByAttribute[attribute] = true\n }\n }\n\n resultMeta.push({\n tag: 'meta',\n attrs: {\n ...m,\n nonce,\n },\n })\n }\n }\n }\n\n if (title) {\n resultMeta.push(title)\n }\n\n if (router.options.ssr?.nonce) {\n resultMeta.push({\n tag: 'meta',\n attrs: {\n property: 'csp-nonce',\n content: router.options.ssr.nonce,\n },\n })\n }\n resultMeta.reverse()\n\n const next: Array<RouterManagedTag> = []\n appendUniqueUserTags(next, resultMeta)\n const manifest = router.ssr?.manifest\n const preloads: Array<RouterManagedTag> = []\n for (const match of matches) {\n for (const preload of manifest?.routes[match.routeId]?.preloads ?? []) {\n if (!preload) {\n continue\n }\n preloads.push({\n tag: 'link',\n attrs: {\n ...getScriptPreloadAttrs(manifest, preload, assetCrossOrigin),\n nonce,\n },\n })\n }\n }\n next.push(...preloads)\n\n const links: Array<RouterManagedTag> = []\n for (const match of matches) {\n for (const link of match.links ?? []) {\n if (link === undefined) {\n continue\n }\n links.push({ tag: 'link', attrs: { ...link, nonce } })\n }\n }\n appendUniqueUserTags(next, links)\n\n if (manifest) {\n for (const match of matches) {\n for (const link of manifest.routes[match.routeId]?.css ?? []) {\n const resolvedLink = resolveManifestCssLink(link)\n next.push({\n tag: 'link',\n attrs: {\n rel: 'stylesheet',\n ...resolvedLink,\n crossOrigin:\n getAssetCrossOrigin(assetCrossOrigin, 'stylesheet') ??\n resolvedLink.crossOrigin,\n nonce,\n },\n })\n }\n }\n if (manifest.inlineStyle) {\n next.push({\n tag: 'style',\n attrs: {\n ...manifest.inlineStyle.attrs,\n nonce,\n },\n children: manifest.inlineStyle.children,\n inlineCss: true,\n })\n }\n }\n\n const styles: Array<RouterManagedTag> = []\n const headScripts: Array<RouterManagedTag> = []\n for (const match of matches) {\n for (const style of match.styles ?? []) {\n if (style === undefined) {\n continue\n }\n const { children, ...attrs } = style\n styles.push({\n tag: 'style',\n attrs: { ...attrs, nonce },\n children: children as string | undefined,\n })\n }\n for (const script of match.headScripts ?? []) {\n if (script === undefined) {\n continue\n }\n const { children, ...attrs } = script\n headScripts.push({\n tag: 'script',\n attrs: {\n ...attrs,\n nonce,\n },\n children: children as string | undefined,\n })\n }\n }\n appendUniqueUserTags(next, styles)\n appendUniqueUserTags(next, headScripts)\n\n if (prev === undefined) {\n return next\n }\n return replaceEqualTags(prev, next)\n })\n}\n\nfunction replaceEqualTags(\n prev: Array<RouterManagedTag>,\n next: Array<RouterManagedTag>,\n) {\n const prevByKey = new Map<string, RouterManagedTag>()\n for (const tag of prev) {\n prevByKey.set(JSON.stringify(tag), tag)\n }\n\n let isEqual = prev.length === next.length\n const result = next.map((tag, index) => {\n const existing = prevByKey.get(JSON.stringify(tag))\n if (existing) {\n if (existing !== prev[index]) {\n isEqual = false\n }\n return existing\n }\n\n isEqual = false\n return tag\n })\n\n return isEqual ? prev : result\n}\n"],"mappings":"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"}