iobroker.javascript 10.1.0 → 10.1.1

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 (136) hide show
  1. package/README.md +7 -6
  2. package/admin/assets/AiChatPanel-C_WbKMGX.js +242 -0
  3. package/admin/assets/{AiDiffView-zJTEnv05.js → AiDiffView-BtXbDWZ8.js} +1 -1
  4. package/admin/assets/{Debugger-DCMWjeGm.js → Debugger-DAdJnEhw.js} +4 -4
  5. package/admin/assets/{Error-CBC2oZzb.js → Error-DQ1pzKcf.js} +1 -1
  6. package/admin/assets/{Import-B-F9IhZ-.js → Import-BjMtH6Gk.js} +1 -1
  7. package/admin/assets/RulesEditor-dDRPHw4X.js +1 -0
  8. package/admin/assets/{ScriptEditor-CMYUt5S4.js → ScriptEditor-CZSc7rwE.js} +1 -1
  9. package/admin/assets/ScriptEditorVanillaMonaco-DEKg14_A.js +3 -0
  10. package/admin/assets/{_virtual_mf-localSharedImportMap___mfe_internal__iobroker_javascript__mf_owner__1-7EPUlgCk.js → _virtual_mf-localSharedImportMap___mfe_internal__iobroker_javascript__mf_owner__1-DPmwd_G2.js} +1 -1
  11. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-C8inUeKt.js +1243 -0
  12. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-VcQjt7_9.js +9 -0
  13. package/admin/assets/aiPromptBuilder-D5FDo74i.js +1 -0
  14. package/admin/assets/{blockly-C4zJerWL.js → blockly-DBw-ytY1.js} +11 -11
  15. package/admin/assets/blocks_action-BqfWEwpf.js +1 -0
  16. package/admin/assets/{blocks_convert-BZlKcd02.js → blocks_convert-CX0i-JfS.js} +3 -3
  17. package/admin/assets/blocks_logic-D-QSzw95.js +1 -0
  18. package/admin/assets/blocks_number-D7JuNYsw.js +1 -0
  19. package/admin/assets/blocks_object-C9DzAlc7.js +1 -0
  20. package/admin/assets/blocks_procedures-BJMz6HWW.js +3 -0
  21. package/admin/assets/blocks_sendto-DRh7lk9o.js +5 -0
  22. package/admin/assets/{blocks_switch-DViYCmQd.js → blocks_switch-BfmboMex.js} +2 -2
  23. package/admin/assets/blocks_system-B-78JfAc.js +1 -0
  24. package/admin/assets/{blocks_text-BOvtHN2r.js → blocks_text-CGbR0Ozw.js} +1 -1
  25. package/admin/assets/blocks_time-5vS2geJg.js +1 -0
  26. package/admin/assets/blocks_timeout-BdaTywfN.js +1 -0
  27. package/admin/assets/{blocks_trigger-gwXvuAHV.js → blocks_trigger-D8kgHKbg.js} +2 -2
  28. package/admin/assets/blocks_words-BhHIf_1o.js +1 -0
  29. package/admin/assets/{cronHoverProvider-DjY3jLvQ.js → cronHoverProvider-DpgESCox.js} +1 -1
  30. package/admin/assets/{dist-D6o4h8Pd.js → dist-CaOsN0XW.js} +1 -1
  31. package/admin/assets/{field_cron-BMQWPb61.js → field_cron-B40zwSfJ.js} +1 -1
  32. package/admin/assets/{field_oid-BGIMv9gw.js → field_oid-KfoBnEM9.js} +1 -1
  33. package/admin/assets/{field_script-CdzYBCe6.js → field_script-yXhe1iCp.js} +1 -1
  34. package/admin/assets/helpers-B0ByElPJ.js +1 -0
  35. package/admin/assets/{hostInit-DBlZi_Kt.js → hostInit-9REPDUe7.js} +1 -1
  36. package/admin/assets/index-07o_WKsX.js +726 -0
  37. package/admin/assets/index-Z8Hkv58g.css +1 -0
  38. package/admin/assets/{inlineChatWidget-SDoyVtOR.js → inlineChatWidget-B9y_gQcH.js} +1 -1
  39. package/admin/assets/{inlineDiffController-CnHE3Rwd.js → inlineDiffController-C07CdIFo.js} +1 -1
  40. package/admin/assets/{mf-entry-bootstrap-0-a03ecebd.js → mf-entry-bootstrap-0-efcb49d3.js} +3 -2
  41. package/admin/assets/stateHoverProvider-CqeoOjXs.js +9 -0
  42. package/admin/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__iobroker_javascript__remoteEntry_js-BwSvIKEV.js +1 -0
  43. package/admin/custom/assets/Components-BCQTjBgm.js +1 -0
  44. package/admin/custom/assets/{_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1-DljJyQQg.js → _virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1-BuAc8OyX.js} +1 -1
  45. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-BGJv4zZP.js +1 -0
  46. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-BD2OkSge.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-B4E6MFJ4.js} +1 -1
  47. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-pM642JFd.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-aRlxyEhq.js} +86 -86
  48. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-DQwzYx75.js +1494 -0
  49. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__leaflet__loadShare__.js-h-rCw3iz.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__leaflet__loadShare__.js-n2zIPi0L.js} +1 -1
  50. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-xxszBNje.js +9 -0
  51. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__date_mf_2_fns__prebuild__-D5hqXJXI.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__date_mf_2_fns__prebuild__-Tq7tesSS.js} +1 -1
  52. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__leaflet__prebuild__-DARUoA03.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__leaflet__prebuild__-BeF0jEWM.js} +1 -1
  53. package/admin/custom/assets/{hostInit-0DGPuZTB.js → hostInit-CHwrowP4.js} +1 -1
  54. package/admin/custom/assets/{index-DcFI5r-g.js → index-Cm6xl9K4.js} +1 -1
  55. package/admin/custom/assets/{lib-BlUjuGH7.js → lib-bhrFL6jR.js} +1 -1
  56. package/admin/custom/assets/{mf-entry-bootstrap-0-efd847a6.js → mf-entry-bootstrap-0-f08941e2.js} +3 -2
  57. package/admin/custom/assets/{setYear-BaCcPbbI.js → setYear-DzTZ2h9A.js} +1 -1
  58. package/admin/custom/assets/virtualExposes-B5LJmnfO.js +1 -0
  59. package/admin/custom/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-ML-chjs6.js +1 -0
  60. package/admin/custom/assets/{virtual_mf-exposes___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-DPck7zEs.js → virtual_mf-exposes___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-C3ImybiM.js} +2 -2
  61. package/admin/custom/customComponents.js +12 -1
  62. package/admin/custom/i18n/de.json +11 -1
  63. package/admin/custom/i18n/en.json +11 -1
  64. package/admin/custom/i18n/es.json +11 -1
  65. package/admin/custom/i18n/fr.json +11 -1
  66. package/admin/custom/i18n/it.json +11 -1
  67. package/admin/custom/i18n/nl.json +11 -1
  68. package/admin/custom/i18n/pl.json +11 -1
  69. package/admin/custom/i18n/pt.json +11 -1
  70. package/admin/custom/i18n/ru.json +11 -1
  71. package/admin/custom/i18n/uk.json +11 -1
  72. package/admin/custom/i18n/zh-cn.json +11 -1
  73. package/admin/i18n/de.json +3 -0
  74. package/admin/i18n/en.json +3 -0
  75. package/admin/i18n/es.json +3 -0
  76. package/admin/i18n/fr.json +3 -0
  77. package/admin/i18n/it.json +3 -0
  78. package/admin/i18n/nl.json +3 -0
  79. package/admin/i18n/pl.json +3 -0
  80. package/admin/i18n/pt.json +3 -0
  81. package/admin/i18n/ru.json +3 -0
  82. package/admin/i18n/uk.json +3 -0
  83. package/admin/i18n/zh-cn.json +3 -0
  84. package/admin/jsonConfig.json +31 -0
  85. package/admin/mf-manifest.json +1 -1
  86. package/admin/mf-stats.json +1 -1
  87. package/admin/remoteEntry.js +12 -1
  88. package/admin/tab.html +6 -15
  89. package/build/lib/javascript.d.ts +48 -0
  90. package/build/lib/sandbox.js +2 -0
  91. package/build/lib/sandbox.js.map +1 -1
  92. package/build/lib/secrets.js +220 -0
  93. package/build/lib/secrets.js.map +1 -0
  94. package/build/main.js +51 -0
  95. package/build/main.js.map +1 -1
  96. package/build/types.d.ts +7 -0
  97. package/docs/en/blockly.md +29 -0
  98. package/docs/en/javascript.md +56 -0
  99. package/io-package.json +15 -14
  100. package/package.json +2 -2
  101. package/admin/assets/AiChatPanel-C4kuqP2U.js +0 -237
  102. package/admin/assets/AiScriptAnalyzer--BHML2rN.js +0 -9
  103. package/admin/assets/BlocklyEditor-BB77aFJI.js +0 -84
  104. package/admin/assets/ContextWrapper-C2yvd2Tn.css +0 -1
  105. package/admin/assets/ContextWrapper-W2H0z6zD.js +0 -136
  106. package/admin/assets/RulesEditor-ByjgEaVo.js +0 -1
  107. package/admin/assets/ScriptEditorVanillaMonaco-v12-gORS.js +0 -3
  108. package/admin/assets/Send-CChqR5Oy.js +0 -1
  109. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DuplUOZN.js +0 -1243
  110. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-JkwfVf8d.js +0 -9
  111. package/admin/assets/aiCodeLensProvider-BGvIu6hH.js +0 -4
  112. package/admin/assets/aiPromptBuilder-Bs27qOHT.js +0 -7
  113. package/admin/assets/blocklyDarkTheme-DEiAX5DT.js +0 -1
  114. package/admin/assets/blocks_action-CvnOHXwt.js +0 -1
  115. package/admin/assets/blocks_logic-B33Pypxr.js +0 -1
  116. package/admin/assets/blocks_number-k2IjE7OH.js +0 -1
  117. package/admin/assets/blocks_object-B64vSfel.js +0 -1
  118. package/admin/assets/blocks_procedures-BpvNI5dO.js +0 -3
  119. package/admin/assets/blocks_sendto-pwZchfe0.js +0 -5
  120. package/admin/assets/blocks_system-BZZcGqTJ.js +0 -1
  121. package/admin/assets/blocks_time-BH2F-ylT.js +0 -1
  122. package/admin/assets/blocks_timeout-C3BoW4XJ.js +0 -1
  123. package/admin/assets/blocks_words-D8PL_nSE.js +0 -1
  124. package/admin/assets/helpers-Crmcgphg.js +0 -1
  125. package/admin/assets/index-BHhhebRG.css +0 -1
  126. package/admin/assets/index-BvPVHv3P.js +0 -192
  127. package/admin/assets/javascript-DVIhlTDr.js +0 -218
  128. package/admin/assets/mjs-Bh7xFIpd.js +0 -90
  129. package/admin/assets/stateHoverProvider-D0iXo6YF.js +0 -9
  130. package/admin/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__iobroker_javascript__remoteEntry_js-DYEYnOkt.js +0 -1
  131. package/admin/custom/assets/Components-CuFt9lAY.js +0 -1
  132. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-D0M1SjIE.js +0 -1
  133. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-BLelmJ7Y.js +0 -1494
  134. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-BGiB1l5e.js +0 -9
  135. package/admin/custom/assets/virtualExposes-DGxNcyb6.js +0 -1
  136. package/admin/custom/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-DVNwFcUr.js +0 -1
