@tanstack/solid-router 1.168.20 → 1.168.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,12 +6,19 @@ let _tanstack_router_core_isServer = require("@tanstack/router-core/isServer");
6
6
  let _solidjs_meta = require("@solidjs/meta");
7
7
  //#region src/Asset.tsx
8
8
  var _tmpl$ = /* @__PURE__ */ (0, solid_js_web.template)(`<script>`);
9
- function Asset({ tag, attrs, children }) {
9
+ var INLINE_CSS_HYDRATION_ATTR = "data-tsr-inline-css";
10
+ function Asset(asset) {
11
+ const { tag, attrs, children } = asset;
10
12
  switch (tag) {
11
13
  case "title": return (0, solid_js_web.createComponent)(_solidjs_meta.Title, (0, solid_js_web.mergeProps)(attrs, { children }));
12
14
  case "meta": return (0, solid_js_web.createComponent)(_solidjs_meta.Meta, attrs);
13
15
  case "link": return (0, solid_js_web.createComponent)(_solidjs_meta.Link, attrs);
14
- case "style": return (0, solid_js_web.createComponent)(_solidjs_meta.Style, (0, solid_js_web.mergeProps)(attrs, { children }));
16
+ case "style":
17
+ if (asset.inlineCss && (process.env.TSS_INLINE_CSS_ENABLED === "true" || process.env.TSS_INLINE_CSS_ENABLED === void 0 && _tanstack_router_core_isServer.isServer)) return (0, solid_js_web.createComponent)(InlineCssStyle, {
18
+ attrs,
19
+ children
20
+ });
21
+ return (0, solid_js_web.createComponent)(_solidjs_meta.Style, (0, solid_js_web.mergeProps)(attrs, { children }));
15
22
  case "script": return (0, solid_js_web.createComponent)(Script, {
16
23
  attrs,
17
24
  children
@@ -19,6 +26,10 @@ function Asset({ tag, attrs, children }) {
19
26
  default: return null;
20
27
  }
21
28
  }
29
+ function InlineCssStyle({ attrs, children }) {
30
+ const html = children === void 0 ? typeof document === "undefined" ? "" : document.querySelector(`style[${INLINE_CSS_HYDRATION_ATTR}]`)?.textContent ?? "" : children ?? "";
31
+ return (0, solid_js_web.createComponent)(_solidjs_meta.Style, (0, solid_js_web.mergeProps)(attrs, { [INLINE_CSS_HYDRATION_ATTR]: "" }, { children: html }));
32
+ }
22
33
  function Script({ attrs, children }) {
23
34
  const router = require_useRouter.useRouter();
24
35
  const dataScript = typeof attrs?.type === "string" && attrs.type !== "" && attrs.type !== "text/javascript" && attrs.type !== "module";
@@ -1 +1 @@
1
- {"version":3,"file":"Asset.cjs","names":["Link","Meta","Style","Title","onCleanup","onMount","isServer","useRouter","RouterManagedTag","JSX","Asset","tag","attrs","children","Element","_$createComponent","_$mergeProps","Script","ScriptAttrs","key","src","router","dataScript","type","normSrc","base","document","baseURI","window","location","href","URL","existingScript","Array","from","querySelectorAll","find","el","HTMLScriptElement","script","createElement","value","Object","entries","undefined","setAttribute","String","head","appendChild","parentNode","removeChild","typeAttr","nonceAttr","nonce","sType","getAttribute","sNonce","textContent","_el$","_tmpl$","_$spread","_el$2","_el$3"],"sources":["../../src/Asset.tsx"],"sourcesContent":["import { Link, Meta, Style, Title } from '@solidjs/meta'\nimport { onCleanup, onMount } from 'solid-js'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport { useRouter } from './useRouter'\nimport type { RouterManagedTag } from '@tanstack/router-core'\nimport type { JSX } from 'solid-js'\n\nexport function Asset({\n tag,\n attrs,\n children,\n}: RouterManagedTag): JSX.Element | null {\n switch (tag) {\n case 'title':\n return <Title {...attrs}>{children}</Title>\n case 'meta':\n return <Meta {...attrs} />\n case 'link':\n return <Link {...attrs} />\n case 'style':\n return <Style {...attrs}>{children}</Style>\n case 'script':\n return <Script attrs={attrs}>{children}</Script>\n default:\n return null\n }\n}\n\ninterface ScriptAttrs {\n [key: string]: string | boolean | undefined\n src?: string\n}\n\nfunction Script({\n attrs,\n children,\n}: {\n attrs?: ScriptAttrs\n children?: string\n}): JSX.Element | null {\n const router = useRouter()\n const dataScript =\n typeof attrs?.type === 'string' &&\n attrs.type !== '' &&\n attrs.type !== 'text/javascript' &&\n attrs.type !== 'module'\n\n onMount(() => {\n if (dataScript) return\n\n if (attrs?.src) {\n const normSrc = (() => {\n try {\n const base = document.baseURI || window.location.href\n return new URL(attrs.src, base).href\n } catch {\n return attrs.src\n }\n })()\n const existingScript = Array.from(\n document.querySelectorAll('script[src]'),\n ).find((el) => (el as HTMLScriptElement).src === normSrc)\n\n if (existingScript) {\n return\n }\n\n const script = document.createElement('script')\n\n for (const [key, value] of Object.entries(attrs)) {\n if (value !== undefined && value !== false) {\n script.setAttribute(\n key,\n typeof value === 'boolean' ? '' : String(value),\n )\n }\n }\n\n document.head.appendChild(script)\n\n onCleanup(() => {\n if (script.parentNode) {\n script.parentNode.removeChild(script)\n }\n })\n }\n\n if (typeof children === 'string') {\n const typeAttr =\n typeof attrs?.type === 'string' ? attrs.type : 'text/javascript'\n const nonceAttr =\n typeof attrs?.nonce === 'string' ? attrs.nonce : undefined\n const existingScript = Array.from(\n document.querySelectorAll('script:not([src])'),\n ).find((el) => {\n if (!(el instanceof HTMLScriptElement)) return false\n const sType = el.getAttribute('type') ?? 'text/javascript'\n const sNonce = el.getAttribute('nonce') ?? undefined\n return (\n el.textContent === children &&\n sType === typeAttr &&\n sNonce === nonceAttr\n )\n })\n\n if (existingScript) {\n return\n }\n\n const script = document.createElement('script')\n script.textContent = children\n\n if (attrs) {\n for (const [key, value] of Object.entries(attrs)) {\n if (value !== undefined && value !== false) {\n script.setAttribute(\n key,\n typeof value === 'boolean' ? '' : String(value),\n )\n }\n }\n }\n\n document.head.appendChild(script)\n\n onCleanup(() => {\n if (script.parentNode) {\n script.parentNode.removeChild(script)\n }\n })\n }\n })\n\n if (!(isServer ?? router.isServer)) {\n if (dataScript && typeof children === 'string') {\n return <script {...attrs} innerHTML={children} />\n }\n\n // render an empty script on the client just to avoid hydration errors\n return null\n }\n\n if (attrs?.src && typeof attrs.src === 'string') {\n return <script {...attrs} />\n }\n\n if (typeof children === 'string') {\n return <script {...attrs} innerHTML={children} />\n }\n\n return null\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Asset.cjs","names":["Link","Meta","Style","Title","onCleanup","onMount","isServer","useRouter","RouterManagedTag","JSX","INLINE_CSS_HYDRATION_ATTR","Asset","asset","Element","tag","attrs","children","_$createComponent","_$mergeProps","inlineCss","process","env","TSS_INLINE_CSS_ENABLED","undefined","InlineCssStyle","Script","Record","isInlineCssPlaceholder","html","document","querySelector","HTMLStyleElement","textContent","ScriptAttrs","key","src","router","dataScript","type","normSrc","base","baseURI","window","location","href","URL","existingScript","Array","from","querySelectorAll","find","el","HTMLScriptElement","script","createElement","value","Object","entries","setAttribute","String","head","appendChild","parentNode","removeChild","typeAttr","nonceAttr","nonce","sType","getAttribute","sNonce","_el$","_tmpl$","_$spread","_el$2","_el$3"],"sources":["../../src/Asset.tsx"],"sourcesContent":["import { Link, Meta, Style, Title } from '@solidjs/meta'\nimport { onCleanup, onMount } from 'solid-js'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport { useRouter } from './useRouter'\nimport type { RouterManagedTag } from '@tanstack/router-core'\nimport type { JSX } from 'solid-js'\n\nconst INLINE_CSS_HYDRATION_ATTR = 'data-tsr-inline-css'\n\nexport function Asset(asset: RouterManagedTag): JSX.Element | null {\n const { tag, attrs, children } = asset\n\n switch (tag) {\n case 'title':\n return <Title {...attrs}>{children}</Title>\n case 'meta':\n return <Meta {...attrs} />\n case 'link':\n return <Link {...attrs} />\n case 'style':\n if (\n asset.inlineCss &&\n (process.env.TSS_INLINE_CSS_ENABLED === 'true' ||\n (process.env.TSS_INLINE_CSS_ENABLED === undefined && isServer))\n ) {\n return <InlineCssStyle attrs={attrs}>{children}</InlineCssStyle>\n }\n\n return <Style {...attrs}>{children}</Style>\n case 'script':\n return <Script attrs={attrs}>{children}</Script>\n default:\n return null\n }\n}\n\nfunction InlineCssStyle({\n attrs,\n children,\n}: {\n attrs?: Record<string, any>\n children?: RouterManagedTag['children']\n}) {\n const isInlineCssPlaceholder = children === undefined\n const html = isInlineCssPlaceholder\n ? typeof document === 'undefined'\n ? ''\n : (document.querySelector<HTMLStyleElement>(\n `style[${INLINE_CSS_HYDRATION_ATTR}]`,\n )?.textContent ?? '')\n : (children ?? '')\n\n return (\n <Style {...attrs} {...{ [INLINE_CSS_HYDRATION_ATTR]: '' }}>\n {html}\n </Style>\n )\n}\n\ninterface ScriptAttrs {\n [key: string]: string | boolean | undefined\n src?: string\n}\n\nfunction Script({\n attrs,\n children,\n}: {\n attrs?: ScriptAttrs\n children?: string\n}): JSX.Element | null {\n const router = useRouter()\n const dataScript =\n typeof attrs?.type === 'string' &&\n attrs.type !== '' &&\n attrs.type !== 'text/javascript' &&\n attrs.type !== 'module'\n\n onMount(() => {\n if (dataScript) return\n\n if (attrs?.src) {\n const normSrc = (() => {\n try {\n const base = document.baseURI || window.location.href\n return new URL(attrs.src, base).href\n } catch {\n return attrs.src\n }\n })()\n const existingScript = Array.from(\n document.querySelectorAll('script[src]'),\n ).find((el) => (el as HTMLScriptElement).src === normSrc)\n\n if (existingScript) {\n return\n }\n\n const script = document.createElement('script')\n\n for (const [key, value] of Object.entries(attrs)) {\n if (value !== undefined && value !== false) {\n script.setAttribute(\n key,\n typeof value === 'boolean' ? '' : String(value),\n )\n }\n }\n\n document.head.appendChild(script)\n\n onCleanup(() => {\n if (script.parentNode) {\n script.parentNode.removeChild(script)\n }\n })\n }\n\n if (typeof children === 'string') {\n const typeAttr =\n typeof attrs?.type === 'string' ? attrs.type : 'text/javascript'\n const nonceAttr =\n typeof attrs?.nonce === 'string' ? attrs.nonce : undefined\n const existingScript = Array.from(\n document.querySelectorAll('script:not([src])'),\n ).find((el) => {\n if (!(el instanceof HTMLScriptElement)) return false\n const sType = el.getAttribute('type') ?? 'text/javascript'\n const sNonce = el.getAttribute('nonce') ?? undefined\n return (\n el.textContent === children &&\n sType === typeAttr &&\n sNonce === nonceAttr\n )\n })\n\n if (existingScript) {\n return\n }\n\n const script = document.createElement('script')\n script.textContent = children\n\n if (attrs) {\n for (const [key, value] of Object.entries(attrs)) {\n if (value !== undefined && value !== false) {\n script.setAttribute(\n key,\n typeof value === 'boolean' ? '' : String(value),\n )\n }\n }\n }\n\n document.head.appendChild(script)\n\n onCleanup(() => {\n if (script.parentNode) {\n script.parentNode.removeChild(script)\n }\n })\n }\n })\n\n if (!(isServer ?? router.isServer)) {\n if (dataScript && typeof children === 'string') {\n return <script {...attrs} innerHTML={children} />\n }\n\n // render an empty script on the client just to avoid hydration errors\n return null\n }\n\n if (attrs?.src && typeof attrs.src === 'string') {\n return <script {...attrs} />\n }\n\n if (typeof children === 'string') {\n return <script {...attrs} innerHTML={children} />\n }\n\n return null\n}\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import { RouterManagedTag } from '@tanstack/router-core';
2
2
  import { JSX } from 'solid-js';
3
- export declare function Asset({ tag, attrs, children, }: RouterManagedTag): JSX.Element | null;
3
+ export declare function Asset(asset: RouterManagedTag): JSX.Element | null;
@@ -1 +1 @@
1
- {"version":3,"file":"fileRoute.cjs","names":[],"sources":["../../src/fileRoute.ts"],"sourcesContent":["import { createRoute } from './route'\n\nimport { useMatch } from './useMatch'\nimport { useLoaderDeps } from './useLoaderDeps'\nimport { useLoaderData } from './useLoaderData'\nimport { useSearch } from './useSearch'\nimport { useParams } from './useParams'\nimport { useNavigate } from './useNavigate'\nimport { useRouter } from './useRouter'\nimport { useRouteContext } from './useRouteContext'\nimport type { UseParamsRoute } from './useParams'\nimport type { UseMatchRoute } from './useMatch'\nimport type { UseSearchRoute } from './useSearch'\nimport type {\n AnyContext,\n AnyRoute,\n AnyRouter,\n Constrain,\n ConstrainLiteral,\n FileBaseRouteOptions,\n FileRoutesByPath,\n LazyRouteOptions,\n Register,\n RegisteredRouter,\n ResolveParams,\n Route,\n RouteById,\n RouteConstraints,\n RouteIds,\n RouteLoaderEntry,\n UpdatableRouteOptions,\n UseNavigateResult,\n} from '@tanstack/router-core'\nimport type { UseLoaderDepsRoute } from './useLoaderDeps'\nimport type { UseLoaderDataRoute } from './useLoaderData'\nimport type { UseRouteContextRoute } from './useRouteContext'\n\nexport function createFileRoute<\n TFilePath extends keyof FileRoutesByPath,\n TParentRoute extends AnyRoute = FileRoutesByPath[TFilePath]['parentRoute'],\n TId extends RouteConstraints['TId'] = FileRoutesByPath[TFilePath]['id'],\n TPath extends RouteConstraints['TPath'] = FileRoutesByPath[TFilePath]['path'],\n TFullPath extends RouteConstraints['TFullPath'] =\n FileRoutesByPath[TFilePath]['fullPath'],\n>(\n path?: TFilePath,\n): FileRoute<TFilePath, TParentRoute, TId, TPath, TFullPath>['createRoute'] {\n return new FileRoute<TFilePath, TParentRoute, TId, TPath, TFullPath>(path, {\n silent: true,\n }).createRoute\n}\n\n/** \n @deprecated It's no longer recommended to use the `FileRoute` class directly.\n Instead, use `createFileRoute('/path/to/file')(options)` to create a file route.\n*/\nexport class FileRoute<\n TFilePath extends keyof FileRoutesByPath,\n TParentRoute extends AnyRoute = FileRoutesByPath[TFilePath]['parentRoute'],\n TId extends RouteConstraints['TId'] = FileRoutesByPath[TFilePath]['id'],\n TPath extends RouteConstraints['TPath'] = FileRoutesByPath[TFilePath]['path'],\n TFullPath extends RouteConstraints['TFullPath'] =\n FileRoutesByPath[TFilePath]['fullPath'],\n> {\n silent?: boolean\n\n constructor(\n public path?: TFilePath,\n _opts?: { silent: boolean },\n ) {\n this.silent = _opts?.silent\n }\n\n createRoute = <\n TRegister = Register,\n TSearchValidator = undefined,\n TParams = ResolveParams<TPath>,\n TRouteContextFn = AnyContext,\n TBeforeLoadFn = AnyContext,\n TLoaderDeps extends Record<string, any> = {},\n TLoaderFn = undefined,\n TChildren = unknown,\n TSSR = unknown,\n TMiddlewares = unknown,\n THandlers = undefined,\n >(\n options?: FileBaseRouteOptions<\n TRegister,\n TParentRoute,\n TId,\n TPath,\n TSearchValidator,\n TParams,\n TLoaderDeps,\n TLoaderFn,\n AnyContext,\n TRouteContextFn,\n TBeforeLoadFn,\n AnyContext,\n TSSR,\n TMiddlewares,\n THandlers\n > &\n UpdatableRouteOptions<\n TParentRoute,\n TId,\n TFullPath,\n TParams,\n TSearchValidator,\n TLoaderFn,\n TLoaderDeps,\n AnyContext,\n TRouteContextFn,\n TBeforeLoadFn\n >,\n ): Route<\n TRegister,\n TParentRoute,\n TPath,\n TFullPath,\n TFilePath,\n TId,\n TSearchValidator,\n TParams,\n AnyContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TChildren,\n unknown,\n TSSR,\n TMiddlewares,\n THandlers\n > => {\n if (process.env.NODE_ENV !== 'production') {\n if (!this.silent) {\n console.warn(\n 'Warning: FileRoute is deprecated and will be removed in the next major version. Use the createFileRoute(path)(options) function instead.',\n )\n }\n }\n const route = createRoute(options as any)\n ;(route as any).isRoot = false\n return route as any\n }\n}\n\n/** \n @deprecated It's recommended not to split loaders into separate files.\n Instead, place the loader function in the the main route file, inside the\n `createFileRoute('/path/to/file)(options)` options.\n*/\nexport function FileRouteLoader<\n TFilePath extends keyof FileRoutesByPath,\n TRoute extends FileRoutesByPath[TFilePath]['preLoaderRoute'],\n>(\n _path: TFilePath,\n): <TLoaderFn>(\n loaderFn: Constrain<\n TLoaderFn,\n RouteLoaderEntry<\n Register,\n TRoute['parentRoute'],\n TRoute['types']['id'],\n TRoute['types']['params'],\n TRoute['types']['loaderDeps'],\n TRoute['types']['routerContext'],\n TRoute['types']['routeContextFn'],\n TRoute['types']['beforeLoadFn']\n >\n >,\n) => TLoaderFn {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `Warning: FileRouteLoader is deprecated and will be removed in the next major version. Please place the loader function in the the main route file, inside the \\`createFileRoute('/path/to/file')(options)\\` options`,\n )\n }\n return (loaderFn) => loaderFn as any\n}\n\ndeclare module '@tanstack/router-core' {\n export interface LazyRoute<in out TRoute extends AnyRoute> {\n useMatch: UseMatchRoute<TRoute['id']>\n useRouteContext: UseRouteContextRoute<TRoute['id']>\n useSearch: UseSearchRoute<TRoute['id']>\n useParams: UseParamsRoute<TRoute['id']>\n useLoaderDeps: UseLoaderDepsRoute<TRoute['id']>\n useLoaderData: UseLoaderDataRoute<TRoute['id']>\n useNavigate: () => UseNavigateResult<TRoute['fullPath']>\n }\n}\n\nexport class LazyRoute<TRoute extends AnyRoute> {\n options: {\n id: string\n } & LazyRouteOptions\n\n constructor(\n opts: {\n id: string\n } & LazyRouteOptions,\n ) {\n this.options = opts\n }\n\n useMatch: UseMatchRoute<TRoute['id']> = (opts) => {\n return useMatch({\n select: opts?.select,\n from: this.options.id,\n } as any) as any\n }\n\n useRouteContext: UseRouteContextRoute<TRoute['id']> = (opts) => {\n return useRouteContext({ ...(opts as any), from: this.options.id }) as any\n }\n\n useSearch: UseSearchRoute<TRoute['id']> = (opts) => {\n return useSearch({\n select: opts?.select,\n from: this.options.id,\n } as any) as any\n }\n\n useParams: UseParamsRoute<TRoute['id']> = (opts) => {\n return useParams({\n select: opts?.select,\n from: this.options.id,\n } as any) as any\n }\n\n useLoaderDeps: UseLoaderDepsRoute<TRoute['id']> = (opts) => {\n return useLoaderDeps({ ...opts, from: this.options.id } as any)\n }\n\n useLoaderData: UseLoaderDataRoute<TRoute['id']> = (opts) => {\n return useLoaderData({ ...opts, from: this.options.id } as any)\n }\n\n useNavigate = (): UseNavigateResult<TRoute['fullPath']> => {\n const router = useRouter()\n return useNavigate({ from: router.routesById[this.options.id].fullPath })\n }\n}\n\nexport function createLazyRoute<\n TRouter extends AnyRouter = RegisteredRouter,\n TId extends string = string,\n TRoute extends AnyRoute = RouteById<TRouter['routeTree'], TId>,\n>(id: ConstrainLiteral<TId, RouteIds<TRouter['routeTree']>>) {\n return (opts: LazyRouteOptions) => {\n return new LazyRoute<TRoute>({\n id: id,\n ...opts,\n })\n }\n}\nexport function createLazyFileRoute<\n TFilePath extends keyof FileRoutesByPath,\n TRoute extends FileRoutesByPath[TFilePath]['preLoaderRoute'],\n>(id: TFilePath): (opts: LazyRouteOptions) => LazyRoute<TRoute> {\n if (typeof id === 'object') {\n return new LazyRoute<TRoute>(id) as any\n }\n\n return (opts: LazyRouteOptions) => new LazyRoute<TRoute>({ id, ...opts })\n}\n"],"mappings":";;;;;;;;;;AAqCA,SAAgB,gBAQd,MAC0E;AAC1E,QAAO,IAAI,UAA0D,MAAM,EACzE,QAAQ,MACT,CAAC,CAAC;;;;;;AAOL,IAAa,YAAb,MAOE;CAGA,YACE,MACA,OACA;AAFO,OAAA,OAAA;sBAmBP,YAgDG;AACH,OAAA,QAAA,IAAA,aAA6B;QACvB,CAAC,KAAK,OACR,SAAQ,KACN,2IACD;;GAGL,MAAM,QAAQ,cAAA,YAAY,QAAe;AACvC,SAAc,SAAS;AACzB,UAAO;;AA1EP,OAAK,SAAS,OAAO;;;;;;;;AAmFzB,SAAgB,gBAId,OAea;AACb,KAAA,QAAA,IAAA,aAA6B,aAC3B,SAAQ,KACN,sNACD;AAEH,SAAQ,aAAa;;AAevB,IAAa,YAAb,MAAgD;CAK9C,YACE,MAGA;mBAIuC,SAAS;AAChD,UAAO,iBAAA,SAAS;IACd,QAAQ,MAAM;IACd,MAAM,KAAK,QAAQ;IACpB,CAAQ;;0BAG4C,SAAS;AAC9D,UAAO,wBAAA,gBAAgB;IAAE,GAAI;IAAc,MAAM,KAAK,QAAQ;IAAI,CAAC;;oBAG1B,SAAS;AAClD,UAAO,kBAAA,UAAU;IACf,QAAQ,MAAM;IACd,MAAM,KAAK,QAAQ;IACpB,CAAQ;;oBAGgC,SAAS;AAClD,UAAO,kBAAA,UAAU;IACf,QAAQ,MAAM;IACd,MAAM,KAAK,QAAQ;IACpB,CAAQ;;wBAGwC,SAAS;AAC1D,UAAO,sBAAA,cAAc;IAAE,GAAG;IAAM,MAAM,KAAK,QAAQ;IAAI,CAAQ;;wBAGd,SAAS;AAC1D,UAAO,sBAAA,cAAc;IAAE,GAAG;IAAM,MAAM,KAAK,QAAQ;IAAI,CAAQ;;2BAGN;AAEzD,UAAO,oBAAA,YAAY,EAAE,MADN,kBAAA,WAAW,CACQ,WAAW,KAAK,QAAQ,IAAI,UAAU,CAAC;;AAtCzE,OAAK,UAAU;;;AA0CnB,SAAgB,gBAId,IAA2D;AAC3D,SAAQ,SAA2B;AACjC,SAAO,IAAI,UAAkB;GACvB;GACJ,GAAG;GACJ,CAAC;;;AAGN,SAAgB,oBAGd,IAA8D;AAC9D,KAAI,OAAO,OAAO,SAChB,QAAO,IAAI,UAAkB,GAAG;AAGlC,SAAQ,SAA2B,IAAI,UAAkB;EAAE;EAAI,GAAG;EAAM,CAAC"}
1
+ {"version":3,"file":"fileRoute.cjs","names":[],"sources":["../../src/fileRoute.ts"],"sourcesContent":["import { createRoute } from './route'\n\nimport { useMatch } from './useMatch'\nimport { useLoaderDeps } from './useLoaderDeps'\nimport { useLoaderData } from './useLoaderData'\nimport { useSearch } from './useSearch'\nimport { useParams } from './useParams'\nimport { useNavigate } from './useNavigate'\nimport { useRouter } from './useRouter'\nimport { useRouteContext } from './useRouteContext'\nimport type { UseParamsRoute } from './useParams'\nimport type { UseMatchRoute } from './useMatch'\nimport type { UseSearchRoute } from './useSearch'\nimport type {\n AnyContext,\n AnyRoute,\n AnyRouter,\n Constrain,\n ConstrainLiteral,\n FileBaseRouteOptions,\n FileRoutesByPath,\n LazyRouteOptions,\n Register,\n RegisteredRouter,\n ResolveParams,\n Route,\n RouteById,\n RouteConstraints,\n RouteIds,\n RouteLoaderEntry,\n UpdatableRouteOptions,\n UseNavigateResult,\n} from '@tanstack/router-core'\nimport type { UseLoaderDepsRoute } from './useLoaderDeps'\nimport type { UseLoaderDataRoute } from './useLoaderData'\nimport type { UseRouteContextRoute } from './useRouteContext'\n\nexport function createFileRoute<\n TFilePath extends keyof FileRoutesByPath,\n TParentRoute extends AnyRoute = FileRoutesByPath[TFilePath]['parentRoute'],\n TId extends RouteConstraints['TId'] = FileRoutesByPath[TFilePath]['id'],\n TPath extends RouteConstraints['TPath'] = FileRoutesByPath[TFilePath]['path'],\n TFullPath extends RouteConstraints['TFullPath'] =\n FileRoutesByPath[TFilePath]['fullPath'],\n>(\n path?: TFilePath,\n): FileRoute<TFilePath, TParentRoute, TId, TPath, TFullPath>['createRoute'] {\n return new FileRoute<TFilePath, TParentRoute, TId, TPath, TFullPath>(path, {\n silent: true,\n }).createRoute\n}\n\n/** \n @deprecated It's no longer recommended to use the `FileRoute` class directly.\n Instead, use `createFileRoute('/path/to/file')(options)` to create a file route.\n*/\nexport class FileRoute<\n TFilePath extends keyof FileRoutesByPath,\n TParentRoute extends AnyRoute = FileRoutesByPath[TFilePath]['parentRoute'],\n TId extends RouteConstraints['TId'] = FileRoutesByPath[TFilePath]['id'],\n TPath extends RouteConstraints['TPath'] = FileRoutesByPath[TFilePath]['path'],\n TFullPath extends RouteConstraints['TFullPath'] =\n FileRoutesByPath[TFilePath]['fullPath'],\n> {\n silent?: boolean\n\n constructor(\n public path?: TFilePath,\n _opts?: { silent: boolean },\n ) {\n this.silent = _opts?.silent\n }\n\n createRoute = <\n TRegister = Register,\n TSearchValidator = undefined,\n TParams = ResolveParams<TPath>,\n TRouteContextFn = AnyContext,\n TBeforeLoadFn = AnyContext,\n TLoaderDeps extends Record<string, any> = {},\n TLoaderFn = undefined,\n TChildren = unknown,\n TSSR = unknown,\n const TMiddlewares = unknown,\n THandlers = undefined,\n >(\n options?: FileBaseRouteOptions<\n TRegister,\n TParentRoute,\n TId,\n TPath,\n TSearchValidator,\n TParams,\n TLoaderDeps,\n TLoaderFn,\n AnyContext,\n TRouteContextFn,\n TBeforeLoadFn,\n AnyContext,\n TSSR,\n TMiddlewares,\n THandlers\n > &\n UpdatableRouteOptions<\n TParentRoute,\n TId,\n TFullPath,\n TParams,\n TSearchValidator,\n TLoaderFn,\n TLoaderDeps,\n AnyContext,\n TRouteContextFn,\n TBeforeLoadFn\n >,\n ): Route<\n TRegister,\n TParentRoute,\n TPath,\n TFullPath,\n TFilePath,\n TId,\n TSearchValidator,\n TParams,\n AnyContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TChildren,\n unknown,\n TSSR,\n TMiddlewares,\n THandlers\n > => {\n if (process.env.NODE_ENV !== 'production') {\n if (!this.silent) {\n console.warn(\n 'Warning: FileRoute is deprecated and will be removed in the next major version. Use the createFileRoute(path)(options) function instead.',\n )\n }\n }\n const route = createRoute(options as any)\n ;(route as any).isRoot = false\n return route as any\n }\n}\n\n/** \n @deprecated It's recommended not to split loaders into separate files.\n Instead, place the loader function in the the main route file, inside the\n `createFileRoute('/path/to/file)(options)` options.\n*/\nexport function FileRouteLoader<\n TFilePath extends keyof FileRoutesByPath,\n TRoute extends FileRoutesByPath[TFilePath]['preLoaderRoute'],\n>(\n _path: TFilePath,\n): <TLoaderFn>(\n loaderFn: Constrain<\n TLoaderFn,\n RouteLoaderEntry<\n Register,\n TRoute['parentRoute'],\n TRoute['types']['id'],\n TRoute['types']['params'],\n TRoute['types']['loaderDeps'],\n TRoute['types']['routerContext'],\n TRoute['types']['routeContextFn'],\n TRoute['types']['beforeLoadFn']\n >\n >,\n) => TLoaderFn {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `Warning: FileRouteLoader is deprecated and will be removed in the next major version. Please place the loader function in the the main route file, inside the \\`createFileRoute('/path/to/file')(options)\\` options`,\n )\n }\n return (loaderFn) => loaderFn as any\n}\n\ndeclare module '@tanstack/router-core' {\n export interface LazyRoute<in out TRoute extends AnyRoute> {\n useMatch: UseMatchRoute<TRoute['id']>\n useRouteContext: UseRouteContextRoute<TRoute['id']>\n useSearch: UseSearchRoute<TRoute['id']>\n useParams: UseParamsRoute<TRoute['id']>\n useLoaderDeps: UseLoaderDepsRoute<TRoute['id']>\n useLoaderData: UseLoaderDataRoute<TRoute['id']>\n useNavigate: () => UseNavigateResult<TRoute['fullPath']>\n }\n}\n\nexport class LazyRoute<TRoute extends AnyRoute> {\n options: {\n id: string\n } & LazyRouteOptions\n\n constructor(\n opts: {\n id: string\n } & LazyRouteOptions,\n ) {\n this.options = opts\n }\n\n useMatch: UseMatchRoute<TRoute['id']> = (opts) => {\n return useMatch({\n select: opts?.select,\n from: this.options.id,\n } as any) as any\n }\n\n useRouteContext: UseRouteContextRoute<TRoute['id']> = (opts) => {\n return useRouteContext({ ...(opts as any), from: this.options.id }) as any\n }\n\n useSearch: UseSearchRoute<TRoute['id']> = (opts) => {\n return useSearch({\n select: opts?.select,\n from: this.options.id,\n } as any) as any\n }\n\n useParams: UseParamsRoute<TRoute['id']> = (opts) => {\n return useParams({\n select: opts?.select,\n from: this.options.id,\n } as any) as any\n }\n\n useLoaderDeps: UseLoaderDepsRoute<TRoute['id']> = (opts) => {\n return useLoaderDeps({ ...opts, from: this.options.id } as any)\n }\n\n useLoaderData: UseLoaderDataRoute<TRoute['id']> = (opts) => {\n return useLoaderData({ ...opts, from: this.options.id } as any)\n }\n\n useNavigate = (): UseNavigateResult<TRoute['fullPath']> => {\n const router = useRouter()\n return useNavigate({ from: router.routesById[this.options.id].fullPath })\n }\n}\n\nexport function createLazyRoute<\n TRouter extends AnyRouter = RegisteredRouter,\n TId extends string = string,\n TRoute extends AnyRoute = RouteById<TRouter['routeTree'], TId>,\n>(id: ConstrainLiteral<TId, RouteIds<TRouter['routeTree']>>) {\n return (opts: LazyRouteOptions) => {\n return new LazyRoute<TRoute>({\n id: id,\n ...opts,\n })\n }\n}\nexport function createLazyFileRoute<\n TFilePath extends keyof FileRoutesByPath,\n TRoute extends FileRoutesByPath[TFilePath]['preLoaderRoute'],\n>(id: TFilePath): (opts: LazyRouteOptions) => LazyRoute<TRoute> {\n if (typeof id === 'object') {\n return new LazyRoute<TRoute>(id) as any\n }\n\n return (opts: LazyRouteOptions) => new LazyRoute<TRoute>({ id, ...opts })\n}\n"],"mappings":";;;;;;;;;;AAqCA,SAAgB,gBAQd,MAC0E;AAC1E,QAAO,IAAI,UAA0D,MAAM,EACzE,QAAQ,MACT,CAAC,CAAC;;;;;;AAOL,IAAa,YAAb,MAOE;CAGA,YACE,MACA,OACA;AAFO,OAAA,OAAA;sBAmBP,YAgDG;AACH,OAAA,QAAA,IAAA,aAA6B;QACvB,CAAC,KAAK,OACR,SAAQ,KACN,2IACD;;GAGL,MAAM,QAAQ,cAAA,YAAY,QAAe;AACvC,SAAc,SAAS;AACzB,UAAO;;AA1EP,OAAK,SAAS,OAAO;;;;;;;;AAmFzB,SAAgB,gBAId,OAea;AACb,KAAA,QAAA,IAAA,aAA6B,aAC3B,SAAQ,KACN,sNACD;AAEH,SAAQ,aAAa;;AAevB,IAAa,YAAb,MAAgD;CAK9C,YACE,MAGA;mBAIuC,SAAS;AAChD,UAAO,iBAAA,SAAS;IACd,QAAQ,MAAM;IACd,MAAM,KAAK,QAAQ;IACpB,CAAQ;;0BAG4C,SAAS;AAC9D,UAAO,wBAAA,gBAAgB;IAAE,GAAI;IAAc,MAAM,KAAK,QAAQ;IAAI,CAAC;;oBAG1B,SAAS;AAClD,UAAO,kBAAA,UAAU;IACf,QAAQ,MAAM;IACd,MAAM,KAAK,QAAQ;IACpB,CAAQ;;oBAGgC,SAAS;AAClD,UAAO,kBAAA,UAAU;IACf,QAAQ,MAAM;IACd,MAAM,KAAK,QAAQ;IACpB,CAAQ;;wBAGwC,SAAS;AAC1D,UAAO,sBAAA,cAAc;IAAE,GAAG;IAAM,MAAM,KAAK,QAAQ;IAAI,CAAQ;;wBAGd,SAAS;AAC1D,UAAO,sBAAA,cAAc;IAAE,GAAG;IAAM,MAAM,KAAK,QAAQ;IAAI,CAAQ;;2BAGN;AAEzD,UAAO,oBAAA,YAAY,EAAE,MADN,kBAAA,WAAW,CACQ,WAAW,KAAK,QAAQ,IAAI,UAAU,CAAC;;AAtCzE,OAAK,UAAU;;;AA0CnB,SAAgB,gBAId,IAA2D;AAC3D,SAAQ,SAA2B;AACjC,SAAO,IAAI,UAAkB;GACvB;GACJ,GAAG;GACJ,CAAC;;;AAGN,SAAgB,oBAGd,IAA8D;AAC9D,KAAI,OAAO,OAAO,SAChB,QAAO,IAAI,UAAkB,GAAG;AAGlC,SAAQ,SAA2B,IAAI,UAAkB;EAAE;EAAI,GAAG;EAAM,CAAC"}
@@ -16,7 +16,7 @@ export declare class FileRoute<TFilePath extends keyof FileRoutesByPath, TParent
16
16
  constructor(path?: TFilePath | undefined, _opts?: {
17
17
  silent: boolean;
18
18
  });
19
- createRoute: <TRegister = Register, TSearchValidator = undefined, TParams = ResolveParams<TPath>, TRouteContextFn = AnyContext, TBeforeLoadFn = AnyContext, TLoaderDeps extends Record<string, any> = {}, TLoaderFn = undefined, TChildren = unknown, TSSR = unknown, TMiddlewares = unknown, THandlers = undefined>(options?: FileBaseRouteOptions<TRegister, TParentRoute, TId, TPath, TSearchValidator, TParams, TLoaderDeps, TLoaderFn, AnyContext, TRouteContextFn, TBeforeLoadFn, AnyContext, TSSR, TMiddlewares, THandlers> & UpdatableRouteOptions<TParentRoute, TId, TFullPath, TParams, TSearchValidator, TLoaderFn, TLoaderDeps, AnyContext, TRouteContextFn, TBeforeLoadFn>) => Route<TRegister, TParentRoute, TPath, TFullPath, TFilePath, TId, TSearchValidator, TParams, AnyContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TLoaderFn, TChildren, unknown, TSSR, TMiddlewares, THandlers>;
19
+ createRoute: <TRegister = Register, TSearchValidator = undefined, TParams = ResolveParams<TPath>, TRouteContextFn = AnyContext, TBeforeLoadFn = AnyContext, TLoaderDeps extends Record<string, any> = {}, TLoaderFn = undefined, TChildren = unknown, TSSR = unknown, const TMiddlewares = unknown, THandlers = undefined>(options?: FileBaseRouteOptions<TRegister, TParentRoute, TId, TPath, TSearchValidator, TParams, TLoaderDeps, TLoaderFn, AnyContext, TRouteContextFn, TBeforeLoadFn, AnyContext, TSSR, TMiddlewares, THandlers> & UpdatableRouteOptions<TParentRoute, TId, TFullPath, TParams, TSearchValidator, TLoaderFn, TLoaderDeps, AnyContext, TRouteContextFn, TBeforeLoadFn>) => Route<TRegister, TParentRoute, TPath, TFullPath, TFilePath, TId, TSearchValidator, TParams, AnyContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TLoaderFn, TChildren, unknown, TSSR, TMiddlewares, THandlers>;
20
20
  }
21
21
  /**
22
22
  @deprecated It's recommended not to split loaders into separate files.
@@ -71,14 +71,29 @@ var useTags = (assetCrossOrigin) => {
71
71
  }
72
72
  }));
73
73
  const manifest = router.ssr?.manifest;
74
- const assets = matches.map((match) => manifest?.routes[match.routeId]?.assets ?? []).filter(Boolean).flat(1).filter((asset) => asset.tag === "link").map((asset) => ({
75
- tag: "link",
76
- attrs: {
77
- ...asset.attrs,
78
- crossOrigin: (0, _tanstack_router_core.getAssetCrossOrigin)(assetCrossOrigin, "stylesheet") ?? asset.attrs?.crossOrigin,
79
- nonce
74
+ const assets = matches.map((match) => manifest?.routes[match.routeId]?.assets ?? []).filter(Boolean).flat(1).flatMap((asset) => {
75
+ if (asset.tag === "link") {
76
+ if ((0, _tanstack_router_core.isInlinableStylesheet)(manifest, asset)) return [];
77
+ return [{
78
+ tag: "link",
79
+ attrs: {
80
+ ...asset.attrs,
81
+ crossOrigin: (0, _tanstack_router_core.getAssetCrossOrigin)(assetCrossOrigin, "stylesheet") ?? asset.attrs?.crossOrigin,
82
+ nonce
83
+ }
84
+ }];
80
85
  }
81
- }));
86
+ if (asset.tag === "style") return [{
87
+ tag: "style",
88
+ attrs: {
89
+ ...asset.attrs,
90
+ nonce
91
+ },
92
+ children: asset.children,
93
+ ...asset.inlineCss ? { inlineCss: true } : {}
94
+ }];
95
+ return [];
96
+ });
82
97
  return [...constructed, ...assets];
83
98
  });
84
99
  const preloadLinks = solid_js.createMemo(() => {
@@ -125,9 +140,24 @@ var useTags = (assetCrossOrigin) => {
125
140
  return JSON.stringify(d);
126
141
  });
127
142
  if (prev === void 0) return next;
128
- return (0, _tanstack_router_core.replaceEqualDeep)(prev, next);
143
+ return replaceEqualTags(prev, next);
129
144
  });
130
145
  };
146
+ function replaceEqualTags(prev, next) {
147
+ const prevByKey = /* @__PURE__ */ new Map();
148
+ for (const tag of prev) prevByKey.set(JSON.stringify(tag), tag);
149
+ let isEqual = prev.length === next.length;
150
+ const result = next.map((tag, index) => {
151
+ const existing = prevByKey.get(JSON.stringify(tag));
152
+ if (existing) {
153
+ if (existing !== prev[index]) isEqual = false;
154
+ return existing;
155
+ }
156
+ isEqual = false;
157
+ return tag;
158
+ });
159
+ return isEqual ? prev : result;
160
+ }
131
161
  function uniqBy(arr, fn) {
132
162
  const seen = /* @__PURE__ */ new Set();
133
163
  return arr.filter((item) => {
@@ -1 +1 @@
1
- {"version":3,"file":"headContentUtils.cjs","names":["Solid","escapeHtml","getAssetCrossOrigin","replaceEqualDeep","resolveManifestAssetLink","useRouter","AssetCrossOriginConfig","RouterManagedTag","useTags","assetCrossOrigin","router","nonce","options","ssr","activeMatches","createMemo","stores","matches","get","routeMeta","map","match","meta","filter","Boolean","Accessor","Array","resultMeta","metaByAttribute","Record","title","routeMetasArray","i","length","metas","j","m","tag","children","json","JSON","stringify","push","attrs","type","attribute","name","property","content","reverse","links","constructed","flat","link","manifest","assets","routes","routeId","asset","crossOrigin","preloadLinks","looseRoutesById","forEach","route","id","preloads","preload","preloadLink","rel","href","styles","style","headScripts","script","prev","next","uniqBy","d","undefined","arr","T","fn","item","seen","Set","key","has","add"],"sources":["../../src/headContentUtils.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport {\n escapeHtml,\n getAssetCrossOrigin,\n replaceEqualDeep,\n resolveManifestAssetLink,\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 list of head/link/meta/script tags to render for active matches.\n * Used internally by `HeadContent`.\n */\nexport const useTags = (assetCrossOrigin?: AssetCrossOriginConfig) => {\n const router = useRouter()\n const nonce = router.options.ssr?.nonce\n const activeMatches = Solid.createMemo(() => router.stores.matches.get())\n const routeMeta = Solid.createMemo(() =>\n activeMatches()\n .map((match) => match.meta!)\n .filter(Boolean),\n )\n\n const meta: Solid.Accessor<Array<RouterManagedTag>> = Solid.createMemo(() => {\n const resultMeta: Array<RouterManagedTag> = []\n const metaByAttribute: Record<string, true> = {}\n let title: RouterManagedTag | undefined\n const routeMetasArray = routeMeta()\n for (let i = routeMetasArray.length - 1; i >= 0; i--) {\n const metas = routeMetasArray[i]!\n for (let j = metas.length - 1; j >= 0; j--) {\n const m = metas[j]\n if (!m) continue\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 return resultMeta\n })\n\n const links = Solid.createMemo(() => {\n const matches = activeMatches()\n const constructed = matches\n .map((match) => match.links!)\n .filter(Boolean)\n .flat(1)\n .map((link) => ({\n tag: 'link',\n attrs: {\n ...link,\n nonce,\n },\n })) satisfies Array<RouterManagedTag>\n\n const manifest = router.ssr?.manifest\n\n const assets = matches\n .map((match) => manifest?.routes[match.routeId]?.assets ?? [])\n .filter(Boolean)\n .flat(1)\n .filter((asset) => asset.tag === 'link')\n .map(\n (asset) =>\n ({\n tag: 'link',\n attrs: {\n ...asset.attrs,\n crossOrigin:\n getAssetCrossOrigin(assetCrossOrigin, 'stylesheet') ??\n asset.attrs?.crossOrigin,\n nonce,\n },\n }) satisfies RouterManagedTag,\n )\n\n return [...constructed, ...assets]\n })\n\n const preloadLinks = Solid.createMemo(() => {\n const matches = activeMatches()\n const preloadLinks: Array<RouterManagedTag> = []\n\n matches\n .map((match) => router.looseRoutesById[match.routeId]!)\n .forEach((route) =>\n router.ssr?.manifest?.routes[route.id]?.preloads\n ?.filter(Boolean)\n .forEach((preload) => {\n const preloadLink = resolveManifestAssetLink(preload)\n preloadLinks.push({\n tag: 'link',\n attrs: {\n rel: 'modulepreload',\n href: preloadLink.href,\n crossOrigin:\n getAssetCrossOrigin(assetCrossOrigin, 'modulepreload') ??\n preloadLink.crossOrigin,\n nonce,\n },\n })\n }),\n )\n\n return preloadLinks\n })\n\n const styles = Solid.createMemo(() =>\n (\n activeMatches()\n .map((match) => match.styles!)\n .flat(1)\n .filter(Boolean) as Array<RouterManagedTag>\n ).map(({ children, ...style }) => ({\n tag: 'style',\n attrs: {\n ...style,\n nonce,\n },\n children,\n })),\n )\n\n const headScripts = Solid.createMemo(() =>\n (\n activeMatches()\n .map((match) => match.headScripts!)\n .flat(1)\n .filter(Boolean) as Array<RouterManagedTag>\n ).map(({ children, ...script }) => ({\n tag: 'script',\n attrs: {\n ...script,\n nonce,\n },\n children,\n })),\n )\n\n return Solid.createMemo((prev: Array<RouterManagedTag> | undefined) => {\n const next = uniqBy(\n [\n ...meta(),\n ...preloadLinks(),\n ...links(),\n ...styles(),\n ...headScripts(),\n ] as Array<RouterManagedTag>,\n (d) => {\n return JSON.stringify(d)\n },\n )\n if (prev === undefined) {\n return next\n }\n return replaceEqualDeep(prev, next)\n })\n}\n\nexport function uniqBy<T>(arr: Array<T>, fn: (item: T) => string) {\n const seen = new Set<string>()\n return arr.filter((item) => {\n const key = fn(item)\n if (seen.has(key)) {\n return false\n }\n seen.add(key)\n return true\n })\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"headContentUtils.cjs","names":["Solid","escapeHtml","getAssetCrossOrigin","isInlinableStylesheet","resolveManifestAssetLink","useRouter","AssetCrossOriginConfig","RouterManagedTag","useTags","assetCrossOrigin","router","nonce","options","ssr","activeMatches","createMemo","stores","matches","get","routeMeta","map","match","meta","filter","Boolean","Accessor","Array","resultMeta","metaByAttribute","Record","title","routeMetasArray","i","length","metas","j","m","tag","children","json","JSON","stringify","push","attrs","type","attribute","name","property","content","reverse","links","constructed","flat","link","manifest","assets","routes","routeId","flatMap","asset","crossOrigin","inlineCss","const","preloadLinks","looseRoutesById","forEach","route","id","preloads","preload","preloadLink","rel","href","styles","style","headScripts","script","prev","next","uniqBy","d","undefined","replaceEqualTags","prevByKey","Map","set","isEqual","result","index","existing","arr","T","fn","item","seen","Set","key","has","add"],"sources":["../../src/headContentUtils.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport {\n escapeHtml,\n getAssetCrossOrigin,\n isInlinableStylesheet,\n resolveManifestAssetLink,\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 list of head/link/meta/script tags to render for active matches.\n * Used internally by `HeadContent`.\n */\nexport const useTags = (assetCrossOrigin?: AssetCrossOriginConfig) => {\n const router = useRouter()\n const nonce = router.options.ssr?.nonce\n const activeMatches = Solid.createMemo(() => router.stores.matches.get())\n const routeMeta = Solid.createMemo(() =>\n activeMatches()\n .map((match) => match.meta!)\n .filter(Boolean),\n )\n\n const meta: Solid.Accessor<Array<RouterManagedTag>> = Solid.createMemo(() => {\n const resultMeta: Array<RouterManagedTag> = []\n const metaByAttribute: Record<string, true> = {}\n let title: RouterManagedTag | undefined\n const routeMetasArray = routeMeta()\n for (let i = routeMetasArray.length - 1; i >= 0; i--) {\n const metas = routeMetasArray[i]!\n for (let j = metas.length - 1; j >= 0; j--) {\n const m = metas[j]\n if (!m) continue\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 return resultMeta\n })\n\n const links = Solid.createMemo(() => {\n const matches = activeMatches()\n const constructed = matches\n .map((match) => match.links!)\n .filter(Boolean)\n .flat(1)\n .map((link) => ({\n tag: 'link',\n attrs: {\n ...link,\n nonce,\n },\n })) satisfies Array<RouterManagedTag>\n\n const manifest = router.ssr?.manifest\n\n const assets = matches\n .map((match) => manifest?.routes[match.routeId]?.assets ?? [])\n .filter(Boolean)\n .flat(1)\n .flatMap((asset): Array<RouterManagedTag> => {\n if (asset.tag === 'link') {\n if (isInlinableStylesheet(manifest, asset)) {\n return []\n }\n\n return [\n {\n tag: 'link',\n attrs: {\n ...asset.attrs,\n crossOrigin:\n getAssetCrossOrigin(assetCrossOrigin, 'stylesheet') ??\n asset.attrs?.crossOrigin,\n nonce,\n },\n },\n ]\n }\n\n if (asset.tag === 'style') {\n return [\n {\n tag: 'style',\n attrs: {\n ...asset.attrs,\n nonce,\n },\n children: asset.children,\n ...(asset.inlineCss ? { inlineCss: true as const } : {}),\n },\n ]\n }\n\n return []\n })\n\n return [...constructed, ...assets]\n })\n\n const preloadLinks = Solid.createMemo(() => {\n const matches = activeMatches()\n const preloadLinks: Array<RouterManagedTag> = []\n\n matches\n .map((match) => router.looseRoutesById[match.routeId]!)\n .forEach((route) =>\n router.ssr?.manifest?.routes[route.id]?.preloads\n ?.filter(Boolean)\n .forEach((preload) => {\n const preloadLink = resolveManifestAssetLink(preload)\n preloadLinks.push({\n tag: 'link',\n attrs: {\n rel: 'modulepreload',\n href: preloadLink.href,\n crossOrigin:\n getAssetCrossOrigin(assetCrossOrigin, 'modulepreload') ??\n preloadLink.crossOrigin,\n nonce,\n },\n })\n }),\n )\n\n return preloadLinks\n })\n\n const styles = Solid.createMemo(() =>\n (\n activeMatches()\n .map((match) => match.styles!)\n .flat(1)\n .filter(Boolean) as Array<RouterManagedTag>\n ).map(({ children, ...style }) => ({\n tag: 'style',\n attrs: {\n ...style,\n nonce,\n },\n children,\n })),\n )\n\n const headScripts = Solid.createMemo(() =>\n (\n activeMatches()\n .map((match) => match.headScripts!)\n .flat(1)\n .filter(Boolean) as Array<RouterManagedTag>\n ).map(({ children, ...script }) => ({\n tag: 'script',\n attrs: {\n ...script,\n nonce,\n },\n children,\n })),\n )\n\n return Solid.createMemo((prev: Array<RouterManagedTag> | undefined) => {\n const next = uniqBy(\n [\n ...meta(),\n ...preloadLinks(),\n ...links(),\n ...styles(),\n ...headScripts(),\n ] as Array<RouterManagedTag>,\n (d) => {\n return JSON.stringify(d)\n },\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\nexport function uniqBy<T>(arr: Array<T>, fn: (item: T) => string) {\n const seen = new Set<string>()\n return arr.filter((item) => {\n const key = fn(item)\n if (seen.has(key)) {\n return false\n }\n seen.add(key)\n return true\n })\n}\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import { RouterManagedTag } from '@tanstack/router-core';
2
2
  import { JSX } from 'solid-js';
3
- export declare function Asset({ tag, attrs, children, }: RouterManagedTag): JSX.Element | null;
3
+ export declare function Asset(asset: RouterManagedTag): JSX.Element | null;
package/dist/esm/Asset.js CHANGED
@@ -5,12 +5,19 @@ import { isServer } from "@tanstack/router-core/isServer";
5
5
  import { Link, Meta, Style, Title } from "@solidjs/meta";
6
6
  //#region src/Asset.tsx
7
7
  var _tmpl$ = /* @__PURE__ */ template(`<script>`);
8
- function Asset({ tag, attrs, children }) {
8
+ var INLINE_CSS_HYDRATION_ATTR = "data-tsr-inline-css";
9
+ function Asset(asset) {
10
+ const { tag, attrs, children } = asset;
9
11
  switch (tag) {
10
12
  case "title": return createComponent(Title, mergeProps(attrs, { children }));
11
13
  case "meta": return createComponent(Meta, attrs);
12
14
  case "link": return createComponent(Link, attrs);
13
- case "style": return createComponent(Style, mergeProps(attrs, { children }));
15
+ case "style":
16
+ if (asset.inlineCss && (process.env.TSS_INLINE_CSS_ENABLED === "true" || process.env.TSS_INLINE_CSS_ENABLED === void 0 && isServer)) return createComponent(InlineCssStyle, {
17
+ attrs,
18
+ children
19
+ });
20
+ return createComponent(Style, mergeProps(attrs, { children }));
14
21
  case "script": return createComponent(Script, {
15
22
  attrs,
16
23
  children
@@ -18,6 +25,10 @@ function Asset({ tag, attrs, children }) {
18
25
  default: return null;
19
26
  }
20
27
  }
28
+ function InlineCssStyle({ attrs, children }) {
29
+ const html = children === void 0 ? typeof document === "undefined" ? "" : document.querySelector(`style[${INLINE_CSS_HYDRATION_ATTR}]`)?.textContent ?? "" : children ?? "";
30
+ return createComponent(Style, mergeProps(attrs, { [INLINE_CSS_HYDRATION_ATTR]: "" }, { children: html }));
31
+ }
21
32
  function Script({ attrs, children }) {
22
33
  const router = useRouter();
23
34
  const dataScript = typeof attrs?.type === "string" && attrs.type !== "" && attrs.type !== "text/javascript" && attrs.type !== "module";
@@ -1 +1 @@
1
- {"version":3,"file":"Asset.js","names":["Link","Meta","Style","Title","onCleanup","onMount","isServer","useRouter","RouterManagedTag","JSX","Asset","tag","attrs","children","Element","_$createComponent","_$mergeProps","Script","ScriptAttrs","key","src","router","dataScript","type","normSrc","base","document","baseURI","window","location","href","URL","existingScript","Array","from","querySelectorAll","find","el","HTMLScriptElement","script","createElement","value","Object","entries","undefined","setAttribute","String","head","appendChild","parentNode","removeChild","typeAttr","nonceAttr","nonce","sType","getAttribute","sNonce","textContent","_el$","_tmpl$","_$spread","_el$2","_el$3"],"sources":["../../src/Asset.tsx"],"sourcesContent":["import { Link, Meta, Style, Title } from '@solidjs/meta'\nimport { onCleanup, onMount } from 'solid-js'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport { useRouter } from './useRouter'\nimport type { RouterManagedTag } from '@tanstack/router-core'\nimport type { JSX } from 'solid-js'\n\nexport function Asset({\n tag,\n attrs,\n children,\n}: RouterManagedTag): JSX.Element | null {\n switch (tag) {\n case 'title':\n return <Title {...attrs}>{children}</Title>\n case 'meta':\n return <Meta {...attrs} />\n case 'link':\n return <Link {...attrs} />\n case 'style':\n return <Style {...attrs}>{children}</Style>\n case 'script':\n return <Script attrs={attrs}>{children}</Script>\n default:\n return null\n }\n}\n\ninterface ScriptAttrs {\n [key: string]: string | boolean | undefined\n src?: string\n}\n\nfunction Script({\n attrs,\n children,\n}: {\n attrs?: ScriptAttrs\n children?: string\n}): JSX.Element | null {\n const router = useRouter()\n const dataScript =\n typeof attrs?.type === 'string' &&\n attrs.type !== '' &&\n attrs.type !== 'text/javascript' &&\n attrs.type !== 'module'\n\n onMount(() => {\n if (dataScript) return\n\n if (attrs?.src) {\n const normSrc = (() => {\n try {\n const base = document.baseURI || window.location.href\n return new URL(attrs.src, base).href\n } catch {\n return attrs.src\n }\n })()\n const existingScript = Array.from(\n document.querySelectorAll('script[src]'),\n ).find((el) => (el as HTMLScriptElement).src === normSrc)\n\n if (existingScript) {\n return\n }\n\n const script = document.createElement('script')\n\n for (const [key, value] of Object.entries(attrs)) {\n if (value !== undefined && value !== false) {\n script.setAttribute(\n key,\n typeof value === 'boolean' ? '' : String(value),\n )\n }\n }\n\n document.head.appendChild(script)\n\n onCleanup(() => {\n if (script.parentNode) {\n script.parentNode.removeChild(script)\n }\n })\n }\n\n if (typeof children === 'string') {\n const typeAttr =\n typeof attrs?.type === 'string' ? attrs.type : 'text/javascript'\n const nonceAttr =\n typeof attrs?.nonce === 'string' ? attrs.nonce : undefined\n const existingScript = Array.from(\n document.querySelectorAll('script:not([src])'),\n ).find((el) => {\n if (!(el instanceof HTMLScriptElement)) return false\n const sType = el.getAttribute('type') ?? 'text/javascript'\n const sNonce = el.getAttribute('nonce') ?? undefined\n return (\n el.textContent === children &&\n sType === typeAttr &&\n sNonce === nonceAttr\n )\n })\n\n if (existingScript) {\n return\n }\n\n const script = document.createElement('script')\n script.textContent = children\n\n if (attrs) {\n for (const [key, value] of Object.entries(attrs)) {\n if (value !== undefined && value !== false) {\n script.setAttribute(\n key,\n typeof value === 'boolean' ? '' : String(value),\n )\n }\n }\n }\n\n document.head.appendChild(script)\n\n onCleanup(() => {\n if (script.parentNode) {\n script.parentNode.removeChild(script)\n }\n })\n }\n })\n\n if (!(isServer ?? router.isServer)) {\n if (dataScript && typeof children === 'string') {\n return <script {...attrs} innerHTML={children} />\n }\n\n // render an empty script on the client just to avoid hydration errors\n return null\n }\n\n if (attrs?.src && typeof attrs.src === 'string') {\n return <script {...attrs} />\n }\n\n if (typeof children === 'string') {\n return <script {...attrs} innerHTML={children} />\n }\n\n return null\n}\n"],"mappings":";;;;;;;AAOA,SAAgBU,MAAM,EACpBC,KACAC,OACAC,YACuC;AACvC,SAAQF,KAAR;EACE,KAAK,QACH,QAAAI,gBAAQZ,OAAKa,WAAKJ,OAAK,EAAGC,UAAQ,CAAA,CAAA;EACpC,KAAK,OACH,QAAAE,gBAAQd,MAASW,MAAK;EACxB,KAAK,OACH,QAAAG,gBAAQf,MAASY,MAAK;EACxB,KAAK,QACH,QAAAG,gBAAQb,OAAKc,WAAKJ,OAAK,EAAGC,UAAQ,CAAA,CAAA;EACpC,KAAK,SACH,QAAAE,gBAAQE,QAAM;GAAQL;GAAQC;GAAQ,CAAA;EACxC,QACE,QAAO;;;AASb,SAASI,OAAO,EACdL,OACAC,YAIqB;CACrB,MAAMQ,SAASd,WAAW;CAC1B,MAAMe,aACJ,OAAOV,OAAOW,SAAS,YACvBX,MAAMW,SAAS,MACfX,MAAMW,SAAS,qBACfX,MAAMW,SAAS;AAEjBlB,eAAc;AACZ,MAAIiB,WAAY;AAEhB,MAAIV,OAAOQ,KAAK;GACd,MAAMI,iBAAiB;AACrB,QAAI;KACF,MAAMC,OAAOC,SAASC,WAAWC,OAAOC,SAASC;AACjD,YAAO,IAAIC,IAAInB,MAAMQ,KAAKK,KAAK,CAACK;YAC1B;AACN,YAAOlB,MAAMQ;;OAEb;AAKJ,OAJuBa,MAAMC,KAC3BR,SAASS,iBAAiB,cAC5B,CAAC,CAACC,MAAMC,OAAQA,GAAyBjB,QAAQI,QAAQ,CAGvD;GAGF,MAAMe,SAASb,SAASc,cAAc,SAAS;AAE/C,QAAK,MAAM,CAACrB,KAAKsB,UAAUC,OAAOC,QAAQ/B,MAAM,CAC9C,KAAI6B,UAAUG,KAAAA,KAAaH,UAAU,MACnCF,QAAOM,aACL1B,KACA,OAAOsB,UAAU,YAAY,KAAKK,OAAOL,MAC3C,CAAC;AAILf,YAASqB,KAAKC,YAAYT,OAAO;AAEjCnC,mBAAgB;AACd,QAAImC,OAAOU,WACTV,QAAOU,WAAWC,YAAYX,OAAO;KAEvC;;AAGJ,MAAI,OAAO1B,aAAa,UAAU;GAChC,MAAMsC,WACJ,OAAOvC,OAAOW,SAAS,WAAWX,MAAMW,OAAO;GACjD,MAAM6B,YACJ,OAAOxC,OAAOyC,UAAU,WAAWzC,MAAMyC,QAAQT,KAAAA;AAcnD,OAbuBX,MAAMC,KAC3BR,SAASS,iBAAiB,oBAC5B,CAAC,CAACC,MAAMC,OAAO;AACb,QAAI,EAAEA,cAAcC,mBAAoB,QAAO;IAC/C,MAAMgB,QAAQjB,GAAGkB,aAAa,OAAO,IAAI;IACzC,MAAMC,SAASnB,GAAGkB,aAAa,QAAQ,IAAIX,KAAAA;AAC3C,WACEP,GAAGoB,gBAAgB5C,YACnByC,UAAUH,YACVK,WAAWJ;KAEb,CAGA;GAGF,MAAMb,SAASb,SAASc,cAAc,SAAS;AAC/CD,UAAOkB,cAAc5C;AAErB,OAAID;SACG,MAAM,CAACO,KAAKsB,UAAUC,OAAOC,QAAQ/B,MAAM,CAC9C,KAAI6B,UAAUG,KAAAA,KAAaH,UAAU,MACnCF,QAAOM,aACL1B,KACA,OAAOsB,UAAU,YAAY,KAAKK,OAAOL,MAC3C,CAAC;;AAKPf,YAASqB,KAAKC,YAAYT,OAAO;AAEjCnC,mBAAgB;AACd,QAAImC,OAAOU,WACTV,QAAOU,WAAWC,YAAYX,OAAO;KAEvC;;GAEJ;AAEF,KAAI,EAAEjC,YAAYe,OAAOf,WAAW;AAClC,MAAIgB,cAAc,OAAOT,aAAa,SACpC,eAAA;GAAA,IAAA6C,OAAAC,QAAA;AAAAC,UAAAF,MAAA1C,WAAmBJ,OAAK,EAAA,aAAaC,UAAQ,CAAA,EAAA,OAAA,MAAA;AAAA,UAAA6C;MAAA;AAI/C,SAAO;;AAGT,KAAI9C,OAAOQ,OAAO,OAAOR,MAAMQ,QAAQ,SACrC,eAAA;EAAA,IAAAyC,QAAAF,QAAA;AAAAC,SAAAC,OAAmBjD,OAAK,OAAA,MAAA;AAAA,SAAAiD;KAAA;AAG1B,KAAI,OAAOhD,aAAa,SACtB,eAAA;EAAA,IAAAiD,QAAAH,QAAA;AAAAC,SAAAE,OAAA9C,WAAmBJ,OAAK,EAAA,aAAaC,UAAQ,CAAA,EAAA,OAAA,MAAA;AAAA,SAAAiD;KAAA;AAG/C,QAAO"}
1
+ {"version":3,"file":"Asset.js","names":["Link","Meta","Style","Title","onCleanup","onMount","isServer","useRouter","RouterManagedTag","JSX","INLINE_CSS_HYDRATION_ATTR","Asset","asset","Element","tag","attrs","children","_$createComponent","_$mergeProps","inlineCss","process","env","TSS_INLINE_CSS_ENABLED","undefined","InlineCssStyle","Script","Record","isInlineCssPlaceholder","html","document","querySelector","HTMLStyleElement","textContent","ScriptAttrs","key","src","router","dataScript","type","normSrc","base","baseURI","window","location","href","URL","existingScript","Array","from","querySelectorAll","find","el","HTMLScriptElement","script","createElement","value","Object","entries","setAttribute","String","head","appendChild","parentNode","removeChild","typeAttr","nonceAttr","nonce","sType","getAttribute","sNonce","_el$","_tmpl$","_$spread","_el$2","_el$3"],"sources":["../../src/Asset.tsx"],"sourcesContent":["import { Link, Meta, Style, Title } from '@solidjs/meta'\nimport { onCleanup, onMount } from 'solid-js'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport { useRouter } from './useRouter'\nimport type { RouterManagedTag } from '@tanstack/router-core'\nimport type { JSX } from 'solid-js'\n\nconst INLINE_CSS_HYDRATION_ATTR = 'data-tsr-inline-css'\n\nexport function Asset(asset: RouterManagedTag): JSX.Element | null {\n const { tag, attrs, children } = asset\n\n switch (tag) {\n case 'title':\n return <Title {...attrs}>{children}</Title>\n case 'meta':\n return <Meta {...attrs} />\n case 'link':\n return <Link {...attrs} />\n case 'style':\n if (\n asset.inlineCss &&\n (process.env.TSS_INLINE_CSS_ENABLED === 'true' ||\n (process.env.TSS_INLINE_CSS_ENABLED === undefined && isServer))\n ) {\n return <InlineCssStyle attrs={attrs}>{children}</InlineCssStyle>\n }\n\n return <Style {...attrs}>{children}</Style>\n case 'script':\n return <Script attrs={attrs}>{children}</Script>\n default:\n return null\n }\n}\n\nfunction InlineCssStyle({\n attrs,\n children,\n}: {\n attrs?: Record<string, any>\n children?: RouterManagedTag['children']\n}) {\n const isInlineCssPlaceholder = children === undefined\n const html = isInlineCssPlaceholder\n ? typeof document === 'undefined'\n ? ''\n : (document.querySelector<HTMLStyleElement>(\n `style[${INLINE_CSS_HYDRATION_ATTR}]`,\n )?.textContent ?? '')\n : (children ?? '')\n\n return (\n <Style {...attrs} {...{ [INLINE_CSS_HYDRATION_ATTR]: '' }}>\n {html}\n </Style>\n )\n}\n\ninterface ScriptAttrs {\n [key: string]: string | boolean | undefined\n src?: string\n}\n\nfunction Script({\n attrs,\n children,\n}: {\n attrs?: ScriptAttrs\n children?: string\n}): JSX.Element | null {\n const router = useRouter()\n const dataScript =\n typeof attrs?.type === 'string' &&\n attrs.type !== '' &&\n attrs.type !== 'text/javascript' &&\n attrs.type !== 'module'\n\n onMount(() => {\n if (dataScript) return\n\n if (attrs?.src) {\n const normSrc = (() => {\n try {\n const base = document.baseURI || window.location.href\n return new URL(attrs.src, base).href\n } catch {\n return attrs.src\n }\n })()\n const existingScript = Array.from(\n document.querySelectorAll('script[src]'),\n ).find((el) => (el as HTMLScriptElement).src === normSrc)\n\n if (existingScript) {\n return\n }\n\n const script = document.createElement('script')\n\n for (const [key, value] of Object.entries(attrs)) {\n if (value !== undefined && value !== false) {\n script.setAttribute(\n key,\n typeof value === 'boolean' ? '' : String(value),\n )\n }\n }\n\n document.head.appendChild(script)\n\n onCleanup(() => {\n if (script.parentNode) {\n script.parentNode.removeChild(script)\n }\n })\n }\n\n if (typeof children === 'string') {\n const typeAttr =\n typeof attrs?.type === 'string' ? attrs.type : 'text/javascript'\n const nonceAttr =\n typeof attrs?.nonce === 'string' ? attrs.nonce : undefined\n const existingScript = Array.from(\n document.querySelectorAll('script:not([src])'),\n ).find((el) => {\n if (!(el instanceof HTMLScriptElement)) return false\n const sType = el.getAttribute('type') ?? 'text/javascript'\n const sNonce = el.getAttribute('nonce') ?? undefined\n return (\n el.textContent === children &&\n sType === typeAttr &&\n sNonce === nonceAttr\n )\n })\n\n if (existingScript) {\n return\n }\n\n const script = document.createElement('script')\n script.textContent = children\n\n if (attrs) {\n for (const [key, value] of Object.entries(attrs)) {\n if (value !== undefined && value !== false) {\n script.setAttribute(\n key,\n typeof value === 'boolean' ? '' : String(value),\n )\n }\n }\n }\n\n document.head.appendChild(script)\n\n onCleanup(() => {\n if (script.parentNode) {\n script.parentNode.removeChild(script)\n }\n })\n }\n })\n\n if (!(isServer ?? router.isServer)) {\n if (dataScript && typeof children === 'string') {\n return <script {...attrs} innerHTML={children} />\n }\n\n // render an empty script on the client just to avoid hydration errors\n return null\n }\n\n if (attrs?.src && typeof attrs.src === 'string') {\n return <script {...attrs} />\n }\n\n if (typeof children === 'string') {\n return <script {...attrs} innerHTML={children} />\n }\n\n return null\n}\n"],"mappings":"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"}
@@ -16,7 +16,7 @@ export declare class FileRoute<TFilePath extends keyof FileRoutesByPath, TParent
16
16
  constructor(path?: TFilePath | undefined, _opts?: {
17
17
  silent: boolean;
18
18
  });
19
- createRoute: <TRegister = Register, TSearchValidator = undefined, TParams = ResolveParams<TPath>, TRouteContextFn = AnyContext, TBeforeLoadFn = AnyContext, TLoaderDeps extends Record<string, any> = {}, TLoaderFn = undefined, TChildren = unknown, TSSR = unknown, TMiddlewares = unknown, THandlers = undefined>(options?: FileBaseRouteOptions<TRegister, TParentRoute, TId, TPath, TSearchValidator, TParams, TLoaderDeps, TLoaderFn, AnyContext, TRouteContextFn, TBeforeLoadFn, AnyContext, TSSR, TMiddlewares, THandlers> & UpdatableRouteOptions<TParentRoute, TId, TFullPath, TParams, TSearchValidator, TLoaderFn, TLoaderDeps, AnyContext, TRouteContextFn, TBeforeLoadFn>) => Route<TRegister, TParentRoute, TPath, TFullPath, TFilePath, TId, TSearchValidator, TParams, AnyContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TLoaderFn, TChildren, unknown, TSSR, TMiddlewares, THandlers>;
19
+ createRoute: <TRegister = Register, TSearchValidator = undefined, TParams = ResolveParams<TPath>, TRouteContextFn = AnyContext, TBeforeLoadFn = AnyContext, TLoaderDeps extends Record<string, any> = {}, TLoaderFn = undefined, TChildren = unknown, TSSR = unknown, const TMiddlewares = unknown, THandlers = undefined>(options?: FileBaseRouteOptions<TRegister, TParentRoute, TId, TPath, TSearchValidator, TParams, TLoaderDeps, TLoaderFn, AnyContext, TRouteContextFn, TBeforeLoadFn, AnyContext, TSSR, TMiddlewares, THandlers> & UpdatableRouteOptions<TParentRoute, TId, TFullPath, TParams, TSearchValidator, TLoaderFn, TLoaderDeps, AnyContext, TRouteContextFn, TBeforeLoadFn>) => Route<TRegister, TParentRoute, TPath, TFullPath, TFilePath, TId, TSearchValidator, TParams, AnyContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TLoaderFn, TChildren, unknown, TSSR, TMiddlewares, THandlers>;
20
20
  }
21
21
  /**
22
22
  @deprecated It's recommended not to split loaders into separate files.
@@ -1 +1 @@
1
- {"version":3,"file":"fileRoute.js","names":[],"sources":["../../src/fileRoute.ts"],"sourcesContent":["import { createRoute } from './route'\n\nimport { useMatch } from './useMatch'\nimport { useLoaderDeps } from './useLoaderDeps'\nimport { useLoaderData } from './useLoaderData'\nimport { useSearch } from './useSearch'\nimport { useParams } from './useParams'\nimport { useNavigate } from './useNavigate'\nimport { useRouter } from './useRouter'\nimport { useRouteContext } from './useRouteContext'\nimport type { UseParamsRoute } from './useParams'\nimport type { UseMatchRoute } from './useMatch'\nimport type { UseSearchRoute } from './useSearch'\nimport type {\n AnyContext,\n AnyRoute,\n AnyRouter,\n Constrain,\n ConstrainLiteral,\n FileBaseRouteOptions,\n FileRoutesByPath,\n LazyRouteOptions,\n Register,\n RegisteredRouter,\n ResolveParams,\n Route,\n RouteById,\n RouteConstraints,\n RouteIds,\n RouteLoaderEntry,\n UpdatableRouteOptions,\n UseNavigateResult,\n} from '@tanstack/router-core'\nimport type { UseLoaderDepsRoute } from './useLoaderDeps'\nimport type { UseLoaderDataRoute } from './useLoaderData'\nimport type { UseRouteContextRoute } from './useRouteContext'\n\nexport function createFileRoute<\n TFilePath extends keyof FileRoutesByPath,\n TParentRoute extends AnyRoute = FileRoutesByPath[TFilePath]['parentRoute'],\n TId extends RouteConstraints['TId'] = FileRoutesByPath[TFilePath]['id'],\n TPath extends RouteConstraints['TPath'] = FileRoutesByPath[TFilePath]['path'],\n TFullPath extends RouteConstraints['TFullPath'] =\n FileRoutesByPath[TFilePath]['fullPath'],\n>(\n path?: TFilePath,\n): FileRoute<TFilePath, TParentRoute, TId, TPath, TFullPath>['createRoute'] {\n return new FileRoute<TFilePath, TParentRoute, TId, TPath, TFullPath>(path, {\n silent: true,\n }).createRoute\n}\n\n/** \n @deprecated It's no longer recommended to use the `FileRoute` class directly.\n Instead, use `createFileRoute('/path/to/file')(options)` to create a file route.\n*/\nexport class FileRoute<\n TFilePath extends keyof FileRoutesByPath,\n TParentRoute extends AnyRoute = FileRoutesByPath[TFilePath]['parentRoute'],\n TId extends RouteConstraints['TId'] = FileRoutesByPath[TFilePath]['id'],\n TPath extends RouteConstraints['TPath'] = FileRoutesByPath[TFilePath]['path'],\n TFullPath extends RouteConstraints['TFullPath'] =\n FileRoutesByPath[TFilePath]['fullPath'],\n> {\n silent?: boolean\n\n constructor(\n public path?: TFilePath,\n _opts?: { silent: boolean },\n ) {\n this.silent = _opts?.silent\n }\n\n createRoute = <\n TRegister = Register,\n TSearchValidator = undefined,\n TParams = ResolveParams<TPath>,\n TRouteContextFn = AnyContext,\n TBeforeLoadFn = AnyContext,\n TLoaderDeps extends Record<string, any> = {},\n TLoaderFn = undefined,\n TChildren = unknown,\n TSSR = unknown,\n TMiddlewares = unknown,\n THandlers = undefined,\n >(\n options?: FileBaseRouteOptions<\n TRegister,\n TParentRoute,\n TId,\n TPath,\n TSearchValidator,\n TParams,\n TLoaderDeps,\n TLoaderFn,\n AnyContext,\n TRouteContextFn,\n TBeforeLoadFn,\n AnyContext,\n TSSR,\n TMiddlewares,\n THandlers\n > &\n UpdatableRouteOptions<\n TParentRoute,\n TId,\n TFullPath,\n TParams,\n TSearchValidator,\n TLoaderFn,\n TLoaderDeps,\n AnyContext,\n TRouteContextFn,\n TBeforeLoadFn\n >,\n ): Route<\n TRegister,\n TParentRoute,\n TPath,\n TFullPath,\n TFilePath,\n TId,\n TSearchValidator,\n TParams,\n AnyContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TChildren,\n unknown,\n TSSR,\n TMiddlewares,\n THandlers\n > => {\n if (process.env.NODE_ENV !== 'production') {\n if (!this.silent) {\n console.warn(\n 'Warning: FileRoute is deprecated and will be removed in the next major version. Use the createFileRoute(path)(options) function instead.',\n )\n }\n }\n const route = createRoute(options as any)\n ;(route as any).isRoot = false\n return route as any\n }\n}\n\n/** \n @deprecated It's recommended not to split loaders into separate files.\n Instead, place the loader function in the the main route file, inside the\n `createFileRoute('/path/to/file)(options)` options.\n*/\nexport function FileRouteLoader<\n TFilePath extends keyof FileRoutesByPath,\n TRoute extends FileRoutesByPath[TFilePath]['preLoaderRoute'],\n>(\n _path: TFilePath,\n): <TLoaderFn>(\n loaderFn: Constrain<\n TLoaderFn,\n RouteLoaderEntry<\n Register,\n TRoute['parentRoute'],\n TRoute['types']['id'],\n TRoute['types']['params'],\n TRoute['types']['loaderDeps'],\n TRoute['types']['routerContext'],\n TRoute['types']['routeContextFn'],\n TRoute['types']['beforeLoadFn']\n >\n >,\n) => TLoaderFn {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `Warning: FileRouteLoader is deprecated and will be removed in the next major version. Please place the loader function in the the main route file, inside the \\`createFileRoute('/path/to/file')(options)\\` options`,\n )\n }\n return (loaderFn) => loaderFn as any\n}\n\ndeclare module '@tanstack/router-core' {\n export interface LazyRoute<in out TRoute extends AnyRoute> {\n useMatch: UseMatchRoute<TRoute['id']>\n useRouteContext: UseRouteContextRoute<TRoute['id']>\n useSearch: UseSearchRoute<TRoute['id']>\n useParams: UseParamsRoute<TRoute['id']>\n useLoaderDeps: UseLoaderDepsRoute<TRoute['id']>\n useLoaderData: UseLoaderDataRoute<TRoute['id']>\n useNavigate: () => UseNavigateResult<TRoute['fullPath']>\n }\n}\n\nexport class LazyRoute<TRoute extends AnyRoute> {\n options: {\n id: string\n } & LazyRouteOptions\n\n constructor(\n opts: {\n id: string\n } & LazyRouteOptions,\n ) {\n this.options = opts\n }\n\n useMatch: UseMatchRoute<TRoute['id']> = (opts) => {\n return useMatch({\n select: opts?.select,\n from: this.options.id,\n } as any) as any\n }\n\n useRouteContext: UseRouteContextRoute<TRoute['id']> = (opts) => {\n return useRouteContext({ ...(opts as any), from: this.options.id }) as any\n }\n\n useSearch: UseSearchRoute<TRoute['id']> = (opts) => {\n return useSearch({\n select: opts?.select,\n from: this.options.id,\n } as any) as any\n }\n\n useParams: UseParamsRoute<TRoute['id']> = (opts) => {\n return useParams({\n select: opts?.select,\n from: this.options.id,\n } as any) as any\n }\n\n useLoaderDeps: UseLoaderDepsRoute<TRoute['id']> = (opts) => {\n return useLoaderDeps({ ...opts, from: this.options.id } as any)\n }\n\n useLoaderData: UseLoaderDataRoute<TRoute['id']> = (opts) => {\n return useLoaderData({ ...opts, from: this.options.id } as any)\n }\n\n useNavigate = (): UseNavigateResult<TRoute['fullPath']> => {\n const router = useRouter()\n return useNavigate({ from: router.routesById[this.options.id].fullPath })\n }\n}\n\nexport function createLazyRoute<\n TRouter extends AnyRouter = RegisteredRouter,\n TId extends string = string,\n TRoute extends AnyRoute = RouteById<TRouter['routeTree'], TId>,\n>(id: ConstrainLiteral<TId, RouteIds<TRouter['routeTree']>>) {\n return (opts: LazyRouteOptions) => {\n return new LazyRoute<TRoute>({\n id: id,\n ...opts,\n })\n }\n}\nexport function createLazyFileRoute<\n TFilePath extends keyof FileRoutesByPath,\n TRoute extends FileRoutesByPath[TFilePath]['preLoaderRoute'],\n>(id: TFilePath): (opts: LazyRouteOptions) => LazyRoute<TRoute> {\n if (typeof id === 'object') {\n return new LazyRoute<TRoute>(id) as any\n }\n\n return (opts: LazyRouteOptions) => new LazyRoute<TRoute>({ id, ...opts })\n}\n"],"mappings":";;;;;;;;;;AAqCA,SAAgB,gBAQd,MAC0E;AAC1E,QAAO,IAAI,UAA0D,MAAM,EACzE,QAAQ,MACT,CAAC,CAAC;;;;;;AAOL,IAAa,YAAb,MAOE;CAGA,YACE,MACA,OACA;AAFO,OAAA,OAAA;sBAmBP,YAgDG;AACH,OAAA,QAAA,IAAA,aAA6B;QACvB,CAAC,KAAK,OACR,SAAQ,KACN,2IACD;;GAGL,MAAM,QAAQ,YAAY,QAAe;AACvC,SAAc,SAAS;AACzB,UAAO;;AA1EP,OAAK,SAAS,OAAO;;;;;;;;AAmFzB,SAAgB,gBAId,OAea;AACb,KAAA,QAAA,IAAA,aAA6B,aAC3B,SAAQ,KACN,sNACD;AAEH,SAAQ,aAAa;;AAevB,IAAa,YAAb,MAAgD;CAK9C,YACE,MAGA;mBAIuC,SAAS;AAChD,UAAO,SAAS;IACd,QAAQ,MAAM;IACd,MAAM,KAAK,QAAQ;IACpB,CAAQ;;0BAG4C,SAAS;AAC9D,UAAO,gBAAgB;IAAE,GAAI;IAAc,MAAM,KAAK,QAAQ;IAAI,CAAC;;oBAG1B,SAAS;AAClD,UAAO,UAAU;IACf,QAAQ,MAAM;IACd,MAAM,KAAK,QAAQ;IACpB,CAAQ;;oBAGgC,SAAS;AAClD,UAAO,UAAU;IACf,QAAQ,MAAM;IACd,MAAM,KAAK,QAAQ;IACpB,CAAQ;;wBAGwC,SAAS;AAC1D,UAAO,cAAc;IAAE,GAAG;IAAM,MAAM,KAAK,QAAQ;IAAI,CAAQ;;wBAGd,SAAS;AAC1D,UAAO,cAAc;IAAE,GAAG;IAAM,MAAM,KAAK,QAAQ;IAAI,CAAQ;;2BAGN;AAEzD,UAAO,YAAY,EAAE,MADN,WAAW,CACQ,WAAW,KAAK,QAAQ,IAAI,UAAU,CAAC;;AAtCzE,OAAK,UAAU;;;AA0CnB,SAAgB,gBAId,IAA2D;AAC3D,SAAQ,SAA2B;AACjC,SAAO,IAAI,UAAkB;GACvB;GACJ,GAAG;GACJ,CAAC;;;AAGN,SAAgB,oBAGd,IAA8D;AAC9D,KAAI,OAAO,OAAO,SAChB,QAAO,IAAI,UAAkB,GAAG;AAGlC,SAAQ,SAA2B,IAAI,UAAkB;EAAE;EAAI,GAAG;EAAM,CAAC"}
1
+ {"version":3,"file":"fileRoute.js","names":[],"sources":["../../src/fileRoute.ts"],"sourcesContent":["import { createRoute } from './route'\n\nimport { useMatch } from './useMatch'\nimport { useLoaderDeps } from './useLoaderDeps'\nimport { useLoaderData } from './useLoaderData'\nimport { useSearch } from './useSearch'\nimport { useParams } from './useParams'\nimport { useNavigate } from './useNavigate'\nimport { useRouter } from './useRouter'\nimport { useRouteContext } from './useRouteContext'\nimport type { UseParamsRoute } from './useParams'\nimport type { UseMatchRoute } from './useMatch'\nimport type { UseSearchRoute } from './useSearch'\nimport type {\n AnyContext,\n AnyRoute,\n AnyRouter,\n Constrain,\n ConstrainLiteral,\n FileBaseRouteOptions,\n FileRoutesByPath,\n LazyRouteOptions,\n Register,\n RegisteredRouter,\n ResolveParams,\n Route,\n RouteById,\n RouteConstraints,\n RouteIds,\n RouteLoaderEntry,\n UpdatableRouteOptions,\n UseNavigateResult,\n} from '@tanstack/router-core'\nimport type { UseLoaderDepsRoute } from './useLoaderDeps'\nimport type { UseLoaderDataRoute } from './useLoaderData'\nimport type { UseRouteContextRoute } from './useRouteContext'\n\nexport function createFileRoute<\n TFilePath extends keyof FileRoutesByPath,\n TParentRoute extends AnyRoute = FileRoutesByPath[TFilePath]['parentRoute'],\n TId extends RouteConstraints['TId'] = FileRoutesByPath[TFilePath]['id'],\n TPath extends RouteConstraints['TPath'] = FileRoutesByPath[TFilePath]['path'],\n TFullPath extends RouteConstraints['TFullPath'] =\n FileRoutesByPath[TFilePath]['fullPath'],\n>(\n path?: TFilePath,\n): FileRoute<TFilePath, TParentRoute, TId, TPath, TFullPath>['createRoute'] {\n return new FileRoute<TFilePath, TParentRoute, TId, TPath, TFullPath>(path, {\n silent: true,\n }).createRoute\n}\n\n/** \n @deprecated It's no longer recommended to use the `FileRoute` class directly.\n Instead, use `createFileRoute('/path/to/file')(options)` to create a file route.\n*/\nexport class FileRoute<\n TFilePath extends keyof FileRoutesByPath,\n TParentRoute extends AnyRoute = FileRoutesByPath[TFilePath]['parentRoute'],\n TId extends RouteConstraints['TId'] = FileRoutesByPath[TFilePath]['id'],\n TPath extends RouteConstraints['TPath'] = FileRoutesByPath[TFilePath]['path'],\n TFullPath extends RouteConstraints['TFullPath'] =\n FileRoutesByPath[TFilePath]['fullPath'],\n> {\n silent?: boolean\n\n constructor(\n public path?: TFilePath,\n _opts?: { silent: boolean },\n ) {\n this.silent = _opts?.silent\n }\n\n createRoute = <\n TRegister = Register,\n TSearchValidator = undefined,\n TParams = ResolveParams<TPath>,\n TRouteContextFn = AnyContext,\n TBeforeLoadFn = AnyContext,\n TLoaderDeps extends Record<string, any> = {},\n TLoaderFn = undefined,\n TChildren = unknown,\n TSSR = unknown,\n const TMiddlewares = unknown,\n THandlers = undefined,\n >(\n options?: FileBaseRouteOptions<\n TRegister,\n TParentRoute,\n TId,\n TPath,\n TSearchValidator,\n TParams,\n TLoaderDeps,\n TLoaderFn,\n AnyContext,\n TRouteContextFn,\n TBeforeLoadFn,\n AnyContext,\n TSSR,\n TMiddlewares,\n THandlers\n > &\n UpdatableRouteOptions<\n TParentRoute,\n TId,\n TFullPath,\n TParams,\n TSearchValidator,\n TLoaderFn,\n TLoaderDeps,\n AnyContext,\n TRouteContextFn,\n TBeforeLoadFn\n >,\n ): Route<\n TRegister,\n TParentRoute,\n TPath,\n TFullPath,\n TFilePath,\n TId,\n TSearchValidator,\n TParams,\n AnyContext,\n TRouteContextFn,\n TBeforeLoadFn,\n TLoaderDeps,\n TLoaderFn,\n TChildren,\n unknown,\n TSSR,\n TMiddlewares,\n THandlers\n > => {\n if (process.env.NODE_ENV !== 'production') {\n if (!this.silent) {\n console.warn(\n 'Warning: FileRoute is deprecated and will be removed in the next major version. Use the createFileRoute(path)(options) function instead.',\n )\n }\n }\n const route = createRoute(options as any)\n ;(route as any).isRoot = false\n return route as any\n }\n}\n\n/** \n @deprecated It's recommended not to split loaders into separate files.\n Instead, place the loader function in the the main route file, inside the\n `createFileRoute('/path/to/file)(options)` options.\n*/\nexport function FileRouteLoader<\n TFilePath extends keyof FileRoutesByPath,\n TRoute extends FileRoutesByPath[TFilePath]['preLoaderRoute'],\n>(\n _path: TFilePath,\n): <TLoaderFn>(\n loaderFn: Constrain<\n TLoaderFn,\n RouteLoaderEntry<\n Register,\n TRoute['parentRoute'],\n TRoute['types']['id'],\n TRoute['types']['params'],\n TRoute['types']['loaderDeps'],\n TRoute['types']['routerContext'],\n TRoute['types']['routeContextFn'],\n TRoute['types']['beforeLoadFn']\n >\n >,\n) => TLoaderFn {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `Warning: FileRouteLoader is deprecated and will be removed in the next major version. Please place the loader function in the the main route file, inside the \\`createFileRoute('/path/to/file')(options)\\` options`,\n )\n }\n return (loaderFn) => loaderFn as any\n}\n\ndeclare module '@tanstack/router-core' {\n export interface LazyRoute<in out TRoute extends AnyRoute> {\n useMatch: UseMatchRoute<TRoute['id']>\n useRouteContext: UseRouteContextRoute<TRoute['id']>\n useSearch: UseSearchRoute<TRoute['id']>\n useParams: UseParamsRoute<TRoute['id']>\n useLoaderDeps: UseLoaderDepsRoute<TRoute['id']>\n useLoaderData: UseLoaderDataRoute<TRoute['id']>\n useNavigate: () => UseNavigateResult<TRoute['fullPath']>\n }\n}\n\nexport class LazyRoute<TRoute extends AnyRoute> {\n options: {\n id: string\n } & LazyRouteOptions\n\n constructor(\n opts: {\n id: string\n } & LazyRouteOptions,\n ) {\n this.options = opts\n }\n\n useMatch: UseMatchRoute<TRoute['id']> = (opts) => {\n return useMatch({\n select: opts?.select,\n from: this.options.id,\n } as any) as any\n }\n\n useRouteContext: UseRouteContextRoute<TRoute['id']> = (opts) => {\n return useRouteContext({ ...(opts as any), from: this.options.id }) as any\n }\n\n useSearch: UseSearchRoute<TRoute['id']> = (opts) => {\n return useSearch({\n select: opts?.select,\n from: this.options.id,\n } as any) as any\n }\n\n useParams: UseParamsRoute<TRoute['id']> = (opts) => {\n return useParams({\n select: opts?.select,\n from: this.options.id,\n } as any) as any\n }\n\n useLoaderDeps: UseLoaderDepsRoute<TRoute['id']> = (opts) => {\n return useLoaderDeps({ ...opts, from: this.options.id } as any)\n }\n\n useLoaderData: UseLoaderDataRoute<TRoute['id']> = (opts) => {\n return useLoaderData({ ...opts, from: this.options.id } as any)\n }\n\n useNavigate = (): UseNavigateResult<TRoute['fullPath']> => {\n const router = useRouter()\n return useNavigate({ from: router.routesById[this.options.id].fullPath })\n }\n}\n\nexport function createLazyRoute<\n TRouter extends AnyRouter = RegisteredRouter,\n TId extends string = string,\n TRoute extends AnyRoute = RouteById<TRouter['routeTree'], TId>,\n>(id: ConstrainLiteral<TId, RouteIds<TRouter['routeTree']>>) {\n return (opts: LazyRouteOptions) => {\n return new LazyRoute<TRoute>({\n id: id,\n ...opts,\n })\n }\n}\nexport function createLazyFileRoute<\n TFilePath extends keyof FileRoutesByPath,\n TRoute extends FileRoutesByPath[TFilePath]['preLoaderRoute'],\n>(id: TFilePath): (opts: LazyRouteOptions) => LazyRoute<TRoute> {\n if (typeof id === 'object') {\n return new LazyRoute<TRoute>(id) as any\n }\n\n return (opts: LazyRouteOptions) => new LazyRoute<TRoute>({ id, ...opts })\n}\n"],"mappings":";;;;;;;;;;AAqCA,SAAgB,gBAQd,MAC0E;AAC1E,QAAO,IAAI,UAA0D,MAAM,EACzE,QAAQ,MACT,CAAC,CAAC;;;;;;AAOL,IAAa,YAAb,MAOE;CAGA,YACE,MACA,OACA;AAFO,OAAA,OAAA;sBAmBP,YAgDG;AACH,OAAA,QAAA,IAAA,aAA6B;QACvB,CAAC,KAAK,OACR,SAAQ,KACN,2IACD;;GAGL,MAAM,QAAQ,YAAY,QAAe;AACvC,SAAc,SAAS;AACzB,UAAO;;AA1EP,OAAK,SAAS,OAAO;;;;;;;;AAmFzB,SAAgB,gBAId,OAea;AACb,KAAA,QAAA,IAAA,aAA6B,aAC3B,SAAQ,KACN,sNACD;AAEH,SAAQ,aAAa;;AAevB,IAAa,YAAb,MAAgD;CAK9C,YACE,MAGA;mBAIuC,SAAS;AAChD,UAAO,SAAS;IACd,QAAQ,MAAM;IACd,MAAM,KAAK,QAAQ;IACpB,CAAQ;;0BAG4C,SAAS;AAC9D,UAAO,gBAAgB;IAAE,GAAI;IAAc,MAAM,KAAK,QAAQ;IAAI,CAAC;;oBAG1B,SAAS;AAClD,UAAO,UAAU;IACf,QAAQ,MAAM;IACd,MAAM,KAAK,QAAQ;IACpB,CAAQ;;oBAGgC,SAAS;AAClD,UAAO,UAAU;IACf,QAAQ,MAAM;IACd,MAAM,KAAK,QAAQ;IACpB,CAAQ;;wBAGwC,SAAS;AAC1D,UAAO,cAAc;IAAE,GAAG;IAAM,MAAM,KAAK,QAAQ;IAAI,CAAQ;;wBAGd,SAAS;AAC1D,UAAO,cAAc;IAAE,GAAG;IAAM,MAAM,KAAK,QAAQ;IAAI,CAAQ;;2BAGN;AAEzD,UAAO,YAAY,EAAE,MADN,WAAW,CACQ,WAAW,KAAK,QAAQ,IAAI,UAAU,CAAC;;AAtCzE,OAAK,UAAU;;;AA0CnB,SAAgB,gBAId,IAA2D;AAC3D,SAAQ,SAA2B;AACjC,SAAO,IAAI,UAAkB;GACvB;GACJ,GAAG;GACJ,CAAC;;;AAGN,SAAgB,oBAGd,IAA8D;AAC9D,KAAI,OAAO,OAAO,SAChB,QAAO,IAAI,UAAkB,GAAG;AAGlC,SAAQ,SAA2B,IAAI,UAAkB;EAAE;EAAI,GAAG;EAAM,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { useRouter } from "./useRouter.js";
2
- import { escapeHtml, getAssetCrossOrigin, replaceEqualDeep, resolveManifestAssetLink } from "@tanstack/router-core";
2
+ import { escapeHtml, getAssetCrossOrigin, isInlinableStylesheet, resolveManifestAssetLink } from "@tanstack/router-core";
3
3
  import * as Solid from "solid-js";
4
4
  //#region src/headContentUtils.tsx
5
5
  /**
@@ -69,14 +69,29 @@ var useTags = (assetCrossOrigin) => {
69
69
  }
70
70
  }));
71
71
  const manifest = router.ssr?.manifest;
72
- const assets = matches.map((match) => manifest?.routes[match.routeId]?.assets ?? []).filter(Boolean).flat(1).filter((asset) => asset.tag === "link").map((asset) => ({
73
- tag: "link",
74
- attrs: {
75
- ...asset.attrs,
76
- crossOrigin: getAssetCrossOrigin(assetCrossOrigin, "stylesheet") ?? asset.attrs?.crossOrigin,
77
- nonce
72
+ const assets = matches.map((match) => manifest?.routes[match.routeId]?.assets ?? []).filter(Boolean).flat(1).flatMap((asset) => {
73
+ if (asset.tag === "link") {
74
+ if (isInlinableStylesheet(manifest, asset)) return [];
75
+ return [{
76
+ tag: "link",
77
+ attrs: {
78
+ ...asset.attrs,
79
+ crossOrigin: getAssetCrossOrigin(assetCrossOrigin, "stylesheet") ?? asset.attrs?.crossOrigin,
80
+ nonce
81
+ }
82
+ }];
78
83
  }
79
- }));
84
+ if (asset.tag === "style") return [{
85
+ tag: "style",
86
+ attrs: {
87
+ ...asset.attrs,
88
+ nonce
89
+ },
90
+ children: asset.children,
91
+ ...asset.inlineCss ? { inlineCss: true } : {}
92
+ }];
93
+ return [];
94
+ });
80
95
  return [...constructed, ...assets];
81
96
  });
82
97
  const preloadLinks = Solid.createMemo(() => {
@@ -123,9 +138,24 @@ var useTags = (assetCrossOrigin) => {
123
138
  return JSON.stringify(d);
124
139
  });
125
140
  if (prev === void 0) return next;
126
- return replaceEqualDeep(prev, next);
141
+ return replaceEqualTags(prev, next);
127
142
  });
128
143
  };
144
+ function replaceEqualTags(prev, next) {
145
+ const prevByKey = /* @__PURE__ */ new Map();
146
+ for (const tag of prev) prevByKey.set(JSON.stringify(tag), tag);
147
+ let isEqual = prev.length === next.length;
148
+ const result = next.map((tag, index) => {
149
+ const existing = prevByKey.get(JSON.stringify(tag));
150
+ if (existing) {
151
+ if (existing !== prev[index]) isEqual = false;
152
+ return existing;
153
+ }
154
+ isEqual = false;
155
+ return tag;
156
+ });
157
+ return isEqual ? prev : result;
158
+ }
129
159
  function uniqBy(arr, fn) {
130
160
  const seen = /* @__PURE__ */ new Set();
131
161
  return arr.filter((item) => {
@@ -1 +1 @@
1
- {"version":3,"file":"headContentUtils.js","names":["Solid","escapeHtml","getAssetCrossOrigin","replaceEqualDeep","resolveManifestAssetLink","useRouter","AssetCrossOriginConfig","RouterManagedTag","useTags","assetCrossOrigin","router","nonce","options","ssr","activeMatches","createMemo","stores","matches","get","routeMeta","map","match","meta","filter","Boolean","Accessor","Array","resultMeta","metaByAttribute","Record","title","routeMetasArray","i","length","metas","j","m","tag","children","json","JSON","stringify","push","attrs","type","attribute","name","property","content","reverse","links","constructed","flat","link","manifest","assets","routes","routeId","asset","crossOrigin","preloadLinks","looseRoutesById","forEach","route","id","preloads","preload","preloadLink","rel","href","styles","style","headScripts","script","prev","next","uniqBy","d","undefined","arr","T","fn","item","seen","Set","key","has","add"],"sources":["../../src/headContentUtils.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport {\n escapeHtml,\n getAssetCrossOrigin,\n replaceEqualDeep,\n resolveManifestAssetLink,\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 list of head/link/meta/script tags to render for active matches.\n * Used internally by `HeadContent`.\n */\nexport const useTags = (assetCrossOrigin?: AssetCrossOriginConfig) => {\n const router = useRouter()\n const nonce = router.options.ssr?.nonce\n const activeMatches = Solid.createMemo(() => router.stores.matches.get())\n const routeMeta = Solid.createMemo(() =>\n activeMatches()\n .map((match) => match.meta!)\n .filter(Boolean),\n )\n\n const meta: Solid.Accessor<Array<RouterManagedTag>> = Solid.createMemo(() => {\n const resultMeta: Array<RouterManagedTag> = []\n const metaByAttribute: Record<string, true> = {}\n let title: RouterManagedTag | undefined\n const routeMetasArray = routeMeta()\n for (let i = routeMetasArray.length - 1; i >= 0; i--) {\n const metas = routeMetasArray[i]!\n for (let j = metas.length - 1; j >= 0; j--) {\n const m = metas[j]\n if (!m) continue\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 return resultMeta\n })\n\n const links = Solid.createMemo(() => {\n const matches = activeMatches()\n const constructed = matches\n .map((match) => match.links!)\n .filter(Boolean)\n .flat(1)\n .map((link) => ({\n tag: 'link',\n attrs: {\n ...link,\n nonce,\n },\n })) satisfies Array<RouterManagedTag>\n\n const manifest = router.ssr?.manifest\n\n const assets = matches\n .map((match) => manifest?.routes[match.routeId]?.assets ?? [])\n .filter(Boolean)\n .flat(1)\n .filter((asset) => asset.tag === 'link')\n .map(\n (asset) =>\n ({\n tag: 'link',\n attrs: {\n ...asset.attrs,\n crossOrigin:\n getAssetCrossOrigin(assetCrossOrigin, 'stylesheet') ??\n asset.attrs?.crossOrigin,\n nonce,\n },\n }) satisfies RouterManagedTag,\n )\n\n return [...constructed, ...assets]\n })\n\n const preloadLinks = Solid.createMemo(() => {\n const matches = activeMatches()\n const preloadLinks: Array<RouterManagedTag> = []\n\n matches\n .map((match) => router.looseRoutesById[match.routeId]!)\n .forEach((route) =>\n router.ssr?.manifest?.routes[route.id]?.preloads\n ?.filter(Boolean)\n .forEach((preload) => {\n const preloadLink = resolveManifestAssetLink(preload)\n preloadLinks.push({\n tag: 'link',\n attrs: {\n rel: 'modulepreload',\n href: preloadLink.href,\n crossOrigin:\n getAssetCrossOrigin(assetCrossOrigin, 'modulepreload') ??\n preloadLink.crossOrigin,\n nonce,\n },\n })\n }),\n )\n\n return preloadLinks\n })\n\n const styles = Solid.createMemo(() =>\n (\n activeMatches()\n .map((match) => match.styles!)\n .flat(1)\n .filter(Boolean) as Array<RouterManagedTag>\n ).map(({ children, ...style }) => ({\n tag: 'style',\n attrs: {\n ...style,\n nonce,\n },\n children,\n })),\n )\n\n const headScripts = Solid.createMemo(() =>\n (\n activeMatches()\n .map((match) => match.headScripts!)\n .flat(1)\n .filter(Boolean) as Array<RouterManagedTag>\n ).map(({ children, ...script }) => ({\n tag: 'script',\n attrs: {\n ...script,\n nonce,\n },\n children,\n })),\n )\n\n return Solid.createMemo((prev: Array<RouterManagedTag> | undefined) => {\n const next = uniqBy(\n [\n ...meta(),\n ...preloadLinks(),\n ...links(),\n ...styles(),\n ...headScripts(),\n ] as Array<RouterManagedTag>,\n (d) => {\n return JSON.stringify(d)\n },\n )\n if (prev === undefined) {\n return next\n }\n return replaceEqualDeep(prev, next)\n })\n}\n\nexport function uniqBy<T>(arr: Array<T>, fn: (item: T) => string) {\n const seen = new Set<string>()\n return arr.filter((item) => {\n const key = fn(item)\n if (seen.has(key)) {\n return false\n }\n seen.add(key)\n return true\n })\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"headContentUtils.js","names":["Solid","escapeHtml","getAssetCrossOrigin","isInlinableStylesheet","resolveManifestAssetLink","useRouter","AssetCrossOriginConfig","RouterManagedTag","useTags","assetCrossOrigin","router","nonce","options","ssr","activeMatches","createMemo","stores","matches","get","routeMeta","map","match","meta","filter","Boolean","Accessor","Array","resultMeta","metaByAttribute","Record","title","routeMetasArray","i","length","metas","j","m","tag","children","json","JSON","stringify","push","attrs","type","attribute","name","property","content","reverse","links","constructed","flat","link","manifest","assets","routes","routeId","flatMap","asset","crossOrigin","inlineCss","const","preloadLinks","looseRoutesById","forEach","route","id","preloads","preload","preloadLink","rel","href","styles","style","headScripts","script","prev","next","uniqBy","d","undefined","replaceEqualTags","prevByKey","Map","set","isEqual","result","index","existing","arr","T","fn","item","seen","Set","key","has","add"],"sources":["../../src/headContentUtils.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport {\n escapeHtml,\n getAssetCrossOrigin,\n isInlinableStylesheet,\n resolveManifestAssetLink,\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 list of head/link/meta/script tags to render for active matches.\n * Used internally by `HeadContent`.\n */\nexport const useTags = (assetCrossOrigin?: AssetCrossOriginConfig) => {\n const router = useRouter()\n const nonce = router.options.ssr?.nonce\n const activeMatches = Solid.createMemo(() => router.stores.matches.get())\n const routeMeta = Solid.createMemo(() =>\n activeMatches()\n .map((match) => match.meta!)\n .filter(Boolean),\n )\n\n const meta: Solid.Accessor<Array<RouterManagedTag>> = Solid.createMemo(() => {\n const resultMeta: Array<RouterManagedTag> = []\n const metaByAttribute: Record<string, true> = {}\n let title: RouterManagedTag | undefined\n const routeMetasArray = routeMeta()\n for (let i = routeMetasArray.length - 1; i >= 0; i--) {\n const metas = routeMetasArray[i]!\n for (let j = metas.length - 1; j >= 0; j--) {\n const m = metas[j]\n if (!m) continue\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 return resultMeta\n })\n\n const links = Solid.createMemo(() => {\n const matches = activeMatches()\n const constructed = matches\n .map((match) => match.links!)\n .filter(Boolean)\n .flat(1)\n .map((link) => ({\n tag: 'link',\n attrs: {\n ...link,\n nonce,\n },\n })) satisfies Array<RouterManagedTag>\n\n const manifest = router.ssr?.manifest\n\n const assets = matches\n .map((match) => manifest?.routes[match.routeId]?.assets ?? [])\n .filter(Boolean)\n .flat(1)\n .flatMap((asset): Array<RouterManagedTag> => {\n if (asset.tag === 'link') {\n if (isInlinableStylesheet(manifest, asset)) {\n return []\n }\n\n return [\n {\n tag: 'link',\n attrs: {\n ...asset.attrs,\n crossOrigin:\n getAssetCrossOrigin(assetCrossOrigin, 'stylesheet') ??\n asset.attrs?.crossOrigin,\n nonce,\n },\n },\n ]\n }\n\n if (asset.tag === 'style') {\n return [\n {\n tag: 'style',\n attrs: {\n ...asset.attrs,\n nonce,\n },\n children: asset.children,\n ...(asset.inlineCss ? { inlineCss: true as const } : {}),\n },\n ]\n }\n\n return []\n })\n\n return [...constructed, ...assets]\n })\n\n const preloadLinks = Solid.createMemo(() => {\n const matches = activeMatches()\n const preloadLinks: Array<RouterManagedTag> = []\n\n matches\n .map((match) => router.looseRoutesById[match.routeId]!)\n .forEach((route) =>\n router.ssr?.manifest?.routes[route.id]?.preloads\n ?.filter(Boolean)\n .forEach((preload) => {\n const preloadLink = resolveManifestAssetLink(preload)\n preloadLinks.push({\n tag: 'link',\n attrs: {\n rel: 'modulepreload',\n href: preloadLink.href,\n crossOrigin:\n getAssetCrossOrigin(assetCrossOrigin, 'modulepreload') ??\n preloadLink.crossOrigin,\n nonce,\n },\n })\n }),\n )\n\n return preloadLinks\n })\n\n const styles = Solid.createMemo(() =>\n (\n activeMatches()\n .map((match) => match.styles!)\n .flat(1)\n .filter(Boolean) as Array<RouterManagedTag>\n ).map(({ children, ...style }) => ({\n tag: 'style',\n attrs: {\n ...style,\n nonce,\n },\n children,\n })),\n )\n\n const headScripts = Solid.createMemo(() =>\n (\n activeMatches()\n .map((match) => match.headScripts!)\n .flat(1)\n .filter(Boolean) as Array<RouterManagedTag>\n ).map(({ children, ...script }) => ({\n tag: 'script',\n attrs: {\n ...script,\n nonce,\n },\n children,\n })),\n )\n\n return Solid.createMemo((prev: Array<RouterManagedTag> | undefined) => {\n const next = uniqBy(\n [\n ...meta(),\n ...preloadLinks(),\n ...links(),\n ...styles(),\n ...headScripts(),\n ] as Array<RouterManagedTag>,\n (d) => {\n return JSON.stringify(d)\n },\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\nexport function uniqBy<T>(arr: Array<T>, fn: (item: T) => string) {\n const seen = new Set<string>()\n return arr.filter((item) => {\n const key = fn(item)\n if (seen.has(key)) {\n return false\n }\n seen.add(key)\n return true\n })\n}\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import type { RouterManagedTag } from '@tanstack/router-core';
2
2
  import type { JSX } from 'solid-js';
3
- export declare function Asset({ tag, attrs, children, }: RouterManagedTag): JSX.Element | null;
3
+ export declare function Asset(asset: RouterManagedTag): JSX.Element | null;
@@ -2,7 +2,9 @@ import { Link, Meta, Style, Title } from '@solidjs/meta';
2
2
  import { onCleanup, onMount } from 'solid-js';
3
3
  import { isServer } from '@tanstack/router-core/isServer';
4
4
  import { useRouter } from './useRouter';
5
- export function Asset({ tag, attrs, children, }) {
5
+ const INLINE_CSS_HYDRATION_ATTR = 'data-tsr-inline-css';
6
+ export function Asset(asset) {
7
+ const { tag, attrs, children } = asset;
6
8
  switch (tag) {
7
9
  case 'title':
8
10
  return <Title {...attrs}>{children}</Title>;
@@ -11,6 +13,11 @@ export function Asset({ tag, attrs, children, }) {
11
13
  case 'link':
12
14
  return <Link {...attrs}/>;
13
15
  case 'style':
16
+ if (asset.inlineCss &&
17
+ (process.env.TSS_INLINE_CSS_ENABLED === 'true' ||
18
+ (process.env.TSS_INLINE_CSS_ENABLED === undefined && isServer))) {
19
+ return <InlineCssStyle attrs={attrs}>{children}</InlineCssStyle>;
20
+ }
14
21
  return <Style {...attrs}>{children}</Style>;
15
22
  case 'script':
16
23
  return <Script attrs={attrs}>{children}</Script>;
@@ -18,6 +25,17 @@ export function Asset({ tag, attrs, children, }) {
18
25
  return null;
19
26
  }
20
27
  }
28
+ function InlineCssStyle({ attrs, children, }) {
29
+ const isInlineCssPlaceholder = children === undefined;
30
+ const html = isInlineCssPlaceholder
31
+ ? typeof document === 'undefined'
32
+ ? ''
33
+ : (document.querySelector(`style[${INLINE_CSS_HYDRATION_ATTR}]`)?.textContent ?? '')
34
+ : (children ?? '');
35
+ return (<Style {...attrs} {...{ [INLINE_CSS_HYDRATION_ATTR]: '' }}>
36
+ {html}
37
+ </Style>);
38
+ }
21
39
  function Script({ attrs, children, }) {
22
40
  const router = useRouter();
23
41
  const dataScript = typeof attrs?.type === 'string' &&
@@ -1 +1 @@
1
- {"version":3,"file":"Asset.jsx","sourceRoot":"","sources":["../../src/Asset.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Asset.jsx","sourceRoot":"","sources":["../../src/Asset.tsx"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@ export declare class FileRoute<TFilePath extends keyof FileRoutesByPath, TParent
16
16
  constructor(path?: TFilePath | undefined, _opts?: {
17
17
  silent: boolean;
18
18
  });
19
- createRoute: <TRegister = Register, TSearchValidator = undefined, TParams = ResolveParams<TPath>, TRouteContextFn = AnyContext, TBeforeLoadFn = AnyContext, TLoaderDeps extends Record<string, any> = {}, TLoaderFn = undefined, TChildren = unknown, TSSR = unknown, TMiddlewares = unknown, THandlers = undefined>(options?: FileBaseRouteOptions<TRegister, TParentRoute, TId, TPath, TSearchValidator, TParams, TLoaderDeps, TLoaderFn, AnyContext, TRouteContextFn, TBeforeLoadFn, AnyContext, TSSR, TMiddlewares, THandlers> & UpdatableRouteOptions<TParentRoute, TId, TFullPath, TParams, TSearchValidator, TLoaderFn, TLoaderDeps, AnyContext, TRouteContextFn, TBeforeLoadFn>) => Route<TRegister, TParentRoute, TPath, TFullPath, TFilePath, TId, TSearchValidator, TParams, AnyContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TLoaderFn, TChildren, unknown, TSSR, TMiddlewares, THandlers>;
19
+ createRoute: <TRegister = Register, TSearchValidator = undefined, TParams = ResolveParams<TPath>, TRouteContextFn = AnyContext, TBeforeLoadFn = AnyContext, TLoaderDeps extends Record<string, any> = {}, TLoaderFn = undefined, TChildren = unknown, TSSR = unknown, const TMiddlewares = unknown, THandlers = undefined>(options?: FileBaseRouteOptions<TRegister, TParentRoute, TId, TPath, TSearchValidator, TParams, TLoaderDeps, TLoaderFn, AnyContext, TRouteContextFn, TBeforeLoadFn, AnyContext, TSSR, TMiddlewares, THandlers> & UpdatableRouteOptions<TParentRoute, TId, TFullPath, TParams, TSearchValidator, TLoaderFn, TLoaderDeps, AnyContext, TRouteContextFn, TBeforeLoadFn>) => Route<TRegister, TParentRoute, TPath, TFullPath, TFilePath, TId, TSearchValidator, TParams, AnyContext, TRouteContextFn, TBeforeLoadFn, TLoaderDeps, TLoaderFn, TChildren, unknown, TSSR, TMiddlewares, THandlers>;
20
20
  }
21
21
  /**
22
22
  @deprecated It's recommended not to split loaders into separate files.
@@ -1,5 +1,5 @@
1
1
  import * as Solid from 'solid-js';
2
- import { escapeHtml, getAssetCrossOrigin, replaceEqualDeep, resolveManifestAssetLink, } from '@tanstack/router-core';
2
+ import { escapeHtml, getAssetCrossOrigin, isInlinableStylesheet, resolveManifestAssetLink, } from '@tanstack/router-core';
3
3
  import { useRouter } from './useRouter';
4
4
  /**
5
5
  * Build the list of head/link/meta/script tags to render for active matches.
@@ -101,16 +101,38 @@ export const useTags = (assetCrossOrigin) => {
101
101
  .map((match) => manifest?.routes[match.routeId]?.assets ?? [])
102
102
  .filter(Boolean)
103
103
  .flat(1)
104
- .filter((asset) => asset.tag === 'link')
105
- .map((asset) => ({
106
- tag: 'link',
107
- attrs: {
108
- ...asset.attrs,
109
- crossOrigin: getAssetCrossOrigin(assetCrossOrigin, 'stylesheet') ??
110
- asset.attrs?.crossOrigin,
111
- nonce,
112
- },
113
- }));
104
+ .flatMap((asset) => {
105
+ if (asset.tag === 'link') {
106
+ if (isInlinableStylesheet(manifest, asset)) {
107
+ return [];
108
+ }
109
+ return [
110
+ {
111
+ tag: 'link',
112
+ attrs: {
113
+ ...asset.attrs,
114
+ crossOrigin: getAssetCrossOrigin(assetCrossOrigin, 'stylesheet') ??
115
+ asset.attrs?.crossOrigin,
116
+ nonce,
117
+ },
118
+ },
119
+ ];
120
+ }
121
+ if (asset.tag === 'style') {
122
+ return [
123
+ {
124
+ tag: 'style',
125
+ attrs: {
126
+ ...asset.attrs,
127
+ nonce,
128
+ },
129
+ children: asset.children,
130
+ ...(asset.inlineCss ? { inlineCss: true } : {}),
131
+ },
132
+ ];
133
+ }
134
+ return [];
135
+ });
114
136
  return [...constructed, ...assets];
115
137
  });
116
138
  const preloadLinks = Solid.createMemo(() => {
@@ -170,9 +192,28 @@ export const useTags = (assetCrossOrigin) => {
170
192
  if (prev === undefined) {
171
193
  return next;
172
194
  }
173
- return replaceEqualDeep(prev, next);
195
+ return replaceEqualTags(prev, next);
174
196
  });
175
197
  };
198
+ function replaceEqualTags(prev, next) {
199
+ const prevByKey = new Map();
200
+ for (const tag of prev) {
201
+ prevByKey.set(JSON.stringify(tag), tag);
202
+ }
203
+ let isEqual = prev.length === next.length;
204
+ const result = next.map((tag, index) => {
205
+ const existing = prevByKey.get(JSON.stringify(tag));
206
+ if (existing) {
207
+ if (existing !== prev[index]) {
208
+ isEqual = false;
209
+ }
210
+ return existing;
211
+ }
212
+ isEqual = false;
213
+ return tag;
214
+ });
215
+ return isEqual ? prev : result;
216
+ }
176
217
  export function uniqBy(arr, fn) {
177
218
  const seen = new Set();
178
219
  return arr.filter((item) => {
@@ -1 +1 @@
1
- {"version":3,"file":"headContentUtils.jsx","sourceRoot":"","sources":["../../src/headContentUtils.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"headContentUtils.jsx","sourceRoot":"","sources":["../../src/headContentUtils.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/solid-router",
3
- "version": "1.168.20",
3
+ "version": "1.168.22",
4
4
  "description": "Modern and scalable routing for Solid applications",
5
5
  "author": "Tanner Linsley",
6
6
  "license": "MIT",
@@ -92,7 +92,7 @@
92
92
  "@solidjs/meta": "^0.29.4",
93
93
  "isbot": "^5.1.22",
94
94
  "@tanstack/history": "1.161.6",
95
- "@tanstack/router-core": "1.168.15"
95
+ "@tanstack/router-core": "1.168.16"
96
96
  },
97
97
  "devDependencies": {
98
98
  "@solidjs/testing-library": "^0.8.10",
package/src/Asset.tsx CHANGED
@@ -5,11 +5,11 @@ import { useRouter } from './useRouter'
5
5
  import type { RouterManagedTag } from '@tanstack/router-core'
6
6
  import type { JSX } from 'solid-js'
7
7
 
8
- export function Asset({
9
- tag,
10
- attrs,
11
- children,
12
- }: RouterManagedTag): JSX.Element | null {
8
+ const INLINE_CSS_HYDRATION_ATTR = 'data-tsr-inline-css'
9
+
10
+ export function Asset(asset: RouterManagedTag): JSX.Element | null {
11
+ const { tag, attrs, children } = asset
12
+
13
13
  switch (tag) {
14
14
  case 'title':
15
15
  return <Title {...attrs}>{children}</Title>
@@ -18,6 +18,14 @@ export function Asset({
18
18
  case 'link':
19
19
  return <Link {...attrs} />
20
20
  case 'style':
21
+ if (
22
+ asset.inlineCss &&
23
+ (process.env.TSS_INLINE_CSS_ENABLED === 'true' ||
24
+ (process.env.TSS_INLINE_CSS_ENABLED === undefined && isServer))
25
+ ) {
26
+ return <InlineCssStyle attrs={attrs}>{children}</InlineCssStyle>
27
+ }
28
+
21
29
  return <Style {...attrs}>{children}</Style>
22
30
  case 'script':
23
31
  return <Script attrs={attrs}>{children}</Script>
@@ -26,6 +34,29 @@ export function Asset({
26
34
  }
27
35
  }
28
36
 
37
+ function InlineCssStyle({
38
+ attrs,
39
+ children,
40
+ }: {
41
+ attrs?: Record<string, any>
42
+ children?: RouterManagedTag['children']
43
+ }) {
44
+ const isInlineCssPlaceholder = children === undefined
45
+ const html = isInlineCssPlaceholder
46
+ ? typeof document === 'undefined'
47
+ ? ''
48
+ : (document.querySelector<HTMLStyleElement>(
49
+ `style[${INLINE_CSS_HYDRATION_ATTR}]`,
50
+ )?.textContent ?? '')
51
+ : (children ?? '')
52
+
53
+ return (
54
+ <Style {...attrs} {...{ [INLINE_CSS_HYDRATION_ATTR]: '' }}>
55
+ {html}
56
+ </Style>
57
+ )
58
+ }
59
+
29
60
  interface ScriptAttrs {
30
61
  [key: string]: string | boolean | undefined
31
62
  src?: string
package/src/fileRoute.ts CHANGED
@@ -81,7 +81,7 @@ export class FileRoute<
81
81
  TLoaderFn = undefined,
82
82
  TChildren = unknown,
83
83
  TSSR = unknown,
84
- TMiddlewares = unknown,
84
+ const TMiddlewares = unknown,
85
85
  THandlers = undefined,
86
86
  >(
87
87
  options?: FileBaseRouteOptions<
@@ -2,7 +2,7 @@ import * as Solid from 'solid-js'
2
2
  import {
3
3
  escapeHtml,
4
4
  getAssetCrossOrigin,
5
- replaceEqualDeep,
5
+ isInlinableStylesheet,
6
6
  resolveManifestAssetLink,
7
7
  } from '@tanstack/router-core'
8
8
  import { useRouter } from './useRouter'
@@ -117,20 +117,42 @@ export const useTags = (assetCrossOrigin?: AssetCrossOriginConfig) => {
117
117
  .map((match) => manifest?.routes[match.routeId]?.assets ?? [])
118
118
  .filter(Boolean)
119
119
  .flat(1)
120
- .filter((asset) => asset.tag === 'link')
121
- .map(
122
- (asset) =>
123
- ({
124
- tag: 'link',
125
- attrs: {
126
- ...asset.attrs,
127
- crossOrigin:
128
- getAssetCrossOrigin(assetCrossOrigin, 'stylesheet') ??
129
- asset.attrs?.crossOrigin,
130
- nonce,
120
+ .flatMap((asset): Array<RouterManagedTag> => {
121
+ if (asset.tag === 'link') {
122
+ if (isInlinableStylesheet(manifest, asset)) {
123
+ return []
124
+ }
125
+
126
+ return [
127
+ {
128
+ tag: 'link',
129
+ attrs: {
130
+ ...asset.attrs,
131
+ crossOrigin:
132
+ getAssetCrossOrigin(assetCrossOrigin, 'stylesheet') ??
133
+ asset.attrs?.crossOrigin,
134
+ nonce,
135
+ },
131
136
  },
132
- }) satisfies RouterManagedTag,
133
- )
137
+ ]
138
+ }
139
+
140
+ if (asset.tag === 'style') {
141
+ return [
142
+ {
143
+ tag: 'style',
144
+ attrs: {
145
+ ...asset.attrs,
146
+ nonce,
147
+ },
148
+ children: asset.children,
149
+ ...(asset.inlineCss ? { inlineCss: true as const } : {}),
150
+ },
151
+ ]
152
+ }
153
+
154
+ return []
155
+ })
134
156
 
135
157
  return [...constructed, ...assets]
136
158
  })
@@ -211,10 +233,36 @@ export const useTags = (assetCrossOrigin?: AssetCrossOriginConfig) => {
211
233
  if (prev === undefined) {
212
234
  return next
213
235
  }
214
- return replaceEqualDeep(prev, next)
236
+ return replaceEqualTags(prev, next)
215
237
  })
216
238
  }
217
239
 
240
+ function replaceEqualTags(
241
+ prev: Array<RouterManagedTag>,
242
+ next: Array<RouterManagedTag>,
243
+ ) {
244
+ const prevByKey = new Map<string, RouterManagedTag>()
245
+ for (const tag of prev) {
246
+ prevByKey.set(JSON.stringify(tag), tag)
247
+ }
248
+
249
+ let isEqual = prev.length === next.length
250
+ const result = next.map((tag, index) => {
251
+ const existing = prevByKey.get(JSON.stringify(tag))
252
+ if (existing) {
253
+ if (existing !== prev[index]) {
254
+ isEqual = false
255
+ }
256
+ return existing
257
+ }
258
+
259
+ isEqual = false
260
+ return tag
261
+ })
262
+
263
+ return isEqual ? prev : result
264
+ }
265
+
218
266
  export function uniqBy<T>(arr: Array<T>, fn: (item: T) => string) {
219
267
  const seen = new Set<string>()
220
268
  return arr.filter((item) => {