From dd52bee2b19e660deba3528d787f8802560f9af4 Mon Sep 17 00:00:00 2001 From: ehmicky Date: Wed, 16 Dec 2020 17:07:47 +0100 Subject: [PATCH] Add `fp/no-mutating-assigns` ESLint rule --- .eslintrc.js | 1 - src/index.js | 8 +++++--- src/methods/index.js | 43 ++++++++++++++++++----------------------- src/methods/response.js | 4 +++- src/methods/url.js | 4 ++-- 5 files changed, 29 insertions(+), 31 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 5f58782..91507d3 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -12,7 +12,6 @@ module.exports = { 'fp/no-class': 0, 'fp/no-let': 0, 'fp/no-loops': 0, - 'fp/no-mutating-assign': 0, 'fp/no-mutating-methods': 0, 'fp/no-mutation': 0, 'fp/no-this': 0, diff --git a/src/index.js b/src/index.js index 9d726c3..bf90cf6 100644 --- a/src/index.js +++ b/src/index.js @@ -2,13 +2,11 @@ const dfn = require('@netlify/open-api') const pWaitFor = require('p-wait-for') const deploy = require('./deploy') -const { addMethods } = require('./methods') +const { getMethods } = require('./methods') const { getOperations } = require('./operations') class NetlifyAPI { constructor(accessToken, opts) { - addMethods(this) - // variadic arguments if (typeof accessToken === 'object') { opts = accessToken @@ -36,6 +34,10 @@ class NetlifyAPI { this.globalParams = opts.globalParams this.accessToken = opts.accessToken this.agent = opts.agent + + const methods = getMethods(this) + // eslint-disable-next-line fp/no-mutating-assign + Object.assign(this, methods) } get accessToken() { diff --git a/src/methods/index.js b/src/methods/index.js index 20815d0..c5177a5 100644 --- a/src/methods/index.js +++ b/src/methods/index.js @@ -11,39 +11,34 @@ const { getUrl } = require('./url.js') // For each OpenAPI operation, add a corresponding method. // The `operationId` is the method name. -const addMethods = function (NetlifyApi) { - const methods = getMethods(NetlifyApi) - Object.assign(NetlifyApi, methods) -} - -const getMethods = function (NetlifyApi) { +const getMethods = function ({ basePath, defaultHeaders, agent, globalParams }) { const operations = getOperations() - const methods = operations.map((method) => getMethod(method, NetlifyApi)) + const methods = operations.map((method) => getMethod({ method, basePath, defaultHeaders, agent, globalParams })) return Object.assign({}, ...methods) } -const getMethod = function (method, NetlifyApi) { +const getMethod = function ({ method, basePath, defaultHeaders, agent, globalParams }) { return { [method.operationId](params, opts) { - return callMethod(method, NetlifyApi, params, opts) + return callMethod({ method, basePath, defaultHeaders, agent, globalParams, params, opts }) }, } } -const callMethod = async function (method, NetlifyApi, params, opts) { - const requestParams = { ...NetlifyApi.globalParams, ...params } - const url = getUrl(method, NetlifyApi, requestParams) - const response = await makeRequestOrRetry({ url, method, NetlifyApi, requestParams, opts }) +const callMethod = async function ({ method, basePath, defaultHeaders, agent, globalParams, params, opts }) { + const requestParams = { ...globalParams, ...params } + const url = getUrl(method, basePath, requestParams) + const response = await makeRequestOrRetry({ url, method, defaultHeaders, agent, requestParams, opts }) const parsedResponse = await parseResponse(response) return parsedResponse } -const getOpts = function ({ verb, parameters }, NetlifyApi, { body }, opts) { +const getOpts = function ({ method: { verb, parameters }, defaultHeaders, agent, requestParams: { body }, opts }) { const optsA = addHttpMethod(verb, opts) - const optsB = addDefaultHeaders(NetlifyApi, optsA) + const optsB = addDefaultHeaders(defaultHeaders, optsA) const optsC = addBody(body, parameters, optsB) - const optsD = addAgent(NetlifyApi, optsC) + const optsD = addAgent(agent, optsC) return optsD } @@ -53,21 +48,21 @@ const addHttpMethod = function (verb, opts) { } // Assign default HTTP headers -const addDefaultHeaders = function (NetlifyApi, opts) { - return { ...opts, headers: { ...NetlifyApi.defaultHeaders, ...opts.headers } } +const addDefaultHeaders = function (defaultHeaders, opts) { + return { ...opts, headers: { ...defaultHeaders, ...opts.headers } } } // Assign fetch agent (like for example HttpsProxyAgent) if there is one -const addAgent = function (NetlifyApi, opts) { - if (NetlifyApi.agent) { - return { ...opts, agent: NetlifyApi.agent } +const addAgent = function (agent, opts) { + if (agent) { + return { ...opts, agent } } return opts } -const makeRequestOrRetry = async function ({ url, method, NetlifyApi, requestParams, opts }) { +const makeRequestOrRetry = async function ({ url, method, defaultHeaders, agent, requestParams, opts }) { for (let index = 0; index <= MAX_RETRY; index++) { - const optsA = getOpts(method, NetlifyApi, requestParams, opts) + const optsA = getOpts({ method, defaultHeaders, agent, requestParams, opts }) const { response, error } = await makeRequest(url, optsA) if (shouldRetry({ response, error }) && index !== MAX_RETRY) { @@ -93,4 +88,4 @@ const makeRequest = async function (url, opts) { } } -module.exports = { addMethods } +module.exports = { getMethods } diff --git a/src/methods/response.js b/src/methods/response.js index 37b2020..2a19179 100644 --- a/src/methods/response.js +++ b/src/methods/response.js @@ -40,7 +40,9 @@ const parseJsonResponse = function (response, textResponse, responseType) { const getFetchError = function (error, url, opts) { const data = omit(opts, ['Authorization']) - Object.assign(error, { name: 'FetchError', url, data }) + error.name = 'FetchError' + error.url = url + error.data = data return error } diff --git a/src/methods/url.js b/src/methods/url.js index b576ebb..e88445d 100644 --- a/src/methods/url.js +++ b/src/methods/url.js @@ -3,8 +3,8 @@ const queryString = require('qs') // Replace path parameters and query parameters in the URI, using the OpenAPI // definition -const getUrl = function ({ path, parameters }, NetlifyApi, requestParams) { - const url = `${NetlifyApi.basePath}${path}` +const getUrl = function ({ path, parameters }, basePath, requestParams) { + const url = `${basePath}${path}` const urlA = addPathParams(url, parameters, requestParams) const urlB = addQueryParams(urlA, parameters, requestParams) return urlB