1. @override
APIDocument documentAPI(PackagePathResolver resolver)

Returns an entire APIDocument describing an OpenAPI specification.

This method is typically invoked on a RequestSink. This method is invoked on root of documentable chain, RequestSink.

Source

@override
APIDocument documentAPI(PackagePathResolver resolver) {
  var doc = new APIDocument()..info = apiInfo;

  doc.paths = initialController.documentPaths(resolver);
  doc.securitySchemes = this.documentSecuritySchemes(resolver);

  var host = new Uri(scheme: "http", host: "localhost");
  if (doc.hosts.length > 0) {
    host = doc.hosts.first.uri;
  }

  doc.securitySchemes?.values?.forEach((scheme) {
    if (scheme.isOAuth2) {
      var authCodePath = _authorizationPath(doc.paths);
      if (authCodePath != null) {
        scheme.authorizationURL = host.resolve(authCodePath).toString();
      }

      var tokenPath = _authorizationTokenPath(doc.paths);
      if (tokenPath != null) {
        scheme.tokenURL = host.resolve(tokenPath).toString();
      }
    }
  });

  var distinct = (Iterable<ContentType> items) {
    var retain = <ContentType>[];

    return items.where((ct) {
      if (!retain.any((retained) =>
          ct.primaryType == retained.primaryType &&
          ct.subType == retained.subType &&
          ct.charset == retained.charset)) {
        retain.add(ct);
        return true;
      }

      return false;
    }).toList();
  };
  doc.consumes = distinct(
      doc.paths.expand((p) => p.operations.expand((op) => op.consumes)));
  doc.produces = distinct(
      doc.paths.expand((p) => p.operations.expand((op) => op.produces)));

  return doc;
}