diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..6a94633 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,13 @@ +{ + "globals": { + "console": true, + "module": true, + "require": true + }, + "env": { + "browser": true + }, + "rules": { + "quotes": "single" + } +} diff --git a/Gruntfile.js b/Gruntfile.js index edb6844..2aa2e74 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -48,6 +48,10 @@ module.exports = function(grunt) { } }, + eslint: { + target: ['lib/**/*.js'] + }, + karma: { options: { configFile: 'karma.conf.js' @@ -78,7 +82,7 @@ module.exports = function(grunt) { } }); - grunt.registerTask('test', 'Run the jasmine and nodeunit tests', ['webpack:global', 'nodeunit', 'karma:single', 'ts']); + grunt.registerTask('test', 'Run the jasmine and nodeunit tests', ['eslint', 'webpack:global', 'nodeunit', 'karma:single', 'ts']); grunt.registerTask('build', 'Run webpack and bundle the source', ['webpack']); grunt.registerTask('publish', 'Prepare the code for release', ['clean', 'test', 'build', 'usebanner', 'update_json']); }; diff --git a/lib/adapters/http.js b/lib/adapters/http.js index 1fb5b2b..0f6266d 100644 --- a/lib/adapters/http.js +++ b/lib/adapters/http.js @@ -9,6 +9,8 @@ var pkg = require('./../../package.json'); var Buffer = require('buffer').Buffer; module.exports = function httpAdapter(resolve, reject, config) { + 'use strict'; + // Transform request data var data = transformData( config.data, @@ -71,9 +73,9 @@ module.exports = function httpAdapter(resolve, reject, config) { }; // Resolve or reject the Promise based on the status - (res.statusCode >= 200 && res.statusCode < 300 - ? resolve - : reject)(response); + (res.statusCode >= 200 && res.statusCode < 300 ? + resolve : + reject)(response); }); }); diff --git a/lib/adapters/xhr.js b/lib/adapters/xhr.js index 2e4106f..5ae63ce 100644 --- a/lib/adapters/xhr.js +++ b/lib/adapters/xhr.js @@ -1,3 +1,5 @@ +/*global ActiveXObject:true*/ + var defaults = require('./../defaults'); var utils = require('./../utils'); var buildUrl = require('./../helpers/buildUrl'); @@ -7,6 +9,8 @@ var transformData = require('./../helpers/transformData'); var urlIsSameOrigin = require('./../helpers/urlIsSameOrigin'); module.exports = function xhrAdapter(resolve, reject, config) { + 'use strict'; + // Transform request data var data = transformData( config.data, @@ -15,42 +19,42 @@ module.exports = function xhrAdapter(resolve, reject, config) { ); // Merge headers - var headers = utils.merge( + var requestHeaders = utils.merge( defaults.headers.common, defaults.headers[config.method] || {}, config.headers || {} ); if (utils.isFormData(data)) { - delete headers['Content-Type']; // Let the browser set it + delete requestHeaders['Content-Type']; // Let the browser set it } // Create the request - var request = new(XMLHttpRequest || ActiveXObject)('Microsoft.XMLHTTP'); + var request = new (XMLHttpRequest || ActiveXObject)('Microsoft.XMLHTTP'); request.open(config.method.toUpperCase(), buildUrl(config.url, config.params), true); // Listen for ready state request.onreadystatechange = function () { if (request && request.readyState === 4) { // Prepare the response - var headers = parseHeaders(request.getAllResponseHeaders()); + var responseHeaders = parseHeaders(request.getAllResponseHeaders()); var responseData = ['text', ''].indexOf(config.responseType || '') !== -1 ? request.responseText : request.response; var response = { data: transformData( responseData, - headers, + responseHeaders, config.transformResponse ), status: request.status, statusText: request.statusText, - headers: headers, + headers: responseHeaders, config: config }; // Resolve or reject the Promise based on the status - (request.status >= 200 && request.status < 300 - ? resolve - : reject)(response); + (request.status >= 200 && request.status < 300 ? + resolve : + reject)(response); // Clean up request request = null; @@ -58,18 +62,18 @@ module.exports = function xhrAdapter(resolve, reject, config) { }; // Add xsrf header - var xsrfValue = urlIsSameOrigin(config.url) - ? cookies.read(config.xsrfCookieName || defaults.xsrfCookieName) - : undefined; + var xsrfValue = urlIsSameOrigin(config.url) ? + cookies.read(config.xsrfCookieName || defaults.xsrfCookieName) : + undefined; if (xsrfValue) { - headers[config.xsrfHeaderName || defaults.xsrfHeaderName] = xsrfValue; + requestHeaders[config.xsrfHeaderName || defaults.xsrfHeaderName] = xsrfValue; } // Add headers to the request - utils.forEach(headers, function (val, key) { + utils.forEach(requestHeaders, function (val, key) { // Remove Content-Type if data is undefined if (!data && key.toLowerCase() === 'content-type') { - delete headers[key]; + delete requestHeaders[key]; } // Otherwise add header to the request else { diff --git a/lib/axios.js b/lib/axios.js index 4e2847a..ca70bc9 100644 --- a/lib/axios.js +++ b/lib/axios.js @@ -6,6 +6,8 @@ var InterceptorManager = require('./core/InterceptorManager'); // Polyfill ES6 Promise if needed (function () { + 'use strict'; + // webpack is being used to set es6-promise to the native Promise // for the standalone build. It's necessary to make sure polyfill exists. var P = require('es6-promise'); @@ -15,6 +17,8 @@ var InterceptorManager = require('./core/InterceptorManager'); })(); var axios = module.exports = function axios(config) { + 'use strict'; + config = utils.merge({ method: 'get', headers: {}, @@ -69,6 +73,7 @@ axios.defaults = defaults; // Expose all/spread axios.all = function (promises) { + 'use strict'; return Promise.all(promises); }; axios.spread = require('./helpers/spread'); @@ -80,29 +85,32 @@ axios.interceptors = { }; // Provide aliases for supported request methods -createShortMethods('delete', 'get', 'head'); -createShortMethodsWithData('post', 'put', 'patch'); +(function () { + 'use strict'; -function createShortMethods() { - utils.forEach(arguments, function (method) { - axios[method] = function (url, config) { - return axios(utils.merge(config || {}, { - method: method, - url: url - })); - }; - }); -} + function createShortMethods() { + utils.forEach(arguments, function (method) { + axios[method] = function (url, config) { + return axios(utils.merge(config || {}, { + method: method, + url: url + })); + }; + }); + } -function createShortMethodsWithData() { - utils.forEach(arguments, function (method) { - axios[method] = function (url, data, config) { - return axios(utils.merge(config || {}, { - method: method, - url: url, - data: data - })); - }; - }); -} + function createShortMethodsWithData() { + utils.forEach(arguments, function (method) { + axios[method] = function (url, data, config) { + return axios(utils.merge(config || {}, { + method: method, + url: url, + data: data + })); + }; + }); + } + createShortMethods('delete', 'get', 'head'); + createShortMethodsWithData('post', 'put', 'patch'); +})(); diff --git a/lib/core/InterceptorManager.js b/lib/core/InterceptorManager.js index bfac9bb..e3f0cc6 100644 --- a/lib/core/InterceptorManager.js +++ b/lib/core/InterceptorManager.js @@ -1,10 +1,9 @@ -'use strict'; - var utils = require('./../utils'); function InterceptorManager() { + 'use strict'; this.handlers = []; -}; +} /** * Add a new interceptor to the stack @@ -15,6 +14,7 @@ function InterceptorManager() { * @return {Number} An ID used to remove interceptor later */ InterceptorManager.prototype.use = function (fulfilled, rejected) { + 'use strict'; this.handlers.push({ fulfilled: fulfilled, rejected: rejected @@ -28,6 +28,7 @@ InterceptorManager.prototype.use = function (fulfilled, rejected) { * @param {Number} id The ID that was returned by `use` */ InterceptorManager.prototype.eject = function (id) { + 'use strict'; if (this.handlers[id]) { this.handlers[id] = null; } @@ -42,12 +43,12 @@ InterceptorManager.prototype.eject = function (id) { * @param {Function} fn The function to call for each interceptor */ InterceptorManager.prototype.forEach = function (fn) { + 'use strict'; utils.forEach(this.handlers, function (h) { if (h !== null) { fn(h); - } + } }); }; module.exports = InterceptorManager; - diff --git a/lib/core/dispatchRequest.js b/lib/core/dispatchRequest.js index f063497..b33f1ae 100644 --- a/lib/core/dispatchRequest.js +++ b/lib/core/dispatchRequest.js @@ -1,5 +1,3 @@ -'use strict'; - /** * Dispatch a request to the server using whichever adapter * is supported by the current environment. @@ -8,6 +6,8 @@ * @returns {Promise} The Promise to be fulfilled */ module.exports = function dispatchRequest(config) { + 'use strict'; + return new Promise(function (resolve, reject) { try { // For browsers use XHR adapter diff --git a/lib/defaults.js b/lib/defaults.js index 88c6b7b..93fe132 100644 --- a/lib/defaults.js +++ b/lib/defaults.js @@ -1,5 +1,3 @@ -'use strict'; - var utils = require('./utils'); var JSON_START = /^\s*(\[|\{[^\{])/; @@ -11,6 +9,7 @@ var DEFAULT_CONTENT_TYPE = { module.exports = { transformRequest: [function (data, headers) { + 'use strict'; if (utils.isArrayBuffer(data)) { return data; } @@ -28,6 +27,7 @@ module.exports = { }], transformResponse: [function (data) { + 'use strict'; if (typeof data === 'string') { data = data.replace(PROTECTION_PREFIX, ''); if (JSON_START.test(data) && JSON_END.test(data)) { @@ -48,4 +48,4 @@ module.exports = { xsrfCookieName: 'XSRF-TOKEN', xsrfHeaderName: 'X-XSRF-TOKEN' -}; \ No newline at end of file +}; diff --git a/lib/helpers/buildUrl.js b/lib/helpers/buildUrl.js index f624cbe..afcfd4a 100644 --- a/lib/helpers/buildUrl.js +++ b/lib/helpers/buildUrl.js @@ -1,8 +1,7 @@ -'use strict'; - var utils = require('./../utils'); function encode(val) { + 'use strict'; return encodeURIComponent(val). replace(/%40/gi, '@'). replace(/%3A/gi, ':'). @@ -19,6 +18,7 @@ function encode(val) { * @returns {string} The formatted url */ module.exports = function buildUrl(url, params) { + 'use strict'; if (!params) { return url; } diff --git a/lib/helpers/cookies.js b/lib/helpers/cookies.js index 3c52ef3..42e2138 100644 --- a/lib/helpers/cookies.js +++ b/lib/helpers/cookies.js @@ -1,9 +1,8 @@ -'use strict'; - var utils = require('./../utils'); module.exports = { write: function write(name, value, expires, path, domain, secure) { + 'use strict'; var cookie = []; cookie.push(name + '=' + encodeURIComponent(value)); @@ -27,11 +26,13 @@ module.exports = { }, read: function read(name) { + 'use strict'; var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); return (match ? decodeURIComponent(match[3]) : null); }, remove: function remove(name) { + 'use strict'; this.write(name, '', Date.now() - 86400000); } -}; \ No newline at end of file +}; diff --git a/lib/helpers/deprecatedMethod.js b/lib/helpers/deprecatedMethod.js index dcf93af..f357c7b 100644 --- a/lib/helpers/deprecatedMethod.js +++ b/lib/helpers/deprecatedMethod.js @@ -1,5 +1,3 @@ -'use strict'; - /** * Supply a warning to the developer that a method they are using * has been deprecated. @@ -9,6 +7,9 @@ * @param {string} [docs] The documentation URL to get further details */ module.exports = function deprecatedMethod(method, instead, docs) { + /*eslint-env node*/ + 'use strict'; + try { console.warn( 'DEPRECATED method `' + method + '`.' + diff --git a/lib/helpers/parseHeaders.js b/lib/helpers/parseHeaders.js index e103634..f7510e0 100644 --- a/lib/helpers/parseHeaders.js +++ b/lib/helpers/parseHeaders.js @@ -1,5 +1,3 @@ -'use strict'; - var utils = require('./../utils'); /** @@ -16,9 +14,10 @@ var utils = require('./../utils'); * @returns {Object} Headers parsed into an object */ module.exports = function parseHeaders(headers) { + 'use strict'; var parsed = {}, key, val, i; - if (!headers) return parsed; + if (!headers) { return parsed; } utils.forEach(headers.split('\n'), function(line) { i = line.indexOf(':'); @@ -31,4 +30,4 @@ module.exports = function parseHeaders(headers) { }); return parsed; -}; \ No newline at end of file +}; diff --git a/lib/helpers/spread.js b/lib/helpers/spread.js index a7d6ddc..7894ebb 100644 --- a/lib/helpers/spread.js +++ b/lib/helpers/spread.js @@ -19,7 +19,8 @@ * @returns {Function} */ module.exports = function spread(callback) { + 'use strict'; return function (arr) { callback.apply(null, arr); }; -}; \ No newline at end of file +}; diff --git a/lib/helpers/transformData.js b/lib/helpers/transformData.js index c764a87..4a25bbd 100644 --- a/lib/helpers/transformData.js +++ b/lib/helpers/transformData.js @@ -1,5 +1,3 @@ -'use strict'; - var utils = require('./../utils'); /** @@ -11,9 +9,10 @@ var utils = require('./../utils'); * @returns {*} The resulting transformed data */ module.exports = function transformData(data, headers, fns) { + 'use strict'; utils.forEach(fns, function (fn) { data = fn(data, headers); }); return data; -}; \ No newline at end of file +}; diff --git a/lib/helpers/urlIsSameOrigin.js b/lib/helpers/urlIsSameOrigin.js index 22b573d..ab58f22 100644 --- a/lib/helpers/urlIsSameOrigin.js +++ b/lib/helpers/urlIsSameOrigin.js @@ -1,9 +1,7 @@ -'use strict'; - -var msie = /(msie|trident)/i.test(navigator.userAgent); var utils = require('./../utils'); +var msie = /(msie|trident)/i.test(navigator.userAgent); var urlParsingNode = document.createElement('a'); -var originUrl = urlResolve(window.location.href); +var originUrl; /** * Parse a URL to discover it's components @@ -12,6 +10,7 @@ var originUrl = urlResolve(window.location.href); * @returns {Object} */ function urlResolve(url) { + 'use strict'; var href = url; if (msie) { @@ -31,12 +30,14 @@ function urlResolve(url) { hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', hostname: urlParsingNode.hostname, port: urlParsingNode.port, - pathname: (urlParsingNode.pathname.charAt(0) === '/') - ? urlParsingNode.pathname - : '/' + urlParsingNode.pathname + pathname: (urlParsingNode.pathname.charAt(0) === '/') ? + urlParsingNode.pathname : + '/' + urlParsingNode.pathname }; } +originUrl = urlResolve(window.location.href); + /** * Determine if a URL shares the same origin as the current location * @@ -44,7 +45,8 @@ function urlResolve(url) { * @returns {boolean} True if URL shares the same origin, otherwise false */ module.exports = function urlIsSameOrigin(requestUrl) { + 'use strict'; var parsed = (utils.isString(requestUrl)) ? urlResolve(requestUrl) : requestUrl; return (parsed.protocol === originUrl.protocol && parsed.host === originUrl.host); -}; \ No newline at end of file +}; diff --git a/lib/utils.js b/lib/utils.js index 9f1b32e..ea91be3 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -1,3 +1,4 @@ +/*global toString:true*/ // utils is a library of generic helper functions non-specific to axios var toString = Object.prototype.toString; @@ -9,6 +10,7 @@ var toString = Object.prototype.toString; * @returns {boolean} True if value is an Array, otherwise false */ function isArray(val) { + 'use strict'; return toString.call(val) === '[object Array]'; } @@ -19,6 +21,7 @@ function isArray(val) { * @returns {boolean} True if value is an ArrayBuffer, otherwise false */ function isArrayBuffer(val) { + 'use strict'; return toString.call(val) === '[object ArrayBuffer]'; } @@ -29,6 +32,7 @@ function isArrayBuffer(val) { * @returns {boolean} True if value is an FormData, otherwise false */ function isFormData(val) { + 'use strict'; return toString.call(val) === '[object FormData]'; } @@ -39,6 +43,7 @@ function isFormData(val) { * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false */ function isArrayBufferView(val) { + 'use strict'; if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { return ArrayBuffer.isView(val); } else { @@ -53,6 +58,7 @@ function isArrayBufferView(val) { * @returns {boolean} True if value is a String, otherwise false */ function isString(val) { + 'use strict'; return typeof val === 'string'; } @@ -63,6 +69,7 @@ function isString(val) { * @returns {boolean} True if value is a Number, otherwise false */ function isNumber(val) { + 'use strict'; return typeof val === 'number'; } @@ -73,6 +80,7 @@ function isNumber(val) { * @returns {boolean} True if the value is undefined, otherwise false */ function isUndefined(val) { + 'use strict'; return typeof val === 'undefined'; } @@ -83,6 +91,7 @@ function isUndefined(val) { * @returns {boolean} True if value is an Object, otherwise false */ function isObject(val) { + 'use strict'; return val !== null && typeof val === 'object'; } @@ -93,6 +102,7 @@ function isObject(val) { * @returns {boolean} True if value is a Date, otherwise false */ function isDate(val) { + 'use strict'; return toString.call(val) === '[object Date]'; } @@ -103,6 +113,7 @@ function isDate(val) { * @returns {boolean} True if value is a File, otherwise false */ function isFile(val) { + 'use strict'; return toString.call(val) === '[object File]'; } @@ -113,6 +124,7 @@ function isFile(val) { * @returns {boolean} True if value is a Blob, otherwise false */ function isBlob(val) { + 'use strict'; return toString.call(val) === '[object Blob]'; } @@ -123,6 +135,7 @@ function isBlob(val) { * @returns {String} The String freed of excess whitespace */ function trim(str) { + 'use strict'; return str.replace(/^\s*/, '').replace(/\s*$/, ''); } @@ -139,6 +152,7 @@ function trim(str) { * @param {Function} fn The callback to invoke for each item */ function forEach(obj, fn) { + 'use strict'; // Don't bother if no value provided if (obj === null || typeof obj === 'undefined') { return; @@ -154,7 +168,7 @@ function forEach(obj, fn) { // Iterate over array values if (isArrayLike) { - for (var i=0, l=obj.length; i