@analogjs/router 3.0.0-alpha.23 → 3.0.0-alpha.24
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.
package/fesm2022/route-files.mjs
CHANGED
|
@@ -6,9 +6,17 @@ import { injectAPIPrefix, injectBaseURL, injectInternalServerFetch } from "@anal
|
|
|
6
6
|
import { DOCUMENT } from "@angular/common";
|
|
7
7
|
import { filter } from "rxjs/operators";
|
|
8
8
|
import { Meta } from "@angular/platform-browser";
|
|
9
|
+
//#region node_modules/.pnpm/es-toolkit@1.45.1/node_modules/es-toolkit/dist/predicate/isPlainObject.mjs
|
|
10
|
+
function isPlainObject(value) {
|
|
11
|
+
if (!value || typeof value !== "object") return false;
|
|
12
|
+
const proto = Object.getPrototypeOf(value);
|
|
13
|
+
if (!(proto === null || proto === Object.prototype || Object.getPrototypeOf(proto) === null)) return false;
|
|
14
|
+
return Object.prototype.toString.call(value) === "[object Object]";
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
9
17
|
//#region packages/router/src/lib/json-ld.ts
|
|
10
18
|
function isJsonLdObject(value) {
|
|
11
|
-
return
|
|
19
|
+
return isPlainObject(value);
|
|
12
20
|
}
|
|
13
21
|
function normalizeJsonLd(value) {
|
|
14
22
|
if (Array.isArray(value)) return value.filter(isJsonLdObject);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-files.mjs","names":[],"sources":["../../src/lib/json-ld.ts","../../src/lib/meta-tags.ts","../../src/lib/endpoints.ts","../../src/lib/inject-route-endpoint-url.ts","../../src/lib/route-config.ts","../../src/lib/constants.ts","../../src/lib/route-builder.ts","../../src/lib/route-files.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\nimport { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, NavigationEnd, Router } from '@angular/router';\nimport { filter } from 'rxjs/operators';\n\nimport type { Graph, Thing, WithContext } from 'schema-dts';\n\nexport type JsonLdObject = Record<string, unknown>;\n\nexport function isJsonLdObject(value: unknown): value is JsonLdObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function normalizeJsonLd(value: unknown): JsonLdObject[] {\n if (Array.isArray(value)) {\n return value.filter(isJsonLdObject);\n }\n\n return isJsonLdObject(value) ? [value] : [];\n}\n\nexport type JsonLd = JsonLdObject | JsonLdObject[];\n\n/**\n * Typed JSON-LD document based on `schema-dts`.\n *\n * Accepts single Schema.org nodes (`WithContext<Thing>`),\n * `@graph`-based documents (`Graph`), or arrays of nodes.\n *\n * This is the canonical JSON-LD type for route authoring surfaces\n * (`routeMeta.jsonLd`, `routeJsonLd`, generated manifest).\n *\n * @example\n * ```ts\n * import type { WebPage, WithContext } from 'schema-dts';\n *\n * export const routeMeta = {\n * jsonLd: {\n * '@context': 'https://schema.org',\n * '@type': 'WebPage',\n * name: 'Products',\n * } satisfies WithContext<WebPage>,\n * };\n * ```\n */\nexport type AnalogJsonLdDocument =\n | WithContext<Thing>\n | Graph\n | Array<WithContext<Thing>>;\n\nexport const ROUTE_JSON_LD_KEY: unique symbol = Symbol(\n '@analogjs/router Route JSON-LD Key',\n);\nconst JSON_LD_SCRIPT_SELECTOR = 'script[data-analog-json-ld]';\n\nexport function updateJsonLdOnRouteChange(): void {\n const router = inject(Router);\n const document = inject(DOCUMENT);\n\n router.events\n .pipe(filter((event) => event instanceof NavigationEnd))\n .subscribe(() => {\n applyJsonLdToDocument(\n document,\n getJsonLdEntries(router.routerState.snapshot.root),\n );\n });\n}\n\nexport function serializeJsonLd(entry: JsonLdObject): string | null {\n try {\n return JSON.stringify(entry)\n .replace(/</g, '\\\\u003c')\n .replace(/>/g, '\\\\u003e')\n .replace(/&/g, '\\\\u0026')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n } catch {\n return null;\n }\n}\n\nfunction getJsonLdEntries(route: ActivatedRouteSnapshot): JsonLdObject[] {\n const entries: JsonLdObject[] = [];\n let currentRoute: ActivatedRouteSnapshot | null = route;\n\n while (currentRoute) {\n entries.push(...normalizeJsonLd(currentRoute.data[ROUTE_JSON_LD_KEY]));\n currentRoute = currentRoute.firstChild;\n }\n\n return entries;\n}\n\nfunction applyJsonLdToDocument(\n document: Document,\n entries: JsonLdObject[],\n): void {\n document.querySelectorAll(JSON_LD_SCRIPT_SELECTOR).forEach((element) => {\n element.remove();\n });\n\n if (entries.length === 0) {\n return;\n }\n\n const head = document.head || document.getElementsByTagName('head')[0];\n if (!head) {\n return;\n }\n\n entries.forEach((entry, index) => {\n const serialized = serializeJsonLd(entry);\n if (!serialized) {\n return;\n }\n\n const script = document.createElement('script');\n script.type = 'application/ld+json';\n script.setAttribute('data-analog-json-ld', 'true');\n script.setAttribute('data-analog-json-ld-index', String(index));\n script.textContent = serialized;\n head.appendChild(script);\n });\n}\n","import { inject } from '@angular/core';\nimport { Meta, MetaDefinition as NgMetaTag } from '@angular/platform-browser';\nimport { ActivatedRouteSnapshot, NavigationEnd, Router } from '@angular/router';\nimport { filter } from 'rxjs/operators';\n\nexport const ROUTE_META_TAGS_KEY: unique symbol = Symbol(\n '@analogjs/router Route Meta Tags Key',\n);\n\nconst CHARSET_KEY = 'charset';\nconst HTTP_EQUIV_KEY = 'httpEquiv';\n// httpEquiv selector key needs to be in kebab case format\nconst HTTP_EQUIV_SELECTOR_KEY = 'http-equiv';\nconst NAME_KEY = 'name';\nconst PROPERTY_KEY = 'property';\nconst CONTENT_KEY = 'content';\nconst ITEMPROP_KEY = 'itemprop';\n\nexport type MetaTag =\n | (CharsetMetaTag & ExcludeRestMetaTagKeys<typeof CHARSET_KEY>)\n | (HttpEquivMetaTag & ExcludeRestMetaTagKeys<typeof HTTP_EQUIV_KEY>)\n | (NameMetaTag & ExcludeRestMetaTagKeys<typeof NAME_KEY>)\n | (PropertyMetaTag & ExcludeRestMetaTagKeys<typeof PROPERTY_KEY>)\n | (ItempropMetaTag & ExcludeRestMetaTagKeys<typeof ITEMPROP_KEY>);\n\ntype CharsetMetaTag = { [CHARSET_KEY]: string };\ntype HttpEquivMetaTag = { [HTTP_EQUIV_KEY]: string; [CONTENT_KEY]: string };\ntype NameMetaTag = { [NAME_KEY]: string; [CONTENT_KEY]: string };\ntype PropertyMetaTag = { [PROPERTY_KEY]: string; [CONTENT_KEY]: string };\ntype ItempropMetaTag = { [ITEMPROP_KEY]: string; [CONTENT_KEY]: string };\n\ntype MetaTagKey =\n | typeof CHARSET_KEY\n | typeof HTTP_EQUIV_KEY\n | typeof NAME_KEY\n | typeof PROPERTY_KEY\n | typeof ITEMPROP_KEY;\ntype ExcludeRestMetaTagKeys<Key extends MetaTagKey> = {\n [K in Exclude<MetaTagKey, Key>]?: never;\n};\n\ntype MetaTagSelector =\n | typeof CHARSET_KEY\n | `${\n | typeof HTTP_EQUIV_SELECTOR_KEY\n | typeof NAME_KEY\n | typeof PROPERTY_KEY\n | typeof ITEMPROP_KEY}=\"${string}\"`;\ntype MetaTagMap = Record<MetaTagSelector, MetaTag>;\n\nexport function updateMetaTagsOnRouteChange(): void {\n const router = inject(Router);\n const metaService = inject(Meta);\n\n router.events\n .pipe(filter((event) => event instanceof NavigationEnd))\n .subscribe(() => {\n const metaTagMap = getMetaTagMap(router.routerState.snapshot.root);\n\n for (const metaTagSelector in metaTagMap) {\n const metaTag = metaTagMap[\n metaTagSelector as MetaTagSelector\n ] as NgMetaTag;\n metaService.updateTag(metaTag, metaTagSelector);\n }\n });\n}\n\nfunction getMetaTagMap(route: ActivatedRouteSnapshot): MetaTagMap {\n const metaTagMap = {} as MetaTagMap;\n let currentRoute: ActivatedRouteSnapshot | null = route;\n\n while (currentRoute) {\n const metaTags: MetaTag[] = currentRoute.data[ROUTE_META_TAGS_KEY] ?? [];\n for (const metaTag of metaTags) {\n metaTagMap[getMetaTagSelector(metaTag)] = metaTag;\n }\n\n currentRoute = currentRoute.firstChild;\n }\n\n return metaTagMap;\n}\n\nfunction getMetaTagSelector(metaTag: MetaTag): MetaTagSelector {\n if (metaTag.name) {\n return `${NAME_KEY}=\"${metaTag.name}\"`;\n }\n\n if (metaTag.property) {\n return `${PROPERTY_KEY}=\"${metaTag.property}\"`;\n }\n\n if (metaTag.httpEquiv) {\n return `${HTTP_EQUIV_SELECTOR_KEY}=\"${metaTag.httpEquiv}\"`;\n }\n\n if (metaTag.itemprop) {\n return `${ITEMPROP_KEY}=\"${metaTag.itemprop}\"`;\n }\n\n return CHARSET_KEY;\n}\n","export const ANALOG_META_KEY: unique symbol = Symbol(\n '@analogjs/router Analog Route Metadata Key',\n);\n\n/**\n * This variable reference is replaced with a glob of all route endpoints.\n */\nexport const ANALOG_PAGE_ENDPOINTS: Record<string, () => Promise<unknown>> = {};\n","import type { ActivatedRouteSnapshot, Route } from '@angular/router';\nimport { injectBaseURL, injectAPIPrefix } from '@analogjs/router/tokens';\n\nimport { ANALOG_META_KEY } from './endpoints';\n\nexport function injectRouteEndpointURL(route: ActivatedRouteSnapshot): URL {\n const routeConfig = route.routeConfig as Route & {\n [ANALOG_META_KEY]: { endpoint: string; endpointKey: string };\n };\n\n const apiPrefix = injectAPIPrefix();\n const baseUrl = injectBaseURL();\n const { queryParams, fragment: hash, params, parent } = route;\n const segment = parent?.url.map((segment) => segment.path).join('/') || '';\n const url = new URL(\n '',\n import.meta.env['VITE_ANALOG_PUBLIC_BASE_URL'] ||\n baseUrl ||\n (typeof window !== 'undefined' && window.location.origin\n ? window.location.origin\n : ''),\n );\n url.pathname = `${\n url.pathname.endsWith('/') ? url.pathname : url.pathname + '/'\n }${apiPrefix}/_analog${routeConfig[ANALOG_META_KEY].endpoint}`;\n url.search = `${new URLSearchParams(queryParams).toString()}`;\n url.hash = hash ?? '';\n\n Object.keys(params).forEach((param) => {\n url.pathname = url.pathname.replace(`[${param}]`, params[param]);\n });\n url.pathname = url.pathname.replace('**', segment);\n\n return url;\n}\n","import { inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport type { Route } from '@angular/router';\nimport { firstValueFrom } from 'rxjs';\nimport {\n injectInternalServerFetch,\n type ServerInternalFetch,\n} from '@analogjs/router/tokens';\n\nimport {\n DefaultRouteMeta,\n RedirectRouteMeta,\n RouteConfig,\n RouteMeta,\n} from './models';\nimport { ROUTE_JSON_LD_KEY, isJsonLdObject } from './json-ld';\nimport { ROUTE_META_TAGS_KEY } from './meta-tags';\nimport { ANALOG_PAGE_ENDPOINTS, ANALOG_META_KEY } from './endpoints';\nimport { injectRouteEndpointURL } from './inject-route-endpoint-url';\n\nexport function toRouteConfig(routeMeta: RouteMeta | undefined): RouteConfig {\n if (routeMeta && isRedirectRouteMeta(routeMeta)) {\n return routeMeta;\n }\n\n const defaultMeta: DefaultRouteMeta = (routeMeta ?? {}) as DefaultRouteMeta;\n const { meta, jsonLd, ...routeConfig } = defaultMeta;\n\n if (Array.isArray(meta)) {\n routeConfig.data = { ...routeConfig.data, [ROUTE_META_TAGS_KEY]: meta };\n } else if (typeof meta === 'function') {\n routeConfig.resolve = {\n ...routeConfig.resolve,\n [ROUTE_META_TAGS_KEY]: meta,\n };\n }\n\n if (Array.isArray(jsonLd) || isJsonLdObject(jsonLd)) {\n routeConfig.data = { ...routeConfig.data, [ROUTE_JSON_LD_KEY]: jsonLd };\n } else if (typeof jsonLd === 'function') {\n routeConfig.resolve = {\n ...routeConfig.resolve,\n [ROUTE_JSON_LD_KEY]: jsonLd,\n };\n }\n\n routeConfig.runGuardsAndResolvers =\n routeConfig.runGuardsAndResolvers ?? 'paramsOrQueryParamsChange';\n routeConfig.resolve = {\n ...routeConfig.resolve,\n load: async (route) => {\n const routeConfig = route.routeConfig as Route & {\n [ANALOG_META_KEY]: { endpoint: string; endpointKey: string };\n };\n\n // Content routes (from .md files in the pages directory) do not have\n // ANALOG_META_KEY — it is only set on page routes (.page.ts) in\n // route-builder.ts. The optional chain avoids a runtime crash when\n // the router resolves a content route during SSR / prerendering.\n if (ANALOG_PAGE_ENDPOINTS[routeConfig[ANALOG_META_KEY]?.endpointKey]) {\n const http = inject(HttpClient);\n const url = injectRouteEndpointURL(route);\n const internalFetch = injectInternalServerFetch();\n\n if (internalFetch) {\n return internalFetch(`${url.pathname}${url.search}`);\n }\n\n const globalFetch = (\n globalThis as unknown as { $fetch?: ServerInternalFetch }\n ).$fetch;\n if (!!import.meta.env['VITE_ANALOG_PUBLIC_BASE_URL'] && globalFetch) {\n return globalFetch(`${url.pathname}${url.search}`);\n }\n\n return firstValueFrom(http.get(`${url.href}`));\n }\n\n return {};\n },\n };\n\n return routeConfig;\n}\n\nfunction isRedirectRouteMeta(\n routeMeta: RouteMeta,\n): routeMeta is RedirectRouteMeta {\n return !!routeMeta.redirectTo;\n}\n","export const ENDPOINT_EXTENSION = '.server.ts';\nexport const APP_DIR = 'src/app';\n","import { UrlSegment } from '@angular/router';\nimport type { Route } from '@angular/router';\nimport type { UrlMatcher } from '@angular/router';\n\nimport type { DefaultRouteMeta, RouteExport, RouteMeta } from './models';\nimport { toRouteConfig } from './route-config';\nimport { ENDPOINT_EXTENSION } from './constants';\nimport { ANALOG_META_KEY } from './endpoints';\n\nexport type RouteModuleFactory = () => Promise<RouteExport>;\n\nexport type RouteModuleResolver<TFile> = (\n filename: string,\n fileLoader: () => Promise<TFile>,\n) => RouteModuleFactory;\n\ntype RawRoute = {\n filename: string | null;\n rawSegment: string;\n ancestorRawSegments: string[];\n segment: string;\n level: number;\n children: RawRoute[];\n};\n\ntype RawRouteMap = Record<string, RawRoute>;\ntype RawRouteByLevelMap = Record<number, RawRouteMap>;\n\nexport function createRoutes<TFile>(\n files: Record<string, () => Promise<TFile>>,\n resolveModule: RouteModuleResolver<TFile>,\n debug = false,\n): Route[] {\n const filenames = Object.keys(files);\n\n if (filenames.length === 0) {\n return [];\n }\n\n const rawRoutesByLevelMap = filenames.reduce((acc, filename) => {\n const rawPath = toRawPath(filename);\n const rawSegments = rawPath.split('/');\n const level = rawSegments.length - 1;\n const rawSegment = rawSegments[level];\n const ancestorRawSegments = rawSegments.slice(0, level);\n\n if (import.meta.env.DEV) {\n const existing = acc[level]?.[rawPath];\n if (existing?.filename && existing.filename !== filename) {\n console.warn(\n `[Analog] Route files \"${existing.filename}\" and \"${filename}\" ` +\n `resolve to the same route path \"${rawPath}\". ` +\n `Only \"${filename}\" will be used.`,\n );\n }\n }\n\n return {\n ...acc,\n [level]: {\n ...acc[level],\n [rawPath]: {\n filename,\n rawSegment,\n ancestorRawSegments,\n segment: toSegment(rawSegment),\n level,\n children: [],\n },\n },\n };\n }, {} as RawRouteByLevelMap);\n\n const allLevels = Object.keys(rawRoutesByLevelMap).map(Number);\n const maxLevel = Math.max(...allLevels);\n\n for (let level = maxLevel; level > 0; level--) {\n const rawRoutesMap = rawRoutesByLevelMap[level];\n const rawPaths = Object.keys(rawRoutesMap);\n\n for (const rawPath of rawPaths) {\n const rawRoute = rawRoutesMap[rawPath];\n const parentRawPath = rawRoute.ancestorRawSegments.join('/');\n const parentRawSegmentIndex = rawRoute.ancestorRawSegments.length - 1;\n const parentRawSegment =\n rawRoute.ancestorRawSegments[parentRawSegmentIndex];\n\n rawRoutesByLevelMap[level - 1] ||= {};\n rawRoutesByLevelMap[level - 1][parentRawPath] ||= {\n filename: null,\n rawSegment: parentRawSegment,\n ancestorRawSegments: rawRoute.ancestorRawSegments.slice(\n 0,\n parentRawSegmentIndex,\n ),\n segment: toSegment(parentRawSegment),\n level: level - 1,\n children: [],\n };\n\n rawRoutesByLevelMap[level - 1][parentRawPath].children.push(rawRoute);\n }\n }\n\n const rootRawRoutesMap = rawRoutesByLevelMap[0];\n const rawRoutes = Object.keys(rootRawRoutesMap).map(\n (segment) => rootRawRoutesMap[segment],\n );\n sortRawRoutes(rawRoutes);\n\n return toRoutes(rawRoutes, files, resolveModule, debug);\n}\n\n/**\n * Strips directory prefixes and file extensions from a route filename to\n * produce the raw path used for route segment construction.\n *\n * The regex mirrors `filenameToRoutePath` in route-manifest.ts — changes\n * here must be kept in sync with that function. The first alternation\n * strips everything up to and including the first /routes/, /pages/, or\n * /content/ segment, which handles both app-local and additional directory\n * paths (e.g. `additionalPagesDirs`, `additionalContentDirs`).\n */\nfunction toRawPath(filename: string): string {\n return filename\n .replace(\n /^(?:[a-zA-Z]:[\\\\/])?(.*?)[\\\\/](?:routes|pages|content)[\\\\/]|(?:[\\\\/](?:app[\\\\/](?:routes|pages)|src[\\\\/]content)[\\\\/])|(\\.page\\.(js|ts|analog|ag)$)|(\\.(ts|md|analog|ag)$)/g,\n '',\n )\n .replace(/\\[\\[\\.\\.\\.([^\\]]+)\\]\\]/g, '(opt-$1)')\n .replace(/\\[\\.{3}.+\\]/, '**')\n .replace(/\\[([^\\]]+)\\]/g, ':$1');\n}\n\nfunction toSegment(rawSegment: string): string {\n return rawSegment\n .replace(/\\(.*?\\)/g, '')\n .replace(/(^|[./])index(?=[./]|$)/g, '$1')\n .replace(/\\.|\\/+/g, '/')\n .replace(/^\\/+|\\/+$/g, '');\n}\n\nfunction createOptionalCatchAllMatcher(paramName: string): UrlMatcher {\n return (segments) => {\n if (segments.length === 0) {\n return null;\n }\n const joined = segments.map((s) => s.path).join('/');\n return {\n consumed: segments,\n posParams: { [paramName]: new UrlSegment(joined, {}) },\n };\n };\n}\n\nfunction toRoutes<TFile>(\n rawRoutes: RawRoute[],\n files: Record<string, () => Promise<TFile>>,\n resolveModule: RouteModuleResolver<TFile>,\n debug = false,\n): Route[] {\n const routes: Route[] = [];\n\n for (const rawRoute of rawRoutes) {\n const children: Route[] | undefined =\n rawRoute.children.length > 0\n ? toRoutes(rawRoute.children, files, resolveModule, debug)\n : undefined;\n let module: RouteModuleFactory | undefined;\n let analogMeta: { endpoint: string; endpointKey: string } | undefined;\n\n if (rawRoute.filename) {\n if (!debug) {\n module = resolveModule(rawRoute.filename, files[rawRoute.filename]);\n }\n\n if (/\\.page\\.(ts|analog|ag)$/.test(rawRoute.filename)) {\n const endpointKey = rawRoute.filename.replace(\n /\\.page\\.(ts|analog|ag)$/,\n ENDPOINT_EXTENSION,\n );\n\n const rawEndpoint = rawRoute.filename\n .replace(/\\.page\\.(ts|analog|ag)$/, '')\n .replace(/\\[\\[\\.\\.\\..+\\]\\]/, '**')\n .replace(/\\[\\.{3}.+\\]/, '**')\n .replace(/^(.*?)\\/pages/, '/pages');\n\n const endpoint = (rawEndpoint || '')\n .replace(/\\./g, '/')\n .replace(/\\/\\((.*?)\\)$/, '/-$1-');\n\n analogMeta = {\n endpoint,\n endpointKey,\n };\n }\n }\n\n const optCatchAllMatch = rawRoute.filename?.match(/\\[\\[\\.\\.\\.([^\\]]+)\\]\\]/);\n const optCatchAllParam = optCatchAllMatch ? optCatchAllMatch[1] : null;\n\n type DebugRoute = Route & {\n filename?: string | null | undefined;\n isLayout?: boolean;\n };\n\n const route: Route & { meta?: typeof analogMeta } & DebugRoute = module\n ? {\n path: rawRoute.segment,\n loadChildren: () =>\n module!().then((m) => {\n if (import.meta.env.DEV) {\n const hasModuleDefault = !!m.default;\n const hasRedirect = !!m.routeMeta?.redirectTo;\n\n if (!hasModuleDefault && !hasRedirect) {\n console.warn(\n `[Analog] Missing default export at ${rawRoute.filename}`,\n );\n }\n }\n\n const routeMeta = mergeRouteJsonLdIntoRouteMeta(\n m.routeMeta as RouteMeta | undefined,\n m.routeJsonLd,\n );\n\n const routeConfig = toRouteConfig(routeMeta);\n const hasRedirect = 'redirectTo' in routeConfig;\n const baseChild = hasRedirect\n ? {\n path: '',\n ...routeConfig,\n }\n : {\n path: '',\n component: m.default,\n ...routeConfig,\n children,\n [ANALOG_META_KEY]: analogMeta,\n };\n\n return [\n {\n ...baseChild,\n },\n ...(optCatchAllParam\n ? [\n {\n matcher:\n createOptionalCatchAllMatcher(optCatchAllParam),\n ...(hasRedirect\n ? routeConfig\n : {\n component: m.default,\n ...routeConfig,\n [ANALOG_META_KEY]: analogMeta,\n }),\n },\n ]\n : []),\n ];\n }),\n }\n : {\n path: rawRoute.segment,\n ...(debug\n ? {\n filename: rawRoute.filename ? rawRoute.filename : undefined,\n isLayout: children && children.length > 0 ? true : false,\n }\n : {}),\n children,\n };\n\n routes.push(route);\n }\n\n return routes;\n}\n\nfunction mergeRouteJsonLdIntoRouteMeta(\n routeMeta: RouteMeta | undefined,\n routeJsonLd: RouteExport['routeJsonLd'],\n): RouteMeta | undefined {\n if (!routeJsonLd) {\n return routeMeta;\n }\n\n if (!routeMeta) {\n return { jsonLd: routeJsonLd };\n }\n\n if (isRedirectRouteMeta(routeMeta) || routeMeta.jsonLd) {\n return routeMeta;\n }\n\n return {\n ...routeMeta,\n jsonLd: routeJsonLd,\n };\n}\n\nfunction isRedirectRouteMeta(\n routeMeta: RouteMeta,\n): routeMeta is Exclude<RouteMeta, DefaultRouteMeta> {\n return 'redirectTo' in routeMeta && !!routeMeta.redirectTo;\n}\n\nfunction sortRawRoutes(rawRoutes: RawRoute[]): void {\n rawRoutes.sort((a, b) => {\n let segmentA = deprioritizeSegment(a.segment);\n let segmentB = deprioritizeSegment(b.segment);\n\n if (a.children.length > b.children.length) {\n segmentA = `~${segmentA}`;\n } else if (a.children.length < b.children.length) {\n segmentB = `~${segmentB}`;\n }\n\n return segmentA > segmentB ? 1 : -1;\n });\n\n for (const rawRoute of rawRoutes) {\n sortRawRoutes(rawRoute.children);\n }\n}\n\nfunction deprioritizeSegment(segment: string): string {\n return segment.replaceAll(':', '~~').replaceAll('**', '~~~~');\n}\n","import { InjectionToken } from '@angular/core';\nimport type { RouteExport } from './models';\n\nexport type Files = Record<string, () => Promise<RouteExport>>;\n\n/**\n * This variable reference is replaced with a glob of all page routes.\n */\nexport const ANALOG_ROUTE_FILES = {};\n\nexport interface ExtraRouteFileSource {\n files: Record<string, () => Promise<unknown>>;\n resolveModule: (\n filename: string,\n fileLoader: () => Promise<unknown>,\n ) => () => Promise<RouteExport>;\n}\n\nexport const ANALOG_EXTRA_ROUTE_FILE_SOURCES: InjectionToken<\n ExtraRouteFileSource[]\n> = new InjectionToken('@analogjs/router extra route file sources');\n\n/**\n * Replaced at build time by the Vite router plugin with the number of\n * discovered content route files. Used in dev mode to warn when content\n * files exist but `withContentRoutes()` is not configured.\n */\nexport const ANALOG_CONTENT_FILE_COUNT = 0;\n"],"mappings":";;;;;;;;;AASA,SAAgB,eAAe,OAAuC;AACpE,QAAO,OAAO,UAAU,YAAY,UAAU,QAAS,CAAA,MAAM,QAAQ,MAAM;;AAG7E,SAAgB,gBAAgB,OAAgC;AAC9D,KAAI,MAAM,QAAQ,MAAQ,CACxB,QAAa,MAAA,OAAO,eAAe;AAGrC,QAAO,eAAe,MAAS,GAAC,CAAA,MAAS,GAAE,EAAA;;AAgC7C,IAAa,oBAAmC,OAC9C,qCACD;AACD,IAAM,0BAA0B;AAEhC,SAAgB,4BAAkC;CAChD,MAAM,SAAS,OAAO,OAAO;CAC7B,MAAM,WAAW,OAAO,SAAS;AAEjC,QAAO,OAGH,KAAA,QAAA,UACE,iBACA,cAAwB,CAAA,CAE1B,gBAAA;;GAGN;;AAEI,SAAY,gBACT,OAAQ;;AAMX,SAAO,KAAA,UAAA,MAAA,CAAA,QAAA,MAAA,UAAA,CAAA,QAAA,MAAA,UAAA,CAIF,QAAA,MAAiB,UAA+C,CACjE,QAA4B,WAAA,UAAA,CAC9B,QAA8C,WAAA,UAAA;SAGxC;AACR,SAAA;;;;CAMJ,MAAS,UAAA,EAAA;CAIP,IAAA,eAAS;AACP,QAAQ,cAAQ;AAChB,UAAA,KAAA,GAAA,gBAAA,aAAA,KAAA,mBAAA,CAAA;AAEE,iBAAQ,aAAc;;;;AAK1B,SAAK,sBAAM,UAAA,SAAA;AACT,UAAA,iBAAA,wBAAA,CAAA,SAAA,YAAA;;GAGF;AACE,KAAM,QAAA,WAAa,EACd;;AAIL,KAAM,CAAA,KACN;AAEA,SAAO,SAAA,OAAa,UAAA;EACpB,MAAO,aAAc,gBAAA,MAAA;AAChB,MAAA,CAAA,WACL;;;;;;;;;;;ACtHJ,IAAa,sBAAqC,OAChD,uCACD;AAED,IAAM,cAAc;AAIpB,IAAM,0BAAW;AACjB,IAAM,WAAA;AACN,IAAM,eAAc;AAmCpB,IAAA,eAAgB;SACC,8BAAc;CAC7B,MAAM,SAAA,OAAc,OAAY;CAEhC,MAAO,cACC,OAAQ,KAAA;AAEZ,QAAM,OAED,KAAM,QAAA,UAAmB,iBAAY,cAAA,CAAA,CAClC,gBAAU;EAGhB,MAAA,aAAsB,cAAS,OAAA,YAAgB,SAAA,KAAA;;GAEjD,MAAA,UAAA,WAAA;;;GAIJ;;AAGA,SAAO,cAAc,OAAA;CACnB,MAAM,aAAsB,EAAA;CAC5B,IAAK,eAAM;AACT,QAAA,cAAW;;AAGb,OAAA,MAAe,WAAa,SAAA,YAAA,mBAAA,QAAA,IAAA;;;AAO9B,QAAI;;;AAIJ,KAAI,QAAQ,KACV,QAAU,GAAA,SAAa,IAAI,QAAQ,KAAA;AAGrC,KAAI,QAAQ,SACV,QAAU,GAAA,aAAA,IAAA,QAA4B,SAAQ;AAGhD,KAAI,QAAQ,UACV,QAAU,GAAA,wBAAyB,IAAS,QAAA,UAAA;AAG9C,KAAO,QAAA,SAAA,QAAA,GAAA,aAAA,IAAA,QAAA,SAAA;;;;;ACrGT,IAAa,kBAAiC,OAC5C,6CACD;;;;AAKD,IAAa,wBAAgE,EAAE;;;ACF/E,SAAgB,uBAAuB,OAAoC;CACzE,MAAM,cAAc,MAAM;CAI1B,MAAM,YAAY,iBAAiB;CACnC,MAAM,UAAU,eAAe;CAC/B,MAAQ,EAAA,aAAa,UAAU,MAAM,QAAQ,WAAW;CACxD,MAAM,UAAU,QAAQ,IAAI,KAAK,YAAY,QAAQ,KAAM,CAAA,KAAK,IAAI,IAAI;CACxE,MAAM,MAAM,IAAI,IACd,IAAA;;;;;;GACgB,kCAMd,YAGA,OAAS,WAAO,eAAgB,OAAY,SAAC,SACtC,OAAQ,SAAA,SAEP,IAAA;AACV,KAAI,WAAW,GAAI,IAAA,SAAS,SAAY,IAAM,GAAA,IAAI,WAAc,IAAA,WAAA,MAAA,UAAA,UAAA,YAAA,iBAAA;AAChE,KAAA,SAAA,GAAA,IAAA,gBAAA,YAAA,CAAA,UAAA;AACF,KAAI,OAAA,QAAe;AAEnB,QAAO,KAAA,OAAA,CAAA,SAAA,UAAA;;;;;;;;ACbT,SAAgB,cAAc,WAA+C;AAC3E,KAAI,aAAa,sBAAoB,UAAY,CAC/C,QAAO;CAIT,MAAQ,EAAA,MAAM,QAAW,GAAA,gBADc,aAAe,EAAA;AAGtD,KAAI,MAAM,QAAQ,KAAO,CACvB,aAAY,OAAO;EAAA,GAAA,YAAA;GAAA,sBAAA;EAAA;UAAwB,OAAA,SAAsB,WAAM,aAAA,UAAA;EAC9D,GAAA,YAAO;GAChB,sBAAsB;EACjB;AAEJ,KAAA,MAAA,QAAA,OAAA,IAAA,eAAA,OAAA,CAAA,aAAA,OAAA;;;;UAID,OAAY,WAAO,WAAK,aAAY,UAAA;EAAO,GAAA,YAAoB;GAAQ,oBAAA;;AAGrE,aAAG,wBACF,YAAA,yBAAoB;AACtB,aAAA,UAAA;;EAGH,MAAY,OAAA,UAAA;AAcA,OAAA,sBAZU,MAAA,YAYe,kBAAA,cAAA;IACnB,MAAA,OAAA,OAAA,WAA6B;IACnC,MAAA,MAAgB,uBAAA,MAA2B;IAE7C,MAAA,gBAAe,2BAAA;AACV,QAAA,cAAA,QAAA,cAAA,GAAA,IAAA,WAAA,IAAA,SAAA;IAMH,MAAY,cAAI,WAAA;AACb,QAAA,CAAA,CAAA;;;;;;MAAmB,kCAAwB,YAAA,QAAA,YAAA,GAAA,IAAA,WAAA,IAAA,SAAA;;;;;EAU1D;;;AAMA,SAAQ,sBAAW,WAAA;;;;;ACxFrB,IAAa,qBAAqB;;;AC4BlC,SAAgB,aACd,OACA,eACA,QAAQ,OACC;CACT,MAAM,YAAY,OAAO,KAAK,MAAM;AAEpC,KAAI,UAAU,WAAc,EAC1B,QAAS,EAAA;CAGX,MAAM,sBAAsB,UAAU,QAAQ,KAAK,aAAa;EACxD,MAAA,UAAU,UAAU,SAAS;EAC7B,MAAA,cAAc,QAAc,MAAI,IAAA;EAChC,MAAA,QAAQ,YAAY,SAAS;EAC7B,MAAA,aAAa,YAAY;EACzB,MAAA,sBAAsB,YAAkB,MAAG,GAAM,MAAA;AAepD,SAAQ;GACA,GAAA;IACN,QAAU;IACT,GAAA,IAAA;KACA,UAAA;KACA;KACS;KACT;KACU,SAAA,UAAA,WAAA;;;KAGf;IACyB;GAEtB;IACA,EAAA,CAAA;CAEN,MAAS,YAAQ,OAAU,KAAA,oBAAoB,CAAA,IAAA,OAAA;CAC7C,MAAM,WAAA,KAAe,IAAA,GAAA,UAAoB;AACzC,MAAM,IAAA,QAAW,UAAY,QAAA,GAAA,SAAa;EAErC,MAAM,eAAW,oBAAU;EAC9B,MAAM,WAAW,OAAA,KAAa,aAAA;AAC9B,OAAM,MAAA,WAAgB,UAAS;GACzB,MAAA,WAAA,aAAiC;GACjC,MAAA,gBACJ,SAAS,oBAAoB,KAAA,IAAA;GAE/B,MAAA,wBAAqC,SAAA,oBAAA,SAAA;GACrC,MAAA,mBAA+B,SAAA,oBAAmB;AAChD,uBAAU,QAAA,OAAA,EAAA;AACV,uBAAY,QAAA,GAAA,mBAAA;IACZ,UAAqB;IAIZ,YAAU;IACZ,qBAAQ,SAAA,oBAAA,MAAA,GAAA,sBAAA;IACL,SAAA,UAAA,iBAAA;IACX,OAAA,QAAA;IAED,UAAoB,EAAA;;;;;CAQxB,MAAA,mBAAwB,oBAAA;CAExB,MAAO,YAAS,OAAW,KAAA,iBAAsB,CAAA,KAAM,YAAA,iBAAA,SAAA;;;;;;;;;;;;;;;AAwBzD,QAAS,SACA,QAAA,+KAIqB,GAAA,CAAA,QAAA,2BAAA,WAAA,CAGrB,QAAA,eAAA,KAAA,CACC,QAAA,iBAAa,MAAA;;AAEjB,SAAA,UAAO,YAAA;mBAEH,QAAS,YAAS,GAAK,CACtB,QAAA,4BAAA,KAAA,CACL,QAAU,WAAA,IAAA,CACV,QAAc,cAAY,GAAI;;;;AAKpC,MAAS,SACP,WACA,EAIM,QAAoB;EAGlB,MAAA,SACJ,SAAS,KAAS,MAAA,EAAA,KACd,CAAA,KAAA,IAAS;AAEX,SAAA;GACA,UAAA;GAEA,WAAS,GAAU,YAAA,IAAA,WAAA,QAAA,EAAA,CAAA,EAAA;GAChB;;;AAIL,SAAI,SAAA,WAAA,OAA0B,eAAc,QAAW,OAAA;CACrD,MAAM,SAAA,EAAA;AAKN,MAAA,MAAM,YAAc,WAAS;EAM7B,MAAM,WAAY,SAAA,SACf,SAAQ,IAGX,SAAa,SAAA,UAAA,OAAA,eAAA,MAAA,GACX,KAAA;EACA,IAAA;EACD,IAAA;;cAIC,UAAA,cAA4B,SAAU,UAAM,MAAA,SAAA,UAAyB;AAQrE,OAA2D,0BAC7D,KAAA,SAAA,SAAA,EAAA;IACQ,MAAS,cAAA,SAAA,SAAA,QAAA,2BAAA,mBAAA;AAcL,iBAAY;KAKZ,WAjBE,SAAY,SACJ,QAAS,2BAAA,GAAA,CACjB,QAAA,oBAAuB,KAAA,CACvB,QAAkB,eAAW,KAAA,CAE9B,QAAA,iBAAkC,SAAA,IAEnC,IAAA,QAAA,OAAA,IAAA,CAAA,QAAA,gBAAA,QAAA;KAWA;KACA;;;EAKF,MAAA,mBAAA,SAAA,UAAA,MAAA,yBAAA;EACE,MAAM,mBAAA,mBAAA,iBAAA,KAAA;EACN,MAAA,QAAa,SACV;GACH,MAAA,SAAA;GACC,oBAAkB,QAAA,CAAA,MAAA,MAAA;IAsBxB,MAAA,cAAA,cAAA,8BAAA,EAAA,WAAA,EAAA,YAAA,CAAA;;AAoBN,WAAA,CAIW,EACT,GAtBH,cACiB;KAEX,MAAA;KACqB,GAAA;KACT,GAEV;KACN,MAAA;KACD,WAAA,EAAA;KAEa,GAAA;;MAGb,kBAAA;SAWS,GAAA,mBACG,CAAA;KAGe,SAAI,8BAAkB,iBAAA;KAC/C,GAAA,cAAA,cAGF;MACF,WAAA,EAAA;MACK,GAAA;OACT,kBAAA;;KAID,CAEuB,GAAA,EAAA,CAGhB;KACS;GACV,GACA;GAEE,MAAS,SAAW;GACb,GAAI,QACJ;IACI,UAAA,SAAA,WAAA,SAAA,WAAA,KAAA;;IAGC,GAClB,EAAA;GAES;GACT;;;AAIJ,QAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjUT,IAAa,qBAAqB,EAAE;AAUpC,IAAa,kCAET,IAAI,eAAe,4CAA4C"}
|
|
1
|
+
{"version":3,"file":"route-files.mjs","names":[],"sources":["../../../../node_modules/.pnpm/es-toolkit@1.45.1/node_modules/es-toolkit/dist/predicate/isPlainObject.mjs","../../src/lib/json-ld.ts","../../src/lib/meta-tags.ts","../../src/lib/endpoints.ts","../../src/lib/inject-route-endpoint-url.ts","../../src/lib/route-config.ts","../../src/lib/constants.ts","../../src/lib/route-builder.ts","../../src/lib/route-files.ts"],"sourcesContent":["function isPlainObject(value) {\n if (!value || typeof value !== 'object') {\n return false;\n }\n const proto = Object.getPrototypeOf(value);\n const hasObjectPrototype = proto === null ||\n proto === Object.prototype ||\n Object.getPrototypeOf(proto) === null;\n if (!hasObjectPrototype) {\n return false;\n }\n return Object.prototype.toString.call(value) === '[object Object]';\n}\n\nexport { isPlainObject };\n","import { DOCUMENT } from '@angular/common';\nimport { inject } from '@angular/core';\nimport type { ActivatedRouteSnapshot } from '@angular/router';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { isPlainObject } from 'es-toolkit';\nimport { filter } from 'rxjs/operators';\n\nimport type { Graph, Thing, WithContext } from 'schema-dts';\n\nexport type JsonLdObject = Record<string, unknown>;\n\nexport function isJsonLdObject(value: unknown): value is JsonLdObject {\n return isPlainObject(value);\n}\n\nexport function normalizeJsonLd(value: unknown): JsonLdObject[] {\n if (Array.isArray(value)) {\n return value.filter(isJsonLdObject);\n }\n\n return isJsonLdObject(value) ? [value] : [];\n}\n\nexport type JsonLd = JsonLdObject | JsonLdObject[];\n\n/**\n * Typed JSON-LD document based on `schema-dts`.\n *\n * Accepts single Schema.org nodes (`WithContext<Thing>`),\n * `@graph`-based documents (`Graph`), or arrays of nodes.\n *\n * This is the canonical JSON-LD type for route authoring surfaces\n * (`routeMeta.jsonLd`, `routeJsonLd`, generated manifest).\n *\n * @example\n * ```ts\n * import type { WebPage, WithContext } from 'schema-dts';\n *\n * export const routeMeta = {\n * jsonLd: {\n * '@context': 'https://schema.org',\n * '@type': 'WebPage',\n * name: 'Products',\n * } satisfies WithContext<WebPage>,\n * };\n * ```\n */\nexport type AnalogJsonLdDocument =\n | WithContext<Thing>\n | Graph\n | WithContext<Thing>[];\n\nexport const ROUTE_JSON_LD_KEY: unique symbol = Symbol(\n '@analogjs/router Route JSON-LD Key',\n);\nconst JSON_LD_SCRIPT_SELECTOR = 'script[data-analog-json-ld]';\n\nexport function updateJsonLdOnRouteChange(): void {\n const router = inject(Router);\n const document = inject(DOCUMENT);\n\n router.events\n .pipe(filter((event) => event instanceof NavigationEnd))\n .subscribe(() => {\n applyJsonLdToDocument(\n document,\n getJsonLdEntries(router.routerState.snapshot.root),\n );\n });\n}\n\nexport function serializeJsonLd(entry: JsonLdObject): string | null {\n try {\n return JSON.stringify(entry)\n .replace(/</g, '\\\\u003c')\n .replace(/>/g, '\\\\u003e')\n .replace(/&/g, '\\\\u0026')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n } catch {\n return null;\n }\n}\n\nfunction getJsonLdEntries(route: ActivatedRouteSnapshot): JsonLdObject[] {\n const entries: JsonLdObject[] = [];\n let currentRoute: ActivatedRouteSnapshot | null = route;\n\n while (currentRoute) {\n entries.push(...normalizeJsonLd(currentRoute.data[ROUTE_JSON_LD_KEY]));\n currentRoute = currentRoute.firstChild;\n }\n\n return entries;\n}\n\nfunction applyJsonLdToDocument(\n document: Document,\n entries: JsonLdObject[],\n): void {\n document.querySelectorAll(JSON_LD_SCRIPT_SELECTOR).forEach((element) => {\n element.remove();\n });\n\n if (entries.length === 0) {\n return;\n }\n\n const head = document.head || document.getElementsByTagName('head')[0];\n if (!head) {\n return;\n }\n\n entries.forEach((entry, index) => {\n const serialized = serializeJsonLd(entry);\n if (!serialized) {\n return;\n }\n\n const script = document.createElement('script');\n script.type = 'application/ld+json';\n script.setAttribute('data-analog-json-ld', 'true');\n script.setAttribute('data-analog-json-ld-index', String(index));\n script.textContent = serialized;\n head.appendChild(script);\n });\n}\n","import { inject } from '@angular/core';\nimport { Meta, MetaDefinition as NgMetaTag } from '@angular/platform-browser';\nimport { ActivatedRouteSnapshot, NavigationEnd, Router } from '@angular/router';\nimport { filter } from 'rxjs/operators';\n\nexport const ROUTE_META_TAGS_KEY: unique symbol = Symbol(\n '@analogjs/router Route Meta Tags Key',\n);\n\nconst CHARSET_KEY = 'charset';\nconst HTTP_EQUIV_KEY = 'httpEquiv';\n// httpEquiv selector key needs to be in kebab case format\nconst HTTP_EQUIV_SELECTOR_KEY = 'http-equiv';\nconst NAME_KEY = 'name';\nconst PROPERTY_KEY = 'property';\nconst CONTENT_KEY = 'content';\nconst ITEMPROP_KEY = 'itemprop';\n\nexport type MetaTag =\n | (CharsetMetaTag & ExcludeRestMetaTagKeys<typeof CHARSET_KEY>)\n | (HttpEquivMetaTag & ExcludeRestMetaTagKeys<typeof HTTP_EQUIV_KEY>)\n | (NameMetaTag & ExcludeRestMetaTagKeys<typeof NAME_KEY>)\n | (PropertyMetaTag & ExcludeRestMetaTagKeys<typeof PROPERTY_KEY>)\n | (ItempropMetaTag & ExcludeRestMetaTagKeys<typeof ITEMPROP_KEY>);\n\ntype CharsetMetaTag = { [CHARSET_KEY]: string };\ntype HttpEquivMetaTag = { [HTTP_EQUIV_KEY]: string; [CONTENT_KEY]: string };\ntype NameMetaTag = { [NAME_KEY]: string; [CONTENT_KEY]: string };\ntype PropertyMetaTag = { [PROPERTY_KEY]: string; [CONTENT_KEY]: string };\ntype ItempropMetaTag = { [ITEMPROP_KEY]: string; [CONTENT_KEY]: string };\n\ntype MetaTagKey =\n | typeof CHARSET_KEY\n | typeof HTTP_EQUIV_KEY\n | typeof NAME_KEY\n | typeof PROPERTY_KEY\n | typeof ITEMPROP_KEY;\ntype ExcludeRestMetaTagKeys<Key extends MetaTagKey> = {\n [K in Exclude<MetaTagKey, Key>]?: never;\n};\n\ntype MetaTagSelector =\n | typeof CHARSET_KEY\n | `${\n | typeof HTTP_EQUIV_SELECTOR_KEY\n | typeof NAME_KEY\n | typeof PROPERTY_KEY\n | typeof ITEMPROP_KEY}=\"${string}\"`;\ntype MetaTagMap = Record<MetaTagSelector, MetaTag>;\n\nexport function updateMetaTagsOnRouteChange(): void {\n const router = inject(Router);\n const metaService = inject(Meta);\n\n router.events\n .pipe(filter((event) => event instanceof NavigationEnd))\n .subscribe(() => {\n const metaTagMap = getMetaTagMap(router.routerState.snapshot.root);\n\n for (const metaTagSelector in metaTagMap) {\n const metaTag = metaTagMap[\n metaTagSelector as MetaTagSelector\n ] as NgMetaTag;\n metaService.updateTag(metaTag, metaTagSelector);\n }\n });\n}\n\nfunction getMetaTagMap(route: ActivatedRouteSnapshot): MetaTagMap {\n const metaTagMap = {} as MetaTagMap;\n let currentRoute: ActivatedRouteSnapshot | null = route;\n\n while (currentRoute) {\n const metaTags: MetaTag[] = currentRoute.data[ROUTE_META_TAGS_KEY] ?? [];\n for (const metaTag of metaTags) {\n metaTagMap[getMetaTagSelector(metaTag)] = metaTag;\n }\n\n currentRoute = currentRoute.firstChild;\n }\n\n return metaTagMap;\n}\n\nfunction getMetaTagSelector(metaTag: MetaTag): MetaTagSelector {\n if (metaTag.name) {\n return `${NAME_KEY}=\"${metaTag.name}\"`;\n }\n\n if (metaTag.property) {\n return `${PROPERTY_KEY}=\"${metaTag.property}\"`;\n }\n\n if (metaTag.httpEquiv) {\n return `${HTTP_EQUIV_SELECTOR_KEY}=\"${metaTag.httpEquiv}\"`;\n }\n\n if (metaTag.itemprop) {\n return `${ITEMPROP_KEY}=\"${metaTag.itemprop}\"`;\n }\n\n return CHARSET_KEY;\n}\n","export const ANALOG_META_KEY: unique symbol = Symbol(\n '@analogjs/router Analog Route Metadata Key',\n);\n\n/**\n * This variable reference is replaced with a glob of all route endpoints.\n */\nexport const ANALOG_PAGE_ENDPOINTS: Record<string, () => Promise<unknown>> = {};\n","import type { ActivatedRouteSnapshot, Route } from '@angular/router';\nimport { injectBaseURL, injectAPIPrefix } from '@analogjs/router/tokens';\n\nimport { ANALOG_META_KEY } from './endpoints';\n\nexport function injectRouteEndpointURL(route: ActivatedRouteSnapshot): URL {\n const routeConfig = route.routeConfig as Route & {\n [ANALOG_META_KEY]: { endpoint: string; endpointKey: string };\n };\n\n const apiPrefix = injectAPIPrefix();\n const baseUrl = injectBaseURL();\n const { queryParams, fragment: hash, params, parent } = route;\n const segment = parent?.url.map((segment) => segment.path).join('/') || '';\n const url = new URL(\n '',\n import.meta.env['VITE_ANALOG_PUBLIC_BASE_URL'] ||\n baseUrl ||\n (typeof window !== 'undefined' && window.location.origin\n ? window.location.origin\n : ''),\n );\n url.pathname = `${\n url.pathname.endsWith('/') ? url.pathname : url.pathname + '/'\n }${apiPrefix}/_analog${routeConfig[ANALOG_META_KEY].endpoint}`;\n url.search = `${new URLSearchParams(queryParams).toString()}`;\n url.hash = hash ?? '';\n\n Object.keys(params).forEach((param) => {\n url.pathname = url.pathname.replace(`[${param}]`, params[param]);\n });\n url.pathname = url.pathname.replace('**', segment);\n\n return url;\n}\n","import { inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport type { Route } from '@angular/router';\nimport { firstValueFrom } from 'rxjs';\nimport {\n injectInternalServerFetch,\n type ServerInternalFetch,\n} from '@analogjs/router/tokens';\n\nimport {\n DefaultRouteMeta,\n RedirectRouteMeta,\n RouteConfig,\n RouteMeta,\n} from './models';\nimport { ROUTE_JSON_LD_KEY, isJsonLdObject } from './json-ld';\nimport { ROUTE_META_TAGS_KEY } from './meta-tags';\nimport { ANALOG_PAGE_ENDPOINTS, ANALOG_META_KEY } from './endpoints';\nimport { injectRouteEndpointURL } from './inject-route-endpoint-url';\n\nexport function toRouteConfig(routeMeta: RouteMeta | undefined): RouteConfig {\n if (routeMeta && isRedirectRouteMeta(routeMeta)) {\n return routeMeta;\n }\n\n const defaultMeta: DefaultRouteMeta = (routeMeta ?? {}) as DefaultRouteMeta;\n const { meta, jsonLd, ...routeConfig } = defaultMeta;\n\n if (Array.isArray(meta)) {\n routeConfig.data = { ...routeConfig.data, [ROUTE_META_TAGS_KEY]: meta };\n } else if (typeof meta === 'function') {\n routeConfig.resolve = {\n ...routeConfig.resolve,\n [ROUTE_META_TAGS_KEY]: meta,\n };\n }\n\n if (Array.isArray(jsonLd) || isJsonLdObject(jsonLd)) {\n routeConfig.data = { ...routeConfig.data, [ROUTE_JSON_LD_KEY]: jsonLd };\n } else if (typeof jsonLd === 'function') {\n routeConfig.resolve = {\n ...routeConfig.resolve,\n [ROUTE_JSON_LD_KEY]: jsonLd,\n };\n }\n\n routeConfig.runGuardsAndResolvers =\n routeConfig.runGuardsAndResolvers ?? 'paramsOrQueryParamsChange';\n routeConfig.resolve = {\n ...routeConfig.resolve,\n load: async (route) => {\n const routeConfig = route.routeConfig as Route & {\n [ANALOG_META_KEY]: { endpoint: string; endpointKey: string };\n };\n\n // Content routes (from .md files in the pages directory) do not have\n // ANALOG_META_KEY — it is only set on page routes (.page.ts) in\n // route-builder.ts. The optional chain avoids a runtime crash when\n // the router resolves a content route during SSR / prerendering.\n if (ANALOG_PAGE_ENDPOINTS[routeConfig[ANALOG_META_KEY]?.endpointKey]) {\n const http = inject(HttpClient);\n const url = injectRouteEndpointURL(route);\n const internalFetch = injectInternalServerFetch();\n\n if (internalFetch) {\n return internalFetch(`${url.pathname}${url.search}`);\n }\n\n const globalFetch = (\n globalThis as unknown as { $fetch?: ServerInternalFetch }\n ).$fetch;\n if (!!import.meta.env['VITE_ANALOG_PUBLIC_BASE_URL'] && globalFetch) {\n return globalFetch(`${url.pathname}${url.search}`);\n }\n\n return firstValueFrom(http.get(`${url.href}`));\n }\n\n return {};\n },\n };\n\n return routeConfig;\n}\n\nfunction isRedirectRouteMeta(\n routeMeta: RouteMeta,\n): routeMeta is RedirectRouteMeta {\n return !!routeMeta.redirectTo;\n}\n","export const ENDPOINT_EXTENSION = '.server.ts';\nexport const APP_DIR = 'src/app';\n","import { UrlSegment } from '@angular/router';\nimport type { Route } from '@angular/router';\nimport type { UrlMatcher } from '@angular/router';\n\nimport type { DefaultRouteMeta, RouteExport, RouteMeta } from './models';\nimport { toRouteConfig } from './route-config';\nimport { ENDPOINT_EXTENSION } from './constants';\nimport { ANALOG_META_KEY } from './endpoints';\n\nexport type RouteModuleFactory = () => Promise<RouteExport>;\n\nexport type RouteModuleResolver<TFile> = (\n filename: string,\n fileLoader: () => Promise<TFile>,\n) => RouteModuleFactory;\n\ntype RawRoute = {\n filename: string | null;\n rawSegment: string;\n ancestorRawSegments: string[];\n segment: string;\n level: number;\n children: RawRoute[];\n};\n\ntype RawRouteMap = Record<string, RawRoute>;\ntype RawRouteByLevelMap = Record<number, RawRouteMap>;\n\nexport function createRoutes<TFile>(\n files: Record<string, () => Promise<TFile>>,\n resolveModule: RouteModuleResolver<TFile>,\n debug = false,\n): Route[] {\n const filenames = Object.keys(files);\n\n if (filenames.length === 0) {\n return [];\n }\n\n const rawRoutesByLevelMap = filenames.reduce((acc, filename) => {\n const rawPath = toRawPath(filename);\n const rawSegments = rawPath.split('/');\n const level = rawSegments.length - 1;\n const rawSegment = rawSegments[level];\n const ancestorRawSegments = rawSegments.slice(0, level);\n\n if (import.meta.env.DEV) {\n const existing = acc[level]?.[rawPath];\n if (existing?.filename && existing.filename !== filename) {\n console.warn(\n `[Analog] Route files \"${existing.filename}\" and \"${filename}\" ` +\n `resolve to the same route path \"${rawPath}\". ` +\n `Only \"${filename}\" will be used.`,\n );\n }\n }\n\n return {\n ...acc,\n [level]: {\n ...acc[level],\n [rawPath]: {\n filename,\n rawSegment,\n ancestorRawSegments,\n segment: toSegment(rawSegment),\n level,\n children: [],\n },\n },\n };\n }, {} as RawRouteByLevelMap);\n\n const allLevels = Object.keys(rawRoutesByLevelMap).map(Number);\n const maxLevel = Math.max(...allLevels);\n\n for (let level = maxLevel; level > 0; level--) {\n const rawRoutesMap = rawRoutesByLevelMap[level];\n const rawPaths = Object.keys(rawRoutesMap);\n\n for (const rawPath of rawPaths) {\n const rawRoute = rawRoutesMap[rawPath];\n const parentRawPath = rawRoute.ancestorRawSegments.join('/');\n const parentRawSegmentIndex = rawRoute.ancestorRawSegments.length - 1;\n const parentRawSegment =\n rawRoute.ancestorRawSegments[parentRawSegmentIndex];\n\n rawRoutesByLevelMap[level - 1] ||= {};\n rawRoutesByLevelMap[level - 1][parentRawPath] ||= {\n filename: null,\n rawSegment: parentRawSegment,\n ancestorRawSegments: rawRoute.ancestorRawSegments.slice(\n 0,\n parentRawSegmentIndex,\n ),\n segment: toSegment(parentRawSegment),\n level: level - 1,\n children: [],\n };\n\n rawRoutesByLevelMap[level - 1][parentRawPath].children.push(rawRoute);\n }\n }\n\n const rootRawRoutesMap = rawRoutesByLevelMap[0];\n const rawRoutes = Object.keys(rootRawRoutesMap).map(\n (segment) => rootRawRoutesMap[segment],\n );\n sortRawRoutes(rawRoutes);\n\n return toRoutes(rawRoutes, files, resolveModule, debug);\n}\n\n/**\n * Strips directory prefixes and file extensions from a route filename to\n * produce the raw path used for route segment construction.\n *\n * The regex mirrors `filenameToRoutePath` in route-manifest.ts — changes\n * here must be kept in sync with that function. The first alternation\n * strips everything up to and including the first /routes/, /pages/, or\n * /content/ segment, which handles both app-local and additional directory\n * paths (e.g. `additionalPagesDirs`, `additionalContentDirs`).\n */\nfunction toRawPath(filename: string): string {\n return filename\n .replace(\n /^(?:[a-zA-Z]:[\\\\/])?(.*?)[\\\\/](?:routes|pages|content)[\\\\/]|(?:[\\\\/](?:app[\\\\/](?:routes|pages)|src[\\\\/]content)[\\\\/])|(\\.page\\.(js|ts|analog|ag)$)|(\\.(ts|md|analog|ag)$)/g,\n '',\n )\n .replace(/\\[\\[\\.\\.\\.([^\\]]+)\\]\\]/g, '(opt-$1)')\n .replace(/\\[\\.{3}.+\\]/, '**')\n .replace(/\\[([^\\]]+)\\]/g, ':$1');\n}\n\nfunction toSegment(rawSegment: string): string {\n return rawSegment\n .replace(/\\(.*?\\)/g, '')\n .replace(/(^|[./])index(?=[./]|$)/g, '$1')\n .replace(/\\.|\\/+/g, '/')\n .replace(/^\\/+|\\/+$/g, '');\n}\n\nfunction createOptionalCatchAllMatcher(paramName: string): UrlMatcher {\n return (segments) => {\n if (segments.length === 0) {\n return null;\n }\n const joined = segments.map((s) => s.path).join('/');\n return {\n consumed: segments,\n posParams: { [paramName]: new UrlSegment(joined, {}) },\n };\n };\n}\n\nfunction toRoutes<TFile>(\n rawRoutes: RawRoute[],\n files: Record<string, () => Promise<TFile>>,\n resolveModule: RouteModuleResolver<TFile>,\n debug = false,\n): Route[] {\n const routes: Route[] = [];\n\n for (const rawRoute of rawRoutes) {\n const children: Route[] | undefined =\n rawRoute.children.length > 0\n ? toRoutes(rawRoute.children, files, resolveModule, debug)\n : undefined;\n let module: RouteModuleFactory | undefined;\n let analogMeta: { endpoint: string; endpointKey: string } | undefined;\n\n if (rawRoute.filename) {\n if (!debug) {\n module = resolveModule(rawRoute.filename, files[rawRoute.filename]);\n }\n\n if (/\\.page\\.(ts|analog|ag)$/.test(rawRoute.filename)) {\n const endpointKey = rawRoute.filename.replace(\n /\\.page\\.(ts|analog|ag)$/,\n ENDPOINT_EXTENSION,\n );\n\n const rawEndpoint = rawRoute.filename\n .replace(/\\.page\\.(ts|analog|ag)$/, '')\n .replace(/\\[\\[\\.\\.\\..+\\]\\]/, '**')\n .replace(/\\[\\.{3}.+\\]/, '**')\n .replace(/^(.*?)\\/pages/, '/pages');\n\n const endpoint = (rawEndpoint || '')\n .replace(/\\./g, '/')\n .replace(/\\/\\((.*?)\\)$/, '/-$1-');\n\n analogMeta = {\n endpoint,\n endpointKey,\n };\n }\n }\n\n const optCatchAllMatch = rawRoute.filename?.match(/\\[\\[\\.\\.\\.([^\\]]+)\\]\\]/);\n const optCatchAllParam = optCatchAllMatch ? optCatchAllMatch[1] : null;\n\n type DebugRoute = Route & {\n filename?: string | null | undefined;\n isLayout?: boolean;\n };\n\n const route: Route & { meta?: typeof analogMeta } & DebugRoute = module\n ? {\n path: rawRoute.segment,\n loadChildren: () =>\n module!().then((m) => {\n if (import.meta.env.DEV) {\n const hasModuleDefault = !!m.default;\n const hasRedirect = !!m.routeMeta?.redirectTo;\n\n if (!hasModuleDefault && !hasRedirect) {\n console.warn(\n `[Analog] Missing default export at ${rawRoute.filename}`,\n );\n }\n }\n\n const routeMeta = mergeRouteJsonLdIntoRouteMeta(\n m.routeMeta as RouteMeta | undefined,\n m.routeJsonLd,\n );\n\n const routeConfig = toRouteConfig(routeMeta);\n const hasRedirect = 'redirectTo' in routeConfig;\n const baseChild = hasRedirect\n ? {\n path: '',\n ...routeConfig,\n }\n : {\n path: '',\n component: m.default,\n ...routeConfig,\n children,\n [ANALOG_META_KEY]: analogMeta,\n };\n\n return [\n {\n ...baseChild,\n },\n ...(optCatchAllParam\n ? [\n {\n matcher:\n createOptionalCatchAllMatcher(optCatchAllParam),\n ...(hasRedirect\n ? routeConfig\n : {\n component: m.default,\n ...routeConfig,\n [ANALOG_META_KEY]: analogMeta,\n }),\n },\n ]\n : []),\n ];\n }),\n }\n : {\n path: rawRoute.segment,\n ...(debug\n ? {\n filename: rawRoute.filename ? rawRoute.filename : undefined,\n isLayout: children && children.length > 0 ? true : false,\n }\n : {}),\n children,\n };\n\n routes.push(route);\n }\n\n return routes;\n}\n\nfunction mergeRouteJsonLdIntoRouteMeta(\n routeMeta: RouteMeta | undefined,\n routeJsonLd: RouteExport['routeJsonLd'],\n): RouteMeta | undefined {\n if (!routeJsonLd) {\n return routeMeta;\n }\n\n if (!routeMeta) {\n return { jsonLd: routeJsonLd };\n }\n\n if (isRedirectRouteMeta(routeMeta) || routeMeta.jsonLd) {\n return routeMeta;\n }\n\n return {\n ...routeMeta,\n jsonLd: routeJsonLd,\n };\n}\n\nfunction isRedirectRouteMeta(\n routeMeta: RouteMeta,\n): routeMeta is Exclude<RouteMeta, DefaultRouteMeta> {\n return 'redirectTo' in routeMeta && !!routeMeta.redirectTo;\n}\n\nfunction sortRawRoutes(rawRoutes: RawRoute[]): void {\n rawRoutes.sort((a, b) => {\n let segmentA = deprioritizeSegment(a.segment);\n let segmentB = deprioritizeSegment(b.segment);\n\n if (a.children.length > b.children.length) {\n segmentA = `~${segmentA}`;\n } else if (a.children.length < b.children.length) {\n segmentB = `~${segmentB}`;\n }\n\n return segmentA > segmentB ? 1 : -1;\n });\n\n for (const rawRoute of rawRoutes) {\n sortRawRoutes(rawRoute.children);\n }\n}\n\nfunction deprioritizeSegment(segment: string): string {\n return segment.replaceAll(':', '~~').replaceAll('**', '~~~~');\n}\n","import { InjectionToken } from '@angular/core';\nimport type { RouteExport } from './models';\n\nexport type Files = Record<string, () => Promise<RouteExport>>;\n\n/**\n * This variable reference is replaced with a glob of all page routes.\n */\nexport const ANALOG_ROUTE_FILES = {};\n\nexport interface ExtraRouteFileSource {\n files: Record<string, () => Promise<unknown>>;\n resolveModule: (\n filename: string,\n fileLoader: () => Promise<unknown>,\n ) => () => Promise<RouteExport>;\n}\n\nexport const ANALOG_EXTRA_ROUTE_FILE_SOURCES: InjectionToken<\n ExtraRouteFileSource[]\n> = new InjectionToken('@analogjs/router extra route file sources');\n\n/**\n * Replaced at build time by the Vite router plugin with the number of\n * discovered content route files. Used in dev mode to warn when content\n * files exist but `withContentRoutes()` is not configured.\n */\nexport const ANALOG_CONTENT_FILE_COUNT = 0;\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@analogjs/router",
|
|
3
|
-
"version": "3.0.0-alpha.
|
|
3
|
+
"version": "3.0.0-alpha.24",
|
|
4
4
|
"description": "Filesystem-based routing for Angular",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "Brandon Roberts <robertsbt@gmail.com>",
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"url": "https://github.com/sponsors/brandonroberts"
|
|
65
65
|
},
|
|
66
66
|
"peerDependencies": {
|
|
67
|
-
"@analogjs/content": "
|
|
67
|
+
"@analogjs/content": "3.0.0-alpha.24",
|
|
68
68
|
"@angular/core": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0",
|
|
69
69
|
"@angular/platform-server": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0",
|
|
70
70
|
"@angular/router": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0",
|
|
@@ -87,10 +87,11 @@
|
|
|
87
87
|
},
|
|
88
88
|
"dependencies": {
|
|
89
89
|
"@standard-schema/spec": "^1.1.0",
|
|
90
|
+
"es-toolkit": "^1.45.1",
|
|
90
91
|
"tslib": "^2.3.0"
|
|
91
92
|
},
|
|
92
93
|
"devDependencies": {
|
|
93
|
-
"@analogjs/vite-plugin-angular": "
|
|
94
|
+
"@analogjs/vite-plugin-angular": "3.0.0-alpha.24"
|
|
94
95
|
},
|
|
95
96
|
"ng-update": {
|
|
96
97
|
"packageGroup": [
|
|
@@ -25,7 +25,7 @@ export type JsonLd = JsonLdObject | JsonLdObject[];
|
|
|
25
25
|
* };
|
|
26
26
|
* ```
|
|
27
27
|
*/
|
|
28
|
-
export type AnalogJsonLdDocument = WithContext<Thing> | Graph |
|
|
28
|
+
export type AnalogJsonLdDocument = WithContext<Thing> | Graph | WithContext<Thing>[];
|
|
29
29
|
export declare const ROUTE_JSON_LD_KEY: unique symbol;
|
|
30
30
|
export declare function updateJsonLdOnRouteChange(): void;
|
|
31
31
|
export declare function serializeJsonLd(entry: JsonLdObject): string | null;
|