Skip to content

Commit

Permalink
Cleaned up code, got eslint and tests working
Browse files Browse the repository at this point in the history
  • Loading branch information
icellan committed Apr 23, 2021
1 parent f27fa61 commit 186176b
Show file tree
Hide file tree
Showing 10 changed files with 388 additions and 193 deletions.
84 changes: 68 additions & 16 deletions .babelrc
Original file line number Diff line number Diff line change
@@ -1,21 +1,73 @@
{
"presets": [
"@babel/preset-env"
],
"plugins": [
[
"@babel/plugin-transform-runtime"
],
[
"@babel/plugin-proposal-class-properties",
{
"loose": true
}
],
"add-module-exports"
],
"env": {
"development": {
"presets": [
["@babel/preset-env", {
"targets": {
"node": "10.0"
}
}]
],
"plugins": [
[
"@babel/plugin-transform-runtime"
],
[
"@babel/plugin-proposal-class-properties",
{
"loose": true
}
],
"add-module-exports"
]
},
"module": {
"presets": [
["@babel/preset-env", {
"targets": {
"node": "10.0"
},
"modules": false
}]
],
"plugins": [
[
"@babel/plugin-transform-runtime"
],
[
"@babel/plugin-proposal-class-properties",
{
"loose": true
}
],
"add-module-exports"
]
},
"test": {
"presets": [
["@babel/preset-env", {
"targets": {
"node": "10.0"
},
"modules": "auto"
}]
],
"plugins": [
[
"@babel/plugin-transform-runtime"
],
[
"@babel/plugin-proposal-class-properties",
{
"loose": true
}
],
"add-module-exports"
]
}
},
"ignore": [],
"sourceMaps": true,
"retainLines": false,
"retainLines": true,
"comments": true
}
42 changes: 42 additions & 0 deletions .eslintrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
{
"parser": "babel-eslint",
"env": {
"browser": true,
"es2021": true,
"node": true
},
"parserOptions": {
"ecmaVersion": 12,
"sourceType": "module",
"allowImportExportEverywhere": true
},
"extends": "airbnb-base",
"plugins": [
"import"
],
"rules": {
"arrow-body-style": ["error", "always"],
"class-methods-use-this": "off",
"func-names": "off",
"max-len": ["error", {
"code": 100,
"ignoreComments": true
}],
"import/no-cycle": "off",
"prefer-template": "off",
"no-await-in-loop": "off",
"no-console": "off",
"no-control-regex": "off",
"no-new-func": "off",
"no-param-reassign": "off",
"no-plusplus": "off",
"no-prototype-builtins": "off",
"no-underscore-dangle": "off",
"no-undef": "off",
"no-useless-escape": "off",
"import/no-unresolved": ["error", { "ignore": ["^meteor/"] }],
"import/extensions": "off",
"import/no-extraneous-dependencies": "off",
"import/prefer-default-export": "off"
}
}
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,5 @@ todo.md

# Deployment
dist
coverage
module
119 changes: 79 additions & 40 deletions lib/api-client.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@
// axiosCookieJarSupport is applying support to axios for cookie jar management
import { apiCookieName } from './session';

const axios = require('axios'); // .default (@mrz what does this affect?)
const axios = require('axios');
// .default (@mrz what does this affect?)
export const tonicAxios = axios.create();
const axiosCookieJarSupport = require('axios-cookiejar-support').default;
const tough = require('tough-cookie');

axiosCookieJarSupport(tonicAxios);
export const cookieJar = new tough.CookieJar();

Expand All @@ -17,15 +19,22 @@ const pkgVersion = 'v0.1.77';
export const apiVersion = 'v1';

// getOptions is a factory for axios default options
export const getOptions = function(t, useCustomSessionToken = '') {
export const getOptions = function (t, useCustomSessionToken = '') {
// Set the default options and headers
let defaultOptions = { jar: cookieJar, withCredentials: true, headers: { 'User-Agent': 'tonicpow-js ' + pkgVersion } };
const defaultOptions = {
jar: cookieJar,
withCredentials: true,
headers: {
'User-Agent': 'tonicpow-js ' + pkgVersion,
},
};

// Detect custom headers
if (t.session.customHeaders) {
for (const [key, value] of Object.entries(t.session.customHeaders)) {
defaultOptions.headers[key] = value;
}
Object.keys(t.session.customHeaders)
.forEach((key) => {
defaultOptions.headers[key] = t.session.customHeaders[key];
});
}

// Set the user session token if set
Expand All @@ -34,40 +43,46 @@ export const getOptions = function(t, useCustomSessionToken = '') {
}

return defaultOptions;
}
};

// setUserToken will set the token if found, otherwise return empty token
// This takes a raw value, parses cookies, sets token, and returns a string
const setUserToken = function(t, token) {
const setUserToken = function (t, token) {
if (token && token.length > 1) {
t.session.userToken = token;
return t.session.userToken;
}
return '';
}
};

export const checkError = function(e) {
export const checkError = function (e) {
if (typeof e.response !== 'undefined') {
return e.response.data;
}
return e.message;
}
};

