From 8b39acb270c475d41f5545e052c3dd7197750d70 Mon Sep 17 00:00:00 2001 From: Alexander Fenster Date: Fri, 6 Nov 2020 17:02:15 -0800 Subject: [PATCH] fix: do not modify options object, use defaultScopes (#134) Regenerated the library using [gapic-generator-typescript](https://github.com/googleapis/gapic-generator-typescript) v1.2.1. --- .../google-monitoring-dashboard/package.json | 2 +- .../google-monitoring-dashboard/src/index.ts | 1 + .../src/v1/dashboards_service_client.ts | 151 ++++++++++-------- .../synth.metadata | 16 +- .../system-test/fixtures/sample/src/index.ts | 9 +- .../system-test/install.ts | 18 +-- 6 files changed, 109 insertions(+), 88 deletions(-) diff --git a/packages/google-monitoring-dashboard/package.json b/packages/google-monitoring-dashboard/package.json index f48df4913e5..b77ba4e218c 100644 --- a/packages/google-monitoring-dashboard/package.json +++ b/packages/google-monitoring-dashboard/package.json @@ -29,7 +29,7 @@ "api-documenter": "api-documenter yaml --input-folder=temp" }, "dependencies": { - "google-gax": "^2.1.0" + "google-gax": "^2.9.2" }, "devDependencies": { "@types/mocha": "^8.0.0", diff --git a/packages/google-monitoring-dashboard/src/index.ts b/packages/google-monitoring-dashboard/src/index.ts index 5fc0ce0306e..6a516e14282 100644 --- a/packages/google-monitoring-dashboard/src/index.ts +++ b/packages/google-monitoring-dashboard/src/index.ts @@ -18,6 +18,7 @@ import * as v1 from './v1'; const DashboardsServiceClient = v1.DashboardsServiceClient; +type DashboardsServiceClient = v1.DashboardsServiceClient; export {v1, DashboardsServiceClient}; export default {v1, DashboardsServiceClient}; import * as protos from '../protos/protos'; diff --git a/packages/google-monitoring-dashboard/src/v1/dashboards_service_client.ts b/packages/google-monitoring-dashboard/src/v1/dashboards_service_client.ts index 76b5db78909..c0e8e24b4fc 100644 --- a/packages/google-monitoring-dashboard/src/v1/dashboards_service_client.ts +++ b/packages/google-monitoring-dashboard/src/v1/dashboards_service_client.ts @@ -61,8 +61,10 @@ export class DashboardsServiceClient { /** * Construct an instance of DashboardsServiceClient. * - * @param {object} [options] - The configuration object. See the subsequent - * parameters for more details. + * @param {object} [options] - The configuration object. + * The options accepted by the constructor are described in detail + * in [this document](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#creating-the-client-instance). + * The common options are: * @param {object} [options.credentials] - Credentials object. * @param {string} [options.credentials.client_email] * @param {string} [options.credentials.private_key] @@ -82,42 +84,33 @@ export class DashboardsServiceClient { * your project ID will be detected automatically. * @param {string} [options.apiEndpoint] - The domain name of the * API remote host. + * @param {gax.ClientConfig} [options.clientConfig] - client configuration override. + * TODO(@alexander-fenster): link to gax documentation. + * @param {boolean} fallback - Use HTTP fallback mode. + * In fallback mode, a special browser-compatible transport implementation is used + * instead of gRPC transport. In browser context (if the `window` object is defined) + * the fallback mode is enabled automatically; set `options.fallback` to `false` + * if you need to override this behavior. */ - constructor(opts?: ClientOptions) { - // Ensure that options include the service address and port. + // Ensure that options include all the required fields. const staticMembers = this.constructor as typeof DashboardsServiceClient; const servicePath = - opts && opts.servicePath - ? opts.servicePath - : opts && opts.apiEndpoint - ? opts.apiEndpoint - : staticMembers.servicePath; - const port = opts && opts.port ? opts.port : staticMembers.port; - - if (!opts) { - opts = {servicePath, port}; + opts?.servicePath || opts?.apiEndpoint || staticMembers.servicePath; + const port = opts?.port || staticMembers.port; + const clientConfig = opts?.clientConfig ?? {}; + const fallback = opts?.fallback ?? typeof window !== 'undefined'; + opts = Object.assign({servicePath, port, clientConfig, fallback}, opts); + + // If scopes are unset in options and we're connecting to a non-default endpoint, set scopes just in case. + if (servicePath !== staticMembers.servicePath && !('scopes' in opts)) { + opts['scopes'] = staticMembers.scopes; } - opts.servicePath = opts.servicePath || servicePath; - opts.port = opts.port || port; - - // users can override the config from client side, like retry codes name. - // The detailed structure of the clientConfig can be found here: https://github.com/googleapis/gax-nodejs/blob/master/src/gax.ts#L546 - // The way to override client config for Showcase API: - // - // const customConfig = {"interfaces": {"google.showcase.v1beta1.Echo": {"methods": {"Echo": {"retry_codes_name": "idempotent", "retry_params_name": "default"}}}}} - // const showcaseClient = new showcaseClient({ projectId, customConfig }); - opts.clientConfig = opts.clientConfig || {}; - - // If we're running in browser, it's OK to omit `fallback` since - // google-gax has `browser` field in its `package.json`. - // For Electron (which does not respect `browser` field), - // pass `{fallback: true}` to the DashboardsServiceClient constructor. + + // Choose either gRPC or proto-over-HTTP implementation of google-gax. this._gaxModule = opts.fallback ? gax.fallback : gax; - // Create a `gaxGrpc` object, with any grpc-specific options - // sent to the client. - opts.scopes = (this.constructor as typeof DashboardsServiceClient).scopes; + // Create a `gaxGrpc` object, with any grpc-specific options sent to the client. this._gaxGrpc = new this._gaxModule.GrpcClient(opts); // Save options to use in initialize() method. @@ -126,6 +119,11 @@ export class DashboardsServiceClient { // Save the auth object to the client, for use by other methods. this.auth = this._gaxGrpc.auth as gax.GoogleAuth; + // Set the default scopes in auth client if needed. + if (servicePath === staticMembers.servicePath) { + this.auth.defaultScopes = staticMembers.scopes; + } + // Determine the client header string. const clientHeader = [`gax/${this._gaxModule.version}`, `gapic/${version}`]; if (typeof process !== 'undefined' && 'versions' in process) { @@ -262,6 +260,7 @@ export class DashboardsServiceClient { /** * The DNS address for this API service. + * @returns {string} The DNS address for this service. */ static get servicePath() { return 'monitoring.googleapis.com'; @@ -270,6 +269,7 @@ export class DashboardsServiceClient { /** * The DNS address for this API service - same as servicePath(), * exists for compatibility reasons. + * @returns {string} The DNS address for this service. */ static get apiEndpoint() { return 'monitoring.googleapis.com'; @@ -277,6 +277,7 @@ export class DashboardsServiceClient { /** * The port for this API service. + * @returns {number} The default port for this service. */ static get port() { return 443; @@ -285,6 +286,7 @@ export class DashboardsServiceClient { /** * The scopes needed to make gRPC calls for every method defined * in this service. + * @returns {string[]} List of default scopes. */ static get scopes() { return [ @@ -299,8 +301,7 @@ export class DashboardsServiceClient { getProjectId(callback: Callback): void; /** * Return the project ID used by this class. - * @param {function(Error, string)} callback - the callback to - * be called with the current project Id. + * @returns {Promise} A promise that resolves to string containing the project ID. */ getProjectId( callback?: Callback @@ -367,7 +368,11 @@ export class DashboardsServiceClient { * Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details. * @returns {Promise} - The promise which resolves to an array. * The first element of the array is an object representing [Dashboard]{@link google.monitoring.dashboard.v1.Dashboard}. - * The promise has a method named "cancel" which cancels the ongoing API call. + * Please see the + * [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#regular-methods) + * for more details and examples. + * @example + * const [response] = await client.createDashboard(request); */ createDashboard( request: protos.google.monitoring.dashboard.v1.ICreateDashboardRequest, @@ -463,7 +468,11 @@ export class DashboardsServiceClient { * Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details. * @returns {Promise} - The promise which resolves to an array. * The first element of the array is an object representing [Dashboard]{@link google.monitoring.dashboard.v1.Dashboard}. - * The promise has a method named "cancel" which cancels the ongoing API call. + * Please see the + * [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#regular-methods) + * for more details and examples. + * @example + * const [response] = await client.getDashboard(request); */ getDashboard( request: protos.google.monitoring.dashboard.v1.IGetDashboardRequest, @@ -557,7 +566,11 @@ export class DashboardsServiceClient { * Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details. * @returns {Promise} - The promise which resolves to an array. * The first element of the array is an object representing [Empty]{@link google.protobuf.Empty}. - * The promise has a method named "cancel" which cancels the ongoing API call. + * Please see the + * [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#regular-methods) + * for more details and examples. + * @example + * const [response] = await client.deleteDashboard(request); */ deleteDashboard( request: protos.google.monitoring.dashboard.v1.IDeleteDashboardRequest, @@ -649,7 +662,11 @@ export class DashboardsServiceClient { * Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details. * @returns {Promise} - The promise which resolves to an array. * The first element of the array is an object representing [Dashboard]{@link google.monitoring.dashboard.v1.Dashboard}. - * The promise has a method named "cancel" which cancels the ongoing API call. + * Please see the + * [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#regular-methods) + * for more details and examples. + * @example + * const [response] = await client.updateDashboard(request); */ updateDashboard( request: protos.google.monitoring.dashboard.v1.IUpdateDashboardRequest, @@ -751,19 +768,14 @@ export class DashboardsServiceClient { * Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details. * @returns {Promise} - The promise which resolves to an array. * The first element of the array is Array of [Dashboard]{@link google.monitoring.dashboard.v1.Dashboard}. - * The client library support auto-pagination by default: it will call the API as many + * The client library will perform auto-pagination by default: it will call the API as many * times as needed and will merge results from all the pages into this array. - * - * When autoPaginate: false is specified through options, the array has three elements. - * The first element is Array of [Dashboard]{@link google.monitoring.dashboard.v1.Dashboard} that corresponds to - * the one page received from the API server. - * If the second element is not null it contains the request object of type [ListDashboardsRequest]{@link google.monitoring.dashboard.v1.ListDashboardsRequest} - * that can be used to obtain the next page of the results. - * If it is null, the next page does not exist. - * The third element contains the raw response received from the API server. Its type is - * [ListDashboardsResponse]{@link google.monitoring.dashboard.v1.ListDashboardsResponse}. - * - * The promise has a method named "cancel" which cancels the ongoing API call. + * Note that it can affect your quota. + * We recommend using `listDashboardsAsync()` + * method described below for async iteration which you can stop as needed. + * Please see the + * [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination) + * for more details and examples. */ listDashboards( request: protos.google.monitoring.dashboard.v1.IListDashboardsRequest, @@ -811,18 +823,7 @@ export class DashboardsServiceClient { } /** - * Equivalent to {@link listDashboards}, but returns a NodeJS Stream object. - * - * This fetches the paged responses for {@link listDashboards} continuously - * and invokes the callback registered for 'data' event for each element in the - * responses. - * - * The returned object has 'end' method when no more elements are required. - * - * autoPaginate option will be ignored. - * - * @see {@link https://nodejs.org/api/stream.html} - * + * Equivalent to `method.name.toCamelCase()`, but returns a NodeJS Stream object. * @param {Object} request * The request object that will be sent. * @param {string} request.parent @@ -840,6 +841,13 @@ export class DashboardsServiceClient { * Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details. * @returns {Stream} * An object stream which emits an object representing [Dashboard]{@link google.monitoring.dashboard.v1.Dashboard} on 'data' event. + * The client library will perform auto-pagination by default: it will call the API as many + * times as needed. Note that it can affect your quota. + * We recommend using `listDashboardsAsync()` + * method described below for async iteration which you can stop as needed. + * Please see the + * [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination) + * for more details and examples. */ listDashboardsStream( request?: protos.google.monitoring.dashboard.v1.IListDashboardsRequest, @@ -864,10 +872,9 @@ export class DashboardsServiceClient { } /** - * Equivalent to {@link listDashboards}, but returns an iterable object. - * - * for-await-of syntax is used with the iterable to recursively get response element on-demand. + * Equivalent to `listDashboards`, but returns an iterable object. * + * `for`-`await`-`of` syntax is used with the iterable to get response elements on-demand. * @param {Object} request * The request object that will be sent. * @param {string} request.parent @@ -884,7 +891,18 @@ export class DashboardsServiceClient { * @param {object} [options] * Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details. * @returns {Object} - * An iterable Object that conforms to @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols. + * An iterable Object that allows [async iteration](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols). + * When you iterate the returned iterable, each element will be an object representing + * [Dashboard]{@link google.monitoring.dashboard.v1.Dashboard}. The API will be called under the hood as needed, once per the page, + * so you can stop the iteration when you don't need more results. + * Please see the + * [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination) + * for more details and examples. + * @example + * const iterable = client.listDashboardsAsync(request); + * for await (const response of iterable) { + * // process response + * } */ listDashboardsAsync( request?: protos.google.monitoring.dashboard.v1.IListDashboardsRequest, @@ -974,9 +992,10 @@ export class DashboardsServiceClient { } /** - * Terminate the GRPC channel and close the client. + * Terminate the gRPC channel and close the client. * * The client will no longer be usable and all future behavior is undefined. + * @returns {Promise} A promise that resolves when the client is closed. */ close(): Promise { this.initialize(); diff --git a/packages/google-monitoring-dashboard/synth.metadata b/packages/google-monitoring-dashboard/synth.metadata index adca9b2181a..0fd7ef6b908 100644 --- a/packages/google-monitoring-dashboard/synth.metadata +++ b/packages/google-monitoring-dashboard/synth.metadata @@ -3,23 +3,15 @@ { "git": { "name": ".", - "remote": "https://github.com/googleapis/nodejs-monitoring-dashboards.git", - "sha": "f0e52f5f94e4db1ccaa4c7d7258358a4362ee11e" - } - }, - { - "git": { - "name": "googleapis", - "remote": "https://github.com/googleapis/googleapis.git", - "sha": "4c5071b615d96ef9dfd6a63d8429090f1f2872bb", - "internalRef": "327369997" + "remote": "git@github.com:googleapis/nodejs-monitoring-dashboards.git", + "sha": "e167bd3589436f617422a665496934bd5f89f4cc" } }, { "git": { "name": "synthtool", "remote": "https://github.com/googleapis/synthtool.git", - "sha": "ba9918cd22874245b55734f57470c719b577e591" + "sha": "1f1148d3c7a7a52f0c98077f976bd9b3c948ee2b" } } ], @@ -86,6 +78,7 @@ "README.md", "api-extractor.json", "linkinator.config.json", + "package-lock.json.3928346606", "protos/google/monitoring/dashboard/v1/common.proto", "protos/google/monitoring/dashboard/v1/dashboard.proto", "protos/google/monitoring/dashboard/v1/dashboards_service.proto", @@ -102,6 +95,7 @@ "protos/protos.json", "renovate.json", "samples/README.md", + "samples/package-lock.json.3115811802", "src/index.ts", "src/v1/dashboards_service_client.ts", "src/v1/dashboards_service_client_config.json", diff --git a/packages/google-monitoring-dashboard/system-test/fixtures/sample/src/index.ts b/packages/google-monitoring-dashboard/system-test/fixtures/sample/src/index.ts index 0b1b792a12c..d30b887e112 100644 --- a/packages/google-monitoring-dashboard/system-test/fixtures/sample/src/index.ts +++ b/packages/google-monitoring-dashboard/system-test/fixtures/sample/src/index.ts @@ -18,8 +18,15 @@ import {DashboardsServiceClient} from '@google-cloud/monitoring-dashboards'; +// check that the client class type name can be used +function doStuffWithDashboardsServiceClient(client: DashboardsServiceClient) { + client.close(); +} + function main() { - new DashboardsServiceClient(); + // check that the client instance can be created + const dashboardsServiceClient = new DashboardsServiceClient(); + doStuffWithDashboardsServiceClient(dashboardsServiceClient); } main(); diff --git a/packages/google-monitoring-dashboard/system-test/install.ts b/packages/google-monitoring-dashboard/system-test/install.ts index 4c1ba3eb79a..39d90f771de 100644 --- a/packages/google-monitoring-dashboard/system-test/install.ts +++ b/packages/google-monitoring-dashboard/system-test/install.ts @@ -20,32 +20,32 @@ import {packNTest} from 'pack-n-play'; import {readFileSync} from 'fs'; import {describe, it} from 'mocha'; -describe('typescript consumer tests', () => { - it('should have correct type signature for typescript users', async function () { +describe('📦 pack-n-play test', () => { + it('TypeScript code', async function () { this.timeout(300000); const options = { - packageDir: process.cwd(), // path to your module. + packageDir: process.cwd(), sample: { - description: 'typescript based user can use the type definitions', + description: 'TypeScript user can use the type definitions', ts: readFileSync( './system-test/fixtures/sample/src/index.ts' ).toString(), }, }; - await packNTest(options); // will throw upon error. + await packNTest(options); }); - it('should have correct type signature for javascript users', async function () { + it('JavaScript code', async function () { this.timeout(300000); const options = { - packageDir: process.cwd(), // path to your module. + packageDir: process.cwd(), sample: { - description: 'typescript based user can use the type definitions', + description: 'JavaScript user can use the library', ts: readFileSync( './system-test/fixtures/sample/src/index.js' ).toString(), }, }; - await packNTest(options); // will throw upon error. + await packNTest(options); }); });