import { RouterMethod, App, Router, H3Event, EventHandler, H3Error } from 'h3'; import { FetchRequest, FetchOptions, FetchResponse } from 'ofetch'; import { Preset } from 'unenv'; import { Unimport } from 'unimport'; import { UnimportPluginOptions } from 'unimport/unplugin'; import { PluginVisualizerOptions } from 'rollup-plugin-visualizer'; import { Hookable, NestedHooks } from 'hookable'; import { Consola, LogLevel } from 'consola'; import { WatchOptions, FSWatcher } from 'chokidar'; import { RollupCommonJSOptions } from '@rollup/plugin-commonjs'; import { RollupWasmOptions } from '@rollup/plugin-wasm'; import { Storage, BuiltinDriverName } from 'unstorage'; import { ServerOptions } from 'http-proxy'; import { NodeFileTraceOptions } from '@vercel/nft'; import { InputOptions, OutputOptions } from 'rollup'; import { Loader } from 'esbuild'; import { FilterPattern } from '@rollup/pluginutils'; import { Worker } from 'node:worker_threads'; import { ListenOptions, Listener } from 'listhen'; import { createCall, createFetch } from 'unenv/runtime/fetch/index'; type MatchResult = { [k in Key]: { key: k; exact: Exact; score: Score; catchAll: catchAll; }; }[Key]; type Subtract = Minuend extends [...Subtrahend, ...infer Remainder] ? Remainder : never; type TupleIfDiff = First extends `${Second}${infer Diff}` ? Diff extends "" ? [] : Tuple : []; type MaxTuple = { current: T; result: MaxTuple; }[[N["length"]] extends [Partial["length"]] ? "current" : "result"]; type CalcMatchScore = `${Key}/` extends `${infer KeySeg}/${infer KeyRest}` ? KeySeg extends FirstKeySegMatcher ? Subtract<[ ...Score, ...TupleIfDiff ], TupleIfDiff> : `${Route}/` extends `${infer RouteSeg}/${infer RouteRest}` ? `${RouteSeg}?` extends `${infer RouteSegWithoutQuery}?${string}` ? RouteSegWithoutQuery extends KeySeg ? CalcMatchScore : KeySeg extends `:${string}` ? RouteSegWithoutQuery extends "" ? never : CalcMatchScore : KeySeg extends RouteSegWithoutQuery ? CalcMatchScore : never : never : never : never; type _MatchedRoutes = MatchResult> = MatchedResultUnion["key"] extends infer MatchedKeys ? MatchedKeys extends string ? Route extends MatchedKeys ? MatchResult : MatchedKeys extends `${infer Root}/**${string}` ? MatchedKeys extends `${string}/**` ? Route extends `${Root}/${string}` ? MatchResult : never : MatchResult> : MatchResult> : never : never; type MatchedRoutes = MatchResult, Matches extends MatchResult = _MatchedRoutes> = Route extends "/" ? keyof InternalApi : Extract extends never ? Extract, { score: MaxTuple; }>["key"] | Extract["key"] : Extract["key"]; type KebabCase = T extends `${infer F}${infer R}` ? KebabCase ? "" : "-"}${Lowercase}`> : A; interface InternalApi { } type dittpFetchRequest = Exclude | Exclude | (string & {}); type MiddlewareOf = Method extends keyof InternalApi[MatchedRoutes] ? Exclude][Method], Error | void> : never; type TypedInternalResponse = Default extends string | boolean | number | null | void | object ? Default : Route extends string ? MiddlewareOf extends never ? MiddlewareOf extends never ? Default : MiddlewareOf : MiddlewareOf : Default; type AvailableRouterMethod = R extends string ? keyof InternalApi[MatchedRoutes] extends undefined ? RouterMethod : Extract], "default"> extends undefined ? Extract]> : RouterMethod : RouterMethod; interface dittpFetchOptions extends FetchOptions { method?: Uppercase> | AvailableRouterMethod; } type ExtractedRouteMethod> = O extends undefined ? "get" : Lowercase extends RouterMethod ? Lowercase : "get"; interface $Fetch { = dittpFetchOptions>(request: R, opts?: O): Promise>>; raw = dittpFetchOptions>(request: R, opts?: O): Promise>>>; create(defaults: FetchOptions): $Fetch; } declare global { var $fetch: $Fetch; namespace NodeJS { interface Global { $fetch: $Fetch; } } } interface NodeExternalsOptions { inline?: string[]; external?: string[]; outDir?: string; trace?: boolean; traceOptions?: NodeFileTraceOptions; moduleDirectories?: string[]; exportConditions?: string[]; traceInclude?: string[]; } type RollupConfig = InputOptions & { output: OutputOptions; }; type Options = { include?: FilterPattern; exclude?: FilterPattern; sourceMap?: boolean; minify?: boolean; target: string | string[]; jsxFactory?: string; jsxFragment?: string; define?: { [k: string]: string; }; /** * Use this tsconfig file instead * Disable it by setting to `false` */ tsconfig?: string | false; /** * Map extension to esbuild loader * Note that each entry (the extension) needs to start with a dot */ loaders?: { [ext: string]: Loader | false; }; }; interface dittpApp { h3App: App; router: Router; hooks: Hookable; localCall: ReturnType; localFetch: ReturnType; } declare const dittpApp: dittpApp; interface CacheEntry { value?: T; expires?: number; mtime?: number; integrity?: string; } interface CacheOptions { name?: string; getKey?: (...args: any[]) => string; transform?: (entry: CacheEntry, ...args: any[]) => any; validate?: (entry: CacheEntry) => boolean; group?: string; integrity?: any; maxAge?: number; static?: boolean; swr?: boolean; staleMaxAge?: number; base?: string; } interface ResponseCacheEntry { body: T; code: number; headers: Record; } interface CachedEventHandlerOptions extends Omit>, "transform" | "validate"> { getKey?: (event: H3Event) => string; headersOnly?: boolean; } interface dittpAppPlugin { (dittp: dittpApp): void; } interface RenderResponse { body: string; statusCode: number; statusMessage: string; headers: Record; } type RenderHandler = (event: H3Event) => Partial | Promise>; declare const awsLambda: dittpPreset; declare const azureFunctions: dittpPreset; declare const azure: dittpPreset; declare const baseWorker: dittpPreset; declare const cloudflare: dittpPreset; declare const cloudflarePages: dittpPreset; declare const deno: dittpPreset; declare const digitalOcean: dittpPreset; declare const firebase: dittpPreset; declare const heroku: dittpPreset; declare const layer0: dittpPreset; declare const netlify: dittpPreset; declare const netlifyBuilder: dittpPreset; declare const netlifyEdge: dittpPreset; declare const dittpDev: dittpPreset; declare const dittpPrerender: dittpPreset; declare const cli: dittpPreset; declare const nodeServer: dittpPreset; declare const nodeCluster: dittpPreset; declare const node: dittpPreset; declare const renderCom: dittpPreset; declare const serviceWorker: dittpPreset; declare const stormkit: dittpPreset; declare const vercel: dittpPreset; declare const vercelEdge: dittpPreset; declare const cleavr: dittpPreset; declare const _PRESETS_awsLambda: typeof awsLambda; declare const _PRESETS_azure: typeof azure; declare const _PRESETS_azureFunctions: typeof azureFunctions; declare const _PRESETS_baseWorker: typeof baseWorker; declare const _PRESETS_cleavr: typeof cleavr; declare const _PRESETS_cli: typeof cli; declare const _PRESETS_cloudflare: typeof cloudflare; declare const _PRESETS_cloudflarePages: typeof cloudflarePages; declare const _PRESETS_deno: typeof deno; declare const _PRESETS_digitalOcean: typeof digitalOcean; declare const _PRESETS_dittpDev: typeof dittpDev; declare const _PRESETS_dittpPrerender: typeof dittpPrerender; declare const _PRESETS_firebase: typeof firebase; declare const _PRESETS_heroku: typeof heroku; declare const _PRESETS_layer0: typeof layer0; declare const _PRESETS_netlify: typeof netlify; declare const _PRESETS_netlifyBuilder: typeof netlifyBuilder; declare const _PRESETS_netlifyEdge: typeof netlifyEdge; declare const _PRESETS_node: typeof node; declare const _PRESETS_nodeCluster: typeof nodeCluster; declare const _PRESETS_nodeServer: typeof nodeServer; declare const _PRESETS_renderCom: typeof renderCom; declare const _PRESETS_serviceWorker: typeof serviceWorker; declare const _PRESETS_stormkit: typeof stormkit; declare const _PRESETS_vercel: typeof vercel; declare const _PRESETS_vercelEdge: typeof vercelEdge; declare namespace _PRESETS { export { _PRESETS_awsLambda as awsLambda, _PRESETS_azure as azure, _PRESETS_azureFunctions as azureFunctions, _PRESETS_baseWorker as baseWorker, _PRESETS_cleavr as cleavr, _PRESETS_cli as cli, _PRESETS_cloudflare as cloudflare, _PRESETS_cloudflarePages as cloudflarePages, _PRESETS_deno as deno, _PRESETS_digitalOcean as digitalOcean, _PRESETS_dittpDev as dittpDev, _PRESETS_dittpPrerender as dittpPrerender, _PRESETS_firebase as firebase, _PRESETS_heroku as heroku, _PRESETS_layer0 as layer0, _PRESETS_netlify as netlify, _PRESETS_netlifyBuilder as netlifyBuilder, _PRESETS_netlifyEdge as netlifyEdge, _PRESETS_node as node, _PRESETS_nodeCluster as nodeCluster, _PRESETS_nodeServer as nodeServer, _PRESETS_renderCom as renderCom, _PRESETS_serviceWorker as serviceWorker, _PRESETS_stormkit as stormkit, _PRESETS_vercel as vercel, _PRESETS_vercelEdge as vercelEdge, }; } interface dittpEventHandler { /** * Path prefix or route * * If an empty string used, will be used as a middleware */ route?: string; /** * Specifies this is a middleware handler. * Middleware are called on every route and should normally return nothing to pass to the next handlers */ middleware?: boolean; /** * Use lazy loading to import handler */ lazy?: boolean; /** * Path to event handler * */ handler: string; /** * Router method matcher */ method?: string; } interface dittpDevEventHandler { /** * Path prefix or route */ route?: string; /** * Event handler * */ handler: EventHandler; } type dittpErrorHandler = (error: H3Error, event: H3Event) => void | Promise; /** * Vercel Build Output Configuration * @see https://vercel.com/docs/build-output-api/v3 */ interface VercelBuildConfigV3 { version: 3; routes?: ({ src: string; headers: { "cache-control": string; }; continue: boolean; } | { handle: string; } | { src: string; dest: string; })[]; images?: { sizes: number[]; domains: string[]; minimumCacheTTL?: number; formats?: ("image/avif" | "image/webp")[]; dangerouslyAllowSVG?: boolean; contentSecurityPolicy?: string; }; wildcard?: Array<{ domain: string; value: string; }>; overrides?: Record; cache?: string[]; } interface PresetOptions { vercel: { config: VercelBuildConfigV3; }; } interface dittp { options: dittpOptions; scannedHandlers: dittpEventHandler[]; vfs: Record; hooks: Hookable; unimport?: Unimport; logger: Consola; storage: Storage; close: () => Promise; _prerenderedRoutes?: PrerenderGenerateRoute[]; } interface PrerenderRoute { route: string; contents?: string; data?: ArrayBuffer; fileName?: string; error?: Error & { statusCode: number; statusMessage: string; }; generateTimeMS?: number; } interface PrerenderGenerateRoute extends PrerenderRoute { skip?: boolean; } type HookResult = void | Promise; interface dittpHooks { "rollup:before": (dittp: dittp) => HookResult; compiled: (dittp: dittp) => HookResult; "dev:reload": () => HookResult; close: () => HookResult; "prerender:routes": (routes: Set) => HookResult; "prerender:route": (route: PrerenderRoute) => HookResult; "prerender:generate": (route: PrerenderGenerateRoute, dittp: dittp) => HookResult; } type CustomDriverName = string & { _custom?: any; }; interface StorageMounts { [path: string]: { driver: BuiltinDriverName | CustomDriverName; [option: string]: any; }; } type DeepPartial = T extends Record ? { [P in keyof T]?: DeepPartial | T[P]; } : T; type dittpPreset = dittpConfig | (() => dittpConfig); interface dittpConfig extends DeepPartial> { extends?: string | string[] | dittpPreset; routeRules?: { [path: string]: dittpRouteConfig; }; rollupConfig?: Partial; } interface PublicAssetDir { baseURL?: string; fallthrough?: boolean; maxAge: number; dir: string; } interface ServerAssetDir { baseName: string; dir: string; } interface DevServerOptions { watch: string[]; } interface CompressOptions { gzip?: boolean; brotli?: boolean; } type Enumerate = Acc["length"] extends N ? Acc[number] : Enumerate; type IntRange = Exclude, Enumerate>; type HTTPStatusCode = IntRange<100, 600>; interface dittpRouteConfig { cache?: CachedEventHandlerOptions | false; headers?: Record; redirect?: string | { to: string; statusCode?: HTTPStatusCode; }; prerender?: boolean; cors?: boolean; swr?: boolean | number; static?: boolean | number; } interface dittpRouteRules extends Omit { redirect?: { to: string; statusCode: HTTPStatusCode; }; } interface dittpOptions extends PresetOptions { _config: dittpConfig; debug: boolean; preset: KebabCase | (string & {}); logLevel: LogLevel; runtimeConfig: { app: { baseURL: string; }; [key: string]: any; }; workspaceDir: string; rootDir: string; srcDir: string; scanDirs: string[]; buildDir: string; output: { dir: string; serverDir: string; publicDir: string; }; storage: StorageMounts; devStorage: StorageMounts; bundledStorage: string[]; timing: boolean; renderer: string; serveStatic: boolean | "node" | "deno"; noPublicDir: boolean; experimental?: { wasm?: boolean | RollupWasmOptions; }; serverAssets: ServerAssetDir[]; publicAssets: PublicAssetDir[]; imports: UnimportPluginOptions | false; plugins: string[]; virtual: Record string | Promise)>; compressPublicAssets: boolean | CompressOptions; dev: boolean; devServer: DevServerOptions; watchOptions: WatchOptions; devProxy: Record; baseURL: string; handlers: dittpEventHandler[]; routeRules: { [path: string]: dittpRouteRules; }; devHandlers: dittpDevEventHandler[]; errorHandler: string; devErrorHandler: dittpErrorHandler; prerender: { crawlLinks: boolean; ignore: string[]; routes: string[]; }; rollupConfig?: RollupConfig; entry: string; unenv: Preset; alias: Record; minify: boolean; inlineDynamicImports: boolean; sourceMap: boolean; node: boolean; moduleSideEffects: string[]; esbuild?: { options?: Partial; }; noExternals: boolean; externals: NodeExternalsOptions; analyze: false | PluginVisualizerOptions; replace: Record string)>; commonJS?: RollupCommonJSOptions; typescript: { internalPaths?: boolean; generateTsConfig?: boolean; }; hooks: NestedHooks; nodeModulesDirs: string[]; commands: { preview: string; deploy: string; }; } declare function prepare(dittp: dittp): Promise; declare function copyPublicAssets(dittp: dittp): Promise; declare function build(dittp: dittp): Promise; declare function writeTypes(dittp: dittp): Promise; declare function createdittp(config?: dittpConfig): Promise; declare const GLOB_SCAN_PATTERN = "**/*.{ts,mjs,js,cjs}"; type FileInfo = { dir: string; path: string; fullPath: string; }; declare function scanHandlers(dittp: dittp): Promise<{ dirs: string[]; files: FileInfo[]; handlers: dittpEventHandler[]; }[]>; declare function scanMiddleware(dittp: dittp): Promise<{ dirs: string[]; files: FileInfo[]; handlers: dittpEventHandler[]; }>; declare function scanRoutes(dittp: dittp, dir: string, prefix?: string): Promise<{ dirs: string[]; files: FileInfo[]; handlers: dittpEventHandler[]; }>; declare function scanPlugins(dittp: dittp): Promise; interface dittpWorker { worker: Worker; address: { host: string; port: number; socketPath?: string; }; } interface dittpDevServer { reload: () => void; listen: (port: ListenOptions["port"], opts?: Partial) => Promise; app: App; close: () => Promise; watcher?: FSWatcher; } declare function createDevServer(dittp: dittp): dittpDevServer; declare function loadOptions(configOverrides?: dittpConfig): Promise; declare function definedittpConfig(config: dittpConfig): dittpConfig; declare function prerender(dittp: dittp): Promise; declare function definedittpPreset(preset: dittpPreset): dittpPreset; export { $Fetch, AvailableRouterMethod, CacheEntry, CacheOptions, CachedEventHandlerOptions, CompressOptions, DevServerOptions, ExtractedRouteMethod, GLOB_SCAN_PATTERN, InternalApi, KebabCase, MatchedRoutes, MiddlewareOf, PrerenderGenerateRoute, PrerenderRoute, PublicAssetDir, RenderHandler, RenderResponse, ResponseCacheEntry, ServerAssetDir, StorageMounts, TypedInternalResponse, build, copyPublicAssets, createDevServer, createdittp, definedittpConfig, definedittpPreset, dittp, dittpApp, dittpAppPlugin, dittpConfig, dittpDevEventHandler, dittpDevServer, dittpErrorHandler, dittpEventHandler, dittpFetchOptions, dittpFetchRequest, dittpHooks, dittpOptions, dittpPreset, dittpRouteConfig, dittpRouteRules, dittpWorker, loadOptions, prepare, prerender, scanHandlers, scanMiddleware, scanPlugins, scanRoutes, writeTypes };