import * as ts from "typescript";
import { type ModuleResolver } from "./resolve.ts";
export interface Replacement {
    start: number;
    end: number;
    replacement: string;
}
export type Replacements = Record<string, Replacement[]>;
export declare function assertNoSyntaxErrors(tsCode: string): void;
export declare function eraseTypes(tsCode: string): string;
export declare function query<R extends ts.Node>(root: ts.Node, query: ts.SyntaxKind, filter?: (node: R) => boolean): R[];
export declare function getEnclosingImportDeclaration(node: ts.Node): ts.ImportDeclaration;
export declare function getEnclosingStatement(node: ts.Node): ts.Statement;
type ImportNode = ts.ImportSpecifier | ts.ImportClause | ts.NamespaceImport;
export declare const isImportNode: (node: ts.Node) => node is ImportNode;
export declare function isNodeModules(filePath: string): boolean;
interface BaseConfig {
    resolver?: ModuleResolver;
}
interface ConfigByConfig extends BaseConfig {
    rootDir: string;
    tsconfig: ts.CompilerOptions;
    tsConfigPath?: never;
}
interface ConfigByPath extends BaseConfig {
    rootDir?: never;
    tsconfig?: never;
    tsconfigPath: string;
}
interface ConfigByImplicitConfig extends BaseConfig {
    rootDir?: never;
    tsconfig?: never;
    tsconfigPath?: never;
}
export type Filterable<T> = T & {
    filter?: (id: string) => boolean;
};
export type GetComptimeReplacementsOpts = ConfigByConfig | ConfigByPath | ConfigByImplicitConfig;
export declare function getTsConfig(opts?: GetComptimeReplacementsOpts): {
    configDir: string;
    tsConfig: ts.CompilerOptions;
};
export declare function getComptimeReplacements(opts?: Filterable<GetComptimeReplacementsOpts>): Promise<Replacements>;
export type ApplyComptimeReplacementsOpts = GetComptimeReplacementsOpts & {
    /** Default: `$configDir/out` */
    outdir?: string;
};
export declare function applyComptimeReplacements(opts: Filterable<ApplyComptimeReplacementsOpts>, replacements: Replacements): Promise<void>;
export {};
