import * as orderedmap from 'orderedmap';
import * as prosemirror_model from 'prosemirror-model';
import { Attrs, Node, Schema } from 'prosemirror-model';

declare type Tags = {
    [tag: string]: number;
};
declare type ChildSpec = string | Node | {
    flat: readonly Node[];
    tag: Tags;
};
declare type NodeBuilder = (attrsOrFirstChild?: Attrs | ChildSpec, ...children: ChildSpec[]) => Node & {
    tag: Tags;
};
declare type MarkBuilder = (attrsOrFirstChild?: Attrs | ChildSpec, ...children: ChildSpec[]) => ChildSpec;
declare type Builders<S extends Schema> = {
    schema: S;
} & {
    [key in keyof S['nodes']]: NodeBuilder;
} & {
    [key in keyof S['marks']]: MarkBuilder;
} & {
    [name: string]: NodeBuilder | MarkBuilder;
};
declare function builders<Nodes extends string = any, Marks extends string = any>(schema: Schema<Nodes, Marks>, names?: {
    [name: string]: Attrs;
}): Builders<Schema<Nodes, Marks>>;

declare const schema: Schema<keyof orderedmap.default<prosemirror_model.NodeSpec>, keyof orderedmap.default<prosemirror_model.MarkSpec>>;
declare function eq<T extends {
    eq(other: T): boolean;
}>(a: T, b: T): boolean;
declare const doc: NodeBuilder;
declare const p: NodeBuilder;
declare const code_block: NodeBuilder;
declare const pre: NodeBuilder;
declare const h1: NodeBuilder;
declare const h2: NodeBuilder;
declare const h3: NodeBuilder;
declare const li: NodeBuilder;
declare const ul: NodeBuilder;
declare const ol: NodeBuilder;
declare const img: NodeBuilder;
declare const hr: NodeBuilder;
declare const br: NodeBuilder;
declare const blockquote: NodeBuilder;
declare const a: MarkBuilder;
declare const em: MarkBuilder;
declare const strong: MarkBuilder;
declare const code: MarkBuilder;

export { MarkBuilder, NodeBuilder, a, blockquote, br, builders, code, code_block, doc, em, eq, h1, h2, h3, hr, img, li, ol, p, pre, schema, strong, ul };
