iobroker.javascript 10.1.1 → 10.1.3

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 (90) hide show
  1. package/README.md +21 -6
  2. package/admin/assets/{AiChatPanel-C_WbKMGX.js → AiChatPanel-rQsCR89v.js} +11 -11
  3. package/admin/assets/AiDiffView-BoglEOaq.js +1 -0
  4. package/admin/assets/{Debugger-DAdJnEhw.js → Debugger-Bj4PsKNm.js} +4 -4
  5. package/admin/assets/Error-RANTMuGx.js +1 -0
  6. package/admin/assets/Import-CJgQwwNY.js +1 -0
  7. package/admin/assets/RulesEditor-BcGsf9n4.css +1 -0
  8. package/admin/assets/RulesEditor-PYpUIg7N.js +1 -0
  9. package/admin/assets/{ScriptEditor-CZSc7rwE.js → ScriptEditor-C6ekGK_v.js} +2 -2
  10. package/admin/assets/{ScriptEditorVanillaMonaco-DEKg14_A.js → ScriptEditorVanillaMonaco-BzazJaUa.js} +3 -3
  11. package/admin/assets/{_virtual_mf-localSharedImportMap___mfe_internal__iobroker_javascript__mf_owner__1-DPmwd_G2.js → _virtual_mf-localSharedImportMap___mfe_internal__iobroker_javascript__mf_owner__1-CL_S1FIh.js} +1 -1
  12. 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 → _virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-BAOcdAz5.js} +92 -92
  13. 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 → _virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-DdX5BXjB.js} +1 -1
  14. package/admin/assets/aiPromptBuilder-a2bvj40X.js +1 -0
  15. package/admin/assets/blocks_action-CaHoI2vK.js +1 -0
  16. package/admin/assets/{blocks_convert-CX0i-JfS.js → blocks_convert-Dno4Uyat.js} +2 -2
  17. package/admin/assets/{blocks_logic-D-QSzw95.js → blocks_logic-C4MPyL6T.js} +1 -1
  18. package/admin/assets/{blocks_number-D7JuNYsw.js → blocks_number-BMu9V-ca.js} +1 -1
  19. package/admin/assets/blocks_object-vU59tx8A.js +1 -0
  20. package/admin/assets/{blocks_procedures-BJMz6HWW.js → blocks_procedures-CfhGGNAK.js} +1 -1
  21. package/admin/assets/{blocks_sendto-DRh7lk9o.js → blocks_sendto-oZjHfEt6.js} +3 -3
  22. package/admin/assets/{blocks_switch-BfmboMex.js → blocks_switch-DtRe2uV0.js} +1 -1
  23. package/admin/assets/blocks_system-CWkKMHLd.js +1 -0
  24. package/admin/assets/{blocks_text-CGbR0Ozw.js → blocks_text-CunCNUrR.js} +1 -1
  25. package/admin/assets/blocks_time-B_Duc9-g.js +1 -0
  26. package/admin/assets/blocks_timeout-B5PA_0Xv.js +1 -0
  27. package/admin/assets/blocks_trigger-BePNP-VV.js +2 -0
  28. package/admin/assets/blocks_words-bpwd7Ia0.js +1 -0
  29. package/admin/assets/{cronHoverProvider-DpgESCox.js → cronHoverProvider-COaB74MF.js} +1 -1
  30. package/admin/assets/dist-BF-PlO2i.js +4 -0
  31. package/admin/assets/{field_cron-B40zwSfJ.js → field_cron-BkiRQvy7.js} +1 -1
  32. package/admin/assets/{field_oid-KfoBnEM9.js → field_oid-pEOMkwS7.js} +1 -1
  33. package/admin/assets/{field_script-yXhe1iCp.js → field_script-D8TaeXTc.js} +1 -1
  34. package/admin/assets/{helpers-B0ByElPJ.js → helpers-Cbd0K4kn.js} +1 -1
  35. package/admin/assets/{hostInit-9REPDUe7.js → hostInit-PWanFl0v.js} +1 -1
  36. package/admin/assets/index-4M2aGX3M.js +871 -0
  37. package/admin/assets/{inlineChatWidget-B9y_gQcH.js → inlineChatWidget-CmSJN0Rv.js} +1 -1
  38. package/admin/assets/{inlineDiffController-C07CdIFo.js → inlineDiffController-CauFSimb.js} +1 -1
  39. package/admin/assets/{mf-entry-bootstrap-0-efcb49d3.js → mf-entry-bootstrap-0-66751765.js} +2 -2
  40. package/admin/assets/{stateHoverProvider-CqeoOjXs.js → stateHoverProvider-g3dqXZ8K.js} +1 -1
  41. package/admin/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__iobroker_javascript__remoteEntry_js-Dc9L2TVn.js +1 -0
  42. package/admin/custom/assets/{Components-BCQTjBgm.js → Components-uxORfFYU.js} +1 -1
  43. package/admin/custom/assets/{_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1-BuAc8OyX.js → _virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1-Bd9Y-jyc.js} +1 -1
  44. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-aRlxyEhq.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DMefPDeL.js} +92 -92
  45. 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 → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-D81YCXgE.js} +65 -65
  46. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-xxszBNje.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-CxkJmLDG.js} +1 -1
  47. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__date_mf_2_fns__prebuild__-Tq7tesSS.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__date_mf_2_fns__prebuild__-BNLW3sTg.js} +1 -1
  48. package/admin/custom/assets/{hostInit-CHwrowP4.js → hostInit-CxnK2NMF.js} +1 -1
  49. package/admin/custom/assets/{index-Cm6xl9K4.js → index-CHg-uG3r.js} +1 -1
  50. package/admin/custom/assets/{lib-bhrFL6jR.js → lib-D4Fc4r7w.js} +1 -1
  51. package/admin/custom/assets/{mf-entry-bootstrap-0-f08941e2.js → mf-entry-bootstrap-0-16561517.js} +2 -2
  52. package/admin/custom/assets/{setYear-DzTZ2h9A.js → setYear-Dhce8K9j.js} +1 -1
  53. package/admin/custom/assets/virtualExposes-DUFP2Erj.js +1 -0
  54. package/admin/custom/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-jnBHXUID.js +1 -0
  55. package/admin/custom/assets/{virtual_mf-exposes___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-C3ImybiM.js → virtual_mf-exposes___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-PH1CCUgS.js} +2 -2
  56. package/admin/custom/customComponents.js +2 -2
  57. package/admin/mf-manifest.json +1 -1
  58. package/admin/mf-stats.json +1 -1
  59. package/admin/remoteEntry.js +2 -2
  60. package/admin/tab.html +4 -4
  61. package/build/lib/mirror.js +21 -4
  62. package/build/lib/mirror.js.map +1 -1
  63. package/build/lib/sandbox.js +59 -31
  64. package/build/lib/sandbox.js.map +1 -1
  65. package/build/lib/tools.js +13 -0
  66. package/build/lib/tools.js.map +1 -1
  67. package/build/main.js +3 -0
  68. package/build/main.js.map +1 -1
  69. package/docs/en/javascript.md +11 -0
  70. package/io-package.json +27 -27
  71. package/package.json +4 -4
  72. package/admin/assets/AiDiffView-BtXbDWZ8.js +0 -1
  73. package/admin/assets/Error-DQ1pzKcf.js +0 -1
  74. package/admin/assets/Import-BjMtH6Gk.js +0 -1
  75. package/admin/assets/RulesEditor-dDRPHw4X.js +0 -1
  76. package/admin/assets/RulesEditor-k-DMHotH.css +0 -1
  77. package/admin/assets/aiPromptBuilder-D5FDo74i.js +0 -1
  78. package/admin/assets/back-CXiqI7Po.jpg +0 -0
  79. package/admin/assets/blocks_action-BqfWEwpf.js +0 -1
  80. package/admin/assets/blocks_object-C9DzAlc7.js +0 -1
  81. package/admin/assets/blocks_system-B-78JfAc.js +0 -1
  82. package/admin/assets/blocks_time-5vS2geJg.js +0 -1
  83. package/admin/assets/blocks_timeout-BdaTywfN.js +0 -1
  84. package/admin/assets/blocks_trigger-D8kgHKbg.js +0 -2
  85. package/admin/assets/blocks_words-BhHIf_1o.js +0 -1
  86. package/admin/assets/dist-CaOsN0XW.js +0 -4
  87. package/admin/assets/index-07o_WKsX.js +0 -726
  88. package/admin/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__iobroker_javascript__remoteEntry_js-BwSvIKEV.js +0 -1
  89. package/admin/custom/assets/virtualExposes-B5LJmnfO.js +0 -1
  90. package/admin/custom/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-ML-chjs6.js +0 -1
