Regen all docs. (#700)

* Stop recursing if discovery == {}

* Generate docs with 'make docs'.
diff --git a/docs/dyn/firebasehosting_v1beta1.sites.domains.html b/docs/dyn/firebasehosting_v1beta1.sites.domains.html
new file mode 100644
index 0000000..b96110c
--- /dev/null
+++ b/docs/dyn/firebasehosting_v1beta1.sites.domains.html
@@ -0,0 +1,459 @@
+<html><body>
+<style>
+
+body, h1, h2, h3, div, span, p, pre, a {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-weight: inherit;
+  font-style: inherit;
+  font-size: 100%;
+  font-family: inherit;
+  vertical-align: baseline;
+}
+
+body {
+  font-size: 13px;
+  padding: 1em;
+}
+
+h1 {
+  font-size: 26px;
+  margin-bottom: 1em;
+}
+
+h2 {
+  font-size: 24px;
+  margin-bottom: 1em;
+}
+
+h3 {
+  font-size: 20px;
+  margin-bottom: 1em;
+  margin-top: 1em;
+}
+
+pre, code {
+  line-height: 1.5;
+  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
+}
+
+pre {
+  margin-top: 0.5em;
+}
+
+h1, h2, h3, p {
+  font-family: Arial, sans serif;
+}
+
+h1, h2, h3 {
+  border-bottom: solid #CCC 1px;
+}
+
+.toc_element {
+  margin-top: 0.5em;
+}
+
+.firstline {
+  margin-left: 2 em;
+}
+
+.method  {
+  margin-top: 1em;
+  border: solid 1px #CCC;
+  padding: 1em;
+  background: #EEE;
+}
+
+.details {
+  font-weight: bold;
+  font-size: 14px;
+}
+
+</style>
+
+<h1><a href="firebasehosting_v1beta1.html">Firebase Hosting API</a> . <a href="firebasehosting_v1beta1.sites.html">sites</a> . <a href="firebasehosting_v1beta1.sites.domains.html">domains</a></h1>
+<h2>Instance Methods</h2>
+<p class="toc_element">
+  <code><a href="#create">create(parent, body, x__xgafv=None)</a></code></p>
+<p class="firstline">Creates a domain mapping on the specified site.</p>
+<p class="toc_element">
+  <code><a href="#delete">delete(name, x__xgafv=None)</a></code></p>
+<p class="firstline">Deletes the existing domain mapping on the specified site.</p>
+<p class="toc_element">
+  <code><a href="#get">get(name, x__xgafv=None)</a></code></p>
+<p class="firstline">Gets a domain mapping on the specified site.</p>
+<p class="toc_element">
+  <code><a href="#list">list(parent, pageToken=None, x__xgafv=None, pageSize=None)</a></code></p>
+<p class="firstline">Lists the domains for the specified site.</p>
+<p class="toc_element">
+  <code><a href="#list_next">list_next(previous_request, previous_response)</a></code></p>
+<p class="firstline">Retrieves the next page of results.</p>
+<p class="toc_element">
+  <code><a href="#update">update(name, body, x__xgafv=None)</a></code></p>
+<p class="firstline">Updates the specified domain mapping, creating the mapping as if it does</p>
+<h3>Method Details</h3>
+<div class="method">
+    <code class="details" id="create">create(parent, body, x__xgafv=None)</code>
+  <pre>Creates a domain mapping on the specified site.
+
+Args:
+  parent: string, Required. The parent to create the domain association for, in the format:
+<code>sites/<var>site-name</var></code> (required)
+  body: object, The request body. (required)
+    The object takes the form of:
+
+{ # The intended behavior and status information of a domain.
+    "status": "A String", # Output only. Additional status of the domain association.
+    "domainRedirect": { # Defines the behavior of a domain-level redirect. Domain redirects preserve # If set, the domain should redirect with the provided parameters.
+        # the path of the redirect but replace the requested domain with the one
+        # specified in the redirect configuration.
+      "type": "A String", # Required. The redirect status code.
+      "domainName": "A String", # Required. The domain name to redirect to.
+    },
+    "domainName": "A String", # Required. The domain name of the association.
+    "site": "A String", # Required. The site name of the association.
+    "updateTime": "A String", # Output only. The time at which the domain was last updated.
+    "provisioning": { # The current certificate provisioning status information for a domain. # Output only. Information about the provisioning of certificates and the
+        # health of the DNS resolution for the domain.
+      "certChallengeHttp": { # Represents an HTTP certificate challenge. # The HTTP challenge for generating a certificate.
+        "path": "A String", # The URL path on which to serve the specified token to satisfy the
+            # certificate challenge.
+        "token": "A String", # The token to serve at the specified URL path to satisfy the certificate
+            # challenge.
+      },
+      "expectedIps": [ # The list of IPs to which the domain is expected to resolve.
+        "A String",
+      ],
+      "certChallengeDiscoveredTxt": [ # The TXT records (for the certificate challenge) that were found at the last
+          # DNS fetch.
+        "A String",
+      ],
+      "dnsFetchTime": "A String", # The time at which the last DNS fetch occurred.
+      "discoveredIps": [ # The IPs found at the last DNS fetch.
+        "A String",
+      ],
+      "certChallengeDns": { # Represents a DNS certificate challenge. # The DNS challenge for generating a certificate.
+        "token": "A String", # The value that must be present as a TXT record on the domain name to
+            # satisfy the challenge.
+        "domainName": "A String", # The domain name upon which the DNS challenge must be satisfied.
+      },
+      "dnsStatus": "A String", # The DNS record match status as of the last DNS fetch.
+      "certStatus": "A String", # The certificate provisioning status; updated when Firebase Hosting
+          # provisions an SSL certificate for the domain.
+    },
+  }
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # The intended behavior and status information of a domain.
+      "status": "A String", # Output only. Additional status of the domain association.
+      "domainRedirect": { # Defines the behavior of a domain-level redirect. Domain redirects preserve # If set, the domain should redirect with the provided parameters.
+          # the path of the redirect but replace the requested domain with the one
+          # specified in the redirect configuration.
+        "type": "A String", # Required. The redirect status code.
+        "domainName": "A String", # Required. The domain name to redirect to.
+      },
+      "domainName": "A String", # Required. The domain name of the association.
+      "site": "A String", # Required. The site name of the association.
+      "updateTime": "A String", # Output only. The time at which the domain was last updated.
+      "provisioning": { # The current certificate provisioning status information for a domain. # Output only. Information about the provisioning of certificates and the
+          # health of the DNS resolution for the domain.
+        "certChallengeHttp": { # Represents an HTTP certificate challenge. # The HTTP challenge for generating a certificate.
+          "path": "A String", # The URL path on which to serve the specified token to satisfy the
+              # certificate challenge.
+          "token": "A String", # The token to serve at the specified URL path to satisfy the certificate
+              # challenge.
+        },
+        "expectedIps": [ # The list of IPs to which the domain is expected to resolve.
+          "A String",
+        ],
+        "certChallengeDiscoveredTxt": [ # The TXT records (for the certificate challenge) that were found at the last
+            # DNS fetch.
+          "A String",
+        ],
+        "dnsFetchTime": "A String", # The time at which the last DNS fetch occurred.
+        "discoveredIps": [ # The IPs found at the last DNS fetch.
+          "A String",
+        ],
+        "certChallengeDns": { # Represents a DNS certificate challenge. # The DNS challenge for generating a certificate.
+          "token": "A String", # The value that must be present as a TXT record on the domain name to
+              # satisfy the challenge.
+          "domainName": "A String", # The domain name upon which the DNS challenge must be satisfied.
+        },
+        "dnsStatus": "A String", # The DNS record match status as of the last DNS fetch.
+        "certStatus": "A String", # The certificate provisioning status; updated when Firebase Hosting
+            # provisions an SSL certificate for the domain.
+      },
+    }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="delete">delete(name, x__xgafv=None)</code>
+  <pre>Deletes the existing domain mapping on the specified site.
+
+Args:
+  name: string, Required. The name of the domain association to delete. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # A generic empty message that you can re-use to avoid defining duplicated
+      # empty messages in your APIs. A typical example is to use it as the request
+      # or the response type of an API method. For instance:
+      #
+      #     service Foo {
+      #       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
+      #     }
+      #
+      # The JSON representation for `Empty` is empty JSON object `{}`.
+  }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="get">get(name, x__xgafv=None)</code>
+  <pre>Gets a domain mapping on the specified site.
+
+Args:
+  name: string, Required. The name of the domain configuration to get. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # The intended behavior and status information of a domain.
+      "status": "A String", # Output only. Additional status of the domain association.
+      "domainRedirect": { # Defines the behavior of a domain-level redirect. Domain redirects preserve # If set, the domain should redirect with the provided parameters.
+          # the path of the redirect but replace the requested domain with the one
+          # specified in the redirect configuration.
+        "type": "A String", # Required. The redirect status code.
+        "domainName": "A String", # Required. The domain name to redirect to.
+      },
+      "domainName": "A String", # Required. The domain name of the association.
+      "site": "A String", # Required. The site name of the association.
+      "updateTime": "A String", # Output only. The time at which the domain was last updated.
+      "provisioning": { # The current certificate provisioning status information for a domain. # Output only. Information about the provisioning of certificates and the
+          # health of the DNS resolution for the domain.
+        "certChallengeHttp": { # Represents an HTTP certificate challenge. # The HTTP challenge for generating a certificate.
+          "path": "A String", # The URL path on which to serve the specified token to satisfy the
+              # certificate challenge.
+          "token": "A String", # The token to serve at the specified URL path to satisfy the certificate
+              # challenge.
+        },
+        "expectedIps": [ # The list of IPs to which the domain is expected to resolve.
+          "A String",
+        ],
+        "certChallengeDiscoveredTxt": [ # The TXT records (for the certificate challenge) that were found at the last
+            # DNS fetch.
+          "A String",
+        ],
+        "dnsFetchTime": "A String", # The time at which the last DNS fetch occurred.
+        "discoveredIps": [ # The IPs found at the last DNS fetch.
+          "A String",
+        ],
+        "certChallengeDns": { # Represents a DNS certificate challenge. # The DNS challenge for generating a certificate.
+          "token": "A String", # The value that must be present as a TXT record on the domain name to
+              # satisfy the challenge.
+          "domainName": "A String", # The domain name upon which the DNS challenge must be satisfied.
+        },
+        "dnsStatus": "A String", # The DNS record match status as of the last DNS fetch.
+        "certStatus": "A String", # The certificate provisioning status; updated when Firebase Hosting
+            # provisions an SSL certificate for the domain.
+      },
+    }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="list">list(parent, pageToken=None, x__xgafv=None, pageSize=None)</code>
+  <pre>Lists the domains for the specified site.
+
+Args:
+  parent: string, Required. The parent for which to list domains, in the format:
+<code>sites/<var>site-name</var></code> (required)
+  pageToken: string, The next_page_token from a previous request, if provided.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+  pageSize: integer, The page size to return. Defaults to 50.
+
+Returns:
+  An object of the form:
+
+    {
+    "nextPageToken": "A String", # The pagination token, if more results exist.
+    "domains": [ # The list of domains, if any exist.
+      { # The intended behavior and status information of a domain.
+          "status": "A String", # Output only. Additional status of the domain association.
+          "domainRedirect": { # Defines the behavior of a domain-level redirect. Domain redirects preserve # If set, the domain should redirect with the provided parameters.
+              # the path of the redirect but replace the requested domain with the one
+              # specified in the redirect configuration.
+            "type": "A String", # Required. The redirect status code.
+            "domainName": "A String", # Required. The domain name to redirect to.
+          },
+          "domainName": "A String", # Required. The domain name of the association.
+          "site": "A String", # Required. The site name of the association.
+          "updateTime": "A String", # Output only. The time at which the domain was last updated.
+          "provisioning": { # The current certificate provisioning status information for a domain. # Output only. Information about the provisioning of certificates and the
+              # health of the DNS resolution for the domain.
+            "certChallengeHttp": { # Represents an HTTP certificate challenge. # The HTTP challenge for generating a certificate.
+              "path": "A String", # The URL path on which to serve the specified token to satisfy the
+                  # certificate challenge.
+              "token": "A String", # The token to serve at the specified URL path to satisfy the certificate
+                  # challenge.
+            },
+            "expectedIps": [ # The list of IPs to which the domain is expected to resolve.
+              "A String",
+            ],
+            "certChallengeDiscoveredTxt": [ # The TXT records (for the certificate challenge) that were found at the last
+                # DNS fetch.
+              "A String",
+            ],
+            "dnsFetchTime": "A String", # The time at which the last DNS fetch occurred.
+            "discoveredIps": [ # The IPs found at the last DNS fetch.
+              "A String",
+            ],
+            "certChallengeDns": { # Represents a DNS certificate challenge. # The DNS challenge for generating a certificate.
+              "token": "A String", # The value that must be present as a TXT record on the domain name to
+                  # satisfy the challenge.
+              "domainName": "A String", # The domain name upon which the DNS challenge must be satisfied.
+            },
+            "dnsStatus": "A String", # The DNS record match status as of the last DNS fetch.
+            "certStatus": "A String", # The certificate provisioning status; updated when Firebase Hosting
+                # provisions an SSL certificate for the domain.
+          },
+        },
+    ],
+  }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="list_next">list_next(previous_request, previous_response)</code>
+  <pre>Retrieves the next page of results.
+
+Args:
+  previous_request: The request for the previous page. (required)
+  previous_response: The response from the request for the previous page. (required)
+
+Returns:
+  A request object that you can call 'execute()' on to request the next
+  page. Returns None if there are no more items in the collection.
+    </pre>
+</div>
+
+<div class="method">
+    <code class="details" id="update">update(name, body, x__xgafv=None)</code>
+  <pre>Updates the specified domain mapping, creating the mapping as if it does
+not exist.
+
+Args:
+  name: string, Required. The name of the domain association to update or create, if an
+association doesn't already exist. (required)
+  body: object, The request body. (required)
+    The object takes the form of:
+
+{ # The intended behavior and status information of a domain.
+    "status": "A String", # Output only. Additional status of the domain association.
+    "domainRedirect": { # Defines the behavior of a domain-level redirect. Domain redirects preserve # If set, the domain should redirect with the provided parameters.
+        # the path of the redirect but replace the requested domain with the one
+        # specified in the redirect configuration.
+      "type": "A String", # Required. The redirect status code.
+      "domainName": "A String", # Required. The domain name to redirect to.
+    },
+    "domainName": "A String", # Required. The domain name of the association.
+    "site": "A String", # Required. The site name of the association.
+    "updateTime": "A String", # Output only. The time at which the domain was last updated.
+    "provisioning": { # The current certificate provisioning status information for a domain. # Output only. Information about the provisioning of certificates and the
+        # health of the DNS resolution for the domain.
+      "certChallengeHttp": { # Represents an HTTP certificate challenge. # The HTTP challenge for generating a certificate.
+        "path": "A String", # The URL path on which to serve the specified token to satisfy the
+            # certificate challenge.
+        "token": "A String", # The token to serve at the specified URL path to satisfy the certificate
+            # challenge.
+      },
+      "expectedIps": [ # The list of IPs to which the domain is expected to resolve.
+        "A String",
+      ],
+      "certChallengeDiscoveredTxt": [ # The TXT records (for the certificate challenge) that were found at the last
+          # DNS fetch.
+        "A String",
+      ],
+      "dnsFetchTime": "A String", # The time at which the last DNS fetch occurred.
+      "discoveredIps": [ # The IPs found at the last DNS fetch.
+        "A String",
+      ],
+      "certChallengeDns": { # Represents a DNS certificate challenge. # The DNS challenge for generating a certificate.
+        "token": "A String", # The value that must be present as a TXT record on the domain name to
+            # satisfy the challenge.
+        "domainName": "A String", # The domain name upon which the DNS challenge must be satisfied.
+      },
+      "dnsStatus": "A String", # The DNS record match status as of the last DNS fetch.
+      "certStatus": "A String", # The certificate provisioning status; updated when Firebase Hosting
+          # provisions an SSL certificate for the domain.
+    },
+  }
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # The intended behavior and status information of a domain.
+      "status": "A String", # Output only. Additional status of the domain association.
+      "domainRedirect": { # Defines the behavior of a domain-level redirect. Domain redirects preserve # If set, the domain should redirect with the provided parameters.
+          # the path of the redirect but replace the requested domain with the one
+          # specified in the redirect configuration.
+        "type": "A String", # Required. The redirect status code.
+        "domainName": "A String", # Required. The domain name to redirect to.
+      },
+      "domainName": "A String", # Required. The domain name of the association.
+      "site": "A String", # Required. The site name of the association.
+      "updateTime": "A String", # Output only. The time at which the domain was last updated.
+      "provisioning": { # The current certificate provisioning status information for a domain. # Output only. Information about the provisioning of certificates and the
+          # health of the DNS resolution for the domain.
+        "certChallengeHttp": { # Represents an HTTP certificate challenge. # The HTTP challenge for generating a certificate.
+          "path": "A String", # The URL path on which to serve the specified token to satisfy the
+              # certificate challenge.
+          "token": "A String", # The token to serve at the specified URL path to satisfy the certificate
+              # challenge.
+        },
+        "expectedIps": [ # The list of IPs to which the domain is expected to resolve.
+          "A String",
+        ],
+        "certChallengeDiscoveredTxt": [ # The TXT records (for the certificate challenge) that were found at the last
+            # DNS fetch.
+          "A String",
+        ],
+        "dnsFetchTime": "A String", # The time at which the last DNS fetch occurred.
+        "discoveredIps": [ # The IPs found at the last DNS fetch.
+          "A String",
+        ],
+        "certChallengeDns": { # Represents a DNS certificate challenge. # The DNS challenge for generating a certificate.
+          "token": "A String", # The value that must be present as a TXT record on the domain name to
+              # satisfy the challenge.
+          "domainName": "A String", # The domain name upon which the DNS challenge must be satisfied.
+        },
+        "dnsStatus": "A String", # The DNS record match status as of the last DNS fetch.
+        "certStatus": "A String", # The certificate provisioning status; updated when Firebase Hosting
+            # provisions an SSL certificate for the domain.
+      },
+    }</pre>
+</div>
+
+</body></html>
\ No newline at end of file