`class type mapper = object ... end`
`class type iterator = object ... end`
`class map : mapper`
`class iter : iterator`
`type t = {`

1. `use : Javascript.IdentSet.t;`
2. `def_var : Javascript.IdentSet.t;`
3. `def_local : Javascript.IdentSet.t;`

`}`
`type block =`

1. `| Catch of Javascript.formal_parameter`
2. `| Params of Javascript.formal_parameter_list`
3. `| Var_scope`
   (*

   A scope that anchors `var` declarations but has no parameters: the program top level and class static initialization blocks. Its `var`s do not propagate to an enclosing scope.

   *)
4. `| Let_scope`
   (*

   A lexical block: it anchors block-scoped (`let`/`const`/`using`) bindings. Its `var`s hoist to the nearest enclosing `Params`/`Var_scope` scope.

   *)

`class type freevar = object ... end`
`class free : freevar`
`val declared_names : Javascript.program -> Stdlib.StringSet.t`
`class fast_freevar : (string -> unit) -> iterator`
`type scope =`

1. `| Module`
2. `| Script`
3. `| Lexical_block`
4. `| Fun_block of Javascript.ident option`

`class rename_variable : esm:bool -> object ... end`
`val share_constant : Javascript.program -> Javascript.program`
`class compact_vardecl : object ... end`
`class clean : mapper`
`class simpl : mapper`