import type { OmniaPluginOptions } from '../plugins';
export interface ResolverInstance<Name extends string> extends ResolverConfig {
    name: Name;
}
export interface ResolverConfig {
    test(source: string, importer: string, fileGraph: FileGraph, ctx: RuntimeContext, fromWorker: boolean): boolean;
    resolve(source: string, importer: string, fileGraph: FileGraph, ctx: RuntimeContext, fromWorker: boolean): string | Promise<string>;
}
export type Resolver<Name extends string, Args extends any[]> = (...args: Args) => ResolverInstance<Name>;
export interface TransformerInstance<Name extends string> extends TransformerConfig {
    name: Name;
}
export interface TransformerConfig {
    test(code: string, id: string, fileGraph: FileGraph, ctx: RuntimeContext, fromWorker: boolean): boolean;
    transform(code: string, id: string, fileGraph: FileGraph, ctx: RuntimeContext, fromWorker: boolean): string | Promise<string>;
}
export type Transformer<Name extends string, Args extends any[], R> = (...args: Args) => R extends Promise<any> ? Promise<TransformerInstance<Name>> : TransformerInstance<Name>;
export interface OmniaHmrConfig {
    alias: Record<string, string>;
    resolvers: Array<ResolverInstance<any>>;
    transformers: Array<TransformerInstance<any> | Promise<TransformerInstance<any>>>;
}
export interface RuntimeContext {
    options: OmniaPluginOptions;
    serviceId: string;
    alias: Record<string, string>;
    toModuleId(unknownId: string): string;
    toFileGraphId(unknownId: string): string;
    getFileGraph(unknownId: string): FileGraph;
}
export interface FileGraph {
    id: string;
    entry: boolean;
    preBundled: boolean;
    extension: string;
    resourceId: string;
    connectedResourceIds: Array<string>;
    importers: Array<string>;
    exporters: Array<string>;
    js: FileGraphJavaScript;
    bareImport: boolean;
    timestamp?: number;
}
export interface FileGraphJavaScript {
    scanned: boolean;
    empty: boolean;
    bareImportVariable?: string;
    bareImportDynamicResourceId?: string;
    metadata?: ModuleJS;
}
export interface ModuleJS {
    importPaths: Array<string>;
    exportPaths: Array<string>;
    namedExports: Array<string>;
    imports: {
        namedVariables: Array<ImportedNamedVariableJS>;
        wildcardVariables: Array<ImportedWildcardVariableJS>;
        defaultVariables: Array<ImportedDefaultVariableJS>;
        noneVariables: Array<ImportedNoneVariableJS>;
    };
    exports: {
        locals: Array<string>;
        localNamedVariables: Array<ExportedLocalNamedVariableJS>;
        externalNamedVariables: Array<ExportedExternalNamedVariableJS>;
        wildcardVariables: Array<ExportedWildcardVariableJS>;
        wildcards: Array<ExportedWildcardJS>;
        default: DefaultExportJS;
    };
    requires: Array<CommonJsRequireJS>;
}
export interface DefaultExportJS {
    available: boolean;
    wildcard: ExportedWildcardVariableJS;
    nameless: boolean;
    original?: string;
    path?: string;
}
export interface NamedVariablesValueJS {
    values: Array<string>;
    asValues: Record<string, string>;
}
export interface PathValueJS {
    statement: string;
    path: string;
    rawPath: string;
}
export interface NamedVariableJS {
    value: string;
    original?: string;
}
export interface ImportedNamedVariableJS extends NamedVariablesValueJS, PathValueJS {
}
export interface ImportedWildcardVariableJS extends PathValueJS {
    value: string;
}
export interface ImportedDefaultVariableJS extends PathValueJS {
    default: string;
}
export interface ImportedNoneVariableJS extends PathValueJS {
}
export interface ExportedExternalNamedVariableJS extends NamedVariablesValueJS, PathValueJS {
    default?: string;
}
export interface ExportedLocalNamedVariableJS extends NamedVariablesValueJS {
    default?: string;
}
export interface ExportedWildcardVariableJS extends PathValueJS {
    value: string;
    defaultAvailable: boolean;
}
export interface ExportedWildcardJS extends PathValueJS {
}
export interface CommonJsRequireJS extends PathValueJS {
}
