@lucidclient/speculate
Version:
A lightweight library to handle speculate rules for prefetching and prerendering documents, with added support for data fetching on intent.
1 lines • 28.6 kB
Source Map (JSON)
{"version":3,"sources":["../src/utils/valid-connection.ts","../src/libs/speculate-links.ts","../src/libs/speculator.ts"],"names":["validConnection","connection","valid_connection_default","C","initialised","prefetched","speculationSupport","prefetchSupport","observer","abortController","unobserve","target","removeEventListeners","addEventListeners","element","event","intentEvent","e","triggerAction","parseLinkRel","config","shouldPreload","addSpeculationRules","addLinkPrefetch","href","specScript","item","link","rel","action","trigger","part","props","url","speculationLinks","entries","entry","targetLinks","l","destroy","clearEles","ele","init","speculate_links_default","Speculator","result","timestamp","oldestKey","oldestTimestamp","key","value","sortedStrategies","a","b","strategy","targets","error","prefetch","elements","refreshConfig","cacheKey","cached","promise","elementArray","speculator_default"],"mappings":"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","file":"/Users/williamyallop/Documents/projects/protodigital/internal/lucid-client/packages/speculate/dist/index.cjs","sourcesContent":["/**\n * Determines if the clients connection is appropriate\n */\nconst validConnection = (): boolean => {\n\tif (!navigator.onLine) {\n\t\tconsole.warn(\"The device is offline, speculate library not initialised.\");\n\t\treturn false;\n\t}\n\tif (\"connection\" in navigator) {\n\t\tconst connection = navigator.connection;\n\t\t// @ts-expect-error\n\t\tif (connection?.saveData) {\n\t\t\tconsole.warn(\"Save-Data is enabled, speculate library not initialised.\");\n\t\t\treturn false;\n\t\t}\n\t\t// @ts-expect-error\n\t\tif (/(2|3)g/.test(connection?.effectiveType)) {\n\t\t\tconsole.warn(\n\t\t\t\t\"2G or 3G connection is detected, speculate library not initialised.\",\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n};\n\nexport default validConnection;\n","import type { SpeculationTriggers, SpeculationActions } from \"../types.js\";\nimport validConnection from \"../utils/valid-connection.js\";\n\nconst C: {\n\tmoderateEvents: Array<keyof HTMLElementEventMap>;\n\tfallbackTriggerSupport: Array<SpeculationTriggers>;\n\tfallbackTrigger: SpeculationTriggers;\n\tfallbackAction: SpeculationActions;\n\tvalidActions: SpeculationActions[];\n\tvalidTriggers: SpeculationTriggers[];\n\tgenSpeculate: string;\n} = {\n\tmoderateEvents: [\"mouseenter\", \"touchstart\", \"focus\"],\n\tfallbackTriggerSupport: [\"visible\", \"moderate\"],\n\tfallbackTrigger: \"moderate\",\n\tfallbackAction: \"prefetch\",\n\tvalidActions: [\"prefetch\", \"prerender\"],\n\tvalidTriggers: [\"visible\", \"immediate\", \"eager\", \"moderate\", \"conservative\"],\n\tgenSpeculate: \"gen-speculate\",\n};\n\nlet initialised = false;\nconst prefetched = new Set<string>();\nconst speculationSupport =\n\t\"supports\" in HTMLScriptElement &&\n\tHTMLScriptElement.supports &&\n\tHTMLScriptElement.supports(\"speculationrules\");\nconst prefetchSupport = document\n\t.createElement(\"link\")\n\t.relList?.supports?.(\"prefetch\");\nlet observer: IntersectionObserver;\nlet abortController = new AbortController();\n\n/**\n * Unobserves and deregisters the target anchor element\n */\nconst unobserve = (target: HTMLAnchorElement) => {\n\tobserver.unobserve(target);\n\tremoveEventListeners(target);\n};\n\n/**\n * Handles registering event listeners for the given moderate trigger elements\n */\nconst addEventListeners = (element: HTMLAnchorElement) => {\n\tfor (const event of C.moderateEvents) {\n\t\telement.addEventListener(event, intentEvent, {\n\t\t\tpassive: true,\n\t\t\tsignal: abortController.signal,\n\t\t});\n\t}\n};\n\n/**\n * Handles unregistering event listeners for the given moderate trigger elements\n */\nconst removeEventListeners = (element: HTMLAnchorElement) => {\n\tfor (const event of C.moderateEvents) {\n\t\telement.removeEventListener(event, intentEvent);\n\t}\n};\n\n/**\n * Handles the event for the given intent trigger elements\n */\nconst intentEvent = (e: Event) => {\n\tconst target = e.target as HTMLAnchorElement | null;\n\tif (!target) return;\n\ttriggerAction(target, parseLinkRel(target.rel));\n};\n\nconst triggerAction = (\n\ttarget: HTMLAnchorElement,\n\tconfig: [SpeculationActions, SpeculationTriggers],\n) => {\n\tif (!shouldPreload({ href: target.href, target: target.target })) {\n\t\treturn unobserve(target);\n\t}\n\n\tif (speculationSupport) addSpeculationRules(target.href, config);\n\telse if (prefetchSupport) addLinkPrefetch(target.href);\n\telse fetch(target.href, { priority: \"low\", signal: abortController.signal });\n\n\tprefetched.add(target.href);\n\tunobserve(target);\n};\n\n/**\n * Adds a speculation rule to the document head\n */\nconst addSpeculationRules = (\n\thref: string,\n\tconfig: [SpeculationActions, SpeculationTriggers],\n) => {\n\ttry {\n\t\tconst specScript = document.createElement(\"script\");\n\t\tspecScript.type = \"speculationrules\";\n\t\tspecScript.setAttribute(C.genSpeculate, \"\");\n\t\tconst item = [\n\t\t\t{\n\t\t\t\tsource: \"list\",\n\t\t\t\turls: [href],\n\t\t\t\teagerness: config[1] === \"visible\" ? undefined : config[1],\n\t\t\t},\n\t\t];\n\t\tspecScript.textContent =\n\t\t\tconfig[0] === \"prefetch\"\n\t\t\t\t? JSON.stringify({\n\t\t\t\t\t\tprefetch: item,\n\t\t\t\t\t})\n\t\t\t\t: JSON.stringify({\n\t\t\t\t\t\t// prefetch is used as a fallback when prerender fails\n\t\t\t\t\t\tprerender: item,\n\t\t\t\t\t\tprefetch: item,\n\t\t\t\t\t});\n\t\tdocument.head.appendChild(specScript);\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n};\n\n/**\n * Adds a link prefetch to the document head\n */\nconst addLinkPrefetch = (href: string) => {\n\tconst link = document.createElement(\"link\");\n\tlink.rel = \"prefetch\";\n\tlink.setAttribute(C.genSpeculate, \"\");\n\tlink.href = href;\n\tlink.as = \"document\";\n\tdocument.head.appendChild(link);\n};\n\n/**\n * Parses the link rel attribute and determines the correct action and trigger based on support\n * @param rel The link rel attribute\n * @returns A tuple of the action and trigger\n */\nconst parseLinkRel = (\n\trel: string,\n): [SpeculationActions, SpeculationTriggers] => {\n\tlet action: string | undefined;\n\tlet trigger: string | undefined;\n\n\tfor (const part of rel.split(\" \")) {\n\t\tif (part.startsWith(\"prefetch:\") || part.startsWith(\"prerender:\")) {\n\t\t\t[action, trigger] = part.split(\":\");\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (!action) action = C.fallbackAction;\n\tif (!trigger) trigger = C.fallbackTrigger;\n\n\tif (!speculationSupport) {\n\t\t// prerender defaults to prefetch when speculation rules are not supported\n\t\taction = C.fallbackAction;\n\t\t// fallback to intent, if trigger is not supported\n\t\tif (!C.fallbackTriggerSupport.includes(trigger as SpeculationTriggers))\n\t\t\ttrigger = C.fallbackTrigger;\n\t}\n\n\tif (!C.validActions.includes(action as SpeculationActions))\n\t\taction = C.fallbackAction;\n\tif (!C.validTriggers.includes(trigger as SpeculationTriggers))\n\t\ttrigger = C.fallbackTrigger;\n\n\treturn [action, trigger] as [SpeculationActions, SpeculationTriggers];\n};\n\n/**\n * Determines if the given link should be preloaded\n */\nconst shouldPreload = (props: {\n\thref: string;\n\ttarget: string;\n}): boolean => {\n\ttry {\n\t\tprops.href = props.href.replace(/#.*/, \"\");\n\t\tif (props.target === \"_blank\") return false;\n\t\tif (props.href.includes(\"mailto:\")) return false;\n\t\tif (props.href.includes(\"tel:\")) return false;\n\n\t\tconst url = new URL(props.href);\n\t\tif (url.origin !== window.location.origin) return false;\n\t\tif (url.pathname === window.location.pathname) return false;\n\t\tif (prefetched.has(props.href)) return false;\n\n\t\treturn true;\n\t} catch (_) {\n\t\treturn false;\n\t}\n};\n\n/**\n * Initialises the speculation library\n */\nconst speculationLinks = () => {\n\tif (initialised) return;\n\tinitialised = true;\n\n\tconst valid = validConnection();\n\tif (!valid) return;\n\n\t// setup observer\n\tobserver =\n\t\tobserver ||\n\t\tnew IntersectionObserver((entries) => {\n\t\t\tfor (const entry of entries) {\n\t\t\t\tif (entry.isIntersecting && entry.target instanceof HTMLAnchorElement) {\n\t\t\t\t\tconst target = entry.target;\n\t\t\t\t\tconst [action, trigger] = parseLinkRel(target.rel);\n\n\t\t\t\t\tif (trigger === \"visible\") triggerAction(target, [action, trigger]);\n\t\t\t\t\telse unobserve(target);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t// setup link config, observers and events\n\tconst targetLinks: NodeListOf<HTMLAnchorElement> = document.querySelectorAll(\n\t\t'a[rel*=\"prefetch:\"], a[rel*=\"prerender:\"]',\n\t);\n\n\tfor (const l of targetLinks) {\n\t\tconst [action, trigger] = parseLinkRel(l.rel);\n\n\t\tif (trigger === \"visible\") {\n\t\t\tobserver.observe(l);\n\t\t}\n\t\t// piggyback off moderate trigger for prefetch when speculation rules are not supported\n\t\telse if (trigger === \"moderate\" && !speculationSupport) {\n\t\t\taddEventListeners(l);\n\t\t} else {\n\t\t\ttriggerAction(l, [action, trigger]);\n\t\t}\n\t}\n};\n\n/**\n * Destroys and resets the speculate instance. This will also tidy up any generated speculation rules, prefetch links and cancel any on-going fetches.\n */\nconst destroy = () => {\n\tabortController.abort();\n\tabortController = new AbortController();\n\tobserver?.disconnect();\n\tprefetched.clear();\n\tinitialised = false;\n\n\tconst clearEles = document.querySelectorAll(\n\t\t`link[${C.genSpeculate}], script[${C.genSpeculate}]`,\n\t);\n\tfor (const ele of clearEles) {\n\t\tele.remove();\n\t}\n};\n\n/**\n * Initialises the speculation library using requestIdleCallback if available\n */\nconst init = () => {\n\ttypeof requestIdleCallback !== \"undefined\"\n\t\t? requestIdleCallback(speculationLinks)\n\t\t: setTimeout(speculationLinks, 0);\n\n\treturn destroy;\n};\n\nexport default init;\n","import type {\n\tSpeculatorConfig,\n\tOptimisticPrefetchStrategy,\n\tIntentResponse,\n\tTargetElements,\n} from \"../types.js\";\nimport validConnection from \"../utils/valid-connection.js\";\n\nclass Speculator<T, D> {\n\tprivate cache = new Map<\n\t\tstring,\n\t\t{\n\t\t\ttimestamp: number;\n\t\t\tpromise: IntentResponse<T, D>;\n\t\t}\n\t>();\n\tprivate abortController = new AbortController();\n\tprivate intentDebounce: {\n\t\ttarget: Element;\n\t\ttimeout: ReturnType<typeof setTimeout>;\n\t} | null = null;\n\tconstructor(private config: SpeculatorConfig<T, D>) {\n\t\tthis.registerEvents();\n\t\tthis.handleOptimisticPrefetch();\n\t}\n\t/**\n\t * Registers all required events\n\t */\n\tprivate registerEvents() {\n\t\tfor (const target of this.normaliseTargets(this.config.elements)) {\n\t\t\ttarget.addEventListener(\"mouseover\", this.mouseOverEventHandler, {\n\t\t\t\tsignal: this.abortController.signal,\n\t\t\t});\n\t\t\ttarget.addEventListener(\"click\", this.clickEventHandler, {\n\t\t\t\tsignal: this.abortController.signal,\n\t\t\t});\n\t\t}\n\t}\n\t/**\n\t * The target mouseover event handler\n\t */\n\tprivate mouseOverEventHandler = (e: Event) => {\n\t\tif (!validConnection()) return;\n\t\tconst target = e.target as Element;\n\t\tconst cacheKey = this.getCacheKey(target);\n\t\tif (!cacheKey) return;\n\n\t\tif (this.intentDebounce && this.intentDebounce.target !== target) {\n\t\t\tclearTimeout(this.intentDebounce.timeout);\n\t\t\tthis.intentDebounce = null;\n\t\t}\n\n\t\tif (!this.intentDebounce) {\n\t\t\tthis.intentDebounce = {\n\t\t\t\ttarget,\n\t\t\t\ttimeout: setTimeout(() => {\n\t\t\t\t\tthis.prefetch(target);\n\t\t\t\t\tthis.intentDebounce = null;\n\t\t\t\t}, this.hoverDelay),\n\t\t\t};\n\t\t}\n\t};\n\t/**\n\t * The target click event handler\n\t */\n\tprivate clickEventHandler = async (e: Event) => {\n\t\tconst result = await this.prefetch(e.target as Element);\n\t\tif (this.config.onClick) this.config.onClick(e, result);\n\t};\n\t/**\n\t * Gets a cache key for an element\n\t */\n\tprivate getCacheKey(element: Element): string | null {\n\t\tif (this.config.getCacheKey) {\n\t\t\treturn this.config.getCacheKey(element) ?? null;\n\t\t}\n\t\treturn element.id || null;\n\t}\n\t/**\n\t * Checks if a cached item is stale\n\t */\n\tprivate isStale(timestamp: number): boolean {\n\t\treturn Date.now() - timestamp > this.cacheConfig.staleTime;\n\t}\n\t/**\n\t * Manages the cache size by removing oldest entries when limit is reached\n\t */\n\tprivate manageCacheSize() {\n\t\twhile (this.cache.size >= this.cacheConfig.maxSize) {\n\t\t\tlet oldestKey: string | null = null;\n\t\t\tlet oldestTimestamp = Number.POSITIVE_INFINITY;\n\n\t\t\tfor (const [key, value] of this.cache.entries()) {\n\t\t\t\tif (value.timestamp < oldestTimestamp) {\n\t\t\t\t\toldestTimestamp = value.timestamp;\n\t\t\t\t\toldestKey = key;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (oldestKey) {\n\t\t\t\tthis.cache.delete(oldestKey);\n\t\t\t}\n\t\t}\n\t}\n\t/**\n\t * Handles optimistic prefetching based on configured strategies\n\t */\n\tprivate handleOptimisticPrefetch() {\n\t\tconst sortedStrategies = [...this.optimisticStrategies].sort(\n\t\t\t(a, b) =>\n\t\t\t\t(a.priority ?? Number.POSITIVE_INFINITY) -\n\t\t\t\t(b.priority ?? Number.POSITIVE_INFINITY),\n\t\t);\n\n\t\tfor (const strategy of sortedStrategies) {\n\t\t\tif (strategy.condition && !strategy.condition()) continue;\n\n\t\t\tconst targets = this.normaliseTargets(strategy.elements);\n\t\t\tfor (const target of targets) {\n\t\t\t\tthis.schedulePrefetch(target);\n\t\t\t}\n\t\t}\n\t}\n\t/**\n\t * Wraps the fetch callback to ensure consistent error handling\n\t */\n\tprivate async executeFetchCallback(element: Element) {\n\t\ttry {\n\t\t\treturn await this.config.fetch(element);\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\terror: {\n\t\t\t\t\tmessage:\n\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t\t: \"An unknown error was caught while executing the fetch callback.\",\n\t\t\t\t\texception: error,\n\t\t\t\t},\n\t\t\t\tdata: undefined,\n\t\t\t};\n\t\t}\n\t}\n\t/**\n\t * Scheduels the prefetch for when idle\n\t */\n\tprivate schedulePrefetch(element: Element) {\n\t\tconst prefetch = () => this.prefetch(element);\n\n\t\ttypeof requestIdleCallback !== \"undefined\"\n\t\t\t? requestIdleCallback(prefetch)\n\t\t\t: setTimeout(prefetch, 0);\n\t}\n\t/**\n\t * Normalises a TargetElements value\n\t */\n\tprivate normaliseTargets(elements?: TargetElements) {\n\t\tif (!elements) {\n\t\t\treturn [];\n\t\t}\n\t\tif (elements instanceof NodeList) {\n\t\t\treturn Array.from(elements);\n\t\t}\n\t\tif (Array.isArray(elements)) return elements;\n\t\treturn [elements];\n\t}\n\t/**\n\t * Cache config w/ defaults\n\t */\n\tprivate get cacheConfig() {\n\t\treturn {\n\t\t\tmaxSize: this.config.cache?.maxSize ?? 5,\n\t\t\tstaleTime: this.config.cache?.staleTime ?? 120000,\n\t\t};\n\t}\n\t/**\n\t * Normalises optimistic strategies\n\t */\n\tprivate get optimisticStrategies(): OptimisticPrefetchStrategy[] {\n\t\tif (!this.config.optimistic) {\n\t\t\treturn [];\n\t\t}\n\t\treturn Array.isArray(this.config.optimistic)\n\t\t\t? this.config.optimistic\n\t\t\t: [this.config.optimistic];\n\t}\n\t/**\n\t * Hover delay w/ config\n\t */\n\tprivate get hoverDelay() {\n\t\treturn this.config.hoverDelay ?? 100;\n\t}\n\n\t// ----------------\n\t// Public API\n\n\t/**\n\t * Destroys and resets the Speculator instance\n\t */\n\tpublic destroy() {\n\t\tthis.abortController.abort();\n\t\tthis.clearCache();\n\t\tif (this.intentDebounce) {\n\t\t\tclearTimeout(this.intentDebounce.timeout);\n\t\t\tthis.intentDebounce = null;\n\t\t}\n\t}\n\t/**\n\t * Refreshes the Speculator instance\n\t */\n\tpublic refresh(\n\t\trefreshConfig?: Partial<\n\t\t\tPick<SpeculatorConfig<T, D>, \"elements\" | \"optimistic\">\n\t\t>,\n\t) {\n\t\tif (refreshConfig) {\n\t\t\tthis.config = {\n\t\t\t\t...this.config,\n\t\t\t\t...(refreshConfig.elements && { elements: refreshConfig.elements }),\n\t\t\t\t...(refreshConfig.optimistic && {\n\t\t\t\t\toptimistic: refreshConfig.optimistic,\n\t\t\t\t}),\n\t\t\t};\n\t\t}\n\n\t\tthis.destroy();\n\t\tthis.abortController = new AbortController();\n\t\tthis.registerEvents();\n\t\tthis.handleOptimisticPrefetch();\n\t}\n\t/**\n\t * Prefetch fetch callback for a given element.\n\t */\n\tpublic async prefetch(element: Element) {\n\t\tconst cacheKey = this.getCacheKey(element);\n\n\t\t//* return cache if it exists and not stale\n\t\tif (cacheKey) {\n\t\t\tconst cached = this.cache.get(cacheKey);\n\t\t\tif (cached && !this.isStale(cached.timestamp)) {\n\t\t\t\treturn cached.promise;\n\t\t\t}\n\t\t}\n\n\t\tconst promise = this.executeFetchCallback(element);\n\n\t\t//* cache and manage cache size\n\t\tif (cacheKey) {\n\t\t\tthis.manageCacheSize();\n\t\t\tthis.cache.set(cacheKey, {\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tpromise,\n\t\t\t});\n\t\t}\n\n\t\treturn promise;\n\t}\n\t/**\n\t * Prefetch multiple elements at once\n\t */\n\tpublic async prefetchAll(elements: Element[] | NodeListOf<Element>) {\n\t\tconst elementArray = Array.from(elements);\n\t\treturn Promise.all(elementArray.map((element) => this.prefetch(element)));\n\t}\n\t/**\n\t * Clears a cache entry. If no element is provided, clears entire cache\n\t */\n\tpublic clearCache(element?: Element): void {\n\t\tif (!element) {\n\t\t\tthis.cache.clear();\n\t\t\treturn;\n\t\t}\n\n\t\tconst cacheKey = this.getCacheKey(element);\n\t\tif (cacheKey) this.cache.delete(cacheKey);\n\t}\n}\n\nexport default Speculator;\n"]}