From abb42655e2d87f6dc202bb23d41ac89371b13ecd Mon Sep 17 00:00:00 2001 From: Aydrian Date: Tue, 23 Aug 2016 15:41:48 -0400 Subject: [PATCH] Switched JSHint for ESLint with SparkPost config (#159) * Switched JSHint for ESLint with SparkPost config * modified lint npm script to remove node_modules path --- .eslintrc | 6 +++ Gruntfile.js | 16 ++---- lib/SendGridCompatibility/Email.js | 53 ++++++++++--------- lib/SendGridCompatibility/index.js | 54 ++++++++++--------- lib/inboundDomains.js | 13 +++-- lib/messageEvents.js | 20 +++---- lib/recipientLists.js | 14 +++-- lib/relayWebhooks.js | 44 +++++++++------- lib/sendingDomains.js | 34 +++++++----- lib/sparkpost.js | 45 ++++++++-------- lib/subaccounts.js | 84 ++++++++++++++++-------------- lib/suppressionList.js | 9 ++-- lib/templates.js | 25 +++++---- lib/toApiFormat.js | 28 +++++----- lib/transmissions.js | 16 +++--- lib/webhooks.js | 35 ++++++++----- package.json | 5 +- test/spec/inboundDomains.spec.js | 1 - test/spec/messageEvents.spec.js | 1 - test/spec/recipientLists.spec.js | 1 - test/spec/relayWebhooks.spec.js | 1 - test/spec/sendingDomains.spec.js | 1 - test/spec/subaccounts.spec.js | 1 - test/spec/suppressionList.spec.js | 1 - test/spec/templates.spec.js | 1 - test/spec/transmissions.spec.js | 1 - test/spec/webhooks.spec.js | 1 - 27 files changed, 277 insertions(+), 234 deletions(-) create mode 100644 .eslintrc diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..2940395 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,6 @@ +{ + "extends": "sparkpost/api", + "globals": { + "Promise": true + } +} diff --git a/Gruntfile.js b/Gruntfile.js index bdbe8b3..b03bf6a 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -19,17 +19,6 @@ module.exports = function(grunt) { grunt.initConfig({ config: config, pkg: grunt.file.readJSON('package.json'), - jshint: { - files: [ - 'index.js', - 'lib/{,*/}*.js', - 'examples/{,*/}*.js' - ], - options: { - reporter: require('jshint-stylish'), - jshintrc: './.jshintrc' - } - }, bump: { options: { files: [ 'package.json' ] @@ -46,6 +35,9 @@ module.exports = function(grunt) { } }, shell: { + lint: { + command: 'npm run lint' + }, coverage: { command : path.join(config.binPath, 'istanbul') + ' cover --report lcov --dir test/reports/ node_modules/mocha/bin/_mocha test/spec -- --reporter ' + reporter, options : { @@ -68,7 +60,7 @@ module.exports = function(grunt) { }); // grunt lint - leverages grunt-contrib-jshint command, lints our code - grunt.registerTask('lint', [ 'jshint' ]); + grunt.registerTask('lint', [ 'shell:lint' ]); // grunt test - runs linting and then our unit tests grunt.registerTask('test', [ diff --git a/lib/SendGridCompatibility/Email.js b/lib/SendGridCompatibility/Email.js index a523122..e107d32 100644 --- a/lib/SendGridCompatibility/Email.js +++ b/lib/SendGridCompatibility/Email.js @@ -5,8 +5,9 @@ * * @param options object that contains initial values */ -function Email(options){ - for (var option in options) { +function Email(options) { + var option; + for (option in options) { this[option] = options[option]; } } @@ -17,85 +18,85 @@ function Email(options){ * @param Most have a single value to map * Add functions will often contain a key / value pair */ -Email.prototype.addTo = function (address){ - if (this.to === undefined){ +Email.prototype.addTo = function(address) { + if (this.to === undefined) { this.to = address; - } else if (typeof this.to === 'string'){ + } else if (typeof this.to === 'string') { this.to = [this.to]; this.to.push(address); } else { this.to.push(address); } }; -Email.prototype.setFrom = function (address){ +Email.prototype.setFrom = function(address) { this.from = address; }; -Email.prototype.setSubject = function (subject){ +Email.prototype.setSubject = function(subject) { this.subject = subject; }; -Email.prototype.setText = function (text){ +Email.prototype.setText = function(text) { this.text = text; }; -Email.prototype.setHtml = function (html){ +Email.prototype.setHtml = function(html) { this.html = html; }; -Email.prototype.addHeader = function (key, value){ - if (this.headers === undefined){ +Email.prototype.addHeader = function(key, value) { + if (this.headers === undefined) { this.headers = {}; } this.headers[key] = value; }; -Email.prototype.setHeaders = function (headers){ +Email.prototype.setHeaders = function(headers) { this.headers = headers; }; -Email.prototype.addSubstitution = function (key, value){ - if (this.sub === undefined){ +Email.prototype.addSubstitution = function(key, value) { + if (this.sub === undefined) { this.sub = {}; } - if (typeof value === 'string'){ + if (typeof value === 'string') { this.sub[key] = [value]; } else { this.sub[key] = value; } }; -Email.prototype.setSubstitutions = function (substitutions){ +Email.prototype.setSubstitutions = function(substitutions) { this.sub = substitutions; }; -Email.prototype.addSection = function (key, value){ - if (this.section === undefined){ +Email.prototype.addSection = function(key, value) { + if (this.section === undefined) { this.section = {}; } this.section[key] = value; }; -Email.prototype.setSections = function (sections){ +Email.prototype.setSections = function(sections) { this.section = sections; }; // SparkPost doesn't currently support addUniqueArg, throw an error -Email.prototype.addUniqueArg = function (){ +Email.prototype.addUniqueArg = function() { throw new Error('Unique Argument compatibility is not supported.'); }; // SparkPost doesn't currently support setUniqueArgs, throw an error -Email.prototype.setUniqueArgs = function (){ +Email.prototype.setUniqueArgs = function() { throw new Error('Unique Argument compatibility is not supported.'); }; // SparkPost doesn't currently support addCategory, throw an error -Email.prototype.addCategory = function (){ +Email.prototype.addCategory = function() { throw new Error('Category compatibility is not supported.'); }; // SparkPost doesn't currently support setCategories, throw an error -Email.prototype.setCategories = function (){ +Email.prototype.setCategories = function() { throw new Error('Category compatibility is not supported.'); }; // SparkPost doesn't currently support addFilter, throw an error -Email.prototype.addFilter = function (){ +Email.prototype.addFilter = function() { throw new Error('Filter compatibility is not supported.'); }; // SparkPost doesn't currently support setFilters, throw an error -Email.prototype.setFilters = function (){ +Email.prototype.setFilters = function() { throw new Error('Filter compatibility is not supported.'); }; // SparkPost doesn't currently support addFile, throw an error -Email.prototype.addFile = function (){ +Email.prototype.addFile = function() { throw new Error('File compatibility is not supported.'); }; diff --git a/lib/SendGridCompatibility/index.js b/lib/SendGridCompatibility/index.js index b5d605e..62dabcc 100644 --- a/lib/SendGridCompatibility/index.js +++ b/lib/SendGridCompatibility/index.js @@ -1,7 +1,8 @@ 'use strict'; -var _ = require('lodash'); -var url = require('url'); -var SparkPost = require('../sparkpost'); +var _ = require('lodash') + , url = require('url') + , SparkPost = require('../sparkpost') + , sendgrid, consolidateSubstitutionData, parseTo, translatePayload; /** * SendGrid compatibility constructor @@ -13,14 +14,15 @@ var SparkPost = require('../sparkpost'); * @param apiKey: api key string * @param options: optional additional options object */ -var sendgrid = function(username, apiKey, options) { +sendgrid = function(username, apiKey, options) { + var urlOpts, opts; options = options || {}; - var urlOpts = { + urlOpts = { protocol: options.protocol , hostname: options.host , port: options.port - } - , opts = { + }; + opts = { endpoint: url.format(urlOpts) }; @@ -35,13 +37,13 @@ var sendgrid = function(username, apiKey, options) { * be translated into a SparkPost payload * @returns object: substitutionData object as per SparkPost payload format */ -var consolidateSubstitutionData = function(payload) { +consolidateSubstitutionData = function(payload) { var substitutionData = {}; - if (payload.sub !== undefined && payload.section !== undefined){ + if (payload.sub !== undefined && payload.section !== undefined) { substitutionData = _.merge(payload.sub, payload.section); - } else if (payload.sub !== undefined){ + } else if (payload.sub !== undefined) { substitutionData = payload.sub; - } else if (payload.section !== undefined){ + } else if (payload.section !== undefined) { substitutionData = payload.section; } return substitutionData; @@ -55,18 +57,18 @@ var consolidateSubstitutionData = function(payload) { * be translated into a SparkPost payload * @returns array: recipients array as per SparkPost payload format */ -var parseTo = function(payload){ - var recipients = []; - if (typeof payload.to === 'string'){ +parseTo = function(payload) { + var recipients = [], to, i; + if (typeof payload.to === 'string') { payload.to = [payload.to]; } - for (var i = 0; payload.to.length > i; i++){ - var to = { + for (i = 0; payload.to.length > i; i++) { + to = { address: { email: payload.to[i] } }; - if (payload.toname !== undefined && payload.toname[i] !== undefined){ + if (payload.toname !== undefined && payload.toname[i] !== undefined) { to.address.name = payload.toname[i]; } recipients.push(to); @@ -82,21 +84,21 @@ var parseTo = function(payload){ * be translated into a SparkPost payload * @returns object: translation from SendGrid payload to SparkPost payload */ -var translatePayload = function(payload) { +translatePayload = function(payload) { var sub = consolidateSubstitutionData(payload) , input = { - recipients: [], - from: '', - html: '', - text: '', - subject: '' - }; + recipients: [], + from: '', + html: '', + text: '', + subject: '' + }; - if (payload.to !== undefined){ + if (payload.to !== undefined) { input.recipients = parseTo(payload); } input.from = payload.from; - if (payload.fromname !== undefined){ + if (payload.fromname !== undefined) { input.from = input.from + ' <' + payload.fromname + '>'; } input.subject = payload.subject; diff --git a/lib/inboundDomains.js b/lib/inboundDomains.js index b9d4937..362f9d6 100644 --- a/lib/inboundDomains.js +++ b/lib/inboundDomains.js @@ -1,7 +1,6 @@ 'use strict'; var api = 'inbound-domains' - /* global -Promise */ , Promise = require('./Promise'); module.exports = function(client) { @@ -13,6 +12,8 @@ module.exports = function(client) { return client.get(options).asCallback(callback); }, find: function(domain, callback) { + var options; + if(typeof domain === 'function') { callback = domain; domain = null; @@ -22,12 +23,14 @@ module.exports = function(client) { return Promise.reject(new Error('domain is required')).asCallback(callback); } - var options = { + options = { uri: api + '/' + domain }; return client.get(options).asCallback(callback); }, create: function(domain, callback) { + var options; + if(typeof domain === 'function') { callback = domain; domain = null; @@ -37,7 +40,7 @@ module.exports = function(client) { return Promise.reject(new Error('domain is required')).asCallback(callback); } - var options = { + options = { uri: api , json: { domain: domain @@ -46,6 +49,8 @@ module.exports = function(client) { return client.post(options, callback).asCallback(callback); }, delete: function(domain, callback) { + var options; + if (typeof domain === 'function') { callback = domain; domain = null; @@ -55,7 +60,7 @@ module.exports = function(client) { return Promise.reject(new Error('domain is required')).asCallback(callback); } - var options = { + options = { uri: api + '/' + domain }; return client.delete(options).asCallback(callback); diff --git a/lib/messageEvents.js b/lib/messageEvents.js index 93cd40e..86ce335 100644 --- a/lib/messageEvents.js +++ b/lib/messageEvents.js @@ -6,19 +6,19 @@ var api = 'message-events'; * "Class" declaration, Message Events API exposes one function: * - search: retrieves list of message events according to given params */ -module.exports = function (client) { +module.exports = function(client) { return { search: function(parameters, callback) { var arrayParams = [ - 'bounce_classes', - 'campaign_ids', - 'events', - 'friendly_froms', - 'message_ids', - 'recipients', - 'template_ids', - 'transmission_ids' - ] + 'bounce_classes', + 'campaign_ids', + 'events', + 'friendly_froms', + 'message_ids', + 'recipients', + 'template_ids', + 'transmission_ids' + ] , options; arrayParams.forEach(function(paramname) { diff --git a/lib/recipientLists.js b/lib/recipientLists.js index 4904822..1d95ab1 100644 --- a/lib/recipientLists.js +++ b/lib/recipientLists.js @@ -1,7 +1,6 @@ 'use strict'; var api = 'recipient-lists' - /* global -Promise */ , Promise = require('./Promise') , toApiFormat = require('./toApiFormat'); @@ -14,13 +13,14 @@ module.exports = function(client) { return client.get(reqOpts).asCallback(callback); }, find: function(options, callback) { + var reqOpts; options = options || {}; if(!options.id) { return Promise.reject(new Error('id is required')).asCallback(callback); } - var reqOpts = { + reqOpts = { uri: api + '/' + options.id }; @@ -32,13 +32,14 @@ module.exports = function(client) { return client.get(reqOpts).asCallback(callback); }, create: function(options, callback) { + var reqOpts; options = options || {}; if(!options.recipients) { return Promise.reject(new Error('recipients list is required')).asCallback(callback); } - var reqOpts = { + reqOpts = { uri: api }; @@ -53,13 +54,14 @@ module.exports = function(client) { return client.post(reqOpts).asCallback(callback); }, update: function(options, callback) { + var reqOpts; options = options || {}; if(!options.id) { return Promise.reject(new Error('recipients list id is required')).asCallback(callback); } - var reqOpts = { + reqOpts = { uri: api + '/' + options.id }; @@ -74,6 +76,8 @@ module.exports = function(client) { return client.put(reqOpts, callback).asCallback(callback); }, delete: function(id, callback) { + var reqOpts; + if (typeof id === 'function') { callback = id; id = null; @@ -83,7 +87,7 @@ module.exports = function(client) { return Promise.reject(new Error('id is required')).asCallback(callback); } - var reqOpts = { + reqOpts = { uri: api + '/' + id }; return client.delete(reqOpts).asCallback(callback); diff --git a/lib/relayWebhooks.js b/lib/relayWebhooks.js index b825286..233cc32 100644 --- a/lib/relayWebhooks.js +++ b/lib/relayWebhooks.js @@ -1,23 +1,21 @@ 'use strict'; var api = 'relay-webhooks' - /* global -Promise */ - , Promise = require('./Promise'); + , Promise = require('./Promise') + , toApiFormat = function(input) { + var model = { + match: {} + }; -var toApiFormat = function(input) { - var model = { - match: {} - }; - - model.target = input.target; - model.match.domain = input.domain; + model.target = input.target; + model.match.domain = input.domain; - model.name = input.name; - model.auth_token = input.authToken; - model.match.protocol = input.protocol; + model.name = input.name; + model.auth_token = input.authToken; + model.match.protocol = input.protocol; - return model; -}; + return model; + }; module.exports = function(client) { var relayWebhooks = { @@ -28,6 +26,8 @@ module.exports = function(client) { return client.get(reqOpts).asCallback(callback); }, find: function(relayWebhookId, callback) { + var options; + if(typeof relayWebhookId === 'function') { callback = relayWebhookId; relayWebhookId = null; @@ -37,12 +37,14 @@ module.exports = function(client) { return Promise.reject(new Error('relayWebhookId is required')).asCallback(callback); } - var options = { + options = { uri: api + '/' + relayWebhookId }; return client.get(options).asCallback(callback); }, create: function(options, callback) { + var reqOpts; + if(typeof options === 'function') { callback = options; options = null; @@ -60,13 +62,15 @@ module.exports = function(client) { return Promise.reject(new Error('domain is required in options')).asCallback(callback); } - var reqOpts = { + reqOpts = { uri: api , json: toApiFormat(options) }; return client.post(reqOpts).asCallback(callback); }, update: function(options, callback) { + var relayWebhookId, reqOpts; + if(typeof options === 'function') { callback = options; options = null; @@ -80,14 +84,16 @@ module.exports = function(client) { return Promise.reject(new Error('relayWebhookId is required in options')).asCallback(callback); } - var relayWebhookId = options.relayWebhookId; - var reqOpts = { + relayWebhookId = options.relayWebhookId; + reqOpts = { uri: api + '/' + relayWebhookId , json: toApiFormat(options) }; return client.put(reqOpts).asCallback(callback); }, delete: function(relayWebhookId, callback) { + var options; + if (typeof relayWebhookId === 'function') { callback = relayWebhookId; relayWebhookId = null; @@ -97,7 +103,7 @@ module.exports = function(client) { return Promise.reject(new Error('relayWebhookId is required')).asCallback(callback); } - var options = { + options = { uri: api + '/' + relayWebhookId }; diff --git a/lib/sendingDomains.js b/lib/sendingDomains.js index b335508..1731145 100644 --- a/lib/sendingDomains.js +++ b/lib/sendingDomains.js @@ -1,7 +1,6 @@ 'use strict'; var api = 'sending-domains' - /* global -Promise */ , Promise = require('./Promise') , toApiFormat = require('./toApiFormat'); @@ -14,16 +13,18 @@ var api = 'sending-domains' * - all: retreives a list of sending domains * - find: retreives info about a specific sending domain */ -module.exports = function (client) { +module.exports = function(client) { var sendingDomains = { - all: function (callback) { //list + all: function(callback) { //list var options = { uri: api }; return client.get(options).asCallback(callback); }, - find: function (domain, callback) { //retrieve + find: function(domain, callback) { //retrieve + var options; + if(typeof domain === 'function') { callback = domain; domain = null; @@ -33,12 +34,14 @@ module.exports = function (client) { return Promise.reject(new Error('domain is required')).asCallback(callback); } - var options = { + options = { uri: api + '/' + domain }; return client.get(options).asCallback(callback); }, - create: function (domainBody, callback) { + create: function(domainBody, callback) { + var options; + if(typeof domainBody === 'function') { callback = domainBody; domainBody = null; @@ -52,13 +55,15 @@ module.exports = function (client) { return Promise.reject(new Error('domain is required in the domainBody')).asCallback(callback); } - var options = { + options = { uri: api , json: toApiFormat(domainBody) }; return client.post(options).asCallback(callback); }, - update: function (domainBody, callback) { + update: function(domainBody, callback) { + var obj, options; + if(typeof domainBody === 'function') { callback = domainBody; domainBody = null; @@ -72,14 +77,16 @@ module.exports = function (client) { return Promise.reject(new Error('domain is required in the domainBody')).asCallback(callback); } - var obj = toApiFormat(domainBody); - var options = { + obj = toApiFormat(domainBody); + options = { uri: api + '/' + obj.domain , json: toApiFormat(domainBody) }; return client.put(options).asCallback(callback); }, delete: function(domain, callback) { + var options; + if (typeof domain === 'function') { callback = domain; domain = null; @@ -89,19 +96,20 @@ module.exports = function (client) { return Promise.reject(new Error('domain is required')).asCallback(callback); } - var options = { + options = { uri: api + '/' + domain }; return client.delete(options).asCallback(callback); }, - verify: function (options, callback) { + verify: function(options, callback) { + var reqOpts; options = options || {}; if(!options.domain) { return Promise.reject(new Error('domain is required')).asCallback(callback); } - var reqOpts = { + reqOpts = { uri: api + '/' + options.domain + '/verify', json: { dkim_verify: options.verifyDKIM !== false, diff --git a/lib/sparkpost.js b/lib/sparkpost.js index 41e9c7d..aa955b1 100644 --- a/lib/sparkpost.js +++ b/lib/sparkpost.js @@ -1,26 +1,26 @@ 'use strict'; -var version = require( '../package.json').version +var version = require('../package.json').version , url = require('url') - /* global -Promise */ , Promise = require('./Promise') - , request = require( 'request') - , _ = require( 'lodash' ); + , request = require('request') + , _ = require('lodash') + , defaults, resolveUri, handleOptions, createSparkPostError, SparkPost; //REST API Config Defaults -var defaults = { +defaults = { origin: 'https://api.sparkpost.com:443', apiVersion: 'v1' }; -var resolveUri = function(origin, uri) { +resolveUri = function(origin, uri) { if(!/^http/.test(uri)) { uri = url.resolve(origin, uri); } return uri; }; -var handleOptions = function(apiKey, options) { +handleOptions = function(apiKey, options) { if (typeof apiKey === 'object') { options = apiKey; options.key = process.env.SPARKPOST_API_KEY; @@ -34,9 +34,9 @@ var handleOptions = function(apiKey, options) { return options; }; -var createSparkPostError = function(res, body) { - body = body || {}; +createSparkPostError = function(res, body) { var err = new Error(res.statusMessage); + body = body || {}; err.name = 'SparkPostError'; err.errors = body.errors; err.statusCode = res.statusCode; @@ -44,7 +44,7 @@ var createSparkPostError = function(res, body) { return err; }; -var SparkPost = function(apiKey, options) { +SparkPost = function(apiKey, options) { options = handleOptions(apiKey, options); @@ -79,17 +79,18 @@ var SparkPost = function(apiKey, options) { this.webhooks = require('./webhooks')(this); }; -SparkPost.prototype.request = function( options, callback ) { +SparkPost.prototype.request = function(options, callback) { + var baseUrl; // we need options if(!_.isPlainObject(options)) { - throw new TypeError( 'options argument is required' ); + throw new TypeError('options argument is required'); } - var baseUrl = this.origin + '/api/' + this.apiVersion + '/'; + baseUrl = this.origin + '/api/' + this.apiVersion + '/'; // if we don't have a fully qualified URL let's make one - options.uri = resolveUri( baseUrl, options.uri ); + options.uri = resolveUri(baseUrl, options.uri); // merge headers options.headers = _.merge({}, this.defaultHeaders, options.headers); @@ -109,15 +110,17 @@ SparkPost.prototype.request = function( options, callback ) { } return new Promise(function(resolve, reject) { - request(options, function (err, res, body) { - var invalidCodeRegex = /(5|4)[0-9]{2}/; + request(options, function(err, res, body) { + var invalidCodeRegex = /(5|4)[0-9]{2}/ + , response; + if (err) { reject(err); } else if (invalidCodeRegex.test(res.statusCode)) { err = createSparkPostError(res, body); reject(err); } else { - var response = body.results || body; + response = body.results || body; if (options.debug) { response.debug = res; } @@ -127,25 +130,25 @@ SparkPost.prototype.request = function( options, callback ) { }).asCallback(callback); }; -SparkPost.prototype.get = function( options, callback ) { +SparkPost.prototype.get = function(options, callback) { options.method = 'GET'; return this.request(options).asCallback(callback); }; -SparkPost.prototype.post = function( options, callback ) { +SparkPost.prototype.post = function(options, callback) { options.method = 'POST'; return this.request(options).asCallback(callback); }; -SparkPost.prototype.put = function( options, callback ) { +SparkPost.prototype.put = function(options, callback) { options.method = 'PUT'; return this.request(options).asCallback(callback); }; -SparkPost.prototype['delete'] = function( options, callback ) { +SparkPost.prototype.delete = function(options, callback) { options.method = 'DELETE'; return this.request(options).asCallback(callback); diff --git a/lib/subaccounts.js b/lib/subaccounts.js index f12984d..db3513b 100644 --- a/lib/subaccounts.js +++ b/lib/subaccounts.js @@ -1,47 +1,45 @@ 'use strict'; var api = 'subaccounts' - /* global -Promise */ - , Promise = require('./Promise'); - -var toApiFormat = function(input) { - var model = {}; - - model.name = input.name; - model.key_label = input.keyLabel; - model.ip_pool = input.ipPool; - model.status = input.status; - - model.key_grants = Array.isArray(input.keyGrants) ? input.keyGrants : [input.keyGrants]; - - // server returns 500 if key_valid_ips is empty array - if (input.keyValidIps) { - var keyValidIpsIsArray = Array.isArray(input.keyValidIps); - if (keyValidIpsIsArray && input.keyValidIps.length > 0) { - model.key_valid_ips = input.keyValidIps; - } else if (!keyValidIpsIsArray) { - model.key_valid_ips = [input.keyValidIps]; + , Promise = require('./Promise') + , toApiFormat = function(input) { + var model = {} + , keyValidIpsIsArray; + + model.name = input.name; + model.key_label = input.keyLabel; + model.ip_pool = input.ipPool; + model.status = input.status; + + model.key_grants = Array.isArray(input.keyGrants) ? input.keyGrants : [input.keyGrants]; + + // server returns 500 if key_valid_ips is empty array + if (input.keyValidIps) { + keyValidIpsIsArray = Array.isArray(input.keyValidIps); + if (keyValidIpsIsArray && input.keyValidIps.length > 0) { + model.key_valid_ips = input.keyValidIps; + } else if (!keyValidIpsIsArray) { + model.key_valid_ips = [input.keyValidIps]; + } } - } - - return model; -}; -var validateCreateOptions = function(input) { - if (!input.name) { - return 'name is required'; + return model; } + , validateCreateOptions = function(input) { + if (!input.name) { + return 'name is required'; + } - if (!input.keyLabel) { - return 'keyLabel is required'; - } + if (!input.keyLabel) { + return 'keyLabel is required'; + } - if (!input.keyGrants) { - return 'keyGrants is required'; - } + if (!input.keyGrants) { + return 'keyGrants is required'; + } - return null; -}; + return null; + }; module.exports = function(client) { var subaccounts = { @@ -52,6 +50,8 @@ module.exports = function(client) { return client.get(options).asCallback(callback); }, find: function(subaccountId, callback) { + var options; + if(typeof subaccountId === 'function') { callback = subaccountId; subaccountId = null; @@ -61,12 +61,14 @@ module.exports = function(client) { return Promise.reject(new Error('subaccountId is required')).asCallback(callback); } - var options = { + options = { uri: api + '/' + subaccountId }; return client.get(options).asCallback(callback); }, create: function(options, callback) { + var validation, reqOpts; + if(typeof options === 'function') { callback = options; options = null; @@ -76,18 +78,20 @@ module.exports = function(client) { return Promise.reject(new Error('options are required')).asCallback(callback); } - var validation = validateCreateOptions(options); + validation = validateCreateOptions(options); if (validation) { return Promise.reject(new Error(validation + ' in options')).asCallback(callback); } - var reqOpts = { + reqOpts = { uri: api, json: toApiFormat(options) }; return client.post(reqOpts).asCallback(callback); }, update: function(options, callback) { + var subaccountId, reqOpts; + if(typeof options === 'function') { callback = options; options = null; @@ -101,8 +105,8 @@ module.exports = function(client) { return Promise.reject(new Error('subaccountId is required in options')).asCallback(callback); } - var subaccountId = options.subaccountId; - var reqOpts = { + subaccountId = options.subaccountId; + reqOpts = { uri: api + '/' + subaccountId, json: toApiFormat(options) }; diff --git a/lib/suppressionList.js b/lib/suppressionList.js index 444dbeb..91c864b 100644 --- a/lib/suppressionList.js +++ b/lib/suppressionList.js @@ -1,7 +1,6 @@ 'use strict'; var api = 'suppression-list' - /* global -Promise */ , Promise = require('./Promise') , toApiFormat = require('./toApiFormat'); @@ -16,6 +15,8 @@ module.exports = function(client) { return client.get(options).asCallback(callback); }, checkStatus: function(email, callback) { + var options; + if(typeof email === 'function') { callback = email; email = null; @@ -25,12 +26,14 @@ module.exports = function(client) { return Promise.reject(new Error('email is required')).asCallback(callback); } - var options = { + options = { uri: api + '/' + email }; return client.get(options).asCallback(callback); }, removeStatus: function(email, callback) { + var options; + if(typeof email === 'function') { callback = email; email = null; @@ -40,7 +43,7 @@ module.exports = function(client) { return Promise.reject(new Error('email is required')).asCallback(callback); } - var options = { + options = { uri: api + '/' + email }; return client.delete(options).asCallback(callback); diff --git a/lib/templates.js b/lib/templates.js index b7ee06e..e29aaad 100644 --- a/lib/templates.js +++ b/lib/templates.js @@ -1,7 +1,6 @@ 'use strict'; var api = 'templates' - /* global -Promise */ , Promise = require('./Promise') , toApiFormat = require('./toApiFormat'); @@ -14,13 +13,14 @@ module.exports = function(client) { return client.get(options).asCallback(callback); }, find: function(options, callback) { + var reqOpts; options = options || {}; if(!options.id) { return Promise.reject(new Error('template id is required')).asCallback(callback); } - var reqOpts = { + reqOpts = { uri: api + '/' + options.id }; @@ -32,13 +32,14 @@ module.exports = function(client) { return client.get(reqOpts).asCallback(callback); }, create: function(options, callback) { + var reqOpts; options = options || {}; if (!options.template) { return Promise.reject(new Error('template object is required')).asCallback(callback); } - var reqOpts = { + reqOpts = { uri: api , json: toApiFormat(options.template) }; @@ -46,17 +47,18 @@ module.exports = function(client) { return client.post(reqOpts).asCallback(callback); }, update: function(options, callback) { + var object, reqOpts; options = options || {}; if(!options.template) { return Promise.reject(new Error('template object is required')).asCallback(callback); } - var object = toApiFormat(options.template) - , reqOpts = { - uri: api + '/' + object.id - , json: object - }; + object = toApiFormat(options.template); + reqOpts = { + uri: api + '/' + object.id + , json: object + }; if(options.update_published) { reqOpts.qs = reqOpts.qs || {}; @@ -66,6 +68,8 @@ module.exports = function(client) { return client.put(reqOpts).asCallback(callback); }, delete: function(id, callback) { + var options; + if (typeof id === 'function') { callback = id; id = null; @@ -75,19 +79,20 @@ module.exports = function(client) { return Promise.reject(new Error('template id is required')).asCallback(callback); } - var options = { + options = { uri: api + '/' + id }; return client.delete(options).asCallback(callback); }, preview: function(options, callback) { + var reqOpts; options = options || {}; if(!options.id) { return Promise.reject(new Error('template id is required')).asCallback(callback); } - var reqOpts = { + reqOpts = { uri: api + '/' + options.id + '/preview' , json: { substitution_data: options.data diff --git a/lib/toApiFormat.js b/lib/toApiFormat.js index 3f33a46..b899a5b 100644 --- a/lib/toApiFormat.js +++ b/lib/toApiFormat.js @@ -1,22 +1,23 @@ 'use strict'; var _ = require('lodash') - , pointer = require('json-pointer'); - -var excludeList = [ - '/substitution_data', - '/tags', - '/metadata', - '/attributes', - '/headers', - '/content/email_rfc822' -]; + , pointer = require('json-pointer') + , excludeList = [ + '/substitution_data', + '/tags', + '/metadata', + '/attributes', + '/headers', + '/content/email_rfc822' + ]; function snakedKeyClone(source) { + var target; + if (!_.isObject(source)) { return source; } - var target = Array.isArray(source) ? [] : {}; + target = Array.isArray(source) ? [] : {}; Object.keys(source).forEach(function(key) { target[_.snakeCase(key)] = snakedKeyClone(source[key]); @@ -26,8 +27,7 @@ function snakedKeyClone(source) { } module.exports = function toApiFormat(source) { - - var excludedObjects = {}; + var excludedObjects = {}, target; // Look in the source object for the excluded pointers and take a copy of the // objects pointed to by those keys. Then remove them from the source object. @@ -39,7 +39,7 @@ module.exports = function toApiFormat(source) { }); // Make a clone of the remaining source object but with snaked case keys - var target = snakedKeyClone(source); + target = snakedKeyClone(source); // Reinstated the un-modified objects into the target excludeList.forEach(function(exclusionPointer) { diff --git a/lib/transmissions.js b/lib/transmissions.js index 5c99dcb..7838be4 100644 --- a/lib/transmissions.js +++ b/lib/transmissions.js @@ -1,7 +1,6 @@ 'use strict'; var api = 'transmissions' - /* global -Promise */ , Promise = require('./Promise') , toApiFormat = require('./toApiFormat'); @@ -13,16 +12,17 @@ var api = 'transmissions' module.exports = function(client) { return { - send: function (options, callback) { + send: function(options, callback) { + var reqOpts, mappedInput; options = options || {}; if(!options.transmissionBody) { return Promise.reject(new Error('transmissionBody is required')).asCallback(callback); } - var mappedInput = toApiFormat(options.transmissionBody); + mappedInput = toApiFormat(options.transmissionBody); - var reqOpts = { + reqOpts = { uri: api, json: mappedInput }; @@ -35,13 +35,15 @@ module.exports = function(client) { return client.post(reqOpts).asCallback(callback); }, - all: function (options, callback) { + all: function(options, callback) { + var reqOpts; + if(typeof options === 'function') { callback = options; options = {}; } - var reqOpts = { + reqOpts = { uri: api, qs: {} }; @@ -56,7 +58,7 @@ module.exports = function(client) { return client.get(reqOpts).asCallback(callback); }, - find: function (transmissionID, callback) { + find: function(transmissionID, callback) { var options = { uri: api + '/' + transmissionID }; diff --git a/lib/webhooks.js b/lib/webhooks.js index a35354c..a338134 100644 --- a/lib/webhooks.js +++ b/lib/webhooks.js @@ -1,7 +1,6 @@ 'use strict'; var api = 'webhooks' - /* global -Promise */ , Promise = require('./Promise') , toApiFormat = require('./toApiFormat'); @@ -25,12 +24,14 @@ module.exports = function(client) { return client.get(reqOpts).asCallback(callback); }, describe: function(options, callback) { + var reqOpts; options = options || {}; if(!options.id) { return Promise.reject(new Error('id is required')).asCallback(callback); } - var reqOpts = { + + reqOpts = { uri: api + '/' + options.id }; @@ -42,6 +43,8 @@ module.exports = function(client) { return client.get(reqOpts).asCallback(callback); }, create: function(webhook, callback) { + var options; + if(typeof webhook === 'function') { callback = webhook; webhook = null; @@ -50,7 +53,8 @@ module.exports = function(client) { if(!webhook) { return Promise.reject(new Error('webhook object is required')).asCallback(callback); } - var options = { + + options = { uri: api , json: toApiFormat(webhook) }; @@ -58,6 +62,8 @@ module.exports = function(client) { return client.post(options).asCallback(callback); }, update: function(webhook, callback) { + var object, options; + if(typeof webhook === 'function') { callback = webhook; webhook = null; @@ -67,15 +73,18 @@ module.exports = function(client) { return Promise.reject(new Error('webhook object is required')).asCallback(callback); } - var object = toApiFormat(webhook) - , options = { - uri: api + '/' + webhook.id - , json: object - }; + object = toApiFormat(webhook); + + options = { + uri: api + '/' + webhook.id + , json: object + }; return client.put(options).asCallback(callback); }, delete: function(id, callback) { + var options; + if (typeof id === 'function') { callback = id; id = null; @@ -85,13 +94,14 @@ module.exports = function(client) { return Promise.reject(new Error('id is required')).asCallback(callback); } - var options = { + options = { uri: api + '/' + id }; return client.delete(options).asCallback(callback); }, validate: function(options, callback) { + var reqOpts; options = options || {}; if(!options.id) { @@ -102,7 +112,7 @@ module.exports = function(client) { return Promise.reject(new Error('message is required')).asCallback(callback); } - var reqOpts = { + reqOpts = { uri: api + '/' + options.id + '/validate' , json: { message: options.message @@ -112,13 +122,14 @@ module.exports = function(client) { return client.post(reqOpts).asCallback(callback); }, getBatchStatus: function(options, callback) { + var reqOpts; options = options || {}; if(!options.id) { return Promise.reject(new Error('id is required')).asCallback(callback); } - var reqOpts = { + reqOpts = { uri: api + '/' + options.id + '/batch-status' }; @@ -135,7 +146,7 @@ module.exports = function(client) { }; return client.get(reqOpts).asCallback(callback); }, - getSamples: function(options, callback){ + getSamples: function(options, callback) { var reqOpts = { uri: api + '/events/samples' }; diff --git a/package.json b/package.json index 4dd7f0f..96c442c 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "description": "A Node.js wrapper for interfacing with your favorite SparkPost APIs", "main": "./lib/sparkpost.js", "scripts": { + "lint": "eslint --fix lib/**", "test": "grunt", "ci": "grunt && grunt coveralls:grunt_coveralls_coverage" }, @@ -23,13 +24,13 @@ "homepage": "https://github.com/SparkPost/node-sparkpost", "devDependencies": { "chai": "1.9.1", + "eslint": "^3.3.1", + "eslint-config-sparkpost": "^1.0.1", "grunt": "0.4.5", "grunt-bump": "^0.3.1", - "grunt-contrib-jshint": "0.10.0", "grunt-coveralls": "^1.0.0", "grunt-shell": "1.1.1", "istanbul": "0.3.2", - "jshint-stylish": "0.4.0", "matchdep": "0.3.0", "mocha": "1.21.4", "nock": "^7.2.2", diff --git a/test/spec/inboundDomains.spec.js b/test/spec/inboundDomains.spec.js index a6a0c40..9f0f802 100644 --- a/test/spec/inboundDomains.spec.js +++ b/test/spec/inboundDomains.spec.js @@ -2,7 +2,6 @@ var chai = require('chai') , expect = chai.expect , sinon = require('sinon') , sinonChai = require('sinon-chai') - /* global -Promise */ , Promise = require('../../lib/Promise'); chai.use(sinonChai); diff --git a/test/spec/messageEvents.spec.js b/test/spec/messageEvents.spec.js index af3f0a5..45d8540 100644 --- a/test/spec/messageEvents.spec.js +++ b/test/spec/messageEvents.spec.js @@ -2,7 +2,6 @@ var chai = require('chai') , expect = chai.expect , sinon = require('sinon') , sinonChai = require('sinon-chai') - /* global -Promise */ , Promise = require('../../lib/Promise'); chai.use(sinonChai); diff --git a/test/spec/recipientLists.spec.js b/test/spec/recipientLists.spec.js index 6c493fd..678db2e 100644 --- a/test/spec/recipientLists.spec.js +++ b/test/spec/recipientLists.spec.js @@ -2,7 +2,6 @@ var chai = require('chai') , expect = chai.expect , sinon = require('sinon') , sinonChai = require('sinon-chai') - /* global -Promise */ , Promise = require('../../lib/Promise'); chai.use(sinonChai); diff --git a/test/spec/relayWebhooks.spec.js b/test/spec/relayWebhooks.spec.js index 98d5f19..3a5d6cf 100644 --- a/test/spec/relayWebhooks.spec.js +++ b/test/spec/relayWebhooks.spec.js @@ -2,7 +2,6 @@ var chai = require('chai') , expect = chai.expect , sinon = require('sinon') , sinonChai = require('sinon-chai') - /* global -Promise */ , Promise = require('../../lib/Promise'); chai.use(sinonChai); diff --git a/test/spec/sendingDomains.spec.js b/test/spec/sendingDomains.spec.js index a348fff..c127be8 100644 --- a/test/spec/sendingDomains.spec.js +++ b/test/spec/sendingDomains.spec.js @@ -2,7 +2,6 @@ var chai = require('chai') , expect = chai.expect , sinon = require('sinon') , sinonChai = require('sinon-chai') - /* global -Promise */ , Promise = require('../../lib/Promise'); chai.use(sinonChai); diff --git a/test/spec/subaccounts.spec.js b/test/spec/subaccounts.spec.js index d74f80b..4eb5293 100644 --- a/test/spec/subaccounts.spec.js +++ b/test/spec/subaccounts.spec.js @@ -2,7 +2,6 @@ var chai = require('chai') , expect = chai.expect , sinon = require('sinon') , sinonChai = require('sinon-chai') - /* global -Promise */ , Promise = require('../../lib/Promise'); chai.use(sinonChai); diff --git a/test/spec/suppressionList.spec.js b/test/spec/suppressionList.spec.js index b993800..4eec127 100644 --- a/test/spec/suppressionList.spec.js +++ b/test/spec/suppressionList.spec.js @@ -2,7 +2,6 @@ var chai = require('chai') , expect = chai.expect , sinon = require('sinon') , sinonChai = require('sinon-chai') - /* global -Promise */ , Promise = require('../../lib/Promise'); chai.use(sinonChai); diff --git a/test/spec/templates.spec.js b/test/spec/templates.spec.js index 41d8a5a..9161cea 100644 --- a/test/spec/templates.spec.js +++ b/test/spec/templates.spec.js @@ -2,7 +2,6 @@ var chai = require('chai') , expect = chai.expect , sinon = require('sinon') , sinonChai = require('sinon-chai') - /* global -Promise */ , Promise = require('../../lib/Promise'); chai.use(sinonChai); diff --git a/test/spec/transmissions.spec.js b/test/spec/transmissions.spec.js index 3d436e4..d4aa07f 100644 --- a/test/spec/transmissions.spec.js +++ b/test/spec/transmissions.spec.js @@ -2,7 +2,6 @@ var chai = require('chai') , expect = chai.expect , sinon = require('sinon') , sinonChai = require('sinon-chai') - /* global -Promise */ , Promise = require('../../lib/Promise'); chai.use(sinonChai); diff --git a/test/spec/webhooks.spec.js b/test/spec/webhooks.spec.js index 777edeb..636d133 100644 --- a/test/spec/webhooks.spec.js +++ b/test/spec/webhooks.spec.js @@ -2,7 +2,6 @@ var chai = require('chai') , expect = chai.expect , sinon = require('sinon') , sinonChai = require('sinon-chai') - /* global -Promise */ , Promise = require('../../lib/Promise'); chai.use(sinonChai);