import type { LookupByPath } from '@rushstack/lookup-by-path';
import { type IFileDiffStatus } from '@rushstack/package-deps-hash';
import type { ITerminal } from '@rushstack/terminal';
import type { RushConfiguration } from '../api/RushConfiguration';
import { RushProjectConfiguration } from '../api/RushProjectConfiguration';
import type { RushConfigurationProject } from '../api/RushConfigurationProject';
import { type GetInputsSnapshotAsyncFn } from './incremental/InputsSnapshot';
/**
 * @beta
 */
export interface IGetChangedProjectsOptions {
    targetBranchName: string;
    terminal: ITerminal;
    shouldFetch?: boolean;
    variant?: string;
    /**
     * If set to `true`, consider a project's external dependency installation layout as defined in the
     * package manager lockfile when determining if it has changed.
     */
    includeExternalDependencies: boolean;
    /**
     * If set to `true` apply the `incrementalBuildIgnoredGlobs` property in a project's `rush-project.json`
     * and exclude matched files from change detection.
     */
    enableFiltering: boolean;
    /**
     * If set to `true`, excludes projects where the only changes are:
     * - A version-only change to `package.json` (only the "version" field differs)
     * - Changes to `CHANGELOG.md` and/or `CHANGELOG.json` files
     *
     * This prevents `rush version --bump` from triggering `rush change --verify` to request change files
     * for the version bumps and changelog updates it creates.
     */
    excludeVersionOnlyChanges?: boolean;
}
/**
 * @internal
 */
export interface IRawRepoState {
    projectState: Map<RushConfigurationProject, Map<string, string>> | undefined;
    rootDir: string;
    rawHashes: Map<string, string>;
}
/**
 * @beta
 */
export declare class ProjectChangeAnalyzer {
    private readonly _rushConfiguration;
    private readonly _git;
    constructor(rushConfiguration: RushConfiguration);
    /**
     * Gets a list of projects that have changed in the current state of the repo
     * when compared to the specified branch, optionally taking the shrinkwrap and settings in
     * the rush-project.json file into consideration.
     */
    getChangedProjectsAsync(options: IGetChangedProjectsOptions): Promise<Set<RushConfigurationProject>>;
    protected getChangesByProject(lookup: LookupByPath<RushConfigurationProject>, changedFiles: Map<string, IFileDiffStatus>): Map<RushConfigurationProject, Map<string, IFileDiffStatus>>;
    /**
     * Gets a snapshot of the input state of the Rush workspace that can be queried for incremental
     * build operations and use by the build cache.
     * @internal
     */
    _tryGetSnapshotProviderAsync(projectConfigurations: ReadonlyMap<RushConfigurationProject, RushProjectConfiguration>, terminal: ITerminal, projectSelection?: ReadonlySet<RushConfigurationProject>): Promise<GetInputsSnapshotAsyncFn | undefined>;
    /**
     * @internal
     */
    _filterProjectDataAsync<T>(project: RushConfigurationProject, unfilteredProjectData: Map<string, T>, rootDir: string, terminal: ITerminal): Promise<Map<string, T>>;
    private _getIgnoreMatcherForProjectAsync;
}
/**
 * Compares two package.json file contents and determines if the only difference is the "version" field.
 * @param oldPackageJsonContent - The old package.json content as a string
 * @param newPackageJsonContent - The new package.json content as a string
 * @returns true if the only difference is the version field, false otherwise
 */
export declare function isPackageJsonVersionOnlyChange(oldPackageJsonContent: string, newPackageJsonContent: string): boolean;
//# sourceMappingURL=ProjectChangeAnalyzer.d.ts.map