import * as ts from 'typescript';
import * as tss from 'typescript/lib/tsserverlibrary';
import type { SchematicContext, Tree } from '@angular-devkit/schematics';
import type { WorkspaceSchema } from '@schematics/angular/utility/workspace-models';
import { ClassChanges, BindingChanges, SelectorChange, SelectorChanges, ThemeChanges, ImportsChanges, MemberChanges, ThemeChange } from './schema';
import { ServerHost } from './ServerHost';
export declare enum InputPropertyType {
    EVAL = "eval",
    STRING = "string"
}
declare type TransformFunction = (args: BoundPropertyObject) => void;
export interface BoundPropertyObject {
    value: string;
    bindingType: InputPropertyType;
}
export declare class UpdateChanges {
    private rootPath;
    private host;
    private context?;
    protected tsconfigPath: string;
    _shouldInvokeLS: boolean;
    get shouldInvokeLS(): boolean;
    set shouldInvokeLS(val: boolean);
    get projectService(): tss.server.ProjectService;
    protected get serverHost(): ServerHost;
    protected workspace: WorkspaceSchema;
    protected sourcePaths: string[];
    protected classChanges: ClassChanges;
    protected outputChanges: BindingChanges;
    protected inputChanges: BindingChanges;
    protected selectorChanges: SelectorChanges;
    protected themeChanges: ThemeChanges;
    protected importsChanges: ImportsChanges;
    protected membersChanges: MemberChanges;
    protected conditionFunctions: Map<string, (...args: any[]) => any>;
    protected valueTransforms: Map<string, TransformFunction>;
    private _templateFiles;
    private _initialTsConfig;
    get templateFiles(): string[];
    private _tsFiles;
    get tsFiles(): string[];
    private _sassFiles;
    /** Sass (both .scss and .sass) files in the project being updated. */
    get sassFiles(): string[];
    private _service;
    get service(): ts.LanguageService;
    private _packageManager;
    private get packageManager();
    /**
     * Create a new base schematic to apply changes
     *
     * @param rootPath Root folder for the schematic to read configs, pass __dirname
     */
    constructor(rootPath: string, host: Tree, context?: SchematicContext);
    /** Apply configured changes to the Host Tree */
    applyChanges(): void;
    /** Add condition function. */
    addCondition(conditionName: string, callback: (ownerMatch: string, path: string) => boolean): void;
    addValueTransform(functionName: string, callback: TransformFunction): void;
    /** Path must be absolute. If calling externally, use this.getAbsolutePath */
    protected getDefaultLanguageService(entryPath: string): tss.LanguageService | undefined;
    protected updateSelectors(entryPath: string): void;
    protected applySelectorChange(fileContent: string, change: SelectorChange): string;
    protected updateClasses(entryPath: string): void;
    protected updateBindings(entryPath: string, bindChanges: BindingChanges, type?: BindingType): void;
    protected updateThemeProps(entryPath: string): void;
    protected isNamedArgument(fileContent: string, i: number, occurrences: number[], change: ThemeChange): boolean;
    protected updateSassVariables(entryPath: string): void;
    protected updateSassFunctionsAndMixins(entryPath: string): void;
    protected getAliases(entryPath: string): any[];
    protected updateImports(entryPath: string): void;
    protected updateClassMembers(entryPath: string, memberChanges: MemberChanges): void;
    private tryReplaceScssFunctionWithAlias;
    private tryReplaceScssFunction;
    private patchTsConfig;
    private ensureTsConfigPath;
    private loadConfig;
    private areConditionsFulfilled;
    private copyPropertyValueBetweenElementTags;
    private sourceDirsVisitor;
    /**
     * Safe split by `','`, considering possible inner function calls. E.g.:
     * ```
     * prop: inner-func(),
     * prop2: inner2(inner-param: 3, inner-param: inner-func(..))
     * ```
     */
    private splitFunctionProps;
    private updateTemplateFiles;
    private updateTsFiles;
    private updateMembers;
    private getDefaultProjectForFile;
    /**
     * Force Angular service to compile project on initial load w/ configured project
     * otherwise if the first compilation occurs on an HTML file the project won't have proper refs
     * and no actual angular metadata will be resolved for the rest of the migration
     */
    private configureForAngularLS;
    private getWorkspaceProjectEntryPath;
}
export declare enum BindingType {
    Output = 0,
    Input = 1
}
export {};
