@hexonet/semantic-release-whmcs 4.0.4 → 5.0.0
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/dependabot.yml +7 -7
- package/.github/workflows/release.yml +29 -0
- package/.github/workflows/{pull-request.yml → test.yml} +13 -16
- package/.releaserc.json +1 -5
- package/HISTORY.md +12 -0
- package/index.js +23 -24
- package/lib/definitions/errors.js +19 -10
- package/lib/delete-marketplace-version.js +48 -48
- package/lib/get-error.js +6 -6
- package/lib/get-github-releases.js +17 -18
- package/lib/publish.js +10 -13
- package/lib/puppet.js +73 -74
- package/lib/resolve-config.js +5 -6
- package/lib/scrape-marketplace-versions.js +30 -28
- package/lib/set-compatible-versions.js +42 -41
- package/lib/verify.js +4 -4
- package/package.json +32 -28
- package/whmcs.js +81 -53
- package/.eslintignore +0 -3
- package/.eslintrc.js +0 -14
- package/.github/workflows/push.yml +0 -79
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/coverage-final.json +0 -11
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +0 -131
- package/coverage/lib/definitions/errors.js.html +0 -148
- package/coverage/lib/definitions/index.html +0 -116
- package/coverage/lib/delete-marketplace-version.js.html +0 -343
- package/coverage/lib/get-error.js.html +0 -106
- package/coverage/lib/get-github-releases.js.html +0 -184
- package/coverage/lib/index.html +0 -236
- package/coverage/lib/publish.js.html +0 -370
- package/coverage/lib/puppet.js.html +0 -424
- package/coverage/lib/resolve-config.js.html +0 -118
- package/coverage/lib/scrape-marketplace-versions.js.html +0 -220
- package/coverage/lib/set-compatible-versions.js.html +0 -298
- package/coverage/lib/verify.js.html +0 -157
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -196
package/lib/puppet.js
CHANGED
@@ -1,113 +1,112 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
import puppeteer from "puppeteer";
|
2
|
+
import resolveConfig from "./resolve-config.js";
|
3
|
+
import debugConfig from "debug";
|
4
|
+
const debug = debugConfig("semantic-release:whmcs");
|
5
|
+
export default async (context) => {
|
6
|
+
let config;
|
6
7
|
const cfg = {
|
7
|
-
urlbase:
|
8
|
+
urlbase: "https://marketplace.whmcs.com",
|
8
9
|
...resolveConfig(context),
|
9
10
|
// logger: logger,
|
10
11
|
gotoOpts: {
|
11
|
-
waitUntil: [
|
12
|
-
timeout: 240000
|
12
|
+
waitUntil: ["load", "domcontentloaded"],
|
13
|
+
timeout: 240000,
|
13
14
|
},
|
14
15
|
navOpts: {
|
15
|
-
waitUntil: [
|
16
|
-
timeout: 240000
|
16
|
+
waitUntil: ["networkidle0"],
|
17
|
+
timeout: 240000,
|
17
18
|
},
|
18
19
|
selectorOpts: {
|
19
|
-
timeout:
|
20
|
+
timeout: 20000,
|
20
21
|
},
|
21
|
-
logger: context.logger
|
22
|
-
}
|
22
|
+
logger: context.logger,
|
23
|
+
};
|
23
24
|
|
24
25
|
const browser = await puppeteer.launch({
|
25
|
-
headless: cfg.headless ===
|
26
|
+
headless: cfg.headless === "1",
|
26
27
|
defaultViewport: null, // automatically full-sized
|
27
28
|
args: [
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
]
|
38
|
-
})
|
39
|
-
const { logger } = cfg
|
40
|
-
const [page] = await browser.pages()
|
29
|
+
"--disable-gpu",
|
30
|
+
"--incognito",
|
31
|
+
"--start-maximized",
|
32
|
+
"--no-sandbox",
|
33
|
+
"--disable-setuid-sandbox",
|
34
|
+
"--disable-infobars",
|
35
|
+
"--ignore-certifcate-errors",
|
36
|
+
"--ignore-certifcate-errors-spki-list",
|
37
|
+
"--ignoreHTTPSErrors=true",
|
38
|
+
],
|
39
|
+
});
|
40
|
+
const { logger } = cfg;
|
41
|
+
const [page] = await browser.pages();
|
41
42
|
await page.setExtraHTTPHeaders({
|
42
|
-
|
43
|
-
})
|
43
|
+
"Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8",
|
44
|
+
});
|
44
45
|
await page.setUserAgent(
|
45
|
-
|
46
|
-
)
|
47
|
-
await page.setJavaScriptEnabled(true)
|
46
|
+
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
|
47
|
+
);
|
48
|
+
await page.setJavaScriptEnabled(true);
|
48
49
|
|
49
50
|
if (cfg.debug) {
|
50
|
-
page.on(
|
51
|
+
page.on("console", (msg) => {
|
51
52
|
for (let i = 0; i < msg.args().length; i++) {
|
52
|
-
logger.log(`${i}: ${msg.args()[i]}`)
|
53
|
+
logger.log(`${i}: ${msg.args()[i]}`);
|
53
54
|
}
|
54
|
-
})
|
55
|
+
});
|
55
56
|
}
|
56
57
|
|
57
58
|
page.clickAndNavigate = async (selector) => {
|
58
|
-
const { page, navOpts } =
|
59
|
-
const nav = page.waitForNavigation(navOpts)
|
60
|
-
await page.hover(selector)
|
61
|
-
await page.click(selector)
|
62
|
-
await nav
|
63
|
-
}
|
59
|
+
const { page, navOpts } = config;
|
60
|
+
const nav = page.waitForNavigation(navOpts);
|
61
|
+
await page.hover(selector);
|
62
|
+
await page.click(selector);
|
63
|
+
await nav;
|
64
|
+
};
|
64
65
|
|
65
66
|
page.enterAndType = async (selector, value) => {
|
66
|
-
const { page, selectorOpts } =
|
67
|
-
await page.waitForSelector(selector, selectorOpts)
|
68
|
-
await page.type(selector, value)
|
69
|
-
}
|
67
|
+
const { page, selectorOpts } = config;
|
68
|
+
await page.waitForSelector(selector, selectorOpts);
|
69
|
+
await page.type(selector, value);
|
70
|
+
};
|
70
71
|
|
71
|
-
|
72
|
-
const { page, login, password, productid, gotoOpts, urlbase } =
|
73
|
-
const selector = 'div.login-leftcol form button[type="submit"]'
|
72
|
+
async function login() {
|
73
|
+
const { page, login, password, productid, gotoOpts, urlbase } = config;
|
74
|
+
const selector = 'div.login-leftcol form button[type="submit"]';
|
74
75
|
// do login
|
75
76
|
try {
|
76
|
-
await page.goto(`${urlbase}/user/login`, gotoOpts)
|
77
|
-
debug(
|
78
|
-
await page.enterAndType(
|
79
|
-
await page.enterAndType(
|
80
|
-
debug(
|
81
|
-
await page.clickAndNavigate(selector)
|
82
|
-
debug(
|
77
|
+
await page.goto(`${urlbase}/user/login`, gotoOpts);
|
78
|
+
debug("login form loaded at %s", `${urlbase}/user/login`);
|
79
|
+
await page.enterAndType("#email", login);
|
80
|
+
await page.enterAndType("#password", password);
|
81
|
+
debug("WHMCS Marketplace credentials entered");
|
82
|
+
await page.clickAndNavigate(selector);
|
83
|
+
debug("WHMCS Marketplace login form submitted.");
|
83
84
|
} catch (error) {
|
84
|
-
debug(
|
85
|
-
|
86
|
-
|
87
|
-
)
|
88
|
-
await page.browser().close()
|
89
|
-
return false
|
85
|
+
debug("WHMCS Marketplace login failed or Product ID missing", error.message);
|
86
|
+
await page.browser().close();
|
87
|
+
return false;
|
90
88
|
}
|
91
|
-
|
89
|
+
|
90
|
+
debug("WHMCS Marketplace login succeeded.");
|
92
91
|
|
93
92
|
// access MP Product ID
|
94
|
-
let tmp = productid
|
93
|
+
let tmp = productid;
|
95
94
|
if (!tmp || !/^[0-9]+$/.test(productid) || !parseInt(productid, 10)) {
|
96
|
-
debug(
|
97
|
-
await page.browser().close()
|
98
|
-
return false
|
95
|
+
debug("No or invalid WHMCS Marketplace Product ID provided.");
|
96
|
+
await page.browser().close();
|
97
|
+
return false;
|
99
98
|
}
|
100
99
|
|
101
|
-
tmp = tmp.replace(/(.)/g,
|
102
|
-
debug(`WHMCS Marketplace Product ID: ${tmp}`)
|
100
|
+
tmp = tmp.replace(/(.)/g, "$&\u200E");
|
101
|
+
debug(`WHMCS Marketplace Product ID: ${tmp}`);
|
103
102
|
|
104
|
-
return true
|
103
|
+
return true;
|
105
104
|
}
|
106
105
|
|
107
|
-
|
106
|
+
config = {
|
108
107
|
...cfg,
|
109
|
-
page
|
110
|
-
}
|
108
|
+
page,
|
109
|
+
};
|
111
110
|
|
112
|
-
return
|
113
|
-
}
|
111
|
+
return { config, login };
|
112
|
+
};
|
package/lib/resolve-config.js
CHANGED
@@ -1,11 +1,10 @@
|
|
1
|
-
|
1
|
+
export default ({ env }) => ({
|
2
2
|
login: env.WHMCSMP_LOGIN || false,
|
3
3
|
password: env.WHMCSMP_PASSWORD || false,
|
4
4
|
productid: env.WHMCSMP_PRODUCTID || false,
|
5
|
-
minversion: env.WHMCSMP_MINVERSION ||
|
5
|
+
minversion: env.WHMCSMP_MINVERSION || "7.10",
|
6
6
|
ghtoken: env.GH_TOKEN || env.GITHUB_TOKEN || false,
|
7
7
|
ghrepo: env.GH_REPO || env.GITHUB_REPO || false,
|
8
|
-
headless: env.PUPPETEER_HEADLESS ||
|
9
|
-
debug:
|
10
|
-
|
11
|
-
})
|
8
|
+
headless: env.PUPPETEER_HEADLESS || "1",
|
9
|
+
debug: (env.DEBUG && /^semantic-release:(\*|whmcs)$/.test(env.DEBUG)) || false,
|
10
|
+
});
|
@@ -1,45 +1,47 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
import puppet from "./puppet.js";
|
2
|
+
import debugConfig from "debug";
|
3
|
+
import { fileURLToPath } from "node:url";
|
4
|
+
const __filename = fileURLToPath(import.meta.url);
|
5
|
+
const debug = debugConfig("semantic-release:whmcs");
|
4
6
|
|
5
7
|
/**
|
6
8
|
* A method to publish the module update on whmcs market place
|
7
9
|
*/
|
8
|
-
|
9
|
-
const sep =
|
10
|
-
const out = `\n${sep}\n${
|
10
|
+
export default async (pluginConfig, context) => {
|
11
|
+
const sep = "+++++++++++++++++++++++++++++++++++++++++++++++++++";
|
12
|
+
const out = `\n${sep}\n${__filename}\n${sep}\n`;
|
11
13
|
|
12
|
-
const püppi = await puppet(context)
|
13
|
-
const result = await püppi.login()
|
14
|
+
const püppi = await puppet(context);
|
15
|
+
const result = await püppi.login();
|
14
16
|
if (!result) {
|
15
|
-
return result
|
17
|
+
return result;
|
16
18
|
}
|
17
|
-
const { page, gotoOpts, selectorOpts, productid, urlbase } = püppi.config
|
19
|
+
const { page, gotoOpts, selectorOpts, productid, urlbase } = püppi.config;
|
18
20
|
|
19
|
-
let marketplaceVersions = []
|
21
|
+
let marketplaceVersions = [];
|
20
22
|
try {
|
21
23
|
// scrap versions from WHMCS marketplace
|
22
|
-
const url = `${urlbase}/product/${productid}/edit#versions
|
23
|
-
await page.goto(url, gotoOpts)
|
24
|
-
debug(`${out}product page loaded at %s`, url)
|
25
|
-
const selector =
|
26
|
-
await page.waitForSelector(selector, selectorOpts)
|
27
|
-
debug(
|
24
|
+
const url = `${urlbase}/product/${productid}/edit#versions`;
|
25
|
+
await page.goto(url, gotoOpts);
|
26
|
+
debug(`${out}product page loaded at %s`, url);
|
27
|
+
const selector = "div#versions tr strong";
|
28
|
+
await page.waitForSelector(selector, selectorOpts);
|
29
|
+
debug("product version table found");
|
28
30
|
/* istanbul ignore next */
|
29
31
|
marketplaceVersions = await page.$$eval(selector, (tds) =>
|
30
32
|
tds.map((td) => {
|
31
|
-
return td.innerText.substring(8)
|
33
|
+
return td.innerText.substring(8);
|
32
34
|
})
|
33
|
-
)
|
34
|
-
marketplaceVersions.reverse()
|
35
|
-
marketplaceVersions.forEach((v) => debug(`Detected WHMCS version ${v}`))
|
35
|
+
);
|
36
|
+
marketplaceVersions.reverse();
|
37
|
+
marketplaceVersions.forEach((v) => debug(`Detected WHMCS version ${v}`));
|
36
38
|
} catch (error) {
|
37
|
-
debug(
|
38
|
-
await page.browser().close()
|
39
|
-
return false
|
39
|
+
debug("Publishing new product version failed.", error.message);
|
40
|
+
await page.browser().close();
|
41
|
+
return false;
|
40
42
|
}
|
41
43
|
|
42
|
-
debug(
|
43
|
-
await page.browser().close()
|
44
|
-
return marketplaceVersions
|
45
|
-
}
|
44
|
+
debug("Publishing new product version succeeded.");
|
45
|
+
await page.browser().close();
|
46
|
+
return marketplaceVersions;
|
47
|
+
};
|
@@ -1,71 +1,72 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
import puppet from "./puppet.js";
|
2
|
+
import debugConfig from "debug";
|
3
|
+
import { fileURLToPath } from "node:url";
|
4
|
+
const debug = debugConfig("semantic-release:whmcs");
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
4
6
|
|
5
7
|
/**
|
6
8
|
* A method to publish the module update on whmcs market place
|
7
9
|
*/
|
8
|
-
|
9
|
-
const sep =
|
10
|
-
const out = `\n${sep}\n${
|
10
|
+
export default async (pluginConfig, context) => {
|
11
|
+
const sep = "+++++++++++++++++++++++++++++++++++++++++++++++++++";
|
12
|
+
const out = `\n${sep}\n${__filename}\n${sep}\n`;
|
11
13
|
|
12
|
-
const püppi = await puppet(context)
|
13
|
-
const result = await püppi.login()
|
14
|
+
const püppi = await puppet(context);
|
15
|
+
const result = await püppi.login();
|
14
16
|
if (!result) {
|
15
|
-
return result
|
17
|
+
return result;
|
16
18
|
}
|
17
|
-
const { page, gotoOpts, selectorOpts, productid, urlbase, minversion } =
|
18
|
-
püppi.config
|
19
|
+
const { page, gotoOpts, selectorOpts, productid, urlbase, minversion } = püppi.config;
|
19
20
|
|
20
|
-
debug(out)
|
21
|
+
debug(out);
|
21
22
|
try {
|
22
23
|
// scrap versions from WHMCS marketplace
|
23
|
-
const url = `${urlbase}/product/${productid}/edit#compatibility
|
24
|
-
await page.goto(url, gotoOpts)
|
25
|
-
debug(
|
24
|
+
const url = `${urlbase}/product/${productid}/edit#compatibility`;
|
25
|
+
await page.goto(url, gotoOpts);
|
26
|
+
debug("product page loaded at %s", url);
|
26
27
|
|
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(
|
28
|
+
const selector = 'input[name="versionIds[]"]';
|
29
|
+
const submitSelector = 'div#compatibility button[type="submit"]';
|
30
|
+
await page.waitForSelector(selector, selectorOpts);
|
31
|
+
await page.waitForSelector(submitSelector, selectorOpts);
|
32
|
+
debug("compatibility version table found");
|
32
33
|
|
33
|
-
let tmp = minversion
|
34
|
+
let tmp = minversion;
|
34
35
|
if (tmp) {
|
35
|
-
tmp = tmp.replace(/(.)/g,
|
36
|
+
tmp = tmp.replace(/(.)/g, "$&\u200E");
|
36
37
|
}
|
37
|
-
debug(`Minimum required WHMCS version: ${tmp}`)
|
38
|
+
debug(`Minimum required WHMCS version: ${tmp}`);
|
38
39
|
/* istanbul ignore next */
|
39
40
|
await page.$$eval(
|
40
41
|
selector,
|
41
42
|
(checkboxes, minversion) =>
|
42
43
|
checkboxes.forEach(function (c) {
|
43
|
-
const checkParts = c.className.split(
|
44
|
-
const minParts = minversion.split(
|
45
|
-
let check = true
|
44
|
+
const checkParts = c.className.split("-")[0].split("_");
|
45
|
+
const minParts = minversion.split(".");
|
46
|
+
let check = true;
|
46
47
|
for (let i = 0; i < 2; i++) {
|
47
|
-
const a = ~~checkParts[i]
|
48
|
-
const b = ~~minParts[i]
|
48
|
+
const a = ~~checkParts[i];
|
49
|
+
const b = ~~minParts[i];
|
49
50
|
if (a > b) {
|
50
|
-
break
|
51
|
+
break;
|
51
52
|
}
|
52
53
|
if (a < b) {
|
53
|
-
check = false
|
54
|
-
break
|
54
|
+
check = false;
|
55
|
+
break;
|
55
56
|
}
|
56
57
|
}
|
57
|
-
c.checked = check
|
58
|
+
c.checked = check;
|
58
59
|
}),
|
59
60
|
minversion
|
60
|
-
)
|
61
|
-
await page.clickAndNavigate(submitSelector)
|
61
|
+
);
|
62
|
+
await page.clickAndNavigate(submitSelector);
|
62
63
|
} catch (error) {
|
63
|
-
debug(
|
64
|
-
await page.browser().close()
|
65
|
-
return false
|
64
|
+
debug("Updating whmcs compatibility list failed.", error.message);
|
65
|
+
await page.browser().close();
|
66
|
+
return false;
|
66
67
|
}
|
67
68
|
|
68
|
-
debug(
|
69
|
-
await page.browser().close()
|
70
|
-
return true
|
71
|
-
}
|
69
|
+
debug("Updating whmcs compatibility list succeeded.");
|
70
|
+
await page.browser().close();
|
71
|
+
return true;
|
72
|
+
};
|
package/lib/verify.js
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
import AggregateError from "aggregate-error";
|
2
|
+
import resolveConfig from "./resolve-config.js";
|
3
|
+
import getError from "./get-error.js";
|
4
4
|
|
5
|
-
|
5
|
+
export default async (pluginConfig, context) => {
|
6
6
|
const cfg = resolveConfig(context);
|
7
7
|
const errors = [];
|
8
8
|
if (cfg.ghtoken === false) {
|
package/package.json
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
{
|
2
2
|
"name": "@hexonet/semantic-release-whmcs",
|
3
3
|
"description": "`semantic-release` plugin for auto-publishing on WHMCS marketplace",
|
4
|
-
"version": "
|
4
|
+
"version": "5.0.0",
|
5
5
|
"private": false,
|
6
|
+
"type": "module",
|
6
7
|
"publishConfig": {
|
7
8
|
"access": "public"
|
8
9
|
},
|
@@ -10,11 +11,10 @@
|
|
10
11
|
"name": "Kai Schwarz",
|
11
12
|
"email": "kschwarz@hexonet.net"
|
12
13
|
},
|
13
|
-
"main": "index.js",
|
14
14
|
"license": "MIT",
|
15
15
|
"engines": {
|
16
|
-
"node": ">=
|
17
|
-
"npm": "
|
16
|
+
"node": ">=18",
|
17
|
+
"npm": "8.11.0"
|
18
18
|
},
|
19
19
|
"homepage": "https://github.com/centralnicgroup-opensource/rtldev-middleware-semantic-release-whmcs#readme",
|
20
20
|
"repository": "github:centralnicgroup-opensource/rtldev-middleware-semantic-release-whmcs",
|
@@ -34,9 +34,24 @@
|
|
34
34
|
"semantic-release",
|
35
35
|
"version"
|
36
36
|
],
|
37
|
-
"
|
37
|
+
"ava": {
|
38
|
+
"files": [
|
39
|
+
"test/**/*.test.js"
|
40
|
+
],
|
41
|
+
"nodeArguments": [
|
42
|
+
"--no-warnings"
|
43
|
+
],
|
44
|
+
"timeout": "2m"
|
45
|
+
},
|
46
|
+
"prettier": {
|
47
|
+
"printWidth": 120,
|
48
|
+
"trailingComma": "es5"
|
49
|
+
},
|
50
|
+
"c8": {
|
38
51
|
"include": [
|
39
|
-
"lib/**/*.js"
|
52
|
+
"lib/**/*.js",
|
53
|
+
"index.js",
|
54
|
+
"cli.js"
|
40
55
|
],
|
41
56
|
"reporter": [
|
42
57
|
"json",
|
@@ -45,39 +60,28 @@
|
|
45
60
|
],
|
46
61
|
"all": true
|
47
62
|
},
|
48
|
-
"
|
49
|
-
"require": [
|
50
|
-
"esm"
|
51
|
-
]
|
52
|
-
},
|
63
|
+
"main": "index.js",
|
53
64
|
"scripts": {
|
54
|
-
"
|
55
|
-
"
|
56
|
-
"lint": "
|
65
|
+
"test": "c8 ava --verbose",
|
66
|
+
"lint": "prettier --check \"*.{js,json}\" \".github/**/*.{md,yml}\" \"{lib,test}/*.js\"",
|
67
|
+
"lint:fix": "prettier --write \"*.{js,json}\" \".github/**/*.{md,yml}\" \"{lib,test}/*.js\""
|
57
68
|
},
|
58
69
|
"devDependencies": {
|
59
70
|
"@semantic-release/changelog": "^6.0.1",
|
60
71
|
"@semantic-release/exec": "^6.0.2",
|
61
72
|
"@semantic-release/git": "^10.0.1",
|
62
|
-
"ava": "
|
63
|
-
"
|
64
|
-
"
|
65
|
-
"
|
66
|
-
"eslint-plugin-json": "^3.0.0",
|
67
|
-
"eslint-plugin-markdown": "^3.0.0",
|
68
|
-
"eslint-plugin-n": "^15.2.2",
|
69
|
-
"eslint-plugin-promise": "^6.0.0",
|
70
|
-
"esm": "^3.2.25",
|
71
|
-
"nyc": "^15.1.0",
|
72
|
-
"semantic-release": "^19.0.3",
|
73
|
+
"ava": "5.1.1",
|
74
|
+
"c8": "^7.12.0",
|
75
|
+
"prettier": "^2.8.3",
|
76
|
+
"semantic-release": "^20.0.2",
|
73
77
|
"stream-buffers": "^3.0.2"
|
74
78
|
},
|
75
79
|
"dependencies": {
|
76
80
|
"@semantic-release/error": "^3.0.0",
|
77
|
-
"aggregate-error": "^
|
81
|
+
"aggregate-error": "^4.0.1",
|
78
82
|
"debug": "^4.3.4",
|
79
83
|
"github-api": "^3.4.0",
|
80
|
-
"puppeteer": "^
|
81
|
-
"yargs": "^17.
|
84
|
+
"puppeteer": "^19.4.1",
|
85
|
+
"yargs": "^17.5.1"
|
82
86
|
}
|
83
87
|
}
|
package/whmcs.js
CHANGED
@@ -1,59 +1,87 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
import { createRequire } from "node:module";
|
2
|
+
import { publish, syncVersions, delVersion, updateCompatibility } from "./index.js";
|
3
|
+
const require = createRequire(import.meta.url);
|
3
4
|
|
4
5
|
const context = {
|
5
6
|
env: process.env,
|
6
|
-
logger: new class {
|
7
|
-
log
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
logger: new (class {
|
8
|
+
log(msg) {
|
9
|
+
console.log(msg);
|
10
|
+
}
|
11
|
+
info(msg) {
|
12
|
+
console.log(msg);
|
13
|
+
}
|
14
|
+
error(msg, details) {
|
15
|
+
console.error(msg + " " + details);
|
16
|
+
}
|
17
|
+
})(),
|
18
|
+
};
|
12
19
|
|
13
20
|
// eslint-disable-next-line no-unused-expressions
|
14
|
-
require(
|
15
|
-
.scriptName(
|
16
|
-
.usage(
|
17
|
-
.command(
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
21
|
+
require("yargs")
|
22
|
+
.scriptName("whmcs.js")
|
23
|
+
.usage("$0 <cmd> [args]")
|
24
|
+
.command(
|
25
|
+
"publish [ver] [notes]",
|
26
|
+
"publishes the specified version to the WHMCS Marketplace",
|
27
|
+
(yargs) => {
|
28
|
+
yargs
|
29
|
+
.positional("ver", {
|
30
|
+
type: "string",
|
31
|
+
demandOption: true,
|
32
|
+
describe: "the version to publish",
|
33
|
+
})
|
34
|
+
.positional("notes", {
|
35
|
+
type: "string",
|
36
|
+
demandOption: true,
|
37
|
+
describe: "the changelog",
|
38
|
+
});
|
39
|
+
},
|
40
|
+
function (argv) {
|
41
|
+
context.nextRelease = {
|
42
|
+
version: argv.ver,
|
43
|
+
notes: argv.notes,
|
44
|
+
};
|
45
|
+
publish({}, context).then((r) => {
|
46
|
+
console.log(r === false ? "Failed" : "Successful");
|
47
|
+
});
|
48
|
+
}
|
49
|
+
)
|
50
|
+
.command(
|
51
|
+
"sync",
|
52
|
+
"adds missing versions to the WHMCS Marketplace",
|
53
|
+
() => {},
|
54
|
+
function () {
|
55
|
+
syncVersions({}, context).then((r) => {
|
56
|
+
console.log(r === false ? "Failed" : "Successful");
|
57
|
+
});
|
58
|
+
}
|
59
|
+
)
|
60
|
+
.command(
|
61
|
+
"del [ver]",
|
62
|
+
"deletes the specified version from the WHMCS Marketplace",
|
63
|
+
(yargs) => {
|
64
|
+
yargs.positional("ver", {
|
65
|
+
type: "string",
|
66
|
+
demandOption: true,
|
67
|
+
describe: "the version to delete",
|
68
|
+
});
|
69
|
+
},
|
70
|
+
function (argv) {
|
71
|
+
context.version = argv.ver;
|
72
|
+
delVersion({}, context).then((r) => {
|
73
|
+
console.log(r === false ? "Failed" : "Successful");
|
74
|
+
});
|
75
|
+
}
|
76
|
+
)
|
77
|
+
.command(
|
78
|
+
"compatibility",
|
79
|
+
"set the compatible WHMCS versions in the Marketplace",
|
80
|
+
() => {},
|
81
|
+
function () {
|
82
|
+
updateCompatibility({}, context).then((r) => {
|
83
|
+
console.log(r === false ? "Failed" : "Successful");
|
84
|
+
});
|
31
85
|
}
|
32
|
-
|
33
|
-
|
34
|
-
})
|
35
|
-
})
|
36
|
-
.command('sync', 'adds missing versions to the WHMCS Marketplace', () => {}, function () {
|
37
|
-
syncVersions({}, context).then(r => {
|
38
|
-
console.log(r === false ? 'Failed' : 'Successful')
|
39
|
-
})
|
40
|
-
})
|
41
|
-
.command('del [ver]', 'deletes the specified version from the WHMCS Marketplace', (yargs) => {
|
42
|
-
yargs.positional('ver', {
|
43
|
-
type: 'string',
|
44
|
-
demandOption: true,
|
45
|
-
describe: 'the version to delete'
|
46
|
-
})
|
47
|
-
}, function (argv) {
|
48
|
-
context.version = argv.ver
|
49
|
-
delVersion({}, context).then(r => {
|
50
|
-
console.log(r === false ? 'Failed' : 'Successful')
|
51
|
-
})
|
52
|
-
})
|
53
|
-
.command('compatibility', 'set the compatible WHMCS versions in the Marketplace', () => {}, function () {
|
54
|
-
updateCompatibility({}, context).then(r => {
|
55
|
-
console.log(r === false ? 'Failed' : 'Successful')
|
56
|
-
})
|
57
|
-
})
|
58
|
-
.help()
|
59
|
-
.argv
|
86
|
+
)
|
87
|
+
.help().argv;
|
package/.eslintignore
DELETED