// This wraps axios for cookie management for API vs User session token
export const createApiClient = function (t) {
// Modify the request before sending (cookie management)
tonicAxios.interceptors.request.use(function (config) {
tonicAxios.interceptors.request.use((config) => {
// Are we making a request with a custom session token?
if (typeof config.headers[internalHeaderKey] !== 'undefined') {
config.jar.setCookie(apiCookieName + '=' + config.headers[internalHeaderKey] + '; Max-Age=' + t.session.maxAge + '; Path=/; HttpOnly;', config.url, function (err) {
const cookie = apiCookieName + '=' + config.headers[internalHeaderKey]
+ '; Max-Age=' + t.session.maxAge
+ '; Path=/; HttpOnly;';
config.jar.setCookie(cookie, config.url, (err) => {
if (err) {
// console.error(err.message)
throw Error(err.message);
}
});
config.headers[internalHeaderKey] = 'set';
} else if (t.session.apiToken) {
config.jar.setCookie(apiCookieName + '=' + t.session.apiToken + '; Max-Age=' + t.session.maxAge + '; Path=/; HttpOnly;', config.url, function (err) {
const cookie = apiCookieName + '=' + t.session.apiToken
+ '; Max-Age=' + t.session.maxAge
+ '; Path=/; HttpOnly;';
config.jar.setCookie(cookie, config.url, (err) => {
if (err) {
// console.error(err.message)
throw Error(err.message);
Expand All @@ -76,17 +91,17 @@ export const createApiClient = function (t) {
}

return config;
}, function (e) {
}, (e) => {
return Promise.reject(e);
});

// Modify the response after sending (cookie management)
tonicAxios.interceptors.response.use(function (response) {
tonicAxios.interceptors.response.use((response) => {
// Clear custom headers
t.session.customHeaders = null;

// Save the cookie for api or user
response.config.jar.getCookies(response.config.url, { allPaths: true }, function (err, cookies) {
response.config.jar.getCookies(response.config.url, { allPaths: true }, (err, cookies) => {
if (err) {
// console.error(err.message)
throw Error(err.message);
Expand All @@ -108,63 +123,87 @@ export const createApiClient = function (t) {
break;
}
}
} else { // Cookie was removed (endSession, logoutUser)
if (typeof response.config.headers[internalHeaderKey] !== 'undefined') {
if ((t.session.userToken.length > 0 && response.config.headers[internalHeaderKey] === t.session.userToken) || response.config.headers[internalHeaderKey] === 'set') {
t.session.userToken = 'delete';
}
} else {
t.session.apiToken = 'delete';
} else if (typeof response.config.headers[internalHeaderKey] !== 'undefined') {
const tokenSet = (
t.session.userToken.length > 0
&& response.config.headers[internalHeaderKey] === t.session.userToken
);
if (tokenSet || response.config.headers[internalHeaderKey] === 'set') {
t.session.userToken = 'delete';
}
} else {
t.session.apiToken = 'delete';
}
});
return response;
}, function (e) {
}, (e) => {
return Promise.reject(e);
});

return {
async post(path, data, sessionToken = '') {
try {
sessionToken = setUserToken(t, sessionToken);
const response = await tonicAxios.post(t.config.apiUrl + apiVersion + path, data, getOptions(t, sessionToken));
const response = await tonicAxios.post(
t.config.apiUrl + apiVersion + path,
data,
getOptions(t, sessionToken),
);
return response && response.data ? response.data : response;
} catch(e) {
} catch (e) {
throw checkError(e);
}
},
async put(path, data, sessionToken = '', rawResponse = false) {
try {
sessionToken = setUserToken(t, sessionToken);
const response = await tonicAxios.put(t.config.apiUrl + apiVersion + path, data, getOptions(t, sessionToken));
return rawResponse ? response : (response && response.data ? response.data : response);
} catch(e) {
const response = await tonicAxios.put(
t.config.apiUrl + apiVersion + path,
data,
getOptions(t, sessionToken),
);

if (rawResponse) {
return response;
}
return response && response.data ? response.data : response;
} catch (e) {
throw checkError(e);
}
},
async putRaw(path, data, sessionToken = '') {
return this.put(path, data, sessionToken, true)
return this.put(path, data, sessionToken, true);
},
async get(path, sessionToken = '', rawResponse = false) {
try {
sessionToken = setUserToken(t, sessionToken);
const response = await tonicAxios.get(t.config.apiUrl + apiVersion + path, getOptions(t, sessionToken));
return rawResponse ? response : (response && response.data ? response.data : response);
} catch(e) {
const response = await tonicAxios.get(
t.config.apiUrl + apiVersion + path,
getOptions(t, sessionToken),
);

if (rawResponse) {
return response;
}
return response && response.data ? response.data : response;
} catch (e) {
throw checkError(e);
}
},
async getRaw(path, sessionToken = '') {
return this.get(path, sessionToken, true)
return this.get(path, sessionToken, true);
},
async delete(path, sessionToken = '') {
try {
sessionToken = setUserToken(t, sessionToken);
const response = await tonicAxios.delete(t.config.apiUrl + apiVersion + path, getOptions(t, sessionToken));
const response = await tonicAxios.delete(
t.config.apiUrl + apiVersion + path,
getOptions(t, sessionToken),
);
return response && response.data ? response.data : response;
} catch(e) {
} catch (e) {
throw checkError(e);
}
}
}
}
},
};
};
Loading

0 comments on commit 186176b

Please sign in to comment.