Skip to content

Commit

Permalink
fix(types): Consolidate "createChange" wrappers, add overloads (#133)
Browse files Browse the repository at this point in the history
  • Loading branch information
carnesen authored and JustinBeckwith committed Oct 12, 2018
1 parent 2fbcefc commit 5314153
Showing 1 changed file with 70 additions and 120 deletions.
190 changes: 70 additions & 120 deletions packages/google-cloud-dns/src/zone.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,55 +33,6 @@ import {Record, RecordMetadata, RecordObject} from './record';
import {DNS} from '.';
import * as r from 'request';

/**
* @typedef {array} ZoneDeleteRecordsResponse
* @property {Change} 0 A {@link Change} object.
* @property {object} 1 The full API response.
*/
export type ZoneDeleteRecordsResponse = [Change, r.Response];

/**
* @callback ZoneDeleteRecordsCallback
* @param {?Error} err Request error, if any.
* @param {?Change} change A {@link Change} object.
* @param {object} apiResponse The full API response.
*/
export interface ZoneDeleteRecordsCallback {
(err: Error|null, change?: Change|null, apiResponse?: r.Response): void;
}

/**
* @typedef {array} ZoneReplaceRecordsResponse
* @property {Change} 0 A {@link Change} object.
* @property {object} 1 The full API response.
*/
export type ZoneReplaceRecordsResponse = [Change, r.Response];

/**
* @callback ZoneReplaceRecordsCallback
* @param {?Error} err Request error, if any.
* @param {?Change} change A {@link Change} object.
* @param {object} apiResponse The full API response.
*/
export interface ZoneReplaceRecordsCallback {
(err: Error|null, change?: Change, apiResponse?: r.Response): void;
}

/**
* @typedef {array} DeleteZoneResponse
* @property {object} 0 The full API response.
*/
export type DeleteZoneResponse = [r.Response];

/**
* @callback DeleteZoneCallback
* @param {?Error} err Request error, if any.
* @param {object} apiResponse The full API response.
*/
export interface DeleteZoneCallback {
(err: Error|null, apiResponse?: r.Response): void;
}

/**
* Config to set for the change.
*
Expand Down Expand Up @@ -114,21 +65,17 @@ export interface CreateChangeCallback {
}

/**
* @typedef {array} ZoneAddRecordsResponse
* @property {Change} 0 A {@link Change} object.
* @property {object} 1 The full API response.
* @typedef {array} DeleteZoneResponse
* @property {object} 0 The full API response.
*/
export type ZoneAddRecordsResponse = [Change, r.Response];
export type DeleteZoneResponse = [r.Response];

/**
* @callback ZoneAddRecordsCallback
* @callback DeleteZoneCallback
* @param {?Error} err Request error, if any.
* @param {?Change} change A {@link Change} object.
* @param {object} apiResponse The full API response.
*/
export interface ZoneAddRecordsCallback {
(err: Error|null, change?: Change|null, apiResponse?: r.Response): void;
}
export interface DeleteZoneCallback extends DeleteCallback {}

export interface DeleteZoneConfig {
force?: boolean;
Expand Down Expand Up @@ -165,6 +112,21 @@ export interface GetChangesCallback {
apiResponse?: r.Response): void;
}

/**
* @typedef {array} ZoneExportResponse
* @property {object} 0 The full API response.
*/
export type ZoneExportResponse = [r.Response];

/**
* @callback ZoneExportCallback
* @param {?Error} err Request error, if any.
* @param {object} apiResponse The full API response.
*/
export interface ZoneExportCallback {
(err: Error|null): void;
}

/**
* A Zone object is used to interact with your project's managed zone. It will
* help you add or delete records, delete your zone, and many other convenience
Expand Down Expand Up @@ -360,11 +322,14 @@ class Zone extends ServiceObject {
* @see [ManagedZones: create API Documentation]{@link https://cloud.google.com/dns/api/v1/managedZones/create}
*
* @param {Record|Record[]} record The {@link Record} object(s) to add.
* @param {ZoneAddRecordsCallback} [callback] Callback function.
* @returns {Promise<ZoneAddRecordsResponse>}
* @param {CreateChangeCallback} [callback] Callback function.
* @returns {Promise<CreateChangeResponse>}
*/
addRecords(records: Record|Record[], callback: ZoneAddRecordsCallback) {
this.createChange({add: records}, callback);
addRecords(records: Record|Record[]): Promise<CreateChangeResponse>;
addRecords(records: Record|Record[], callback: CreateChangeCallback): void;
addRecords(records: Record|Record[], callback?: CreateChangeCallback):
void|Promise<CreateChangeResponse> {
this.createChange({add: records}, callback!);
}
/**
* Create a reference to a {@link Change} object in this zone.
Expand Down Expand Up @@ -427,7 +392,11 @@ class Zone extends ServiceObject {
* const apiResponse = data[1];
* });
*/
createChange(config: CreateChangeRequest, callback: CreateChangeCallback) {
createChange(config: CreateChangeRequest): Promise<CreateChangeResponse>;
createChange(config: CreateChangeRequest, callback: CreateChangeCallback):
void;
createChange(config: CreateChangeRequest, callback?: CreateChangeCallback):
void|Promise<CreateChangeResponse> {
if (!config || (!config.add && !config.delete)) {
throw new Error('Cannot create a change with no additions or deletions.');
}
Expand Down Expand Up @@ -467,12 +436,12 @@ class Zone extends ServiceObject {
},
(err, resp) => {
if (err) {
callback(err, null, resp);
callback!(err, null, resp);
return;
}
const change = this.change(resp.id);
change.metadata = resp;
callback(null, change, resp);
callback!(null, change, resp);
});
}

Expand Down Expand Up @@ -520,12 +489,12 @@ class Zone extends ServiceObject {
* const apiResponse = data[0];
* });
*/
delete(options?: DeleteZoneConfig): Promise<[r.Response]>;
delete(callback: DeleteCallback): void;
delete(options: DeleteZoneConfig, callback: DeleteCallback): void;
delete(options?: DeleteZoneConfig): Promise<DeleteZoneResponse>;
delete(callback: DeleteZoneCallback): void;
delete(options: DeleteZoneConfig, callback: DeleteZoneCallback): void;
delete(
optionsOrCallback?: DeleteZoneConfig|DeleteCallback,
callback?: DeleteCallback): void|Promise<[r.Response]> {
optionsOrCallback?: DeleteZoneConfig|DeleteZoneCallback,
callback?: DeleteZoneCallback): void|Promise<DeleteZoneResponse> {
const options =
typeof optionsOrCallback === 'object' ? optionsOrCallback : {};
callback =
Expand Down Expand Up @@ -553,8 +522,8 @@ class Zone extends ServiceObject {
* as a record type. All records that match that type will be retrieved
* and then deleted. You can also provide a {@link Record} object or array of
* {@link Record} objects.
* @param {ZoneDeleteRecordsCallback} [callback] Callback function.
* @returns {Promise<ZoneDeleteRecordsResponse>}
* @param {CreateChangeCallback} [callback] Callback function.
* @returns {Promise<CreateChangeResponse>}
*
* @example
* const {DNS} = require('@google-cloud/dns');
Expand Down Expand Up @@ -616,15 +585,13 @@ class Zone extends ServiceObject {
* });
*/
deleteRecords(records?: Record|Record[]|
string): Promise<ZoneDeleteRecordsResponse>;
deleteRecords(callback: ZoneDeleteRecordsCallback): void;
string): Promise<CreateChangeResponse>;
deleteRecords(callback: CreateChangeCallback): void;
deleteRecords(
records: Record|Record[]|string,
callback: ZoneDeleteRecordsCallback): void;
records: Record|Record[]|string, callback: CreateChangeCallback): void;
deleteRecords(
recordsOrCallback?: Record|Record[]|string|ZoneDeleteRecordsCallback,
callback?: ZoneDeleteRecordsCallback):
void|Promise<ZoneDeleteRecordsResponse> {
recordsOrCallback?: Record|Record[]|string|CreateChangeCallback,
callback?: CreateChangeCallback): void|Promise<CreateChangeResponse> {
let records: Array<Record|string>;
if (typeof recordsOrCallback === 'function') {
callback = recordsOrCallback;
Expand All @@ -639,17 +606,6 @@ class Zone extends ServiceObject {
}
this.createChange({delete: records as Record[]}, callback!);
}
/**
* @typedef {array} ZoneEmptyResponse
* @property {Change} 0 A {@link Change} object.
* @property {object} 1 The full API response.
*/
/**
* @callback ZoneEmptyCallback
* @param {?Error} err Request error, if any.
* @param {?Change} change A {@link Change} object.
* @param {object} apiResponse The full API response.
*/
/**
* Emptying your zone means leaving only 'NS' and 'SOA' records. This method
* will first fetch the non-NS and non-SOA records from your zone using
Expand All @@ -658,34 +614,28 @@ class Zone extends ServiceObject {
*
* @see [ManagedZones: create API Documentation]{@link https://cloud.google.com/dns/api/v1/managedZones/create}
*
* @param {ZoneEmptyCallback} [callback] Callback function.
* @returns {Promise<ZoneEmptyResponse>}
* @param {CreateChangeCallback} [callback] Callback function.
* @returns {Promise<CreateChangeResponse>}
*/
empty(callback: CreateChangeCallback) {
empty(): Promise<CreateChangeResponse|[]>;
empty(callback: CreateChangeCallback): void;
empty(callback?: CreateChangeCallback):
void|Promise<CreateChangeResponse|[]> {
this.getRecords((err, records) => {
if (err) {
callback(err);
callback!(err);
return;
}
const recordsToDelete = records!.filter(record => {
return record.type !== 'NS' && record.type !== 'SOA';
});
if (recordsToDelete.length === 0) {
callback(null);
callback!(null);
} else {
this.deleteRecords(recordsToDelete, callback);
this.deleteRecords(recordsToDelete, callback!);
}
});
}
/**
* @typedef {array} ZoneExportResponse
* @property {object} 0 The full API response.
*/
/**
* @callback ZoneExportCallback
* @param {?Error} err Request error, if any.
* @param {object} apiResponse The full API response.
*/
/**
* Provide a path to a zone file to copy records into the zone.
*
Expand Down Expand Up @@ -713,15 +663,18 @@ class Zone extends ServiceObject {
* //-
* zone.export(zoneFilename).then(() => {});
*/
export(localPath: string, callback: (err: Error|null) => void) {
export(localPath: string): Promise<ZoneExportResponse>;
export(localPath: string, callback: ZoneExportCallback): void;
export(localPath: string, callback?: ZoneExportCallback):
void|Promise<ZoneExportResponse> {
this.getRecords((err, records) => {
if (err) {
callback(err);
callback!(err);
return;
}
const stringRecords = records!.map(x => x.toString()).join('\n');
fs.writeFile(localPath, stringRecords, 'utf-8', err => {
callback(err || null);
callback!(err || null);
});
});
}
Expand Down Expand Up @@ -1098,8 +1051,8 @@ import(localPath: string, callback: CreateChangeCallback) {fs.readFile(localPath
*
* @param {string|string[]} recordTypes The type(s) of records to replace.
* @param {Record|Record[]} newRecords The {@link Record} object(s) to add.
* @param {ZoneReplaceRecordsCallback} [callback] Callback function.
* @returns {Promise<ZoneReplaceRecordsResponse>}
* @param {CreateChangeCallback} [callback] Callback function.
* @returns {Promise<CreateChangeResponse>}
*
* @example
* const {DNS} = require('@google-cloud/dns');
Expand Down Expand Up @@ -1138,14 +1091,13 @@ import(localPath: string, callback: CreateChangeCallback) {fs.readFile(localPath
* const apiResponse = data[1];
* });
*/
replaceRecords(recordType: string|string[], newRecords: Record|Record[]): Promise<ZoneReplaceRecordsResponse>;
replaceRecords(recordType: string|string[], newRecords: Record|Record[]): Promise<CreateChangeResponse>;
replaceRecords(
recordType: string|string[], newRecords: Record|Record[],
callback: CreateChangeCallback): void;
replaceRecords(
recordType: string|string[], newRecords: Record|Record[],
callback?: CreateChangeCallback):
void|Promise<ZoneReplaceRecordsResponse> {
callback?: CreateChangeCallback): void|Promise<CreateChangeResponse> {
this.getRecords(recordType, (err, recordsToDelete) => {
if (err) {
callback!(err);
Expand Down Expand Up @@ -1178,13 +1130,11 @@ import(localPath: string, callback: CreateChangeCallback) {fs.readFile(localPath
* }
* });
*/
deleteRecordsByType_(recordTypes: string[]):
Promise<ZoneDeleteRecordsResponse>;
deleteRecordsByType_(
recordTypes: string[], callback: ZoneDeleteRecordsCallback): void;
deleteRecordsByType_(
recordTypes: string[], callback?: ZoneDeleteRecordsCallback):
void|Promise<ZoneDeleteRecordsResponse> {
deleteRecordsByType_(recordTypes: string[]): Promise<CreateChangeResponse>;
deleteRecordsByType_(recordTypes: string[], callback: CreateChangeCallback):
void;
deleteRecordsByType_(recordTypes: string[], callback?: CreateChangeCallback):
void|Promise<CreateChangeResponse> {
this.getRecords(recordTypes, (err, records) => {
if (err) {
callback!(err);
Expand Down

0 comments on commit 5314153

Please sign in to comment.