UNPKG

@asyncapi/studio

Version:

One place that allows you to develop an AsyncAPI document, validate it, convert it to the latest version, preview the documentation and visualize the events flow.

80 lines (62 loc) 3.49 kB
// File: /home/runner/work/studio/studio/apps/studio/src/app/page.tsx import * as entry from '../../../src/app/page.js' import type { ResolvingMetadata, ResolvingViewport } from 'next/dist/lib/metadata/types/metadata-interface.js' type TEntry = typeof import('../../../src/app/page.js') // Check that the entry is a valid entry checkFields<Diff<{ default: Function config?: {} generateStaticParams?: Function revalidate?: RevalidateRange<TEntry> | false dynamic?: 'auto' | 'force-dynamic' | 'error' | 'force-static' dynamicParams?: boolean fetchCache?: 'auto' | 'force-no-store' | 'only-no-store' | 'default-no-store' | 'default-cache' | 'only-cache' | 'force-cache' preferredRegion?: 'auto' | 'global' | 'home' | string | string[] runtime?: 'nodejs' | 'experimental-edge' | 'edge' maxDuration?: number metadata?: any generateMetadata?: Function viewport?: any generateViewport?: Function }, TEntry, ''>>() // Check the prop type of the entry function checkFields<Diff<PageProps, FirstArg<TEntry['default']>, 'default'>>() // Check the arguments and return type of the generateMetadata function if ('generateMetadata' in entry) { checkFields<Diff<PageProps, FirstArg<MaybeField<TEntry, 'generateMetadata'>>, 'generateMetadata'>>() checkFields<Diff<ResolvingMetadata, SecondArg<MaybeField<TEntry, 'generateMetadata'>>, 'generateMetadata'>>() } // Check the arguments and return type of the generateViewport function if ('generateViewport' in entry) { checkFields<Diff<PageProps, FirstArg<MaybeField<TEntry, 'generateViewport'>>, 'generateViewport'>>() checkFields<Diff<ResolvingViewport, SecondArg<MaybeField<TEntry, 'generateViewport'>>, 'generateViewport'>>() } // Check the arguments and return type of the generateStaticParams function if ('generateStaticParams' in entry) { checkFields<Diff<{ params: PageParams }, FirstArg<MaybeField<TEntry, 'generateStaticParams'>>, 'generateStaticParams'>>() checkFields<Diff<{ __tag__: 'generateStaticParams', __return_type__: any[] | Promise<any[]> }, { __tag__: 'generateStaticParams', __return_type__: ReturnType<MaybeField<TEntry, 'generateStaticParams'>> }>>() } type PageParams = any export interface PageProps { params?: any searchParams?: any } export interface LayoutProps { children?: React.ReactNode params?: any } // ============= // Utility types type RevalidateRange<T> = T extends { revalidate: any } ? NonNegative<T['revalidate']> : never // If T is unknown or any, it will be an empty {} type. Otherwise, it will be the same as Omit<T, keyof Base>. type OmitWithTag<T, K extends keyof any, _M> = Omit<T, K> type Diff<Base, T extends Base, Message extends string = ''> = 0 extends (1 & T) ? {} : OmitWithTag<T, keyof Base, Message> type FirstArg<T extends Function> = T extends (...args: [infer T, any]) => any ? unknown extends T ? any : T : never type SecondArg<T extends Function> = T extends (...args: [any, infer T]) => any ? unknown extends T ? any : T : never type MaybeField<T, K extends string> = T extends { [k in K]: infer G } ? G extends Function ? G : never : never function checkFields<_ extends { [k in keyof any]: never }>() {} // https://github.com/sindresorhus/type-fest type Numeric = number | bigint type Zero = 0 | 0n type Negative<T extends Numeric> = T extends Zero ? never : `${T}` extends `-${string}` ? T : never type NonNegative<T extends Numeric> = T extends Zero ? T : Negative<T> extends never ? T : '__invalid_negative_number__'