UNPKG

vite-plugin-vanjs

Version:

An async first mini meta-framework for VanJS powered by Vite

221 lines (179 loc) 5.49 kB
/// <reference path="global.d.ts" /> import type { Element as VElement, TagFunc as IsoTagFunc, } from "mini-van-plate/van-plate"; import type { ChildDom, Primitive, Props, PropsWithKnownKeys, PropValueOrDerived, State, } from "vanjs-core"; import type { LayoutFile } from "../plugin/types.d.ts"; type PrimitiveChild = Primitive | State<Primitive | undefined | null>; type DOMElement<T extends keyof HTMLElementTagNameMap = "div"> = | SVGElement | HTMLElement | Node | HTMLElementTagNameMap[T]; export type VanElement = | DOMElement | VElement | PrimitiveChild; export type VanNode = | VanElement | VanElement[] | (() => VanElement | VanElement[]) | null | undefined; type ComponentProps1<T> = Props & PropsWithKnownKeys<T>; type ComponentProps<K extends keyof HTMLElementTagNameMap> = & Props & PropsWithKnownKeys<HTMLElementTagNameMap[K]>; export type VanComponent< K extends keyof HTMLElementTagNameMap = "div", O extends (Record<string, PropValueOrDerived> | undefined) = undefined, > = { ( props?: O extends object ? ComponentProps<K> & Partial<O> : ComponentProps<K>, ...children: ChildDom[] ): HTMLElementTagNameMap[K]; }; // router.mjs export const Router: & VanComponent<"main"> & JSX.Component<"main">; export const FileSystemRouter: & VanComponent<"main"> & JSX.Component<"main">; // a.mjs export const A: & VanComponent<"a"> & JSX.Component<"a">; // helpers.mjs export const navigate: ( href: string, options?: { replace?: boolean }, ) => void; export const reload: () => void; export const redirect: (href?: string) => void | (() => void); export const getValue: (v: unknown) => string; export const isCurrentPage: (pageName: string) => boolean; export const isCurrentLocation: (pageName: string) => boolean; export const isLazyComponent: (component: unknown) => boolean; export const executeLifecycle: ( route: RouteEntry | { preload?: (params?: Record<string, unknown>) => unknown; load?: (params?: Record<string, string>) => Promise<unknown>; } | null, ) => Promise<boolean>; export const useRouteData: <T>() => T | undefined; export const matchRoute: (path: string) => RouteEntry | null; // extractParams.mjs export const extractParams: ( pattern: string, path: string, ) => Record<string, string> | null; // routes.mjs export type RouteEntry = { path: string; component: () => Promise<ComponentModule>; params?: Record<string, string>; preload?: (params?: Record<string, string>) => unknown; load?: (params?: Record<string, string>) => Promise<unknown>; }; export type ImportFn = () => LazyComponent; export const lazy: (importFn: ImportFn) => () => Promise<ComponentModule>; export type RouteProps = { path: string; params?: Record<string, string>; component: | (() => DOMElement) | VanComponent | ComponentFn | (() => Promise<ComponentModule>); preload?: (params?: Record<string, string>) => unknown; load?: (params?: Record<string, string>) => Promise<unknown>; }; export type RouteConfig = { routePath: string; path: string; layouts?: LayoutFile[]; }; export const routes: RouteEntry[]; export const Route: (route: RouteProps) => void; // state.mjs export type RouterState = { pathname: string; searchParams: string; params: Record<string, string>; loading: boolean; }; export const routerState: { pathname: RouterState["pathname"]; searchParams: RouterState["searchParams"]; params?: RouterState["params"]; loading: RouterState["loading"]; }; export const setRouterState: ( href: string, search?: string, params?: Record<string, string>, ) => void; export const microStore: <T extends Record<string, unknown>>(init: T) => T; // routeCache.mjs export const cacheRoute: (key: ImportFn, value: ComponentModule) => void; export const getCachedRoute: (key: ImportFn) => ComponentModule | undefined; export const fixRouteUrl: (url: string) => string; // unwrap.mjs export type UnwrapResult = { children: VanNode[] }; export const unwrap: ( source: | VanNode | VanNode[] | VanComponent | { children: VanNode[] } | ComponentFn | ReturnType<IsoTagFunc> | ReturnType<IsoTagFunc>[] | (() => | ReturnType<IsoTagFunc> | ReturnType<IsoTagFunc>[] | VanNode | VanNode[]), ...children: VanNode[] ) => UnwrapResult; export type JSXComponentFn = () => JSX.Element; export type FragmentFn = () => ChildDom | ChildDom[]; export type ComponentFn = FragmentFn | VanComponent | JSXComponentFn; export type ComponentModule = { component: ComponentFn; route?: Pick<RouteEntry, "load" | "preload">; }; export type LazyComponent = Promise<{ default?: ComponentFn; Page?: ComponentFn; route?: Pick<RouteEntry, "load" | "preload">; }>; // dataCache.mjs export type CacheEntry<T = unknown> = { data: T; error: Error | null; timestamp: number; }; export const dataCache: { get<T>(pathname: string, key: string): CacheEntry<T> | undefined; set<T>(pathname: string, key: string, entry: Partial<CacheEntry<T>>): void; has(pathname: string, key?: string): boolean; getRoute(pathname: string): Record<string, CacheEntry> | undefined; del(pathname: string, key?: string): boolean; clear(): void; touch(pathname: string): void; toJSON(): Record<string, Record<string, CacheEntry>>; hydrateFromJSON(json: Record<string, Record<string, CacheEntry>>): void; size(): number; setMaxRoutes(n: number): void; };