├── .editorconfig ├── .gitignore ├── JavaScript ├── 1-singletrhead │ ├── actors │ │ ├── mailer.js │ │ ├── monitoring.js │ │ ├── renderer.js │ │ └── root.js │ ├── config.js │ ├── eslint.config.js │ ├── main.js │ ├── package-lock.json │ ├── package.json │ ├── prettier.config.js │ └── system.js ├── 2-multiprocess │ ├── actors │ │ ├── mailer.js │ │ ├── monitoring.js │ │ ├── renderer.js │ │ └── root.js │ ├── config.js │ ├── eslint.config.js │ ├── main.js │ ├── master.js │ ├── package-lock.json │ ├── package.json │ ├── prettier.config.js │ ├── system.js │ └── worker.js └── 3-multithread │ ├── actors │ ├── mailer.js │ ├── monitoring.js │ ├── renderer.js │ └── root.js │ ├── config.js │ ├── eslint.config.js │ ├── main.js │ ├── master.js │ ├── package-lock.json │ ├── package.json │ ├── prettier.config.js │ ├── system.js │ └── worker.js ├── LICENSE └── README.md /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | end_of_line = lf 6 | charset = utf-8 7 | insert_final_newline = true 8 | trim_trailing_whitespace = true 9 | 10 | [{*.js,*.mjs,*.ts,*.json,*.yml}] 11 | indent_size = 2 12 | indent_style = space 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.log 3 | .DS_Store 4 | -------------------------------------------------------------------------------- /JavaScript/1-singletrhead/actors/mailer.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const ActorSystem = require('../system.js'); 4 | const nodemailer = require('nodemailer'); 5 | const auth = require('../config.js'); 6 | 7 | const FROM = 'nodeua.com@gmail.com'; 8 | 9 | ActorSystem.register( 10 | class Mailer { 11 | constructor() { 12 | console.log('Start actor: Mailer'); 13 | this.transport = nodemailer.createTransport({ 14 | service: 'gmail', 15 | auth, 16 | }); 17 | } 18 | 19 | async message({ to, subject, message }) { 20 | const mail = { from: FROM, to, subject, text: message }; 21 | this.transport.sendMail(mail, (error, data) => { 22 | if (error) console.log(error); 23 | else console.log(`Email sent: ${data.response}`); 24 | }); 25 | } 26 | 27 | async exit() { 28 | this.transport.close(); 29 | console.log('Stop actor: Mailer'); 30 | } 31 | }, 32 | ); 33 | -------------------------------------------------------------------------------- /JavaScript/1-singletrhead/actors/monitoring.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const ActorSystem = require('../system'); 4 | const http = require('node:http'); 5 | 6 | const URL = 'http://localhost:8000/'; 7 | const INTERVAL = 2000; 8 | 9 | ActorSystem.register( 10 | class Monitoring { 11 | constructor() { 12 | console.log('Start actor: Monitoring'); 13 | this.prevSuccess = true; 14 | this.timer = setInterval(() => { 15 | this.attempt(URL); 16 | }, INTERVAL); 17 | } 18 | 19 | attempt(url) { 20 | http 21 | .get(url, (res) => { 22 | const success = res.statusCode === 200; 23 | this.notify({ url, success, status: res.statusCode }); 24 | }) 25 | .on('error', (error) => { 26 | this.notify({ url, success: false, status: error.message }); 27 | }); 28 | } 29 | 30 | notify({ url, success, status }) { 31 | if (this.prevSuccess !== success) { 32 | this.prevSuccess = success; 33 | ActorSystem.send('Renderer', { url, success, status }); 34 | } 35 | } 36 | 37 | async message() {} 38 | 39 | async exit() { 40 | clearInterval(this.timer); 41 | console.log('Stop actor: Monitoring'); 42 | } 43 | }, 44 | ); 45 | -------------------------------------------------------------------------------- /JavaScript/1-singletrhead/actors/renderer.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const ActorSystem = require('../system'); 4 | 5 | ActorSystem.register( 6 | class Renderer { 7 | constructor() { 8 | console.log('Start actor: Renderer'); 9 | } 10 | 11 | async message({ url, success, status }) { 12 | const to = 'nodeua.com@gmail.com'; 13 | const msg = success ? 'is available again' : 'is not available'; 14 | const date = new Date().toUTCString(); 15 | const reason = (success ? 'Status code: ' : 'Error code: ') + status; 16 | const message = `Resource ${url} ${msg} (${date})\n${reason}`; 17 | const subject = 'Server Monitoring'; 18 | ActorSystem.send('Mailer', { to, subject, message }); 19 | } 20 | 21 | async exit() { 22 | console.log('Stop actor: Renderer'); 23 | } 24 | }, 25 | ); 26 | -------------------------------------------------------------------------------- /JavaScript/1-singletrhead/actors/root.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const ActorSystem = require('../system'); 4 | 5 | ActorSystem.register( 6 | class Root { 7 | constructor() { 8 | console.log('Start actor: Root'); 9 | ActorSystem.start('Monitoring'); 10 | ActorSystem.start('Renderer'); 11 | ActorSystem.start('Mailer', 3); 12 | } 13 | 14 | async message() {} 15 | 16 | async exit() { 17 | await ActorSystem.stop('Monitoring'); 18 | await ActorSystem.stop('Renderer'); 19 | await ActorSystem.stop('Mailer'); 20 | console.log('Stop actor: Root'); 21 | } 22 | }, 23 | ); 24 | -------------------------------------------------------------------------------- /JavaScript/1-singletrhead/config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = { 4 | user: 'account-name@gmail.com', 5 | pass: 'your-password', 6 | }; 7 | -------------------------------------------------------------------------------- /JavaScript/1-singletrhead/eslint.config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const init = require('eslint-config-metarhia'); 4 | 5 | init[0].rules['class-methods-use-this'] = 'off'; 6 | 7 | module.exports = init; 8 | -------------------------------------------------------------------------------- /JavaScript/1-singletrhead/main.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const ActorSystem = require('./system.js'); 4 | 5 | const EXIT_NORMAL = 1000; 6 | const EXIT_ABNORMAL = 5000; 7 | 8 | ActorSystem.start('Root'); 9 | 10 | process.on('SIGINT', () => { 11 | console.log(''); 12 | ActorSystem.stop('Root'); 13 | setTimeout(() => { 14 | console.log('Graceful shutdown'); 15 | process.exit(0); 16 | }, EXIT_NORMAL); 17 | setTimeout(() => { 18 | console.log('Abnormal termination'); 19 | process.exit(1); 20 | }, EXIT_ABNORMAL); 21 | }); 22 | -------------------------------------------------------------------------------- /JavaScript/1-singletrhead/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server-monitoring", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "server-monitoring", 9 | "version": "1.0.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "eslint": "^9.12.0", 13 | "eslint-config-metarhia": "^9.1.0", 14 | "nodemailer": "^6.9.16", 15 | "prettier": "^3.3.3" 16 | } 17 | }, 18 | "node_modules/@eslint-community/eslint-utils": { 19 | "version": "4.4.1", 20 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", 21 | "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", 22 | "license": "MIT", 23 | "dependencies": { 24 | "eslint-visitor-keys": "^3.4.3" 25 | }, 26 | "engines": { 27 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 28 | }, 29 | "funding": { 30 | "url": "https://opencollective.com/eslint" 31 | }, 32 | "peerDependencies": { 33 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 34 | } 35 | }, 36 | "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { 37 | "version": "3.4.3", 38 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 39 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 40 | "license": "Apache-2.0", 41 | "engines": { 42 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 43 | }, 44 | "funding": { 45 | "url": "https://opencollective.com/eslint" 46 | } 47 | }, 48 | "node_modules/@eslint-community/regexpp": { 49 | "version": "4.12.1", 50 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", 51 | "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", 52 | "license": "MIT", 53 | "engines": { 54 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 55 | } 56 | }, 57 | "node_modules/@eslint/config-array": { 58 | "version": "0.19.0", 59 | "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", 60 | "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", 61 | "license": "Apache-2.0", 62 | "dependencies": { 63 | "@eslint/object-schema": "^2.1.4", 64 | "debug": "^4.3.1", 65 | "minimatch": "^3.1.2" 66 | }, 67 | "engines": { 68 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 69 | } 70 | }, 71 | "node_modules/@eslint/core": { 72 | "version": "0.9.0", 73 | "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", 74 | "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", 75 | "license": "Apache-2.0", 76 | "engines": { 77 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 78 | } 79 | }, 80 | "node_modules/@eslint/eslintrc": { 81 | "version": "3.2.0", 82 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", 83 | "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", 84 | "license": "MIT", 85 | "dependencies": { 86 | "ajv": "^6.12.4", 87 | "debug": "^4.3.2", 88 | "espree": "^10.0.1", 89 | "globals": "^14.0.0", 90 | "ignore": "^5.2.0", 91 | "import-fresh": "^3.2.1", 92 | "js-yaml": "^4.1.0", 93 | "minimatch": "^3.1.2", 94 | "strip-json-comments": "^3.1.1" 95 | }, 96 | "engines": { 97 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 98 | }, 99 | "funding": { 100 | "url": "https://opencollective.com/eslint" 101 | } 102 | }, 103 | "node_modules/@eslint/js": { 104 | "version": "9.15.0", 105 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz", 106 | "integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==", 107 | "license": "MIT", 108 | "engines": { 109 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 110 | } 111 | }, 112 | "node_modules/@eslint/object-schema": { 113 | "version": "2.1.4", 114 | "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", 115 | "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", 116 | "license": "Apache-2.0", 117 | "engines": { 118 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 119 | } 120 | }, 121 | "node_modules/@eslint/plugin-kit": { 122 | "version": "0.2.3", 123 | "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", 124 | "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", 125 | "license": "Apache-2.0", 126 | "dependencies": { 127 | "levn": "^0.4.1" 128 | }, 129 | "engines": { 130 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 131 | } 132 | }, 133 | "node_modules/@humanfs/core": { 134 | "version": "0.19.1", 135 | "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", 136 | "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", 137 | "license": "Apache-2.0", 138 | "engines": { 139 | "node": ">=18.18.0" 140 | } 141 | }, 142 | "node_modules/@humanfs/node": { 143 | "version": "0.16.6", 144 | "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", 145 | "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", 146 | "license": "Apache-2.0", 147 | "dependencies": { 148 | "@humanfs/core": "^0.19.1", 149 | "@humanwhocodes/retry": "^0.3.0" 150 | }, 151 | "engines": { 152 | "node": ">=18.18.0" 153 | } 154 | }, 155 | "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { 156 | "version": "0.3.1", 157 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", 158 | "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", 159 | "license": "Apache-2.0", 160 | "engines": { 161 | "node": ">=18.18" 162 | }, 163 | "funding": { 164 | "type": "github", 165 | "url": "https://github.com/sponsors/nzakas" 166 | } 167 | }, 168 | "node_modules/@humanwhocodes/module-importer": { 169 | "version": "1.0.1", 170 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 171 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 172 | "license": "Apache-2.0", 173 | "engines": { 174 | "node": ">=12.22" 175 | }, 176 | "funding": { 177 | "type": "github", 178 | "url": "https://github.com/sponsors/nzakas" 179 | } 180 | }, 181 | "node_modules/@humanwhocodes/retry": { 182 | "version": "0.4.1", 183 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", 184 | "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", 185 | "license": "Apache-2.0", 186 | "engines": { 187 | "node": ">=18.18" 188 | }, 189 | "funding": { 190 | "type": "github", 191 | "url": "https://github.com/sponsors/nzakas" 192 | } 193 | }, 194 | "node_modules/@pkgr/core": { 195 | "version": "0.1.1", 196 | "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", 197 | "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", 198 | "license": "MIT", 199 | "engines": { 200 | "node": "^12.20.0 || ^14.18.0 || >=16.0.0" 201 | }, 202 | "funding": { 203 | "url": "https://opencollective.com/unts" 204 | } 205 | }, 206 | "node_modules/@types/estree": { 207 | "version": "1.0.6", 208 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 209 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 210 | "license": "MIT" 211 | }, 212 | "node_modules/@types/json-schema": { 213 | "version": "7.0.15", 214 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 215 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 216 | "license": "MIT" 217 | }, 218 | "node_modules/acorn": { 219 | "version": "8.14.0", 220 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 221 | "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 222 | "license": "MIT", 223 | "bin": { 224 | "acorn": "bin/acorn" 225 | }, 226 | "engines": { 227 | "node": ">=0.4.0" 228 | } 229 | }, 230 | "node_modules/acorn-jsx": { 231 | "version": "5.3.2", 232 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 233 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 234 | "license": "MIT", 235 | "peerDependencies": { 236 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 237 | } 238 | }, 239 | "node_modules/ajv": { 240 | "version": "6.12.6", 241 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 242 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 243 | "license": "MIT", 244 | "dependencies": { 245 | "fast-deep-equal": "^3.1.1", 246 | "fast-json-stable-stringify": "^2.0.0", 247 | "json-schema-traverse": "^0.4.1", 248 | "uri-js": "^4.2.2" 249 | }, 250 | "funding": { 251 | "type": "github", 252 | "url": "https://github.com/sponsors/epoberezkin" 253 | } 254 | }, 255 | "node_modules/ansi-styles": { 256 | "version": "4.3.0", 257 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 258 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 259 | "license": "MIT", 260 | "dependencies": { 261 | "color-convert": "^2.0.1" 262 | }, 263 | "engines": { 264 | "node": ">=8" 265 | }, 266 | "funding": { 267 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 268 | } 269 | }, 270 | "node_modules/argparse": { 271 | "version": "2.0.1", 272 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 273 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 274 | "license": "Python-2.0" 275 | }, 276 | "node_modules/balanced-match": { 277 | "version": "1.0.2", 278 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 279 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 280 | "license": "MIT" 281 | }, 282 | "node_modules/brace-expansion": { 283 | "version": "1.1.11", 284 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 285 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 286 | "license": "MIT", 287 | "dependencies": { 288 | "balanced-match": "^1.0.0", 289 | "concat-map": "0.0.1" 290 | } 291 | }, 292 | "node_modules/callsites": { 293 | "version": "3.1.0", 294 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 295 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 296 | "license": "MIT", 297 | "engines": { 298 | "node": ">=6" 299 | } 300 | }, 301 | "node_modules/chalk": { 302 | "version": "4.1.2", 303 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 304 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 305 | "license": "MIT", 306 | "dependencies": { 307 | "ansi-styles": "^4.1.0", 308 | "supports-color": "^7.1.0" 309 | }, 310 | "engines": { 311 | "node": ">=10" 312 | }, 313 | "funding": { 314 | "url": "https://github.com/chalk/chalk?sponsor=1" 315 | } 316 | }, 317 | "node_modules/color-convert": { 318 | "version": "2.0.1", 319 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 320 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 321 | "license": "MIT", 322 | "dependencies": { 323 | "color-name": "~1.1.4" 324 | }, 325 | "engines": { 326 | "node": ">=7.0.0" 327 | } 328 | }, 329 | "node_modules/color-name": { 330 | "version": "1.1.4", 331 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 332 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 333 | "license": "MIT" 334 | }, 335 | "node_modules/concat-map": { 336 | "version": "0.0.1", 337 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 338 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 339 | "license": "MIT" 340 | }, 341 | "node_modules/cross-spawn": { 342 | "version": "7.0.6", 343 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 344 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 345 | "license": "MIT", 346 | "dependencies": { 347 | "path-key": "^3.1.0", 348 | "shebang-command": "^2.0.0", 349 | "which": "^2.0.1" 350 | }, 351 | "engines": { 352 | "node": ">= 8" 353 | } 354 | }, 355 | "node_modules/debug": { 356 | "version": "4.3.7", 357 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 358 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 359 | "license": "MIT", 360 | "dependencies": { 361 | "ms": "^2.1.3" 362 | }, 363 | "engines": { 364 | "node": ">=6.0" 365 | }, 366 | "peerDependenciesMeta": { 367 | "supports-color": { 368 | "optional": true 369 | } 370 | } 371 | }, 372 | "node_modules/deep-is": { 373 | "version": "0.1.4", 374 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 375 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 376 | "license": "MIT" 377 | }, 378 | "node_modules/escape-string-regexp": { 379 | "version": "4.0.0", 380 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 381 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 382 | "license": "MIT", 383 | "engines": { 384 | "node": ">=10" 385 | }, 386 | "funding": { 387 | "url": "https://github.com/sponsors/sindresorhus" 388 | } 389 | }, 390 | "node_modules/eslint": { 391 | "version": "9.15.0", 392 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.15.0.tgz", 393 | "integrity": "sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==", 394 | "license": "MIT", 395 | "dependencies": { 396 | "@eslint-community/eslint-utils": "^4.2.0", 397 | "@eslint-community/regexpp": "^4.12.1", 398 | "@eslint/config-array": "^0.19.0", 399 | "@eslint/core": "^0.9.0", 400 | "@eslint/eslintrc": "^3.2.0", 401 | "@eslint/js": "9.15.0", 402 | "@eslint/plugin-kit": "^0.2.3", 403 | "@humanfs/node": "^0.16.6", 404 | "@humanwhocodes/module-importer": "^1.0.1", 405 | "@humanwhocodes/retry": "^0.4.1", 406 | "@types/estree": "^1.0.6", 407 | "@types/json-schema": "^7.0.15", 408 | "ajv": "^6.12.4", 409 | "chalk": "^4.0.0", 410 | "cross-spawn": "^7.0.5", 411 | "debug": "^4.3.2", 412 | "escape-string-regexp": "^4.0.0", 413 | "eslint-scope": "^8.2.0", 414 | "eslint-visitor-keys": "^4.2.0", 415 | "espree": "^10.3.0", 416 | "esquery": "^1.5.0", 417 | "esutils": "^2.0.2", 418 | "fast-deep-equal": "^3.1.3", 419 | "file-entry-cache": "^8.0.0", 420 | "find-up": "^5.0.0", 421 | "glob-parent": "^6.0.2", 422 | "ignore": "^5.2.0", 423 | "imurmurhash": "^0.1.4", 424 | "is-glob": "^4.0.0", 425 | "json-stable-stringify-without-jsonify": "^1.0.1", 426 | "lodash.merge": "^4.6.2", 427 | "minimatch": "^3.1.2", 428 | "natural-compare": "^1.4.0", 429 | "optionator": "^0.9.3" 430 | }, 431 | "bin": { 432 | "eslint": "bin/eslint.js" 433 | }, 434 | "engines": { 435 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 436 | }, 437 | "funding": { 438 | "url": "https://eslint.org/donate" 439 | }, 440 | "peerDependencies": { 441 | "jiti": "*" 442 | }, 443 | "peerDependenciesMeta": { 444 | "jiti": { 445 | "optional": true 446 | } 447 | } 448 | }, 449 | "node_modules/eslint-config-metarhia": { 450 | "version": "9.1.1", 451 | "resolved": "https://registry.npmjs.org/eslint-config-metarhia/-/eslint-config-metarhia-9.1.1.tgz", 452 | "integrity": "sha512-PPJBiv+kFg7+0kkjHWp1k37TovG5prxIwiryiX8vQ6m2Jt4u4yIBjEjDd3P/RGXK7yrbMiiSyI2Z/GTWDS0C/Q==", 453 | "license": "MIT", 454 | "dependencies": { 455 | "eslint": "^9.10.0", 456 | "eslint-config-prettier": "^9.1.0", 457 | "eslint-plugin-prettier": "^5.2.1", 458 | "prettier": "^3.3.3" 459 | }, 460 | "engines": { 461 | "node": "18 || 20 || 21 || 22 || 23" 462 | }, 463 | "funding": { 464 | "type": "patreon", 465 | "url": "https://www.patreon.com/tshemsedinov" 466 | } 467 | }, 468 | "node_modules/eslint-config-prettier": { 469 | "version": "9.1.0", 470 | "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", 471 | "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", 472 | "license": "MIT", 473 | "bin": { 474 | "eslint-config-prettier": "bin/cli.js" 475 | }, 476 | "peerDependencies": { 477 | "eslint": ">=7.0.0" 478 | } 479 | }, 480 | "node_modules/eslint-plugin-prettier": { 481 | "version": "5.2.1", 482 | "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", 483 | "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", 484 | "license": "MIT", 485 | "dependencies": { 486 | "prettier-linter-helpers": "^1.0.0", 487 | "synckit": "^0.9.1" 488 | }, 489 | "engines": { 490 | "node": "^14.18.0 || >=16.0.0" 491 | }, 492 | "funding": { 493 | "url": "https://opencollective.com/eslint-plugin-prettier" 494 | }, 495 | "peerDependencies": { 496 | "@types/eslint": ">=8.0.0", 497 | "eslint": ">=8.0.0", 498 | "eslint-config-prettier": "*", 499 | "prettier": ">=3.0.0" 500 | }, 501 | "peerDependenciesMeta": { 502 | "@types/eslint": { 503 | "optional": true 504 | }, 505 | "eslint-config-prettier": { 506 | "optional": true 507 | } 508 | } 509 | }, 510 | "node_modules/eslint-scope": { 511 | "version": "8.2.0", 512 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", 513 | "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", 514 | "license": "BSD-2-Clause", 515 | "dependencies": { 516 | "esrecurse": "^4.3.0", 517 | "estraverse": "^5.2.0" 518 | }, 519 | "engines": { 520 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 521 | }, 522 | "funding": { 523 | "url": "https://opencollective.com/eslint" 524 | } 525 | }, 526 | "node_modules/eslint-visitor-keys": { 527 | "version": "4.2.0", 528 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", 529 | "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", 530 | "license": "Apache-2.0", 531 | "engines": { 532 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 533 | }, 534 | "funding": { 535 | "url": "https://opencollective.com/eslint" 536 | } 537 | }, 538 | "node_modules/espree": { 539 | "version": "10.3.0", 540 | "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", 541 | "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", 542 | "license": "BSD-2-Clause", 543 | "dependencies": { 544 | "acorn": "^8.14.0", 545 | "acorn-jsx": "^5.3.2", 546 | "eslint-visitor-keys": "^4.2.0" 547 | }, 548 | "engines": { 549 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 550 | }, 551 | "funding": { 552 | "url": "https://opencollective.com/eslint" 553 | } 554 | }, 555 | "node_modules/esquery": { 556 | "version": "1.6.0", 557 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", 558 | "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 559 | "license": "BSD-3-Clause", 560 | "dependencies": { 561 | "estraverse": "^5.1.0" 562 | }, 563 | "engines": { 564 | "node": ">=0.10" 565 | } 566 | }, 567 | "node_modules/esrecurse": { 568 | "version": "4.3.0", 569 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 570 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 571 | "license": "BSD-2-Clause", 572 | "dependencies": { 573 | "estraverse": "^5.2.0" 574 | }, 575 | "engines": { 576 | "node": ">=4.0" 577 | } 578 | }, 579 | "node_modules/estraverse": { 580 | "version": "5.3.0", 581 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 582 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 583 | "license": "BSD-2-Clause", 584 | "engines": { 585 | "node": ">=4.0" 586 | } 587 | }, 588 | "node_modules/esutils": { 589 | "version": "2.0.3", 590 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 591 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 592 | "license": "BSD-2-Clause", 593 | "engines": { 594 | "node": ">=0.10.0" 595 | } 596 | }, 597 | "node_modules/fast-deep-equal": { 598 | "version": "3.1.3", 599 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 600 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 601 | "license": "MIT" 602 | }, 603 | "node_modules/fast-diff": { 604 | "version": "1.3.0", 605 | "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", 606 | "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", 607 | "license": "Apache-2.0" 608 | }, 609 | "node_modules/fast-json-stable-stringify": { 610 | "version": "2.1.0", 611 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 612 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 613 | "license": "MIT" 614 | }, 615 | "node_modules/fast-levenshtein": { 616 | "version": "2.0.6", 617 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 618 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 619 | "license": "MIT" 620 | }, 621 | "node_modules/file-entry-cache": { 622 | "version": "8.0.0", 623 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", 624 | "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", 625 | "license": "MIT", 626 | "dependencies": { 627 | "flat-cache": "^4.0.0" 628 | }, 629 | "engines": { 630 | "node": ">=16.0.0" 631 | } 632 | }, 633 | "node_modules/find-up": { 634 | "version": "5.0.0", 635 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 636 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 637 | "license": "MIT", 638 | "dependencies": { 639 | "locate-path": "^6.0.0", 640 | "path-exists": "^4.0.0" 641 | }, 642 | "engines": { 643 | "node": ">=10" 644 | }, 645 | "funding": { 646 | "url": "https://github.com/sponsors/sindresorhus" 647 | } 648 | }, 649 | "node_modules/flat-cache": { 650 | "version": "4.0.1", 651 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", 652 | "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", 653 | "license": "MIT", 654 | "dependencies": { 655 | "flatted": "^3.2.9", 656 | "keyv": "^4.5.4" 657 | }, 658 | "engines": { 659 | "node": ">=16" 660 | } 661 | }, 662 | "node_modules/flatted": { 663 | "version": "3.3.2", 664 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", 665 | "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", 666 | "license": "ISC" 667 | }, 668 | "node_modules/glob-parent": { 669 | "version": "6.0.2", 670 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 671 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 672 | "license": "ISC", 673 | "dependencies": { 674 | "is-glob": "^4.0.3" 675 | }, 676 | "engines": { 677 | "node": ">=10.13.0" 678 | } 679 | }, 680 | "node_modules/globals": { 681 | "version": "14.0.0", 682 | "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", 683 | "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", 684 | "license": "MIT", 685 | "engines": { 686 | "node": ">=18" 687 | }, 688 | "funding": { 689 | "url": "https://github.com/sponsors/sindresorhus" 690 | } 691 | }, 692 | "node_modules/has-flag": { 693 | "version": "4.0.0", 694 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 695 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 696 | "license": "MIT", 697 | "engines": { 698 | "node": ">=8" 699 | } 700 | }, 701 | "node_modules/ignore": { 702 | "version": "5.3.2", 703 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 704 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 705 | "license": "MIT", 706 | "engines": { 707 | "node": ">= 4" 708 | } 709 | }, 710 | "node_modules/import-fresh": { 711 | "version": "3.3.0", 712 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 713 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 714 | "license": "MIT", 715 | "dependencies": { 716 | "parent-module": "^1.0.0", 717 | "resolve-from": "^4.0.0" 718 | }, 719 | "engines": { 720 | "node": ">=6" 721 | }, 722 | "funding": { 723 | "url": "https://github.com/sponsors/sindresorhus" 724 | } 725 | }, 726 | "node_modules/imurmurhash": { 727 | "version": "0.1.4", 728 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 729 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 730 | "license": "MIT", 731 | "engines": { 732 | "node": ">=0.8.19" 733 | } 734 | }, 735 | "node_modules/is-extglob": { 736 | "version": "2.1.1", 737 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 738 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 739 | "license": "MIT", 740 | "engines": { 741 | "node": ">=0.10.0" 742 | } 743 | }, 744 | "node_modules/is-glob": { 745 | "version": "4.0.3", 746 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 747 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 748 | "license": "MIT", 749 | "dependencies": { 750 | "is-extglob": "^2.1.1" 751 | }, 752 | "engines": { 753 | "node": ">=0.10.0" 754 | } 755 | }, 756 | "node_modules/isexe": { 757 | "version": "2.0.0", 758 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 759 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 760 | "license": "ISC" 761 | }, 762 | "node_modules/js-yaml": { 763 | "version": "4.1.0", 764 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 765 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 766 | "license": "MIT", 767 | "dependencies": { 768 | "argparse": "^2.0.1" 769 | }, 770 | "bin": { 771 | "js-yaml": "bin/js-yaml.js" 772 | } 773 | }, 774 | "node_modules/json-buffer": { 775 | "version": "3.0.1", 776 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 777 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 778 | "license": "MIT" 779 | }, 780 | "node_modules/json-schema-traverse": { 781 | "version": "0.4.1", 782 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 783 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 784 | "license": "MIT" 785 | }, 786 | "node_modules/json-stable-stringify-without-jsonify": { 787 | "version": "1.0.1", 788 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 789 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 790 | "license": "MIT" 791 | }, 792 | "node_modules/keyv": { 793 | "version": "4.5.4", 794 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 795 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 796 | "license": "MIT", 797 | "dependencies": { 798 | "json-buffer": "3.0.1" 799 | } 800 | }, 801 | "node_modules/levn": { 802 | "version": "0.4.1", 803 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 804 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 805 | "license": "MIT", 806 | "dependencies": { 807 | "prelude-ls": "^1.2.1", 808 | "type-check": "~0.4.0" 809 | }, 810 | "engines": { 811 | "node": ">= 0.8.0" 812 | } 813 | }, 814 | "node_modules/locate-path": { 815 | "version": "6.0.0", 816 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 817 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 818 | "license": "MIT", 819 | "dependencies": { 820 | "p-locate": "^5.0.0" 821 | }, 822 | "engines": { 823 | "node": ">=10" 824 | }, 825 | "funding": { 826 | "url": "https://github.com/sponsors/sindresorhus" 827 | } 828 | }, 829 | "node_modules/lodash.merge": { 830 | "version": "4.6.2", 831 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 832 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 833 | "license": "MIT" 834 | }, 835 | "node_modules/minimatch": { 836 | "version": "3.1.2", 837 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 838 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 839 | "license": "ISC", 840 | "dependencies": { 841 | "brace-expansion": "^1.1.7" 842 | }, 843 | "engines": { 844 | "node": "*" 845 | } 846 | }, 847 | "node_modules/ms": { 848 | "version": "2.1.3", 849 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 850 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 851 | "license": "MIT" 852 | }, 853 | "node_modules/natural-compare": { 854 | "version": "1.4.0", 855 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 856 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 857 | "license": "MIT" 858 | }, 859 | "node_modules/nodemailer": { 860 | "version": "6.9.16", 861 | "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.16.tgz", 862 | "integrity": "sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==", 863 | "license": "MIT-0", 864 | "engines": { 865 | "node": ">=6.0.0" 866 | } 867 | }, 868 | "node_modules/optionator": { 869 | "version": "0.9.4", 870 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 871 | "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 872 | "license": "MIT", 873 | "dependencies": { 874 | "deep-is": "^0.1.3", 875 | "fast-levenshtein": "^2.0.6", 876 | "levn": "^0.4.1", 877 | "prelude-ls": "^1.2.1", 878 | "type-check": "^0.4.0", 879 | "word-wrap": "^1.2.5" 880 | }, 881 | "engines": { 882 | "node": ">= 0.8.0" 883 | } 884 | }, 885 | "node_modules/p-limit": { 886 | "version": "3.1.0", 887 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 888 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 889 | "license": "MIT", 890 | "dependencies": { 891 | "yocto-queue": "^0.1.0" 892 | }, 893 | "engines": { 894 | "node": ">=10" 895 | }, 896 | "funding": { 897 | "url": "https://github.com/sponsors/sindresorhus" 898 | } 899 | }, 900 | "node_modules/p-locate": { 901 | "version": "5.0.0", 902 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 903 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 904 | "license": "MIT", 905 | "dependencies": { 906 | "p-limit": "^3.0.2" 907 | }, 908 | "engines": { 909 | "node": ">=10" 910 | }, 911 | "funding": { 912 | "url": "https://github.com/sponsors/sindresorhus" 913 | } 914 | }, 915 | "node_modules/parent-module": { 916 | "version": "1.0.1", 917 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 918 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 919 | "license": "MIT", 920 | "dependencies": { 921 | "callsites": "^3.0.0" 922 | }, 923 | "engines": { 924 | "node": ">=6" 925 | } 926 | }, 927 | "node_modules/path-exists": { 928 | "version": "4.0.0", 929 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 930 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 931 | "license": "MIT", 932 | "engines": { 933 | "node": ">=8" 934 | } 935 | }, 936 | "node_modules/path-key": { 937 | "version": "3.1.1", 938 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 939 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 940 | "license": "MIT", 941 | "engines": { 942 | "node": ">=8" 943 | } 944 | }, 945 | "node_modules/prelude-ls": { 946 | "version": "1.2.1", 947 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 948 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 949 | "license": "MIT", 950 | "engines": { 951 | "node": ">= 0.8.0" 952 | } 953 | }, 954 | "node_modules/prettier": { 955 | "version": "3.3.3", 956 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", 957 | "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", 958 | "license": "MIT", 959 | "bin": { 960 | "prettier": "bin/prettier.cjs" 961 | }, 962 | "engines": { 963 | "node": ">=14" 964 | }, 965 | "funding": { 966 | "url": "https://github.com/prettier/prettier?sponsor=1" 967 | } 968 | }, 969 | "node_modules/prettier-linter-helpers": { 970 | "version": "1.0.0", 971 | "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", 972 | "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", 973 | "license": "MIT", 974 | "dependencies": { 975 | "fast-diff": "^1.1.2" 976 | }, 977 | "engines": { 978 | "node": ">=6.0.0" 979 | } 980 | }, 981 | "node_modules/punycode": { 982 | "version": "2.3.1", 983 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 984 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 985 | "license": "MIT", 986 | "engines": { 987 | "node": ">=6" 988 | } 989 | }, 990 | "node_modules/resolve-from": { 991 | "version": "4.0.0", 992 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 993 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 994 | "license": "MIT", 995 | "engines": { 996 | "node": ">=4" 997 | } 998 | }, 999 | "node_modules/shebang-command": { 1000 | "version": "2.0.0", 1001 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1002 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1003 | "license": "MIT", 1004 | "dependencies": { 1005 | "shebang-regex": "^3.0.0" 1006 | }, 1007 | "engines": { 1008 | "node": ">=8" 1009 | } 1010 | }, 1011 | "node_modules/shebang-regex": { 1012 | "version": "3.0.0", 1013 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1014 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1015 | "license": "MIT", 1016 | "engines": { 1017 | "node": ">=8" 1018 | } 1019 | }, 1020 | "node_modules/strip-json-comments": { 1021 | "version": "3.1.1", 1022 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1023 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1024 | "license": "MIT", 1025 | "engines": { 1026 | "node": ">=8" 1027 | }, 1028 | "funding": { 1029 | "url": "https://github.com/sponsors/sindresorhus" 1030 | } 1031 | }, 1032 | "node_modules/supports-color": { 1033 | "version": "7.2.0", 1034 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1035 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1036 | "license": "MIT", 1037 | "dependencies": { 1038 | "has-flag": "^4.0.0" 1039 | }, 1040 | "engines": { 1041 | "node": ">=8" 1042 | } 1043 | }, 1044 | "node_modules/synckit": { 1045 | "version": "0.9.2", 1046 | "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", 1047 | "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", 1048 | "license": "MIT", 1049 | "dependencies": { 1050 | "@pkgr/core": "^0.1.0", 1051 | "tslib": "^2.6.2" 1052 | }, 1053 | "engines": { 1054 | "node": "^14.18.0 || >=16.0.0" 1055 | }, 1056 | "funding": { 1057 | "url": "https://opencollective.com/unts" 1058 | } 1059 | }, 1060 | "node_modules/tslib": { 1061 | "version": "2.8.1", 1062 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 1063 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 1064 | "license": "0BSD" 1065 | }, 1066 | "node_modules/type-check": { 1067 | "version": "0.4.0", 1068 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1069 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1070 | "license": "MIT", 1071 | "dependencies": { 1072 | "prelude-ls": "^1.2.1" 1073 | }, 1074 | "engines": { 1075 | "node": ">= 0.8.0" 1076 | } 1077 | }, 1078 | "node_modules/uri-js": { 1079 | "version": "4.4.1", 1080 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1081 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1082 | "license": "BSD-2-Clause", 1083 | "dependencies": { 1084 | "punycode": "^2.1.0" 1085 | } 1086 | }, 1087 | "node_modules/which": { 1088 | "version": "2.0.2", 1089 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1090 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1091 | "license": "ISC", 1092 | "dependencies": { 1093 | "isexe": "^2.0.0" 1094 | }, 1095 | "bin": { 1096 | "node-which": "bin/node-which" 1097 | }, 1098 | "engines": { 1099 | "node": ">= 8" 1100 | } 1101 | }, 1102 | "node_modules/word-wrap": { 1103 | "version": "1.2.5", 1104 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 1105 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 1106 | "license": "MIT", 1107 | "engines": { 1108 | "node": ">=0.10.0" 1109 | } 1110 | }, 1111 | "node_modules/yocto-queue": { 1112 | "version": "0.1.0", 1113 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1114 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1115 | "license": "MIT", 1116 | "engines": { 1117 | "node": ">=10" 1118 | }, 1119 | "funding": { 1120 | "url": "https://github.com/sponsors/sindresorhus" 1121 | } 1122 | } 1123 | }, 1124 | "dependencies": { 1125 | "@eslint-community/eslint-utils": { 1126 | "version": "4.4.1", 1127 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", 1128 | "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", 1129 | "requires": { 1130 | "eslint-visitor-keys": "^3.4.3" 1131 | }, 1132 | "dependencies": { 1133 | "eslint-visitor-keys": { 1134 | "version": "3.4.3", 1135 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 1136 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==" 1137 | } 1138 | } 1139 | }, 1140 | "@eslint-community/regexpp": { 1141 | "version": "4.12.1", 1142 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", 1143 | "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==" 1144 | }, 1145 | "@eslint/config-array": { 1146 | "version": "0.19.0", 1147 | "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", 1148 | "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", 1149 | "requires": { 1150 | "@eslint/object-schema": "^2.1.4", 1151 | "debug": "^4.3.1", 1152 | "minimatch": "^3.1.2" 1153 | } 1154 | }, 1155 | "@eslint/core": { 1156 | "version": "0.9.0", 1157 | "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", 1158 | "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==" 1159 | }, 1160 | "@eslint/eslintrc": { 1161 | "version": "3.2.0", 1162 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", 1163 | "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", 1164 | "requires": { 1165 | "ajv": "^6.12.4", 1166 | "debug": "^4.3.2", 1167 | "espree": "^10.0.1", 1168 | "globals": "^14.0.0", 1169 | "ignore": "^5.2.0", 1170 | "import-fresh": "^3.2.1", 1171 | "js-yaml": "^4.1.0", 1172 | "minimatch": "^3.1.2", 1173 | "strip-json-comments": "^3.1.1" 1174 | } 1175 | }, 1176 | "@eslint/js": { 1177 | "version": "9.15.0", 1178 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz", 1179 | "integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==" 1180 | }, 1181 | "@eslint/object-schema": { 1182 | "version": "2.1.4", 1183 | "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", 1184 | "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==" 1185 | }, 1186 | "@eslint/plugin-kit": { 1187 | "version": "0.2.3", 1188 | "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", 1189 | "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", 1190 | "requires": { 1191 | "levn": "^0.4.1" 1192 | } 1193 | }, 1194 | "@humanfs/core": { 1195 | "version": "0.19.1", 1196 | "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", 1197 | "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==" 1198 | }, 1199 | "@humanfs/node": { 1200 | "version": "0.16.6", 1201 | "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", 1202 | "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", 1203 | "requires": { 1204 | "@humanfs/core": "^0.19.1", 1205 | "@humanwhocodes/retry": "^0.3.0" 1206 | }, 1207 | "dependencies": { 1208 | "@humanwhocodes/retry": { 1209 | "version": "0.3.1", 1210 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", 1211 | "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==" 1212 | } 1213 | } 1214 | }, 1215 | "@humanwhocodes/module-importer": { 1216 | "version": "1.0.1", 1217 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 1218 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==" 1219 | }, 1220 | "@humanwhocodes/retry": { 1221 | "version": "0.4.1", 1222 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", 1223 | "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==" 1224 | }, 1225 | "@pkgr/core": { 1226 | "version": "0.1.1", 1227 | "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", 1228 | "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==" 1229 | }, 1230 | "@types/estree": { 1231 | "version": "1.0.6", 1232 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 1233 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" 1234 | }, 1235 | "@types/json-schema": { 1236 | "version": "7.0.15", 1237 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 1238 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" 1239 | }, 1240 | "acorn": { 1241 | "version": "8.14.0", 1242 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 1243 | "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==" 1244 | }, 1245 | "acorn-jsx": { 1246 | "version": "5.3.2", 1247 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 1248 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 1249 | "requires": {} 1250 | }, 1251 | "ajv": { 1252 | "version": "6.12.6", 1253 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 1254 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1255 | "requires": { 1256 | "fast-deep-equal": "^3.1.1", 1257 | "fast-json-stable-stringify": "^2.0.0", 1258 | "json-schema-traverse": "^0.4.1", 1259 | "uri-js": "^4.2.2" 1260 | } 1261 | }, 1262 | "ansi-styles": { 1263 | "version": "4.3.0", 1264 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1265 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1266 | "requires": { 1267 | "color-convert": "^2.0.1" 1268 | } 1269 | }, 1270 | "argparse": { 1271 | "version": "2.0.1", 1272 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1273 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" 1274 | }, 1275 | "balanced-match": { 1276 | "version": "1.0.2", 1277 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1278 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 1279 | }, 1280 | "brace-expansion": { 1281 | "version": "1.1.11", 1282 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1283 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1284 | "requires": { 1285 | "balanced-match": "^1.0.0", 1286 | "concat-map": "0.0.1" 1287 | } 1288 | }, 1289 | "callsites": { 1290 | "version": "3.1.0", 1291 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1292 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" 1293 | }, 1294 | "chalk": { 1295 | "version": "4.1.2", 1296 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1297 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1298 | "requires": { 1299 | "ansi-styles": "^4.1.0", 1300 | "supports-color": "^7.1.0" 1301 | } 1302 | }, 1303 | "color-convert": { 1304 | "version": "2.0.1", 1305 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1306 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1307 | "requires": { 1308 | "color-name": "~1.1.4" 1309 | } 1310 | }, 1311 | "color-name": { 1312 | "version": "1.1.4", 1313 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1314 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 1315 | }, 1316 | "concat-map": { 1317 | "version": "0.0.1", 1318 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1319 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 1320 | }, 1321 | "cross-spawn": { 1322 | "version": "7.0.6", 1323 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 1324 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 1325 | "requires": { 1326 | "path-key": "^3.1.0", 1327 | "shebang-command": "^2.0.0", 1328 | "which": "^2.0.1" 1329 | } 1330 | }, 1331 | "debug": { 1332 | "version": "4.3.7", 1333 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 1334 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 1335 | "requires": { 1336 | "ms": "^2.1.3" 1337 | } 1338 | }, 1339 | "deep-is": { 1340 | "version": "0.1.4", 1341 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 1342 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" 1343 | }, 1344 | "escape-string-regexp": { 1345 | "version": "4.0.0", 1346 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1347 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" 1348 | }, 1349 | "eslint": { 1350 | "version": "9.15.0", 1351 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.15.0.tgz", 1352 | "integrity": "sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==", 1353 | "requires": { 1354 | "@eslint-community/eslint-utils": "^4.2.0", 1355 | "@eslint-community/regexpp": "^4.12.1", 1356 | "@eslint/config-array": "^0.19.0", 1357 | "@eslint/core": "^0.9.0", 1358 | "@eslint/eslintrc": "^3.2.0", 1359 | "@eslint/js": "9.15.0", 1360 | "@eslint/plugin-kit": "^0.2.3", 1361 | "@humanfs/node": "^0.16.6", 1362 | "@humanwhocodes/module-importer": "^1.0.1", 1363 | "@humanwhocodes/retry": "^0.4.1", 1364 | "@types/estree": "^1.0.6", 1365 | "@types/json-schema": "^7.0.15", 1366 | "ajv": "^6.12.4", 1367 | "chalk": "^4.0.0", 1368 | "cross-spawn": "^7.0.5", 1369 | "debug": "^4.3.2", 1370 | "escape-string-regexp": "^4.0.0", 1371 | "eslint-scope": "^8.2.0", 1372 | "eslint-visitor-keys": "^4.2.0", 1373 | "espree": "^10.3.0", 1374 | "esquery": "^1.5.0", 1375 | "esutils": "^2.0.2", 1376 | "fast-deep-equal": "^3.1.3", 1377 | "file-entry-cache": "^8.0.0", 1378 | "find-up": "^5.0.0", 1379 | "glob-parent": "^6.0.2", 1380 | "ignore": "^5.2.0", 1381 | "imurmurhash": "^0.1.4", 1382 | "is-glob": "^4.0.0", 1383 | "json-stable-stringify-without-jsonify": "^1.0.1", 1384 | "lodash.merge": "^4.6.2", 1385 | "minimatch": "^3.1.2", 1386 | "natural-compare": "^1.4.0", 1387 | "optionator": "^0.9.3" 1388 | } 1389 | }, 1390 | "eslint-config-metarhia": { 1391 | "version": "9.1.1", 1392 | "resolved": "https://registry.npmjs.org/eslint-config-metarhia/-/eslint-config-metarhia-9.1.1.tgz", 1393 | "integrity": "sha512-PPJBiv+kFg7+0kkjHWp1k37TovG5prxIwiryiX8vQ6m2Jt4u4yIBjEjDd3P/RGXK7yrbMiiSyI2Z/GTWDS0C/Q==", 1394 | "requires": { 1395 | "eslint": "^9.10.0", 1396 | "eslint-config-prettier": "^9.1.0", 1397 | "eslint-plugin-prettier": "^5.2.1", 1398 | "prettier": "^3.3.3" 1399 | } 1400 | }, 1401 | "eslint-config-prettier": { 1402 | "version": "9.1.0", 1403 | "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", 1404 | "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", 1405 | "requires": {} 1406 | }, 1407 | "eslint-plugin-prettier": { 1408 | "version": "5.2.1", 1409 | "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", 1410 | "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", 1411 | "requires": { 1412 | "prettier-linter-helpers": "^1.0.0", 1413 | "synckit": "^0.9.1" 1414 | } 1415 | }, 1416 | "eslint-scope": { 1417 | "version": "8.2.0", 1418 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", 1419 | "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", 1420 | "requires": { 1421 | "esrecurse": "^4.3.0", 1422 | "estraverse": "^5.2.0" 1423 | } 1424 | }, 1425 | "eslint-visitor-keys": { 1426 | "version": "4.2.0", 1427 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", 1428 | "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==" 1429 | }, 1430 | "espree": { 1431 | "version": "10.3.0", 1432 | "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", 1433 | "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", 1434 | "requires": { 1435 | "acorn": "^8.14.0", 1436 | "acorn-jsx": "^5.3.2", 1437 | "eslint-visitor-keys": "^4.2.0" 1438 | } 1439 | }, 1440 | "esquery": { 1441 | "version": "1.6.0", 1442 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", 1443 | "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 1444 | "requires": { 1445 | "estraverse": "^5.1.0" 1446 | } 1447 | }, 1448 | "esrecurse": { 1449 | "version": "4.3.0", 1450 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1451 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1452 | "requires": { 1453 | "estraverse": "^5.2.0" 1454 | } 1455 | }, 1456 | "estraverse": { 1457 | "version": "5.3.0", 1458 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1459 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" 1460 | }, 1461 | "esutils": { 1462 | "version": "2.0.3", 1463 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1464 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" 1465 | }, 1466 | "fast-deep-equal": { 1467 | "version": "3.1.3", 1468 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1469 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 1470 | }, 1471 | "fast-diff": { 1472 | "version": "1.3.0", 1473 | "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", 1474 | "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==" 1475 | }, 1476 | "fast-json-stable-stringify": { 1477 | "version": "2.1.0", 1478 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1479 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 1480 | }, 1481 | "fast-levenshtein": { 1482 | "version": "2.0.6", 1483 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1484 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" 1485 | }, 1486 | "file-entry-cache": { 1487 | "version": "8.0.0", 1488 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", 1489 | "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", 1490 | "requires": { 1491 | "flat-cache": "^4.0.0" 1492 | } 1493 | }, 1494 | "find-up": { 1495 | "version": "5.0.0", 1496 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1497 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1498 | "requires": { 1499 | "locate-path": "^6.0.0", 1500 | "path-exists": "^4.0.0" 1501 | } 1502 | }, 1503 | "flat-cache": { 1504 | "version": "4.0.1", 1505 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", 1506 | "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", 1507 | "requires": { 1508 | "flatted": "^3.2.9", 1509 | "keyv": "^4.5.4" 1510 | } 1511 | }, 1512 | "flatted": { 1513 | "version": "3.3.2", 1514 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", 1515 | "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==" 1516 | }, 1517 | "glob-parent": { 1518 | "version": "6.0.2", 1519 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1520 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1521 | "requires": { 1522 | "is-glob": "^4.0.3" 1523 | } 1524 | }, 1525 | "globals": { 1526 | "version": "14.0.0", 1527 | "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", 1528 | "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==" 1529 | }, 1530 | "has-flag": { 1531 | "version": "4.0.0", 1532 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1533 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 1534 | }, 1535 | "ignore": { 1536 | "version": "5.3.2", 1537 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 1538 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==" 1539 | }, 1540 | "import-fresh": { 1541 | "version": "3.3.0", 1542 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1543 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1544 | "requires": { 1545 | "parent-module": "^1.0.0", 1546 | "resolve-from": "^4.0.0" 1547 | } 1548 | }, 1549 | "imurmurhash": { 1550 | "version": "0.1.4", 1551 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1552 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" 1553 | }, 1554 | "is-extglob": { 1555 | "version": "2.1.1", 1556 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1557 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" 1558 | }, 1559 | "is-glob": { 1560 | "version": "4.0.3", 1561 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1562 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1563 | "requires": { 1564 | "is-extglob": "^2.1.1" 1565 | } 1566 | }, 1567 | "isexe": { 1568 | "version": "2.0.0", 1569 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1570 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" 1571 | }, 1572 | "js-yaml": { 1573 | "version": "4.1.0", 1574 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1575 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1576 | "requires": { 1577 | "argparse": "^2.0.1" 1578 | } 1579 | }, 1580 | "json-buffer": { 1581 | "version": "3.0.1", 1582 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 1583 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" 1584 | }, 1585 | "json-schema-traverse": { 1586 | "version": "0.4.1", 1587 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1588 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 1589 | }, 1590 | "json-stable-stringify-without-jsonify": { 1591 | "version": "1.0.1", 1592 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1593 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" 1594 | }, 1595 | "keyv": { 1596 | "version": "4.5.4", 1597 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 1598 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 1599 | "requires": { 1600 | "json-buffer": "3.0.1" 1601 | } 1602 | }, 1603 | "levn": { 1604 | "version": "0.4.1", 1605 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1606 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1607 | "requires": { 1608 | "prelude-ls": "^1.2.1", 1609 | "type-check": "~0.4.0" 1610 | } 1611 | }, 1612 | "locate-path": { 1613 | "version": "6.0.0", 1614 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1615 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1616 | "requires": { 1617 | "p-locate": "^5.0.0" 1618 | } 1619 | }, 1620 | "lodash.merge": { 1621 | "version": "4.6.2", 1622 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1623 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" 1624 | }, 1625 | "minimatch": { 1626 | "version": "3.1.2", 1627 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1628 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1629 | "requires": { 1630 | "brace-expansion": "^1.1.7" 1631 | } 1632 | }, 1633 | "ms": { 1634 | "version": "2.1.3", 1635 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1636 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1637 | }, 1638 | "natural-compare": { 1639 | "version": "1.4.0", 1640 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1641 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" 1642 | }, 1643 | "nodemailer": { 1644 | "version": "6.9.16", 1645 | "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.16.tgz", 1646 | "integrity": "sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==" 1647 | }, 1648 | "optionator": { 1649 | "version": "0.9.4", 1650 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 1651 | "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 1652 | "requires": { 1653 | "deep-is": "^0.1.3", 1654 | "fast-levenshtein": "^2.0.6", 1655 | "levn": "^0.4.1", 1656 | "prelude-ls": "^1.2.1", 1657 | "type-check": "^0.4.0", 1658 | "word-wrap": "^1.2.5" 1659 | } 1660 | }, 1661 | "p-limit": { 1662 | "version": "3.1.0", 1663 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1664 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1665 | "requires": { 1666 | "yocto-queue": "^0.1.0" 1667 | } 1668 | }, 1669 | "p-locate": { 1670 | "version": "5.0.0", 1671 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1672 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1673 | "requires": { 1674 | "p-limit": "^3.0.2" 1675 | } 1676 | }, 1677 | "parent-module": { 1678 | "version": "1.0.1", 1679 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1680 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1681 | "requires": { 1682 | "callsites": "^3.0.0" 1683 | } 1684 | }, 1685 | "path-exists": { 1686 | "version": "4.0.0", 1687 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1688 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" 1689 | }, 1690 | "path-key": { 1691 | "version": "3.1.1", 1692 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1693 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" 1694 | }, 1695 | "prelude-ls": { 1696 | "version": "1.2.1", 1697 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1698 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" 1699 | }, 1700 | "prettier": { 1701 | "version": "3.3.3", 1702 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", 1703 | "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==" 1704 | }, 1705 | "prettier-linter-helpers": { 1706 | "version": "1.0.0", 1707 | "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", 1708 | "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", 1709 | "requires": { 1710 | "fast-diff": "^1.1.2" 1711 | } 1712 | }, 1713 | "punycode": { 1714 | "version": "2.3.1", 1715 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1716 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" 1717 | }, 1718 | "resolve-from": { 1719 | "version": "4.0.0", 1720 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1721 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" 1722 | }, 1723 | "shebang-command": { 1724 | "version": "2.0.0", 1725 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1726 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1727 | "requires": { 1728 | "shebang-regex": "^3.0.0" 1729 | } 1730 | }, 1731 | "shebang-regex": { 1732 | "version": "3.0.0", 1733 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1734 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" 1735 | }, 1736 | "strip-json-comments": { 1737 | "version": "3.1.1", 1738 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1739 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" 1740 | }, 1741 | "supports-color": { 1742 | "version": "7.2.0", 1743 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1744 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1745 | "requires": { 1746 | "has-flag": "^4.0.0" 1747 | } 1748 | }, 1749 | "synckit": { 1750 | "version": "0.9.2", 1751 | "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", 1752 | "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", 1753 | "requires": { 1754 | "@pkgr/core": "^0.1.0", 1755 | "tslib": "^2.6.2" 1756 | } 1757 | }, 1758 | "tslib": { 1759 | "version": "2.8.1", 1760 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 1761 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" 1762 | }, 1763 | "type-check": { 1764 | "version": "0.4.0", 1765 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1766 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1767 | "requires": { 1768 | "prelude-ls": "^1.2.1" 1769 | } 1770 | }, 1771 | "uri-js": { 1772 | "version": "4.4.1", 1773 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1774 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1775 | "requires": { 1776 | "punycode": "^2.1.0" 1777 | } 1778 | }, 1779 | "which": { 1780 | "version": "2.0.2", 1781 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1782 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1783 | "requires": { 1784 | "isexe": "^2.0.0" 1785 | } 1786 | }, 1787 | "word-wrap": { 1788 | "version": "1.2.5", 1789 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 1790 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==" 1791 | }, 1792 | "yocto-queue": { 1793 | "version": "0.1.0", 1794 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1795 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" 1796 | } 1797 | } 1798 | } 1799 | -------------------------------------------------------------------------------- /JavaScript/1-singletrhead/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server-monitoring", 3 | "version": "1.0.0", 4 | "description": "Actor Model example application", 5 | "main": "main.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "git+https://github.com/HowProgrammingWorks/ActorModel.git" 9 | }, 10 | "author": "Timur Shemsedinov ", 11 | "license": "MIT", 12 | "bugs": { 13 | "url": "https://github.com/HowProgrammingWorks/ActorModel/issues" 14 | }, 15 | "homepage": "https://github.com/HowProgrammingWorks/ActorModel#readme", 16 | "scripts": { 17 | "lint": "eslint . && prettier -c \"**/*.js\"", 18 | "fix": "eslint . --fix && prettier --write \"**/*.js\"" 19 | }, 20 | "dependencies": { 21 | "nodemailer": "^6.9.16", 22 | "eslint": "^9.12.0", 23 | "eslint-config-metarhia": "^9.1.0", 24 | "prettier": "^3.3.3" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /JavaScript/1-singletrhead/prettier.config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = { 4 | printWidth: 80, 5 | singleQuote: true, 6 | trailingComma: 'all', 7 | tabWidth: 2, 8 | useTabs: false, 9 | semi: true, 10 | }; 11 | -------------------------------------------------------------------------------- /JavaScript/1-singletrhead/system.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const actors = new Map(); 4 | 5 | class ActorSystem { 6 | static register(actor) { 7 | const ready = []; 8 | const instances = []; 9 | const queue = []; 10 | actors.set(actor.name, { actor, ready, instances, queue }); 11 | } 12 | 13 | static start(name, count = 1) { 14 | require(`./actors/${name.toLowerCase()}.js`); 15 | const record = actors.get(name); 16 | if (record) { 17 | const ActorClass = record.actor; 18 | const { ready, instances } = record; 19 | for (let i = 0; i < count; i++) { 20 | const instance = new ActorClass(); 21 | ready.push(instance); 22 | instances.push(instance); 23 | } 24 | } 25 | } 26 | 27 | static async stop(name) { 28 | const record = actors.get(name); 29 | if (record) { 30 | const { instances } = record; 31 | await Promise.all(instances.map((instance) => instance.exit())); 32 | } 33 | } 34 | 35 | static async send(name, data) { 36 | const record = actors.get(name); 37 | if (record) { 38 | const { ready, queue } = record; 39 | const actor = ready.shift(); 40 | if (!actor) { 41 | queue.push(data); 42 | return; 43 | } 44 | await actor.message(data); 45 | ready.push(actor); 46 | if (queue.length > 0) { 47 | const next = queue.shift(); 48 | ActorSystem.send(name, next); 49 | } 50 | } 51 | } 52 | } 53 | 54 | module.exports = ActorSystem; 55 | -------------------------------------------------------------------------------- /JavaScript/2-multiprocess/actors/mailer.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const ActorSystem = require('../system'); 4 | const nodemailer = require('nodemailer'); 5 | const auth = require('../config'); 6 | 7 | const FROM = 'nodeua.com@gmail.com'; 8 | 9 | ActorSystem.register( 10 | class Mailer { 11 | constructor() { 12 | console.log('Start actor: Mailer'); 13 | this.transport = nodemailer.createTransport({ 14 | service: 'gmail', 15 | auth, 16 | }); 17 | } 18 | 19 | message({ to, subject, message }) { 20 | const mail = { from: FROM, to, subject, text: message }; 21 | this.transport.sendMail(mail, (error, data) => { 22 | if (error) console.log(error); 23 | else console.log(`Email sent: ${data.response}`); 24 | }); 25 | } 26 | 27 | exit() { 28 | this.transport.close(); 29 | console.log('Stop actor: Mailer'); 30 | } 31 | }, 32 | ); 33 | -------------------------------------------------------------------------------- /JavaScript/2-multiprocess/actors/monitoring.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const ActorSystem = require('../system'); 4 | const http = require('node:http'); 5 | 6 | const URL = 'http://localhost:8000/'; 7 | const INTERVAL = 2000; 8 | 9 | ActorSystem.register( 10 | class Monitoring { 11 | constructor() { 12 | console.log('Start actor: Monitoring'); 13 | this.prevSuccess = true; 14 | this.timer = setInterval(() => { 15 | this.attempt(URL); 16 | }, INTERVAL); 17 | } 18 | 19 | attempt(url) { 20 | http 21 | .get(url, (res) => { 22 | const success = res.statusCode === 200; 23 | this.notify({ url, success, status: res.statusCode }); 24 | }) 25 | .on('error', (error) => { 26 | this.notify({ url, success: false, status: error.message }); 27 | }); 28 | } 29 | 30 | notify({ url, success, status }) { 31 | if (this.prevSuccess !== success) { 32 | this.prevSuccess = success; 33 | ActorSystem.send('Renderer', { url, success, status }); 34 | } 35 | } 36 | 37 | message() {} 38 | 39 | exit() { 40 | clearInterval(this.timer); 41 | console.log('Stop actor: Monitoring'); 42 | } 43 | }, 44 | ); 45 | -------------------------------------------------------------------------------- /JavaScript/2-multiprocess/actors/renderer.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const ActorSystem = require('../system'); 4 | 5 | ActorSystem.register( 6 | class Renderer { 7 | constructor() { 8 | console.log('Start actor: Renderer'); 9 | } 10 | 11 | message({ url, success, status }) { 12 | const to = 'nodeua.com@gmail.com'; 13 | const msg = success ? 'is available again' : 'is not available'; 14 | const date = new Date().toUTCString(); 15 | const reason = (success ? 'Status code: ' : 'Error code: ') + status; 16 | const message = `Resource ${url} ${msg} (${date})\n${reason}`; 17 | const subject = 'Server Monitoring'; 18 | ActorSystem.send('Mailer', { to, subject, message }); 19 | } 20 | 21 | exit() { 22 | console.log('Stop actor: Renderer'); 23 | } 24 | }, 25 | ); 26 | -------------------------------------------------------------------------------- /JavaScript/2-multiprocess/actors/root.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const ActorSystem = require('../system'); 4 | 5 | ActorSystem.register( 6 | class Root { 7 | constructor() { 8 | console.log('Start actor: Root'); 9 | ActorSystem.start('Monitoring'); 10 | ActorSystem.start('Renderer'); 11 | ActorSystem.start('Mailer', 3); 12 | } 13 | 14 | message() {} 15 | 16 | exit() { 17 | ActorSystem.stop('Monitoring'); 18 | ActorSystem.stop('Renderer'); 19 | ActorSystem.stop('Mailer'); 20 | console.log('Stop actor: Root'); 21 | } 22 | }, 23 | ); 24 | -------------------------------------------------------------------------------- /JavaScript/2-multiprocess/config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = { 4 | user: 'account-name@gmail.com', 5 | pass: 'your-password', 6 | }; 7 | -------------------------------------------------------------------------------- /JavaScript/2-multiprocess/eslint.config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const init = require('eslint-config-metarhia'); 4 | 5 | init[0].rules['class-methods-use-this'] = 'off'; 6 | 7 | module.exports = init; 8 | -------------------------------------------------------------------------------- /JavaScript/2-multiprocess/main.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const ActorSystem = require('./system.js'); 4 | 5 | const EXIT_NORMAL = 1000; 6 | const EXIT_ABNORMAL = 5000; 7 | 8 | ActorSystem.start('Root'); 9 | 10 | process.on('SIGINT', () => { 11 | console.log(''); 12 | ActorSystem.stop('Root'); 13 | setTimeout(() => { 14 | console.log('Graceful shutdown'); 15 | process.exit(0); 16 | }, EXIT_NORMAL); 17 | setTimeout(() => { 18 | console.log('Abnormal termination'); 19 | process.exit(1); 20 | }, EXIT_ABNORMAL); 21 | }); 22 | -------------------------------------------------------------------------------- /JavaScript/2-multiprocess/master.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const cp = require('node:child_process'); 4 | 5 | const actors = new Map(); 6 | 7 | class MasterSystem { 8 | static start(name, count = 1) { 9 | if (!actors.has(name)) { 10 | const ready = []; 11 | const instances = []; 12 | const queue = []; 13 | actors.set(name, { ready, instances, queue }); 14 | } 15 | const { ready, instances } = actors.get(name); 16 | for (let i = 0; i < count; i++) { 17 | const actor = cp.fork('./system.js'); 18 | MasterSystem.subscribe(actor); 19 | ready.push(actor); 20 | instances.push(actor); 21 | actor.send({ command: 'start', name }); 22 | } 23 | } 24 | 25 | static stop(name) { 26 | const record = actors.get(name); 27 | if (record) { 28 | const { instances } = record; 29 | for (const actor of instances) { 30 | actor.send({ command: 'stop' }); 31 | } 32 | } 33 | } 34 | 35 | static send(name, data) { 36 | const record = actors.get(name); 37 | if (record) { 38 | const { ready, queue } = record; 39 | const actor = ready.shift(); 40 | if (!actor) { 41 | queue.push(data); 42 | return; 43 | } 44 | actor.send({ command: 'message', data }); 45 | } 46 | } 47 | 48 | static subscribe(actor) { 49 | actor.on('message', (message) => { 50 | const { command, name } = message; 51 | if (command === 'message') { 52 | const { data } = message; 53 | MasterSystem.send(name, data); 54 | return; 55 | } 56 | if (command === 'start') { 57 | const { count } = message; 58 | MasterSystem.start(name, count); 59 | return; 60 | } 61 | if (command === 'stop') { 62 | MasterSystem.stop(name); 63 | return; 64 | } 65 | if (command === 'ready') { 66 | const { pid } = message; 67 | const record = actors.get(name); 68 | if (record) { 69 | const { ready, instances, queue } = record; 70 | for (const actor of instances) { 71 | if (actor.pid === pid) ready.push(actor); 72 | } 73 | if (queue.length > 0) { 74 | const next = queue.shift(); 75 | MasterSystem.send(name, next); 76 | } 77 | } 78 | } 79 | }); 80 | } 81 | } 82 | 83 | module.exports = MasterSystem; 84 | -------------------------------------------------------------------------------- /JavaScript/2-multiprocess/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server-monitoring", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "server-monitoring", 9 | "version": "1.0.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "eslint": "^9.12.0", 13 | "eslint-config-metarhia": "^9.1.0", 14 | "nodemailer": "^6.9.16", 15 | "prettier": "^3.3.3" 16 | } 17 | }, 18 | "node_modules/@eslint-community/eslint-utils": { 19 | "version": "4.4.1", 20 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", 21 | "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", 22 | "license": "MIT", 23 | "dependencies": { 24 | "eslint-visitor-keys": "^3.4.3" 25 | }, 26 | "engines": { 27 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 28 | }, 29 | "funding": { 30 | "url": "https://opencollective.com/eslint" 31 | }, 32 | "peerDependencies": { 33 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 34 | } 35 | }, 36 | "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { 37 | "version": "3.4.3", 38 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 39 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 40 | "license": "Apache-2.0", 41 | "engines": { 42 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 43 | }, 44 | "funding": { 45 | "url": "https://opencollective.com/eslint" 46 | } 47 | }, 48 | "node_modules/@eslint-community/regexpp": { 49 | "version": "4.12.1", 50 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", 51 | "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", 52 | "license": "MIT", 53 | "engines": { 54 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 55 | } 56 | }, 57 | "node_modules/@eslint/config-array": { 58 | "version": "0.19.0", 59 | "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", 60 | "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", 61 | "license": "Apache-2.0", 62 | "dependencies": { 63 | "@eslint/object-schema": "^2.1.4", 64 | "debug": "^4.3.1", 65 | "minimatch": "^3.1.2" 66 | }, 67 | "engines": { 68 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 69 | } 70 | }, 71 | "node_modules/@eslint/core": { 72 | "version": "0.9.0", 73 | "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", 74 | "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", 75 | "license": "Apache-2.0", 76 | "engines": { 77 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 78 | } 79 | }, 80 | "node_modules/@eslint/eslintrc": { 81 | "version": "3.2.0", 82 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", 83 | "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", 84 | "license": "MIT", 85 | "dependencies": { 86 | "ajv": "^6.12.4", 87 | "debug": "^4.3.2", 88 | "espree": "^10.0.1", 89 | "globals": "^14.0.0", 90 | "ignore": "^5.2.0", 91 | "import-fresh": "^3.2.1", 92 | "js-yaml": "^4.1.0", 93 | "minimatch": "^3.1.2", 94 | "strip-json-comments": "^3.1.1" 95 | }, 96 | "engines": { 97 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 98 | }, 99 | "funding": { 100 | "url": "https://opencollective.com/eslint" 101 | } 102 | }, 103 | "node_modules/@eslint/js": { 104 | "version": "9.15.0", 105 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz", 106 | "integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==", 107 | "license": "MIT", 108 | "engines": { 109 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 110 | } 111 | }, 112 | "node_modules/@eslint/object-schema": { 113 | "version": "2.1.4", 114 | "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", 115 | "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", 116 | "license": "Apache-2.0", 117 | "engines": { 118 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 119 | } 120 | }, 121 | "node_modules/@eslint/plugin-kit": { 122 | "version": "0.2.3", 123 | "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", 124 | "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", 125 | "license": "Apache-2.0", 126 | "dependencies": { 127 | "levn": "^0.4.1" 128 | }, 129 | "engines": { 130 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 131 | } 132 | }, 133 | "node_modules/@humanfs/core": { 134 | "version": "0.19.1", 135 | "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", 136 | "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", 137 | "license": "Apache-2.0", 138 | "engines": { 139 | "node": ">=18.18.0" 140 | } 141 | }, 142 | "node_modules/@humanfs/node": { 143 | "version": "0.16.6", 144 | "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", 145 | "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", 146 | "license": "Apache-2.0", 147 | "dependencies": { 148 | "@humanfs/core": "^0.19.1", 149 | "@humanwhocodes/retry": "^0.3.0" 150 | }, 151 | "engines": { 152 | "node": ">=18.18.0" 153 | } 154 | }, 155 | "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { 156 | "version": "0.3.1", 157 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", 158 | "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", 159 | "license": "Apache-2.0", 160 | "engines": { 161 | "node": ">=18.18" 162 | }, 163 | "funding": { 164 | "type": "github", 165 | "url": "https://github.com/sponsors/nzakas" 166 | } 167 | }, 168 | "node_modules/@humanwhocodes/module-importer": { 169 | "version": "1.0.1", 170 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 171 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 172 | "license": "Apache-2.0", 173 | "engines": { 174 | "node": ">=12.22" 175 | }, 176 | "funding": { 177 | "type": "github", 178 | "url": "https://github.com/sponsors/nzakas" 179 | } 180 | }, 181 | "node_modules/@humanwhocodes/retry": { 182 | "version": "0.4.1", 183 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", 184 | "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", 185 | "license": "Apache-2.0", 186 | "engines": { 187 | "node": ">=18.18" 188 | }, 189 | "funding": { 190 | "type": "github", 191 | "url": "https://github.com/sponsors/nzakas" 192 | } 193 | }, 194 | "node_modules/@pkgr/core": { 195 | "version": "0.1.1", 196 | "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", 197 | "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", 198 | "license": "MIT", 199 | "engines": { 200 | "node": "^12.20.0 || ^14.18.0 || >=16.0.0" 201 | }, 202 | "funding": { 203 | "url": "https://opencollective.com/unts" 204 | } 205 | }, 206 | "node_modules/@types/estree": { 207 | "version": "1.0.6", 208 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 209 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 210 | "license": "MIT" 211 | }, 212 | "node_modules/@types/json-schema": { 213 | "version": "7.0.15", 214 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 215 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 216 | "license": "MIT" 217 | }, 218 | "node_modules/acorn": { 219 | "version": "8.14.0", 220 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 221 | "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 222 | "license": "MIT", 223 | "bin": { 224 | "acorn": "bin/acorn" 225 | }, 226 | "engines": { 227 | "node": ">=0.4.0" 228 | } 229 | }, 230 | "node_modules/acorn-jsx": { 231 | "version": "5.3.2", 232 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 233 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 234 | "license": "MIT", 235 | "peerDependencies": { 236 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 237 | } 238 | }, 239 | "node_modules/ajv": { 240 | "version": "6.12.6", 241 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 242 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 243 | "license": "MIT", 244 | "dependencies": { 245 | "fast-deep-equal": "^3.1.1", 246 | "fast-json-stable-stringify": "^2.0.0", 247 | "json-schema-traverse": "^0.4.1", 248 | "uri-js": "^4.2.2" 249 | }, 250 | "funding": { 251 | "type": "github", 252 | "url": "https://github.com/sponsors/epoberezkin" 253 | } 254 | }, 255 | "node_modules/ansi-styles": { 256 | "version": "4.3.0", 257 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 258 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 259 | "license": "MIT", 260 | "dependencies": { 261 | "color-convert": "^2.0.1" 262 | }, 263 | "engines": { 264 | "node": ">=8" 265 | }, 266 | "funding": { 267 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 268 | } 269 | }, 270 | "node_modules/argparse": { 271 | "version": "2.0.1", 272 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 273 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 274 | "license": "Python-2.0" 275 | }, 276 | "node_modules/balanced-match": { 277 | "version": "1.0.2", 278 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 279 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 280 | "license": "MIT" 281 | }, 282 | "node_modules/brace-expansion": { 283 | "version": "1.1.11", 284 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 285 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 286 | "license": "MIT", 287 | "dependencies": { 288 | "balanced-match": "^1.0.0", 289 | "concat-map": "0.0.1" 290 | } 291 | }, 292 | "node_modules/callsites": { 293 | "version": "3.1.0", 294 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 295 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 296 | "license": "MIT", 297 | "engines": { 298 | "node": ">=6" 299 | } 300 | }, 301 | "node_modules/chalk": { 302 | "version": "4.1.2", 303 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 304 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 305 | "license": "MIT", 306 | "dependencies": { 307 | "ansi-styles": "^4.1.0", 308 | "supports-color": "^7.1.0" 309 | }, 310 | "engines": { 311 | "node": ">=10" 312 | }, 313 | "funding": { 314 | "url": "https://github.com/chalk/chalk?sponsor=1" 315 | } 316 | }, 317 | "node_modules/color-convert": { 318 | "version": "2.0.1", 319 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 320 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 321 | "license": "MIT", 322 | "dependencies": { 323 | "color-name": "~1.1.4" 324 | }, 325 | "engines": { 326 | "node": ">=7.0.0" 327 | } 328 | }, 329 | "node_modules/color-name": { 330 | "version": "1.1.4", 331 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 332 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 333 | "license": "MIT" 334 | }, 335 | "node_modules/concat-map": { 336 | "version": "0.0.1", 337 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 338 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 339 | "license": "MIT" 340 | }, 341 | "node_modules/cross-spawn": { 342 | "version": "7.0.6", 343 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 344 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 345 | "license": "MIT", 346 | "dependencies": { 347 | "path-key": "^3.1.0", 348 | "shebang-command": "^2.0.0", 349 | "which": "^2.0.1" 350 | }, 351 | "engines": { 352 | "node": ">= 8" 353 | } 354 | }, 355 | "node_modules/debug": { 356 | "version": "4.3.7", 357 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 358 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 359 | "license": "MIT", 360 | "dependencies": { 361 | "ms": "^2.1.3" 362 | }, 363 | "engines": { 364 | "node": ">=6.0" 365 | }, 366 | "peerDependenciesMeta": { 367 | "supports-color": { 368 | "optional": true 369 | } 370 | } 371 | }, 372 | "node_modules/deep-is": { 373 | "version": "0.1.4", 374 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 375 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 376 | "license": "MIT" 377 | }, 378 | "node_modules/escape-string-regexp": { 379 | "version": "4.0.0", 380 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 381 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 382 | "license": "MIT", 383 | "engines": { 384 | "node": ">=10" 385 | }, 386 | "funding": { 387 | "url": "https://github.com/sponsors/sindresorhus" 388 | } 389 | }, 390 | "node_modules/eslint": { 391 | "version": "9.15.0", 392 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.15.0.tgz", 393 | "integrity": "sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==", 394 | "license": "MIT", 395 | "dependencies": { 396 | "@eslint-community/eslint-utils": "^4.2.0", 397 | "@eslint-community/regexpp": "^4.12.1", 398 | "@eslint/config-array": "^0.19.0", 399 | "@eslint/core": "^0.9.0", 400 | "@eslint/eslintrc": "^3.2.0", 401 | "@eslint/js": "9.15.0", 402 | "@eslint/plugin-kit": "^0.2.3", 403 | "@humanfs/node": "^0.16.6", 404 | "@humanwhocodes/module-importer": "^1.0.1", 405 | "@humanwhocodes/retry": "^0.4.1", 406 | "@types/estree": "^1.0.6", 407 | "@types/json-schema": "^7.0.15", 408 | "ajv": "^6.12.4", 409 | "chalk": "^4.0.0", 410 | "cross-spawn": "^7.0.5", 411 | "debug": "^4.3.2", 412 | "escape-string-regexp": "^4.0.0", 413 | "eslint-scope": "^8.2.0", 414 | "eslint-visitor-keys": "^4.2.0", 415 | "espree": "^10.3.0", 416 | "esquery": "^1.5.0", 417 | "esutils": "^2.0.2", 418 | "fast-deep-equal": "^3.1.3", 419 | "file-entry-cache": "^8.0.0", 420 | "find-up": "^5.0.0", 421 | "glob-parent": "^6.0.2", 422 | "ignore": "^5.2.0", 423 | "imurmurhash": "^0.1.4", 424 | "is-glob": "^4.0.0", 425 | "json-stable-stringify-without-jsonify": "^1.0.1", 426 | "lodash.merge": "^4.6.2", 427 | "minimatch": "^3.1.2", 428 | "natural-compare": "^1.4.0", 429 | "optionator": "^0.9.3" 430 | }, 431 | "bin": { 432 | "eslint": "bin/eslint.js" 433 | }, 434 | "engines": { 435 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 436 | }, 437 | "funding": { 438 | "url": "https://eslint.org/donate" 439 | }, 440 | "peerDependencies": { 441 | "jiti": "*" 442 | }, 443 | "peerDependenciesMeta": { 444 | "jiti": { 445 | "optional": true 446 | } 447 | } 448 | }, 449 | "node_modules/eslint-config-metarhia": { 450 | "version": "9.1.1", 451 | "resolved": "https://registry.npmjs.org/eslint-config-metarhia/-/eslint-config-metarhia-9.1.1.tgz", 452 | "integrity": "sha512-PPJBiv+kFg7+0kkjHWp1k37TovG5prxIwiryiX8vQ6m2Jt4u4yIBjEjDd3P/RGXK7yrbMiiSyI2Z/GTWDS0C/Q==", 453 | "license": "MIT", 454 | "dependencies": { 455 | "eslint": "^9.10.0", 456 | "eslint-config-prettier": "^9.1.0", 457 | "eslint-plugin-prettier": "^5.2.1", 458 | "prettier": "^3.3.3" 459 | }, 460 | "engines": { 461 | "node": "18 || 20 || 21 || 22 || 23" 462 | }, 463 | "funding": { 464 | "type": "patreon", 465 | "url": "https://www.patreon.com/tshemsedinov" 466 | } 467 | }, 468 | "node_modules/eslint-config-prettier": { 469 | "version": "9.1.0", 470 | "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", 471 | "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", 472 | "license": "MIT", 473 | "bin": { 474 | "eslint-config-prettier": "bin/cli.js" 475 | }, 476 | "peerDependencies": { 477 | "eslint": ">=7.0.0" 478 | } 479 | }, 480 | "node_modules/eslint-plugin-prettier": { 481 | "version": "5.2.1", 482 | "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", 483 | "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", 484 | "license": "MIT", 485 | "dependencies": { 486 | "prettier-linter-helpers": "^1.0.0", 487 | "synckit": "^0.9.1" 488 | }, 489 | "engines": { 490 | "node": "^14.18.0 || >=16.0.0" 491 | }, 492 | "funding": { 493 | "url": "https://opencollective.com/eslint-plugin-prettier" 494 | }, 495 | "peerDependencies": { 496 | "@types/eslint": ">=8.0.0", 497 | "eslint": ">=8.0.0", 498 | "eslint-config-prettier": "*", 499 | "prettier": ">=3.0.0" 500 | }, 501 | "peerDependenciesMeta": { 502 | "@types/eslint": { 503 | "optional": true 504 | }, 505 | "eslint-config-prettier": { 506 | "optional": true 507 | } 508 | } 509 | }, 510 | "node_modules/eslint-scope": { 511 | "version": "8.2.0", 512 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", 513 | "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", 514 | "license": "BSD-2-Clause", 515 | "dependencies": { 516 | "esrecurse": "^4.3.0", 517 | "estraverse": "^5.2.0" 518 | }, 519 | "engines": { 520 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 521 | }, 522 | "funding": { 523 | "url": "https://opencollective.com/eslint" 524 | } 525 | }, 526 | "node_modules/eslint-visitor-keys": { 527 | "version": "4.2.0", 528 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", 529 | "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", 530 | "license": "Apache-2.0", 531 | "engines": { 532 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 533 | }, 534 | "funding": { 535 | "url": "https://opencollective.com/eslint" 536 | } 537 | }, 538 | "node_modules/espree": { 539 | "version": "10.3.0", 540 | "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", 541 | "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", 542 | "license": "BSD-2-Clause", 543 | "dependencies": { 544 | "acorn": "^8.14.0", 545 | "acorn-jsx": "^5.3.2", 546 | "eslint-visitor-keys": "^4.2.0" 547 | }, 548 | "engines": { 549 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 550 | }, 551 | "funding": { 552 | "url": "https://opencollective.com/eslint" 553 | } 554 | }, 555 | "node_modules/esquery": { 556 | "version": "1.6.0", 557 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", 558 | "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 559 | "license": "BSD-3-Clause", 560 | "dependencies": { 561 | "estraverse": "^5.1.0" 562 | }, 563 | "engines": { 564 | "node": ">=0.10" 565 | } 566 | }, 567 | "node_modules/esrecurse": { 568 | "version": "4.3.0", 569 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 570 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 571 | "license": "BSD-2-Clause", 572 | "dependencies": { 573 | "estraverse": "^5.2.0" 574 | }, 575 | "engines": { 576 | "node": ">=4.0" 577 | } 578 | }, 579 | "node_modules/estraverse": { 580 | "version": "5.3.0", 581 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 582 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 583 | "license": "BSD-2-Clause", 584 | "engines": { 585 | "node": ">=4.0" 586 | } 587 | }, 588 | "node_modules/esutils": { 589 | "version": "2.0.3", 590 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 591 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 592 | "license": "BSD-2-Clause", 593 | "engines": { 594 | "node": ">=0.10.0" 595 | } 596 | }, 597 | "node_modules/fast-deep-equal": { 598 | "version": "3.1.3", 599 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 600 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 601 | "license": "MIT" 602 | }, 603 | "node_modules/fast-diff": { 604 | "version": "1.3.0", 605 | "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", 606 | "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", 607 | "license": "Apache-2.0" 608 | }, 609 | "node_modules/fast-json-stable-stringify": { 610 | "version": "2.1.0", 611 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 612 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 613 | "license": "MIT" 614 | }, 615 | "node_modules/fast-levenshtein": { 616 | "version": "2.0.6", 617 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 618 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 619 | "license": "MIT" 620 | }, 621 | "node_modules/file-entry-cache": { 622 | "version": "8.0.0", 623 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", 624 | "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", 625 | "license": "MIT", 626 | "dependencies": { 627 | "flat-cache": "^4.0.0" 628 | }, 629 | "engines": { 630 | "node": ">=16.0.0" 631 | } 632 | }, 633 | "node_modules/find-up": { 634 | "version": "5.0.0", 635 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 636 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 637 | "license": "MIT", 638 | "dependencies": { 639 | "locate-path": "^6.0.0", 640 | "path-exists": "^4.0.0" 641 | }, 642 | "engines": { 643 | "node": ">=10" 644 | }, 645 | "funding": { 646 | "url": "https://github.com/sponsors/sindresorhus" 647 | } 648 | }, 649 | "node_modules/flat-cache": { 650 | "version": "4.0.1", 651 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", 652 | "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", 653 | "license": "MIT", 654 | "dependencies": { 655 | "flatted": "^3.2.9", 656 | "keyv": "^4.5.4" 657 | }, 658 | "engines": { 659 | "node": ">=16" 660 | } 661 | }, 662 | "node_modules/flatted": { 663 | "version": "3.3.2", 664 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", 665 | "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", 666 | "license": "ISC" 667 | }, 668 | "node_modules/glob-parent": { 669 | "version": "6.0.2", 670 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 671 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 672 | "license": "ISC", 673 | "dependencies": { 674 | "is-glob": "^4.0.3" 675 | }, 676 | "engines": { 677 | "node": ">=10.13.0" 678 | } 679 | }, 680 | "node_modules/globals": { 681 | "version": "14.0.0", 682 | "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", 683 | "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", 684 | "license": "MIT", 685 | "engines": { 686 | "node": ">=18" 687 | }, 688 | "funding": { 689 | "url": "https://github.com/sponsors/sindresorhus" 690 | } 691 | }, 692 | "node_modules/has-flag": { 693 | "version": "4.0.0", 694 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 695 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 696 | "license": "MIT", 697 | "engines": { 698 | "node": ">=8" 699 | } 700 | }, 701 | "node_modules/ignore": { 702 | "version": "5.3.2", 703 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 704 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 705 | "license": "MIT", 706 | "engines": { 707 | "node": ">= 4" 708 | } 709 | }, 710 | "node_modules/import-fresh": { 711 | "version": "3.3.0", 712 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 713 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 714 | "license": "MIT", 715 | "dependencies": { 716 | "parent-module": "^1.0.0", 717 | "resolve-from": "^4.0.0" 718 | }, 719 | "engines": { 720 | "node": ">=6" 721 | }, 722 | "funding": { 723 | "url": "https://github.com/sponsors/sindresorhus" 724 | } 725 | }, 726 | "node_modules/imurmurhash": { 727 | "version": "0.1.4", 728 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 729 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 730 | "license": "MIT", 731 | "engines": { 732 | "node": ">=0.8.19" 733 | } 734 | }, 735 | "node_modules/is-extglob": { 736 | "version": "2.1.1", 737 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 738 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 739 | "license": "MIT", 740 | "engines": { 741 | "node": ">=0.10.0" 742 | } 743 | }, 744 | "node_modules/is-glob": { 745 | "version": "4.0.3", 746 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 747 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 748 | "license": "MIT", 749 | "dependencies": { 750 | "is-extglob": "^2.1.1" 751 | }, 752 | "engines": { 753 | "node": ">=0.10.0" 754 | } 755 | }, 756 | "node_modules/isexe": { 757 | "version": "2.0.0", 758 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 759 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 760 | "license": "ISC" 761 | }, 762 | "node_modules/js-yaml": { 763 | "version": "4.1.0", 764 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 765 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 766 | "license": "MIT", 767 | "dependencies": { 768 | "argparse": "^2.0.1" 769 | }, 770 | "bin": { 771 | "js-yaml": "bin/js-yaml.js" 772 | } 773 | }, 774 | "node_modules/json-buffer": { 775 | "version": "3.0.1", 776 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 777 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 778 | "license": "MIT" 779 | }, 780 | "node_modules/json-schema-traverse": { 781 | "version": "0.4.1", 782 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 783 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 784 | "license": "MIT" 785 | }, 786 | "node_modules/json-stable-stringify-without-jsonify": { 787 | "version": "1.0.1", 788 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 789 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 790 | "license": "MIT" 791 | }, 792 | "node_modules/keyv": { 793 | "version": "4.5.4", 794 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 795 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 796 | "license": "MIT", 797 | "dependencies": { 798 | "json-buffer": "3.0.1" 799 | } 800 | }, 801 | "node_modules/levn": { 802 | "version": "0.4.1", 803 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 804 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 805 | "license": "MIT", 806 | "dependencies": { 807 | "prelude-ls": "^1.2.1", 808 | "type-check": "~0.4.0" 809 | }, 810 | "engines": { 811 | "node": ">= 0.8.0" 812 | } 813 | }, 814 | "node_modules/locate-path": { 815 | "version": "6.0.0", 816 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 817 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 818 | "license": "MIT", 819 | "dependencies": { 820 | "p-locate": "^5.0.0" 821 | }, 822 | "engines": { 823 | "node": ">=10" 824 | }, 825 | "funding": { 826 | "url": "https://github.com/sponsors/sindresorhus" 827 | } 828 | }, 829 | "node_modules/lodash.merge": { 830 | "version": "4.6.2", 831 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 832 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 833 | "license": "MIT" 834 | }, 835 | "node_modules/minimatch": { 836 | "version": "3.1.2", 837 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 838 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 839 | "license": "ISC", 840 | "dependencies": { 841 | "brace-expansion": "^1.1.7" 842 | }, 843 | "engines": { 844 | "node": "*" 845 | } 846 | }, 847 | "node_modules/ms": { 848 | "version": "2.1.3", 849 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 850 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 851 | "license": "MIT" 852 | }, 853 | "node_modules/natural-compare": { 854 | "version": "1.4.0", 855 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 856 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 857 | "license": "MIT" 858 | }, 859 | "node_modules/nodemailer": { 860 | "version": "6.9.16", 861 | "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.16.tgz", 862 | "integrity": "sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==", 863 | "license": "MIT-0", 864 | "engines": { 865 | "node": ">=6.0.0" 866 | } 867 | }, 868 | "node_modules/optionator": { 869 | "version": "0.9.4", 870 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 871 | "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 872 | "license": "MIT", 873 | "dependencies": { 874 | "deep-is": "^0.1.3", 875 | "fast-levenshtein": "^2.0.6", 876 | "levn": "^0.4.1", 877 | "prelude-ls": "^1.2.1", 878 | "type-check": "^0.4.0", 879 | "word-wrap": "^1.2.5" 880 | }, 881 | "engines": { 882 | "node": ">= 0.8.0" 883 | } 884 | }, 885 | "node_modules/p-limit": { 886 | "version": "3.1.0", 887 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 888 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 889 | "license": "MIT", 890 | "dependencies": { 891 | "yocto-queue": "^0.1.0" 892 | }, 893 | "engines": { 894 | "node": ">=10" 895 | }, 896 | "funding": { 897 | "url": "https://github.com/sponsors/sindresorhus" 898 | } 899 | }, 900 | "node_modules/p-locate": { 901 | "version": "5.0.0", 902 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 903 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 904 | "license": "MIT", 905 | "dependencies": { 906 | "p-limit": "^3.0.2" 907 | }, 908 | "engines": { 909 | "node": ">=10" 910 | }, 911 | "funding": { 912 | "url": "https://github.com/sponsors/sindresorhus" 913 | } 914 | }, 915 | "node_modules/parent-module": { 916 | "version": "1.0.1", 917 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 918 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 919 | "license": "MIT", 920 | "dependencies": { 921 | "callsites": "^3.0.0" 922 | }, 923 | "engines": { 924 | "node": ">=6" 925 | } 926 | }, 927 | "node_modules/path-exists": { 928 | "version": "4.0.0", 929 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 930 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 931 | "license": "MIT", 932 | "engines": { 933 | "node": ">=8" 934 | } 935 | }, 936 | "node_modules/path-key": { 937 | "version": "3.1.1", 938 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 939 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 940 | "license": "MIT", 941 | "engines": { 942 | "node": ">=8" 943 | } 944 | }, 945 | "node_modules/prelude-ls": { 946 | "version": "1.2.1", 947 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 948 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 949 | "license": "MIT", 950 | "engines": { 951 | "node": ">= 0.8.0" 952 | } 953 | }, 954 | "node_modules/prettier": { 955 | "version": "3.3.3", 956 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", 957 | "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", 958 | "license": "MIT", 959 | "bin": { 960 | "prettier": "bin/prettier.cjs" 961 | }, 962 | "engines": { 963 | "node": ">=14" 964 | }, 965 | "funding": { 966 | "url": "https://github.com/prettier/prettier?sponsor=1" 967 | } 968 | }, 969 | "node_modules/prettier-linter-helpers": { 970 | "version": "1.0.0", 971 | "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", 972 | "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", 973 | "license": "MIT", 974 | "dependencies": { 975 | "fast-diff": "^1.1.2" 976 | }, 977 | "engines": { 978 | "node": ">=6.0.0" 979 | } 980 | }, 981 | "node_modules/punycode": { 982 | "version": "2.3.1", 983 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 984 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 985 | "license": "MIT", 986 | "engines": { 987 | "node": ">=6" 988 | } 989 | }, 990 | "node_modules/resolve-from": { 991 | "version": "4.0.0", 992 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 993 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 994 | "license": "MIT", 995 | "engines": { 996 | "node": ">=4" 997 | } 998 | }, 999 | "node_modules/shebang-command": { 1000 | "version": "2.0.0", 1001 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1002 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1003 | "license": "MIT", 1004 | "dependencies": { 1005 | "shebang-regex": "^3.0.0" 1006 | }, 1007 | "engines": { 1008 | "node": ">=8" 1009 | } 1010 | }, 1011 | "node_modules/shebang-regex": { 1012 | "version": "3.0.0", 1013 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1014 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1015 | "license": "MIT", 1016 | "engines": { 1017 | "node": ">=8" 1018 | } 1019 | }, 1020 | "node_modules/strip-json-comments": { 1021 | "version": "3.1.1", 1022 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1023 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1024 | "license": "MIT", 1025 | "engines": { 1026 | "node": ">=8" 1027 | }, 1028 | "funding": { 1029 | "url": "https://github.com/sponsors/sindresorhus" 1030 | } 1031 | }, 1032 | "node_modules/supports-color": { 1033 | "version": "7.2.0", 1034 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1035 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1036 | "license": "MIT", 1037 | "dependencies": { 1038 | "has-flag": "^4.0.0" 1039 | }, 1040 | "engines": { 1041 | "node": ">=8" 1042 | } 1043 | }, 1044 | "node_modules/synckit": { 1045 | "version": "0.9.2", 1046 | "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", 1047 | "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", 1048 | "license": "MIT", 1049 | "dependencies": { 1050 | "@pkgr/core": "^0.1.0", 1051 | "tslib": "^2.6.2" 1052 | }, 1053 | "engines": { 1054 | "node": "^14.18.0 || >=16.0.0" 1055 | }, 1056 | "funding": { 1057 | "url": "https://opencollective.com/unts" 1058 | } 1059 | }, 1060 | "node_modules/tslib": { 1061 | "version": "2.8.1", 1062 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 1063 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 1064 | "license": "0BSD" 1065 | }, 1066 | "node_modules/type-check": { 1067 | "version": "0.4.0", 1068 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1069 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1070 | "license": "MIT", 1071 | "dependencies": { 1072 | "prelude-ls": "^1.2.1" 1073 | }, 1074 | "engines": { 1075 | "node": ">= 0.8.0" 1076 | } 1077 | }, 1078 | "node_modules/uri-js": { 1079 | "version": "4.4.1", 1080 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1081 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1082 | "license": "BSD-2-Clause", 1083 | "dependencies": { 1084 | "punycode": "^2.1.0" 1085 | } 1086 | }, 1087 | "node_modules/which": { 1088 | "version": "2.0.2", 1089 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1090 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1091 | "license": "ISC", 1092 | "dependencies": { 1093 | "isexe": "^2.0.0" 1094 | }, 1095 | "bin": { 1096 | "node-which": "bin/node-which" 1097 | }, 1098 | "engines": { 1099 | "node": ">= 8" 1100 | } 1101 | }, 1102 | "node_modules/word-wrap": { 1103 | "version": "1.2.5", 1104 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 1105 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 1106 | "license": "MIT", 1107 | "engines": { 1108 | "node": ">=0.10.0" 1109 | } 1110 | }, 1111 | "node_modules/yocto-queue": { 1112 | "version": "0.1.0", 1113 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1114 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1115 | "license": "MIT", 1116 | "engines": { 1117 | "node": ">=10" 1118 | }, 1119 | "funding": { 1120 | "url": "https://github.com/sponsors/sindresorhus" 1121 | } 1122 | } 1123 | } 1124 | } 1125 | -------------------------------------------------------------------------------- /JavaScript/2-multiprocess/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server-monitoring", 3 | "version": "1.0.0", 4 | "description": "Actor Model example application", 5 | "main": "main.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "git+https://github.com/HowProgrammingWorks/ActorModel.git" 9 | }, 10 | "author": "Timur Shemsedinov ", 11 | "license": "MIT", 12 | "bugs": { 13 | "url": "https://github.com/HowProgrammingWorks/ActorModel/issues" 14 | }, 15 | "homepage": "https://github.com/HowProgrammingWorks/ActorModel#readme", 16 | "scripts": { 17 | "lint": "eslint . && prettier -c \"**/*.js\"", 18 | "fix": "eslint . --fix && prettier --write \"**/*.js\"" 19 | }, 20 | "dependencies": { 21 | "nodemailer": "^6.9.16", 22 | "eslint": "^9.12.0", 23 | "eslint-config-metarhia": "^9.1.0", 24 | "prettier": "^3.3.3" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /JavaScript/2-multiprocess/prettier.config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = { 4 | printWidth: 80, 5 | singleQuote: true, 6 | trailingComma: 'all', 7 | tabWidth: 2, 8 | useTabs: false, 9 | semi: true, 10 | }; 11 | -------------------------------------------------------------------------------- /JavaScript/2-multiprocess/system.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = process.channel ? require('./worker') : require('./master'); 4 | -------------------------------------------------------------------------------- /JavaScript/2-multiprocess/worker.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | class ActorSystem { 4 | static register(actor) { 5 | ActorSystem.actor = actor; 6 | } 7 | 8 | static start(name, count = 1) { 9 | process.send({ command: 'start', name, count }); 10 | } 11 | 12 | static stop(name) { 13 | process.send({ command: 'stop', name }); 14 | } 15 | 16 | static send(name, data) { 17 | process.send({ command: 'message', name, data }); 18 | } 19 | } 20 | 21 | ActorSystem.actor = null; 22 | ActorSystem.instance = null; 23 | 24 | process.on('SIGINT', () => {}); 25 | 26 | process.on('message', (message) => { 27 | const { command } = message; 28 | if (command === 'start') { 29 | const { name } = message; 30 | require(`./actors/${name.toLowerCase()}.js`); 31 | const ActorClass = ActorSystem.actor; 32 | ActorSystem.instance = new ActorClass(); 33 | return; 34 | } 35 | if (command === 'stop') { 36 | const { instance } = ActorSystem; 37 | if (instance) instance.exit(); 38 | process.exit(0); 39 | return; 40 | } 41 | if (command === 'message') { 42 | const { instance } = ActorSystem; 43 | if (instance) { 44 | const { data } = message; 45 | const { name } = ActorSystem.actor; 46 | instance.message(data); 47 | process.send({ command: 'ready', name, pid: process.pid }); 48 | } 49 | } 50 | }); 51 | 52 | module.exports = ActorSystem; 53 | -------------------------------------------------------------------------------- /JavaScript/3-multithread/actors/mailer.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const ActorSystem = require('../system'); 4 | const nodemailer = require('nodemailer'); 5 | const auth = require('../config'); 6 | 7 | const FROM = 'nodeua.com@gmail.com'; 8 | 9 | ActorSystem.register( 10 | class Mailer { 11 | constructor() { 12 | console.log('Start actor: Mailer'); 13 | this.transport = nodemailer.createTransport({ 14 | service: 'gmail', 15 | auth, 16 | }); 17 | } 18 | 19 | message({ to, subject, message }) { 20 | const mail = { from: FROM, to, subject, text: message }; 21 | this.transport.sendMail(mail, (error, data) => { 22 | if (error) console.log(error); 23 | else console.log(`Email sent: ${data.response}`); 24 | }); 25 | } 26 | 27 | exit() { 28 | this.transport.close(); 29 | console.log('Stop actor: Mailer'); 30 | } 31 | }, 32 | ); 33 | -------------------------------------------------------------------------------- /JavaScript/3-multithread/actors/monitoring.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const ActorSystem = require('../system'); 4 | const http = require('node:http'); 5 | 6 | const URL = 'http://localhost:8000/'; 7 | const INTERVAL = 2000; 8 | 9 | ActorSystem.register( 10 | class Monitoring { 11 | constructor() { 12 | console.log('Start actor: Monitoring'); 13 | this.prevSuccess = true; 14 | this.timer = setInterval(() => { 15 | this.attempt(URL); 16 | }, INTERVAL); 17 | } 18 | 19 | attempt(url) { 20 | http 21 | .get(url, (res) => { 22 | const success = res.statusCode === 200; 23 | this.notify({ url, success, status: res.statusCode }); 24 | }) 25 | .on('error', (error) => { 26 | this.notify({ url, success: false, status: error.message }); 27 | }); 28 | } 29 | 30 | notify({ url, success, status }) { 31 | if (this.prevSuccess !== success) { 32 | this.prevSuccess = success; 33 | ActorSystem.send('Renderer', { url, success, status }); 34 | } 35 | } 36 | 37 | message() {} 38 | 39 | exit() { 40 | clearInterval(this.timer); 41 | console.log('Stop actor: Monitoring'); 42 | } 43 | }, 44 | ); 45 | -------------------------------------------------------------------------------- /JavaScript/3-multithread/actors/renderer.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const ActorSystem = require('../system'); 4 | 5 | ActorSystem.register( 6 | class Renderer { 7 | constructor() { 8 | console.log('Start actor: Renderer'); 9 | } 10 | 11 | message({ url, success, status }) { 12 | const to = 'nodeua.com@gmail.com'; 13 | const msg = success ? 'is available again' : 'is not available'; 14 | const date = new Date().toUTCString(); 15 | const reason = (success ? 'Status code: ' : 'Error code: ') + status; 16 | const message = `Resource ${url} ${msg} (${date})\n${reason}`; 17 | const subject = 'Server Monitoring'; 18 | ActorSystem.send('Mailer', { to, subject, message }); 19 | } 20 | 21 | exit() { 22 | console.log('Stop actor: Renderer'); 23 | } 24 | }, 25 | ); 26 | -------------------------------------------------------------------------------- /JavaScript/3-multithread/actors/root.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const ActorSystem = require('../system'); 4 | 5 | ActorSystem.register( 6 | class Root { 7 | constructor() { 8 | console.log('Start actor: Root'); 9 | ActorSystem.start('Monitoring'); 10 | ActorSystem.start('Renderer'); 11 | ActorSystem.start('Mailer', 3); 12 | } 13 | 14 | message() {} 15 | 16 | exit() { 17 | ActorSystem.stop('Monitoring'); 18 | ActorSystem.stop('Renderer'); 19 | ActorSystem.stop('Mailer'); 20 | console.log('Stop actor: Root'); 21 | } 22 | }, 23 | ); 24 | -------------------------------------------------------------------------------- /JavaScript/3-multithread/config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = { 4 | user: 'account-name@gmail.com', 5 | pass: 'your-password', 6 | }; 7 | -------------------------------------------------------------------------------- /JavaScript/3-multithread/eslint.config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const init = require('eslint-config-metarhia'); 4 | 5 | init[0].rules['class-methods-use-this'] = 'off'; 6 | 7 | module.exports = init; 8 | -------------------------------------------------------------------------------- /JavaScript/3-multithread/main.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const ActorSystem = require('./system.js'); 4 | 5 | const EXIT_NORMAL = 1000; 6 | const EXIT_ABNORMAL = 5000; 7 | 8 | ActorSystem.start('Root'); 9 | 10 | process.on('SIGINT', () => { 11 | console.log(''); 12 | ActorSystem.stop('Root'); 13 | setTimeout(() => { 14 | console.log('Graceful shutdown'); 15 | process.exit(0); 16 | }, EXIT_NORMAL); 17 | setTimeout(() => { 18 | console.log('Abnormal termination'); 19 | process.exit(1); 20 | }, EXIT_ABNORMAL); 21 | }); 22 | -------------------------------------------------------------------------------- /JavaScript/3-multithread/master.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const threads = require('node:worker_threads'); 4 | const { Worker } = threads; 5 | 6 | const actors = new Map(); 7 | 8 | class MasterSystem { 9 | static start(name, count = 1) { 10 | if (!actors.has(name)) { 11 | const ready = []; 12 | const instances = []; 13 | const queue = []; 14 | actors.set(name, { ready, instances, queue }); 15 | } 16 | const { ready, instances } = actors.get(name); 17 | for (let i = 0; i < count; i++) { 18 | const actor = new Worker('./system.js'); 19 | console.log({ actor }); 20 | MasterSystem.subscribe(actor); 21 | ready.push(actor); 22 | instances.push(actor); 23 | actor.postMessage({ command: 'start', name }); 24 | } 25 | } 26 | 27 | static stop(name) { 28 | const record = actors.get(name); 29 | if (record) { 30 | const { instances } = record; 31 | for (const actor of instances) { 32 | actor.postMessage({ command: 'stop' }); 33 | } 34 | } 35 | } 36 | 37 | static send(name, data) { 38 | const record = actors.get(name); 39 | if (record) { 40 | const { ready, queue } = record; 41 | const actor = ready.shift(); 42 | if (!actor) { 43 | queue.push(data); 44 | return; 45 | } 46 | actor.postMessage({ command: 'message', data }); 47 | } 48 | } 49 | 50 | static subscribe(actor) { 51 | actor.on('message', (message) => { 52 | const { command, name } = message; 53 | if (command === 'message') { 54 | const { data } = message; 55 | MasterSystem.send(name, data); 56 | return; 57 | } 58 | if (command === 'start') { 59 | const { count } = message; 60 | MasterSystem.start(name, count); 61 | return; 62 | } 63 | if (command === 'stop') { 64 | MasterSystem.stop(name); 65 | return; 66 | } 67 | if (command === 'ready') { 68 | const { id } = message; 69 | const record = actors.get(name); 70 | if (record) { 71 | const { ready, instances, queue } = record; 72 | for (const actor of instances) { 73 | if (actor.id === id) ready.push(actor); 74 | } 75 | if (queue.length > 0) { 76 | const next = queue.shift(); 77 | MasterSystem.send(name, next); 78 | } 79 | } 80 | } 81 | }); 82 | } 83 | } 84 | 85 | module.exports = MasterSystem; 86 | -------------------------------------------------------------------------------- /JavaScript/3-multithread/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server-monitoring", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "server-monitoring", 9 | "version": "1.0.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "eslint": "^9.12.0", 13 | "eslint-config-metarhia": "^9.1.0", 14 | "nodemailer": "^6.9.16", 15 | "prettier": "^3.3.3" 16 | } 17 | }, 18 | "node_modules/@eslint-community/eslint-utils": { 19 | "version": "4.4.1", 20 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", 21 | "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", 22 | "license": "MIT", 23 | "dependencies": { 24 | "eslint-visitor-keys": "^3.4.3" 25 | }, 26 | "engines": { 27 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 28 | }, 29 | "funding": { 30 | "url": "https://opencollective.com/eslint" 31 | }, 32 | "peerDependencies": { 33 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 34 | } 35 | }, 36 | "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { 37 | "version": "3.4.3", 38 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 39 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 40 | "license": "Apache-2.0", 41 | "engines": { 42 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 43 | }, 44 | "funding": { 45 | "url": "https://opencollective.com/eslint" 46 | } 47 | }, 48 | "node_modules/@eslint-community/regexpp": { 49 | "version": "4.12.1", 50 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", 51 | "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", 52 | "license": "MIT", 53 | "engines": { 54 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 55 | } 56 | }, 57 | "node_modules/@eslint/config-array": { 58 | "version": "0.19.0", 59 | "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", 60 | "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", 61 | "license": "Apache-2.0", 62 | "dependencies": { 63 | "@eslint/object-schema": "^2.1.4", 64 | "debug": "^4.3.1", 65 | "minimatch": "^3.1.2" 66 | }, 67 | "engines": { 68 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 69 | } 70 | }, 71 | "node_modules/@eslint/core": { 72 | "version": "0.9.0", 73 | "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", 74 | "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", 75 | "license": "Apache-2.0", 76 | "engines": { 77 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 78 | } 79 | }, 80 | "node_modules/@eslint/eslintrc": { 81 | "version": "3.2.0", 82 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", 83 | "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", 84 | "license": "MIT", 85 | "dependencies": { 86 | "ajv": "^6.12.4", 87 | "debug": "^4.3.2", 88 | "espree": "^10.0.1", 89 | "globals": "^14.0.0", 90 | "ignore": "^5.2.0", 91 | "import-fresh": "^3.2.1", 92 | "js-yaml": "^4.1.0", 93 | "minimatch": "^3.1.2", 94 | "strip-json-comments": "^3.1.1" 95 | }, 96 | "engines": { 97 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 98 | }, 99 | "funding": { 100 | "url": "https://opencollective.com/eslint" 101 | } 102 | }, 103 | "node_modules/@eslint/js": { 104 | "version": "9.15.0", 105 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz", 106 | "integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==", 107 | "license": "MIT", 108 | "engines": { 109 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 110 | } 111 | }, 112 | "node_modules/@eslint/object-schema": { 113 | "version": "2.1.4", 114 | "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", 115 | "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", 116 | "license": "Apache-2.0", 117 | "engines": { 118 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 119 | } 120 | }, 121 | "node_modules/@eslint/plugin-kit": { 122 | "version": "0.2.3", 123 | "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", 124 | "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", 125 | "license": "Apache-2.0", 126 | "dependencies": { 127 | "levn": "^0.4.1" 128 | }, 129 | "engines": { 130 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 131 | } 132 | }, 133 | "node_modules/@humanfs/core": { 134 | "version": "0.19.1", 135 | "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", 136 | "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", 137 | "license": "Apache-2.0", 138 | "engines": { 139 | "node": ">=18.18.0" 140 | } 141 | }, 142 | "node_modules/@humanfs/node": { 143 | "version": "0.16.6", 144 | "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", 145 | "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", 146 | "license": "Apache-2.0", 147 | "dependencies": { 148 | "@humanfs/core": "^0.19.1", 149 | "@humanwhocodes/retry": "^0.3.0" 150 | }, 151 | "engines": { 152 | "node": ">=18.18.0" 153 | } 154 | }, 155 | "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { 156 | "version": "0.3.1", 157 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", 158 | "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", 159 | "license": "Apache-2.0", 160 | "engines": { 161 | "node": ">=18.18" 162 | }, 163 | "funding": { 164 | "type": "github", 165 | "url": "https://github.com/sponsors/nzakas" 166 | } 167 | }, 168 | "node_modules/@humanwhocodes/module-importer": { 169 | "version": "1.0.1", 170 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 171 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 172 | "license": "Apache-2.0", 173 | "engines": { 174 | "node": ">=12.22" 175 | }, 176 | "funding": { 177 | "type": "github", 178 | "url": "https://github.com/sponsors/nzakas" 179 | } 180 | }, 181 | "node_modules/@humanwhocodes/retry": { 182 | "version": "0.4.1", 183 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", 184 | "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", 185 | "license": "Apache-2.0", 186 | "engines": { 187 | "node": ">=18.18" 188 | }, 189 | "funding": { 190 | "type": "github", 191 | "url": "https://github.com/sponsors/nzakas" 192 | } 193 | }, 194 | "node_modules/@pkgr/core": { 195 | "version": "0.1.1", 196 | "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", 197 | "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", 198 | "license": "MIT", 199 | "engines": { 200 | "node": "^12.20.0 || ^14.18.0 || >=16.0.0" 201 | }, 202 | "funding": { 203 | "url": "https://opencollective.com/unts" 204 | } 205 | }, 206 | "node_modules/@types/estree": { 207 | "version": "1.0.6", 208 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 209 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 210 | "license": "MIT" 211 | }, 212 | "node_modules/@types/json-schema": { 213 | "version": "7.0.15", 214 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 215 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 216 | "license": "MIT" 217 | }, 218 | "node_modules/acorn": { 219 | "version": "8.14.0", 220 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 221 | "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 222 | "license": "MIT", 223 | "bin": { 224 | "acorn": "bin/acorn" 225 | }, 226 | "engines": { 227 | "node": ">=0.4.0" 228 | } 229 | }, 230 | "node_modules/acorn-jsx": { 231 | "version": "5.3.2", 232 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 233 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 234 | "license": "MIT", 235 | "peerDependencies": { 236 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 237 | } 238 | }, 239 | "node_modules/ajv": { 240 | "version": "6.12.6", 241 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 242 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 243 | "license": "MIT", 244 | "dependencies": { 245 | "fast-deep-equal": "^3.1.1", 246 | "fast-json-stable-stringify": "^2.0.0", 247 | "json-schema-traverse": "^0.4.1", 248 | "uri-js": "^4.2.2" 249 | }, 250 | "funding": { 251 | "type": "github", 252 | "url": "https://github.com/sponsors/epoberezkin" 253 | } 254 | }, 255 | "node_modules/ansi-styles": { 256 | "version": "4.3.0", 257 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 258 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 259 | "license": "MIT", 260 | "dependencies": { 261 | "color-convert": "^2.0.1" 262 | }, 263 | "engines": { 264 | "node": ">=8" 265 | }, 266 | "funding": { 267 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 268 | } 269 | }, 270 | "node_modules/argparse": { 271 | "version": "2.0.1", 272 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 273 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 274 | "license": "Python-2.0" 275 | }, 276 | "node_modules/balanced-match": { 277 | "version": "1.0.2", 278 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 279 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 280 | "license": "MIT" 281 | }, 282 | "node_modules/brace-expansion": { 283 | "version": "1.1.11", 284 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 285 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 286 | "license": "MIT", 287 | "dependencies": { 288 | "balanced-match": "^1.0.0", 289 | "concat-map": "0.0.1" 290 | } 291 | }, 292 | "node_modules/callsites": { 293 | "version": "3.1.0", 294 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 295 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 296 | "license": "MIT", 297 | "engines": { 298 | "node": ">=6" 299 | } 300 | }, 301 | "node_modules/chalk": { 302 | "version": "4.1.2", 303 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 304 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 305 | "license": "MIT", 306 | "dependencies": { 307 | "ansi-styles": "^4.1.0", 308 | "supports-color": "^7.1.0" 309 | }, 310 | "engines": { 311 | "node": ">=10" 312 | }, 313 | "funding": { 314 | "url": "https://github.com/chalk/chalk?sponsor=1" 315 | } 316 | }, 317 | "node_modules/color-convert": { 318 | "version": "2.0.1", 319 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 320 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 321 | "license": "MIT", 322 | "dependencies": { 323 | "color-name": "~1.1.4" 324 | }, 325 | "engines": { 326 | "node": ">=7.0.0" 327 | } 328 | }, 329 | "node_modules/color-name": { 330 | "version": "1.1.4", 331 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 332 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 333 | "license": "MIT" 334 | }, 335 | "node_modules/concat-map": { 336 | "version": "0.0.1", 337 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 338 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 339 | "license": "MIT" 340 | }, 341 | "node_modules/cross-spawn": { 342 | "version": "7.0.6", 343 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 344 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 345 | "license": "MIT", 346 | "dependencies": { 347 | "path-key": "^3.1.0", 348 | "shebang-command": "^2.0.0", 349 | "which": "^2.0.1" 350 | }, 351 | "engines": { 352 | "node": ">= 8" 353 | } 354 | }, 355 | "node_modules/debug": { 356 | "version": "4.3.7", 357 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 358 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 359 | "license": "MIT", 360 | "dependencies": { 361 | "ms": "^2.1.3" 362 | }, 363 | "engines": { 364 | "node": ">=6.0" 365 | }, 366 | "peerDependenciesMeta": { 367 | "supports-color": { 368 | "optional": true 369 | } 370 | } 371 | }, 372 | "node_modules/deep-is": { 373 | "version": "0.1.4", 374 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 375 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 376 | "license": "MIT" 377 | }, 378 | "node_modules/escape-string-regexp": { 379 | "version": "4.0.0", 380 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 381 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 382 | "license": "MIT", 383 | "engines": { 384 | "node": ">=10" 385 | }, 386 | "funding": { 387 | "url": "https://github.com/sponsors/sindresorhus" 388 | } 389 | }, 390 | "node_modules/eslint": { 391 | "version": "9.15.0", 392 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.15.0.tgz", 393 | "integrity": "sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==", 394 | "license": "MIT", 395 | "dependencies": { 396 | "@eslint-community/eslint-utils": "^4.2.0", 397 | "@eslint-community/regexpp": "^4.12.1", 398 | "@eslint/config-array": "^0.19.0", 399 | "@eslint/core": "^0.9.0", 400 | "@eslint/eslintrc": "^3.2.0", 401 | "@eslint/js": "9.15.0", 402 | "@eslint/plugin-kit": "^0.2.3", 403 | "@humanfs/node": "^0.16.6", 404 | "@humanwhocodes/module-importer": "^1.0.1", 405 | "@humanwhocodes/retry": "^0.4.1", 406 | "@types/estree": "^1.0.6", 407 | "@types/json-schema": "^7.0.15", 408 | "ajv": "^6.12.4", 409 | "chalk": "^4.0.0", 410 | "cross-spawn": "^7.0.5", 411 | "debug": "^4.3.2", 412 | "escape-string-regexp": "^4.0.0", 413 | "eslint-scope": "^8.2.0", 414 | "eslint-visitor-keys": "^4.2.0", 415 | "espree": "^10.3.0", 416 | "esquery": "^1.5.0", 417 | "esutils": "^2.0.2", 418 | "fast-deep-equal": "^3.1.3", 419 | "file-entry-cache": "^8.0.0", 420 | "find-up": "^5.0.0", 421 | "glob-parent": "^6.0.2", 422 | "ignore": "^5.2.0", 423 | "imurmurhash": "^0.1.4", 424 | "is-glob": "^4.0.0", 425 | "json-stable-stringify-without-jsonify": "^1.0.1", 426 | "lodash.merge": "^4.6.2", 427 | "minimatch": "^3.1.2", 428 | "natural-compare": "^1.4.0", 429 | "optionator": "^0.9.3" 430 | }, 431 | "bin": { 432 | "eslint": "bin/eslint.js" 433 | }, 434 | "engines": { 435 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 436 | }, 437 | "funding": { 438 | "url": "https://eslint.org/donate" 439 | }, 440 | "peerDependencies": { 441 | "jiti": "*" 442 | }, 443 | "peerDependenciesMeta": { 444 | "jiti": { 445 | "optional": true 446 | } 447 | } 448 | }, 449 | "node_modules/eslint-config-metarhia": { 450 | "version": "9.1.1", 451 | "resolved": "https://registry.npmjs.org/eslint-config-metarhia/-/eslint-config-metarhia-9.1.1.tgz", 452 | "integrity": "sha512-PPJBiv+kFg7+0kkjHWp1k37TovG5prxIwiryiX8vQ6m2Jt4u4yIBjEjDd3P/RGXK7yrbMiiSyI2Z/GTWDS0C/Q==", 453 | "license": "MIT", 454 | "dependencies": { 455 | "eslint": "^9.10.0", 456 | "eslint-config-prettier": "^9.1.0", 457 | "eslint-plugin-prettier": "^5.2.1", 458 | "prettier": "^3.3.3" 459 | }, 460 | "engines": { 461 | "node": "18 || 20 || 21 || 22 || 23" 462 | }, 463 | "funding": { 464 | "type": "patreon", 465 | "url": "https://www.patreon.com/tshemsedinov" 466 | } 467 | }, 468 | "node_modules/eslint-config-prettier": { 469 | "version": "9.1.0", 470 | "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", 471 | "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", 472 | "license": "MIT", 473 | "bin": { 474 | "eslint-config-prettier": "bin/cli.js" 475 | }, 476 | "peerDependencies": { 477 | "eslint": ">=7.0.0" 478 | } 479 | }, 480 | "node_modules/eslint-plugin-prettier": { 481 | "version": "5.2.1", 482 | "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", 483 | "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", 484 | "license": "MIT", 485 | "dependencies": { 486 | "prettier-linter-helpers": "^1.0.0", 487 | "synckit": "^0.9.1" 488 | }, 489 | "engines": { 490 | "node": "^14.18.0 || >=16.0.0" 491 | }, 492 | "funding": { 493 | "url": "https://opencollective.com/eslint-plugin-prettier" 494 | }, 495 | "peerDependencies": { 496 | "@types/eslint": ">=8.0.0", 497 | "eslint": ">=8.0.0", 498 | "eslint-config-prettier": "*", 499 | "prettier": ">=3.0.0" 500 | }, 501 | "peerDependenciesMeta": { 502 | "@types/eslint": { 503 | "optional": true 504 | }, 505 | "eslint-config-prettier": { 506 | "optional": true 507 | } 508 | } 509 | }, 510 | "node_modules/eslint-scope": { 511 | "version": "8.2.0", 512 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", 513 | "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", 514 | "license": "BSD-2-Clause", 515 | "dependencies": { 516 | "esrecurse": "^4.3.0", 517 | "estraverse": "^5.2.0" 518 | }, 519 | "engines": { 520 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 521 | }, 522 | "funding": { 523 | "url": "https://opencollective.com/eslint" 524 | } 525 | }, 526 | "node_modules/eslint-visitor-keys": { 527 | "version": "4.2.0", 528 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", 529 | "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", 530 | "license": "Apache-2.0", 531 | "engines": { 532 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 533 | }, 534 | "funding": { 535 | "url": "https://opencollective.com/eslint" 536 | } 537 | }, 538 | "node_modules/espree": { 539 | "version": "10.3.0", 540 | "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", 541 | "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", 542 | "license": "BSD-2-Clause", 543 | "dependencies": { 544 | "acorn": "^8.14.0", 545 | "acorn-jsx": "^5.3.2", 546 | "eslint-visitor-keys": "^4.2.0" 547 | }, 548 | "engines": { 549 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 550 | }, 551 | "funding": { 552 | "url": "https://opencollective.com/eslint" 553 | } 554 | }, 555 | "node_modules/esquery": { 556 | "version": "1.6.0", 557 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", 558 | "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 559 | "license": "BSD-3-Clause", 560 | "dependencies": { 561 | "estraverse": "^5.1.0" 562 | }, 563 | "engines": { 564 | "node": ">=0.10" 565 | } 566 | }, 567 | "node_modules/esrecurse": { 568 | "version": "4.3.0", 569 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 570 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 571 | "license": "BSD-2-Clause", 572 | "dependencies": { 573 | "estraverse": "^5.2.0" 574 | }, 575 | "engines": { 576 | "node": ">=4.0" 577 | } 578 | }, 579 | "node_modules/estraverse": { 580 | "version": "5.3.0", 581 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 582 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 583 | "license": "BSD-2-Clause", 584 | "engines": { 585 | "node": ">=4.0" 586 | } 587 | }, 588 | "node_modules/esutils": { 589 | "version": "2.0.3", 590 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 591 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 592 | "license": "BSD-2-Clause", 593 | "engines": { 594 | "node": ">=0.10.0" 595 | } 596 | }, 597 | "node_modules/fast-deep-equal": { 598 | "version": "3.1.3", 599 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 600 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 601 | "license": "MIT" 602 | }, 603 | "node_modules/fast-diff": { 604 | "version": "1.3.0", 605 | "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", 606 | "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", 607 | "license": "Apache-2.0" 608 | }, 609 | "node_modules/fast-json-stable-stringify": { 610 | "version": "2.1.0", 611 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 612 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 613 | "license": "MIT" 614 | }, 615 | "node_modules/fast-levenshtein": { 616 | "version": "2.0.6", 617 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 618 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 619 | "license": "MIT" 620 | }, 621 | "node_modules/file-entry-cache": { 622 | "version": "8.0.0", 623 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", 624 | "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", 625 | "license": "MIT", 626 | "dependencies": { 627 | "flat-cache": "^4.0.0" 628 | }, 629 | "engines": { 630 | "node": ">=16.0.0" 631 | } 632 | }, 633 | "node_modules/find-up": { 634 | "version": "5.0.0", 635 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 636 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 637 | "license": "MIT", 638 | "dependencies": { 639 | "locate-path": "^6.0.0", 640 | "path-exists": "^4.0.0" 641 | }, 642 | "engines": { 643 | "node": ">=10" 644 | }, 645 | "funding": { 646 | "url": "https://github.com/sponsors/sindresorhus" 647 | } 648 | }, 649 | "node_modules/flat-cache": { 650 | "version": "4.0.1", 651 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", 652 | "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", 653 | "license": "MIT", 654 | "dependencies": { 655 | "flatted": "^3.2.9", 656 | "keyv": "^4.5.4" 657 | }, 658 | "engines": { 659 | "node": ">=16" 660 | } 661 | }, 662 | "node_modules/flatted": { 663 | "version": "3.3.2", 664 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", 665 | "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", 666 | "license": "ISC" 667 | }, 668 | "node_modules/glob-parent": { 669 | "version": "6.0.2", 670 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 671 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 672 | "license": "ISC", 673 | "dependencies": { 674 | "is-glob": "^4.0.3" 675 | }, 676 | "engines": { 677 | "node": ">=10.13.0" 678 | } 679 | }, 680 | "node_modules/globals": { 681 | "version": "14.0.0", 682 | "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", 683 | "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", 684 | "license": "MIT", 685 | "engines": { 686 | "node": ">=18" 687 | }, 688 | "funding": { 689 | "url": "https://github.com/sponsors/sindresorhus" 690 | } 691 | }, 692 | "node_modules/has-flag": { 693 | "version": "4.0.0", 694 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 695 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 696 | "license": "MIT", 697 | "engines": { 698 | "node": ">=8" 699 | } 700 | }, 701 | "node_modules/ignore": { 702 | "version": "5.3.2", 703 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 704 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 705 | "license": "MIT", 706 | "engines": { 707 | "node": ">= 4" 708 | } 709 | }, 710 | "node_modules/import-fresh": { 711 | "version": "3.3.0", 712 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 713 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 714 | "license": "MIT", 715 | "dependencies": { 716 | "parent-module": "^1.0.0", 717 | "resolve-from": "^4.0.0" 718 | }, 719 | "engines": { 720 | "node": ">=6" 721 | }, 722 | "funding": { 723 | "url": "https://github.com/sponsors/sindresorhus" 724 | } 725 | }, 726 | "node_modules/imurmurhash": { 727 | "version": "0.1.4", 728 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 729 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 730 | "license": "MIT", 731 | "engines": { 732 | "node": ">=0.8.19" 733 | } 734 | }, 735 | "node_modules/is-extglob": { 736 | "version": "2.1.1", 737 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 738 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 739 | "license": "MIT", 740 | "engines": { 741 | "node": ">=0.10.0" 742 | } 743 | }, 744 | "node_modules/is-glob": { 745 | "version": "4.0.3", 746 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 747 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 748 | "license": "MIT", 749 | "dependencies": { 750 | "is-extglob": "^2.1.1" 751 | }, 752 | "engines": { 753 | "node": ">=0.10.0" 754 | } 755 | }, 756 | "node_modules/isexe": { 757 | "version": "2.0.0", 758 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 759 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 760 | "license": "ISC" 761 | }, 762 | "node_modules/js-yaml": { 763 | "version": "4.1.0", 764 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 765 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 766 | "license": "MIT", 767 | "dependencies": { 768 | "argparse": "^2.0.1" 769 | }, 770 | "bin": { 771 | "js-yaml": "bin/js-yaml.js" 772 | } 773 | }, 774 | "node_modules/json-buffer": { 775 | "version": "3.0.1", 776 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 777 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 778 | "license": "MIT" 779 | }, 780 | "node_modules/json-schema-traverse": { 781 | "version": "0.4.1", 782 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 783 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 784 | "license": "MIT" 785 | }, 786 | "node_modules/json-stable-stringify-without-jsonify": { 787 | "version": "1.0.1", 788 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 789 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 790 | "license": "MIT" 791 | }, 792 | "node_modules/keyv": { 793 | "version": "4.5.4", 794 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 795 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 796 | "license": "MIT", 797 | "dependencies": { 798 | "json-buffer": "3.0.1" 799 | } 800 | }, 801 | "node_modules/levn": { 802 | "version": "0.4.1", 803 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 804 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 805 | "license": "MIT", 806 | "dependencies": { 807 | "prelude-ls": "^1.2.1", 808 | "type-check": "~0.4.0" 809 | }, 810 | "engines": { 811 | "node": ">= 0.8.0" 812 | } 813 | }, 814 | "node_modules/locate-path": { 815 | "version": "6.0.0", 816 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 817 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 818 | "license": "MIT", 819 | "dependencies": { 820 | "p-locate": "^5.0.0" 821 | }, 822 | "engines": { 823 | "node": ">=10" 824 | }, 825 | "funding": { 826 | "url": "https://github.com/sponsors/sindresorhus" 827 | } 828 | }, 829 | "node_modules/lodash.merge": { 830 | "version": "4.6.2", 831 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 832 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 833 | "license": "MIT" 834 | }, 835 | "node_modules/minimatch": { 836 | "version": "3.1.2", 837 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 838 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 839 | "license": "ISC", 840 | "dependencies": { 841 | "brace-expansion": "^1.1.7" 842 | }, 843 | "engines": { 844 | "node": "*" 845 | } 846 | }, 847 | "node_modules/ms": { 848 | "version": "2.1.3", 849 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 850 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 851 | "license": "MIT" 852 | }, 853 | "node_modules/natural-compare": { 854 | "version": "1.4.0", 855 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 856 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 857 | "license": "MIT" 858 | }, 859 | "node_modules/nodemailer": { 860 | "version": "6.9.16", 861 | "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.16.tgz", 862 | "integrity": "sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==", 863 | "license": "MIT-0", 864 | "engines": { 865 | "node": ">=6.0.0" 866 | } 867 | }, 868 | "node_modules/optionator": { 869 | "version": "0.9.4", 870 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 871 | "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 872 | "license": "MIT", 873 | "dependencies": { 874 | "deep-is": "^0.1.3", 875 | "fast-levenshtein": "^2.0.6", 876 | "levn": "^0.4.1", 877 | "prelude-ls": "^1.2.1", 878 | "type-check": "^0.4.0", 879 | "word-wrap": "^1.2.5" 880 | }, 881 | "engines": { 882 | "node": ">= 0.8.0" 883 | } 884 | }, 885 | "node_modules/p-limit": { 886 | "version": "3.1.0", 887 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 888 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 889 | "license": "MIT", 890 | "dependencies": { 891 | "yocto-queue": "^0.1.0" 892 | }, 893 | "engines": { 894 | "node": ">=10" 895 | }, 896 | "funding": { 897 | "url": "https://github.com/sponsors/sindresorhus" 898 | } 899 | }, 900 | "node_modules/p-locate": { 901 | "version": "5.0.0", 902 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 903 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 904 | "license": "MIT", 905 | "dependencies": { 906 | "p-limit": "^3.0.2" 907 | }, 908 | "engines": { 909 | "node": ">=10" 910 | }, 911 | "funding": { 912 | "url": "https://github.com/sponsors/sindresorhus" 913 | } 914 | }, 915 | "node_modules/parent-module": { 916 | "version": "1.0.1", 917 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 918 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 919 | "license": "MIT", 920 | "dependencies": { 921 | "callsites": "^3.0.0" 922 | }, 923 | "engines": { 924 | "node": ">=6" 925 | } 926 | }, 927 | "node_modules/path-exists": { 928 | "version": "4.0.0", 929 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 930 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 931 | "license": "MIT", 932 | "engines": { 933 | "node": ">=8" 934 | } 935 | }, 936 | "node_modules/path-key": { 937 | "version": "3.1.1", 938 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 939 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 940 | "license": "MIT", 941 | "engines": { 942 | "node": ">=8" 943 | } 944 | }, 945 | "node_modules/prelude-ls": { 946 | "version": "1.2.1", 947 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 948 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 949 | "license": "MIT", 950 | "engines": { 951 | "node": ">= 0.8.0" 952 | } 953 | }, 954 | "node_modules/prettier": { 955 | "version": "3.3.3", 956 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", 957 | "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", 958 | "license": "MIT", 959 | "bin": { 960 | "prettier": "bin/prettier.cjs" 961 | }, 962 | "engines": { 963 | "node": ">=14" 964 | }, 965 | "funding": { 966 | "url": "https://github.com/prettier/prettier?sponsor=1" 967 | } 968 | }, 969 | "node_modules/prettier-linter-helpers": { 970 | "version": "1.0.0", 971 | "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", 972 | "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", 973 | "license": "MIT", 974 | "dependencies": { 975 | "fast-diff": "^1.1.2" 976 | }, 977 | "engines": { 978 | "node": ">=6.0.0" 979 | } 980 | }, 981 | "node_modules/punycode": { 982 | "version": "2.3.1", 983 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 984 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 985 | "license": "MIT", 986 | "engines": { 987 | "node": ">=6" 988 | } 989 | }, 990 | "node_modules/resolve-from": { 991 | "version": "4.0.0", 992 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 993 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 994 | "license": "MIT", 995 | "engines": { 996 | "node": ">=4" 997 | } 998 | }, 999 | "node_modules/shebang-command": { 1000 | "version": "2.0.0", 1001 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1002 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1003 | "license": "MIT", 1004 | "dependencies": { 1005 | "shebang-regex": "^3.0.0" 1006 | }, 1007 | "engines": { 1008 | "node": ">=8" 1009 | } 1010 | }, 1011 | "node_modules/shebang-regex": { 1012 | "version": "3.0.0", 1013 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1014 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1015 | "license": "MIT", 1016 | "engines": { 1017 | "node": ">=8" 1018 | } 1019 | }, 1020 | "node_modules/strip-json-comments": { 1021 | "version": "3.1.1", 1022 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1023 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1024 | "license": "MIT", 1025 | "engines": { 1026 | "node": ">=8" 1027 | }, 1028 | "funding": { 1029 | "url": "https://github.com/sponsors/sindresorhus" 1030 | } 1031 | }, 1032 | "node_modules/supports-color": { 1033 | "version": "7.2.0", 1034 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1035 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1036 | "license": "MIT", 1037 | "dependencies": { 1038 | "has-flag": "^4.0.0" 1039 | }, 1040 | "engines": { 1041 | "node": ">=8" 1042 | } 1043 | }, 1044 | "node_modules/synckit": { 1045 | "version": "0.9.2", 1046 | "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", 1047 | "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", 1048 | "license": "MIT", 1049 | "dependencies": { 1050 | "@pkgr/core": "^0.1.0", 1051 | "tslib": "^2.6.2" 1052 | }, 1053 | "engines": { 1054 | "node": "^14.18.0 || >=16.0.0" 1055 | }, 1056 | "funding": { 1057 | "url": "https://opencollective.com/unts" 1058 | } 1059 | }, 1060 | "node_modules/tslib": { 1061 | "version": "2.8.1", 1062 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 1063 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 1064 | "license": "0BSD" 1065 | }, 1066 | "node_modules/type-check": { 1067 | "version": "0.4.0", 1068 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1069 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1070 | "license": "MIT", 1071 | "dependencies": { 1072 | "prelude-ls": "^1.2.1" 1073 | }, 1074 | "engines": { 1075 | "node": ">= 0.8.0" 1076 | } 1077 | }, 1078 | "node_modules/uri-js": { 1079 | "version": "4.4.1", 1080 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1081 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1082 | "license": "BSD-2-Clause", 1083 | "dependencies": { 1084 | "punycode": "^2.1.0" 1085 | } 1086 | }, 1087 | "node_modules/which": { 1088 | "version": "2.0.2", 1089 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1090 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1091 | "license": "ISC", 1092 | "dependencies": { 1093 | "isexe": "^2.0.0" 1094 | }, 1095 | "bin": { 1096 | "node-which": "bin/node-which" 1097 | }, 1098 | "engines": { 1099 | "node": ">= 8" 1100 | } 1101 | }, 1102 | "node_modules/word-wrap": { 1103 | "version": "1.2.5", 1104 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 1105 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 1106 | "license": "MIT", 1107 | "engines": { 1108 | "node": ">=0.10.0" 1109 | } 1110 | }, 1111 | "node_modules/yocto-queue": { 1112 | "version": "0.1.0", 1113 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1114 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1115 | "license": "MIT", 1116 | "engines": { 1117 | "node": ">=10" 1118 | }, 1119 | "funding": { 1120 | "url": "https://github.com/sponsors/sindresorhus" 1121 | } 1122 | } 1123 | } 1124 | } 1125 | -------------------------------------------------------------------------------- /JavaScript/3-multithread/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server-monitoring", 3 | "version": "1.0.0", 4 | "description": "Actor Model example application", 5 | "main": "main.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "git+https://github.com/HowProgrammingWorks/ActorModel.git" 9 | }, 10 | "author": "Timur Shemsedinov ", 11 | "license": "MIT", 12 | "bugs": { 13 | "url": "https://github.com/HowProgrammingWorks/ActorModel/issues" 14 | }, 15 | "homepage": "https://github.com/HowProgrammingWorks/ActorModel#readme", 16 | "scripts": { 17 | "lint": "eslint . && prettier -c \"**/*.js\"", 18 | "fix": "eslint . --fix && prettier --write \"**/*.js\"" 19 | }, 20 | "dependencies": { 21 | "nodemailer": "^6.9.16", 22 | "eslint": "^9.12.0", 23 | "eslint-config-metarhia": "^9.1.0", 24 | "prettier": "^3.3.3" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /JavaScript/3-multithread/prettier.config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = { 4 | printWidth: 80, 5 | singleQuote: true, 6 | trailingComma: 'all', 7 | tabWidth: 2, 8 | useTabs: false, 9 | semi: true, 10 | }; 11 | -------------------------------------------------------------------------------- /JavaScript/3-multithread/system.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const threads = require('node:worker_threads'); 4 | const { isMainThread } = threads; 5 | 6 | module.exports = isMainThread ? require('./master') : require('./worker'); 7 | -------------------------------------------------------------------------------- /JavaScript/3-multithread/worker.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const threads = require('node:worker_threads'); 4 | const master = threads.parentPort; 5 | 6 | class ActorSystem { 7 | static register(actor) { 8 | ActorSystem.actor = actor; 9 | } 10 | 11 | static start(name, count = 1) { 12 | master.postMessage({ command: 'start', name, count }); 13 | } 14 | 15 | static stop(name) { 16 | master.postMessage({ command: 'stop', name }); 17 | } 18 | 19 | static send(name, data) { 20 | master.postMessage({ command: 'message', name, data }); 21 | } 22 | } 23 | 24 | ActorSystem.actor = null; 25 | ActorSystem.instance = null; 26 | 27 | //process.on('SIGINT', () => {}); 28 | 29 | master.on('message', (message) => { 30 | const { command } = message; 31 | if (command === 'start') { 32 | const { name } = message; 33 | require(`./actors/${name.toLowerCase()}.js`); 34 | const ActorClass = ActorSystem.actor; 35 | ActorSystem.instance = new ActorClass(); 36 | return; 37 | } 38 | if (command === 'stop') { 39 | const { instance } = ActorSystem; 40 | if (instance) instance.exit(); 41 | process.exit(0); 42 | return; 43 | } 44 | if (command === 'message') { 45 | const { instance } = ActorSystem; 46 | if (instance) { 47 | const { data } = message; 48 | const { name } = ActorSystem.actor; 49 | instance.message(data); 50 | const msg = { command: 'ready', name, id: threads.threadId }; 51 | master.postMessage(msg); 52 | } 53 | } 54 | }); 55 | 56 | module.exports = ActorSystem; 57 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019-2024 How.Programming.Works contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Actor model (concurrent computation model) 2 | 3 | [![🏛️ Architecture #7: Actor Model](https://img.youtube.com/vi/nvI8BYYYVT0/0.jpg)](https://www.youtube.com/watch?v=nvI8BYYYVT0) 4 | 5 | [![Модель акторов для параллельных вычислений](https://img.youtube.com/vi/xp5MVKEqxY4/0.jpg)](https://www.youtube.com/watch?v=xp5MVKEqxY4) 6 | --------------------------------------------------------------------------------