@autofleet/node-common 1.0.9 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +11 -0
- package/logger/index.js +9 -8
- package/logger/index.test.js +32 -22
- package/network/index.js +16 -13
- package/network/index.test.js +13 -13
- package/package.json +6 -2
package/.eslintrc.json
ADDED
package/logger/index.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
require('dotenv').config();
|
|
2
1
|
const winston = require('winston')
|
|
2
|
+
require('dotenv').config()
|
|
3
|
+
|
|
3
4
|
const { env } = process
|
|
4
5
|
|
|
5
6
|
const getLevel = (logLevel) => {
|
|
6
7
|
if (logLevel) return logLevel
|
|
7
|
-
if (env.LOG_LEVEL) return
|
|
8
|
-
if (env.NODE_ENV === 'development')
|
|
8
|
+
if (env.LOG_LEVEL) return env.LOG_LEVEL
|
|
9
|
+
if (env.NODE_ENV === 'development') return 'debug'
|
|
9
10
|
// test and producion will return info
|
|
10
11
|
return 'info'
|
|
11
12
|
}
|
|
@@ -15,7 +16,7 @@ const getTransporters = () => {
|
|
|
15
16
|
if (env.USE_LOG_FILES === 'true') {
|
|
16
17
|
transporters = transporters.concat([
|
|
17
18
|
new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
|
|
18
|
-
new winston.transports.File({ filename: 'logs/all.log' })
|
|
19
|
+
new winston.transports.File({ filename: 'logs/all.log' }),
|
|
19
20
|
])
|
|
20
21
|
}
|
|
21
22
|
return transporters
|
|
@@ -24,9 +25,9 @@ const getTransporters = () => {
|
|
|
24
25
|
const createLogger = (level, transporters) => {
|
|
25
26
|
const logger = winston.createLogger({
|
|
26
27
|
level,
|
|
27
|
-
format: winston.format.
|
|
28
|
-
transports: transporters
|
|
29
|
-
})
|
|
28
|
+
format: winston.format.json(),
|
|
29
|
+
transports: transporters,
|
|
30
|
+
})
|
|
30
31
|
|
|
31
32
|
return logger
|
|
32
33
|
}
|
|
@@ -37,4 +38,4 @@ const getLogger = (logLevel) => {
|
|
|
37
38
|
return createLogger(level, transporters)
|
|
38
39
|
}
|
|
39
40
|
|
|
40
|
-
module.exports = getLogger
|
|
41
|
+
module.exports = getLogger
|
package/logger/index.test.js
CHANGED
|
@@ -1,57 +1,67 @@
|
|
|
1
1
|
const Logger = require('./index')
|
|
2
|
-
const fs = require('fs')
|
|
3
|
-
const wait = require('wait-promise')
|
|
2
|
+
const fs = require('fs')
|
|
3
|
+
const wait = require('wait-promise')
|
|
4
4
|
|
|
5
5
|
const { env } = process
|
|
6
6
|
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
const deleteLogFile = (filePath) => {
|
|
8
|
+
const dir = 'logs'
|
|
9
|
+
if (!fs.existsSync(dir)) {
|
|
10
|
+
fs.mkdirSync(dir)
|
|
11
|
+
}
|
|
12
|
+
if (fs.existsSync(filePath)) {
|
|
13
|
+
fs.unlinkSync(filePath)
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const waitForFileToHaveContent = ((filePath) => {
|
|
18
|
+
return wait.limit(30).until(() => {
|
|
19
|
+
if (fs.existsSync(filePath)) {
|
|
20
|
+
const content = fs.readFileSync(filePath, 'utf8')
|
|
21
|
+
return content !== ''
|
|
12
22
|
}
|
|
13
23
|
return false
|
|
14
24
|
})
|
|
15
|
-
}
|
|
25
|
+
})
|
|
16
26
|
|
|
17
27
|
describe('Logger', () => {
|
|
18
28
|
it('it`s default level is info', () => {
|
|
19
29
|
env.NODE_ENV=''
|
|
20
30
|
const logger = Logger()
|
|
21
|
-
expect(logger).toBeDefined()
|
|
22
|
-
expect(logger.level).toBe('info')
|
|
31
|
+
expect(logger).toBeDefined()
|
|
32
|
+
expect(logger.level).toBe('info')
|
|
23
33
|
})
|
|
24
34
|
|
|
25
35
|
it('its default develpment level is debug', () => {
|
|
26
36
|
env.NODE_ENV='development'
|
|
27
37
|
const logger = Logger()
|
|
28
|
-
expect(logger.level).toBe('debug')
|
|
38
|
+
expect(logger.level).toBe('debug')
|
|
29
39
|
})
|
|
30
40
|
|
|
31
41
|
it('its default test level is info', () => {
|
|
32
42
|
env.NODE_ENV='test'
|
|
33
43
|
const logger = Logger()
|
|
34
|
-
expect(logger.level).toBe('info')
|
|
44
|
+
expect(logger.level).toBe('info')
|
|
35
45
|
})
|
|
36
46
|
|
|
37
47
|
it('its default production level is info', () => {
|
|
38
48
|
env.NODE_ENV='production'
|
|
39
49
|
const logger = Logger()
|
|
40
|
-
expect(logger.level).toBe('info')
|
|
50
|
+
expect(logger.level).toBe('info')
|
|
41
51
|
})
|
|
42
52
|
|
|
43
53
|
it('its level can be override by LOG_LEVEL env variable', () => {
|
|
44
54
|
env.NODE_ENV='development'
|
|
45
55
|
env.LOG_LEVEL='warn'
|
|
46
56
|
const logger = Logger()
|
|
47
|
-
expect(logger.level).toBe('warn')
|
|
57
|
+
expect(logger.level).toBe('warn')
|
|
48
58
|
})
|
|
49
59
|
|
|
50
60
|
it('its level can be override by function variable', () => {
|
|
51
61
|
env.NODE_ENV='production'
|
|
52
62
|
env.LOG_LEVEL='warn'
|
|
53
63
|
const logger = Logger('silly')
|
|
54
|
-
expect(logger.level).toBe('silly')
|
|
64
|
+
expect(logger.level).toBe('silly')
|
|
55
65
|
})
|
|
56
66
|
|
|
57
67
|
it('its has functions for each level', () => {
|
|
@@ -67,7 +77,8 @@ describe('Logger', () => {
|
|
|
67
77
|
it('it can have general file transporters', async () => {
|
|
68
78
|
env.USE_LOG_FILES='true'
|
|
69
79
|
const allPath = 'logs/all.log'
|
|
70
|
-
|
|
80
|
+
deleteLogFile(allPath)
|
|
81
|
+
|
|
71
82
|
const logger = Logger()
|
|
72
83
|
const errorText = "this is error"
|
|
73
84
|
logger.error(errorText)
|
|
@@ -76,15 +87,15 @@ describe('Logger', () => {
|
|
|
76
87
|
|
|
77
88
|
expect(fs.existsSync(allPath)).toBe(true)
|
|
78
89
|
|
|
79
|
-
const contents = fs.readFileSync(allPath, 'utf8')
|
|
90
|
+
const contents = fs.readFileSync(allPath, 'utf8')
|
|
80
91
|
expect(contents).toBe(`error: ${errorText}\n`)
|
|
81
92
|
})
|
|
82
93
|
|
|
83
94
|
it('it can have general file transporters', async () => {
|
|
84
95
|
env.USE_LOG_FILES='true'
|
|
85
|
-
|
|
86
96
|
const errorPath = 'logs/error.log'
|
|
87
|
-
|
|
97
|
+
deleteLogFile(errorPath)
|
|
98
|
+
|
|
88
99
|
expect(fs.existsSync(errorPath)).toBe(false)
|
|
89
100
|
|
|
90
101
|
const logger = Logger()
|
|
@@ -93,8 +104,7 @@ describe('Logger', () => {
|
|
|
93
104
|
|
|
94
105
|
await waitForFileToHaveContent(errorPath)
|
|
95
106
|
|
|
96
|
-
const contents = fs.readFileSync(errorPath, 'utf8')
|
|
107
|
+
const contents = fs.readFileSync(errorPath, 'utf8')
|
|
97
108
|
expect(contents).toBe(`error: ${errorText}\n`)
|
|
98
109
|
})
|
|
99
|
-
|
|
100
|
-
});
|
|
110
|
+
})
|
package/network/index.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
const axios = require('axios')
|
|
2
|
-
require('
|
|
1
|
+
const axios = require('axios')
|
|
2
|
+
const httpAdapter = require('axios/lib/adapters/http')
|
|
3
|
+
require('dotenv').config()
|
|
3
4
|
/**
|
|
4
|
-
* Add support for nock testing
|
|
5
|
+
* Add support for nock testing
|
|
5
6
|
* see s://github.com/axios/axios/issues/305
|
|
6
7
|
*/
|
|
7
8
|
if (process.env.NODE_ENV === 'test') {
|
|
8
|
-
axios.defaults.adapter =
|
|
9
|
+
axios.defaults.adapter = httpAdapter
|
|
9
10
|
}
|
|
10
11
|
|
|
11
12
|
const HTTPMethods = [
|
|
@@ -15,12 +16,12 @@ const HTTPMethods = [
|
|
|
15
16
|
'head',
|
|
16
17
|
'put',
|
|
17
18
|
'patch',
|
|
18
|
-
'options'
|
|
19
|
+
'options',
|
|
19
20
|
]
|
|
20
21
|
|
|
21
22
|
const defaultSettings = {
|
|
22
23
|
timeout: 2500,
|
|
23
|
-
headers: { 'X-AF-AUTH': 'ANYONE' }
|
|
24
|
+
headers: { 'X-AF-AUTH': 'ANYONE' },
|
|
24
25
|
}
|
|
25
26
|
|
|
26
27
|
module.exports = class Network {
|
|
@@ -38,23 +39,25 @@ module.exports = class Network {
|
|
|
38
39
|
}
|
|
39
40
|
|
|
40
41
|
createBaseUrl() {
|
|
41
|
-
|
|
42
|
+
const { settings } = this
|
|
42
43
|
if (settings.serviceUrl) {
|
|
43
|
-
settings.baseURL = settings.serviceUrl
|
|
44
|
+
settings.baseURL = settings.serviceUrl
|
|
44
45
|
} else if (settings.serviceName) {
|
|
45
46
|
const envServiceHostName = `${settings.serviceName}_SERVICE_HOST`
|
|
46
|
-
settings.baseURL =
|
|
47
|
-
if(!settings.baseURL) {
|
|
47
|
+
settings.baseURL = `http://${process.env[envServiceHostName]}`
|
|
48
|
+
if (!settings.baseURL) {
|
|
48
49
|
throw new Error(`Missing environment variable: ${envServiceHostName}`)
|
|
49
50
|
}
|
|
50
51
|
}
|
|
51
52
|
}
|
|
52
|
-
|
|
53
|
+
|
|
53
54
|
/**
|
|
54
55
|
* Build class methods that wrap axios methods
|
|
55
56
|
*/
|
|
56
57
|
buildClassHttpMethods() {
|
|
57
|
-
this.axios = axios.create(this.settings)
|
|
58
|
-
HTTPMethods.
|
|
58
|
+
this.axios = axios.create(this.settings)
|
|
59
|
+
HTTPMethods.forEach((method) => {
|
|
60
|
+
this[method] = (...args) => this.axios[method](...args)
|
|
61
|
+
})
|
|
59
62
|
}
|
|
60
63
|
}
|
package/network/index.test.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const nock = require('nock')
|
|
2
|
-
const Network = require('./index')
|
|
1
|
+
const nock = require('nock')
|
|
2
|
+
const Network = require('./index')
|
|
3
3
|
|
|
4
4
|
nock('http://www.google.com')
|
|
5
5
|
.get('/resource')
|
|
@@ -13,19 +13,19 @@ nock('https://www.apple.com')
|
|
|
13
13
|
describe('Network', () => {
|
|
14
14
|
it('Making requests by service name from ENV', async () => {
|
|
15
15
|
process.env.TEST_SERVICE_HOST = 'www.google.com'
|
|
16
|
-
n = new Network({ serviceName: 'TEST' })
|
|
17
|
-
const response = await n.get('/resource')
|
|
18
|
-
expect(response).toBeDefined()
|
|
19
|
-
expect(response.data).toBeDefined()
|
|
20
|
-
expect(response.data.one).toBe(1)
|
|
16
|
+
const n = new Network({ serviceName: 'TEST' })
|
|
17
|
+
const response = await n.get('/resource')
|
|
18
|
+
expect(response).toBeDefined()
|
|
19
|
+
expect(response.data).toBeDefined()
|
|
20
|
+
expect(response.data.one).toBe(1)
|
|
21
21
|
})
|
|
22
22
|
|
|
23
23
|
it('Making requests by service name from ENV', async () => {
|
|
24
24
|
process.env.TEST_SERVICE_HOST = 'www.google.com'
|
|
25
|
-
n = new Network({ serviceUrl: 'https://www.apple.com' })
|
|
26
|
-
const response = await n.get('/resource')
|
|
27
|
-
expect(response).toBeDefined()
|
|
28
|
-
expect(response.data).toBeDefined()
|
|
29
|
-
expect(response.data.two).toBe(2)
|
|
25
|
+
const n = new Network({ serviceUrl: 'https://www.apple.com' })
|
|
26
|
+
const response = await n.get('/resource')
|
|
27
|
+
expect(response).toBeDefined()
|
|
28
|
+
expect(response.data).toBeDefined()
|
|
29
|
+
expect(response.data.two).toBe(2)
|
|
30
30
|
})
|
|
31
|
-
})
|
|
31
|
+
})
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@autofleet/node-common",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"coverage": "jest --coverage --forceExit --runInBand",
|
|
7
7
|
"test": "jest --forceExit --runInBand",
|
|
8
|
-
"test-auto": "jest --watch --runInBand"
|
|
8
|
+
"test-auto": "jest --watch --runInBand",
|
|
9
|
+
"linter": "./node_modules/.bin/eslint ."
|
|
9
10
|
},
|
|
10
11
|
"jest": {
|
|
11
12
|
"setupTestFrameworkScriptFile": "jest-extended"
|
|
@@ -28,6 +29,9 @@
|
|
|
28
29
|
"winston": "^3.0.0-rc5"
|
|
29
30
|
},
|
|
30
31
|
"devDependencies": {
|
|
32
|
+
"eslint": "^4.19.1",
|
|
33
|
+
"eslint-config-airbnb": "^16.1.0",
|
|
34
|
+
"eslint-plugin-import": "^2.11.0",
|
|
31
35
|
"jest-extended": "^0.7.1",
|
|
32
36
|
"nock": "^9.2.5"
|
|
33
37
|
}
|