@@ -5,6 +5,7 @@ exports.isArray = isArray;
5
5
  exports.matchAll = matchAll;
6
6
  exports.promisify = promisify;
7
7
  exports.hashSource = hashSource;
8
+ exports.escapeRegExp = escapeRegExp;
8
9
  exports.getHttpRequestConfig = getHttpRequestConfig;
9
10
  // import { readdirSync, statSync } from 'node:fs';
10
11
  // import { join } from 'node:path';
@@ -133,6 +134,18 @@ export function promisifyNoError(fn: Function, context: any): (...args: any[]) =
133
134
  function hashSource(source) {
134
135
  return (0, node_crypto_1.createHash)('md5').update(source).digest('hex');
135
136
  }
137
+ /**
138
+ * Escapes every RegExp metacharacter, so the text can be interpolated into a pattern as a literal.
139
+ *
140
+ * Script IDs and file names are built from names the user chooses freely. A name like `Lampe (Flur)`
141
+ * is perfectly valid, but pasted into a pattern unescaped it either throws a `SyntaxError` or
142
+ * silently changes what the pattern matches.
143
+ *
144
+ * @param text The text to use literally inside a regular expression
145
+ */
146
+ function escapeRegExp(text) {
147
+ return text.replace(/[.*+?^${}()|[\]\\-]/g, '\\$&');
148
+ }
136
149
  function getHttpRequestConfig(url, options, allowSelfSignedCerts) {
137
150
  options = options || {};
138
151
  const timeoutMs = options && !isNaN(options.timeout) ? options.timeout : 2000;
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/lib/tools.ts"],"names":[],"mappings":"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","sourcesContent":["// import { readdirSync, statSync } from 'node:fs';\n// import { join } from 'node:path';\nimport { createHash } from 'node:crypto';\nimport { Agent } from 'node:https';\nimport type { AxiosRequestConfig, ResponseType } from 'axios';\n\n/**\n * Tests whether the given variable is a real object and not an Array\n *\n * @param it The variable to test\n */\nexport function isObject(it: any): boolean {\n // This is necessary because:\n // typeof null === 'object'\n // typeof [] === 'object'\n // [] instanceof Object === true\n return Object.prototype.toString.call(it) === '[object Object]';\n}\n\n/**\n * Tests whether the given variable is really an Array\n *\n * @param it The variable to test\n */\nexport function isArray(it: any): boolean {\n return Array.isArray(it);\n}\n\n/**\n * Finds all matches of a regular expression and returns the matched groups\n *\n * @param regex The regular expression to match against the string\n * @param string The string to test\n */\nexport function matchAll(regex: RegExp, string: string): string[][] {\n const ret: string[][] = [];\n let match: RegExpExecArray | null;\n do {\n match = regex.exec(string);\n if (match) {\n ret.push(match.slice(1));\n }\n } while (match);\n\n return ret;\n}\n\n/**\n * Enumerates all files matching a given predicate\n *\n * @param rootDir The directory to start in\n * @param predicate A function that takes a filename and returns true if the file should be included\n */\n/*export function enumFilesRecursiveSync(rootDir: string, predicate: (filename: string) => boolean): string[] {\n const ret: string[] = [];\n try {\n const filesAndDirs = readdirSync(rootDir);\n for (const f of filesAndDirs) {\n const fullPath = join(rootDir, f);\n\n if (statSync(fullPath).isDirectory()) {\n Array.prototype.push.apply(ret, enumFilesRecursiveSync(fullPath, predicate));\n } else if (typeof predicate === 'function' && predicate(fullPath)) {\n ret.push(fullPath);\n }\n }\n } catch (err: unknown) {\n console.error(`Cannot read directory: \"${rootDir}\": ${err as Error}`);\n }\n\n return ret;\n}*/\n\n/**\n * Promisifies a callback-style function with parameters (err, result)\n *\n * @param fn The callback-style function to promisify\n * @param context The value of `this` in the function\n */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport function promisify(fn: Function, context?: any): (...args: any[]) => Promise<any> {\n return function (...args) {\n // @ts-expect-error We want this behavior\n context = context || this;\n return new Promise((resolve, reject) => {\n try {\n fn.apply(context, [\n ...args,\n (error: Error | string | null, result: null) => {\n if (error) {\n if (typeof error === 'string') {\n return reject(new Error(error));\n }\n return reject(error);\n }\n return resolve(result);\n },\n ]);\n } catch (error: unknown) {\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n };\n}\n\n/**\n * Promisifies a callback-style function without an error parameter\n *\n * @param fn The callback-style function to promisify\n * @param context The value of `this` in the function\n */\n/*\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport function promisifyNoError(fn: Function, context: any): (...args: any[]) => Promise<any> {\n return function (...args) {\n // @ts-expect-error We want this behavior\n context = context || this;\n return new Promise(resolve => {\n try {\n fn.apply(context, [...args, (result: any) => resolve(result)]);\n } catch {\n resolve(null); // what to do in this case??\n }\n });\n };\n}*/\n\n/**\n * Creates an MD5 hash of a script source which can be used to check whether the source of a compiled language changed\n *\n * @param source The source code to hash\n */\nexport function hashSource(source: string | Buffer): string {\n return createHash('md5').update(source).digest('hex');\n}\n\nexport function getHttpRequestConfig(\n url: string,\n options?: {\n timeout?: number;\n responseType?: ResponseType;\n headers?: Record<string, string>;\n basicAuth?: { user: string; password: string } | null;\n bearerAuth?: string;\n validateCertificate?: boolean;\n },\n allowSelfSignedCerts?: boolean,\n): AxiosRequestConfig {\n options = options || {};\n const timeoutMs = options && !isNaN(options.timeout as number) ? options.timeout : 2000;\n\n const config: AxiosRequestConfig = {\n method: 'get',\n url,\n validateStatus: (status: number): boolean => status >= 200,\n responseType: options && options.responseType ? options.responseType : 'text',\n responseEncoding: 'utf8',\n timeout: timeoutMs,\n //signal: AbortSignal.timeout(timeoutMs), // connection related timeouts\n };\n\n options.headers = options.headers || {};\n\n if (options && options.basicAuth) {\n config.auth = {\n username: options.basicAuth.user,\n password: options.basicAuth.password,\n };\n } else if (options.bearerAuth) {\n options.headers.Authorization = `Bearer ${options.bearerAuth}`;\n } else {\n const uri = new URL(url);\n if (uri.username && uri.password) {\n const username = decodeURIComponent(uri.username);\n const password = decodeURIComponent(uri.password);\n\n config.url = (config.url || '').replace(`${uri.protocol}//${username}:${password}@`, `${uri.protocol}//`);\n config.auth = {\n username,\n password,\n };\n }\n }\n\n // Set default headers\n config.headers = {\n 'User-Agent': 'Mozilla/5.0 (X11; Linux i686; rv:109.0) Gecko/20100101 Firefox/121.0',\n ...options.headers,\n };\n\n // Certificate validation: per-request option takes priority, then adapter-level setting\n if (options && typeof options?.validateCertificate !== 'undefined') {\n config.httpsAgent = new Agent({\n rejectUnauthorized: options.validateCertificate,\n });\n } else if (allowSelfSignedCerts) {\n config.httpsAgent = new Agent({\n rejectUnauthorized: false,\n });\n }\n\n return config;\n}\n"]}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/lib/tools.ts"],"names":[],"mappings":"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","sourcesContent":["// import { readdirSync, statSync } from 'node:fs';\n// import { join } from 'node:path';\nimport { createHash } from 'node:crypto';\nimport { Agent } from 'node:https';\nimport type { AxiosRequestConfig, ResponseType } from 'axios';\n\n/**\n * Tests whether the given variable is a real object and not an Array\n *\n * @param it The variable to test\n */\nexport function isObject(it: any): boolean {\n // This is necessary because:\n // typeof null === 'object'\n // typeof [] === 'object'\n // [] instanceof Object === true\n return Object.prototype.toString.call(it) === '[object Object]';\n}\n\n/**\n * Tests whether the given variable is really an Array\n *\n * @param it The variable to test\n */\nexport function isArray(it: any): boolean {\n return Array.isArray(it);\n}\n\n/**\n * Finds all matches of a regular expression and returns the matched groups\n *\n * @param regex The regular expression to match against the string\n * @param string The string to test\n */\nexport function matchAll(regex: RegExp, string: string): string[][] {\n const ret: string[][] = [];\n let match: RegExpExecArray | null;\n do {\n match = regex.exec(string);\n if (match) {\n ret.push(match.slice(1));\n }\n } while (match);\n\n return ret;\n}\n\n/**\n * Enumerates all files matching a given predicate\n *\n * @param rootDir The directory to start in\n * @param predicate A function that takes a filename and returns true if the file should be included\n */\n/*export function enumFilesRecursiveSync(rootDir: string, predicate: (filename: string) => boolean): string[] {\n const ret: string[] = [];\n try {\n const filesAndDirs = readdirSync(rootDir);\n for (const f of filesAndDirs) {\n const fullPath = join(rootDir, f);\n\n if (statSync(fullPath).isDirectory()) {\n Array.prototype.push.apply(ret, enumFilesRecursiveSync(fullPath, predicate));\n } else if (typeof predicate === 'function' && predicate(fullPath)) {\n ret.push(fullPath);\n }\n }\n } catch (err: unknown) {\n console.error(`Cannot read directory: \"${rootDir}\": ${err as Error}`);\n }\n\n return ret;\n}*/\n\n/**\n * Promisifies a callback-style function with parameters (err, result)\n *\n * @param fn The callback-style function to promisify\n * @param context The value of `this` in the function\n */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport function promisify(fn: Function, context?: any): (...args: any[]) => Promise<any> {\n return function (...args) {\n // @ts-expect-error We want this behavior\n context = context || this;\n return new Promise((resolve, reject) => {\n try {\n fn.apply(context, [\n ...args,\n (error: Error | string | null, result: null) => {\n if (error) {\n if (typeof error === 'string') {\n return reject(new Error(error));\n }\n return reject(error);\n }\n return resolve(result);\n },\n ]);\n } catch (error: unknown) {\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n };\n}\n\n/**\n * Promisifies a callback-style function without an error parameter\n *\n * @param fn The callback-style function to promisify\n * @param context The value of `this` in the function\n */\n/*\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport function promisifyNoError(fn: Function, context: any): (...args: any[]) => Promise<any> {\n return function (...args) {\n // @ts-expect-error We want this behavior\n context = context || this;\n return new Promise(resolve => {\n try {\n fn.apply(context, [...args, (result: any) => resolve(result)]);\n } catch {\n resolve(null); // what to do in this case??\n }\n });\n };\n}*/\n\n/**\n * Creates an MD5 hash of a script source which can be used to check whether the source of a compiled language changed\n *\n * @param source The source code to hash\n */\nexport function hashSource(source: string | Buffer): string {\n return createHash('md5').update(source).digest('hex');\n}\n\n/**\n * Escapes every RegExp metacharacter, so the text can be interpolated into a pattern as a literal.\n *\n * Script IDs and file names are built from names the user chooses freely. A name like `Lampe (Flur)`\n * is perfectly valid, but pasted into a pattern unescaped it either throws a `SyntaxError` or\n * silently changes what the pattern matches.\n *\n * @param text The text to use literally inside a regular expression\n */\nexport function escapeRegExp(text: string): string {\n return text.replace(/[.*+?^${}()|[\\]\\\\-]/g, '\\\\$&');\n}\n\nexport function getHttpRequestConfig(\n url: string,\n options?: {\n timeout?: number;\n responseType?: ResponseType;\n headers?: Record<string, string>;\n basicAuth?: { user: string; password: string } | null;\n bearerAuth?: string;\n validateCertificate?: boolean;\n },\n allowSelfSignedCerts?: boolean,\n): AxiosRequestConfig {\n options = options || {};\n const timeoutMs = options && !isNaN(options.timeout as number) ? options.timeout : 2000;\n\n const config: AxiosRequestConfig = {\n method: 'get',\n url,\n validateStatus: (status: number): boolean => status >= 200,\n responseType: options && options.responseType ? options.responseType : 'text',\n responseEncoding: 'utf8',\n timeout: timeoutMs,\n //signal: AbortSignal.timeout(timeoutMs), // connection related timeouts\n };\n\n options.headers = options.headers || {};\n\n if (options && options.basicAuth) {\n config.auth = {\n username: options.basicAuth.user,\n password: options.basicAuth.password,\n };\n } else if (options.bearerAuth) {\n options.headers.Authorization = `Bearer ${options.bearerAuth}`;\n } else {\n const uri = new URL(url);\n if (uri.username && uri.password) {\n const username = decodeURIComponent(uri.username);\n const password = decodeURIComponent(uri.password);\n\n config.url = (config.url || '').replace(`${uri.protocol}//${username}:${password}@`, `${uri.protocol}//`);\n config.auth = {\n username,\n password,\n };\n }\n }\n\n // Set default headers\n config.headers = {\n 'User-Agent': 'Mozilla/5.0 (X11; Linux i686; rv:109.0) Gecko/20100101 Firefox/121.0',\n ...options.headers,\n };\n\n // Certificate validation: per-request option takes priority, then adapter-level setting\n if (options && typeof options?.validateCertificate !== 'undefined') {\n config.httpsAgent = new Agent({\n rejectUnauthorized: options.validateCertificate,\n });\n } else if (allowSelfSignedCerts) {\n config.httpsAgent = new Agent({\n rejectUnauthorized: false,\n });\n }\n\n return config;\n}\n"]}
package/build/main.js CHANGED
@@ -2809,6 +2809,8 @@ class JavaScript extends adapter_core_1.Adapter {
2809
2809
  }
2810
2810
  }
2811
2811
  }
2812
+ // The jobs are canceled => an onStop callback must not see them anymore via getSchedules()
2813
+ this.scripts[name].schedules = [];
2812
2814
  // Stop all time wizards jobs
2813
2815
  if (this.context.scheduler) {
2814
2816
  for (let i = 0; i < this.scripts[name].wizards.length; i++) {
@@ -2817,6 +2819,7 @@ class JavaScript extends adapter_core_1.Adapter {
2817
2819
  }
2818
2820
  }
2819
2821
  }
2822
+ this.scripts[name].wizards = [];
2820
2823
  // if callback for on stop
2821
2824
  if (typeof this.scripts[name].onStopCb === 'function') {
2822
2825
  this.scripts[name].onStopTimeout =