import type { ScopeValueSets, NameValue, ValueScope, ValueScopeName } from "./scope"; import { _Code, Code, Name } from "./code"; import { Scope } from "./scope"; export { _, str, strConcat, nil, getProperty, stringify, regexpCode, Name, Code } from "./code"; export { Scope, ScopeStore, ValueScope, ValueScopeName, ScopeValueSets, varKinds } from "./scope"; export declare type SafeExpr = Code | number | boolean | null; export declare type Block = Code | (() => void); export declare const operators: { GT: _Code; GTE: _Code; LT: _Code; LTE: _Code; EQ: _Code; NEQ: _Code; NOT: _Code; OR: _Code; AND: _Code; ADD: _Code; }; export interface CodeGenOptions { es5?: boolean; lines?: boolean; ownProperties?: boolean; } export declare class CodeGen { readonly _scope: Scope; readonly _extScope: ValueScope; readonly _values: ScopeValueSets; private readonly _nodes; private readonly _blockStarts; private readonly _constants; private readonly opts; constructor(extScope: ValueScope, opts?: CodeGenOptions); toString(): string; name(prefix: string): Name; scopeName(prefix: string): ValueScopeName; scopeValue(prefixOrName: ValueScopeName | string, value: NameValue): Name; getScopeValue(prefix: string, keyOrRef: unknown): ValueScopeName | undefined; scopeRefs(scopeName: Name): Code; scopeCode(): Code; private _def; const(nameOrPrefix: Name | string, rhs: SafeExpr, _constant?: boolean): Name; let(nameOrPrefix: Name | string, rhs?: SafeExpr, _constant?: boolean): Name; var(nameOrPrefix: Name | string, rhs?: SafeExpr, _constant?: boolean): Name; assign(lhs: Code, rhs: SafeExpr, sideEffects?: boolean): CodeGen; add(lhs: Code, rhs: SafeExpr): CodeGen; code(c: Block | SafeExpr): CodeGen; object(...keyValues: [Name | string, SafeExpr | string][]): _Code; if(condition: Code | boolean, thenBody?: Block, elseBody?: Block): CodeGen; elseIf(condition: Code | boolean): CodeGen; else(): CodeGen; endIf(): CodeGen; private _for; for(iteration: Code, forBody?: Block): CodeGen; forRange(nameOrPrefix: Name | string, from: SafeExpr, to: SafeExpr, forBody: (index: Name) => void, varKind?: Code): CodeGen; forOf(nameOrPrefix: Name | string, iterable: Code, forBody: (item: Name) => void, varKind?: Code): CodeGen; forIn(nameOrPrefix: Name | string, obj: Code, forBody: (item: Name) => void, varKind?: Code): CodeGen; endFor(): CodeGen; label(label: Name): CodeGen; break(label?: Code): CodeGen; return(value: Block | SafeExpr): CodeGen; try(tryBody: Block, catchCode?: (e: Name) => void, finallyCode?: Block): CodeGen; throw(error: Code): CodeGen; block(body?: Block, nodeCount?: number): CodeGen; endBlock(nodeCount?: number): CodeGen; func(name: Name, args?: Code, async?: boolean, funcBody?: Block): CodeGen; endFunc(): CodeGen; optimize(n?: number): void; private _leafNode; private _blockNode; private _endBlockNode; private _elseNode; private get _root(); private get _currNode(); private set _currNode(value); } export declare function not(x: T): T; export declare function and(...args: Code[]): Code; export declare function or(...args: Code[]): Code;