declare module "jsb.editor.codegen" {
    import type { ExtractValueKeys, GArray, GDictionary, Node, PropertyInfo, Resource, ResourceTypes, Script } from "godot";
    import type * as GodotJsb from "godot-jsb";
    export enum DescriptorType {
        Godot = 0,
        User = 1,
        FunctionLiteral = 2,
        ObjectLiteral = 3,
        StringLiteral = 4,
        NumericLiteral = 5,
        BooleanLiteral = 6,
        Union = 7,
        Intersection = 8,
        Conditional = 9,
        Tuple = 10,
        Infer = 11,
        Mapped = 12,
        Indexed = 13
    }
    /**
     * Reference to a built-in type, either declared in the 'godot' namespace, or available as part of the standard library.
     */
    export type GodotTypeDescriptor = GDictionary<{
        type: DescriptorType.Godot;
        name: string;
        /**
         * Generic arguments.
         */
        arguments?: GArray<TypeDescriptor>;
    }>;
    /**
     * Reference to a user defined type. A path must be specified so that the generated code is able to import the file
     * where the type is declared/exported.
     */
    export type UserTypeDescriptor = GDictionary<{
        type: DescriptorType.User;
        /**
         * res:// style path to the TypeScript module where this type is exported.
         */
        resource: ExtractValueKeys<ResourceTypes, Script>;
        /**
         * Preferred type name to use when importing.
         */
        name: string;
        /**
         * Named module export that is being imported. When omitted, the default export is imported.
         */
        export?: string;
        /**
         * Generic arguments.
         */
        arguments?: GArray<TypeDescriptor>;
    }>;
    export type GenericParameterDescriptor = GDictionary<{
        name: string;
        extends?: TypeDescriptor;
        default?: TypeDescriptor;
    }>;
    export type ParameterDescriptor = GDictionary<{
        name: string;
        type: TypeDescriptor;
        optional?: boolean;
    }>;
    export type FunctionLiteralTypeDescriptor = GDictionary<{
        type: DescriptorType.FunctionLiteral;
        generics?: GArray<GenericParameterDescriptor>;
        parameters?: GArray<ParameterDescriptor>;
        returns?: TypeDescriptor;
    }>;
    export type OptionalTypeDescriptor<Descriptor extends GDictionary> = Descriptor extends GDictionary<infer T> ? GDictionary<T & {
        optional?: boolean;
    }> : never;
    export type ObjectLiteralTypeDescriptor = GDictionary<{
        type: DescriptorType.ObjectLiteral;
        properties?: GDictionary<Partial<Record<string, OptionalTypeDescriptor<TypeDescriptor>>>>;
        index?: GDictionary<{
            key: TypeDescriptor;
            value: TypeDescriptor;
        }>;
    }>;
    export type StringLiteralTypeDescriptor = GDictionary<{
        type: DescriptorType.StringLiteral;
        value: string;
        template?: boolean;
    }>;
    export type NumberLiteralTypeDescriptor = GDictionary<{
        type: DescriptorType.NumericLiteral;
        value: number;
    }>;
    export type BooleanLiteralTypeDescriptor = GDictionary<{
        type: DescriptorType.BooleanLiteral;
        value: boolean;
    }>;
    export type TupleElementDescriptor = GDictionary<{
        name?: string;
        type: TypeDescriptor;
    }>;
    export type TupleTypeDescriptor = GDictionary<{
        type: DescriptorType.Tuple;
        elements: GArray<TupleElementDescriptor>;
    }>;
    export type UnionTypeDescriptor = GDictionary<{
        type: DescriptorType.Union;
        types: GArray<TypeDescriptor>;
    }>;
    export type IntersectionTypeDescriptor = GDictionary<{
        type: DescriptorType.Intersection;
        types: GArray<TypeDescriptor>;
    }>;
    export type InferTypeDescriptor = GDictionary<{
        type: DescriptorType.Infer;
        name: string;
    }>;
    export type ConditionalTypeDescriptor = GDictionary<{
        type: DescriptorType.Conditional;
        check: TypeDescriptor;
        extends: TypeDescriptor;
        true: TypeDescriptor;
        false: TypeDescriptor;
    }>;
    export type MappedTypeDescriptor = GDictionary<{
        type: DescriptorType.Mapped;
        key: string;
        in: TypeDescriptor;
        as?: TypeDescriptor;
        value: TypeDescriptor;
    }>;
    export type IndexedTypeDescriptor = GDictionary<{
        type: DescriptorType.Indexed;
        base: TypeDescriptor;
        index: TypeDescriptor;
    }>;
    export type TypeDescriptor = GodotTypeDescriptor | UserTypeDescriptor | FunctionLiteralTypeDescriptor | ObjectLiteralTypeDescriptor | StringLiteralTypeDescriptor | NumberLiteralTypeDescriptor | BooleanLiteralTypeDescriptor | TupleTypeDescriptor | UnionTypeDescriptor | IntersectionTypeDescriptor | InferTypeDescriptor | ConditionalTypeDescriptor | MappedTypeDescriptor | IndexedTypeDescriptor;
    /**
     * Codegen analogue of NodePathMap.
     */
    export type NodeTypeDescriptorPathMap = GDictionary<Partial<Record<string, TypeDescriptor>>>;
    export enum CodeGenType {
        ScriptNodeTypeDescriptor = 0,
        ScriptResourceTypeDescriptor = 1
    }
    /**
     * Handle a NodeTypeDescriptorCodeGenRequest to overwrite the generated type for nodes using this script.
     */
    export type ScriptNodeTypeDescriptorCodeGenRequest = GDictionary<{
        type: CodeGenType.ScriptNodeTypeDescriptor;
        node: Node;
        children: NodeTypeDescriptorPathMap;
    }>;
    /**
     * Handle a ScriptResourceTypeDescriptorCodeGenRequest to overwrite the generated type for resources using this script.
     */
    export type ScriptResourceTypeDescriptorCodeGenRequest = GDictionary<{
        type: CodeGenType.ScriptResourceTypeDescriptor;
        resource: Resource;
    }>;
    export type CodeGenRequest = ScriptNodeTypeDescriptorCodeGenRequest | ScriptResourceTypeDescriptorCodeGenRequest;
    /**
     * You can manipulate GodotJS' codegen by exporting a function from your script/module called `codegen`.
     */
    export type CodeGenHandler = (request: CodeGenRequest) => undefined | TypeDescriptor;
    export class TypeDB {
        singletons: {
            [name: string]: GodotJsb.editor.SingletonInfo;
        };
        classes: {
            [name: string]: GodotJsb.editor.ClassInfo;
        };
        primitive_types: {
            [name: string]: GodotJsb.editor.PrimitiveClassInfo;
        };
        globals: {
            [name: string]: GodotJsb.editor.GlobalConstantInfo;
        };
        utilities: {
            [name: string]: GodotJsb.editor.MethodBind;
        };
        class_docs: {
            [name: string]: GodotJsb.editor.ClassDoc | false;
        };
        constructor();
        find_doc(class_name: string): GodotJsb.editor.ClassDoc | undefined;
        is_primitive_type(name: string): boolean;
        is_valid_method_name(name: string): boolean;
        make_classname(class_name: string, internal?: boolean): string;
        make_typename(info: PropertyInfo, used_as_input: boolean, non_nullable: boolean): string;
        make_arg(info: PropertyInfo, optional?: boolean): string;
        make_literal_value(value: GodotJsb.editor.DefaultArgumentInfo): string;
        make_arg_default_value(method_info: GodotJsb.editor.MethodBind, index: number): string;
        make_args(method_info: GodotJsb.editor.MethodBind): string;
        make_return(method_info: GodotJsb.editor.MethodBind): string;
        make_signal_type(method_info: GodotJsb.editor.MethodBind): string;
    }
    export class TSDCodeGen {
        private _split_index;
        private _out_dir;
        private _splitter;
        private _types;
        private _use_project_settings;
        constructor(outDir: string, use_project_settings: boolean);
        private make_path;
        private new_splitter;
        private split;
        private cleanup;
        has_class(name?: string): boolean;
        emit(): Promise<void>;
        private emit_utility;
        private emit_global;
        private emit_aliases;
        private emit_singleton;
        private emit_godot_primitive;
        private emit_godot_class;
    }
    export class SceneTSDCodeGen {
        private _out_dir;
        private _scene_paths;
        private _types;
        constructor(out_dir: string, scene_paths: string[]);
        private make_scene_path;
        emit(): Promise<void>;
        private emit_children_node_types;
        private emit_scene_node_types;
    }
    export class ResourceTSDCodeGen {
        private _out_dir;
        private _resource_paths;
        private _types;
        constructor(out_dir: string, resource_paths: string[]);
        private make_resource_path;
        emit(): Promise<void>;
        private emit_resource_type;
    }
}
declare module "jsb.editor.main" {
    import { PackedStringArray } from "godot";
    export function auto_complete(pattern: string): PackedStringArray;
    export function run_npm_install(): void;
}
