diff --git a/packages/next/client/experimental-script.tsx b/packages/next/client/experimental-script.tsx index 77e914f331bc7..d5b645a58a571 100644 --- a/packages/next/client/experimental-script.tsx +++ b/packages/next/client/experimental-script.tsx @@ -16,7 +16,7 @@ interface Props extends ScriptHTMLAttributes { preload?: boolean } -const loadScript = (props: Props) => { +const loadScript = (props: Props): void => { const { src = '', onLoad = () => {}, @@ -83,7 +83,7 @@ const loadScript = (props: Props) => { document.body.appendChild(el) } -export default function Script(props: Props) { +export default function Script(props: Props): JSX.Element | null { const { src = '', onLoad = () => {}, diff --git a/packages/next/client/head-manager.ts b/packages/next/client/head-manager.ts index 4ea0ef9597149..9e2da8f6007d1 100644 --- a/packages/next/client/head-manager.ts +++ b/packages/next/client/head-manager.ts @@ -40,7 +40,7 @@ function reactElementToDOM({ type, props }: JSX.Element): HTMLElement { return el } -function updateElements(type: string, components: JSX.Element[]) { +function updateElements(type: string, components: JSX.Element[]): void { const headEl = document.getElementsByTagName('head')[0] const headCountEl: HTMLMetaElement = headEl.querySelector( 'meta[name=next-head-count]' @@ -84,7 +84,10 @@ function updateElements(type: string, components: JSX.Element[]) { headCountEl.content = (headCount - oldTags.length + newTags.length).toString() } -export default function initHeadManager() { +export default function initHeadManager(): { + mountedInstances: Set + updateHead: (head: JSX.Element[]) => void +} { let updatePromise: Promise | null = null return { diff --git a/packages/next/client/link.tsx b/packages/next/client/link.tsx index 0ea989d872b7b..7a89a7e4843c8 100644 --- a/packages/next/client/link.tsx +++ b/packages/next/client/link.tsx @@ -62,7 +62,7 @@ function prefetch( prefetched[href + '%' + as + (curLocale ? '%' + curLocale : '')] = true } -function isModifiedEvent(event: React.MouseEvent) { +function isModifiedEvent(event: React.MouseEvent): boolean { const { target } = event.currentTarget as HTMLAnchorElement return ( (target && target !== '_self') || diff --git a/packages/next/client/page-loader.ts b/packages/next/client/page-loader.ts index 01d1350a0644e..b95c0e7e331c2 100644 --- a/packages/next/client/page-loader.ts +++ b/packages/next/client/page-loader.ts @@ -13,7 +13,7 @@ import createRouteLoader, { RouteLoader, } from './route-loader' -function normalizeRoute(route: string) { +function normalizeRoute(route: string): string { if (route[0] !== '/') { throw new Error(`Route name should start with a "/", got "${route}"`) } @@ -83,13 +83,14 @@ export default class PageLoader { /** * @param {string} href the route href (file-system path) * @param {string} asPath the URL as shown in browser (virtual path); used for dynamic routes + * @returns {string} */ getDataHref( href: string, asPath: string, ssg: boolean, locale?: string | false - ) { + ): string { const { pathname: hrefPathname, query, search } = parseRelativeUrl(href) const { pathname: asPathname } = parseRelativeUrl(asPath) const route = normalizeRoute(hrefPathname) diff --git a/packages/next/client/performance-relayer.ts b/packages/next/client/performance-relayer.ts index 83ff892f58f3b..ecd25791f0e71 100644 --- a/packages/next/client/performance-relayer.ts +++ b/packages/next/client/performance-relayer.ts @@ -12,7 +12,7 @@ const initialHref = location.href let isRegistered = false let userReportHandler: ReportHandler | undefined -function onReport(metric: Metric) { +function onReport(metric: Metric): void { if (userReportHandler) { userReportHandler(metric) } @@ -57,7 +57,7 @@ function onReport(metric: Metric) { } } -export default (onPerfEntry?: ReportHandler) => { +export default (onPerfEntry?: ReportHandler): void => { // Update function if it changes: userReportHandler = onPerfEntry diff --git a/packages/next/client/request-idle-callback.ts b/packages/next/client/request-idle-callback.ts index cea89be0ddabc..46127657673a3 100644 --- a/packages/next/client/request-idle-callback.ts +++ b/packages/next/client/request-idle-callback.ts @@ -18,7 +18,9 @@ declare global { const requestIdleCallback = (typeof self !== 'undefined' && self.requestIdleCallback) || - function (cb: (deadline: RequestIdleCallbackDeadline) => void) { + function ( + cb: (deadline: RequestIdleCallbackDeadline) => void + ): NodeJS.Timeout { let start = Date.now() return setTimeout(function () { cb({ diff --git a/packages/next/client/route-loader.ts b/packages/next/client/route-loader.ts index ce3073a5a348c..ba6023cf7047f 100644 --- a/packages/next/client/route-loader.ts +++ b/packages/next/client/route-loader.ts @@ -55,7 +55,7 @@ function withFuture( return Promise.resolve(entry) } let resolver: (entrypoint: T) => void - const prom = new Promise((resolve) => { + const prom: Promise = new Promise((resolve) => { resolver = resolve }) map.set(key, (entry = { resolve: resolver!, future: prom })) @@ -120,7 +120,7 @@ export function markAssetError(err: Error): Error { return Object.defineProperty(err, ASSET_LOAD_ERROR, {}) } -export function isAssetError(err?: Error) { +export function isAssetError(err?: Error): boolean | undefined { return err && ASSET_LOAD_ERROR in err } @@ -166,7 +166,9 @@ export function getClientBuildManifest(): Promise { return Promise.resolve(self.__BUILD_MANIFEST) } - const onBuildManifest = new Promise((resolve) => { + const onBuildManifest: Promise = new Promise< + ClientBuildManifest + >((resolve) => { // Mandatory because this is not concurrent safe: const cb = self.__BUILD_MANIFEST_CB self.__BUILD_MANIFEST_CB = () => { @@ -229,7 +231,7 @@ function createRouteLoader(assetPrefix: string): RouteLoader { > = new Map() function maybeExecuteScript(src: string): Promise { - let prom = loadedScripts.get(src) + let prom: Promise | undefined = loadedScripts.get(src) if (prom) { return prom } @@ -244,7 +246,7 @@ function createRouteLoader(assetPrefix: string): RouteLoader { } function fetchStyleSheet(href: string): Promise { - let prom = styleSheets.get(href) + let prom: Promise | undefined = styleSheets.get(href) if (prom) { return prom } @@ -269,7 +271,7 @@ function createRouteLoader(assetPrefix: string): RouteLoader { whenEntrypoint(route: string) { return withFuture(route, entrypoints) }, - onEntrypoint(route, execute) { + onEntrypoint(route: string, execute: () => unknown) { Promise.resolve(execute) .then((fn) => fn()) .then( @@ -285,7 +287,7 @@ function createRouteLoader(assetPrefix: string): RouteLoader { if (old && 'resolve' in old) old.resolve(input) }) }, - loadRoute(route) { + loadRoute(route: string) { return withFuture(route, routes, async () => { try { const { scripts, css } = await getFilesForRoute(assetPrefix, route) @@ -296,7 +298,7 @@ function createRouteLoader(assetPrefix: string): RouteLoader { Promise.all(css.map(fetchStyleSheet)), ] as const) - const entrypoint = await Promise.race([ + const entrypoint: RouteEntrypoint = await Promise.race([ this.whenEntrypoint(route), idleTimeout( MS_MAX_IDLE_DELAY, @@ -315,7 +317,7 @@ function createRouteLoader(assetPrefix: string): RouteLoader { } }) }, - prefetch(route) { + prefetch(route: string): Promise { // https://github.com/GoogleChromeLabs/quicklink/blob/453a661fa1fa940e2d2e044452398e38c67a98fb/src/index.mjs#L115-L118 // License: Apache 2.0 let cn diff --git a/packages/next/client/router.ts b/packages/next/client/router.ts index 093a310f3b60d..ff3c66dc92013 100644 --- a/packages/next/client/router.ts +++ b/packages/next/client/router.ts @@ -66,7 +66,7 @@ Object.defineProperty(singletonRouter, 'events', { }, }) -urlPropertyFields.forEach((field) => { +urlPropertyFields.forEach((field: string) => { // Here we need to use Object.defineProperty because, we need to return // the property assigned to the actual router // The value might get changed as we change routes and this is the @@ -79,7 +79,7 @@ urlPropertyFields.forEach((field) => { }) }) -coreMethodFields.forEach((field) => { +coreMethodFields.forEach((field: string) => { // We don't really know the types here, so we add them later instead ;(singletonRouter as any)[field] = (...args: any[]) => { const router = getRouter() as any @@ -87,7 +87,7 @@ coreMethodFields.forEach((field) => { } }) -routerEvents.forEach((event) => { +routerEvents.forEach((event: string) => { singletonRouter.ready(() => { Router.events.on(event, (...args) => { const eventField = `on${event.charAt(0).toUpperCase()}${event.substring( diff --git a/packages/next/client/use-intersection.tsx b/packages/next/client/use-intersection.tsx index 93aa6c385f43e..ad198e4d7f5ff 100644 --- a/packages/next/client/use-intersection.tsx +++ b/packages/next/client/use-intersection.tsx @@ -4,6 +4,11 @@ import requestIdleCallback from './request-idle-callback' type UseIntersectionObserverInit = Pick type UseIntersection = { disabled?: boolean } & UseIntersectionObserverInit type ObserveCallback = (isVisible: boolean) => void +type Observer = { + id: string + observer: IntersectionObserver + elements: Map +} const hasIntersectionObserver = typeof IntersectionObserver !== 'undefined' @@ -11,7 +16,7 @@ export function useIntersection({ rootMargin, disabled, }: UseIntersection): [(element: T | null) => void, boolean] { - const isDisabled = disabled || !hasIntersectionObserver + const isDisabled: boolean = disabled || !hasIntersectionObserver const unobserve = useRef() const [visible, setVisible] = useState(false) @@ -49,12 +54,12 @@ function observe( element: Element, callback: ObserveCallback, options: UseIntersectionObserverInit -) { +): () => void { const { id, observer, elements } = createObserver(options) elements.set(element, callback) observer.observe(element) - return function unobserve() { + return function unobserve(): void { elements.delete(element) observer.unobserve(element) @@ -66,15 +71,8 @@ function observe( } } -const observers = new Map< - string, - { - id: string - observer: IntersectionObserver - elements: Map - } ->() -function createObserver(options: UseIntersectionObserverInit) { +const observers = new Map() +function createObserver(options: UseIntersectionObserverInit): Observer { const id = options.rootMargin || '' let instance = observers.get(id) if (instance) { diff --git a/packages/next/client/with-router.tsx b/packages/next/client/with-router.tsx index 59f50c8dc26f8..217a65bd15c1d 100644 --- a/packages/next/client/with-router.tsx +++ b/packages/next/client/with-router.tsx @@ -17,7 +17,7 @@ export default function withRouter< >( ComposedComponent: NextComponentType ): React.ComponentType> { - function WithRouterWrapper(props: any) { + function WithRouterWrapper(props: any): JSX.Element { return }