import { Files } from './files';
import { Context } from './pipe';
import type { AbsolutePath } from './paths';
import type { Plug, PlugName, PlugResult } from './pipe';
/**
 * Options accepted by {@link ForkingPlug}'s instrumenting how the process
 * will be spawned (environment variables to be passed to the child process).
 */
export interface ForkOptions {
    /** The directory where coverage data will be saved */
    coverageDir?: string;
    /** Force the specified module type when dynamically transpiling TypeScript */
    forceModule?: 'commonjs' | 'module';
}
/** Fork data, from parent to child process */
export interface ForkData {
    /** Script name for the Plug to execute */
    scriptFile: AbsolutePath;
    /** Export name in the script for the Plug to execute */
    exportName: string;
    /** Plug constructor arguments */
    constructorArgs: any[];
    /** Task name (for logs) */
    taskName: string;
    /** Build file name */
    buildFile: AbsolutePath;
    /** Files directory */
    filesDir: AbsolutePath;
    /** All files to pipe */
    filesList: AbsolutePath[];
    logIndent: number;
}
/** Fork result, from child to parent process */
export interface ForkResult {
    /** If this is `true` we _might_ have `filesDir` and `filesList` */
    failed: boolean;
    /** Files directory of the result */
    filesDir?: AbsolutePath | undefined;
    /** All files returned by the plug */
    filesList?: AbsolutePath[] | undefined;
}
export declare abstract class ForkingPlug implements Plug<PlugResult> {
    private readonly _scriptFile;
    private readonly _arguments;
    private readonly _exportName;
    constructor(_scriptFile: AbsolutePath, _arguments: any[], _exportName: string);
    pipe(files: Files, context: Context): Promise<PlugResult>;
}
/**
 * Install a _forking_ {@link Plug} in the {@link Pipe}, in other words
 * execute the plug in a separate process.
 *
 * As a contract, if the _last non-null_ parameter of the constructor is an
 * object and contains the key `coverageDir`, the process will be forked with
 * the approptiately resolved `NODE_V8_COVERAGE` environment variable.
 *
 * Also, forking plugs require some special attention:
 *
 * * plug functions are not supported, only classes implementing the
 *   {@link Plug} interface can be used with this.
 *
 * * the class itself _MUST_ be exported as the _default_ export for the
 *   `scriptFile` specified below. This is to simplify interoperability between
 *   CommonJS and ESM modules as we use dynamic `import(...)` statements.
 */
export declare function installForking<Name extends PlugName>(plugName: Name, scriptFile: AbsolutePath, exportName?: string): void;
