iobroker.beszel 0.2.2 → 0.2.4

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/README.md CHANGED
@@ -122,6 +122,12 @@ beszel.0.
122
122
 
123
123
  ## Changelog
124
124
 
125
+ ### 0.2.4 (2026-04-05)
126
+ - Cleaner log messages, remove redundant adapter name prefix
127
+
128
+ ### 0.2.3 (2026-04-05)
129
+ - Remove redundant scripts, unused devDependencies, compress documentation
130
+
125
131
  ### 0.2.2 (2026-04-03)
126
132
  - Modernize dev tooling (esbuild, TypeScript 5.9 pin, testing-action-check v2)
127
133
 
@@ -137,12 +143,6 @@ beszel.0.
137
143
  ### 0.1.8 (2026-03-19)
138
144
  - Add online/offline indicator to system device folders
139
145
 
140
- ### 0.1.7 (2026-03-19)
141
- - Add system count to startup log message
142
-
143
- ### 0.1.6 (2026-03-18)
144
- - Code cleanup: remove dead code, fix duplicate container filter, extract load avg helper
145
-
146
146
  Older changelog: [CHANGELOG.md](CHANGELOG.md)
147
147
 
148
148
  ---
package/build/main.js CHANGED
@@ -64,7 +64,7 @@ class BeszelAdapter extends utils.Adapter {
64
64
  await this.setStateAsync("info.connection", { val: false, ack: true });
65
65
  if (!config.url || !config.username || !config.password) {
66
66
  this.log.error(
67
- "Beszel adapter: URL, username, and password are required. Please configure the adapter."
67
+ "URL, username, and password are required \u2014 please configure the adapter settings"
68
68
  );
69
69
  return;
70
70
  }
package/build/main.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/main.ts"],
4
- "sourcesContent": ["import * as utils from \"@iobroker/adapter-core\";\nimport { BeszelClient } from \"./lib/beszel-client.js\";\nimport { StateManager } from \"./lib/state-manager.js\";\nimport type { AdapterConfig } from \"./lib/types.js\";\n\nclass BeszelAdapter extends utils.Adapter {\n private client: BeszelClient | null = null;\n private stateManager: StateManager | null = null;\n private pollTimer: ioBroker.Interval | undefined = undefined;\n private isPolling = false;\n private lastSystemCount = 0;\n private lastErrorCode = \"\";\n private authFailCount = 0;\n\n public constructor(options: Partial<utils.AdapterOptions> = {}) {\n super({\n ...options,\n name: \"beszel\",\n });\n this.on(\"ready\", this.onReady.bind(this));\n this.on(\"unload\", this.onUnload.bind(this));\n this.on(\"message\", this.onMessage.bind(this));\n }\n\n private async onReady(): Promise<void> {\n const config = this.config as unknown as AdapterConfig;\n\n // Ensure info objects exist before any setState calls\n await this.setObjectNotExistsAsync(\"info\", {\n type: \"channel\",\n common: { name: \"Information\" },\n native: {},\n });\n await this.setObjectNotExistsAsync(\"info.connection\", {\n type: \"state\",\n common: {\n name: \"Connection status\",\n type: \"boolean\",\n role: \"indicator.connected\",\n read: true,\n write: false,\n def: false,\n },\n native: {},\n });\n await this.setStateAsync(\"info.connection\", { val: false, ack: true });\n\n // Validate required config\n if (!config.url || !config.username || !config.password) {\n this.log.error(\n \"Beszel adapter: URL, username, and password are required. Please configure the adapter.\",\n );\n return;\n }\n\n this.client = new BeszelClient(\n config.url,\n config.username,\n config.password,\n );\n this.stateManager = new StateManager(this);\n\n // Cleanup disabled metric states for existing systems (config may have changed)\n const existingObjects = await this.getObjectViewAsync(\"system\", \"device\", {\n startkey: `${this.namespace}.systems.`,\n endkey: `${this.namespace}.systems.\\u9999`,\n });\n if (existingObjects?.rows) {\n for (const row of existingObjects.rows) {\n const relId = row.id.startsWith(`${this.namespace}.`)\n ? row.id.slice(this.namespace.length + 1)\n : row.id;\n const parts = relId.split(\".\");\n if (parts.length === 2 && parts[0] === \"systems\") {\n await this.stateManager.cleanupMetrics(parts[1], config);\n }\n }\n }\n\n // Initial poll\n await this.poll();\n\n // Set up recurring poll\n const intervalMs = Math.max(10, config.pollInterval ?? 60) * 1000;\n this.pollTimer = this.setInterval(() => {\n void this.poll();\n }, intervalMs);\n\n this.log.info(\n `Beszel adapter started \u2014 ${this.lastSystemCount} system(s), polling every ${config.pollInterval ?? 60}s`,\n );\n }\n\n private onUnload(callback: () => void): void {\n try {\n if (this.pollTimer) {\n this.clearInterval(this.pollTimer);\n this.pollTimer = undefined;\n }\n void this.setState(\"info.connection\", { val: false, ack: true });\n } catch {\n // ignore\n }\n callback();\n }\n\n private async onMessage(obj: ioBroker.Message): Promise<void> {\n if (obj.command === \"checkConnection\") {\n const config = obj.message as Partial<AdapterConfig>;\n const url = config.url ?? \"\";\n const username = config.username ?? \"\";\n const password = config.password ?? \"\";\n\n if (!url || !username || !password) {\n this.sendTo(\n obj.from,\n obj.command,\n {\n success: false,\n message: \"URL, username and password are required\",\n },\n obj.callback,\n );\n return;\n }\n\n const testClient = new BeszelClient(url, username, password);\n const result = await testClient.checkConnection();\n this.sendTo(obj.from, obj.command, result, obj.callback);\n }\n }\n\n /**\n * Classify an error for deduplication and log-level decisions.\n *\n * @param err The error to classify\n */\n private classifyError(err: unknown): string {\n if (!(err instanceof Error)) {\n return \"UNKNOWN\";\n }\n const code = (err as NodeJS.ErrnoException).code;\n if (code === \"UNAUTHORIZED\") {\n return \"UNAUTHORIZED\";\n }\n if (\n code === \"ENOTFOUND\" ||\n code === \"ECONNREFUSED\" ||\n code === \"ECONNRESET\" ||\n code === \"ENETUNREACH\" ||\n code === \"EAI_AGAIN\"\n ) {\n return \"NETWORK\";\n }\n if (code === \"ETIMEDOUT\" || err.message.includes(\"timed out\")) {\n return \"TIMEOUT\";\n }\n return code || \"UNKNOWN\";\n }\n\n private async poll(): Promise<void> {\n if (this.isPolling) {\n this.log.debug(\"Skipping poll \u2014 previous poll still running\");\n return;\n }\n if (!this.client || !this.stateManager) {\n return;\n }\n\n this.isPolling = true;\n try {\n const config = this.config as unknown as AdapterConfig;\n\n // Fetch all data\n const [systems, containers] = await Promise.all([\n this.client.getSystems(),\n config.metrics_containers\n ? this.client.getContainers()\n : Promise.resolve([]),\n ]);\n\n const systemIds = systems.map((s) => s.id);\n const statsMap = await this.client.getLatestStats(systemIds);\n\n // Update connection state\n await this.setStateAsync(\"info.connection\", { val: true, ack: true });\n\n // Update each system\n for (const system of systems) {\n const stats = statsMap.get(system.id);\n await this.stateManager.updateSystem(system, stats, containers, config);\n }\n\n // Cleanup stale systems \u2014 but only if we actually got results.\n // An empty list during a transient API issue must NOT wipe all devices.\n if (systems.length > 0 || this.lastSystemCount === 0) {\n await this.stateManager.cleanupSystems(systems.map((s) => s.name));\n }\n\n this.lastSystemCount = systems.length;\n this.authFailCount = 0;\n\n // Clear error state on success\n if (this.lastErrorCode) {\n this.log.info(\"Connection restored\");\n this.lastErrorCode = \"\";\n }\n this.log.debug(`Polled ${systems.length} systems successfully`);\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n const errorCode = this.classifyError(err);\n const isRepeat = errorCode === this.lastErrorCode;\n this.lastErrorCode = errorCode;\n\n if (errorCode === \"UNAUTHORIZED\") {\n this.client?.invalidateToken();\n this.authFailCount++;\n if (this.authFailCount <= 3) {\n this.log.error(\"Authentication failed \u2014 check username and password\");\n } else if (this.authFailCount === 4) {\n this.log.error(\n \"Authentication keeps failing \u2014 suppressing further auth errors\",\n );\n } else {\n this.log.debug(`Auth still failing (attempt ${this.authFailCount})`);\n }\n } else if (isRepeat) {\n this.log.debug(`Poll failed (ongoing): ${errMsg}`);\n } else if (errorCode === \"NETWORK\") {\n this.log.warn(\"Cannot reach Beszel Hub \u2014 will keep retrying\");\n } else {\n this.log.error(`Poll failed: ${errMsg}`);\n }\n\n await this.setStateAsync(\"info.connection\", { val: false, ack: true });\n } finally {\n this.isPolling = false;\n }\n }\n}\n\nif (require.main !== module) {\n // Export the constructor in compact mode\n module.exports = (options: Partial<utils.AdapterOptions> | undefined) =>\n new BeszelAdapter(options);\n} else {\n (() => new BeszelAdapter())();\n}\n"],
4
+ "sourcesContent": ["import * as utils from \"@iobroker/adapter-core\";\nimport { BeszelClient } from \"./lib/beszel-client.js\";\nimport { StateManager } from \"./lib/state-manager.js\";\nimport type { AdapterConfig } from \"./lib/types.js\";\n\nclass BeszelAdapter extends utils.Adapter {\n private client: BeszelClient | null = null;\n private stateManager: StateManager | null = null;\n private pollTimer: ioBroker.Interval | undefined = undefined;\n private isPolling = false;\n private lastSystemCount = 0;\n private lastErrorCode = \"\";\n private authFailCount = 0;\n\n public constructor(options: Partial<utils.AdapterOptions> = {}) {\n super({\n ...options,\n name: \"beszel\",\n });\n this.on(\"ready\", this.onReady.bind(this));\n this.on(\"unload\", this.onUnload.bind(this));\n this.on(\"message\", this.onMessage.bind(this));\n }\n\n private async onReady(): Promise<void> {\n const config = this.config as unknown as AdapterConfig;\n\n // Ensure info objects exist before any setState calls\n await this.setObjectNotExistsAsync(\"info\", {\n type: \"channel\",\n common: { name: \"Information\" },\n native: {},\n });\n await this.setObjectNotExistsAsync(\"info.connection\", {\n type: \"state\",\n common: {\n name: \"Connection status\",\n type: \"boolean\",\n role: \"indicator.connected\",\n read: true,\n write: false,\n def: false,\n },\n native: {},\n });\n await this.setStateAsync(\"info.connection\", { val: false, ack: true });\n\n // Validate required config\n if (!config.url || !config.username || !config.password) {\n this.log.error(\n \"URL, username, and password are required \u2014 please configure the adapter settings\",\n );\n return;\n }\n\n this.client = new BeszelClient(\n config.url,\n config.username,\n config.password,\n );\n this.stateManager = new StateManager(this);\n\n // Cleanup disabled metric states for existing systems (config may have changed)\n const existingObjects = await this.getObjectViewAsync(\"system\", \"device\", {\n startkey: `${this.namespace}.systems.`,\n endkey: `${this.namespace}.systems.\\u9999`,\n });\n if (existingObjects?.rows) {\n for (const row of existingObjects.rows) {\n const relId = row.id.startsWith(`${this.namespace}.`)\n ? row.id.slice(this.namespace.length + 1)\n : row.id;\n const parts = relId.split(\".\");\n if (parts.length === 2 && parts[0] === \"systems\") {\n await this.stateManager.cleanupMetrics(parts[1], config);\n }\n }\n }\n\n // Initial poll\n await this.poll();\n\n // Set up recurring poll\n const intervalMs = Math.max(10, config.pollInterval ?? 60) * 1000;\n this.pollTimer = this.setInterval(() => {\n void this.poll();\n }, intervalMs);\n\n this.log.info(\n `Beszel adapter started \u2014 ${this.lastSystemCount} system(s), polling every ${config.pollInterval ?? 60}s`,\n );\n }\n\n private onUnload(callback: () => void): void {\n try {\n if (this.pollTimer) {\n this.clearInterval(this.pollTimer);\n this.pollTimer = undefined;\n }\n void this.setState(\"info.connection\", { val: false, ack: true });\n } catch {\n // ignore\n }\n callback();\n }\n\n private async onMessage(obj: ioBroker.Message): Promise<void> {\n if (obj.command === \"checkConnection\") {\n const config = obj.message as Partial<AdapterConfig>;\n const url = config.url ?? \"\";\n const username = config.username ?? \"\";\n const password = config.password ?? \"\";\n\n if (!url || !username || !password) {\n this.sendTo(\n obj.from,\n obj.command,\n {\n success: false,\n message: \"URL, username and password are required\",\n },\n obj.callback,\n );\n return;\n }\n\n const testClient = new BeszelClient(url, username, password);\n const result = await testClient.checkConnection();\n this.sendTo(obj.from, obj.command, result, obj.callback);\n }\n }\n\n /**\n * Classify an error for deduplication and log-level decisions.\n *\n * @param err The error to classify\n */\n private classifyError(err: unknown): string {\n if (!(err instanceof Error)) {\n return \"UNKNOWN\";\n }\n const code = (err as NodeJS.ErrnoException).code;\n if (code === \"UNAUTHORIZED\") {\n return \"UNAUTHORIZED\";\n }\n if (\n code === \"ENOTFOUND\" ||\n code === \"ECONNREFUSED\" ||\n code === \"ECONNRESET\" ||\n code === \"ENETUNREACH\" ||\n code === \"EAI_AGAIN\"\n ) {\n return \"NETWORK\";\n }\n if (code === \"ETIMEDOUT\" || err.message.includes(\"timed out\")) {\n return \"TIMEOUT\";\n }\n return code || \"UNKNOWN\";\n }\n\n private async poll(): Promise<void> {\n if (this.isPolling) {\n this.log.debug(\"Skipping poll \u2014 previous poll still running\");\n return;\n }\n if (!this.client || !this.stateManager) {\n return;\n }\n\n this.isPolling = true;\n try {\n const config = this.config as unknown as AdapterConfig;\n\n // Fetch all data\n const [systems, containers] = await Promise.all([\n this.client.getSystems(),\n config.metrics_containers\n ? this.client.getContainers()\n : Promise.resolve([]),\n ]);\n\n const systemIds = systems.map((s) => s.id);\n const statsMap = await this.client.getLatestStats(systemIds);\n\n // Update connection state\n await this.setStateAsync(\"info.connection\", { val: true, ack: true });\n\n // Update each system\n for (const system of systems) {\n const stats = statsMap.get(system.id);\n await this.stateManager.updateSystem(system, stats, containers, config);\n }\n\n // Cleanup stale systems \u2014 but only if we actually got results.\n // An empty list during a transient API issue must NOT wipe all devices.\n if (systems.length > 0 || this.lastSystemCount === 0) {\n await this.stateManager.cleanupSystems(systems.map((s) => s.name));\n }\n\n this.lastSystemCount = systems.length;\n this.authFailCount = 0;\n\n // Clear error state on success\n if (this.lastErrorCode) {\n this.log.info(\"Connection restored\");\n this.lastErrorCode = \"\";\n }\n this.log.debug(`Polled ${systems.length} systems successfully`);\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n const errorCode = this.classifyError(err);\n const isRepeat = errorCode === this.lastErrorCode;\n this.lastErrorCode = errorCode;\n\n if (errorCode === \"UNAUTHORIZED\") {\n this.client?.invalidateToken();\n this.authFailCount++;\n if (this.authFailCount <= 3) {\n this.log.error(\"Authentication failed \u2014 check username and password\");\n } else if (this.authFailCount === 4) {\n this.log.error(\n \"Authentication keeps failing \u2014 suppressing further auth errors\",\n );\n } else {\n this.log.debug(`Auth still failing (attempt ${this.authFailCount})`);\n }\n } else if (isRepeat) {\n this.log.debug(`Poll failed (ongoing): ${errMsg}`);\n } else if (errorCode === \"NETWORK\") {\n this.log.warn(\"Cannot reach Beszel Hub \u2014 will keep retrying\");\n } else {\n this.log.error(`Poll failed: ${errMsg}`);\n }\n\n await this.setStateAsync(\"info.connection\", { val: false, ack: true });\n } finally {\n this.isPolling = false;\n }\n }\n}\n\nif (require.main !== module) {\n // Export the constructor in compact mode\n module.exports = (options: Partial<utils.AdapterOptions> | undefined) =>\n new BeszelAdapter(options);\n} else {\n (() => new BeszelAdapter())();\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
package/io-package.json CHANGED
@@ -1,8 +1,34 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "beszel",
4
- "version": "0.2.2",
4
+ "version": "0.2.4",
5
5
  "news": {
6
+ "0.2.4": {
7
+ "en": "Cleaner log messages, remove redundant adapter name prefix",
8
+ "de": "Sauberere Log-Meldungen, redundanten Adapter-Namen-Präfix entfernt",
9
+ "ru": "Чистые сообщения журнала, удалён избыточный префикс имени адаптера",
10
+ "pt": "Mensagens de log mais limpas, prefixo redundante do nome do adaptador removido",
11
+ "nl": "Schonere logberichten, overbodige adapternaamprefix verwijderd",
12
+ "fr": "Messages de log plus propres, préfixe de nom d'adaptateur redondant supprimé",
13
+ "it": "Messaggi di log più puliti, prefisso ridondante del nome adattatore rimosso",
14
+ "es": "Mensajes de registro más limpios, prefijo redundante del nombre del adaptador eliminado",
15
+ "pl": "Czystsze komunikaty dziennika, usunięto zbędny prefiks nazwy adaptera",
16
+ "uk": "Чистіші повідомлення журналу, видалено зайвий префікс назви адаптера",
17
+ "zh-cn": "更清洁的日志消息,删除冗余的适配器名称前缀"
18
+ },
19
+ "0.2.3": {
20
+ "en": "Remove redundant scripts and unused devDependencies, compress documentation",
21
+ "de": "Redundante Scripts und ungenutzte DevDependencies entfernt, Dokumentation komprimiert",
22
+ "ru": "Удалены избыточные скрипты и неиспользуемые devDependencies, документация сжата",
23
+ "pt": "Scripts redundantes e devDependencies não utilizadas removidos, documentação comprimida",
24
+ "nl": "Redundante scripts en ongebruikte devDependencies verwijderd, documentatie gecomprimeerd",
25
+ "fr": "Scripts redondants et devDependencies inutilisées supprimés, documentation compressée",
26
+ "it": "Script ridondanti e devDependencies inutilizzate rimossi, documentazione compressa",
27
+ "es": "Scripts redundantes y devDependencies no utilizadas eliminados, documentación comprimida",
28
+ "pl": "Usunięto zbędne skrypty i nieużywane devDependencies, skompresowano dokumentację",
29
+ "uk": "Видалено зайві скрипти та невикористані devDependencies, документацію стиснуто",
30
+ "zh-cn": "删除冗余脚本和未使用的开发依赖,压缩文档"
31
+ },
6
32
  "0.2.2": {
7
33
  "en": "Modernize dev tooling (esbuild, TypeScript 5.9 pin, testing-action-check v2)",
8
34
  "de": "Dev-Tooling modernisiert (esbuild, TypeScript 5.9 Pin, testing-action-check v2)",
@@ -67,32 +93,6 @@
67
93
  "pl": "Dodano wskaźnik online/offline do folderów urządzeń systemowych",
68
94
  "uk": "Додано індикатор онлайн/офлайн до папок системних пристроїв",
69
95
  "zh-cn": "为系统设备文件夹添加在线/离线指示器"
70
- },
71
- "0.1.6": {
72
- "en": "Code cleanup: remove unused type aliases, dead `_config` parameter, redundant setState call\nFix duplicate container filter (was filtered in main.ts and again in updateContainers)\nExtract load avg state creation into helper to eliminate code duplication",
73
- "de": "Code-Reinigung: entfernen Sie ungenutzte Typ-Aliase, tot `_config` Parameter, redundantes Set Mitgliedstaat\nBefestigen Sie doppelten Behälterfilter (in main.ts und wieder in updateContainers gefiltert)\nExtrahieren Sie die Last avg Zustand Kreation in Helfer, um Code-Dualplikation zu beseitigen",
74
- "ru": "Очистка кода: удаление неиспользуемых псевдонимов типа, мертвый параметр «_config» Государственный призыв\nИсправьте дублированный контейнерный фильтр (был отфильтрован в main.ts и снова в UpdateContainers)\nЭкстракт загрузки avg создания состояния в помощник для устранения дублирования кода",
75
- "pt": "Limpeza de código: remover aliases de tipo não utilizados, parâmetro '_config' morto, conjunto redundante Chamada de Estado\nCorrigir filtro de recipiente duplicado (foi filtrado em main.ts e novamente em updateContainers)\nExtrair a criação do estado de avg de carga no helper para eliminar a duplicação de código",
76
- "nl": "Code opruiming: verwijder ongebruikte type aliassen, dode parameter, redundante set Staatsoproep\nFix dubbele container filter (was gefilterd in main.ts en opnieuw in update Containers)\nUitpakken laden avg toestand aanmaken in helper om code duplicatie te elimineren",
77
- "fr": "Nettoyage du code: supprimer les alias de type inutilisés, le paramètre mort `_config`, un ensemble redondant Appel d'État\nCorrection du filtre conteneur dupliqué (a été filtré dans main.ts et à nouveau dans updateContainers)\nExtraire la création d'état de charge avg dans helper pour éliminer la duplication de code",
78
- "it": "Pulizia del codice: rimuovere alias di tipo non utilizzati, morto `_config` parametro, set ridondante Chiamata di Stato\nFissare il filtro del contenitore duplicato (era filtrato in main.ts e di nuovo in updateContainers)\nEstrarre la creazione di stato avg di carico in helper per eliminare la duplicazione di codice",
79
- "es": "Limpieza del código: eliminar alias de tipo no utilizados, parámetro muerto `_config`, conjunto redundante Llamamiento del Estado\nFijar filtro de contenedor duplicado (fue filtrado en main.ts y de nuevo en actualizaciónContainers)\nExtraer la carga avg estado creación en helper para eliminar duplicación de código",
80
- "pl": "Czyszczenie kodu: usuń nieużywane aliasy typu, nieaktywny parametr '_ config', zbędny zestaw Wezwanie państwa\nFix duplikat filtr pojemnika (został filtrowany w main.ts i ponownie w updateContainer)\nWyciąg obciążenia avg stan tworzenia w helper w celu wyeliminowania powielania kodu",
81
- "uk": "Чистка коду: видалення невикористаного типу псевдонімів, відмерлого параметра `_config``, надлишковий набір Державний дзвінок\nВиправлення дублікатів фільтра контейнера (відфільтровано в основних.ts і знову в оновленні\nВитягувати завантаження avg державного створення в помічник для усунення дублювання коду",
82
- "zh-cn": "代码清除: 删除未使用的类型别名, 已死 QQconfig 参数, 冗余集 国家电话\n修复重复的容器过滤器(在主.ts和在更新容器中再次过滤)\n提取加载 avg 状态创建到帮助器, 以消除代码重复"
83
- },
84
- "0.1.5": {
85
- "en": "Migrate to @alcalzone/release-script for automated releases\nEnable npm Trusted Publishing (OIDC), remove legacy npm token",
86
- "de": "Migration auf @alcalzone/Release-script für automatisierte Versionen\nAktiviere npm Trusted Publishing (OIDC), legacy npm token",
87
- "ru": "Migrate to @alcalzone/releasescript для автоматизированных релизов\nВключить npm Trusted Publishing (OIDC), удалить устаревший токен npm",
88
- "pt": "Migrar para @alcalzone/release-script para versões automatizadas\nActivar a publicação confiável do npm (OIDC), remover o símbolo legado do npm",
89
- "nl": "Migreren naar @alcalzone/release-script voor geautomatiseerde releases\nNpm Trusted Publishing (OIDC) inschakelen, legacy npm token verwijderen",
90
- "fr": "Migrer vers @alcalzone/release-script pour les versions automatisées\nActiver npm Trusted Publishing (OIDC), supprimer le legs npm token",
91
- "it": "Migrare a @alcalzone/release-script per le versioni automatizzate\nAbilitare npm Trusted Publishing (OIDC), rimuovere il token npm legacy",
92
- "es": "Migrar a @alcalzone/release-script para versiones automatizadas\nActivar npm Trusted Publishing (OIDC), eliminar el legado npm token",
93
- "pl": "Migrate to @ alcalzone / release- script for automatic releases\nWłącz npm Zaufane Publishing (OIDC), usuń poprzednią npm token",
94
- "uk": "Migrate to @alcalzone/видання для автоматизованих релізів\nУвімкнути npm Trusted Publishing (OIDC), видалити дані npm token",
95
- "zh-cn": "移动到 @alcalzone/ 释放- 标记用于自动发布\n启用 npm 信任的出版( OIDC), 删除遗留 npm 令牌"
96
96
  }
97
97
  },
98
98
  "titleLang": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.beszel",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "ioBroker adapter for Beszel server monitoring",
5
5
  "author": {
6
6
  "name": "krobi",
@@ -45,14 +45,11 @@
45
45
  "@types/iobroker": "npm:@iobroker/types@^7.1.0",
46
46
  "@types/node": "^25.5.0",
47
47
  "rimraf": "^6.1.3",
48
- "source-map-support": "^0.5.21",
49
- "ts-node": "^10.9.2",
50
48
  "typescript": "~5.9.3"
51
49
  },
52
50
  "main": "build/main.js",
53
51
  "scripts": {
54
52
  "prebuild": "rimraf build",
55
- "build:ts": "build-adapter ts",
56
53
  "build": "build-adapter ts",
57
54
  "build:test": "tsc -p tsconfig.test.json",
58
55
  "watch": "build-adapter ts --watch",
@@ -60,14 +57,11 @@
60
57
  "test:package": "npm run build:test && mocha --exit \"build/test/testPackageFiles.js\"",
61
58
  "test:integration": "npm run build:test && mocha --exit \"build/test/**/*.js\"",
62
59
  "test": "npm run build:test && mocha --exit \"build/test/**/*.js\"",
63
- "test:ci": "npm run build:test && mocha --exit --reporter spec \"build/test/**/*.js\"",
64
60
  "lint": "eslint",
65
61
  "lint:fix": "eslint --fix",
66
- "prepare": "npm run build",
67
62
  "release": "release-script"
68
63
  },
69
64
  "bugs": {
70
65
  "url": "https://github.com/krobipd/ioBroker.beszel/issues"
71
- },
72
- "readmeFilename": "README.md"
66
+ }
73
67
  }