UNPKG

@react-navigation/core

Version:

Core utilities for building navigators

732 lines 30.3 kB
import type { DefaultRouterOptions, InitialState, NavigationAction, NavigationState, ParamListBase, PartialState, Route, Router } from '@react-navigation/routers'; import type * as React from 'react'; declare global { namespace ReactNavigation { interface RootParamList { } interface Theme { } } } type Keyof<T extends {}> = Extract<keyof T, string>; export type DefaultNavigatorOptions<ParamList extends ParamListBase, NavigatorID extends string | undefined, State extends NavigationState, ScreenOptions extends {}, EventMap extends EventMapBase, Navigation> = DefaultRouterOptions<Keyof<ParamList>> & { /** * Children React Elements to extract the route configuration from. * Only `Screen`, `Group` and `React.Fragment` are supported as children. */ children: React.ReactNode; /** * Layout for the navigator. * Useful for wrapping with a component with access to navigator's state and options. */ layout?: (props: { state: State; navigation: NavigationHelpers<ParamList>; descriptors: Record<string, Descriptor<ScreenOptions, NavigationProp<ParamList, keyof ParamList, string | undefined, State, ScreenOptions, EventMap>, RouteProp<ParamList>>>; children: React.ReactNode; }) => React.ReactElement; /** * Event listeners for all the screens in the navigator. */ screenListeners?: ScreenListeners<State, EventMap> | ((props: { route: RouteProp<ParamList>; navigation: Navigation; }) => ScreenListeners<State, EventMap>); /** * Default options for all screens under this navigator. */ screenOptions?: ScreenOptions | ((props: { route: RouteProp<ParamList>; navigation: Navigation; theme: ReactNavigation.Theme; }) => ScreenOptions); /** * Layout for all screens under this navigator. */ screenLayout?: (props: { route: RouteProp<ParamList, keyof ParamList>; navigation: Navigation; theme: ReactNavigation.Theme; children: React.ReactElement; }) => React.ReactElement; /** * A function returning overrides for the underlying router used by the navigator. * The overrides will be shallow merged onto the original router. * It receives the original router as an argument to the function. * * This must be a pure function and cannot reference outside dynamic variables. */ UNSTABLE_router?: <Action extends NavigationAction>(original: Router<State, Action>) => Partial<Router<State, Action>>; } & (NavigatorID extends string ? { /** * Optional ID for the navigator. Can be used with `navigation.getParent(id)` to refer to a parent. */ id: NavigatorID; } : { id?: undefined; }); export type EventMapBase = Record<string, { data?: any; canPreventDefault?: boolean; }>; export type EventMapCore<State extends NavigationState> = { focus: { data: undefined; }; blur: { data: undefined; }; state: { data: { state: State; }; }; beforeRemove: { data: { action: NavigationAction; }; canPreventDefault: true; }; }; export type EventArg<EventName, CanPreventDefault extends boolean | undefined = false, Data = undefined> = { /** * Type of the event (e.g. `focus`, `blur`) */ readonly type: EventName; readonly target?: string; } & (CanPreventDefault extends true ? { /** * Whether `event.preventDefault()` was called on this event object. */ readonly defaultPrevented: boolean; /** * Prevent the default action which happens on this event. */ preventDefault(): void; } : {}) & (undefined extends Data ? { readonly data?: Readonly<Data>; } : { readonly data: Readonly<Data>; }); export type EventListenerCallback<EventMap extends EventMapBase, EventName extends keyof EventMap, EventCanPreventDefault extends boolean | undefined = EventMap[EventName]['canPreventDefault']> = (e: EventArg<EventName, undefined extends EventCanPreventDefault ? false : EventCanPreventDefault, EventMap[EventName]['data']>) => void; export type EventConsumer<EventMap extends EventMapBase> = { /** * Subscribe to events from the parent navigator. * * @param type Type of the event (e.g. `focus`, `blur`) * @param callback Callback listener which is executed upon receiving the event. */ addListener<EventName extends Keyof<EventMap>>(type: EventName, callback: EventListenerCallback<EventMap, EventName>): () => void; removeListener<EventName extends Keyof<EventMap>>(type: EventName, callback: EventListenerCallback<EventMap, EventName>): void; }; export type EventEmitter<EventMap extends EventMapBase> = { /** * Emit an event to child screens. * * @param options.type Type of the event (e.g. `focus`, `blur`) * @param [options.data] Optional information regarding the event. * @param [options.target] Key of the target route which should receive the event. * If not specified, all routes receive the event. */ emit<EventName extends Keyof<EventMap>>(options: { type: EventName; target?: string; } & (EventMap[EventName]['canPreventDefault'] extends true ? { canPreventDefault: true; } : {}) & (undefined extends EventMap[EventName]['data'] ? { data?: EventMap[EventName]['data']; } : { data: EventMap[EventName]['data']; })): EventArg<EventName, EventMap[EventName]['canPreventDefault'], EventMap[EventName]['data']>; }; export declare class PrivateValueStore<T extends [any, any, any]> { /** * UGLY HACK! DO NOT USE THE TYPE!!! * * TypeScript requires a type to be used to be able to infer it. * The type should exist as its own without any operations such as union. * So we need to figure out a way to store this type in a property. * The problem with a normal property is that it shows up in intelliSense. * Adding private keyword works, but the annotation is stripped away in declaration. * Turns out if we use an empty string, it doesn't show up in intelliSense. */ protected ''?: T; } type NavigationHelpersCommon<ParamList extends ParamListBase, State extends NavigationState = NavigationState> = { /** * Dispatch an action or an update function to the router. * The update function will receive the current state, * * @param action Action object or update function. */ dispatch(action: NavigationAction | ((state: Readonly<State>) => NavigationAction)): void; /** * Navigate to a screen in the current or parent navigator. * If we're already on the screen, update the params instead. * * @param screen Name of the route to navigate to. * @param [params] Params object for the route. * @param [options.merge] Whether to merge the params onto the route. Defaults to `false`. * @param [options.pop] Whether to pop routes in a stack to go back to the matching route. Defaults to `false`. */ navigate<RouteName extends keyof ParamList>(...args: RouteName extends unknown ? undefined extends ParamList[RouteName] ? [ screen: RouteName, params?: ParamList[RouteName], options?: { merge?: boolean; pop?: boolean; } ] : [ screen: RouteName, params: ParamList[RouteName], options?: { merge?: boolean; pop?: boolean; } ] : never): void; /** * Navigate to a route in current navigation tree. * * @param options.name Name of the route to navigate to. * @param [options.params] Params object for the route. * @param [options.path] Path to associate the route with (e.g. for deep links). * @param [options.merge] Whether to merge the params onto the route. Defaults to `false`. * @param [options.pop] Whether to pop routes in a stack to go back to the matching route. Defaults to `false`. */ navigate<RouteName extends keyof ParamList>(options: RouteName extends unknown ? { name: RouteName; params: ParamList[RouteName]; path?: string; merge?: boolean; pop?: boolean; } : never): void; /** * Navigate to a route in current navigation tree. * * @deprecated Use `navigate` instead. * * @param screen Name of the route to navigate to. * @param [params] Params object for the route. */ navigateDeprecated<RouteName extends keyof ParamList>(...args: RouteName extends unknown ? undefined extends ParamList[RouteName] ? [screen: RouteName, params?: ParamList[RouteName]] : [screen: RouteName, params: ParamList[RouteName]] : never): void; /** * Navigate to a route in current navigation tree. * * @deprecated Use `navigate` instead. * * @param options Object with `name` for the route to navigate to, and a `params` object. */ navigateDeprecated<RouteName extends keyof ParamList>(options: RouteName extends unknown ? { name: RouteName; params: ParamList[RouteName]; merge?: boolean; } : never): void; /** * Preloads the route in current navigation tree. * * @param screen Name of the route to preload. * @param [params] Params object for the route. */ preload<RouteName extends keyof ParamList>(...args: RouteName extends unknown ? undefined extends ParamList[RouteName] ? [screen: RouteName, params?: ParamList[RouteName]] : [screen: RouteName, params: ParamList[RouteName]] : never): void; /** * Reset the navigation state to the provided state. * * @param state Navigation state object. */ reset(state: PartialState<State> | State): void; /** * Go back to the previous route in history. */ goBack(): void; /** * Check if the screen is focused. The method returns `true` if focused, `false` otherwise. * Note that this method doesn't re-render screen when the focus changes. So don't use it in `render`. * To get notified of focus changes, use `addListener('focus', cb)` and `addListener('blur', cb)`. * To conditionally render content based on focus state, use the `useIsFocused` hook. */ isFocused(): boolean; /** * Check if dispatching back action will be handled by navigation. * Note that this method doesn't re-render screen when the result changes. So don't use it in `render`. */ canGoBack(): boolean; /** * Returns the name of the navigator specified in the `name` prop. * If no name is specified, returns `undefined`. */ getId(): string | undefined; /** * Returns the navigation helpers from a parent navigator based on the ID. * If an ID is provided, the navigation helper from the parent navigator with matching ID (including current) will be returned. * If no ID is provided, the navigation helper from the immediate parent navigator will be returned. * * @param id Optional ID of a parent navigator. */ getParent<T = NavigationHelpers<ParamListBase> | undefined>(id?: string): T; /** * Returns the navigator's state. * Note that this method doesn't re-render screen when the result changes. So don't use it in `render`. */ getState(): State; /** * Schedules the given state to be used as navigation state when the list of screens defined in the navigator changes * instead of automatically calculating the new state, e.g. due to conditional rendering or dynamically defining screens. * * @param state Navigation state object. */ setStateForNextRouteNamesChange(state: PartialState<State> | State): void; } & PrivateValueStore<[ParamList, unknown, unknown]>; export type NavigationHelpers<ParamList extends ParamListBase, EventMap extends EventMapBase = {}> = NavigationHelpersCommon<ParamList> & EventEmitter<EventMap> & { /** * Update the param object for the route. * The new params will be shallow merged with the old one. * * @param params Params object for the current route. */ setParams<RouteName extends keyof ParamList>(params: Partial<ParamList[RouteName]>): void; }; export type NavigationContainerProps = { /** * Initial navigation state for the child navigators. */ initialState?: InitialState; /** * Callback which is called with the latest navigation state when it changes. */ onStateChange?: (state: Readonly<NavigationState> | undefined) => void; /** * Callback which is called after the navigation tree mounts. */ onReady?: () => void; /** * Callback which is called when an action is not handled. */ onUnhandledAction?: (action: Readonly<NavigationAction>) => void; /** * Whether child navigator should handle a navigation action. * The child navigator needs to be mounted before it can handle the action. * Defaults to `false`. * * This will be removed in the next major release. * * @deprecated Use nested navigation API instead */ navigationInChildEnabled?: boolean; /** * Theme object for the UI elements. */ theme?: ReactNavigation.Theme; /** * Children elements to render. */ children: React.ReactNode; }; export type NavigationProp<ParamList extends {}, RouteName extends keyof ParamList = Keyof<ParamList>, NavigatorID extends string | undefined = undefined, State extends NavigationState = NavigationState<ParamList>, ScreenOptions extends {} = {}, EventMap extends EventMapBase = {}> = Omit<NavigationHelpersCommon<ParamList, State>, 'getParent'> & { /** * Returns the navigation prop from a parent navigator based on the ID. * If an ID is provided, the navigation prop from the parent navigator with matching ID (including current) will be returned. * If no ID is provided, the navigation prop from the immediate parent navigator will be returned. * * @param id Optional ID of a parent navigator. */ getParent<T = NavigationProp<ParamListBase> | undefined>(id?: NavigatorID): T; /** * Update the param object for the route. * The new params will be shallow merged with the old one. * * @param params Params object for the current route. */ setParams(params: ParamList[RouteName] extends undefined ? undefined : Partial<ParamList[RouteName]>): void; /** * Update the options for the route. * The options object will be shallow merged with default options object. * * @param update Options object or a callback which takes the options from navigator config and returns a new options object. */ setOptions(options: Partial<ScreenOptions>): void; } & EventConsumer<EventMap & EventMapCore<State>> & PrivateValueStore<[ParamList, RouteName, EventMap]>; export type RouteProp<ParamList extends ParamListBase, RouteName extends keyof ParamList = Keyof<ParamList>> = Route<Extract<RouteName, string>, ParamList[RouteName]>; export type CompositeNavigationProp<A extends NavigationProp<ParamListBase, string, any, any, any>, B extends NavigationHelpersCommon<ParamListBase, any>> = Omit<A & B, keyof NavigationProp<any>> & NavigationProp< /** * Param list from both navigation objects needs to be combined * For example, we should be able to navigate to screens in both A and B */ (A extends NavigationHelpersCommon<infer T> ? T : never) & (B extends NavigationHelpersCommon<infer U> ? U : never), /** * The route name should refer to the route name specified in the first type * Ideally it should work for any of them, but it's not possible to infer that way */ A extends NavigationProp<any, infer R> ? R : string, /** * ID from both navigation objects needs to be combined for `getParent` */ (A extends NavigationProp<any, any, infer I> ? I : never) | (B extends NavigationProp<any, any, infer J> ? J : never), /** * The type of state should refer to the state specified in the first type */ A extends NavigationProp<any, any, any, infer S> ? S : NavigationState, /** * Screen options should refer to the options specified in the first type */ A extends NavigationProp<any, any, any, any, infer O> ? O : {}, /** * Event consumer config should refer to the config specified in the first type * This allows typechecking `addListener`/`removeListener` */ A extends NavigationProp<any, any, any, any, any, infer E> ? E : {}>; export type CompositeScreenProps<A extends { navigation: NavigationProp<ParamListBase, string, string | undefined, any, any, any>; route: RouteProp<ParamListBase>; }, B extends { navigation: NavigationHelpersCommon<any, any>; }> = { navigation: CompositeNavigationProp<A['navigation'], B['navigation']>; route: A['route']; }; export type Descriptor<ScreenOptions extends {}, Navigation extends NavigationProp<any, any, any, any, any, any>, Route extends RouteProp<any, any>> = { /** * Render the component associated with this route. */ render(): React.JSX.Element; /** * Options for the route. */ options: ScreenOptions; /** * Route object for the screen */ route: Route; /** * Navigation object for the screen */ navigation: Navigation; }; export type ScreenListeners<State extends NavigationState, EventMap extends EventMapBase> = Partial<{ [EventName in keyof (EventMap & EventMapCore<State>)]: EventListenerCallback<EventMap & EventMapCore<State>, EventName>; }>; type ScreenComponentType<ParamList extends ParamListBase, RouteName extends keyof ParamList> = React.ComponentType<{ route: RouteProp<ParamList, RouteName>; navigation: any; }> | React.ComponentType<{}>; export type RouteConfigComponent<ParamList extends ParamListBase, RouteName extends keyof ParamList> = { /** * React component to render for this screen. */ component: ScreenComponentType<ParamList, RouteName>; getComponent?: never; children?: never; } | { /** * Lazily get a React component to render for this screen. */ getComponent: () => ScreenComponentType<ParamList, RouteName>; component?: never; children?: never; } | { /** * Render callback to render content of this screen. */ children: (props: { route: RouteProp<ParamList, RouteName>; navigation: any; }) => React.ReactNode; component?: never; getComponent?: never; }; export type RouteConfigProps<ParamList extends ParamListBase, RouteName extends keyof ParamList, State extends NavigationState, ScreenOptions extends {}, EventMap extends EventMapBase, Navigation> = { /** * Optional key for this screen. This doesn't need to be unique. * If the key changes, existing screens with this name will be removed or reset. * Useful when we have some common screens and have conditional rendering. */ navigationKey?: string; /** * Route name of this screen. */ name: RouteName; /** * Navigator options for this screen. */ options?: ScreenOptions | ((props: { route: RouteProp<ParamList, RouteName>; navigation: Navigation; theme: ReactNavigation.Theme; }) => ScreenOptions); /** * Event listeners for this screen. */ listeners?: ScreenListeners<State, EventMap> | ((props: { route: RouteProp<ParamList, RouteName>; navigation: Navigation; }) => ScreenListeners<State, EventMap>); /** * Layout for this screen. * Useful for wrapping the screen with custom containers. * e.g. for styling, error boundaries, suspense, etc. */ layout?: (props: { route: RouteProp<ParamList, RouteName>; navigation: Navigation; theme: ReactNavigation.Theme; children: React.ReactElement; }) => React.ReactElement; /** * Function to return an unique ID for this screen. * Receives an object with the route params. * For a given screen name, there will always be only one screen corresponding to an ID. * If `undefined` is returned, it acts same as no `getId` being specified. */ getId?: ({ params, }: { params: Readonly<ParamList[RouteName]>; }) => string | undefined; /** * Initial params object for the route. */ initialParams?: Partial<ParamList[RouteName]>; }; export type RouteConfig<ParamList extends ParamListBase, RouteName extends keyof ParamList, State extends NavigationState, ScreenOptions extends {}, EventMap extends EventMapBase, Navigation> = RouteConfigProps<ParamList, RouteName, State, ScreenOptions, EventMap, Navigation> & RouteConfigComponent<ParamList, RouteName>; export type RouteGroupConfig<ParamList extends ParamListBase, ScreenOptions extends {}, Navigation> = { /** * Optional key for the screens in this group. * If the key changes, all existing screens in this group will be removed or reset. */ navigationKey?: string; /** * Navigator options for this screen. */ screenOptions?: ScreenOptions | ((props: { route: RouteProp<ParamList, keyof ParamList>; navigation: Navigation; theme: ReactNavigation.Theme; }) => ScreenOptions); /** * Layout for the screens inside the group. * This will override the `screenLayout` of parent group or navigator. */ screenLayout?: ((props: { route: RouteProp<ParamList, keyof ParamList>; navigation: Navigation; theme: ReactNavigation.Theme; children: React.ReactElement; }) => React.ReactElement) | {}; /** * Children React Elements to extract the route configuration from. * Only `Screen`, `Group` and `React.Fragment` are supported as children. */ children: React.ReactNode; }; export type NavigationContainerEventMap = { /** * Event that fires when the navigation container is ready to be used. */ ready: { data: undefined; }; /** * Event that fires when the navigation state changes. */ state: { data: { /** * The updated state object after the state change. */ state: NavigationState | PartialState<NavigationState> | undefined; }; }; /** * Event that fires when current options changes. */ options: { data: { options: object; }; }; /** * Event that fires when an action is dispatched. * Only intended for debugging purposes, don't use it for app logic. * This event will be emitted before state changes have been applied. */ __unsafe_action__: { data: { /** * The action object that was dispatched. */ action: NavigationAction; /** * Whether the action was a no-op, i.e. resulted any state changes. */ noop: boolean; /** * Stack trace of the action, this will only be available during development. */ stack: string | undefined; }; }; }; type NotUndefined<T> = T extends undefined ? never : T; export type ParamListRoute<ParamList extends ParamListBase> = { [RouteName in keyof ParamList]: NavigatorScreenParams<{}> extends ParamList[RouteName] ? NotUndefined<ParamList[RouteName]> extends NavigatorScreenParams<infer T> ? ParamListRoute<T> : Route<Extract<RouteName, string>, ParamList[RouteName]> : Route<Extract<RouteName, string>, ParamList[RouteName]>; }[keyof ParamList]; type MaybeParamListRoute<ParamList extends {}> = ParamList extends ParamListBase ? ParamListRoute<ParamList> : Route<string>; export type NavigationContainerRef<ParamList extends {}> = NavigationHelpers<ParamList> & EventConsumer<NavigationContainerEventMap> & { /** * Reset the navigation state of the root navigator to the provided state. * * @param state Navigation state object. */ resetRoot(state?: PartialState<NavigationState> | NavigationState): void; /** * Get the rehydrated navigation state of the navigation tree. */ getRootState(): NavigationState; /** * Get the currently focused navigation route. */ getCurrentRoute(): MaybeParamListRoute<ParamList> | undefined; /** * Get the currently focused route's options. */ getCurrentOptions(): object | undefined; /** * Whether the navigation container is ready to handle actions. */ isReady(): boolean; /** * Stub function for setOptions on navigation object for use with useNavigation. */ setOptions(): never; /** * Stub function for getParent on navigation object for use with useNavigation. */ getParent(): undefined; }; export type NavigationContainerRefWithCurrent<ParamList extends {}> = NavigationContainerRef<ParamList> & { current: NavigationContainerRef<ParamList> | null; }; export type NavigationListBase<ParamList extends ParamListBase> = { [RouteName in keyof ParamList]: unknown; }; export type TypeBag<ParamList extends ParamListBase, NavigatorID extends string | undefined, State extends NavigationState, ScreenOptions extends {}, EventMap extends EventMapBase, NavigationList extends NavigationListBase<ParamList>, Navigator extends React.ComponentType<any>> = { ParamList: ParamList; NavigatorID: NavigatorID; State: State; ScreenOptions: ScreenOptions; EventMap: EventMap; NavigationList: NavigationList; Navigator: Navigator; }; export type NavigatorTypeBagBase = { ParamList: {}; NavigatorID: string | undefined; State: NavigationState; ScreenOptions: {}; EventMap: {}; NavigationList: NavigationListBase<ParamListBase>; Navigator: React.ComponentType<any>; }; export type NavigatorTypeBag<ParamList extends ParamListBase, NavigatorID extends string | undefined, State extends NavigationState, ScreenOptions extends {}, EventMap extends EventMapBase, NavigationList extends NavigationListBase<ParamList>, Navigator extends React.ComponentType<any>> = { ParamList: ParamList; NavigatorID: NavigatorID; State: State; ScreenOptions: ScreenOptions; EventMap: EventMap; NavigationList: NavigationList; Navigator: Navigator; }; export type TypedNavigator<Bag extends NavigatorTypeBagBase, Config = unknown> = TypedNavigatorInternal<Bag['ParamList'], Bag['NavigatorID'], Bag['State'], Bag['ScreenOptions'], Bag['EventMap'], Bag['NavigationList'], Bag['Navigator']> & (undefined extends Config ? {} : { config: Config; }); type TypedNavigatorInternal<ParamList extends ParamListBase, NavigatorID extends string | undefined, State extends NavigationState, ScreenOptions extends {}, EventMap extends EventMapBase, NavigationList extends NavigationListBase<ParamList>, Navigator extends React.ComponentType<any>> = { /** * Navigator component which manages the child screens. */ Navigator: React.ComponentType<Omit<React.ComponentProps<Navigator>, keyof DefaultNavigatorOptions<any, any, any, any, any, any>> & DefaultNavigatorOptions<ParamList, NavigatorID, State, ScreenOptions, EventMap, NavigationList[keyof ParamList]>>; /** * Component used for grouping multiple route configuration. */ Group: React.ComponentType<RouteGroupConfig<ParamList, ScreenOptions, NavigationList[keyof ParamList]>>; /** * Component used for specifying route configuration. */ Screen: <RouteName extends keyof ParamList>(_: RouteConfig<ParamList, RouteName, State, ScreenOptions, EventMap, NavigationList[RouteName]>) => null; }; export type NavigatorScreenParams<ParamList extends {}> = { screen?: never; params?: never; initial?: never; pop?: never; path?: string; state: PartialState<NavigationState> | NavigationState | undefined; } | { [RouteName in keyof ParamList]: undefined extends ParamList[RouteName] ? { screen: RouteName; params?: ParamList[RouteName]; initial?: boolean; path?: string; pop?: boolean; state?: never; } : { screen: RouteName; params: ParamList[RouteName]; initial?: boolean; path?: string; pop?: boolean; state?: never; }; }[keyof ParamList]; type PathConfigAlias = { /** * Path string to match against. * e.g. `/users/:id` will match `/users/1` and extract `id` param as `1`. */ path: string; /** * Whether the path should be consider parent paths or use the exact path. * By default, paths are relating to the path config on the parent screen. * If `exact` is set to `true`, the parent path configuration is not used. */ exact?: boolean; /** * An object mapping the param name to a function which parses the param value. * * @example * ```js * parse: { * id: Number, * date: (value) => new Date(value) * } * ``` */ parse?: Record<string, (value: string) => any>; }; export type PathConfig<ParamList extends {}> = Partial<PathConfigAlias> & { /** * An object mapping the param name to a function which converts the param value to a string. * By default, all params are converted to strings using `String(value)`. * * @example * ```js * stringify: { * date: (value) => value.toISOString() * } * ``` */ stringify?: Record<string, (value: any) => string>; /** * Additional path alias that will be matched to the same screen. */ alias?: (string | PathConfigAlias)[]; /** * Path configuration for child screens. */ screens?: PathConfigMap<ParamList>; /** * Name of the initial route to use for the navigator when the path matches. */ initialRouteName?: keyof ParamList; }; export type PathConfigMap<ParamList extends {}> = { [RouteName in keyof ParamList]?: NonNullable<ParamList[RouteName]> extends NavigatorScreenParams<infer T extends {}> ? string | PathConfig<T> : string | Omit<PathConfig<{}>, 'screens' | 'initialRouteName'>; }; export {}; //# sourceMappingURL=types.d.ts.map