specnav-next 0.2.0
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/CHANGELOG.md +38 -0
- package/dist/index.cjs +552 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +75 -0
- package/dist/index.d.ts +75 -0
- package/dist/index.js +547 -0
- package/dist/index.js.map +1 -0
- package/dist/server.cjs +20 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +5 -0
- package/dist/server.d.ts +5 -0
- package/dist/server.js +14 -0
- package/dist/server.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/prefetch.ts","../src/NavigateProvider.tsx","../src/Link.tsx","../src/useNavigate.ts","../src/useNavigationState.ts"],"names":["prefetchPage","useRef","useEffect","jsx","useState"],"mappings":"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","file":"index.js","sourcesContent":["// Shared prefetch logic and request deduplication\n\nexport const inflightRequests = new Map<string, Promise<string>>();\n\nexport async function prefetchPage(\n href: string,\n cache: any,\n speculator: any\n): Promise<void> {\n if (inflightRequests.has(href)) {\n await inflightRequests.get(href);\n return;\n }\n\n const controller = new AbortController();\n const fetchPromise = fetch(href, {\n headers: { \"x-specnav\": \"1\" },\n signal: controller.signal,\n })\n .then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.text();\n })\n .then((html) => {\n if (cache) cache.set(href, html);\n if (speculator) speculator.speculate(href, html);\n return html;\n })\n .finally(() => {\n inflightRequests.delete(href);\n });\n\n inflightRequests.set(href, fetchPromise);\n await fetchPromise;\n}\n","\"use client\";\n\nimport { createContext, useContext, useEffect, useState, useRef } from \"react\";\nimport {\n createTrajectoryEngine,\n createCacheManager,\n createMorpher,\n createSpeculativeRenderer,\n createNavigationGraphLearner,\n createAdaptiveMode,\n type TrajectoryEngine,\n type CacheManager,\n type DOMmorpher,\n type SpeculativeRenderer,\n type NavigationGraphLearner,\n type AdaptiveMode,\n} from \"specnav-core\";\nimport type { NavigateProviderProps } from \"./types\";\n\ninterface NavigationContextValue {\n trajectory: TrajectoryEngine | null;\n cache: CacheManager | null;\n morpher: DOMmorpher | null;\n speculator: SpeculativeRenderer | null;\n graph: NavigationGraphLearner | null;\n adaptive: AdaptiveMode | null;\n isNavigating: boolean;\n pendingHref: string | null;\n progress: number;\n cacheHits: number;\n cacheMisses: number;\n setNavigating: (href: string | null) => void;\n setProgress: (progress: number) => void;\n incrementCacheMiss: () => void;\n}\n\nconst NavigationContext = createContext<NavigationContextValue | null>(null);\n\nexport function useNavigationContext() {\n const ctx = useContext(NavigationContext);\n if (!ctx) throw new Error(\"useNavigationContext must be used within NavigateProvider\");\n return ctx;\n}\n\nexport function NavigateProvider({\n children,\n strategy = \"auto\",\n cache: cacheConfig,\n prefetch: prefetchConfig,\n progress: progressConfig,\n morph: morphConfig,\n graph: graphConfig,\n onNavigateStart,\n onNavigateEnd,\n onCacheHit,\n}: NavigateProviderProps) {\n const [isNavigating, setIsNavigating] = useState(false);\n const [pendingHref, setPendingHref] = useState<string | null>(null);\n const [progress, setProgress] = useState(0);\n const [cacheHits, setCacheHits] = useState(0);\n const [cacheMisses, setCacheMisses] = useState(0);\n const navigationStartTime = useRef<number | null>(null);\n\n const [trajectory, setTrajectory] = useState<TrajectoryEngine | null>(null);\n const [cache, setCache] = useState<CacheManager | null>(null);\n const [morpher, setMorpher] = useState<DOMmorpher | null>(null);\n const [speculator, setSpeculator] = useState<SpeculativeRenderer | null>(null);\n const [graph, setGraph] = useState<NavigationGraphLearner | null>(null);\n const [adaptive, setAdaptive] = useState<AdaptiveMode | null>(null);\n\n const wrappedSetNavigating = (href: string | null) => {\n if (href) {\n navigationStartTime.current = Date.now();\n onNavigateStart?.(href);\n } else if (navigationStartTime.current) {\n const duration = Date.now() - navigationStartTime.current;\n if (pendingHref) {\n onNavigateEnd?.(pendingHref, duration);\n }\n navigationStartTime.current = null;\n }\n setIsNavigating(!!href);\n setPendingHref(href);\n };\n\n useEffect(() => {\n // Initialize engines\n const adaptiveEngine = createAdaptiveMode();\n \n const cacheEngine = createCacheManager(cacheConfig, {\n onCacheHit: (href, layer) => {\n setCacheHits(prev => prev + 1);\n onCacheHit?.(href, layer);\n },\n });\n\n const morpherEngine = createMorpher(morphConfig);\n const speculatorEngine = createSpeculativeRenderer(3);\n const graphEngine = createNavigationGraphLearner(graphConfig);\n\n // Wait for adaptive to initialize before setting state\n adaptiveEngine.waitForInit().then(() => {\n setAdaptive(adaptiveEngine);\n setCache(cacheEngine);\n setMorpher(morpherEngine);\n setSpeculator(speculatorEngine);\n setGraph(graphEngine);\n\n const effectiveStrategy = adaptiveEngine.getStrategy(strategy);\n\n if (effectiveStrategy !== \"off\" && prefetchConfig?.mode === \"trajectory\") {\n const trajectoryEngine = createTrajectoryEngine(prefetchConfig.trajectory, {\n onPrediction: async (href: string) => {\n if (!adaptiveEngine?.shouldPrefetch()) return;\n const { prefetchPage } = await import(\"./prefetch\");\n await prefetchPage(href, cacheEngine, speculatorEngine);\n },\n onCancel: (href) => {\n speculatorEngine?.cancel(href);\n },\n });\n\n trajectoryEngine.start();\n setTrajectory(trajectoryEngine);\n }\n });\n\n // Handle browser back/forward\n const handlePopState = async (e: PopStateEvent) => {\n if (!e.state?.specnav) return;\n\n const href = window.location.pathname;\n wrappedSetNavigating(href);\n setProgress(0.3);\n\n try {\n // Try cache first (should be instant)\n const html = await cache?.get(href);\n \n if (html && morpher) {\n setProgress(0.7);\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n const newContent = doc.body;\n\n morpher.morph(document.body, newContent);\n setProgress(1);\n setTimeout(() => wrappedSetNavigating(null), 100);\n } else {\n // Fallback to full reload\n window.location.reload();\n }\n } catch (error) {\n console.error(\"Popstate navigation failed:\", error);\n window.location.reload();\n }\n };\n\n window.addEventListener(\"popstate\", handlePopState);\n\n return () => {\n trajectory?.stop();\n cache?.destroy();\n speculator?.cancelAll();\n window.removeEventListener(\"popstate\", handlePopState);\n };\n }, [strategy, cacheConfig, prefetchConfig, morphConfig, graphConfig, onCacheHit, onNavigateEnd]);\n\n const value: NavigationContextValue = {\n trajectory,\n cache,\n morpher,\n speculator,\n graph,\n adaptive,\n isNavigating,\n pendingHref,\n progress,\n cacheHits,\n cacheMisses,\n setNavigating: wrappedSetNavigating,\n setProgress,\n incrementCacheMiss: () => setCacheMisses(prev => prev + 1),\n };\n\n return (\n <NavigationContext.Provider value={value}>\n {progressConfig?.enabled !== false && (\n <ProgressBar config={progressConfig} progress={progress} isNavigating={isNavigating} />\n )}\n {children}\n </NavigationContext.Provider>\n );\n}\n\nfunction ProgressBar({\n config,\n progress,\n isNavigating,\n}: {\n config: any;\n progress: number;\n isNavigating: boolean;\n}) {\n const color = config?.color ?? \"#6366f1\";\n const height = config?.height ?? 3;\n const position = config?.position ?? \"top\";\n\n return (\n <div\n style={{\n position: \"fixed\",\n [position]: 0,\n left: 0,\n right: 0,\n height: `${height}px`,\n zIndex: 9999,\n pointerEvents: \"none\",\n }}\n >\n <div\n style={{\n height: \"100%\",\n width: `${progress * 100}%`,\n background: color,\n transition: isNavigating ? \"width 200ms ease\" : \"opacity 200ms ease\",\n opacity: isNavigating ? 1 : 0,\n }}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useRef } from \"react\";\nimport { useNavigationContext } from \"./NavigateProvider\";\nimport type { LinkProps } from \"./types\";\nimport { inflightRequests } from \"./prefetch\";\n\nexport function Link({\n href,\n prefetch = \"trajectory\",\n morph = true,\n cache = true,\n replace = false,\n scroll = true,\n children,\n ...props\n}: LinkProps) {\n const ctx = useNavigationContext();\n const linkRef = useRef<HTMLAnchorElement>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // Validate URL is same-origin for security\n const isSafeUrl = (url: string): boolean => {\n try {\n const parsed = new URL(url, window.location.origin);\n return parsed.origin === window.location.origin;\n } catch {\n return false;\n }\n };\n\n useEffect(() => {\n if (!linkRef.current || !ctx.trajectory || prefetch === false) return;\n\n const element = linkRef.current;\n ctx.trajectory.registerLink(href, element);\n\n return () => {\n ctx.trajectory?.unregisterLink(element);\n abortControllerRef.current?.abort();\n };\n }, [href, ctx.trajectory, prefetch]);\n\n // Hover prefetch\n const handleMouseEnter = async () => {\n if (prefetch === \"hover\" && ctx.adaptive?.shouldPrefetch()) {\n await prefetchPage(href);\n }\n };\n\n const handleMouseLeave = () => {\n // Cleanup if needed\n };\n\n // Focus prefetch (keyboard navigation)\n const handleFocus = async () => {\n if (ctx.adaptive?.shouldPrefetch()) {\n await prefetchPage(href);\n }\n };\n\n const prefetchPage = async (url: string): Promise<void> => {\n if (!isSafeUrl(url) || !ctx.cache) return;\n\n // Check if already cached\n const cached = await ctx.cache.get(url);\n if (cached) return;\n\n // Check if already in-flight\n if (inflightRequests.has(url)) {\n await inflightRequests.get(url);\n return;\n }\n\n // Start new request\n abortControllerRef.current = new AbortController();\n const fetchPromise = fetch(url, {\n headers: { \"x-specnav\": \"1\" },\n signal: abortControllerRef.current.signal,\n })\n .then((res) => res.text())\n .then((html) => {\n ctx.cache?.set(url, html);\n // Speculative render if enabled\n if (ctx.speculator && ctx.adaptive?.shouldSpeculate()) {\n ctx.speculator.speculate(url, html);\n }\n return html;\n })\n .catch((err) => {\n if (err.name !== \"AbortError\") {\n console.warn(\"Prefetch failed:\", err);\n }\n throw err;\n })\n .finally(() => {\n inflightRequests.delete(url);\n });\n\n inflightRequests.set(url, fetchPromise);\n await fetchPromise;\n };\n\n const handleClick = async (e: React.MouseEvent<HTMLAnchorElement>) => {\n // Allow default behavior for modified clicks\n if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;\n \n e.preventDefault();\n\n if (!isSafeUrl(href)) {\n window.location.href = href;\n return;\n }\n\n if (!morph || !ctx.morpher || !ctx.cache) {\n window.location.href = href;\n return;\n }\n\n ctx.setNavigating(href);\n ctx.setProgress(0.3);\n\n // Timeout to prevent infinite hangs\n const timeoutId = setTimeout(() => {\n console.error(\"Navigation timeout\");\n ctx.setNavigating(null);\n window.location.href = href;\n }, 10000); // 10 second timeout\n\n try {\n // Check speculative render first\n let newContent = ctx.speculator?.get(href);\n \n if (!newContent) {\n // Check cache\n let html = cache ? await ctx.cache.get(href) : null;\n\n if (!html) {\n ctx.incrementCacheMiss();\n ctx.setProgress(0.5);\n // Deduplicate requests\n if (inflightRequests.has(href)) {\n html = await inflightRequests.get(href)!;\n } else {\n const controller = new AbortController();\n const fetchPromise = fetch(href, {\n headers: { \"x-specnav\": \"1\" },\n signal: controller.signal,\n }).then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.text();\n });\n \n inflightRequests.set(href, fetchPromise);\n html = await fetchPromise;\n inflightRequests.delete(href);\n }\n\n if (cache) {\n await ctx.cache.set(href, html);\n }\n }\n\n ctx.setProgress(0.7);\n\n // Parse HTML\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n newContent = doc.body;\n }\n\n ctx.setProgress(0.9);\n\n // Morph DOM with optional View Transitions\n if (\n \"startViewTransition\" in document &&\n ctx.adaptive?.shouldUseTransitions()\n ) {\n await (document as any).startViewTransition(() => {\n ctx.morpher?.morph(document.body, newContent!);\n }).finished;\n } else {\n ctx.morpher?.morph(document.body, newContent);\n }\n\n // Record navigation in graph (capture before URL change)\n const currentHref = window.location.pathname;\n\n // Update URL\n if (replace) {\n window.history.replaceState({ specnav: true }, \"\", href);\n } else {\n window.history.pushState({ specnav: true }, \"\", href);\n }\n\n ctx.graph?.recordNavigation(currentHref, href);\n\n // Scroll to top if requested\n if (scroll) {\n window.scrollTo(0, 0);\n }\n\n clearTimeout(timeoutId);\n ctx.setProgress(1);\n setTimeout(() => ctx.setNavigating(null), 200);\n } catch (error) {\n clearTimeout(timeoutId);\n console.error(\"Navigation failed:\", error);\n ctx.setNavigating(null);\n window.location.href = href;\n }\n };\n\n return (\n <a\n ref={linkRef}\n href={href}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onFocus={handleFocus}\n {...props}\n >\n {children}\n </a>\n );\n}\n","\"use client\";\n\nimport { useNavigationContext } from \"./NavigateProvider\";\nimport type { UseNavigateReturn, NavigateOptions } from \"./types\";\nimport { inflightRequests } from \"./prefetch\";\n\nexport function useNavigate(): UseNavigateReturn {\n const ctx = useNavigationContext();\n\n const isSafeUrl = (url: string): boolean => {\n try {\n const parsed = new URL(url, window.location.origin);\n return parsed.origin === window.location.origin;\n } catch {\n return false;\n }\n };\n\n const navigate = async (href: string, options: NavigateOptions = {}) => {\n const {\n replace = false,\n scroll = true,\n morph = true,\n cache: useCache = true,\n } = options;\n\n if (!isSafeUrl(href)) {\n window.location.href = href;\n return;\n }\n\n if (!morph || !ctx.morpher || !ctx.cache) {\n window.location.href = href;\n return;\n }\n\n ctx.setNavigating(href);\n ctx.setProgress(0.3);\n\n try {\n // Check speculative render first\n let newContent = ctx.speculator?.get(href);\n\n if (!newContent) {\n let html = useCache ? await ctx.cache.get(href) : null;\n\n if (!html) {\n ctx.setProgress(0.5);\n \n // Deduplicate requests\n if (inflightRequests.has(href)) {\n html = await inflightRequests.get(href)!;\n } else {\n const controller = new AbortController();\n const fetchPromise = fetch(href, {\n headers: { \"x-specnav\": \"1\" },\n signal: controller.signal,\n }).then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.text();\n });\n\n inflightRequests.set(href, fetchPromise);\n html = await fetchPromise;\n inflightRequests.delete(href);\n }\n\n if (useCache) {\n await ctx.cache.set(href, html);\n }\n }\n\n ctx.setProgress(0.7);\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n newContent = doc.body;\n }\n\n ctx.setProgress(0.9);\n\n if (\n \"startViewTransition\" in document &&\n ctx.adaptive?.shouldUseTransitions()\n ) {\n await (document as any).startViewTransition(() => {\n ctx.morpher?.morph(document.body, newContent!);\n }).finished;\n } else {\n ctx.morpher?.morph(document.body, newContent);\n }\n\n const currentHref = window.location.pathname;\n\n if (replace) {\n window.history.replaceState({ specnav: true }, \"\", href);\n } else {\n window.history.pushState({ specnav: true }, \"\", href);\n }\n\n ctx.graph?.recordNavigation(currentHref, href);\n\n if (scroll) {\n window.scrollTo(0, 0);\n }\n\n ctx.setProgress(1);\n setTimeout(() => ctx.setNavigating(null), 200);\n } catch (error) {\n console.error(\"Navigation failed:\", error);\n ctx.setNavigating(null);\n window.location.href = href;\n }\n };\n\n const back = () => {\n window.history.back();\n };\n\n const forward = () => {\n window.history.forward();\n };\n\n const prefetch = async (href: string) => {\n if (!ctx.cache || !isSafeUrl(href)) return;\n\n try {\n // Check if already in-flight\n if (inflightRequests.has(href)) {\n await inflightRequests.get(href);\n return;\n }\n\n const controller = new AbortController();\n const fetchPromise = fetch(href, {\n headers: { \"x-specnav\": \"1\" },\n signal: controller.signal,\n })\n .then((res) => res.text())\n .then((html) => {\n ctx.cache?.set(href, html);\n // Speculative render if enabled\n if (ctx.speculator && ctx.adaptive?.shouldSpeculate()) {\n ctx.speculator.speculate(href, html);\n }\n return html;\n })\n .finally(() => {\n inflightRequests.delete(href);\n });\n\n inflightRequests.set(href, fetchPromise);\n await fetchPromise;\n } catch (error) {\n if ((error as Error).name !== \"AbortError\") {\n console.warn(\"Prefetch failed:\", error);\n }\n }\n };\n\n const clearCache = (href?: string) => {\n ctx.cache?.clear(href);\n if (href) {\n ctx.speculator?.cancel(href);\n } else {\n ctx.speculator?.cancelAll();\n }\n };\n\n return {\n navigate,\n back,\n forward,\n prefetch,\n clearCache,\n isNavigating: ctx.isNavigating,\n pendingHref: ctx.pendingHref,\n };\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useNavigationContext } from \"./NavigateProvider\";\nimport type { UseNavigationStateReturn } from \"./types\";\n\nexport function useNavigationState(): UseNavigationStateReturn {\n const ctx = useNavigationContext();\n const [previousHref, setPreviousHref] = useState<string | null>(null);\n const [lastNavigationMs, setLastNavigationMs] = useState(0);\n const [startTime, setStartTime] = useState<number | null>(null);\n\n // Track navigation start\n useEffect(() => {\n if (ctx.isNavigating && ctx.pendingHref) {\n setPreviousHref(window.location.pathname);\n setStartTime(Date.now());\n }\n }, [ctx.isNavigating, ctx.pendingHref]);\n\n // Track navigation end (event-driven)\n useEffect(() => {\n if (!ctx.isNavigating && startTime !== null) {\n setLastNavigationMs(Date.now() - startTime);\n setStartTime(null);\n }\n }, [ctx.isNavigating, startTime]);\n\n const cacheSize = ctx.cache?.getSize() ?? 0;\n const totalRequests = ctx.cacheHits + ctx.cacheMisses;\n const cacheHitRate = totalRequests > 0 ? ctx.cacheHits / totalRequests : 0;\n\n return {\n isNavigating: ctx.isNavigating,\n pendingHref: ctx.pendingHref,\n previousHref,\n cacheSize,\n cacheHitRate,\n lastNavigationMs,\n progress: ctx.progress,\n };\n}\n"]}
|
package/dist/server.cjs
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
|
|
5
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
8
|
+
|
|
9
|
+
function prefetchHint(hrefs) {
|
|
10
|
+
const hrefArray = Array.isArray(hrefs) ? hrefs : [hrefs];
|
|
11
|
+
return React__default.default.createElement("meta", {
|
|
12
|
+
name: "specnav-prefetch",
|
|
13
|
+
content: JSON.stringify(hrefArray),
|
|
14
|
+
"data-specnav-hint": "true"
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
exports.prefetchHint = prefetchHint;
|
|
19
|
+
//# sourceMappingURL=server.cjs.map
|
|
20
|
+
//# sourceMappingURL=server.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server.ts"],"names":["React"],"mappings":";;;;;;;;AAEO,SAAS,aAAa,KAAA,EAA8C;AACzE,EAAA,MAAM,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AAEvD,EAAA,OAAOA,sBAAA,CAAM,cAAc,MAAA,EAAQ;AAAA,IACjC,IAAA,EAAM,kBAAA;AAAA,IACN,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAAA,IACjC,mBAAA,EAAqB;AAAA,GACtB,CAAA;AACH","file":"server.cjs","sourcesContent":["import React from \"react\";\n\nexport function prefetchHint(hrefs: string | string[]): React.ReactElement {\n const hrefArray = Array.isArray(hrefs) ? hrefs : [hrefs];\n\n return React.createElement(\"meta\", {\n name: \"specnav-prefetch\",\n content: JSON.stringify(hrefArray),\n \"data-specnav-hint\": \"true\",\n });\n}\n"]}
|
package/dist/server.d.ts
ADDED
package/dist/server.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
function prefetchHint(hrefs) {
|
|
4
|
+
const hrefArray = Array.isArray(hrefs) ? hrefs : [hrefs];
|
|
5
|
+
return React.createElement("meta", {
|
|
6
|
+
name: "specnav-prefetch",
|
|
7
|
+
content: JSON.stringify(hrefArray),
|
|
8
|
+
"data-specnav-hint": "true"
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export { prefetchHint };
|
|
13
|
+
//# sourceMappingURL=server.js.map
|
|
14
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server.ts"],"names":[],"mappings":";;AAEO,SAAS,aAAa,KAAA,EAA8C;AACzE,EAAA,MAAM,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AAEvD,EAAA,OAAO,KAAA,CAAM,cAAc,MAAA,EAAQ;AAAA,IACjC,IAAA,EAAM,kBAAA;AAAA,IACN,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAAA,IACjC,mBAAA,EAAqB;AAAA,GACtB,CAAA;AACH","file":"server.js","sourcesContent":["import React from \"react\";\n\nexport function prefetchHint(hrefs: string | string[]): React.ReactElement {\n const hrefArray = Array.isArray(hrefs) ? hrefs : [hrefs];\n\n return React.createElement(\"meta\", {\n name: \"specnav-prefetch\",\n content: JSON.stringify(hrefArray),\n \"data-specnav-hint\": \"true\",\n });\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "specnav-next",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Next.js adapter for specnav — drop-in replacement for next/link with 0-16ms perceived navigation latency",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Abraham",
|
|
7
|
+
"homepage": "https://github.com/Robini908/specnav#readme",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/Robini908/specnav.git",
|
|
11
|
+
"directory": "packages/next"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/Robini908/specnav/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"nextjs",
|
|
18
|
+
"next.js",
|
|
19
|
+
"navigation",
|
|
20
|
+
"prefetch",
|
|
21
|
+
"react",
|
|
22
|
+
"app-router",
|
|
23
|
+
"performance",
|
|
24
|
+
"speculative"
|
|
25
|
+
],
|
|
26
|
+
"type": "module",
|
|
27
|
+
"sideEffects": false,
|
|
28
|
+
"main": "./dist/index.js",
|
|
29
|
+
"module": "./dist/index.mjs",
|
|
30
|
+
"types": "./dist/index.d.ts",
|
|
31
|
+
"exports": {
|
|
32
|
+
".": {
|
|
33
|
+
"types": "./dist/index.d.ts",
|
|
34
|
+
"import": "./dist/index.mjs",
|
|
35
|
+
"require": "./dist/index.js"
|
|
36
|
+
},
|
|
37
|
+
"./server": {
|
|
38
|
+
"types": "./dist/server.d.ts",
|
|
39
|
+
"import": "./dist/server.mjs",
|
|
40
|
+
"require": "./dist/server.js"
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"files": [
|
|
44
|
+
"dist",
|
|
45
|
+
"README.md",
|
|
46
|
+
"LICENSE",
|
|
47
|
+
"CHANGELOG.md"
|
|
48
|
+
],
|
|
49
|
+
"scripts": {
|
|
50
|
+
"build": "tsup",
|
|
51
|
+
"dev": "tsup --watch",
|
|
52
|
+
"test": "vitest run",
|
|
53
|
+
"test:watch": "vitest",
|
|
54
|
+
"typecheck": "tsc --noEmit"
|
|
55
|
+
},
|
|
56
|
+
"peerDependencies": {
|
|
57
|
+
"next": ">=14.0.0",
|
|
58
|
+
"react": ">=18.0.0",
|
|
59
|
+
"react-dom": ">=18.0.0"
|
|
60
|
+
},
|
|
61
|
+
"dependencies": {
|
|
62
|
+
"specnav-core": "workspace:*"
|
|
63
|
+
},
|
|
64
|
+
"devDependencies": {
|
|
65
|
+
"@types/node": "^22.0.0",
|
|
66
|
+
"@types/react": "^18.3.0",
|
|
67
|
+
"@types/react-dom": "^18.3.0",
|
|
68
|
+
"next": "^15.0.0",
|
|
69
|
+
"react": "^18.3.0",
|
|
70
|
+
"react-dom": "^18.3.0",
|
|
71
|
+
"tsup": "^8.0.2",
|
|
72
|
+
"typescript": "^5.8.0",
|
|
73
|
+
"vitest": "^2.0.0"
|
|
74
|
+
},
|
|
75
|
+
"engines": {
|
|
76
|
+
"node": ">=18.0.0"
|
|
77
|
+
},
|
|
78
|
+
"publishConfig": {
|
|
79
|
+
"access": "public",
|
|
80
|
+
"registry": "https://registry.npmjs.org"
|
|
81
|
+
}
|
|
82
|
+
}
|