@hexonet/semantic-release-whmcs 4.0.3 → 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.
Files changed (44) hide show
  1. package/.github/dependabot.yml +7 -7
  2. package/.github/workflows/release.yml +29 -0
  3. package/.github/workflows/{pull-request.yml → test.yml} +13 -16
  4. package/.releaserc.json +1 -5
  5. package/CONTRIBUTING.md +1 -1
  6. package/HISTORY.md +81 -62
  7. package/README.md +5 -5
  8. package/index.js +36 -30
  9. package/lib/definitions/errors.js +26 -13
  10. package/lib/delete-marketplace-version.js +48 -48
  11. package/lib/get-error.js +6 -6
  12. package/lib/get-github-releases.js +17 -18
  13. package/lib/publish.js +10 -13
  14. package/lib/puppet.js +73 -74
  15. package/lib/resolve-config.js +5 -6
  16. package/lib/scrape-marketplace-versions.js +30 -28
  17. package/lib/set-compatible-versions.js +42 -41
  18. package/lib/verify.js +14 -11
  19. package/package.json +35 -31
  20. package/whmcs.js +81 -53
  21. package/.eslintignore +0 -3
  22. package/.eslintrc.js +0 -14
  23. package/.github/workflows/push.yml +0 -79
  24. package/coverage/base.css +0 -224
  25. package/coverage/block-navigation.js +0 -87
  26. package/coverage/coverage-final.json +0 -11
  27. package/coverage/favicon.png +0 -0
  28. package/coverage/index.html +0 -131
  29. package/coverage/lib/definitions/errors.js.html +0 -136
  30. package/coverage/lib/definitions/index.html +0 -116
  31. package/coverage/lib/delete-marketplace-version.js.html +0 -343
  32. package/coverage/lib/get-error.js.html +0 -106
  33. package/coverage/lib/get-github-releases.js.html +0 -184
  34. package/coverage/lib/index.html +0 -236
  35. package/coverage/lib/publish.js.html +0 -370
  36. package/coverage/lib/puppet.js.html +0 -424
  37. package/coverage/lib/resolve-config.js.html +0 -118
  38. package/coverage/lib/scrape-marketplace-versions.js.html +0 -220
  39. package/coverage/lib/set-compatible-versions.js.html +0 -298
  40. package/coverage/lib/verify.js.html +0 -148
  41. package/coverage/prettify.css +0 -1
  42. package/coverage/prettify.js +0 -2
  43. package/coverage/sort-arrow-sprite.png +0 -0
  44. package/coverage/sorter.js +0 -196
@@ -1,40 +1,40 @@
1
- const debug = require('debug')('semantic-release:whmcs')
2
- const puppet = require('./puppet')
3
- const path = require('path')
4
-
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);
5
6
  /**
6
7
  * A method to publish the module update on whmcs market place
7
8
  */