package/build/types.d.ts CHANGED
@@ -7,6 +7,7 @@ import type { Scheduler, SchedulerRule } from './lib/scheduler';
7
7
  import type { EventObj } from './lib/eventObj';
8
8
  import type { PatternEventCompareFunction } from './lib/patternCompareFunctions';
9
9
  import type { AstroEvent } from './lib/consts';
10
+ import type { Secrets } from './lib/secrets';
10
11
 
11
12
  /** ECMAScript version the user scripts are compiled for */
12
13
  export type TsTarget = 'es2018' | 'es2019' | 'es2020' | 'es2021' | 'es2022' | 'es2023' | 'es2024' | 'es2025' | 'esnext';
@@ -23,6 +24,8 @@ export interface JavaScriptAdapterConfig {
23
24
  enableSetObject: boolean;
24
25
  enableSendToHost: boolean;
25
26
  enableExec: boolean;
27
+ /** Scripts may read the central ioBroker credential store via the global `SECRETS` object */
28
+ enableSecrets?: boolean;
26
29
  libraries: string;
27
30
  libraryTypings: string;
28
31
  subscribe: boolean;
@@ -206,6 +209,8 @@ export type SandboxType = {
206
209
  scriptName: string;
207
210
  instance: number;
208
211
  defaultDataDir: string;
212
+ /** Decrypted credentials of the central ioBroker credential store, e.g. `SECRETS.CameraPassword.key` */
213
+ SECRETS: Secrets;
209
214
  verbose: boolean | undefined;
210
215
  exports: Record<string, any>;
211
216
  require: (md: string) => any;
@@ -799,4 +804,6 @@ export interface JavascriptContext {
799
804
  logWithLineInfo: (message: string) => void;
800
805
  schedules?: string[];
801
806
  allowSelfSignedCerts: boolean;
807
+ /** Decrypted credentials of the central ioBroker credential store, exposed to the scripts as `SECRETS` */
808
+ secrets: Secrets;
802
809
  }
@@ -16,6 +16,8 @@
16
16
  - [Create state](#create-state)
17
17
  - [Get value of state](#get-value-of-state)
18
18
  - [Get Object ID](#get-object-id)
19
+ - [State exists](#state-exists)
20
+ - [Credential](#credential)
19
21
  - [Actions Blocks](#actions-blocks)
20
22
  - [Exec - execute](#exec---execute)
21
23
  - [request URL](#request-url)
@@ -793,6 +795,33 @@ if ((await existsStateAsync('zigbee.0.187a3efffee9e4e8.load_power'))) {
793
795
 
794
796
  **Note:** With the adapter setting *"Do not subscribe to all states on start"* enabled, `existsState` cannot be evaluated synchronously. The block emits the async form (`await existsStateAsync(...)`), so it works correctly in both modes.
795
797
 
798
+ ### Credential
799
+
800
+ Reads one field of the central credential storage, which is managed in the admin under
801
+ **Basic settings** -> **Credentials**. The secret fields are stored encrypted; the block hands the
802
+ decrypted value to the script, so a password never has to be written into a script.
803
+
804
+ The first dropdown lists the credentials that exist, the second one the fields of the selected
805
+ credential — a credential has either a single **key** (API keys, passwords) or a **login** and a
806
+ **password**. If the instance is not running while the editor is open, the credential list is
807
+ unknown and the name is typed in instead.
808
+
809
+ ```
810
+ Send to telegram [credential [CameraPassword] field [key]]
811
+ ```
812
+
813
+ The generated JavaScript is:
814
+
815
+ ```javascript
816
+ sendTo('telegram.0', SECRETS['CameraPassword']?.key);
817
+ ```
818
+
819
+ The value is always current — editing a credential in the admin takes effect immediately, without
820
+ restarting the script. A credential that was deleted yields `undefined` instead of an error.
821
+
822
+ **Note:** The instance setting *"Allow scripts to read the credentials"* switches this off. `SECRETS`
823
+ is then empty and the block returns `undefined`.
824
+
796
825
  ## Actions Blocks
797
826
 
798
827
  ### Exec - execute
@@ -75,6 +75,7 @@
75
75
  - [isScriptActive](#isscriptactive)
76
76
  - [name](#scriptName)
77
77
  - [instance](#instance)
78
+ - [SECRETS](#secrets)
78
79
  - [messageTo](#messageto)
79
80
  - [messageToAsync](#messagetoasync)
80
81
  - [onMessage](#onmessage)
@@ -2080,6 +2081,61 @@ if (verbose) {
2080
2081
  }
2081
2082
  ```
2082
2083
 
2084
+ ### SECRETS
2085
+ `SECRETS` - The credentials of the central ioBroker credential storage.
2086
+
2087
+ The credentials are managed in the admin UI under **Basic settings** -> **Credentials**. Every credential
2088
+ has an ID (like `CameraPassword`) and holds either a single **key** (e.g. an API key or a password) or a
2089
+ **login**/**password** pair. The secret fields are stored encrypted with the system secret and are handed
2090
+ to the scripts already decrypted:
2091
+
2092
+ ```js
2093
+ // credential of the type "key"
2094
+ httpGet(`http://camera.local/snapshot?password=${SECRETS.CameraPassword.key}`, (err, result) => {
2095
+ // ...
2096
+ });
2097
+
2098
+ // credential of the type "login"
2099
+ log(`Mail account: ${SECRETS.MyMailAccount.login} / ${SECRETS.MyMailAccount.password}`);
2100
+
2101
+ // credential IDs that are no valid variable names
2102
+ log(SECRETS['My camera'].key);
2103
+ ```
2104
+
2105
+ `SECRETS` is read-only and always up to date: if a credential is added, changed or deleted in the admin UI,
2106
+ the new value is used immediately - neither the adapter nor the script must be restarted.
2107
+
2108
+ If a credential does not exist, `undefined` is returned:
2109
+
2110
+ ```js
2111
+ if (SECRETS.CameraPassword) {
2112
+ log('The camera password is defined');
2113
+ }
2114
+ ```
2115
+
2116
+ #### Which fields does a credential have?
2117
+
2118
+ Every credential has either a single `key` or a `login`/`password` pair. Three ways to find out which:
2119
+
2120
+ - In the instance settings of the JavaScript adapter, the section **Available credentials** lists every
2121
+ credential with its fields and the ready-to-copy expression.
2122
+ - In the editor, the auto-completion after `SECRETS.` offers the credentials that exist, and after the
2123
+ next dot exactly the fields that credential has.
2124
+ - In a script:
2125
+
2126
+ ```js
2127
+ log(JSON.stringify(Object.keys(SECRETS.CameraPassword))); // ["key"]
2128
+ log(JSON.stringify(Object.keys(SECRETS.MyMailAccount))); // ["login","password"]
2129
+ ```
2130
+
2131
+ Blockly has a **credential** block for the same purpose - see the
2132
+ [Blockly documentation](blockly.md#credential).
2133
+
2134
+ The access can be switched off with the instance option **Allow scripts to read the credentials**.
2135
+ `SECRETS` is then empty and a warning is written to the log.
2136
+
2137
+ **Note:** this requires js-controller 7.2 or newer.
2138
+
2083
2139
  ## Option - "Do not subscribe all states on start"
2084
2140
  There are two modes of subscribing to states:
2085
2141
 
package/io-package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "javascript",
4
- "version": "10.1.0",
4
+ "version": "10.1.1",
5
5
  "blockedVersions": [
6
6
  "8.0.0",
7
7
  "8.0.1"
@@ -40,6 +40,19 @@
40
40
  "Matthias Kleine <info@haus-automatisierung.com>"
41
41
  ],
42
42
  "news": {
43
+ "10.1.1": {
44
+ "en": "The credentials of the central storage (Basic settings -> Credentials) are available in the scripts as `SECRETS`, e.g. `SECRETS.CameraPassword.key`. The values are decrypted, read-only and are updated live when a credential is edited in the admin UI\nThe editor knows the credentials that exist: after `SECRETS.` it offers their names, and after the next dot exactly the fields the selected credential has\nAdded the Blockly block \"credential\", which reads one field of the central credential storage\nThe instance settings list the available credentials with their fields and the expression a script uses for them",
45
+ "de": "Die Zugangsdaten für den zentralen Speicher (Grundeinstellungen → Zugangsdaten) sind in den Skripten als `SECRETS` verfügbar, z. B. `SECRETS.CameraPassword.key`. Die Werte sind entschlüsselt, schreibgeschützt und werden live aktualisiert, sobald ein Zugangsdatum in der Admin-Oberfläche bearbeitet wird.\nDer Editor kennt die vorhandenen Zugangsdaten: Nach `SECRETS.` werden deren Namen angezeigt, und nach dem nächsten Punkt genau die Felder, die die ausgewählten Zugangsdaten enthalten.\nDer Blockly-Block „credential“ wurde hinzugefügt, der ein Feld des zentralen Anmeldeinformationsspeichers ausliest.\nDie Instanzeinstellungen listen die verfügbaren Anmeldeinformationen mit ihren Feldern und dem Ausdruck auf, den ein Skript dafür verwendet.",
46
+ "ru": "Учетные данные центрального хранилища (Основные настройки -> Учетные данные) доступны в скриптах как `SECRETS`, например, `SECRETS.CameraPassword.key`. Значения расшифрованы, доступны только для чтения и обновляются в режиме реального времени при редактировании учетных данных в административном интерфейсе.\nРедактор знает существующие учетные данные: после `SECRETS.` он отображает их названия, а после следующей точки — точное описание полей, которыми обладают выбранные учетные данные.\nДобавлен блок Blockly \"учетные данные\", который считывает одно поле из центрального хранилища учетных данных.\nВ параметрах экземпляра отображаются доступные учетные данные с указанием их полей и выражения, используемого скриптом для их обработки.",
47
+ "pt": "As credenciais do armazenamento central (Configurações básicas -> Credenciais) estão disponíveis nos scripts como `SECRETS`, por exemplo, `SECRETS.CameraPassword.key`. Os valores são descriptografados, somente leitura e atualizados em tempo real quando uma credencial é editada na interface administrativa.\nO editor conhece as credenciais existentes: após `SECRETS.`, ele exibe os nomes delas e, após o ponto seguinte, exatamente os campos que a credencial selecionada possui.\nAdicionado o bloco Blockly \"credential\", que lê um campo do armazenamento central de credenciais.\nAs configurações da instância listam as credenciais disponíveis com seus respectivos campos e a expressão que um script utiliza para elas.",
48
+ "nl": "De inloggegevens voor de centrale opslag (Basisinstellingen -> Inloggegevens) zijn beschikbaar in de scripts als `SECRETS`, bijvoorbeeld `SECRETS.CameraPassword.key`. De waarden zijn onversleuteld, alleen-lezen en worden live bijgewerkt wanneer een inloggegeven wordt bewerkt in de beheerdersinterface.\nDe editor kent de bestaande inloggegevens: na `SECRETS.` worden de namen weergegeven, en na de volgende punt worden precies de velden vermeld die de geselecteerde inloggegevens bevatten.\nHet Blockly-blok \"credential\" is toegevoegd, dat één veld uit de centrale opslag voor inloggegevens leest.\nDe instantie-instellingen tonen de beschikbare referenties met hun velden en de expressie die een script hiervoor gebruikt.",
49
+ "fr": "Les identifiants du stockage central (Paramètres de base -> Identifiants) sont disponibles dans les scripts sous le nom `SECRETS`, par exemple `SECRETS.CameraPassword.key`. Ces valeurs sont déchiffrées, en lecture seule et mises à jour en temps réel lorsqu'un identifiant est modifié dans l'interface d'administration.\nL'éditeur connaît les identifiants existants : après `SECRETS.`, il affiche leurs noms, et après le point suivant, les champs exacts de l'identifiant sélectionné.\nAjout du bloc Blockly « credential », qui lit un champ du stockage central des identifiants.\nLes paramètres de l'instance listent les informations d'identification disponibles, leurs champs et l'expression utilisée par un script pour celles-ci.",
50
+ "it": "Le credenziali dell'archivio centrale (Impostazioni di base -> Credenziali) sono disponibili negli script come `SECRETS`, ad esempio `SECRETS.CameraPassword.key`. I valori sono decrittografati, di sola lettura e vengono aggiornati in tempo reale quando una credenziale viene modificata nell'interfaccia di amministrazione.\nL'editor conosce le credenziali esistenti: dopo `SECRETS.` ne mostra i nomi e dopo il punto successivo esattamente i campi che la credenziale selezionata ha\nAggiunto il blocco Blockly \"credential\", che legge un campo dell'archivio centrale delle credenziali.\nLe impostazioni dell'istanza elencano le credenziali disponibili con i relativi campi e l'espressione che uno script utilizza per esse.",
51
+ "es": "Las credenciales del almacenamiento central (Configuración básica -> Credenciales) están disponibles en los scripts como `SECRETS`, por ejemplo, `SECRETS.CameraPassword.key`. Los valores están descifrados, son de solo lectura y se actualizan en tiempo real cuando se edita una credencial en la interfaz de administración.\nEl editor conoce las credenciales existentes: después de `SECRETS.` ofrece sus nombres, y después del siguiente punto exactamente los campos que tiene la credencial seleccionada.\nSe agregó el bloque Blockly \"credential\", que lee un campo del almacenamiento central de credenciales.\nLa configuración de la instancia enumera las credenciales disponibles con sus campos y la expresión que un script utiliza para ellas.",
52
+ "pl": "Dane uwierzytelniające centralnego magazynu (Ustawienia podstawowe -> Dane uwierzytelniające) są dostępne w skryptach jako `SECRETS`, np. `SECRETS.CameraPassword.key`. Wartości są odszyfrowywane, tylko do odczytu i aktualizowane na bieżąco podczas edycji danych uwierzytelniających w interfejsie administratora.\nEdytor zna istniejące dane uwierzytelniające: po poleceniu „SECRETS.” podaje ich nazwy, a po kolejnej kropce dokładnie pola, w których znajdują się wybrane dane uwierzytelniające.\nDodano blok Blockly „poświadczenia”, który odczytuje jedno pole centralnego magazynu poświadczeń\nUstawienia instancji zawierają listę dostępnych poświadczeń wraz z ich polami i wyrażeniem używanym przez skrypt w ich przypadku",
53
+ "uk": "Облікові дані центрального сховища (Основні налаштування -> Облікові дані) доступні у скриптах як `SECRETS`, наприклад, `SECRETS.CameraPassword.key`. Значення розшифровуються, доступні лише для читання та оновлюються в режимі реального часу під час редагування облікових даних в інтерфейсі адміністратора.\nРедактор знає наявні облікові дані: після `SECRETS.` він пропонує їхні імена, а після наступної крапки точно поля, які мають вибрані облікові дані.\nДодано блок Blockly \"credential\", який зчитує одне поле центрального сховища облікових даних.\nУ налаштуваннях екземпляра перелічено доступні облікові дані з їхніми полями та виразом, який використовує для них скрипт.",
54
+ "zh-cn": "中央存储的凭据(基本设置 -> 凭据)在脚本中以 `SECRETS` 的形式提供,例如 `SECRETS.CameraPassword.key`。这些值已解密,为只读,并在管理员界面编辑凭据时实时更新。\n编辑器知道存在的凭据:在“SECRETS.”之后,它会显示凭据的名称;在下一个点之后,它会显示所选凭据包含的具体字段。\n新增了 Blockly 代码块“credential”,该代码块读取中央凭证存储中的一个字段。\n实例设置列出了可用的凭据及其字段,以及脚本用于这些凭据的表达式。"
55
+ },
43
56
  "10.1.0": {
44
57
  "en": "Turned `strict` off again for the scripts, as TypeScript 6 enables it by default\nAdded the tab \"TypeScript\" to the settings, where the compiler options for the scripts can be configured\nAdded snapshot tests for the Blockly code generation (`npm run test:blockly`)\nRemoved two leftover `.only` markers that had disabled almost the whole test suite\nPinned the line endings of transformed TypeScript sources to LF, so a compiler update cannot rewrite every script\nMoved the micro benchmarks into `npm run test:performance`, as they measure relative speed against timeouts and cannot block a build\nUpdated Blockly from 11.1.1 to 13.2.1. The generated code is unchanged\n`updateBlockly.js` now copies from the installed npm package instead of cloning the git master branch, so the shipped Blockly version is reproducible\nBlockly is now bundled from the npm package instead of being loaded as vendored script tags. Custom blocks of other adapters keep working unchanged\nRemoved 828 kB of vendored Blockly code from the repository\nConverted all block definitions from JavaScript to TypeScript. The generated code is unchanged\nFixed the object blocks under Blockly 13: the attribute rows were no longer right-aligned, and editing the attributes of an \"object\" block threw\nDropped the dead field editor code of the CRON and script fields, which had been written against Blockly 1.x\nFixed the multi-and/multi-or blocks under Blockly 13, which threw when their conditions were edited\nRemoved a phantom block type \"Convert\" that a stray assignment in the conversion blocks had registered\nAdded `BLOCKLY_TS.md` for adapter developers: what Blockly 13 changed for custom blocks and how to write them in TypeScript\nMoved the Blockly translations into `words.json` and typed the lookup helpers\nRedesign of Rules\nAdded a wizard to the rule editor that builds a rule step by step - trigger, condition and action are configured in place, and the last step shows the finished rule\nThe wizard opens by itself for a newly created rule - once, and not for a duplicated one. Afterwards it stays available in the block palette\nFixed the type declarations of 3rd party libraries: they were placed under the name the library has on disk while their `package.json` went to the name the scripts import, so TypeScript never connected the two and everything imported from such a library was `any` (#2341)\nStopped wrapping a library's declarations in `declare module`, which cut a barrel file off from what it re-exports. Declarations that are not a module themselves are still wrapped\nFixed following the imports inside a declaration file: only the first import of a file was followed, and only if it was on the first line. For rxjs 6 that loaded 6 of its ~800 declaration files\nSide effect imports (`import \"./x\";`) inside a declaration file are now followed as well. `@iobroker/types` consists of nothing else, so the `ioBroker.*` types were missing in scripts and in the editor\nA definition file that cannot be read no longer discards all type declarations of its package\nAdded regression tests for the type declarations of 3rd party libraries, which compile against them and insist that wrong code is rejected\n`createState` now stringifies `common.def` of an object, json or array state, as js-controller expects it and as `setState` already does with the value. Creating such a state with an initial value no longer warns \"Default value has to be stringified\" (#2307)\nDocumented that an object in the second position of `createState` is always the `common`, and how to give a state a non-primitive initial value\nRestored the check of the mirror path in the instance configuration. It was lost when the admin configuration moved to `jsonConfig.json`, so a forbidden path was accepted without a word and only refused later in the log (#2296)\nThe mirror path field now explains what the directory has to be, and suggests one\nScripts are no longer deleted from the database when the mirror directory as a whole becomes unreachable, e.g. because a share is not mounted\nLibraries that name their declarations through an `exports` map are typed now. Their legacy `types` field is often a stub pointing at a file that does not exist - rxjs 7 is one - which left everything imported from them as `any` (#928)\nThe declarations of a library are laid out around its entry point, so `moduleResolution: node10` finds it even when they live in a subdirectory\nThe manifest handed to TypeScript describes that layout instead of the one on disk. An `exports` map pointing at paths that do not exist there made TypeScript refuse the library altogether\nThe package.json of a library is read from disk instead of through Node, which refuses it when the library does not export it\nFixed the mirror tests on macOS. They asserted on the first event a watcher reported, while `fs.watch` there works at directory granularity and sends an event for the watched directory before the one for the file. They now wait for the change they are about, and say what arrived instead if it never comes\nMade the mirror tests independent of how long a watch takes to arm. The change under test is repeated while waiting, so it cannot be made before the watcher is listening - the same commit produced a green and a red macOS job over that",
45
58
  "de": "Ich habe `strict` für die Skripte wieder deaktiviert, da TypeScript 6 es standardmäßig aktiviert.\nDen Einstellungen wurde der Tab „TypeScript“ hinzugefügt, über den die Compileroptionen für die Skripte konfiguriert werden können.\nSnapshot-Tests für die Blockly-Codegenerierung hinzugefügt (`npm run test:blockly`)\nZwei überflüssige `.only`-Markierungen wurden entfernt, die fast die gesamte Testsuite deaktiviert hatten.\nDie Zeilenumbrüche der transformierten TypeScript-Quelltexte wurden auf LF fixiert, sodass ein Compiler-Update nicht jedes Skript überschreiben kann.\nDie Mikro-Benchmarks wurden in `npm run test:performance` verschoben, da sie die relative Geschwindigkeit im Vergleich zu Timeouts messen und einen Build nicht blockieren können.\nBlockly wurde von Version 11.1.1 auf 13.2.1 aktualisiert. Der generierte Code ist unverändert.\n`updateBlockly.js` kopiert nun vom installierten npm-Paket, anstatt den Git-Master-Branch zu klonen, sodass die ausgelieferte Blockly-Version reproduzierbar ist.\nBlockly ist jetzt im npm-Paket enthalten und wird nicht mehr als Skript-Tag geladen. Benutzerdefinierte Blöcke anderer Adapter funktionieren weiterhin unverändert.\n828 kB an mitgeliefertem Blockly-Code wurden aus dem Repository entfernt.\nAlle Blockdefinitionen wurden von JavaScript nach TypeScript konvertiert. Der generierte Code ist unverändert.\nDie Objektblöcke unter Blockly 13 wurden korrigiert: Die Attributzeilen waren nicht mehr rechtsbündig, und das Bearbeiten der Attribute eines „Objekt“-Blocks führte zu einem Fehler.\nDer veraltete Code des Feldeditors für die CRON- und Skriptfelder, der für Blockly 1.x geschrieben worden war, wurde entfernt.\nDie Fehler in den Mehrfach-UND-/Mehrfach-ODER-Blöcken unter Blockly 13, die beim Bearbeiten ihrer Bedingungen zu Problemen führten, wurden behoben.\nEin Phantomblock vom Typ „Konvertieren“, der durch eine fehlerhafte Zuweisung in den Konvertierungsblöcken registriert worden war, wurde entfernt.\nDie Datei `BLOCKLY_TS.md` wurde für Adapterentwickler hinzugefügt: Sie beschreibt die Änderungen in Blockly 13 für benutzerdefinierte Blöcke und wie diese in TypeScript geschrieben werden.\nDie Blockly-Übersetzungen wurden in `words.json` verschoben und die Suchhilfen eingegeben.\nNeugestaltung der Regeln\nDem Regeleditor wurde ein Assistent hinzugefügt, der eine Regel Schritt für Schritt erstellt – Auslöser, Bedingung und Aktion werden direkt konfiguriert, und der letzte Schritt zeigt die fertige Regel an.\nDer Assistent öffnet sich automatisch für eine neu erstellte Regel – einmalig, nicht jedoch für eine duplizierte. Anschließend bleibt er in der Blockpalette verfügbar.\nDie Typdeklarationen von Drittanbieterbibliotheken wurden korrigiert: Sie wurden unter dem Namen abgelegt, den die Bibliothek auf der Festplatte hat, während ihre `package.json` den Namen trug, den die Skripte importieren. Daher konnte TypeScript die beiden nie miteinander verknüpfen, und alles, was aus einer solchen Bibliothek importiert wurde, war `any` (#2341).\nDie Deklarationen einer Bibliothek werden nicht mehr in `declare module` eingeschlossen, wodurch eine Barrel-Datei von ihren Exporten abgeschnitten wurde. Deklarationen, die selbst kein Modul sind, werden weiterhin eingeschlossen.\nDas Problem mit den Importen innerhalb einer Deklarationsdatei wurde behoben: Es wurde nur der erste Import einer Datei berücksichtigt, und zwar nur dann, wenn er in der ersten Zeile stand. Dies betraf rxjs 6, das 6 seiner ca. 800 Deklarationsdateien lud.\nImporte mit Seiteneffekten (`import \"./x\";`) innerhalb einer Deklarationsdatei werden nun ebenfalls berücksichtigt. `@iobroker/types` enthält nichts anderes, daher fehlten die `ioBroker.*`-Typen in Skripten und im Editor.\nEine nicht lesbare Definitionsdatei verwirft nicht mehr alle Typdeklarationen ihres Pakets.\nEs wurden Regressionstests für die Typdeklarationen von Drittanbieterbibliotheken hinzugefügt, die gegen diese kompilieren und darauf bestehen, dass fehlerhafter Code zurückgewiesen wird.\n`createState` wandelt nun den `common.def`-Wert eines Objekts, JSON- oder Array-Zustands in einen String um, wie es js-controller erwartet und wie `setState` es bereits mit dem Wert tut. Das Erstellen eines solchen Zustands mit einem Anfangswert führt nicht mehr zu der Warnung „Standardwert muss in einen String umgewandelt werden“ (#2307).\nEs wurde dokumentiert, dass ein Objekt an der zweiten Position von `createState` immer das `common` ist, und wie man einem Zustand einen nicht-primitiven Anfangswert zuweist.\nDie Überprüfung des Spiegelpfads in der Instanzkonfiguration wurde wiederhergestellt. Sie war verloren gegangen, als die Administratorkonfiguration in die Datei `jsonConfig.json` verschoben wurde, sodass ein verbotener Pfad zunächst ohne Fehlermeldung akzeptiert und erst später im Protokoll als ungültig gemeldet wurde (#2296).\nDas Feld „Spiegelpfad“ erklärt nun, welches Verzeichnis verwendet werden muss, und schlägt eines vor.\nSkripte werden nicht mehr aus der Datenbank gelöscht, wenn das gesamte Spiegelverzeichnis nicht mehr erreichbar ist, z. B. weil eine Freigabe nicht eingebunden ist.\nBibliotheken, die ihre Deklarationen über eine `exports`-Map benennen, sind jetzt typisiert. Ihr veraltetes `types`-Feld ist oft ein Platzhalter, der auf eine nicht existierende Datei verweist – rxjs 7 ist ein Beispiel dafür –, wodurch alles, was von ihnen importiert wird, als `any` (#928) zurückbleibt.\nDie Deklarationen einer Bibliothek sind um ihren Einstiegspunkt herum angeordnet, sodass `moduleResolution: node10` sie auch dann findet, wenn sie sich in einem Unterverzeichnis befinden.\nDas an TypeScript übergebene Manifest beschreibt dieses Layout anstelle des auf der Festplatte befindlichen. Eine `exports`-Map, die auf nicht existierende Pfade verweist, führte dazu, dass TypeScript die Bibliothek vollständig ablehnte.\nDie package.json einer Bibliothek wird von der Festplatte gelesen, anstatt über Node.js, das sie ablehnt, wenn die Bibliothek sie nicht exportiert.\nDie Spiegeltests unter macOS wurden korrigiert. Sie prüften das erste vom Watcher gemeldete Ereignis, während `fs.watch` dort auf Verzeichnisebene arbeitet und ein Ereignis für das überwachte Verzeichnis vor dem für die Datei sendet. Sie warten nun auf die betreffende Änderung und geben das Ergebnis aus, falls diese nicht eintritt.\nDie Spiegeltests wurden unabhängig von der Aktivierungszeit der Watch durchgeführt. Die zu testende Änderung wird während des Wartens wiederholt und kann daher erst erfolgen, nachdem die Watch aktiv ist – derselbe Commit erzeugte sowohl einen grünen als auch einen roten macOS-Job.",
@@ -117,19 +130,6 @@
117
130
  "pl": "Optymalizacja wykonania\nDodano na myszce nad wartością stanu",
118
131
  "uk": "Оптимізація продуктивності\nДодано на мишу над значенням держави",
119
132
  "zh-cn": "业绩优化\n在鼠标上大于状态值"
120
- },
121
- "9.2.2": {
122
- "en": "Fix: AI chat mode tooltip no longer covers the dropdown options (issue #2201) — moved tooltip to the left of the selector\nClarified the AI chat mode descriptions in the tooltip: Agent is for larger models with tool support and handles both analysis and script creation, Code is for smaller models without tool support (uses two-step plan-then-code) — translations updated in all 11 languages\nAdded the \"is state exists\" block to blockly",
123
- "de": "Fix: AI-Chat-Modus-Tooltip nicht mehr deckt die Dropdown-Optionen (Ausgabe #2201) - verschoben Tooltip auf die linke Seite des Selektors\nKI-Chat-Modus Beschreibungen im Tooltip: Agent ist für größere Modelle mit Werkzeugunterstützung und behandelt sowohl Analyse als auch Skript-Erstellung, Code ist für kleinere Modelle ohne Werkzeugunterstützung (verwendet zweistufigen Plan-then-Code) — Übersetzungen aktualisiert in allen 11 Sprachen\nDer \"is state exist\" Block wurde blockweise hinzugefügt",
124
- "ru": "Исправление: инструментарий режима чата AI больше не покрывает выпадающие опции (выпуск #2201) — перемещаемый инструментарий слева от селектора\nУточнено описание режима чата ИИ в подсказке: Агент предназначен для более крупных моделей с поддержкой инструментов и обрабатывает как анализ, так и создание сценариев, Код предназначен для более мелких моделей без поддержки инструментов (использует двухэтапный план-тогда-код) — переводы обновлены на всех 11 языках\nДобавлен блок «существует государство» для блокировки",
125
- "pt": "Corrigir: A dica do modo de bate-papo de IA não cobre mais as opções suspensas (questão # 2201) — moveu a dica para a esquerda do seletor\nClarified the AI chat mode descriptions in the tooltip: Agent is for major models with tool support and hands both analysis and script creation, Code is for minor models without toool support (uses two-step plan-then-code) — translations updated in all 11 languages\nAdicionado o bloco \"is state existe\" para bloquear",
126
- "nl": "Fix: AI chat mode tooltip heeft geen betrekking meer op de dropdown opties (issue #2201)\nVerduidelijkt de AI chat mode beschrijvingen in de tooltip: Agent is voor grotere modellen met hulpmiddel ondersteuning en behandelt zowel analyse als script creatie, Code is voor kleinere modellen zonder hulpmiddel ondersteuning (gebruikt twee-stap plan-dan-code) Vertalingen bijgewerkt in alle 11 talen\nToegevoegd de \"is status bestaat\" blok te blokkeren",
127
- "fr": "Correction : l'outil en mode chat AI ne couvre plus les options déroulantes (numéro #2201) — l'outil déplacé à gauche du sélecteur\nClarifié les descriptions des modes de chat AI dans l'infobulle : Agent est pour les modèles plus grands avec support d'outil et gère à la fois l'analyse et la création de script, Code est pour les modèles plus petits sans support d'outil (utilise le plan en deux étapes - puis-code) — traductions mises à jour dans les 11 langues\nAjout du bloc « is state exists » pour bloquer",
128
- "it": "Fix: AI chat mode tooltip non copre più le opzioni di discesa (problema #2201) — spostato tooltip a sinistra del selettore\nClarified le descrizioni della modalità di chat AI nel tooltip: L'agente è per i modelli più grandi con supporto degli strumenti e gestisce sia l'analisi che la creazione di script, il codice è per i modelli più piccoli senza supporto degli strumenti (utilizza il codice a due passi) — le traduzioni aggiornate in tutte le 11 lingue\nAggiunto il blocco \"è stato esiste\" per bloccare",
129
- "es": "Fijación: El uso de herramientas de modo de chat AI ya no cubre las opciones desplegables (sue #2201) — mover la punta de la herramienta a la izquierda del selector\nClarified the AI chat mode descriptions in the tooltip: Agent is for larger models with tool support and handles both analysis and script creation, Code is for smaller models without tool support (uses two-step plan-then-code) — translations updated in all 11 languages\nAñadido el bloque \"es estado existe\" para bloquear",
130
- "pl": "Fix: AI chat mode tooltip już nie obejmuje opcji Dropdown (issue # 2201) - przesunięty podpowiedź po lewej stronie selektora\nWyjaśnienie opisów trybu rozmowy AI w podpowiedzi: Agent jest dla większych modeli z obsługą narzędzi i obsługuje zarówno analizy i tworzenia skryptów, Kod jest dla mniejszych modeli bez obsługi narzędzia (używa dwustopniowej plan- theen- code) - tłumaczenia zaktualizowane we wszystkich 11 językach\nDodano blokadę \"is state istnieje\"",
131
- "uk": "Виправлення: Інструментарій режимів AI не більше охоплює параметри випадання (видання #2201) — пересувний інструмент для ліворуч від selector\nНаведено описи режиму AI чату в інструменті: Агент призначений для збільшення моделей з підтримкою інструментів і ручками як аналізу, так і для створення сценаріїв, Код є для менших моделей без підтримки інструменту ( використовує двокроковий план-фін-код) — переклади, оновлено у всіх 11 мовах\nДодано блок-блок \"is State існує\"",
132
- "zh-cn": "固定:AI聊天模式工具提示不再覆盖下拉选项(问题#2201)——移动工具提示到选择器左侧\n整理工具提示中的 AI 聊天模式描述 : Agent 用于具有工具支持的较大模型,并同时处理分析和脚本创建, Code 用于没有工具支持的较小模型(使用双步计划-当时的代码)——所有11种语言的翻译更新\n添加“ 状态存在” 块以阻断"
133
133
  }
134
134
  },
135
135
  "platform": "Javascript/Node.js",
@@ -525,6 +525,7 @@
525
525
  "enableSetObject": false,
526
526
  "enableSendToHost": false,
527
527
  "enableExec": false,
528
+ "enableSecrets": true,
528
529
  "libraries": "",
529
530
  "libraryTypings": "",
530
531
  "subscribe": false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.javascript",
3
- "version": "10.1.0",
3
+ "version": "10.1.1",
4
4
  "description": "Rules Engine for ioBroker",
5
5
  "author": "bluefox <dogafox@gmail.com>",
6
6
  "contributors": [
@@ -67,7 +67,7 @@
67
67
  "@iobroker/eslint-config": "^2.3.4",
68
68
  "@iobroker/plugin-sentry": "^3.2.0",
69
69
  "@iobroker/testing": "^5.3.0",
70
- "@tsconfig/node22": "^22.0.5",
70
+ "@tsconfig/node22": "^22.0.6",
71
71
  "@types/node-schedule": "^2.1.8",
72
72
  "@types/nodemailer": "^8.0.1",
73
73
  "@types/request": "^2.48.13",