@iobroker/js-controller-cli 7.0.3 → 7.0.4-alpha.1-20241120-1e3f92f91

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.
@@ -1,18 +1,27 @@
1
1
  import type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';
2
2
  import type { Client as StatesRedisClient } from '@iobroker/db-states-redis';
3
+ /** The options passed to the Repo constructor */
3
4
  export interface CLIRepoOptions {
5
+ /** Instance of objects DB */
4
6
  objects: ObjectsRedisClient;
7
+ /** Instance of states DB */
5
8
  states: StatesRedisClient;
6
9
  }
10
+ /**
11
+ * All possible Repo Flags which can be passed to the `show` method
12
+ */
7
13
  export interface RepoFlags {
8
14
  /** Also list not installed adapters */
9
15
  a?: boolean;
16
+ /** Also list not installed adapters */
10
17
  all?: boolean;
11
18
  /** Only list updatable adapters */
12
19
  u?: boolean;
20
+ /** Only list updatable adapters */
13
21
  updatable?: boolean;
14
22
  /** Force update even if hash hasn't changed */
15
23
  f?: boolean;
24
+ /** Force update even if hash hasn't changed */
16
25
  force?: boolean;
17
26
  }
18
27
  export declare class Repo {
@@ -21,13 +30,20 @@ export declare class Repo {
21
30
  private readonly states;
22
31
  private readonly controllerVersion;
23
32
  constructor(options: CLIRepoOptions);
33
+ /**
34
+ * Get the repository name by index
35
+ * Throws if the index does not exist
36
+ *
37
+ * @param repoIndex repo name or index
38
+ */
39
+ getNameByIndex(repoIndex: number): Promise<string>;
24
40
  /**
25
41
  * Update the given repository and returns new repo content
26
42
  *
27
43
  * @param repoName name of the repository
28
44
  * @param force force update even if same hash
29
- * @param systemConfig content of system.config object
30
- * @param systemRepos content of system.repositories object
45
+ * @param systemConfig content of `system.config` object
46
+ * @param systemRepos content of `system.repositories` object
31
47
  */
32
48
  private updateRepo;
33
49
  /**
@@ -40,7 +56,7 @@ export declare class Repo {
40
56
  /**
41
57
  * Show the repo result on CLI
42
58
  *
43
- * @param sources Repo json sources
59
+ * @param sources Repo JSON sources
44
60
  * @param flags CLI flags
45
61
  */
46
62
  private showRepoResult;
@@ -51,7 +67,7 @@ export declare class Repo {
51
67
  */
52
68
  private updateInfo;
53
69
  /**
54
- * Show current status of Repo on CLI
70
+ * Show the current status of Repo on CLI
55
71
  */
56
72
  showRepoStatus(): Promise<number>;
57
73
  /**
@@ -67,10 +83,16 @@ export declare class Repo {
67
83
  * @param repoName name of repository to remove
68
84
  */
69
85
  del(repoName: string): Promise<void>;
86
+ /**
87
+ * Checks if stable repo is active
88
+ *
89
+ * @param options the system config object and the repository object
90
+ */
91
+ private getRepoActiveInfo;
70
92
  /**
71
93
  * Set specific repo as active one
72
94
  *
73
- * @param repoName name of the respository to activate
95
+ * @param repoName name of the repository to activate
74
96
  */
75
97
  setActive(repoName: string): Promise<void>;
76
98
  /**
@@ -80,7 +102,7 @@ export declare class Repo {
80
102
  */
81
103
  setInactive(repoName: string): Promise<void>;
82
104
  /**
83
- * Renames existing repository if old name and link matches, renaming will not be performed if an repo with the new name already exists
105
+ * Renames existing repository if old name and link matches, renaming will not be performed if a repo with the new name already exists
84
106
  *
85
107
  * @param oldName - name of the current repository
86
108
  * @param newName - target name
@@ -36,6 +36,7 @@ var import_axios = __toESM(require("axios"), 1);
36
36
  var import_fs_extra = __toESM(require("fs-extra"), 1);
37
37
  var import_utils = require("../../lib/setup/utils.js");
38
38
  var import_node_path = __toESM(require("node:path"), 1);
39
+ var import_constants = require("@iobroker/js-controller-common-db/constants");
39
40
  class Repo {
40
41
  defaultSystemRepo;
41
42
  objects;
@@ -60,35 +61,52 @@ class Repo {
60
61
  native: {
61
62
  repositories: {
62
63
  stable: {
63
- link: "http://download.iobroker.net/sources-dist.json",
64
+ link: import_utils.STABLE_REPO_URL,
64
65
  json: null
65
66
  },
66
67
  beta: {
67
- link: "http://download.iobroker.net/sources-dist-latest.json",
68
+ link: import_utils.BETA_REPO_URL,
68
69
  json: null
69
70
  }
70
71
  }
71
72
  },
72
- _id: "system.repositories",
73
+ _id: import_constants.SYSTEM_REPOSITORIES_ID,
73
74
  type: "config"
74
75
  };
75
76
  }
77
+ /**
78
+ * Get the repository name by index
79
+ * Throws if the index does not exist
80
+ *
81
+ * @param repoIndex repo name or index
82
+ */
83
+ async getNameByIndex(repoIndex) {
84
+ const obj = await this.objects.getObject(import_constants.SYSTEM_REPOSITORIES_ID);
85
+ if (!obj?.native?.repositories) {
86
+ throw new Error("No repositories setup!");
87
+ }
88
+ const repoNames = Object.keys(obj.native.repositories);
89
+ if (!repoNames[repoIndex]) {
90
+ throw new Error(`No repository for index "${repoIndex}" found`);
91
+ }
92
+ return repoNames[repoIndex];
93
+ }
76
94
  /**
77
95
  * Update the given repository and returns new repo content
78
96
  *
79
97
  * @param repoName name of the repository
80
98
  * @param force force update even if same hash
81
- * @param systemConfig content of system.config object
82
- * @param systemRepos content of system.repositories object
99
+ * @param systemConfig content of `system.config` object
100
+ * @param systemRepos content of `system.repositories` object
83
101
  */
84
102
  async updateRepo(repoName, force, systemConfig, systemRepos) {
85
103
  if (!repoName) {
86
- const sysConfig = systemConfig || await this.objects.getObject("system.config");
104
+ const sysConfig = systemConfig || await this.objects.getObject(import_constants.SYSTEM_CONFIG_ID);
87
105
  repoName = sysConfig.common.activeRepo;
88
106
  }
89
- const oldRepos = systemRepos || await this.objects.getObject("system.repositories");
107
+ const oldRepos = systemRepos || await this.objects.getObject(import_constants.SYSTEM_REPOSITORIES_ID);
90
108
  if (!oldRepos?.native.repositories?.[repoName]) {
91
- console.log(`Error: repository "${repoName}" not found in the "system.repositories`);
109
+ console.log(`Error: repository "${repoName}" not found in the "${import_constants.SYSTEM_REPOSITORIES_ID}"`);
92
110
  return null;
93
111
  }
94
112
  const urlOrPath = oldRepos.native.repositories[repoName].link;
@@ -152,7 +170,7 @@ class Repo {
152
170
  if (changed) {
153
171
  oldRepos.from = `system.host.${import_js_controller_common.tools.getHostName()}.cli`;
154
172
  oldRepos.ts = Date.now();
155
- await this.objects.setObject("system.repositories", oldRepos);
173
+ await this.objects.setObject(import_constants.SYSTEM_REPOSITORIES_ID, oldRepos);
156
174
  }
157
175
  return oldRepos.native.repositories[repoName].json;
158
176
  }
@@ -163,14 +181,14 @@ class Repo {
163
181
  * @param flags CLI flags
164
182
  */
165
183
  async showRepo(repoUrl, flags) {
166
- const systemConfig = await this.objects.getObject("system.config");
167
- const systemRepos = await this.objects.getObject("system.repositories");
184
+ const systemConfig = await this.objects.getObject(import_constants.SYSTEM_CONFIG_ID);
185
+ const systemRepos = await this.objects.getObject(import_constants.SYSTEM_REPOSITORIES_ID);
168
186
  if (!systemConfig) {
169
- console.error('Error: Object "system.config" not found');
187
+ console.error(`Error: Object "${import_constants.SYSTEM_CONFIG_ID}" not found`);
170
188
  } else if (!systemRepos) {
171
- console.error('Error: Object "system.repositories" not found');
189
+ console.error(`Error: Object "${import_constants.SYSTEM_REPOSITORIES_ID}" not found`);
172
190
  } else if (!systemRepos.native || !systemRepos.native.repositories) {
173
- console.error('Error: no repositories found in the "system.config');
191
+ console.error(`Error: no repositories found in the "${import_constants.SYSTEM_REPOSITORIES_ID}"`);
174
192
  } else {
175
193
  repoUrl = repoUrl || systemConfig.common.activeRepo;
176
194
  if (!Array.isArray(repoUrl)) {
@@ -204,7 +222,7 @@ class Repo {
204
222
  /**
205
223
  * Show the repo result on CLI
206
224
  *
207
- * @param sources Repo json sources
225
+ * @param sources Repo JSON sources
208
226
  * @param flags CLI flags
209
227
  */
210
228
  async showRepoResult(sources, flags) {
@@ -280,12 +298,12 @@ class Repo {
280
298
  }
281
299
  }
282
300
  /**
283
- * Show current status of Repo on CLI
301
+ * Show the current status of Repo on CLI
284
302
  */
285
303
  async showRepoStatus() {
286
304
  try {
287
- const obj = await this.objects.getObject("system.repositories");
288
- const objCfg = await this.objects.getObject("system.config");
305
+ const obj = await this.objects.getObject(import_constants.SYSTEM_REPOSITORIES_ID);
306
+ const objCfg = await this.objects.getObject(import_constants.SYSTEM_CONFIG_ID);
289
307
  if (!obj) {
290
308
  console.error("List is empty");
291
309
  return import_js_controller_common.EXIT_CODES.CANNOT_GET_REPO_LIST;
@@ -322,18 +340,21 @@ Active repo(s): ${activeRepo.join(", ")}`);
322
340
  * @param repoUrl url of new repo
323
341
  */
324
342
  async add(repoName, repoUrl) {
325
- const sysRepoObj = await this.objects.getObjectAsync("system.repositories");
343
+ const sysRepoObj = await this.objects.getObject(import_constants.SYSTEM_REPOSITORIES_ID);
326
344
  const obj = sysRepoObj || this.defaultSystemRepo;
327
345
  if (obj.native.repositories[repoName]) {
328
346
  throw new Error(`Repository "${repoName}" yet exists: ${obj.native.repositories[repoName].link}`);
329
347
  } else {
348
+ if ((0, import_utils.isIntegerLikeInput)(repoName)) {
349
+ throw new Error(`Invalid name "${repoName}"! A repository name is not allowed to contain only numbers.`);
350
+ }
330
351
  obj.native.repositories[repoName] = {
331
352
  link: repoUrl,
332
353
  json: null
333
354
  };
334
355
  obj.from = `system.host.${import_js_controller_common.tools.getHostName()}.cli`;
335
356
  obj.ts = Date.now();
336
- await this.objects.setObjectAsync("system.repositories", obj);
357
+ await this.objects.setObject(import_constants.SYSTEM_REPOSITORIES_ID, obj);
337
358
  }
338
359
  }
339
360
  /**
@@ -342,11 +363,11 @@ Active repo(s): ${activeRepo.join(", ")}`);
342
363
  * @param repoName name of repository to remove
343
364
  */
344
365
  async del(repoName) {
345
- const obj = await this.objects.getObjectAsync("system.config");
366
+ const obj = await this.objects.getObject(import_constants.SYSTEM_CONFIG_ID);
346
367
  if (obj?.common.activeRepo && typeof obj.common.activeRepo === "string" && obj.common.activeRepo === repoName || obj?.common.activeRepo && Array.isArray(obj.common.activeRepo) && obj.common.activeRepo.includes(repoName)) {
347
368
  throw new Error(`Cannot delete active repository: ${repoName}`);
348
369
  } else {
349
- const repoObj = await this.objects.getObjectAsync("system.repositories");
370
+ const repoObj = await this.objects.getObject(import_constants.SYSTEM_REPOSITORIES_ID);
350
371
  if (repoObj) {
351
372
  if (!repoObj.native.repositories[repoName]) {
352
373
  throw new Error(`Repository "${repoName}" not found.`);
@@ -354,33 +375,65 @@ Active repo(s): ${activeRepo.join(", ")}`);
354
375
  delete repoObj.native.repositories[repoName];
355
376
  repoObj.from = `system.host.${import_js_controller_common.tools.getHostName()}.cli`;
356
377
  repoObj.ts = Date.now();
357
- await this.objects.setObject("system.repositories", repoObj);
378
+ await this.objects.setObject(import_constants.SYSTEM_REPOSITORIES_ID, repoObj);
358
379
  }
359
380
  }
360
381
  }
361
382
  }
383
+ /**
384
+ * Checks if stable repo is active
385
+ *
386
+ * @param options the system config object and the repository object
387
+ */
388
+ getRepoActiveInfo(options) {
389
+ const { repoObj, sysConfObj, url } = options;
390
+ const name = sysConfObj.common.activeRepo.find((activeRepo) => repoObj.native.repositories[activeRepo].link === url);
391
+ return name ? { isActive: true, name } : { isActive: false };
392
+ }
362
393
  /**
363
394
  * Set specific repo as active one
364
395
  *
365
- * @param repoName name of the respository to activate
396
+ * @param repoName name of the repository to activate
366
397
  */
367
398
  async setActive(repoName) {
368
- const sysRepoObj = await this.objects.getObjectAsync("system.repositories");
399
+ const sysRepoObj = await this.objects.getObject(import_constants.SYSTEM_REPOSITORIES_ID);
369
400
  const obj = sysRepoObj || this.defaultSystemRepo;
370
401
  if (!obj.native.repositories[repoName]) {
371
402
  throw new Error(`Repository "${repoName}" not found.`);
372
- } else {
373
- const confObj = await this.objects.getObjectAsync("system.config");
374
- if (typeof confObj?.common.activeRepo === "string") {
375
- confObj.common.activeRepo = [confObj.common.activeRepo];
376
- }
377
- if (confObj && !confObj.common.activeRepo.includes(repoName)) {
378
- confObj.common.activeRepo.push(repoName);
379
- confObj.from = `system.host.${import_js_controller_common.tools.getHostName()}.cli`;
380
- confObj.ts = Date.now();
381
- await this.objects.setObjectAsync("system.config", confObj);
403
+ }
404
+ const confObj = await this.objects.getObject(import_constants.SYSTEM_CONFIG_ID);
405
+ if (typeof confObj?.common.activeRepo === "string") {
406
+ confObj.common.activeRepo = [confObj.common.activeRepo];
407
+ }
408
+ if (!confObj || confObj.common.activeRepo.includes(repoName)) {
409
+ return;
410
+ }
411
+ confObj.common.activeRepo.push(repoName);
412
+ const stableInfo = this.getRepoActiveInfo({
413
+ url: import_utils.STABLE_REPO_URL,
414
+ sysConfObj: confObj,
415
+ repoObj: obj
416
+ });
417
+ const betaInfo = this.getRepoActiveInfo({
418
+ url: import_utils.BETA_REPO_URL,
419
+ sysConfObj: confObj,
420
+ repoObj: obj
421
+ });
422
+ if (stableInfo.isActive && betaInfo.isActive) {
423
+ const posStable = confObj.common.activeRepo.indexOf(stableInfo.name);
424
+ const posBeta = confObj.common.activeRepo.indexOf(betaInfo.name);
425
+ if (posStable < posBeta) {
426
+ confObj.common.activeRepo.splice(posBeta, 1);
427
+ confObj.common.activeRepo.splice(posStable, 0, betaInfo.name);
428
+ console.info(`Ensured that stable repository "${stableInfo.name}" has priority over beta repository "${betaInfo.name}"`);
382
429
  }
383
430
  }
431
+ if (confObj.common.activeRepo.length > 1) {
432
+ console.info("More than one repository is active. Please be sure, that this is a desired constellation!");
433
+ }
434
+ confObj.from = `system.host.${import_js_controller_common.tools.getHostName()}.cli`;
435
+ confObj.ts = Date.now();
436
+ await this.objects.setObject(import_constants.SYSTEM_CONFIG_ID, confObj);
384
437
  }
385
438
  /**
386
439
  * Set given repo as inactive
@@ -388,7 +441,7 @@ Active repo(s): ${activeRepo.join(", ")}`);
388
441
  * @param repoName name of the repository
389
442
  */
390
443
  async setInactive(repoName) {
391
- const confObj = await this.objects.getObjectAsync("system.config");
444
+ const confObj = await this.objects.getObject(import_constants.SYSTEM_CONFIG_ID);
392
445
  if (typeof confObj?.common.activeRepo === "string") {
393
446
  confObj.common.activeRepo = [confObj.common.activeRepo];
394
447
  }
@@ -397,11 +450,11 @@ Active repo(s): ${activeRepo.join(", ")}`);
397
450
  confObj.common.activeRepo.splice(pos, 1);
398
451
  confObj.from = `system.host.${import_js_controller_common.tools.getHostName()}.cli`;
399
452
  confObj.ts = Date.now();
400
- await this.objects.setObjectAsync("system.config", confObj);
453
+ await this.objects.setObject(import_constants.SYSTEM_CONFIG_ID, confObj);
401
454
  }
402
455
  }
403
456
  /**
404
- * Renames existing repository if old name and link matches, renaming will not be performed if an repo with the new name already exists
457
+ * Renames existing repository if old name and link matches, renaming will not be performed if a repo with the new name already exists
405
458
  *
406
459
  * @param oldName - name of the current repository
407
460
  * @param newName - target name
@@ -411,32 +464,36 @@ Active repo(s): ${activeRepo.join(", ")}`);
411
464
  let repoObj;
412
465
  let sysConfigObj;
413
466
  try {
414
- sysConfigObj = await this.objects.getObjectAsync("system.config");
415
- repoObj = await this.objects.getObjectAsync("system.repositories");
467
+ sysConfigObj = await this.objects.getObject(import_constants.SYSTEM_CONFIG_ID);
468
+ repoObj = await this.objects.getObject(import_constants.SYSTEM_REPOSITORIES_ID);
416
469
  } catch (err) {
417
470
  throw new Error(`Could not rename repository "${oldName}" to "${newName}": ${err.message}`);
418
471
  }
419
- if (repoObj && repoObj.native && repoObj.native.repositories) {
420
- if (repoObj.native.repositories[oldName] && repoObj.native.repositories[oldName].link === repoUrl && !repoObj.native.repositories[newName]) {
421
- repoObj.native.repositories[newName] = repoObj.native.repositories[oldName];
422
- delete repoObj.native.repositories[oldName];
423
- try {
424
- await this.objects.setObjectAsync("system.repositories", repoObj);
425
- console.log(`Renamed repository "${oldName} to "${newName}"`);
426
- } catch (err) {
427
- throw new Error(`Could not rename repository "${oldName}" to "${newName}": ${err.message}`);
472
+ if ((0, import_utils.isIntegerLikeInput)(newName)) {
473
+ throw new Error(`Invalid name "${newName}"! A repository name is not allowed to contain only numbers.`);
474
+ }
475
+ if (!repoObj) {
476
+ return;
477
+ }
478
+ if (repoObj.native.repositories[oldName] && repoObj.native.repositories[oldName].link === repoUrl && !repoObj.native.repositories[newName]) {
479
+ repoObj.native.repositories[newName] = repoObj.native.repositories[oldName];
480
+ delete repoObj.native.repositories[oldName];
481
+ try {
482
+ await this.objects.setObject(import_constants.SYSTEM_REPOSITORIES_ID, repoObj);
483
+ console.log(`Renamed repository "${oldName} to "${newName}"`);
484
+ } catch (e) {
485
+ throw new Error(`Could not rename repository "${oldName}" to "${newName}": ${e.message}`);
486
+ }
487
+ if (sysConfigObj?.common && (typeof sysConfigObj.common.activeRepo === "string" && sysConfigObj.common.activeRepo === oldName || Array.isArray(sysConfigObj.common.activeRepo) && sysConfigObj.common.activeRepo.includes(oldName))) {
488
+ if (typeof sysConfigObj.common.activeRepo === "string") {
489
+ sysConfigObj.common.activeRepo = [sysConfigObj.common.activeRepo];
428
490
  }
429
- if (sysConfigObj && sysConfigObj.common && (typeof sysConfigObj.common.activeRepo === "string" && sysConfigObj.common.activeRepo === oldName || Array.isArray(sysConfigObj.common.activeRepo) && sysConfigObj.common.activeRepo.includes(oldName))) {
430
- if (typeof sysConfigObj.common.activeRepo === "string") {
431
- sysConfigObj.common.activeRepo = [sysConfigObj.common.activeRepo];
432
- }
433
- const pos = sysConfigObj.common.activeRepo.indexOf(oldName);
434
- sysConfigObj.common.activeRepo.splice(pos, 1, newName);
435
- try {
436
- await this.objects.setObjectAsync("system.config", sysConfigObj);
437
- } catch (err) {
438
- throw new Error(`Could not set "${newName}" as active repository: ${err.message}`);
439
- }
491
+ const pos = sysConfigObj.common.activeRepo.indexOf(oldName);
492
+ sysConfigObj.common.activeRepo.splice(pos, 1, newName);
493
+ try {
494
+ await this.objects.setObject(import_constants.SYSTEM_CONFIG_ID, sysConfigObj);
495
+ } catch (e) {
496
+ throw new Error(`Could not set "${newName}" as active repository: ${e.message}`);
440
497
  }
441
498
  }
442
499
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/setup/setupRepo.ts"],
4
- "sourcesContent": ["import { tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport axios from 'axios';\nimport fs from 'fs-extra';\nimport type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';\nimport type { Client as StatesRedisClient } from '@iobroker/db-states-redis';\nimport { isVersionIgnored } from '@/lib/setup/utils.js';\nimport path from 'node:path';\n\nexport interface CLIRepoOptions {\n objects: ObjectsRedisClient;\n states: StatesRedisClient;\n}\n\nexport interface RepoFlags {\n /** Also list not installed adapters */\n a?: boolean;\n all?: boolean;\n /** Only list updatable adapters */\n u?: boolean;\n updatable?: boolean;\n /** Force update even if hash hasn't changed */\n f?: boolean;\n force?: boolean;\n}\n\nexport class Repo {\n private readonly defaultSystemRepo: ioBroker.RepositoryObject;\n private readonly objects: ObjectsRedisClient;\n private readonly states: StatesRedisClient;\n private readonly controllerVersion: string;\n\n constructor(options: CLIRepoOptions) {\n if (!options?.objects) {\n throw new Error('Invalid arguments: objects is missing');\n }\n if (!options?.states) {\n throw new Error('Invalid arguments: states is missing');\n }\n\n const ioPackage = fs.readJSONSync(path.join(tools.getControllerDir(), 'io-package.json'));\n this.controllerVersion = ioPackage.common.version;\n\n this.objects = options.objects;\n this.states = options.states;\n\n this.defaultSystemRepo = {\n common: {\n name: 'System repositories',\n dontDelete: true,\n },\n native: {\n repositories: {\n stable: {\n link: 'http://download.iobroker.net/sources-dist.json',\n json: null,\n },\n beta: {\n link: 'http://download.iobroker.net/sources-dist-latest.json',\n json: null,\n },\n },\n },\n _id: 'system.repositories',\n type: 'config',\n };\n }\n\n /**\n * Update the given repository and returns new repo content\n *\n * @param repoName name of the repository\n * @param force force update even if same hash\n * @param systemConfig content of system.config object\n * @param systemRepos content of system.repositories object\n */\n private async updateRepo(\n repoName: string,\n force: boolean | undefined,\n systemConfig?: ioBroker.OtherObject,\n systemRepos?: ioBroker.RepositoryObject,\n ): Promise<null | ioBroker.RepositoryJson> {\n if (!repoName) {\n const sysConfig = systemConfig || (await this.objects.getObject('system.config'));\n repoName = sysConfig!.common.activeRepo;\n }\n\n const oldRepos = systemRepos || (await this.objects.getObject('system.repositories'));\n if (!oldRepos?.native.repositories?.[repoName]) {\n console.log(`Error: repository \"${repoName}\" not found in the \"system.repositories`);\n return null;\n }\n\n const urlOrPath = oldRepos.native.repositories[repoName].link;\n const hashUrl = urlOrPath.replace(/\\.json$/, '-hash.json');\n let hash;\n\n if (\n !force &&\n oldRepos.native.repositories[repoName].hash &&\n oldRepos.native.repositories[repoName].json &&\n (urlOrPath.startsWith('http://') || urlOrPath.startsWith('https://'))\n ) {\n try {\n hash = await axios({ url: hashUrl, timeout: 10_000 });\n } catch (e) {\n console.error(`Cannot download repository hash file from \"${hashUrl}\": ${e.message}`);\n }\n if (hash?.data && oldRepos.native.repositories[repoName].hash === hash.data.hash) {\n return oldRepos.native.repositories[repoName].json;\n }\n }\n\n let data;\n\n if (urlOrPath.startsWith('http://') || urlOrPath.startsWith('https://')) {\n if (!hash) {\n try {\n hash = await axios({ url: hashUrl, timeout: 10000 });\n } catch (e) {\n console.error(`Cannot download repository hash file from \"${hashUrl}\": ${e.message}`);\n }\n }\n\n const agent = `${tools.appName}, RND: CLI, Node:${process.version}, V:${this.controllerVersion}`;\n try {\n data = await axios({\n url: urlOrPath,\n timeout: 10_000,\n headers: { 'User-Agent': agent },\n });\n if (data.data) {\n data = data.data;\n } else {\n data = null;\n }\n } catch (e) {\n console.error(`Cannot download repository file from \"${urlOrPath}\": ${e.message}`);\n data = null;\n }\n } else {\n if (fs.existsSync(urlOrPath)) {\n try {\n data = JSON.parse(fs.readFileSync(urlOrPath).toString('utf8'));\n } catch (err) {\n console.error(`Error: Cannot read or parse file \"${urlOrPath}\": ${err.message}`);\n }\n } else {\n console.error(`Error: Cannot find file \"${urlOrPath}\"`);\n }\n }\n\n let changed;\n if (data) {\n oldRepos.native.repositories[repoName].json = data;\n changed = true;\n }\n if (hash?.data) {\n oldRepos.native.repositories[repoName].hash = hash.data.hash;\n changed = true;\n }\n if (changed) {\n oldRepos.from = `system.host.${tools.getHostName()}.cli`;\n oldRepos.ts = Date.now();\n await this.objects.setObject('system.repositories', oldRepos);\n }\n\n return oldRepos.native.repositories[repoName].json;\n }\n\n /**\n * Show repo on CLI\n *\n * @param repoUrl url of the repository\n * @param flags CLI flags\n */\n async showRepo(repoUrl: string | string[], flags: RepoFlags): Promise<void> {\n // Get the repositories\n const systemConfig = await this.objects.getObject('system.config');\n const systemRepos = await this.objects.getObject('system.repositories');\n if (!systemConfig) {\n console.error('Error: Object \"system.config\" not found');\n } else if (!systemRepos) {\n console.error('Error: Object \"system.repositories\" not found');\n } else if (!systemRepos.native || !systemRepos.native.repositories) {\n console.error('Error: no repositories found in the \"system.config');\n } else {\n repoUrl = repoUrl || systemConfig.common.activeRepo;\n\n if (!Array.isArray(repoUrl)) {\n repoUrl = [repoUrl];\n }\n\n console.log(`Used ${repoUrl.length > 1 ? 'repositories' : 'repository'}: ${repoUrl.join(', ')}`);\n\n const allSources = {};\n\n for (const url of repoUrl) {\n const repo = systemRepos.native.repositories[url];\n // If known repository\n if (repo) {\n if (typeof repo === 'string') {\n systemRepos.native.repositories[url] = {\n link: repo,\n json: null,\n hash: '',\n };\n }\n\n const sources = await this.updateRepo(url, flags.force || flags.f, systemConfig, systemRepos);\n sources && Object.assign(allSources, sources);\n } else {\n console.error(\n `Error: unknown repository is active - \"${url}\". Known: ${Object.keys(\n systemRepos.native.repositories,\n ).join(', ')}`,\n );\n }\n }\n\n try {\n // update variables of every admin instance\n await this.updateInfo(allSources);\n } catch {\n // not important if fails\n }\n\n return this.showRepoResult(allSources, flags);\n }\n }\n\n /**\n * Show the repo result on CLI\n *\n * @param sources Repo json sources\n * @param flags CLI flags\n */\n private async showRepoResult(sources: Record<string, any>, flags: RepoFlags): Promise<void> {\n const installed = tools.getInstalledInfo();\n const adapters = Object.keys(sources).sort();\n\n for (const name of adapters) {\n let updatable = false;\n let text = sources[name].controller ? 'Controller ' : 'Adapter ';\n text += `\"${name}\"`;\n text = text.padEnd(11 + 15);\n\n if (sources[name].version) {\n text += `: ${sources[name].version}`;\n }\n text = text.padEnd(11 + 15 + 11);\n\n if (!(flags.all || flags.a) && !installed[name]) {\n continue;\n }\n\n if (installed[name]?.version) {\n text += `, installed ${installed[name].version}`;\n try {\n // tools.upToDate can throw if version is invalid\n if (\n sources[name].version !== installed[name].version &&\n sources[name].version &&\n !tools.upToDate(sources[name].version, installed[name].version)\n ) {\n updatable = true;\n text = text.padEnd(11 + 15 + 11 + 18);\n const isIgnored = await isVersionIgnored({\n adapterName: name,\n objects: this.objects,\n version: sources[name].version,\n });\n\n text += isIgnored ? ' [Ignored]' : ' [Updatable]';\n }\n } catch (e) {\n console.error(`Cannot determine update info of \"${name}\": ${e.message}`);\n }\n }\n if ((flags.updatable || flags.u) && !updatable) {\n continue;\n }\n console.log(text);\n }\n }\n\n /**\n * Update Admin info states with number of updates\n *\n * @param sources the repository object\n */\n private async updateInfo(sources: Record<string, any>): Promise<void> {\n const installed = tools.getInstalledInfo();\n const list: string[] = [];\n\n for (const name of Object.keys(sources)) {\n if (installed[name] && installed[name].version && sources[name].version) {\n try {\n // tools.upToDate can throw if version is invalid\n if (\n sources[name].version !== installed[name].version &&\n !tools.upToDate(sources[name].version, installed[name].version)\n ) {\n // remove first part of the name\n const n = name.indexOf('.');\n list.push(n === -1 ? name : name.substring(n + 1));\n }\n } catch (e) {\n console.error(`Cannot determine update info of \"${name}\": ${e.message}`);\n }\n }\n }\n\n const objs = await this.objects.getObjectViewAsync('system', 'instance', {\n startkey: 'system.adapter.admin',\n endkey: 'system.adapter.admin\\u9999',\n });\n\n if (objs?.rows?.length) {\n const listStr = list.join(', ');\n for (const row of objs.rows) {\n if (row?.value?.type === 'instance') {\n await this.states.setState(`${row.id}.info.updatesNumber`, { val: list.length, ack: true });\n await this.states.setState(`${row.id}.info.updatesList`, { val: listStr, ack: true });\n }\n }\n }\n }\n\n /**\n * Show current status of Repo on CLI\n */\n async showRepoStatus(): Promise<number> {\n try {\n const obj = await this.objects.getObject('system.repositories');\n const objCfg = await this.objects.getObject('system.config');\n\n if (!obj) {\n console.error('List is empty');\n return EXIT_CODES.CANNOT_GET_REPO_LIST;\n } else if (obj.native.repositories) {\n console.table(\n Object.entries(obj.native.repositories).map(([key, value]) => {\n return {\n name: key,\n url: value.link,\n 'auto upgrade': objCfg?.common.adapterAutoUpgrade?.repositories[key] ?? false,\n };\n }),\n );\n\n if (objCfg?.common) {\n let activeRepo = objCfg.common.activeRepo;\n if (typeof activeRepo === 'string') {\n activeRepo = [activeRepo];\n }\n console.log(`\\nActive repo(s): ${activeRepo.join(', ')}`);\n console.log(`Upgrade policy: ${objCfg.common.adapterAutoUpgrade?.defaultPolicy ?? 'none'}`);\n }\n } else {\n console.error('List is empty');\n return EXIT_CODES.CANNOT_GET_REPO_LIST;\n }\n } catch (err) {\n console.error(`Cannot get list: ${err}`);\n }\n return EXIT_CODES.CANNOT_GET_REPO_LIST;\n }\n\n /**\n * Add new repo\n *\n * @param repoName name of new repo\n * @param repoUrl url of new repo\n */\n async add(repoName: string, repoUrl: string): Promise<void> {\n const sysRepoObj = await this.objects.getObjectAsync('system.repositories');\n const obj = sysRepoObj || this.defaultSystemRepo;\n\n if (obj.native.repositories[repoName]) {\n throw new Error(`Repository \"${repoName}\" yet exists: ${obj.native.repositories[repoName].link}`);\n } else {\n obj.native.repositories[repoName] = {\n link: repoUrl,\n json: null,\n };\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n await this.objects.setObjectAsync('system.repositories', obj);\n }\n }\n\n /**\n * Remove repository from sources\n *\n * @param repoName name of repository to remove\n */\n async del(repoName: string): Promise<void> {\n const obj = await this.objects.getObjectAsync('system.config');\n if (\n (obj?.common.activeRepo &&\n typeof obj.common.activeRepo === 'string' &&\n obj.common.activeRepo === repoName) ||\n (obj?.common.activeRepo && Array.isArray(obj.common.activeRepo) && obj.common.activeRepo.includes(repoName))\n ) {\n throw new Error(`Cannot delete active repository: ${repoName}`);\n } else {\n const repoObj = await this.objects.getObjectAsync('system.repositories');\n if (repoObj) {\n if (!repoObj.native.repositories[repoName]) {\n throw new Error(`Repository \"${repoName}\" not found.`);\n } else {\n delete repoObj.native.repositories[repoName];\n repoObj.from = `system.host.${tools.getHostName()}.cli`;\n repoObj.ts = Date.now();\n await this.objects.setObject('system.repositories', repoObj);\n }\n }\n }\n }\n\n /**\n * Set specific repo as active one\n *\n * @param repoName name of the respository to activate\n */\n async setActive(repoName: string): Promise<void> {\n const sysRepoObj = await this.objects.getObjectAsync('system.repositories');\n const obj = sysRepoObj || this.defaultSystemRepo;\n\n if (!obj.native.repositories[repoName]) {\n throw new Error(`Repository \"${repoName}\" not found.`);\n } else {\n const confObj = await this.objects.getObjectAsync('system.config');\n if (typeof confObj?.common.activeRepo === 'string') {\n confObj.common.activeRepo = [confObj.common.activeRepo];\n }\n\n if (confObj && !confObj.common.activeRepo.includes(repoName)) {\n confObj.common.activeRepo.push(repoName);\n confObj.from = `system.host.${tools.getHostName()}.cli`;\n confObj.ts = Date.now();\n await this.objects.setObjectAsync('system.config', confObj);\n }\n }\n }\n\n /**\n * Set given repo as inactive\n *\n * @param repoName name of the repository\n */\n async setInactive(repoName: string): Promise<void> {\n const confObj = (await this.objects.getObjectAsync('system.config'))!;\n if (typeof confObj?.common.activeRepo === 'string') {\n confObj.common.activeRepo = [confObj.common.activeRepo];\n }\n\n const pos = confObj.common.activeRepo.indexOf(repoName);\n if (pos !== -1) {\n confObj.common.activeRepo.splice(pos, 1);\n confObj.from = `system.host.${tools.getHostName()}.cli`;\n confObj.ts = Date.now();\n await this.objects.setObjectAsync('system.config', confObj);\n }\n }\n\n /**\n * Renames existing repository if old name and link matches, renaming will not be performed if an repo with the new name already exists\n *\n * @param oldName - name of the current repository\n * @param newName - target name\n * @param repoUrl - hyperlink of the repository\n */\n async rename(oldName: string, newName: string, repoUrl: string): Promise<void> {\n let repoObj;\n let sysConfigObj;\n try {\n sysConfigObj = await this.objects.getObjectAsync('system.config');\n repoObj = await this.objects.getObjectAsync('system.repositories');\n } catch (err) {\n throw new Error(`Could not rename repository \"${oldName}\" to \"${newName}\": ${err.message}`);\n }\n\n if (repoObj && repoObj.native && repoObj.native.repositories) {\n if (\n repoObj.native.repositories[oldName] &&\n repoObj.native.repositories[oldName].link === repoUrl &&\n !repoObj.native.repositories[newName]\n ) {\n repoObj.native.repositories[newName] = repoObj.native.repositories[oldName];\n delete repoObj.native.repositories[oldName];\n\n try {\n await this.objects.setObjectAsync('system.repositories', repoObj);\n console.log(`Renamed repository \"${oldName} to \"${newName}\"`);\n } catch (err) {\n throw new Error(`Could not rename repository \"${oldName}\" to \"${newName}\": ${err.message}`);\n }\n\n // if we changed the name of the activeRepo, we should set newName as active repo\n if (\n sysConfigObj &&\n sysConfigObj.common &&\n ((typeof sysConfigObj.common.activeRepo === 'string' &&\n sysConfigObj.common.activeRepo === oldName) ||\n (Array.isArray(sysConfigObj.common.activeRepo) &&\n sysConfigObj.common.activeRepo.includes(oldName)))\n ) {\n if (typeof sysConfigObj.common.activeRepo === 'string') {\n sysConfigObj.common.activeRepo = [sysConfigObj.common.activeRepo];\n }\n const pos = sysConfigObj.common.activeRepo.indexOf(oldName);\n sysConfigObj.common.activeRepo.splice(pos, 1, newName);\n\n try {\n await this.objects.setObjectAsync('system.config', sysConfigObj);\n } catch (err) {\n throw new Error(`Could not set \"${newName}\" as active repository: ${err.message}`);\n }\n }\n }\n }\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport axios from 'axios';\nimport fs from 'fs-extra';\nimport type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';\nimport type { Client as StatesRedisClient } from '@iobroker/db-states-redis';\nimport { BETA_REPO_URL, isIntegerLikeInput, isVersionIgnored, STABLE_REPO_URL } from '@/lib/setup/utils.js';\nimport path from 'node:path';\nimport { SYSTEM_CONFIG_ID, SYSTEM_REPOSITORIES_ID } from '@iobroker/js-controller-common-db/constants';\n\n/** The options passed to the Repo constructor */\nexport interface CLIRepoOptions {\n /** Instance of objects DB */\n objects: ObjectsRedisClient;\n /** Instance of states DB */\n states: StatesRedisClient;\n}\n\n/**\n * All possible Repo Flags which can be passed to the `show` method\n */\nexport interface RepoFlags {\n /** Also list not installed adapters */\n a?: boolean;\n /** Also list not installed adapters */\n all?: boolean;\n /** Only list updatable adapters */\n u?: boolean;\n /** Only list updatable adapters */\n updatable?: boolean;\n /** Force update even if hash hasn't changed */\n f?: boolean;\n /** Force update even if hash hasn't changed */\n force?: boolean;\n}\n\ntype RepoActiveInfo =\n | {\n /** If the repo is active */\n isActive: true;\n /** Name of the repository */\n name: string;\n }\n | {\n /** If the repo is active */\n isActive: false;\n };\n\ninterface RepoActiveOptions {\n /** Url to check if active */\n url: string;\n /** System config object */\n sysConfObj: ioBroker.SystemConfigObject;\n /** Repository object */\n repoObj: ioBroker.RepositoryObject;\n}\n\nexport class Repo {\n private readonly defaultSystemRepo: ioBroker.RepositoryObject;\n private readonly objects: ObjectsRedisClient;\n private readonly states: StatesRedisClient;\n private readonly controllerVersion: string;\n\n constructor(options: CLIRepoOptions) {\n if (!options?.objects) {\n throw new Error('Invalid arguments: objects is missing');\n }\n if (!options?.states) {\n throw new Error('Invalid arguments: states is missing');\n }\n\n const ioPackage = fs.readJSONSync(path.join(tools.getControllerDir(), 'io-package.json'));\n this.controllerVersion = ioPackage.common.version;\n\n this.objects = options.objects;\n this.states = options.states;\n\n this.defaultSystemRepo = {\n common: {\n name: 'System repositories',\n dontDelete: true,\n },\n native: {\n repositories: {\n stable: {\n link: STABLE_REPO_URL,\n json: null,\n },\n beta: {\n link: BETA_REPO_URL,\n json: null,\n },\n },\n },\n _id: SYSTEM_REPOSITORIES_ID,\n type: 'config',\n };\n }\n\n /**\n * Get the repository name by index\n * Throws if the index does not exist\n *\n * @param repoIndex repo name or index\n */\n async getNameByIndex(repoIndex: number): Promise<string> {\n const obj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n if (!obj?.native?.repositories) {\n throw new Error('No repositories setup!');\n }\n\n const repoNames = Object.keys(obj.native.repositories);\n if (!repoNames[repoIndex]) {\n throw new Error(`No repository for index \"${repoIndex}\" found`);\n }\n\n return repoNames[repoIndex];\n }\n\n /**\n * Update the given repository and returns new repo content\n *\n * @param repoName name of the repository\n * @param force force update even if same hash\n * @param systemConfig content of `system.config` object\n * @param systemRepos content of `system.repositories` object\n */\n private async updateRepo(\n repoName: string,\n force: boolean | undefined,\n systemConfig?: ioBroker.OtherObject,\n systemRepos?: ioBroker.RepositoryObject,\n ): Promise<null | ioBroker.RepositoryJson> {\n if (!repoName) {\n const sysConfig = systemConfig || (await this.objects.getObject(SYSTEM_CONFIG_ID));\n repoName = sysConfig!.common.activeRepo;\n }\n\n const oldRepos = systemRepos || (await this.objects.getObject(SYSTEM_REPOSITORIES_ID));\n if (!oldRepos?.native.repositories?.[repoName]) {\n console.log(`Error: repository \"${repoName}\" not found in the \"${SYSTEM_REPOSITORIES_ID}\"`);\n return null;\n }\n\n const urlOrPath = oldRepos.native.repositories[repoName].link;\n const hashUrl = urlOrPath.replace(/\\.json$/, '-hash.json');\n let hash;\n\n if (\n !force &&\n oldRepos.native.repositories[repoName].hash &&\n oldRepos.native.repositories[repoName].json &&\n (urlOrPath.startsWith('http://') || urlOrPath.startsWith('https://'))\n ) {\n try {\n hash = await axios({ url: hashUrl, timeout: 10_000 });\n } catch (e) {\n console.error(`Cannot download repository hash file from \"${hashUrl}\": ${e.message}`);\n }\n if (hash?.data && oldRepos.native.repositories[repoName].hash === hash.data.hash) {\n return oldRepos.native.repositories[repoName].json;\n }\n }\n\n let data;\n\n if (urlOrPath.startsWith('http://') || urlOrPath.startsWith('https://')) {\n if (!hash) {\n try {\n hash = await axios({ url: hashUrl, timeout: 10000 });\n } catch (e) {\n console.error(`Cannot download repository hash file from \"${hashUrl}\": ${e.message}`);\n }\n }\n\n const agent = `${tools.appName}, RND: CLI, Node:${process.version}, V:${this.controllerVersion}`;\n try {\n data = await axios({\n url: urlOrPath,\n timeout: 10_000,\n headers: { 'User-Agent': agent },\n });\n if (data.data) {\n data = data.data;\n } else {\n data = null;\n }\n } catch (e) {\n console.error(`Cannot download repository file from \"${urlOrPath}\": ${e.message}`);\n data = null;\n }\n } else {\n if (fs.existsSync(urlOrPath)) {\n try {\n data = JSON.parse(fs.readFileSync(urlOrPath).toString('utf8'));\n } catch (err) {\n console.error(`Error: Cannot read or parse file \"${urlOrPath}\": ${err.message}`);\n }\n } else {\n console.error(`Error: Cannot find file \"${urlOrPath}\"`);\n }\n }\n\n let changed;\n if (data) {\n oldRepos.native.repositories[repoName].json = data;\n changed = true;\n }\n if (hash?.data) {\n oldRepos.native.repositories[repoName].hash = hash.data.hash;\n changed = true;\n }\n if (changed) {\n oldRepos.from = `system.host.${tools.getHostName()}.cli`;\n oldRepos.ts = Date.now();\n await this.objects.setObject(SYSTEM_REPOSITORIES_ID, oldRepos);\n }\n\n return oldRepos.native.repositories[repoName].json;\n }\n\n /**\n * Show repo on CLI\n *\n * @param repoUrl url of the repository\n * @param flags CLI flags\n */\n async showRepo(repoUrl: string | string[], flags: RepoFlags): Promise<void> {\n // Get the repositories\n const systemConfig = await this.objects.getObject(SYSTEM_CONFIG_ID);\n const systemRepos = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n if (!systemConfig) {\n console.error(`Error: Object \"${SYSTEM_CONFIG_ID}\" not found`);\n } else if (!systemRepos) {\n console.error(`Error: Object \"${SYSTEM_REPOSITORIES_ID}\" not found`);\n } else if (!systemRepos.native || !systemRepos.native.repositories) {\n console.error(`Error: no repositories found in the \"${SYSTEM_REPOSITORIES_ID}\"`);\n } else {\n repoUrl = repoUrl || systemConfig.common.activeRepo;\n\n if (!Array.isArray(repoUrl)) {\n repoUrl = [repoUrl];\n }\n\n console.log(`Used ${repoUrl.length > 1 ? 'repositories' : 'repository'}: ${repoUrl.join(', ')}`);\n\n const allSources = {};\n\n for (const url of repoUrl) {\n const repo = systemRepos.native.repositories[url];\n // If known repository\n if (repo) {\n if (typeof repo === 'string') {\n systemRepos.native.repositories[url] = {\n link: repo,\n json: null,\n hash: '',\n };\n }\n\n const sources = await this.updateRepo(url, flags.force || flags.f, systemConfig, systemRepos);\n sources && Object.assign(allSources, sources);\n } else {\n console.error(\n `Error: unknown repository is active - \"${url}\". Known: ${Object.keys(\n systemRepos.native.repositories,\n ).join(', ')}`,\n );\n }\n }\n\n try {\n // update variables of every admin instance\n await this.updateInfo(allSources);\n } catch {\n // not important if fails\n }\n\n return this.showRepoResult(allSources, flags);\n }\n }\n\n /**\n * Show the repo result on CLI\n *\n * @param sources Repo JSON sources\n * @param flags CLI flags\n */\n private async showRepoResult(sources: Record<string, any>, flags: RepoFlags): Promise<void> {\n const installed = tools.getInstalledInfo();\n const adapters = Object.keys(sources).sort();\n\n for (const name of adapters) {\n let updatable = false;\n let text = sources[name].controller ? 'Controller ' : 'Adapter ';\n text += `\"${name}\"`;\n text = text.padEnd(11 + 15);\n\n if (sources[name].version) {\n text += `: ${sources[name].version}`;\n }\n text = text.padEnd(11 + 15 + 11);\n\n if (!(flags.all || flags.a) && !installed[name]) {\n continue;\n }\n\n if (installed[name]?.version) {\n text += `, installed ${installed[name].version}`;\n try {\n // tools.upToDate can throw if a version is invalid\n if (\n sources[name].version !== installed[name].version &&\n sources[name].version &&\n !tools.upToDate(sources[name].version, installed[name].version)\n ) {\n updatable = true;\n text = text.padEnd(11 + 15 + 11 + 18);\n const isIgnored = await isVersionIgnored({\n adapterName: name,\n objects: this.objects,\n version: sources[name].version,\n });\n\n text += isIgnored ? ' [Ignored]' : ' [Updatable]';\n }\n } catch (e) {\n console.error(`Cannot determine update info of \"${name}\": ${e.message}`);\n }\n }\n if ((flags.updatable || flags.u) && !updatable) {\n continue;\n }\n console.log(text);\n }\n }\n\n /**\n * Update Admin info states with number of updates\n *\n * @param sources the repository object\n */\n private async updateInfo(sources: Record<string, any>): Promise<void> {\n const installed = tools.getInstalledInfo();\n const list: string[] = [];\n\n for (const name of Object.keys(sources)) {\n if (installed[name] && installed[name].version && sources[name].version) {\n try {\n // tools.upToDate can throw if a version is invalid\n if (\n sources[name].version !== installed[name].version &&\n !tools.upToDate(sources[name].version, installed[name].version)\n ) {\n // remove the first part of the name\n const n = name.indexOf('.');\n list.push(n === -1 ? name : name.substring(n + 1));\n }\n } catch (e) {\n console.error(`Cannot determine update info of \"${name}\": ${e.message}`);\n }\n }\n }\n\n const objs = await this.objects.getObjectViewAsync('system', 'instance', {\n startkey: 'system.adapter.admin',\n endkey: 'system.adapter.admin\\u9999',\n });\n\n if (objs?.rows?.length) {\n const listStr = list.join(', ');\n for (const row of objs.rows) {\n if (row?.value?.type === 'instance') {\n await this.states.setState(`${row.id}.info.updatesNumber`, { val: list.length, ack: true });\n await this.states.setState(`${row.id}.info.updatesList`, { val: listStr, ack: true });\n }\n }\n }\n }\n\n /**\n * Show the current status of Repo on CLI\n */\n async showRepoStatus(): Promise<number> {\n try {\n const obj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n const objCfg = await this.objects.getObject(SYSTEM_CONFIG_ID);\n\n if (!obj) {\n console.error('List is empty');\n return EXIT_CODES.CANNOT_GET_REPO_LIST;\n } else if (obj.native.repositories) {\n console.table(\n Object.entries(obj.native.repositories).map(([key, value]) => {\n return {\n name: key,\n url: value.link,\n 'auto upgrade': objCfg?.common.adapterAutoUpgrade?.repositories[key] ?? false,\n };\n }),\n );\n\n if (objCfg?.common) {\n let activeRepo = objCfg.common.activeRepo;\n if (typeof activeRepo === 'string') {\n activeRepo = [activeRepo];\n }\n console.log(`\\nActive repo(s): ${activeRepo.join(', ')}`);\n console.log(`Upgrade policy: ${objCfg.common.adapterAutoUpgrade?.defaultPolicy ?? 'none'}`);\n }\n } else {\n console.error('List is empty');\n return EXIT_CODES.CANNOT_GET_REPO_LIST;\n }\n } catch (err) {\n console.error(`Cannot get list: ${err}`);\n }\n return EXIT_CODES.CANNOT_GET_REPO_LIST;\n }\n\n /**\n * Add new repo\n *\n * @param repoName name of new repo\n * @param repoUrl url of new repo\n */\n async add(repoName: string, repoUrl: string): Promise<void> {\n const sysRepoObj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n const obj = sysRepoObj || this.defaultSystemRepo;\n\n if (obj.native.repositories[repoName]) {\n throw new Error(`Repository \"${repoName}\" yet exists: ${obj.native.repositories[repoName].link}`);\n } else {\n if (isIntegerLikeInput(repoName)) {\n throw new Error(\n `Invalid name \"${repoName}\"! A repository name is not allowed to contain only numbers.`,\n );\n }\n\n obj.native.repositories[repoName] = {\n link: repoUrl,\n json: null,\n };\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n await this.objects.setObject(SYSTEM_REPOSITORIES_ID, obj);\n }\n }\n\n /**\n * Remove repository from sources\n *\n * @param repoName name of repository to remove\n */\n async del(repoName: string): Promise<void> {\n const obj = await this.objects.getObject(SYSTEM_CONFIG_ID);\n if (\n (obj?.common.activeRepo &&\n typeof obj.common.activeRepo === 'string' &&\n obj.common.activeRepo === repoName) ||\n (obj?.common.activeRepo && Array.isArray(obj.common.activeRepo) && obj.common.activeRepo.includes(repoName))\n ) {\n throw new Error(`Cannot delete active repository: ${repoName}`);\n } else {\n const repoObj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n if (repoObj) {\n if (!repoObj.native.repositories[repoName]) {\n throw new Error(`Repository \"${repoName}\" not found.`);\n } else {\n delete repoObj.native.repositories[repoName];\n repoObj.from = `system.host.${tools.getHostName()}.cli`;\n repoObj.ts = Date.now();\n await this.objects.setObject(SYSTEM_REPOSITORIES_ID, repoObj);\n }\n }\n }\n }\n\n /**\n * Checks if stable repo is active\n *\n * @param options the system config object and the repository object\n */\n private getRepoActiveInfo(options: RepoActiveOptions): RepoActiveInfo {\n const { repoObj, sysConfObj, url } = options;\n\n const name = sysConfObj.common.activeRepo.find(\n activeRepo => repoObj.native.repositories[activeRepo].link === url,\n );\n\n return name ? { isActive: true, name } : { isActive: false };\n }\n\n /**\n * Set specific repo as active one\n *\n * @param repoName name of the repository to activate\n */\n async setActive(repoName: string): Promise<void> {\n const sysRepoObj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n const obj = sysRepoObj || this.defaultSystemRepo;\n\n if (!obj.native.repositories[repoName]) {\n throw new Error(`Repository \"${repoName}\" not found.`);\n }\n\n const confObj = await this.objects.getObject(SYSTEM_CONFIG_ID);\n if (typeof confObj?.common.activeRepo === 'string') {\n confObj.common.activeRepo = [confObj.common.activeRepo];\n }\n\n if (!confObj || confObj.common.activeRepo.includes(repoName)) {\n return;\n }\n\n confObj.common.activeRepo.push(repoName);\n\n const stableInfo = this.getRepoActiveInfo({\n url: STABLE_REPO_URL,\n sysConfObj: confObj,\n repoObj: obj,\n });\n\n const betaInfo = this.getRepoActiveInfo({\n url: BETA_REPO_URL,\n sysConfObj: confObj,\n repoObj: obj,\n });\n\n if (stableInfo.isActive && betaInfo.isActive) {\n const posStable = confObj.common.activeRepo.indexOf(stableInfo.name);\n const posBeta = confObj.common.activeRepo.indexOf(betaInfo.name);\n\n if (posStable < posBeta) {\n // put beta in front of stable, so stable will override adapters\n confObj.common.activeRepo.splice(posBeta, 1);\n confObj.common.activeRepo.splice(posStable, 0, betaInfo.name);\n console.info(\n `Ensured that stable repository \"${stableInfo.name}\" has priority over beta repository \"${betaInfo.name}\"`,\n );\n }\n }\n\n if (confObj.common.activeRepo.length > 1) {\n console.info('More than one repository is active. Please be sure, that this is a desired constellation!');\n }\n\n confObj.from = `system.host.${tools.getHostName()}.cli`;\n confObj.ts = Date.now();\n await this.objects.setObject(SYSTEM_CONFIG_ID, confObj);\n }\n\n /**\n * Set given repo as inactive\n *\n * @param repoName name of the repository\n */\n async setInactive(repoName: string): Promise<void> {\n const confObj = (await this.objects.getObject(SYSTEM_CONFIG_ID))!;\n if (typeof confObj?.common.activeRepo === 'string') {\n confObj.common.activeRepo = [confObj.common.activeRepo];\n }\n\n const pos = confObj.common.activeRepo.indexOf(repoName);\n if (pos !== -1) {\n confObj.common.activeRepo.splice(pos, 1);\n confObj.from = `system.host.${tools.getHostName()}.cli`;\n confObj.ts = Date.now();\n await this.objects.setObject(SYSTEM_CONFIG_ID, confObj);\n }\n }\n\n /**\n * Renames existing repository if old name and link matches, renaming will not be performed if a repo with the new name already exists\n *\n * @param oldName - name of the current repository\n * @param newName - target name\n * @param repoUrl - hyperlink of the repository\n */\n async rename(oldName: string, newName: string, repoUrl: string): Promise<void> {\n let repoObj;\n let sysConfigObj;\n try {\n sysConfigObj = await this.objects.getObject(SYSTEM_CONFIG_ID);\n repoObj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n } catch (err) {\n throw new Error(`Could not rename repository \"${oldName}\" to \"${newName}\": ${err.message}`);\n }\n\n if (isIntegerLikeInput(newName)) {\n throw new Error(`Invalid name \"${newName}\"! A repository name is not allowed to contain only numbers.`);\n }\n\n if (!repoObj) {\n return;\n }\n\n if (\n repoObj.native.repositories[oldName] &&\n repoObj.native.repositories[oldName].link === repoUrl &&\n !repoObj.native.repositories[newName]\n ) {\n repoObj.native.repositories[newName] = repoObj.native.repositories[oldName];\n delete repoObj.native.repositories[oldName];\n\n try {\n await this.objects.setObject(SYSTEM_REPOSITORIES_ID, repoObj);\n console.log(`Renamed repository \"${oldName} to \"${newName}\"`);\n } catch (e) {\n throw new Error(`Could not rename repository \"${oldName}\" to \"${newName}\": ${e.message}`);\n }\n\n // if we changed the name of the activeRepo, we should set newName as active repo\n if (\n sysConfigObj?.common &&\n ((typeof sysConfigObj.common.activeRepo === 'string' && sysConfigObj.common.activeRepo === oldName) ||\n (Array.isArray(sysConfigObj.common.activeRepo) && sysConfigObj.common.activeRepo.includes(oldName)))\n ) {\n if (typeof sysConfigObj.common.activeRepo === 'string') {\n sysConfigObj.common.activeRepo = [sysConfigObj.common.activeRepo];\n }\n const pos = sysConfigObj.common.activeRepo.indexOf(oldName);\n sysConfigObj.common.activeRepo.splice(pos, 1, newName);\n\n try {\n await this.objects.setObject(SYSTEM_CONFIG_ID, sysConfigObj);\n } catch (e) {\n throw new Error(`Could not set \"${newName}\" as active repository: ${e.message}`);\n }\n }\n }\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["fs", "path", "axios"]
7
7
  }
@@ -39,5 +39,15 @@ export declare function ignoreVersion(options: IgnoreVersionOptions): Promise<vo
39
39
  * @param options name of the adapter
40
40
  */
41
41
  export declare function recognizeVersion(options: VersionOptions): Promise<void>;
42
+ /**
43
+ * Check if user input is an integer
44
+ *
45
+ * @param input input string to check
46
+ */
47
+ export declare function isIntegerLikeInput(input: string): boolean;
48
+ /** URL of the official stable repository */
49
+ export declare const STABLE_REPO_URL = "http://download.iobroker.net/sources-dist.json";
50
+ /** URL of the official beta repository */
51
+ export declare const BETA_REPO_URL = "http://download.iobroker.net/sources-dist-latest.json";
42
52
  export {};
43
53
  //# sourceMappingURL=utils.d.ts.map
@@ -28,8 +28,11 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
  var utils_exports = {};
30
30
  __export(utils_exports, {
31
+ BETA_REPO_URL: () => BETA_REPO_URL,
32
+ STABLE_REPO_URL: () => STABLE_REPO_URL,
31
33
  getRepository: () => getRepository,
32
34
  ignoreVersion: () => ignoreVersion,
35
+ isIntegerLikeInput: () => isIntegerLikeInput,
33
36
  isVersionIgnored: () => isVersionIgnored,
34
37
  recognizeVersion: () => recognizeVersion
35
38
  });
@@ -119,10 +122,18 @@ async function recognizeVersion(options) {
119
122
  delete obj.common.ignoreVersion;
120
123
  await objects.setObject(id, obj);
121
124
  }
125
+ function isIntegerLikeInput(input) {
126
+ return /^\d+$/.test(input);
127
+ }
128
+ const STABLE_REPO_URL = "http://download.iobroker.net/sources-dist.json";
129
+ const BETA_REPO_URL = "http://download.iobroker.net/sources-dist-latest.json";
122
130
  // Annotate the CommonJS export names for ESM import in node:
123
131
  0 && (module.exports = {
132
+ BETA_REPO_URL,
133
+ STABLE_REPO_URL,
124
134
  getRepository,
125
135
  ignoreVersion,
136
+ isIntegerLikeInput,
126
137
  isVersionIgnored,
127
138
  recognizeVersion
128
139
  });