@hexonet/semantic-release-whmcs 4.0.2 → 4.0.3
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/.github/workflows/pull-request.yml +7 -7
- package/.github/workflows/push.yml +7 -7
- package/HISTORY.md +7 -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 +45 -45
- package/coverage/lib/publish.js.html +81 -204
- package/coverage/lib/puppet.js.html +208 -55
- package/coverage/lib/resolve-config.js.html +13 -10
- 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 -8
- 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 +5 -5
@@ -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,7 +52,7 @@
|
|
52
52
|
},
|
53
53
|
"scripts": {
|
54
54
|
"coverage": "nyc npm run test",
|
55
|
-
"test": "ava --verbose --timeout=2m",
|
55
|
+
"test": "ava --fail-fast --verbose --timeout=2m",
|
56
56
|
"lint": "eslint --fix --config=./.eslintrc.js *.js lib/*.js lib/definitions/*.js README.md *.json test/*.test.js"
|
57
57
|
},
|
58
58
|
"devDependencies": {
|
@@ -64,7 +64,7 @@
|
|
64
64
|
"eslint-config-standard": "^17.0.0",
|
65
65
|
"eslint-plugin-import": "^2.25.2",
|
66
66
|
"eslint-plugin-json": "^3.0.0",
|
67
|
-
"eslint-plugin-markdown": "^
|
67
|
+
"eslint-plugin-markdown": "^3.0.0",
|
68
68
|
"eslint-plugin-n": "^15.2.2",
|
69
69
|
"eslint-plugin-promise": "^6.0.0",
|
70
70
|
"esm": "^3.2.25",
|
@@ -77,7 +77,7 @@
|
|
77
77
|
"aggregate-error": "^3.1.0",
|
78
78
|
"debug": "^4.3.4",
|
79
79
|
"github-api": "^3.4.0",
|
80
|
-
"puppeteer": "^
|
80
|
+
"puppeteer": "^16.0.0",
|
81
81
|
"yargs": "^17.0.1"
|
82
82
|
}
|
83
83
|
}
|