8
- module.exports = async (pluginConfig, context) => {
9
+ export default async (pluginConfig, context) => {
9
10
  // if (!context.logger) {
10
11
  // context.logger = console;
11
12
  // }
12
13
 
13
- const sep = '+++++++++++++++++++++++++++++++++++++++++++++++++++'
14
- const out = `\n${sep}\n${path.basename(__filename)}\n${sep}\n`
14
+ const sep = "+++++++++++++++++++++++++++++++++++++++++++++++++++";
15
+ const out = `\n${sep}\n${__filename}\n${sep}\n`;
15
16
 
16
- const { version } = context
17
+ const { version } = context;
17
18
  if (!version || !version.length) {
18
- debug(`${out}Deleting product version failed. No input data available.`)
19
- return false
19
+ debug(`${out}Deleting product version failed. No input data available.`);
20
+ return false;
20
21
  }
21
22
 
22
- debug(`${out}Delete Version: ${version}`)
23
+ debug(`${out}Delete Version: ${version}`);
23
24
 
24
- const püppi = await puppet(context)
25
- const result = await püppi.login()
25
+ const püppi = await puppet(context);
26
+ const result = await püppi.login();
26
27
  if (!result) {
27
- return result
28
+ return result;
28
29
  }
29
- const { page, navOpts, gotoOpts, selectorOpts, productid, urlbase } =
30
- püppi.config
30
+ const { page, navOpts, gotoOpts, selectorOpts, productid, urlbase } = püppi.config;
31
31
 
32
32
  // strip markdown links from notes as not allowed to keep
33
33
  try {
34
34
  // navigate to product administration
35
- const url = `${urlbase}/product/${productid}/edit#versions`
36
- await page.goto(url, gotoOpts)
37
- debug('product page loaded at %s', url)
35
+ const url = `${urlbase}/product/${productid}/edit#versions`;
36
+ await page.goto(url, gotoOpts);
37
+ debug("product page loaded at %s", url);
38
38
  // open versions tab (instead of doing it via url)
39
39
  // let selector = '#nav-tabs li a[href="#versions"]';
40
40
  // await page.waitForSelector(selector, selectorOpts);
@@ -44,43 +44,43 @@ module.exports = async (pluginConfig, context) => {
44
44
  // xpath improvements / changes with v16.1.0
45
45
  // -> https://github.com/puppeteer/puppeteer/pull/8730
46
46
  // https://github.com/puppeteer/puppeteer/blob/d1681ec06b7c3db4b51c20b17b3339f852efbd4d/test/src/queryhandler.spec.ts
47
- let elements = []
47
+ let elements = [];
48
48
  do {
49
- const xpath = `xpath/.//td[contains(., "Version ${version}")]/following-sibling::td/a[contains(@class, "btn-styled-red")]`
50
- await page.waitForSelector(xpath, selectorOpts)
51
- debug('XPath found.')
52
- const nav = page.waitForNavigation(navOpts)
53
- elements = await page.$$(xpath)
49
+ const xpath = `xpath/.//td[contains(., "Version ${version}")]/following-sibling::td/a[contains(@class, "btn-styled-red")]`;
50
+ await page.waitForSelector(xpath, selectorOpts);
51
+ debug("XPath found.");
52
+ const nav = page.waitForNavigation(navOpts);
53
+ elements = await page.$$(xpath);
54
54
  if (elements.length) {
55
- debug('Delete Button - click.')
56
- await elements[0].hover()
57
- await elements[0].click()
58
- debug('Delete Button - clicked.')
59
- await nav
60
- debug('Navigation finished.')
55
+ debug("Delete Button - click.");
56
+ await elements[0].hover();
57
+ await elements[0].click();
58
+ debug("Delete Button - clicked.");
59
+ await nav;
60
+ debug("Navigation finished.");
61
61
  // confirm deletion
62
- const selector = 'button.btn-styled-red'
63
- await page.waitForSelector(selector, selectorOpts)
64
- debug('deletion confirmation button available')
65
- debug('click confirmation button')
66
- await page.clickAndNavigate(selector)
67
- debug('clicked confirmation button')
68
- await nav
69
- debug('WHMCS Marketplace deleting product version succeeded.')
62
+ const selector = "button.btn-styled-red";
63
+ await page.waitForSelector(selector, selectorOpts);
64
+ debug("deletion confirmation button available");
65
+ debug("click confirmation button");
66
+ await page.clickAndNavigate(selector);
67
+ debug("clicked confirmation button");
68
+ await nav;
69
+ debug("WHMCS Marketplace deleting product version succeeded.");
70
70
  }
71
- } while (elements.length)
71
+ } while (elements.length);
72
72
  } catch (error) {
73
73
  // while loop and having all versions deleted
74
74
  if (!/waiting for selector `.\/\//i.test(error.message)) {
75
- debug('Deleting product version failed.', error.message)
76
- await page.browser().close()
77
- return false
75
+ debug("Deleting product version failed.", error.message);
76
+ await page.browser().close();
77
+ return false;
78
78
  }
79
79
  }
80
80
 
81
- await page.browser().close()
81
+ await page.browser().close();
82
82
  return {
83
- name: 'WHMCS Marketplace Product Version',
84
- url: `${urlbase}/product/${productid}`
85
- }
86
- }
83
+ name: "WHMCS Marketplace Product Version",
84
+ url: `${urlbase}/product/${productid}`,
85
+ };
86
+ };
package/lib/get-error.js CHANGED
@@ -1,7 +1,7 @@
1
- const SemanticReleaseError = require('@semantic-release/error')
2
- const ERROR_DEFINITIONS = require('./definitions/errors.js')
1
+ import SemanticReleaseError from "@semantic-release/error";
2
+ import * as ERROR_DEFINITIONS from "./definitions/errors.js";
3
3
 
4
- module.exports = (code) => {
5
- const { message, details } = ERROR_DEFINITIONS[code]()
6
- return new SemanticReleaseError(message, code, details)
7
- }
4
+ export default (code) => {
5
+ const { message, details } = ERROR_DEFINITIONS[code]();
6
+ return new SemanticReleaseError(message, code, details);
7
+ };
@@ -1,6 +1,7 @@
1
- const debug = require('debug')('semantic-release:whmcs')
2
- const resolveConfig = require('./resolve-config')
3
- const GitHub = require('github-api')
1
+ import resolveConfig from "./resolve-config.js";
2
+ import GitHub from "github-api";
3
+ import debugConfig from "debug";
4
+ const debug = debugConfig("semantic-release:whmcs");
4
5
 
5
6
  // https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting
6
7
  // Rate limits to 60 requests/hour per IP for anonymous requests, 5000/hour with authentication
@@ -8,26 +9,24 @@ const GitHub = require('github-api')
8
9
  /**
9
10
  * A method to get releases from github repository
10
11
  */
11
- module.exports = async (pluginConfig, context) => {
12
- debug('Getting releases from GitHub')
12
+ export default async (pluginConfig, context) => {
13
+ debug("Getting releases from GitHub");
13
14
 
14
- const { ghrepo, ghtoken } = resolveConfig(context)
15
+ const { ghrepo, ghtoken } = resolveConfig(context);
15
16
 
16
17
  const gh = new GitHub({
17
- token: ghtoken
18
- })
18
+ token: ghtoken,
19
+ });
19
20
  if (ghrepo) {
20
21
  // optional by default false
21
- const repo = ghrepo.split('/')
22
- const githubReleases = await gh.getRepo(repo[0], repo[1]).listReleases()
22
+ const repo = ghrepo.split("/");
23
+ const githubReleases = await gh.getRepo(repo[0], repo[1]).listReleases();
23
24
  if (githubReleases.status === 200) {
24
- githubReleases.data.forEach((r) =>
25
- debug(`Detected GitHub release ${r.name.substring(1)}`)
26
- )
27
- githubReleases.data.reverse()
28
- return githubReleases.data
25
+ githubReleases.data.forEach((r) => debug(`Detected GitHub release ${r.name.substring(1)}`));
26
+ githubReleases.data.reverse();
27
+ return githubReleases.data;
29
28
  }
30
- debug('Failed to get releases from GitHub')
29
+ debug("Failed to get releases from GitHub");
31
30
  }
32
- return false
33
- }
31
+ return false;
32
+ };
package/lib/publish.js CHANGED
@@ -1,22 +1,21 @@
1
- const debug = require("debug")("semantic-release:whmcs");
2
- const puppet = require("./puppet");
3
- const setCompatibleVersions = require("./set-compatible-versions");
4
- const path = require("path");
1
+ import puppet from "./puppet.js";
2
+ import setCompatibleVersions from "./set-compatible-versions.js";
3
+ import debugConfig from "debug";
4
+ import { fileURLToPath } from "node:url";
5
+ const debug = debugConfig("semantic-release:whmcs");
6
+ const __filename = fileURLToPath(import.meta.url);
5
7
 
6
8
  /**
7
9
  * A method to publish the module update on whmcs market place
8
10
  */
9
- module.exports = async (pluginConfig, context) => {
11
+ export default async (pluginConfig, context) => {
10
12
  const sep = "+++++++++++++++++++++++++++++++++++++++++++++++++++";
11
- const out = `\n${sep}\n${path.basename(__filename)}\n${sep}\n`;
12
-
13
+ const out = `\n${sep}\n${__filename}\n${sep}\n`;
13
14
  const {
14
15
  nextRelease: { notes, version, releaseDate },
15
16
  } = context;
16
17
  if (!notes || !notes.length || !version || !version.length) {
17
- debug(
18
- `${out}Publishing new product version failed. No input data available.`
19
- );
18
+ debug(`${out}Publishing new product version failed. No input data available.`);
20
19
  return false;
21
20
  }
22
21
  // strip markdown links from notes as not allowed to keep (taken from remove-markdown and cleaned up)
@@ -76,9 +75,7 @@ module.exports = async (pluginConfig, context) => {
76
75
  );
77
76
  debug("form input for description finished.");
78
77
 
79
- await page.clickAndNavigate(
80
- 'div.listing-edit-container form button[type="submit"]'
81
- );
78
+ await page.clickAndNavigate('div.listing-edit-container form button[type="submit"]');
82
79
  await setCompatibleVersions(pluginConfig, context);
83
80
  } catch (error) {
84
81
  debug("Publishing new product version failed.", error.message);
package/lib/puppet.js CHANGED
@@ -1,113 +1,112 @@
1
- const puppeteer = require('puppeteer')
2
- const debug = require('debug')('semantic-release:whmcs')
3
- const resolveConfig = require('./resolve-config')
4
-
5
- module.exports = async (context) => {
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: 'https://marketplace.whmcs.com',
8
+ urlbase: "https://marketplace.whmcs.com",
8
9
  ...resolveConfig(context),
9
10
  // logger: logger,
10
11
  gotoOpts: {
11
- waitUntil: ['load', 'domcontentloaded'],
12
- timeout: 240000
12
+ waitUntil: ["load", "domcontentloaded"],
13
+ timeout: 240000,
13
14
  },
14
15
  navOpts: {
15
- waitUntil: ['networkidle0'],
16
- timeout: 240000
16
+ waitUntil: ["networkidle0"],
17
+ timeout: 240000,
17
18
  },
18
19
  selectorOpts: {
19
- timeout: 10000
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 === '1',
26
+ headless: cfg.headless === "1",
26
27
  defaultViewport: null, // automatically full-sized
27
28
  args: [
28
- '--disable-gpu',
29
- '--incognito',
30
- '--start-maximized',
31
- '--no-sandbox',
32
- '--disable-setuid-sandbox',
33
- '--disable-infobars',
34
- '--ignore-certifcate-errors',
35
- '--ignore-certifcate-errors-spki-list',
36
- '--ignoreHTTPSErrors=true'
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
- 'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8'
43
- })
43
+ "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8",
44
+ });
44
45
  await page.setUserAgent(
45
- 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
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('console', (msg) => {
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 } = this.config
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 } = this.config
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
- this.login = async () => {
72
- const { page, login, password, productid, gotoOpts, urlbase } = this.config
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('login form loaded at %s', `${urlbase}/user/login`)
78
- await page.enterAndType('#email', login)
79
- await page.enterAndType('#password', password)
80
- debug('WHMCS Marketplace credentials entered')
81
- await page.clickAndNavigate(selector)
82
- debug('WHMCS Marketplace login form submitted.')
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
- 'WHMCS Marketplace login failed or Product ID missing',
86
- error.message
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
- debug('WHMCS Marketplace login succeeded.')
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('No or invalid WHMCS Marketplace Product ID provided.')
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, '$&\u200E')
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
- this.config = {
106
+ config = {
108
107
  ...cfg,
109
- page
110
- }
108
+ page,
109
+ };
111
110
 
112
- return this
113
- }
111
+ return { config, login };
112
+ };
@@ -1,11 +1,10 @@
1
- module.exports = ({ env }) => ({
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 || '7.10',
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 || '1',
9
- debug:
10
- (env.DEBUG && /^semantic-release:(\*|whmcs)$/.test(env.DEBUG)) || false
11
- })
8
+ headless: env.PUPPETEER_HEADLESS || "1",
9
+ debug: (env.DEBUG && /^semantic-release:(\*|whmcs)$/.test(env.DEBUG)) || false,
10
+ });
@@ -1,45 +1,47 @@
1
- const debug = require('debug')('semantic-release:whmcs')
2
- const puppet = require('./puppet')
3
- const path = require('path')
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
- module.exports = async (pluginConfig, context) => {
9
- const sep = '+++++++++++++++++++++++++++++++++++++++++++++++++++'
10
- const out = `\n${sep}\n${path.basename(__filename)}\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 = 'div#versions tr strong'
26
- await page.waitForSelector(selector, selectorOpts)
27
- debug('product version table found')
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('Publishing new product version failed.', error.message)
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('Publishing new product version succeeded.')
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
- const debug = require('debug')('semantic-release:whmcs')
2
- const puppet = require('./puppet')
3
- const path = require('path')
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
- module.exports = async (pluginConfig, context) => {
9
- const sep = '+++++++++++++++++++++++++++++++++++++++++++++++++++'
10
- const out = `\n${sep}\n${path.basename(__filename)}\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('product page loaded at %s', url)
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('compatibility version table found')
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, '$&\u200E')
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('-')[0].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('Updating whmcs compatibility list failed.', error.message)
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('Updating whmcs compatibility list succeeded.')
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
+ };