import type { NextConfigComplete } from '../../server/config-shared'; import type { __ApiPreviewProps } from '../../server/api-utils'; import type { ExternalObject, RefCell, NapiTurboEngineOptions, NapiSourceDiagnostic } from './generated-native'; export type { NapiTurboEngineOptions as TurboEngineOptions }; export type Lockfile = { __napiType: 'Lockfile'; }; export interface Binding { isWasm: boolean; turbo: { createProject(options: ProjectOptions, turboEngineOptions?: NapiTurboEngineOptions): Promise; startTurbopackTraceServer(traceFilePath: string, port: number | undefined): void; nextBuild?: any; }; mdx: { compile(src: string, options: any): any; compileSync(src: string, options: any): any; }; minify(src: string, options: any): Promise; minifySync(src: string, options: any): any; transform(src: string, options: any): Promise; transformSync(src: string, options: any): any; parse(src: string, options: any): Promise; getTargetTriple(): string | undefined; initCustomTraceSubscriber?(traceOutFilePath?: string): ExternalObject; teardownTraceSubscriber?(guardExternal: ExternalObject): void; css: { lightning: { transform(transformOptions: any): Promise; transformStyleAttr(transformAttrOptions: any): Promise; }; }; reactCompiler: { isReactCompilerRequired(filename: string): Promise; }; rspack: { getModuleNamedExports(resourcePath: string): Promise; warnForEdgeRuntime(source: string, isProduction: boolean): Promise; }; expandNextJsTemplate(content: Buffer, templatePath: string, nextPackageDirPath: string, replacements: Record<`VAR_${string}`, string>, injections: Record, imports: Record): string; lockfileTryAcquire(path: string): Promise; lockfileTryAcquireSync(path: string): Lockfile | null; lockfileUnlock(lockfile: Lockfile): Promise; lockfileUnlockSync(lockfile: Lockfile): void; } export type StyledString = { type: 'text'; value: string; } | { type: 'code'; value: string; } | { type: 'strong'; value: string; } | { type: 'stack'; value: StyledString[]; } | { type: 'line'; value: StyledString[]; }; export interface Issue { severity: string; stage: string; filePath: string; title: StyledString; description?: StyledString; detail?: StyledString; source?: { source: { ident: string; content?: string; }; range?: { start: { line: number; column: number; }; end: { line: number; column: number; }; }; }; documentationLink: string; importTraces?: PlainTraceItem[][]; } export interface PlainTraceItem { fsName: string; path: string; rootPath: string; layer?: string; } export interface Diagnostics { category: string; name: string; payload: unknown; } export type TurbopackResult = T & { issues: Issue[]; diagnostics: Diagnostics[]; }; export interface Middleware { endpoint: Endpoint; isProxy: boolean; } export interface Instrumentation { nodeJs: Endpoint; edge: Endpoint; } export interface RawEntrypoints { routes: Map; middleware?: Middleware; instrumentation?: Instrumentation; pagesDocumentEndpoint: Endpoint; pagesAppEndpoint: Endpoint; pagesErrorEndpoint: Endpoint; } interface BaseUpdate { resource: { headers: unknown; path: string; }; diagnostics: unknown[]; issues: Issue[]; } interface IssuesUpdate extends BaseUpdate { type: 'issues'; } interface EcmascriptMergedUpdate { type: 'EcmascriptMergedUpdate'; chunks: { [moduleName: string]: { type: 'partial'; }; }; entries: { [moduleName: string]: { code: string; map: string; url: string; }; }; } interface PartialUpdate extends BaseUpdate { type: 'partial'; instruction: { type: 'ChunkListUpdate'; merged: EcmascriptMergedUpdate[] | undefined; }; } export type Update = IssuesUpdate | PartialUpdate; export interface HmrIdentifiers { identifiers: string[]; } /** @see https://github.com/vercel/next.js/blob/415cd74b9a220b6f50da64da68c13043e9b02995/packages/next-swc/crates/napi/src/next_api/project.rs#L824-L833 */ export interface TurbopackStackFrame { isServer: boolean; isInternal?: boolean; file: string; originalFile?: string; /** 1-indexed, unlike source map tokens */ line?: number; /** 1-indexed, unlike source map tokens */ column?: number; methodName?: string; } export type UpdateMessage = { updateType: 'start'; } | { updateType: 'end'; value: UpdateInfo; }; export type CompilationEvent = { typeName: string; message: string; severity: string; eventData: any; }; export interface UpdateInfo { duration: number; tasks: number; } export interface Project { update(options: Partial): Promise; writeAllEntrypointsToDisk(appDirOnly: boolean): Promise>>; entrypointsSubscribe(): AsyncIterableIterator>; hmrEvents(identifier: string): AsyncIterableIterator>; hmrIdentifiersSubscribe(): AsyncIterableIterator>; getSourceForAsset(filePath: string): Promise; getSourceMap(filePath: string): Promise; getSourceMapSync(filePath: string): string | null; traceSource(stackFrame: TurbopackStackFrame, currentDirectoryFileUrl: string): Promise; updateInfoSubscribe(aggregationMs: number): AsyncIterableIterator>; compilationEventsSubscribe(eventTypes?: string[]): AsyncIterableIterator>; invalidateFileSystemCache(): Promise; shutdown(): Promise; onExit(): Promise; } export type Route = { type: 'conflict'; } | { type: 'app-page'; pages: { originalName: string; htmlEndpoint: Endpoint; rscEndpoint: Endpoint; }[]; } | { type: 'app-route'; originalName: string; endpoint: Endpoint; } | { type: 'page'; htmlEndpoint: Endpoint; dataEndpoint: Endpoint; } | { type: 'page-api'; endpoint: Endpoint; }; export interface Endpoint { /** Write files for the endpoint to disk. */ writeToDisk(): Promise>; /** * Listen to client-side changes to the endpoint. * After clientChanged() has been awaited it will listen to changes. * The async iterator will yield for each change. */ clientChanged(): Promise>; /** * Listen to server-side changes to the endpoint. * After serverChanged() has been awaited it will listen to changes. * The async iterator will yield for each change. */ serverChanged(includeIssues: boolean): Promise>; } interface EndpointConfig { dynamic?: 'auto' | 'force-dynamic' | 'error' | 'force-static'; dynamicParams?: boolean; revalidate?: 'never' | 'force-cache' | number; fetchCache?: 'auto' | 'default-cache' | 'only-cache' | 'force-cache' | 'default-no-store' | 'only-no-store' | 'force-no-store'; runtime?: 'nodejs' | 'edge'; preferredRegion?: string; } export type ServerPath = { path: string; contentHash: string; }; export type WrittenEndpoint = { type: 'nodejs'; /** The entry path for the endpoint. */ entryPath: string; /** All client paths that have been written for the endpoint. */ clientPaths: string[]; /** All server paths that have been written for the endpoint. */ serverPaths: ServerPath[]; config: EndpointConfig; } | { type: 'edge'; /** All client paths that have been written for the endpoint. */ clientPaths: string[]; /** All server paths that have been written for the endpoint. */ serverPaths: ServerPath[]; config: EndpointConfig; } | { type: 'none'; clientPaths: []; serverPaths: []; config: EndpointConfig; }; export interface ProjectOptions { /** * An absolute root path (Unix or Windows path) from which all files must be nested under. Trying * to access a file outside this root will fail, so think of this as a chroot. * E.g. `/home/user/projects/my-repo`. */ rootPath: string; /** * A path which contains the app/pages directories, relative to `root_path`, always a Unix path. * E.g. `apps/my-app` */ projectPath: string; /** * A path where to emit the build outputs, relative to [`Project::project_path`], always a Unix * path. Corresponds to next.config.js's `distDir`. * E.g. `.next` */ distDir: string; /** * The next.config.js contents. */ nextConfig: NextConfigComplete; /** * A map of environment variables to use when compiling code. */ env: Record; defineEnv: DefineEnv; /** * Whether to watch the filesystem for file changes. */ watch: { enable: boolean; pollIntervalMs?: number; }; /** * The mode in which Next.js is running. */ dev: boolean; /** * The server actions encryption key. */ encryptionKey: string; /** * The build id. */ buildId: string; /** * Options for draft mode. */ previewProps: __ApiPreviewProps; /** * The browserslist query to use for targeting browsers. */ browserslistQuery: string; /** * When the code is minified, this opts out of the default mangling of local * names for variables, functions etc., which can be useful for * debugging/profiling purposes. */ noMangling: boolean; /** * The version of Node.js that is available/currently running. */ currentNodeJsVersion: string; } export interface DefineEnv { client: RustifiedOptionalEnv; edge: RustifiedOptionalEnv; nodejs: RustifiedOptionalEnv; } export type RustifiedEnv = { name: string; value: string; }[]; export type RustifiedOptionalEnv = { name: string; value: string | undefined; }[]; export interface GlobalEntrypoints { app: Endpoint | undefined; document: Endpoint | undefined; error: Endpoint | undefined; middleware: Middleware | undefined; instrumentation: Instrumentation | undefined; } export type PageRoute = { type: 'page'; htmlEndpoint: Endpoint; dataEndpoint: Endpoint; } | { type: 'page-api'; endpoint: Endpoint; }; export type AppRoute = { type: 'app-page'; htmlEndpoint: Endpoint; rscEndpoint: Endpoint; } | { type: 'app-route'; endpoint: Endpoint; }; export type PageEntrypoints = Map; export type AppEntrypoints = Map; export type Entrypoints = { global: GlobalEntrypoints; page: PageEntrypoints; app: AppEntrypoints; };