import { ProjectKind } from './project-kind';
/** Lazily read a shiny-entry file's content; returns `undefined` when it cannot be read. */
export type ContentReader = () => string | undefined;
/** The evidence {@link classifyProjectKind} works from. */
export interface ProjectKindSignals {
    /** lower-cased basenames of every file known so far */
    readonly names: ReadonlySet<string>;
    /** shiny-entry basename to a reader for its content */
    readonly entries: ReadonlyMap<string, ContentReader>;
    /** the lower-cased `Type:` of each known `DESCRIPTION` (`''` when absent) */
    readonly descriptionTypes: readonly string[];
    /** how many `DESCRIPTION` files are known */
    readonly descriptionCount: number;
}
/** The configurable classification inputs, from `project.classification`. */
export interface ClassificationConfig {
    readonly shinyDescriptionTypes?: readonly string[];
    readonly shinyEntryFiles?: readonly string[];
    readonly shinyUsagePattern?: string;
    readonly notebookExtensions?: readonly string[];
}
/** {@link ClassificationConfig} resolved to matchers, falling back to the built-in defaults. */
export interface ResolvedClassifyOptions {
    readonly shinyDescriptionTypes: ReadonlySet<string>;
    readonly shinyEntryFiles: ReadonlySet<string>;
    readonly shinyUsage: RegExp;
    readonly notebookExtension: RegExp;
}
/** Resolve {@link ClassificationConfig} into {@link ResolvedClassifyOptions}, using the built-in defaults for unset fields. */
export declare function resolveClassifyOptions(cfg?: ClassificationConfig): ResolvedClassifyOptions;
/**
 * Whether the project is a shiny app: it has the canonical entry files (a single `app.R`, or the `ui.R`+`server.R`
 * pair) and one of them uses the shiny stack. When no entry file can be read we trust the file names alone.
 */
export declare function isShinyAppSignals(names: ReadonlySet<string>, entries: ReadonlyMap<string, ContentReader>, shinyUsagePattern?: RegExp): boolean;
/**
 * Classify the {@link ProjectKind} from the given {@link ProjectKindSignals}. Shiny apps are detected first (they
 * often ship a `DESCRIPTION` too), then packages, then notebooks; the rest is a single-file `Script` or a `Project`.
 */
export declare function classifyProjectKind(signals: ProjectKindSignals, opts?: ResolvedClassifyOptions): ProjectKind;
