@hexonet/semantic-release-whmcs 4.0.0 → 4.0.3
Sign up to get free protection for your applications and to get access to all the features.
- package/.github/workflows/pull-request.yml +7 -6
- package/.github/workflows/push.yml +7 -6
- package/.releaserc.json +5 -1
- package/HISTORY.md +22 -0
- package/README.md +1 -0
- package/coverage/coverage-final.json +8 -8
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +19 -19
- package/coverage/lib/definitions/errors.js.html +1 -1
- package/coverage/lib/definitions/index.html +1 -1
- package/coverage/lib/delete-marketplace-version.js.html +93 -150
- package/coverage/lib/get-error.js.html +1 -1
- package/coverage/lib/get-github-releases.js.html +15 -21
- package/coverage/lib/index.html +47 -47
- package/coverage/lib/publish.js.html +81 -204
- package/coverage/lib/puppet.js.html +207 -54
- package/coverage/lib/resolve-config.js.html +17 -11
- package/coverage/lib/scrape-marketplace-versions.js.html +32 -134
- package/coverage/lib/set-compatible-versions.js.html +64 -142
- package/coverage/lib/verify.js.html +9 -6
- package/coverage/sort-arrow-sprite.png +0 -0
- package/lib/delete-marketplace-version.js +59 -78
- package/lib/get-github-releases.js +9 -11
- package/lib/publish.js +76 -117
- package/lib/puppet.js +79 -28
- package/lib/resolve-config.js +9 -7
- package/lib/scrape-marketplace-versions.js +27 -61
- package/lib/set-compatible-versions.js +53 -79
- package/lib/verify.js +4 -3
- package/package.json +8 -9
@@ -1,79 +1,45 @@
|
|
1
1
|
const debug = require('debug')('semantic-release:whmcs')
|
2
|
-
const resolveConfig = require('./resolve-config')
|
3
2
|
const puppet = require('./puppet')
|
3
|
+
const path = require('path')
|
4
4
|
|
5
5
|
/**
|
6
6
|
* A method to publish the module update on whmcs market place
|
7
7
|
*/
|
8
8
|
module.exports = async (pluginConfig, context) => {
|
9
|
-
const
|
10
|
-
|
11
|
-
} = context
|
9
|
+
const sep = '+++++++++++++++++++++++++++++++++++++++++++++++++++'
|
10
|
+
const out = `\n${sep}\n${path.basename(__filename)}\n${sep}\n`
|
12
11
|
|
13
|
-
|
14
|
-
const
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
const wmbase = 'https://marketplace.whmcs.com'
|
21
|
-
let url = `${wmbase}/user/login`
|
12
|
+
const püppi = await puppet(context)
|
13
|
+
const result = await püppi.login()
|
14
|
+
if (!result) {
|
15
|
+
return result
|
16
|
+
}
|
17
|
+
const { page, gotoOpts, selectorOpts, productid, urlbase } = püppi.config
|
22
18
|
|
19
|
+
let marketplaceVersions = []
|
23
20
|
try {
|
21
|
+
// scrap versions from WHMCS marketplace
|
22
|
+
const url = `${urlbase}/product/${productid}/edit#versions`
|
24
23
|
await page.goto(url, gotoOpts)
|
25
|
-
|
26
|
-
const selector = 'div
|
24
|
+
debug(`${out}product page loaded at %s`, url)
|
25
|
+
const selector = 'div#versions tr strong'
|
27
26
|
await page.waitForSelector(selector, selectorOpts)
|
28
|
-
debug('
|
29
|
-
|
30
|
-
await page
|
31
|
-
|
32
|
-
const nav = page.waitForNavigation(navOpts)
|
33
|
-
await page.hover(selector)
|
34
|
-
await page.click(selector)
|
35
|
-
await nav
|
36
|
-
debug('Login form successfully submitted.')
|
37
|
-
logger.log('WHMCS Marketplace Login Form successfully submitted.')
|
38
|
-
} catch (error) {
|
39
|
-
debug('WHMCS Marketplace login failed.', error.message)
|
40
|
-
logger.error('WHMCS Marketplace login failed.', error.message)
|
41
|
-
success = false
|
42
|
-
}
|
43
|
-
let marketplaceVersions = false
|
44
|
-
if (success) {
|
45
|
-
try {
|
46
|
-
if (!parseInt(whmcsPRODUCTID, 10)) {
|
47
|
-
return false
|
48
|
-
}
|
49
|
-
|
50
|
-
// scrap versions from WHMCS marketplace
|
51
|
-
url = `${wmbase}/product/${whmcsPRODUCTID}/edit#versions`
|
52
|
-
await page.goto(url, gotoOpts)
|
53
|
-
debug('product page loaded at %s', url)
|
54
|
-
const selector = 'div#versions tr strong'
|
55
|
-
await page.waitForSelector(selector, selectorOpts)
|
56
|
-
debug('product version table found')
|
57
|
-
/* istanbul ignore next */
|
58
|
-
marketplaceVersions = await page.$$eval('div#versions tr td strong', tds => tds.map((td) => {
|
27
|
+
debug('product version table found')
|
28
|
+
/* istanbul ignore next */
|
29
|
+
marketplaceVersions = await page.$$eval(selector, (tds) =>
|
30
|
+
tds.map((td) => {
|
59
31
|
return td.innerText.substring(8)
|
60
|
-
})
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
debug('publishing new product version failed.', error.message)
|
69
|
-
logger.error('WHMCS Marketplace publishing new product version failed.', error.message)
|
70
|
-
success = false
|
71
|
-
}
|
32
|
+
})
|
33
|
+
)
|
34
|
+
marketplaceVersions.reverse()
|
35
|
+
marketplaceVersions.forEach((v) => debug(`Detected WHMCS version ${v}`))
|
36
|
+
} catch (error) {
|
37
|
+
debug('Publishing new product version failed.', error.message)
|
38
|
+
await page.browser().close()
|
39
|
+
return false
|
72
40
|
}
|
73
41
|
|
42
|
+
debug('Publishing new product version succeeded.')
|
74
43
|
await page.browser().close()
|
75
|
-
if (!success) {
|
76
|
-
return false
|
77
|
-
}
|
78
44
|
return marketplaceVersions
|
79
45
|
}
|
@@ -1,97 +1,71 @@
|
|
1
1
|
const debug = require('debug')('semantic-release:whmcs')
|
2
|
-
const resolveConfig = require('./resolve-config')
|
3
2
|
const puppet = require('./puppet')
|
3
|
+
const path = require('path')
|
4
4
|
|
5
5
|
/**
|
6
6
|
* A method to publish the module update on whmcs market place
|
7
7
|
*/
|
8
8
|
module.exports = async (pluginConfig, context) => {
|
9
|
-
const
|
10
|
-
|
11
|
-
} = context
|
9
|
+
const sep = '+++++++++++++++++++++++++++++++++++++++++++++++++++'
|
10
|
+
const out = `\n${sep}\n${path.basename(__filename)}\n${sep}\n`
|
12
11
|
|
13
|
-
|
14
|
-
const
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
const wmbase = 'https://marketplace.whmcs.com'
|
21
|
-
let url = `${wmbase}/user/login`
|
12
|
+
const püppi = await puppet(context)
|
13
|
+
const result = await püppi.login()
|
14
|
+
if (!result) {
|
15
|
+
return result
|
16
|
+
}
|
17
|
+
const { page, gotoOpts, selectorOpts, productid, urlbase, minversion } =
|
18
|
+
püppi.config
|
22
19
|
|
20
|
+
debug(out)
|
23
21
|
try {
|
22
|
+
// scrap versions from WHMCS marketplace
|
23
|
+
const url = `${urlbase}/product/${productid}/edit#compatibility`
|
24
24
|
await page.goto(url, gotoOpts)
|
25
|
-
|
26
|
-
const selector = 'div.login-leftcol form button[type="submit"]'
|
27
|
-
await page.waitForSelector(selector, selectorOpts)
|
28
|
-
debug('login form loaded at %s', url)
|
29
|
-
await page.type('#email', whmcsLOGIN)
|
30
|
-
await page.type('#password', whmcsPASSWORD)
|
31
|
-
debug('WHMCS Marketplace credentials entered')
|
32
|
-
const nav = page.waitForNavigation(navOpts)
|
33
|
-
await page.hover(selector)
|
34
|
-
await page.click(selector)
|
35
|
-
await nav
|
36
|
-
debug('Login form successfully submitted.')
|
37
|
-
logger.log('WHMCS Marketplace Login Form successfully submitted.')
|
38
|
-
} catch (error) {
|
39
|
-
debug('WHMCS Marketplace login failed.', error.message)
|
40
|
-
logger.error('WHMCS Marketplace login failed.', error.message)
|
41
|
-
success = false
|
42
|
-
}
|
43
|
-
|
44
|
-
if (success) {
|
45
|
-
try {
|
46
|
-
if (!parseInt(whmcsPRODUCTID, 10)) {
|
47
|
-
return false
|
48
|
-
}
|
25
|
+
debug('product page loaded at %s', url)
|
49
26
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
const selector = 'input[name="versionIds[]"]'
|
56
|
-
const submitSelector = 'div#compatibility button[type="submit"]'
|
57
|
-
await page.waitForSelector(selector, selectorOpts)
|
58
|
-
await page.waitForSelector(submitSelector, selectorOpts)
|
59
|
-
debug('compatibility version table found')
|
60
|
-
|
61
|
-
logger.log(`Minimum required WHMCS version: ${whmcsMINVERSION}`)
|
62
|
-
/* istanbul ignore next */
|
63
|
-
await page.$$eval(selector, (checkboxes, whmcsMINVERSION) => checkboxes.forEach(function (c, i) {
|
64
|
-
const checkParts = c.className.split('-')[0].split('_')
|
65
|
-
const minParts = whmcsMINVERSION.split('.')
|
66
|
-
let check = true
|
67
|
-
for (let i = 0; i < 2; i++) {
|
68
|
-
const a = ~~checkParts[i]
|
69
|
-
const b = ~~minParts[i]
|
70
|
-
if (a > b) {
|
71
|
-
break
|
72
|
-
}
|
73
|
-
if (a < b) {
|
74
|
-
check = false
|
75
|
-
break
|
76
|
-
}
|
77
|
-
}
|
78
|
-
c.checked = check
|
79
|
-
}), whmcsMINVERSION)
|
80
|
-
const submitNav = page.waitForNavigation(navOpts)
|
81
|
-
await page.hover(submitSelector)
|
82
|
-
await page.click(submitSelector)
|
83
|
-
await submitNav
|
27
|
+
const selector = 'input[name="versionIds[]"]'
|
28
|
+
const submitSelector = 'div#compatibility button[type="submit"]'
|
29
|
+
await page.waitForSelector(selector, selectorOpts)
|
30
|
+
await page.waitForSelector(submitSelector, selectorOpts)
|
31
|
+
debug('compatibility version table found')
|
84
32
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
} catch (error) {
|
89
|
-
debug('updating whmcs compatibility list failed.', error.message)
|
90
|
-
logger.error('WHMCS Marketplace updating whmcs compatibility list failed.', error.message)
|
91
|
-
success = false
|
33
|
+
let tmp = minversion
|
34
|
+
if (tmp) {
|
35
|
+
tmp = tmp.replace(/(.)/g, '$&\u200E')
|
92
36
|
}
|
37
|
+
debug(`Minimum required WHMCS version: ${tmp}`)
|
38
|
+
/* istanbul ignore next */
|
39
|
+
await page.$$eval(
|
40
|
+
selector,
|
41
|
+
(checkboxes, minversion) =>
|
42
|
+
checkboxes.forEach(function (c) {
|
43
|
+
const checkParts = c.className.split('-')[0].split('_')
|
44
|
+
const minParts = minversion.split('.')
|
45
|
+
let check = true
|
46
|
+
for (let i = 0; i < 2; i++) {
|
47
|
+
const a = ~~checkParts[i]
|
48
|
+
const b = ~~minParts[i]
|
49
|
+
if (a > b) {
|
50
|
+
break
|
51
|
+
}
|
52
|
+
if (a < b) {
|
53
|
+
check = false
|
54
|
+
break
|
55
|
+
}
|
56
|
+
}
|
57
|
+
c.checked = check
|
58
|
+
}),
|
59
|
+
minversion
|
60
|
+
)
|
61
|
+
await page.clickAndNavigate(submitSelector)
|
62
|
+
} catch (error) {
|
63
|
+
debug('Updating whmcs compatibility list failed.', error.message)
|
64
|
+
await page.browser().close()
|
65
|
+
return false
|
93
66
|
}
|
94
67
|
|
68
|
+
debug('Updating whmcs compatibility list succeeded.')
|
95
69
|
await page.browser().close()
|
96
|
-
return
|
70
|
+
return true
|
97
71
|
}
|
package/lib/verify.js
CHANGED
@@ -5,13 +5,14 @@ const getError = require('./get-error')
|
|
5
5
|
module.exports = async (pluginConfig, context) => {
|
6
6
|
const cfg = resolveConfig(context)
|
7
7
|
const errors = []
|
8
|
-
if (cfg.
|
8
|
+
if (cfg.login === false || cfg.password === false) {
|
9
9
|
errors.push(getError('EWHMCSNOCREDENTIALS'))
|
10
10
|
}
|
11
|
-
|
11
|
+
// TODO: we might test Marketplace login using given credentials
|
12
|
+
if (cfg.productid === false) {
|
12
13
|
errors.push(getError('EWHMCSNOPRODUCTID'))
|
13
14
|
}
|
14
|
-
if (!/^[0-9]+$/.test(cfg.
|
15
|
+
if (!/^[0-9]+$/.test(cfg.productid) || !parseInt(cfg.productid, 10)) {
|
15
16
|
errors.push(getError('EWHMCSINVALIDPRODUCTID'))
|
16
17
|
}
|
17
18
|
if (errors.length > 0) {
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "@hexonet/semantic-release-whmcs",
|
3
3
|
"description": "`semantic-release` plugin for auto-publishing on WHMCS marketplace",
|
4
|
-
"version": "4.0.
|
4
|
+
"version": "4.0.3",
|
5
5
|
"private": false,
|
6
6
|
"publishConfig": {
|
7
7
|
"access": "public"
|
@@ -14,7 +14,7 @@
|
|
14
14
|
"license": "MIT",
|
15
15
|
"engines": {
|
16
16
|
"node": ">=16.15.1",
|
17
|
-
"npm": ">=8.11.
|
17
|
+
"npm": ">=8.11.0"
|
18
18
|
},
|
19
19
|
"homepage": "https://github.com/hexonet/semantic-release-whmcs#readme",
|
20
20
|
"repository": "github:hexonet/semantic-release-whmcs",
|
@@ -52,9 +52,8 @@
|
|
52
52
|
},
|
53
53
|
"scripts": {
|
54
54
|
"coverage": "nyc npm run test",
|
55
|
-
"test": "ava --verbose --timeout=2m",
|
56
|
-
"lint": "eslint --fix --config=./.eslintrc.js *.js lib/*.js lib/definitions/*.js README.md *.json test/*.test.js"
|
57
|
-
"semantic-release": "semantic-release"
|
55
|
+
"test": "ava --fail-fast --verbose --timeout=2m",
|
56
|
+
"lint": "eslint --fix --config=./.eslintrc.js *.js lib/*.js lib/definitions/*.js README.md *.json test/*.test.js"
|
58
57
|
},
|
59
58
|
"devDependencies": {
|
60
59
|
"@semantic-release/changelog": "^6.0.1",
|
@@ -65,12 +64,12 @@
|
|
65
64
|
"eslint-config-standard": "^17.0.0",
|
66
65
|
"eslint-plugin-import": "^2.25.2",
|
67
66
|
"eslint-plugin-json": "^3.0.0",
|
68
|
-
"eslint-plugin-markdown": "^
|
69
|
-
"eslint-plugin-n": "^15.2.
|
67
|
+
"eslint-plugin-markdown": "^3.0.0",
|
68
|
+
"eslint-plugin-n": "^15.2.2",
|
70
69
|
"eslint-plugin-promise": "^6.0.0",
|
71
70
|
"esm": "^3.2.25",
|
72
71
|
"nyc": "^15.1.0",
|
73
|
-
"semantic-release": "^19.0.
|
72
|
+
"semantic-release": "^19.0.3",
|
74
73
|
"stream-buffers": "^3.0.2"
|
75
74
|
},
|
76
75
|
"dependencies": {
|
@@ -78,7 +77,7 @@
|
|
78
77
|
"aggregate-error": "^3.1.0",
|
79
78
|
"debug": "^4.3.4",
|
80
79
|
"github-api": "^3.4.0",
|
81
|
-
"puppeteer": "^
|
80
|
+
"puppeteer": "^16.0.0",
|
82
81
|
"yargs": "^17.0.1"
|
83
82
|
}
|
84
83
|
}
|