code: function transform(ast, opts) {
    if (opts !== exports.BYPASS_OPTIONS) {
      _options.set(opts);
    }
    // we store this here to avoid calling `_options.get` for each token
    _shouldRemoveTrailingWs = Boolean(_options.get('whiteSpace.removeTrailing'));
  
    plugins.transformBefore(ast);
  
    _tk.eachInBetween(ast.startToken, ast.endToken, preprocessToken);
    rocambole.moonwalk(ast, transformNode);
    _tk.eachInBetween(ast.startToken, ast.endToken, postprocessToken);
    _br.limitBeforeEndOfFile(ast);
  
    // indent should come after all other transformations since it depends on
    // line breaks caused by "parent" nodes, otherwise it will cause conflicts.
    // it should also happen after the postprocessToken since it adds line breaks
    // before/after comments and that changes the indent logic
    indent.transform(ast);
  
    // plugin transformation comes after the indentation since we assume user
    // knows what he is doing (will increase flexibility and allow plugin to
    // override the indentation logic)
    // we have an alias "transform" to match v0.3 API, but favor `transformAfter`
    // moving forward. (we might deprecate "transform" in the future)
    plugins.transform(ast);
    plugins.transformAfter(ast);
  
    return ast;
  }
docs: ---