@toptal/davinci-cli-shared 1.10.2-alpha-fix-wrong-data-structure-in-analytics-e998b099.7 → 1.10.2
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/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
|
|
3
|
+
## 1.10.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#1843](https://github.com/toptal/davinci/pull/1843) [`1457314e`](https://github.com/toptal/davinci/commit/1457314e7f449146077753dcc467565e6ce4d3d2) Thanks [@dmaklygin](https://github.com/dmaklygin)! - ---
|
|
8
|
+
|
|
9
|
+
- fix storybook analytics to send necessary data properly
|
|
10
|
+
|
|
3
11
|
## 1.10.1
|
|
4
12
|
|
|
5
13
|
### Patch Changes
|
package/package.json
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@toptal/davinci-cli-shared",
|
|
3
|
-
"version": "1.10.2
|
|
3
|
+
"version": "1.10.2",
|
|
4
4
|
"description": "Shared CLI code and CLI engine for davinci",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
8
|
"main": "src/index.js",
|
|
9
|
+
"files": [
|
|
10
|
+
"src",
|
|
11
|
+
"CHANGELOG.md"
|
|
12
|
+
],
|
|
9
13
|
"scripts": {
|
|
10
|
-
"build:package": "../../bin/build-package.js",
|
|
11
|
-
"prepublishOnly": "../../bin/prepublish.js",
|
|
12
14
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
13
15
|
},
|
|
14
16
|
"author": "Toptal",
|
|
@@ -24,6 +26,5 @@
|
|
|
24
26
|
"semver": "^7.3.7",
|
|
25
27
|
"uuid": "^9.0.0",
|
|
26
28
|
"vorpal": "^1.12.0"
|
|
27
|
-
}
|
|
28
|
-
"gitHead": "e998b09949b7b22fd1305544729bb6665fcfe092"
|
|
29
|
+
}
|
|
29
30
|
}
|
package/src/index.js
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
const vorpal = require('vorpal')
|
|
2
2
|
|
|
3
|
-
const { identify, track } = require('
|
|
4
|
-
const { gatherUsageData } = require('
|
|
5
|
-
const print = require('
|
|
6
|
-
const { run, runSync } = require('
|
|
7
|
-
const prompt = require('
|
|
8
|
-
const {
|
|
9
|
-
convertToCLIParameters,
|
|
10
|
-
} = require('../src/utils/convert-to-cli-parameters')
|
|
3
|
+
const { identify, track } = require('./utils/metrics/metrics')
|
|
4
|
+
const { gatherUsageData } = require('./utils/metrics/usage-data')
|
|
5
|
+
const print = require('./utils/print')
|
|
6
|
+
const { run, runSync } = require('./utils/run')
|
|
7
|
+
const prompt = require('./utils/prompt')
|
|
8
|
+
const { convertToCLIParameters } = require('./utils/convert-to-cli-parameters')
|
|
11
9
|
const davinciProjectConfig = require('./utils/davinci-project-config')
|
|
12
10
|
const files = require('./utils/files')
|
|
13
11
|
const packageUtils = require('./utils/package')
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
describe('davinci-project-config', () => {
|
|
2
|
+
let fs
|
|
3
|
+
|
|
4
|
+
beforeEach(() => {
|
|
5
|
+
jest.resetModules()
|
|
6
|
+
|
|
7
|
+
jest.mock('fs')
|
|
8
|
+
fs = require('fs')
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
it('returns the default config when the file does not exist', () => {
|
|
12
|
+
fs.existsSync.mockReturnValue(false)
|
|
13
|
+
const davinciProjectConfig = require('./davinci-project-config')
|
|
14
|
+
|
|
15
|
+
expect(davinciProjectConfig.master.deploy).toBe(false)
|
|
16
|
+
expect(davinciProjectConfig.pr.contractTesting).toBe(false)
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
it('returns the default config when the file is empty', () => {
|
|
20
|
+
fs.existsSync.mockReturnValue(true)
|
|
21
|
+
fs.readFileSync.mockReturnValue('')
|
|
22
|
+
const davinciProjectConfig = require('./davinci-project-config')
|
|
23
|
+
|
|
24
|
+
expect(davinciProjectConfig.master.deploy).toBe(false)
|
|
25
|
+
expect(davinciProjectConfig.pr.contractTesting).toBe(false)
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
it('returns specified options merged with the default config', () => {
|
|
29
|
+
const data = `
|
|
30
|
+
master:
|
|
31
|
+
conventional_commits: true
|
|
32
|
+
`
|
|
33
|
+
|
|
34
|
+
fs.existsSync.mockReturnValue(true)
|
|
35
|
+
fs.readFileSync.mockReturnValue(data)
|
|
36
|
+
const davinciProjectConfig = require('./davinci-project-config')
|
|
37
|
+
|
|
38
|
+
expect(davinciProjectConfig.master.deploy).toBe(false)
|
|
39
|
+
expect(davinciProjectConfig.master.conventionalCommits).toBe(true)
|
|
40
|
+
expect(davinciProjectConfig.pr.contractTesting).toBe(false)
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
it('parses correctly is_progressive_web_app root flag', () => {
|
|
44
|
+
const data = `
|
|
45
|
+
is_progressive_web_app: true
|
|
46
|
+
`
|
|
47
|
+
|
|
48
|
+
fs.existsSync.mockReturnValue(true)
|
|
49
|
+
fs.readFileSync.mockReturnValue(data)
|
|
50
|
+
const davinciProjectConfig = require('./davinci-project-config')
|
|
51
|
+
|
|
52
|
+
expect(davinciProjectConfig.isProgressiveWebApp).toBe(true)
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
it('parses correctly require_assignee master flag', () => {
|
|
56
|
+
const data = `
|
|
57
|
+
master:
|
|
58
|
+
require_assignee: true
|
|
59
|
+
`
|
|
60
|
+
|
|
61
|
+
fs.existsSync.mockReturnValue(true)
|
|
62
|
+
fs.readFileSync.mockReturnValue(data)
|
|
63
|
+
const davinciProjectConfig = require('./davinci-project-config')
|
|
64
|
+
|
|
65
|
+
expect(davinciProjectConfig.master.requireAssigneeWhitelist).toEqual([
|
|
66
|
+
'dependabot-preview[bot]',
|
|
67
|
+
'dependabot[bot]',
|
|
68
|
+
])
|
|
69
|
+
expect(davinciProjectConfig.master.requireAssignee).toBe(true)
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
it('parses correctly require_assignee_whitelist master flag', () => {
|
|
73
|
+
const data = `
|
|
74
|
+
master:
|
|
75
|
+
require_assignee_whitelist: []
|
|
76
|
+
`
|
|
77
|
+
|
|
78
|
+
fs.existsSync.mockReturnValue(true)
|
|
79
|
+
fs.readFileSync.mockReturnValue(data)
|
|
80
|
+
const davinciProjectConfig = require('./davinci-project-config')
|
|
81
|
+
|
|
82
|
+
expect(davinciProjectConfig.master.requireAssigneeWhitelist).toEqual([])
|
|
83
|
+
expect(davinciProjectConfig.master.requireAssignee).toBe(false)
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
it('parses correctly service_worker_filename root flag', () => {
|
|
87
|
+
const serviceWorkerFileName = 'service-worker-123.js'
|
|
88
|
+
const data = `
|
|
89
|
+
service_worker_filename: ${serviceWorkerFileName}
|
|
90
|
+
`
|
|
91
|
+
|
|
92
|
+
fs.existsSync.mockReturnValue(true)
|
|
93
|
+
fs.readFileSync.mockReturnValue(data)
|
|
94
|
+
const davinciProjectConfig = require('./davinci-project-config')
|
|
95
|
+
|
|
96
|
+
expect(davinciProjectConfig.serviceWorkerFileName).toBe(
|
|
97
|
+
serviceWorkerFileName
|
|
98
|
+
)
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
it('when davinci.yml file exists and service_worker_filename is not specified in config', () => {
|
|
102
|
+
const data = `
|
|
103
|
+
master:
|
|
104
|
+
conventional_commits: true
|
|
105
|
+
`
|
|
106
|
+
|
|
107
|
+
fs.existsSync.mockReturnValue(true)
|
|
108
|
+
fs.readFileSync.mockReturnValue(data)
|
|
109
|
+
const davinciProjectConfig = require('./davinci-project-config')
|
|
110
|
+
|
|
111
|
+
expect(davinciProjectConfig.serviceWorkerFileName).toBeUndefined()
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
it('when davinci.yml file is empty and service_worker_filename is not specified in config', () => {
|
|
115
|
+
const data = ''
|
|
116
|
+
|
|
117
|
+
fs.existsSync.mockReturnValue(true)
|
|
118
|
+
fs.readFileSync.mockReturnValue(data)
|
|
119
|
+
const davinciProjectConfig = require('./davinci-project-config')
|
|
120
|
+
|
|
121
|
+
expect(davinciProjectConfig.serviceWorkerFileName).toBeUndefined()
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
it('parses correctly safety_workers list', () => {
|
|
125
|
+
const data = `
|
|
126
|
+
safety_workers:
|
|
127
|
+
- service-worker-1.js
|
|
128
|
+
- service-worker-2.js
|
|
129
|
+
`
|
|
130
|
+
|
|
131
|
+
fs.existsSync.mockReturnValue(true)
|
|
132
|
+
fs.readFileSync.mockReturnValue(data)
|
|
133
|
+
const davinciProjectConfig = require('./davinci-project-config')
|
|
134
|
+
|
|
135
|
+
expect(davinciProjectConfig.safetyWorkers).toEqual([
|
|
136
|
+
'service-worker-1.js',
|
|
137
|
+
'service-worker-2.js',
|
|
138
|
+
])
|
|
139
|
+
})
|
|
140
|
+
})
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
jest.mock('./yarn-adapter', () => ({
|
|
2
|
+
list: jest.fn(),
|
|
3
|
+
}))
|
|
4
|
+
|
|
5
|
+
const packageUtils = require('./package')
|
|
6
|
+
const yarnAdapter = require('./yarn-adapter')
|
|
7
|
+
|
|
8
|
+
const packageName = '@toptal/davinci-engine'
|
|
9
|
+
const packageValidVersions = [
|
|
10
|
+
'4.0.0',
|
|
11
|
+
'4',
|
|
12
|
+
'4.4',
|
|
13
|
+
'4.1.13-alpha-FX-1234-my-branch.1',
|
|
14
|
+
'^3',
|
|
15
|
+
'~5.6.7',
|
|
16
|
+
]
|
|
17
|
+
const packageInvalidVersions = [
|
|
18
|
+
'2.0.0',
|
|
19
|
+
'6',
|
|
20
|
+
'1.4',
|
|
21
|
+
'1.1.13-alpha-FX-1234-my-branch.1',
|
|
22
|
+
]
|
|
23
|
+
const validVersionRange = '3 - 5'
|
|
24
|
+
const packageJsonDependencies = {
|
|
25
|
+
[packageName]: validVersionRange,
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
describe('package utils', () => {
|
|
29
|
+
describe('checkPrerequirement', () => {
|
|
30
|
+
it('should return an error when package is not installed', () => {
|
|
31
|
+
yarnAdapter.list.mockReturnValueOnce(new Map())
|
|
32
|
+
|
|
33
|
+
const result = packageUtils.checkPrerequirement({
|
|
34
|
+
dependencies: packageJsonDependencies,
|
|
35
|
+
packageName,
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
expect(result).toBe(`Cannot find module '${packageName}'.`)
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
it.each(packageValidVersions)(
|
|
42
|
+
`should return no errors for version %s in range ${validVersionRange}`,
|
|
43
|
+
packageValidVersion => {
|
|
44
|
+
yarnAdapter.list.mockReturnValueOnce(
|
|
45
|
+
new Map([[packageName, packageValidVersion]])
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
const result = packageUtils.checkPrerequirement({
|
|
49
|
+
dependencies: packageJsonDependencies,
|
|
50
|
+
packageName,
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
expect(result).toBeNull()
|
|
54
|
+
}
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
it.each(packageInvalidVersions)(
|
|
58
|
+
`should return an error for version %s in range ${validVersionRange}`,
|
|
59
|
+
packageInvalidVersion => {
|
|
60
|
+
yarnAdapter.list.mockReturnValueOnce(
|
|
61
|
+
new Map([[packageName, packageInvalidVersion]])
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
const result = packageUtils.checkPrerequirement({
|
|
65
|
+
dependencies: packageJsonDependencies,
|
|
66
|
+
packageName,
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
expect(result).toBe(
|
|
70
|
+
`Invalid version of package @toptal/davinci-engine is installed.
|
|
71
|
+
Installed version: ${packageInvalidVersion}
|
|
72
|
+
Should be: ${validVersionRange}`
|
|
73
|
+
)
|
|
74
|
+
}
|
|
75
|
+
)
|
|
76
|
+
})
|
|
77
|
+
})
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
const toVorpalArgs = require('./to-vorpal-args')
|
|
2
|
+
|
|
3
|
+
describe('toVorpalArgs', () => {
|
|
4
|
+
it('transforms numbers', () => {
|
|
5
|
+
const initialArgs = '--foo=1 --bar=2'
|
|
6
|
+
const expectedArgs = '--foo 1 --bar 2'
|
|
7
|
+
|
|
8
|
+
expect(toVorpalArgs(initialArgs)).toEqual(expectedArgs)
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
it('transforms strings', () => {
|
|
12
|
+
const initialArgs = '--foo="hello" --bar="world"'
|
|
13
|
+
const expectedArgs = '--foo "hello" --bar "world"'
|
|
14
|
+
|
|
15
|
+
expect(toVorpalArgs(initialArgs)).toEqual(expectedArgs)
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
it('transforms booleans', () => {
|
|
19
|
+
const initialArgs = '--foo=true --bar=false'
|
|
20
|
+
const expectedArgs = '--foo true --bar false'
|
|
21
|
+
|
|
22
|
+
expect(toVorpalArgs(initialArgs)).toEqual(expectedArgs)
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
it('transforms short arguments', () => {
|
|
26
|
+
const initialArgs = '-f=1 -b="hello"'
|
|
27
|
+
const expectedArgs = '-f 1 -b "hello"'
|
|
28
|
+
|
|
29
|
+
expect(toVorpalArgs(initialArgs)).toEqual(expectedArgs)
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
it('ignores formatted arguments', () => {
|
|
33
|
+
const formattedArgs = '--foo 1 --bar "hello" -f true'
|
|
34
|
+
|
|
35
|
+
expect(toVorpalArgs(formattedArgs)).toEqual(formattedArgs)
|
|
36
|
+
})
|
|
37
|
+
})
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
jest.mock('./run', () => ({
|
|
2
|
+
runSync: jest.fn(),
|
|
3
|
+
}))
|
|
4
|
+
|
|
5
|
+
const yarnAdapter = require('./yarn-adapter')
|
|
6
|
+
const { runSync } = require('./run')
|
|
7
|
+
|
|
8
|
+
const packageName = 'find-up'
|
|
9
|
+
const packageVersion = '5.0.0'
|
|
10
|
+
const existingPackageResponseMock = `{"type":"tree","data":{"type":"list","trees":[{"name":"${packageName}@${packageVersion}","children":[],"hint":null,"color":null,"depth":0}]}}`
|
|
11
|
+
const nonExistingPackageResponseMock = `{"type":"tree","data":{"type":"list","trees":[]}}`
|
|
12
|
+
const invalidResponseMock = 'invalid-response'
|
|
13
|
+
|
|
14
|
+
describe('yarnAdapter', () => {
|
|
15
|
+
describe('list', () => {
|
|
16
|
+
it('should return a version for the existing package', () => {
|
|
17
|
+
runSync.mockReturnValueOnce({
|
|
18
|
+
stdout: existingPackageResponseMock,
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
const result = yarnAdapter.list(packageName)
|
|
22
|
+
|
|
23
|
+
expect(result.size).toBe(1)
|
|
24
|
+
expect(result.get(packageName)).toBe(packageVersion)
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
it('should return empty map for non-existing package', () => {
|
|
28
|
+
runSync.mockReturnValueOnce({
|
|
29
|
+
stdout: nonExistingPackageResponseMock,
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
const result = yarnAdapter.list(packageName)
|
|
33
|
+
|
|
34
|
+
expect(result.size).toBe(0)
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
it('should throw an error for invalid response', () => {
|
|
38
|
+
runSync.mockReturnValueOnce({
|
|
39
|
+
stdout: invalidResponseMock,
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
expect(() => {
|
|
43
|
+
yarnAdapter.list(packageName)
|
|
44
|
+
}).toThrow('Unexpected token i in JSON at position 0')
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
it('should throw an error for empty response', () => {
|
|
48
|
+
runSync.mockReturnValueOnce({
|
|
49
|
+
stdout: '',
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
expect(() => {
|
|
53
|
+
yarnAdapter.list(packageName)
|
|
54
|
+
}).toThrow('Unexpected end of JSON input')
|
|
55
|
+
})
|
|
56
|
+
})
|
|
57
|
+
})
|