commit bbfc60c096a2b90358b157b09e06090709150442 Author: kiselev Date: Thu Aug 14 14:33:09 2025 +0400 init diff --git a/Dockerfile b/Dockerfile new file mode 100755 index 0000000..9496401 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,18 @@ +FROM n8nio/n8n:latest + +USER root + +# Установка зависимостей +RUN apk add --no-cache \ + python3 \ + make \ + g++ \ + nodejs \ + npm + +# Установка node-opcua +RUN npm install -g node-opcua +RUN npm install redis +RUN npm install node-cron + +USER node diff --git a/andrew_server.conf b/andrew_server.conf new file mode 100755 index 0000000..349e252 --- /dev/null +++ b/andrew_server.conf @@ -0,0 +1,101 @@ +client +dev tun +proto tcp +remote 185.185.120.73 443 +resolv-retry infinite +nobind +persist-key +persist-tun + +;ca [inline] +;cert [inline] +;key [inline] + +dhcp-option DNS 10.186.0.40 + +remote-cert-tls "server" +cipher AES-256-CBC + + +verb 3 + +;mute 20 + +#redirect-gateway def1 + + +-----BEGIN CERTIFICATE----- +MIIDRTCCAi2gAwIBAgIUVHCGM+p+xPzdpXv91y3tomQZlbEwDQYJKoZIhvcNAQEL +BQAwFDESMBAGA1UEAwwJUHJvdGVpX1NNMB4XDTIyMDUxMjE1MTgxMVoXDTMyMDUw +OTE1MTgxMVowFDESMBAGA1UEAwwJUHJvdGVpX1NNMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAnXo9+W33IFWRyfNpw2+mKnuSJ+9Y/Y/ud7GMQCoihVQo +m5HOcp2GyT2KrnK3NgA/ZAcbWD6Nr5Zs2mqoaU6+BQdDW1NRYFpO55DCbcrBrxKR +mGXSzeAUI1739zdcHzhwOuNY1scOE80U5ZjTYus6raeXXXlEne7tDdzApFUF7HHj +KxrQI0R25Q2k9NetxInrsGu3O9meGbZb/dphsDFUJja86FxJ1gnuNpdIM5kya7b0 +22CI44EMXYkvKZeAJmnuAPh3fah/t3xqYzNEp5PKXQE/CuwMH3Hf5JDSUMXHQt9p +z2BgmBX6O/5Yy1hx8ZO2lrRCM5RtU2QT2n0Tq1mnNwIDAQABo4GOMIGLMB0GA1Ud +DgQWBBTGZ+81Q0c58yv0Nykm/pmCfp6t0jBPBgNVHSMESDBGgBTGZ+81Q0c58yv0 +Nykm/pmCfp6t0qEYpBYwFDESMBAGA1UEAwwJUHJvdGVpX1NNghRUcIYz6n7E/N2l +e/3XLe2iZBmVsTAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIBBjANBgkqhkiG9w0B +AQsFAAOCAQEAZXcDyMABGMYwF2IEA8zUcCjWwEG7e8y22VIltBkWCjqME9jy22MS +UZs8umumCoK/rMx7LwgiwKItBmi6N0pJf3yXL3tJlf73QGMRXyhkPxaCM4M5nceX +FBXiIKuXALT/jmCkF0g4fvJ70QU9tyW4wxcOpT808LHgk304yOKFF9Tny9kkpmHn +2KiqgvnYx5jY5bFanwZLOzGXBFo09vJ7JncaXccWxUIV1J8+QaAxF1rmd36+h7v0 +8JIYUbop+8/BaXk8iN45xpklxvUA9LZbkRIqa9AlLyTxEzm5Ijy8u0lARgiDAQx1 +49bubeRGGlnasxJ7T6CbC8ouscarE0TRAg== +-----END CERTIFICATE----- + + + +-----BEGIN CERTIFICATE----- +MIIDWDCCAkCgAwIBAgIRAK2JWMAqjyZjld5dOAYlg/0wDQYJKoZIhvcNAQELBQAw +FDESMBAGA1UEAwwJUHJvdGVpX1NNMB4XDTI0MDYwMzEzMjQyNVoXDTI3MDUxOTEz +MjQyNVowGDEWMBQGA1UEAwwNYW5kcmV3X3NlcnZlcjCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBALeOQ1w3wzM6uIVvuWllPDxR4Rr5NMfE7TIxdLkZJF3t +Qg9j2HJNnNMAA3Q68f8T122Mq1rv7wOiJxdGYmkPUbbgeSGi2ZzOwJL0Ut1Glhjr +3YSXzDYPM+rNIILbgP4EaHq4SmkOrmup2Qq4cn5z5lY6E88Y1bVvq4aY035pzVGh +dukp8O9LE8mK/0LE/LdA+RMWEEfLE16serFOOCJxnuTPxgmbrYFuofRWEpbzLpIg +sn0FHdICKmX5YV1NxbIC14RlwDu90JYPR7W3LndyYhlFFHM/YyvK86f8D7K2AB41 +hpFt1zt0zZOL1E12ION0KbMJHILg+qEWST8lDrd9dV0CAwEAAaOBoDCBnTAJBgNV +HRMEAjAAMB0GA1UdDgQWBBRNCfFYJty3vpA/EUPM2gCGaRE0YjBPBgNVHSMESDBG +gBTGZ+81Q0c58yv0Nykm/pmCfp6t0qEYpBYwFDESMBAGA1UEAwwJUHJvdGVpX1NN +ghRUcIYz6n7E/N2le/3XLe2iZBmVsTATBgNVHSUEDDAKBggrBgEFBQcDAjALBgNV +HQ8EBAMCB4AwDQYJKoZIhvcNAQELBQADggEBAJJxBxZ63/1WL5VU8v9S8CecFyRx +waVFXEJ5i0XHKVFi3J8XjVWE2InnEaC75kXGnK3OKkXc1r1ZEdFT9OTdJ3qD6v3P +QdX6SQn0zKF5+SF9CSiPGzVofn+XyWkst/9KakXWslc8j+LbKM47SOZijyO3PcBr +bqemM5PEutpg5viUFhn93uzvhAQpsE476VCgn+EWXAu+siR9u+aQ+wG4vBM+HRmm +IIeKx4LKGFjPVBOtYrWpaVRGqs5LWFFqv1QXCGAouUXmVBMKOXddACvDpW0/WBaQ +1Rf+k0amDNBp1jL+fXoDP4URzE5OkahqQr+7xPV5b82loEEkrhnpAMHZfT8= +-----END CERTIFICATE----- + + + +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC3jkNcN8MzOriF +b7lpZTw8UeEa+TTHxO0yMXS5GSRd7UIPY9hyTZzTAAN0OvH/E9dtjKta7+8DoicX +RmJpD1G24HkhotmczsCS9FLdRpYY692El8w2DzPqzSCC24D+BGh6uEppDq5rqdkK +uHJ+c+ZWOhPPGNW1b6uGmNN+ac1RoXbpKfDvSxPJiv9CxPy3QPkTFhBHyxNerHqx +TjgicZ7kz8YJm62BbqH0VhKW8y6SILJ9BR3SAipl+WFdTcWyAteEZcA7vdCWD0e1 +ty53cmIZRRRzP2MryvOn/A+ytgAeNYaRbdc7dM2Ti9RNdiDjdCmzCRyC4PqhFkk/ +JQ63fXVdAgMBAAECggEBALV4GHBbUMidDUAerJfeVibsbDhWmC/IKRiufE9i4+lY +Xy8H7z1SLfEM2l1WyVj9LMZJhD9rZkmZTjxcgX6MfqTmV9tBPRMh9JFUq3fICSyq +Q16LFIF9lj5UfgfhKy32/bQV7rreoOIgEUvf/pG108r7sAnW67FsrY9sF+uqfips +YLE/UBQ9vXMoyfjJCzhRy53c7BNzG46ftVhwZzN7WtbT6EgYfyMZ4K0BpMOoy7JU +eSUX49cg6vAuwGAwx7s5bQYIoyyq8rd//ouKliltiycwPUQ8fM5TjkZQ+IEqaFGn +ZPY+yM17YLhZdPugoL5p6ZVYu3OLDfo2sPZQfboaXKECgYEA7kKyL8EuRTb4CaRO +953L9kzRZuNRBY0QTcXwSzTOb7fTBtFYITpwikLFvCWetMISnWXW7APcuro4MAP0 +tVh27Gh+bu9ylY0X9M9phk004Yz17nLLhdzIQRr63zvXQE+kea0U1kbfoCR0JScn +CqsIg0w0pDLZmD1n8mc+Mcx1zJsCgYEAxTjhQnpUfrmeMSHY2E3obkcKXgkZTaFU +mO0dQVcTDfpSwhSTDBbZKJO/XVgVi5CFQ/3rv8OyTwO/Oxa2Pz3SLxH0vx4nAmHe +/iRxHYNEiGZlkrfvWyn2qv0n4hj6+FbNRUqee9Vudrhaa8Vn2dHW3gEqshu43KnF +Xplv3w6nGWcCgYBrzNl6KdmZj2liU2k3N7oU0mTcPHVoIY8C4U/7dwUAHxfnucg6 +IIrSw6tbmVnZRwXNGUrItmakRaUudFu/wSrtg8nQv54EdDYmmcGQ9lW6x2BuZpoX +EvG4I1Dmt9iITICKXPlUifScLGIwfSp49TGA1nXq5Ob2rrHdR0Eonu2diQKBgF46 +XuW0LMqfRMWUtlYiYvrNVla3Yi+E9TZbk660O5ZiE0hHLDqKcBbDAJtIioKz+fgS +SaDFj1vRHnzMzSZKEzIKEjV94oVw3WnvX1wKa6P/yGfhGask0YXAjl2oMcCVOF3y +2OWxg6WVTx5Oot+fMlm/lPaj6B8FvhcEmD6qcYvhAoGAQOZ5AlKDBTfYQleqc4gS +5Xtet7P0uQ3lRQ6DTuPHv8zaHYGnLlkRBDSVCN5rz2YU7frWKVvGq8S4w+0UTo0w +Q4npJ1RxCjMkQ2cHA5XNNWSyuV/gay+F8xmEbo815EjIXxzyxmx6OC+l6R/9uGhE +6fFpHGEJSzgZrGGv40b5Q18= +-----END PRIVATE KEY----- + diff --git a/custom_nodes_for_n8n-master/.editorconfig b/custom_nodes_for_n8n-master/.editorconfig new file mode 100644 index 0000000..cff7816 --- /dev/null +++ b/custom_nodes_for_n8n-master/.editorconfig @@ -0,0 +1,20 @@ +root = true + +[*] +charset = utf-8 +indent_style = tab +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[package.json] +indent_style = space +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false + +[*.yml] +indent_style = space +indent_size = 2 diff --git a/custom_nodes_for_n8n-master/.eslintrc.js b/custom_nodes_for_n8n-master/.eslintrc.js new file mode 100644 index 0000000..c84e3fd --- /dev/null +++ b/custom_nodes_for_n8n-master/.eslintrc.js @@ -0,0 +1,146 @@ +/** + * @type {import('@types/eslint').ESLint.ConfigData} + */ +module.exports = { + root: true, + + env: { + browser: true, + es6: true, + node: true, + }, + + parser: '@typescript-eslint/parser', + + parserOptions: { + project: ['./tsconfig.json'], + sourceType: 'module', + extraFileExtensions: ['.json'], + }, + + ignorePatterns: ['.eslintrc.js', '**/*.js', '**/node_modules/**', '**/dist/**'], + + overrides: [ + { + files: ['package.json'], + plugins: ['eslint-plugin-n8n-nodes-base'], + extends: ['plugin:n8n-nodes-base/community'], + rules: { + 'n8n-nodes-base/community-package-json-name-still-default': 'off', + }, + }, + { + files: ['./credentials/**/*.ts'], + plugins: ['eslint-plugin-n8n-nodes-base'], + extends: ['plugin:n8n-nodes-base/credentials'], + rules: { + 'n8n-nodes-base/cred-class-field-authenticate-type-assertion': 'error', + 'n8n-nodes-base/cred-class-field-display-name-missing-oauth2': 'error', + 'n8n-nodes-base/cred-class-field-display-name-miscased': 'error', + 'n8n-nodes-base/cred-class-field-documentation-url-missing': 'error', + 'n8n-nodes-base/cred-class-field-documentation-url-miscased': 'off', + 'n8n-nodes-base/cred-class-field-name-missing-oauth2': 'error', + 'n8n-nodes-base/cred-class-field-name-unsuffixed': 'error', + 'n8n-nodes-base/cred-class-field-name-uppercase-first-char': 'error', + 'n8n-nodes-base/cred-class-field-properties-assertion': 'error', + 'n8n-nodes-base/cred-class-field-type-options-password-missing': 'error', + 'n8n-nodes-base/cred-class-name-missing-oauth2-suffix': 'error', + 'n8n-nodes-base/cred-class-name-unsuffixed': 'error', + 'n8n-nodes-base/cred-filename-against-convention': 'error', + }, + }, + { + files: ['./nodes/**/*.ts'], + plugins: ['eslint-plugin-n8n-nodes-base'], + extends: ['plugin:n8n-nodes-base/nodes'], + rules: { + 'n8n-nodes-base/node-class-description-credentials-name-unsuffixed': 'error', + 'n8n-nodes-base/node-class-description-display-name-unsuffixed-trigger-node': 'error', + 'n8n-nodes-base/node-class-description-empty-string': 'error', + 'n8n-nodes-base/node-class-description-icon-not-svg': 'error', + 'n8n-nodes-base/node-class-description-inputs-wrong-regular-node': 'off', + 'n8n-nodes-base/node-class-description-inputs-wrong-trigger-node': 'error', + 'n8n-nodes-base/node-class-description-missing-subtitle': 'error', + 'n8n-nodes-base/node-class-description-non-core-color-present': 'error', + 'n8n-nodes-base/node-class-description-name-miscased': 'error', + 'n8n-nodes-base/node-class-description-name-unsuffixed-trigger-node': 'error', + 'n8n-nodes-base/node-class-description-outputs-wrong': 'off', + 'n8n-nodes-base/node-dirname-against-convention': 'error', + 'n8n-nodes-base/node-execute-block-double-assertion-for-items': 'error', + 'n8n-nodes-base/node-execute-block-wrong-error-thrown': 'error', + 'n8n-nodes-base/node-filename-against-convention': 'error', + 'n8n-nodes-base/node-param-array-type-assertion': 'error', + 'n8n-nodes-base/node-param-color-type-unused': 'error', + 'n8n-nodes-base/node-param-default-missing': 'error', + 'n8n-nodes-base/node-param-default-wrong-for-boolean': 'error', + 'n8n-nodes-base/node-param-default-wrong-for-collection': 'error', + 'n8n-nodes-base/node-param-default-wrong-for-fixed-collection': 'error', + 'n8n-nodes-base/node-param-default-wrong-for-fixed-collection': 'error', + 'n8n-nodes-base/node-param-default-wrong-for-multi-options': 'error', + 'n8n-nodes-base/node-param-default-wrong-for-number': 'error', + 'n8n-nodes-base/node-param-default-wrong-for-simplify': 'error', + 'n8n-nodes-base/node-param-default-wrong-for-string': 'error', + 'n8n-nodes-base/node-param-description-boolean-without-whether': 'error', + 'n8n-nodes-base/node-param-description-comma-separated-hyphen': 'error', + 'n8n-nodes-base/node-param-description-empty-string': 'error', + 'n8n-nodes-base/node-param-description-excess-final-period': 'error', + 'n8n-nodes-base/node-param-description-excess-inner-whitespace': 'error', + 'n8n-nodes-base/node-param-description-identical-to-display-name': 'error', + 'n8n-nodes-base/node-param-description-line-break-html-tag': 'error', + 'n8n-nodes-base/node-param-description-lowercase-first-char': 'error', + 'n8n-nodes-base/node-param-description-miscased-id': 'error', + 'n8n-nodes-base/node-param-description-miscased-json': 'error', + 'n8n-nodes-base/node-param-description-miscased-url': 'error', + 'n8n-nodes-base/node-param-description-missing-final-period': 'error', + 'n8n-nodes-base/node-param-description-missing-for-ignore-ssl-issues': 'error', + 'n8n-nodes-base/node-param-description-missing-for-return-all': 'error', + 'n8n-nodes-base/node-param-description-missing-for-simplify': 'error', + 'n8n-nodes-base/node-param-description-missing-from-dynamic-multi-options': 'error', + 'n8n-nodes-base/node-param-description-missing-from-dynamic-options': 'error', + 'n8n-nodes-base/node-param-description-missing-from-limit': 'error', + 'n8n-nodes-base/node-param-description-unencoded-angle-brackets': 'error', + 'n8n-nodes-base/node-param-description-unneeded-backticks': 'error', + 'n8n-nodes-base/node-param-description-untrimmed': 'error', + 'n8n-nodes-base/node-param-description-url-missing-protocol': 'error', + 'n8n-nodes-base/node-param-description-weak': 'error', + 'n8n-nodes-base/node-param-description-wrong-for-dynamic-multi-options': 'error', + 'n8n-nodes-base/node-param-description-wrong-for-dynamic-options': 'error', + 'n8n-nodes-base/node-param-description-wrong-for-ignore-ssl-issues': 'error', + 'n8n-nodes-base/node-param-description-wrong-for-limit': 'error', + 'n8n-nodes-base/node-param-description-wrong-for-return-all': 'error', + 'n8n-nodes-base/node-param-description-wrong-for-simplify': 'error', + 'n8n-nodes-base/node-param-description-wrong-for-upsert': 'error', + 'n8n-nodes-base/node-param-display-name-excess-inner-whitespace': 'error', + 'n8n-nodes-base/node-param-display-name-miscased-id': 'error', + 'n8n-nodes-base/node-param-display-name-miscased': 'error', + 'n8n-nodes-base/node-param-display-name-not-first-position': 'error', + 'n8n-nodes-base/node-param-display-name-untrimmed': 'error', + 'n8n-nodes-base/node-param-display-name-wrong-for-dynamic-multi-options': 'error', + 'n8n-nodes-base/node-param-display-name-wrong-for-dynamic-options': 'error', + 'n8n-nodes-base/node-param-display-name-wrong-for-simplify': 'error', + 'n8n-nodes-base/node-param-display-name-wrong-for-update-fields': 'error', + 'n8n-nodes-base/node-param-min-value-wrong-for-limit': 'error', + 'n8n-nodes-base/node-param-multi-options-type-unsorted-items': 'error', + 'n8n-nodes-base/node-param-name-untrimmed': 'error', + 'n8n-nodes-base/node-param-operation-option-action-wrong-for-get-many': 'error', + 'n8n-nodes-base/node-param-operation-option-description-wrong-for-get-many': 'error', + 'n8n-nodes-base/node-param-operation-option-without-action': 'error', + 'n8n-nodes-base/node-param-operation-without-no-data-expression': 'error', + 'n8n-nodes-base/node-param-option-description-identical-to-name': 'error', + 'n8n-nodes-base/node-param-option-name-containing-star': 'error', + 'n8n-nodes-base/node-param-option-name-duplicate': 'error', + 'n8n-nodes-base/node-param-option-name-wrong-for-get-many': 'error', + 'n8n-nodes-base/node-param-option-name-wrong-for-upsert': 'error', + 'n8n-nodes-base/node-param-option-value-duplicate': 'error', + 'n8n-nodes-base/node-param-options-type-unsorted-items': 'error', + 'n8n-nodes-base/node-param-placeholder-miscased-id': 'error', + 'n8n-nodes-base/node-param-placeholder-missing-email': 'error', + 'n8n-nodes-base/node-param-required-false': 'error', + 'n8n-nodes-base/node-param-resource-with-plural-option': 'error', + 'n8n-nodes-base/node-param-resource-without-no-data-expression': 'error', + 'n8n-nodes-base/node-param-type-options-missing-from-limit': 'error', + 'n8n-nodes-base/node-param-type-options-password-missing': 'error', + }, + }, + ], +}; diff --git a/custom_nodes_for_n8n-master/.eslintrc.prepublish.js b/custom_nodes_for_n8n-master/.eslintrc.prepublish.js new file mode 100644 index 0000000..2d319f0 --- /dev/null +++ b/custom_nodes_for_n8n-master/.eslintrc.prepublish.js @@ -0,0 +1,16 @@ +/** + * @type {import('@types/eslint').ESLint.ConfigData} + */ +module.exports = { + extends: "./.eslintrc.js", + + overrides: [ + { + files: ['package.json'], + plugins: ['eslint-plugin-n8n-nodes-base'], + rules: { + 'n8n-nodes-base/community-package-json-name-still-default': 'error', + }, + }, + ], +}; diff --git a/custom_nodes_for_n8n-master/.gitignore b/custom_nodes_for_n8n-master/.gitignore new file mode 100644 index 0000000..7e72963 --- /dev/null +++ b/custom_nodes_for_n8n-master/.gitignore @@ -0,0 +1,8 @@ +node_modules +.DS_Store +.tmp +tmp +dist +npm-debug.log* +yarn.lock +.vscode/launch.json diff --git a/custom_nodes_for_n8n-master/.npmignore b/custom_nodes_for_n8n-master/.npmignore new file mode 100644 index 0000000..a7ac611 --- /dev/null +++ b/custom_nodes_for_n8n-master/.npmignore @@ -0,0 +1,2 @@ +.DS_Store +*.tsbuildinfo diff --git a/custom_nodes_for_n8n-master/.prettierrc.js b/custom_nodes_for_n8n-master/.prettierrc.js new file mode 100644 index 0000000..ebf28d8 --- /dev/null +++ b/custom_nodes_for_n8n-master/.prettierrc.js @@ -0,0 +1,51 @@ +module.exports = { + /** + * https://prettier.io/docs/en/options.html#semicolons + */ + semi: true, + + /** + * https://prettier.io/docs/en/options.html#trailing-commas + */ + trailingComma: 'all', + + /** + * https://prettier.io/docs/en/options.html#bracket-spacing + */ + bracketSpacing: true, + + /** + * https://prettier.io/docs/en/options.html#tabs + */ + useTabs: true, + + /** + * https://prettier.io/docs/en/options.html#tab-width + */ + tabWidth: 2, + + /** + * https://prettier.io/docs/en/options.html#arrow-function-parentheses + */ + arrowParens: 'always', + + /** + * https://prettier.io/docs/en/options.html#quotes + */ + singleQuote: true, + + /** + * https://prettier.io/docs/en/options.html#quote-props + */ + quoteProps: 'as-needed', + + /** + * https://prettier.io/docs/en/options.html#end-of-line + */ + endOfLine: 'lf', + + /** + * https://prettier.io/docs/en/options.html#print-width + */ + printWidth: 100, +}; diff --git a/custom_nodes_for_n8n-master/.vscode/extensions.json b/custom_nodes_for_n8n-master/.vscode/extensions.json new file mode 100644 index 0000000..306a6af --- /dev/null +++ b/custom_nodes_for_n8n-master/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + "EditorConfig.EditorConfig", + "esbenp.prettier-vscode", + ] +} diff --git a/custom_nodes_for_n8n-master/CODE_OF_CONDUCT.md b/custom_nodes_for_n8n-master/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..3b0de04 --- /dev/null +++ b/custom_nodes_for_n8n-master/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at jan@n8n.io. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/custom_nodes_for_n8n-master/LICENSE.md b/custom_nodes_for_n8n-master/LICENSE.md new file mode 100644 index 0000000..1e4b3a6 --- /dev/null +++ b/custom_nodes_for_n8n-master/LICENSE.md @@ -0,0 +1,19 @@ +Copyright 2022 n8n + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/custom_nodes_for_n8n-master/README.md b/custom_nodes_for_n8n-master/README.md new file mode 100644 index 0000000..c672021 --- /dev/null +++ b/custom_nodes_for_n8n-master/README.md @@ -0,0 +1,48 @@ +![Banner image](https://user-images.githubusercontent.com/10284570/173569848-c624317f-42b1-45a6-ab09-f0ea3c247648.png) + +# n8n-nodes-starter + +This repo contains example nodes to help you get started building your own custom integrations for [n8n](https://n8n.io). It includes the node linter and other dependencies. + +To make your custom node available to the community, you must create it as an npm package, and [submit it to the npm registry](https://docs.npmjs.com/packages-and-modules/contributing-packages-to-the-registry). + +If you would like your node to be available on n8n cloud you can also [submit your node for verification](https://docs.n8n.io/integrations/creating-nodes/deploy/submit-community-nodes/). + +## Prerequisites + +You need the following installed on your development machine: + +* [git](https://git-scm.com/downloads) +* Node.js and npm. Minimum version Node 20. You can find instructions on how to install both using nvm (Node Version Manager) for Linux, Mac, and WSL [here](https://github.com/nvm-sh/nvm). For Windows users, refer to Microsoft's guide to [Install NodeJS on Windows](https://docs.microsoft.com/en-us/windows/dev-environment/javascript/nodejs-on-windows). +* Install n8n with: + ``` + npm install n8n -g + ``` +* Recommended: follow n8n's guide to [set up your development environment](https://docs.n8n.io/integrations/creating-nodes/build/node-development-environment/). + +## Using this starter + +These are the basic steps for working with the starter. For detailed guidance on creating and publishing nodes, refer to the [documentation](https://docs.n8n.io/integrations/creating-nodes/). + +1. [Generate a new repository](https://github.com/n8n-io/n8n-nodes-starter/generate) from this template repository. +2. Clone your new repo: + ``` + git clone https://github.com//.git + ``` +3. Run `npm i` to install dependencies. +4. Open the project in your editor. +5. Browse the examples in `/nodes` and `/credentials`. Modify the examples, or replace them with your own nodes. +6. Update the `package.json` to match your details. +7. Run `npm run lint` to check for errors or `npm run lintfix` to automatically fix errors when possible. +8. Test your node locally. Refer to [Run your node locally](https://docs.n8n.io/integrations/creating-nodes/test/run-node-locally/) for guidance. +9. Replace this README with documentation for your node. Use the [README_TEMPLATE](README_TEMPLATE.md) to get started. +10. Update the LICENSE file to use your details. +11. [Publish](https://docs.npmjs.com/packages-and-modules/contributing-packages-to-the-registry) your package to npm. + +## More information + +Refer to our [documentation on creating nodes](https://docs.n8n.io/integrations/creating-nodes/) for detailed information on building your own nodes. + +## License + +[MIT](https://github.com/n8n-io/n8n-nodes-starter/blob/master/LICENSE.md) diff --git a/custom_nodes_for_n8n-master/README_TEMPLATE.md b/custom_nodes_for_n8n-master/README_TEMPLATE.md new file mode 100644 index 0000000..a8d7860 --- /dev/null +++ b/custom_nodes_for_n8n-master/README_TEMPLATE.md @@ -0,0 +1,48 @@ +# n8n-nodes-_node-name_ + +This is an n8n community node. It lets you use _app/service name_ in your n8n workflows. + +_App/service name_ is _one or two sentences describing the service this node integrates with_. + +[n8n](https://n8n.io/) is a [fair-code licensed](https://docs.n8n.io/reference/license/) workflow automation platform. + +[Installation](#installation) +[Operations](#operations) +[Credentials](#credentials) +[Compatibility](#compatibility) +[Usage](#usage) +[Resources](#resources) +[Version history](#version-history) + +## Installation + +Follow the [installation guide](https://docs.n8n.io/integrations/community-nodes/installation/) in the n8n community nodes documentation. + +## Operations + +_List the operations supported by your node._ + +## Credentials + +_If users need to authenticate with the app/service, provide details here. You should include prerequisites (such as signing up with the service), available authentication methods, and how to set them up._ + +## Compatibility + +_State the minimum n8n version, as well as which versions you test against. You can also include any known version incompatibility issues._ + +## Usage + +_This is an optional section. Use it to help users with any difficult or confusing aspects of the node._ + +_By the time users are looking for community nodes, they probably already know n8n basics. But if you expect new users, you can link to the [Try it out](https://docs.n8n.io/try-it-out/) documentation to help them get started._ + +## Resources + +* [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes) +* _Link to app/service documentation._ + +## Version history + +_This is another optional section. If your node has multiple versions, include a short description of available versions and what changed, as well as any compatibility impact._ + + diff --git a/custom_nodes_for_n8n-master/gulpfile.js b/custom_nodes_for_n8n-master/gulpfile.js new file mode 100644 index 0000000..831c707 --- /dev/null +++ b/custom_nodes_for_n8n-master/gulpfile.js @@ -0,0 +1,16 @@ +const path = require('path'); +const { task, src, dest } = require('gulp'); + +task('build:icons', copyIcons); + +function copyIcons() { + const nodeSource = path.resolve('nodes', '**', '*.{png,svg}'); + const nodeDestination = path.resolve('dist', 'nodes'); + + src(nodeSource).pipe(dest(nodeDestination)); + + const credSource = path.resolve('credentials', '**', '*.{png,svg}'); + const credDestination = path.resolve('dist', 'credentials'); + + return src(credSource).pipe(dest(credDestination)); +} diff --git a/custom_nodes_for_n8n-master/index.d.ts b/custom_nodes_for_n8n-master/index.d.ts new file mode 100644 index 0000000..f2555e7 --- /dev/null +++ b/custom_nodes_for_n8n-master/index.d.ts @@ -0,0 +1,2 @@ +export * from './nodes/MyCustomNode/MyCustomNode.node'; +export * from './nodes/Generator/Generator.node'; \ No newline at end of file diff --git a/custom_nodes_for_n8n-master/index.js b/custom_nodes_for_n8n-master/index.js new file mode 100644 index 0000000..129bd1f --- /dev/null +++ b/custom_nodes_for_n8n-master/index.js @@ -0,0 +1,17 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +__exportStar(require("./nodes/MyCustomNode/MyCustomNode"), exports); diff --git a/custom_nodes_for_n8n-master/index.ts b/custom_nodes_for_n8n-master/index.ts new file mode 100644 index 0000000..f2555e7 --- /dev/null +++ b/custom_nodes_for_n8n-master/index.ts @@ -0,0 +1,2 @@ +export * from './nodes/MyCustomNode/MyCustomNode.node'; +export * from './nodes/Generator/Generator.node'; \ No newline at end of file diff --git a/custom_nodes_for_n8n-master/nodes/_BaseNodeTransform/_BaseNodeTransform.node.ts b/custom_nodes_for_n8n-master/nodes/_BaseNodeTransform/_BaseNodeTransform.node.ts new file mode 100644 index 0000000..24a1c5d --- /dev/null +++ b/custom_nodes_for_n8n-master/nodes/_BaseNodeTransform/_BaseNodeTransform.node.ts @@ -0,0 +1,47 @@ + import { + INodeType, + INodeTypeDescription, + IExecuteFunctions, + INodeExecutionData, + NodeConnectionType, + } from 'n8n-workflow'; + + export class _BaseNodeTransform implements INodeType { + description: INodeTypeDescription = { + displayName: 'BaseNodeTransform', + name: 'baseNodeTransform', + group: ['transform'], + version: 1, + description: 'Базовый узел transform, который выводит только метаданные', + defaults: { + name: 'BaseNodeTransform', + }, + inputs: [NodeConnectionType.Main], + outputs: [NodeConnectionType.Main], + properties: [], + }; + + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); + + const workflowName = this.getWorkflow().name; + const nodeInfo = this.getNode(); + const fromNodeFull = nodeInfo.type; + const fromNode = fromNodeFull.includes('.') ? fromNodeFull.split('.').pop()! : fromNodeFull; + const idField = nodeInfo.name; + + return [ + items.map(() => ({ + json: { + DATA: {}, + METADATA: { + chain: workflowName, + from: fromNode, + id: idField, + time: Date.now(), + }, + }, + })), + ]; + } + } diff --git a/custom_nodes_for_n8n-master/nodes/_BaseNodeTrigger/_BaseNodeTrigger.node.ts b/custom_nodes_for_n8n-master/nodes/_BaseNodeTrigger/_BaseNodeTrigger.node.ts new file mode 100644 index 0000000..4a9375c --- /dev/null +++ b/custom_nodes_for_n8n-master/nodes/_BaseNodeTrigger/_BaseNodeTrigger.node.ts @@ -0,0 +1,67 @@ +import { + INodeType, + INodeTypeDescription, + ITriggerFunctions, + ITriggerResponse, + INodeExecutionData, + NodeConnectionType, +} from 'n8n-workflow'; + +export class _BaseNodeTrigger implements INodeType { + description: INodeTypeDescription = { + displayName: 'BaseNodeTrigger', + name: 'baseNodeTrigger', + group: ['trigger'], + version: 1, + description: 'Шаблон узла триггера, который эмитит только метадату', + defaults: { + name: 'BaseNodeTrigger', + }, + inputs: [], + outputs: [NodeConnectionType.Main], + properties: [ + { + displayName: 'Интервал (мс)', + name: 'interval', + type: 'number', + default: 1000, + description: 'Интервал между генерациями события', + }, + ], + }; + + async trigger(this: ITriggerFunctions): Promise { + const interval = this.getNodeParameter('interval', 0) as number; + + const workflowName = this.getWorkflow?.()?.name || ''; + const nodeInfo = this.getNode(); + const fromNodeFull = nodeInfo.type; + const fromNode = fromNodeFull.includes('.') ? fromNodeFull.split('.').pop()! : fromNodeFull; + const idField = nodeInfo.name as string; + + const emitFn = () => { + const data: INodeExecutionData = { + json: { + DATA: {}, + METADATA: { + chain: workflowName, + from: fromNode, + id: idField, + time: Date.now(), + }, + }, + pairedItem: 0, + }; + + this.emit([[data]]); + }; + + const intervalId = setInterval(emitFn, interval); + + return { + closeFunction: async () => { + clearInterval(intervalId); + }, + }; + } +} diff --git a/custom_nodes_for_n8n-master/nodes/_ChainOut/_ChainOut.node.ts b/custom_nodes_for_n8n-master/nodes/_ChainOut/_ChainOut.node.ts new file mode 100644 index 0000000..d8ae753 --- /dev/null +++ b/custom_nodes_for_n8n-master/nodes/_ChainOut/_ChainOut.node.ts @@ -0,0 +1,127 @@ +import { + INodeType, + INodeTypeDescription, + IExecuteFunctions, + INodeExecutionData, + NodeOperationError, + NodeConnectionType, + IDataObject, +} from 'n8n-workflow'; + +function isObject(obj: unknown): obj is Record { + return typeof obj === 'object' && obj !== null && !Array.isArray(obj); +} + +export class _ChainOut implements INodeType { + description: INodeTypeDescription = { + displayName: 'ChainOut', + name: 'chainOut', + group: ['transform'], + version: 1, + description: 'Отправляет данные в указанный workflow по ID', + defaults: { + name: 'ChainOut', + }, + inputs: [NodeConnectionType.Main], + outputs: [NodeConnectionType.Main], + properties: [ + { + displayName: 'Workflow ID Source', + name: 'workflowIdSource', + type: 'options', + options: [ + { + name: 'Параметр', + value: 'parameter', + description: 'Брать ID цепочки из параметра', + }, + { + name: 'METADATA.ChainOut.name', + value: 'metadata', + description: 'Брать ID цепочки из метаданных', + }, + ], + default: 'parameter', + description: 'Откуда брать ID цепочки назначения', + }, + { + displayName: 'Workflow ID', + name: 'workflowId', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + workflowIdSource: ['parameter'], + }, + }, + description: 'ID workflow для запуска', + }, + ], + }; + + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); + if (!items || items.length === 0) return [[]]; + + const item = items[0]; + let workflowId = ''; + const workflowIdSource = this.getNodeParameter('workflowIdSource', 0) as string; + + if (workflowIdSource === 'parameter') { + workflowId = this.getNodeParameter('workflowId', 0) as string; + } else { + const metadataRaw = item.json.METADATA; + if (!isObject(metadataRaw)) { + throw new NodeOperationError(this.getNode(), 'METADATA не является объектом'); + } + const metadata = metadataRaw as Record; + + if (!isObject(metadata.ChainOut)) { + throw new NodeOperationError(this.getNode(), 'METADATA.ChainOut не является объектом'); + } + const chainOut = metadata.ChainOut as Record; + const name = chainOut.name; + if (typeof name !== 'string' || name.trim() === '') { + throw new NodeOperationError(this.getNode(), 'Workflow ID не найден в METADATA.ChainOut.name'); + } + workflowId = name; + } + + if (!workflowId) { + throw new NodeOperationError(this.getNode(), 'Workflow ID пустой'); + } + + // Формируем новую METADATA + const nodeInfo = this.getNode(); + const fromNodeFull = nodeInfo.type; + const fromNode = fromNodeFull.includes('.') ? fromNodeFull.split('.').pop()! : fromNodeFull; + const idField = nodeInfo.name; + const workflowName = this.getWorkflow().name; + + item.json.METADATA = { + chain: workflowName, + from: fromNode, + id: idField, + time: Date.now(), + } as IDataObject; + + try { + const executionResult = await this.executeWorkflow( + { id: workflowId }, + [item], // передаём массив с одним элементом + undefined, + { + parentExecution: { + executionId: this.getWorkflowDataProxy(0).$execution.id, + workflowId: this.getWorkflowDataProxy(0).$workflow.id, + }, + }, + ); + + return executionResult.data as INodeExecutionData[][]; + } catch (error: any) { + throw new NodeOperationError(this.getNode(), `Ошибка запуска workflow: ${error.message}`); + } + } +} diff --git a/custom_nodes_for_n8n-master/nodes/_CustomSwitchNode/_CustomSwitchNode.node.ts b/custom_nodes_for_n8n-master/nodes/_CustomSwitchNode/_CustomSwitchNode.node.ts new file mode 100644 index 0000000..8c7c97b --- /dev/null +++ b/custom_nodes_for_n8n-master/nodes/_CustomSwitchNode/_CustomSwitchNode.node.ts @@ -0,0 +1,124 @@ +import { + INodeType, + INodeTypeDescription, + IExecuteFunctions, + INodeExecutionData, + NodeConnectionType, + IDataObject, +} from 'n8n-workflow'; + +interface SwitchCondition { + field: string; + operation: '==' | '!=' | '>' | '<' | '>=' | '<='; + value: string; + valueType: 'string' | 'number' | 'boolean'; +} + +export class _CustomSwitchNode implements INodeType { + description: INodeTypeDescription = { + displayName: 'Custom Switch', + name: 'customSwitchNode', + group: ['transform'], + version: 1, + description: 'Узел Switch с несколькими условиями для поля внутри DATA', + defaults: { name: 'CustomSwitch' }, + inputs: [NodeConnectionType.Main], + outputs: [NodeConnectionType.Main, NodeConnectionType.Main, NodeConnectionType.Main, NodeConnectionType.Main], + properties: [ + { + displayName: 'Условия', + name: 'conditions', + type: 'fixedCollection', + placeholder: 'Добавить условие', + typeOptions: { multipleValues: true }, + default: [], + options: [ + { + name: 'condition', + displayName: 'Условие', + values: [ + { displayName: 'Поле (внутри DATA)', name: 'field', type: 'string', default: '' }, + { + displayName: 'Операция', name: 'operation', type: 'options', options: [ + { name: '==', value: '==' }, + { name: '!=', value: '!=' }, + { name: '>', value: '>' }, + { name: '<', value: '<' }, + { name: '>=', value: '>=' }, + { name: '<=', value: '<=' }, + ], default: '==' + }, + { displayName: 'Значение', name: 'value', type: 'string', default: '' }, + { + displayName: 'Тип значения', name: 'valueType', type: 'options', options: [ + { name: 'Строка', value: 'string' }, + { name: 'Число', value: 'number' }, + { name: 'Булево', value: 'boolean' }, + ], default: 'string' + }, + ], + }, + ], + }, + ], + }; + + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); + if (!items || items.length === 0) return [[]]; + + const item = items[0]; + const nodeInfo = this.getNode(); + const fromNodeFull = nodeInfo.type; + const fromNode = fromNodeFull.includes('.') ? fromNodeFull.split('.').pop()! : fromNodeFull; + const idField = nodeInfo.name; + const workflowName = this.getWorkflow().name; + + // Перезаписываем METADATA + item.json.METADATA = { + chain: workflowName, + from: fromNode, + id: idField, + time: Date.now(), + } as IDataObject; + + const conditions: SwitchCondition[] = this.getNodeParameter('conditions.condition', 0, []) as SwitchCondition[]; + const returnData: INodeExecutionData[][] = [[], [], [], []]; // 4 выхода + + const dataObj = item.json.DATA || {}; + let routed = false; + + for (let j = 0; j < conditions.length; j++) { + const { field, operation, value, valueType } = conditions[j]; + const dataObjSafe = item.json.DATA as Record; + let itemValue = dataObjSafe[field]; + + let compareValue: any = value; + if (valueType === 'number') compareValue = parseFloat(value); + else if (valueType === 'boolean') compareValue = value === 'true'; + + let match = false; + switch (operation) { + case '==': match = itemValue === compareValue; break; + case '!=': match = itemValue !== compareValue; break; + case '>': match = itemValue > compareValue; break; + case '<': match = itemValue < compareValue; break; + case '>=': match = itemValue >= compareValue; break; + case '<=': match = itemValue <= compareValue; break; + } + + if (match) { + returnData[j].push(item); + routed = true; + break; // первый совпавший выход + } + } + + // Если ни одно условие не совпало — направляем на последний выход + if (!routed && returnData.length > conditions.length) { + returnData[conditions.length].push(item); + } + + return returnData; + } +} diff --git a/custom_nodes_for_n8n-master/nodes/_ForLoop/_ForLoop.node.ts b/custom_nodes_for_n8n-master/nodes/_ForLoop/_ForLoop.node.ts new file mode 100644 index 0000000..a274ca7 --- /dev/null +++ b/custom_nodes_for_n8n-master/nodes/_ForLoop/_ForLoop.node.ts @@ -0,0 +1,162 @@ +import { + INodeType, + INodeTypeDescription, + IExecuteFunctions, + INodeExecutionData, + NodeOperationError, + NodeConnectionType, +} from 'n8n-workflow'; + +function checkCondition(value: any, cond: string, cmp: any): boolean { + switch (cond) { + case '!=': return value != cmp; + case '==': return value == cmp; + case '>': return value > cmp; + case '<': return value < cmp; + case '>=': return value >= cmp; + case '<=': return value <= cmp; + default: return false; + } +} + +export class _ForLoop implements INodeType { + description: INodeTypeDescription = { + displayName: 'ForLoop', + name: 'forLoop', + group: ['transform'], + version: 1, + description: 'Цикл for с условием по полю JSON', + defaults: { name: 'ForLoop' }, + inputs: [NodeConnectionType.Main], + outputs: [NodeConnectionType.Main], + properties: [ + { + displayName: 'Поле (без DATA)', + name: 'fieldName', + type: 'string', + default: 'count', + placeholder: 'count', + description: 'Имя поля в item.json.DATA, по которому проверяется условие', + }, + { + displayName: 'Условие', + name: 'condition', + type: 'options', + options: [ + { name: '!=', value: '!=' }, + { name: '==', value: '==' }, + { name: '>', value: '>' }, + { name: '<', value: '<' }, + { name: '>=', value: '>=' }, + { name: '<=', value: '<=' }, + ], + default: '!=', + }, + { + displayName: 'Значение для сравнения', + name: 'compareValue', + type: 'number', + default: 0, + }, + { + displayName: 'Тип значения', + name: 'valueType', + type: 'options', + options: [ + { name: 'Number', value: 'number' }, + { name: 'String', value: 'string' }, + ], + default: 'number', + }, + { + displayName: 'Начало', + name: 'start', + type: 'number', + default: 1, + }, + { + displayName: 'Конец', + name: 'end', + type: 'number', + default: 5, + }, + { + displayName: 'Шаг', + name: 'step', + type: 'number', + default: 1, + }, + { + displayName: 'Таймаут (мс)', + name: 'timeoutMs', + type: 'number', + default: 0, + }, + ], + }; + + async execute(this: IExecuteFunctions): Promise { + const item = this.getInputData()[0]; // всегда один вход + const returnItems: INodeExecutionData[] = []; + + const fieldName = this.getNodeParameter('fieldName', 0) as string; + const condition = this.getNodeParameter('condition', 0) as string; + const compareValue = this.getNodeParameter('compareValue', 0) as number; + const valueType = this.getNodeParameter('valueType', 0) as string; + const start = this.getNodeParameter('start', 0) as number; + const end = this.getNodeParameter('end', 0) as number; + const step = this.getNodeParameter('step', 0) as number; + const timeoutMs = this.getNodeParameter('timeoutMs', 0) as number; + + if (step === 0) { + throw new NodeOperationError(this.getNode(), 'Шаг не может быть равен нулю.'); + } + + const data = item.json.DATA as Record; + if (!data || data[fieldName] === undefined) { + throw new NodeOperationError(this.getNode(), `В item.json.DATA нет поля "${fieldName}"`); + } + + let fieldValue = data[fieldName]; + if (valueType === 'number') fieldValue = Number(fieldValue); + else if (valueType === 'string') fieldValue = String(fieldValue); + + if (!checkCondition(fieldValue, condition, compareValue)) { + return this.prepareOutputData([]); // условие не прошло — пустой результат + } + + const loopCondition = (val: number) => step > 0 ? val <= end : val >= end; + + // Получаем данные для метадаты + const nodeInfo = this.getNode(); + const fromNodeFull = nodeInfo.type; + const fromNode = fromNodeFull.includes('.') ? fromNodeFull.split('.').pop()! : fromNodeFull; + const idField = nodeInfo.name; + const workflowName = this.getWorkflow().name; + + for (let counter = start; loopCondition(counter); counter += step) { + const newItem: INodeExecutionData = { + json: { + ...item.json, + counter, + fieldValue, + METADATA: { + ...(item.json.METADATA as Record || {}), + chain: workflowName, + from: fromNode, + id: idField, + time: Date.now(), + }, + }, + binary: item.binary, + }; + returnItems.push(newItem); + + if (timeoutMs > 0) { + await new Promise((resolve) => setTimeout(resolve, timeoutMs)); + } + } + + return this.prepareOutputData(returnItems); + } +} diff --git a/custom_nodes_for_n8n-master/nodes/_Generator/_Generator.node.ts b/custom_nodes_for_n8n-master/nodes/_Generator/_Generator.node.ts new file mode 100644 index 0000000..bacc084 --- /dev/null +++ b/custom_nodes_for_n8n-master/nodes/_Generator/_Generator.node.ts @@ -0,0 +1,88 @@ +import { + INodeType, + INodeTypeDescription, + ITriggerFunctions, + ITriggerResponse, + INodeExecutionData, + NodeConnectionType, +} from 'n8n-workflow'; + +export class _Generator implements INodeType { + description: INodeTypeDescription = { + displayName: 'Generator', + name: 'generatorNode', + group: ['trigger'], + version: 1, + description: 'Срабатывает по интервалу и генерирует JSON + metadata', + defaults: { + name: 'Generator', + }, + inputs: [], + outputs: [NodeConnectionType.Main], + properties: [ + { + displayName: 'Повторять раз в (мс)', + name: 'interval', + type: 'number', + default: 1000, + description: 'Интервал между генерацией данных', + }, + { + displayName: 'JSON на выходе', + name: 'jsonOutput', + type: 'string', + typeOptions: { rows: 6 }, + default: '{}', + description: 'Содержимое JSON, которое будет выдано', + }, + + ], + }; + + async trigger(this: ITriggerFunctions): Promise { + const interval = this.getNodeParameter('interval', 0) as number; + const jsonOutputStr = this.getNodeParameter('jsonOutput', 0) as string; + + let parsedJson: any; + try { + parsedJson = JSON.parse(jsonOutputStr); + } catch (error) { + throw new Error('Ошибка при разборе JSON: ' + error); + } + + + const workflowName = this.getWorkflow?.()?.name || ''; + const nodeInfo = this.getNode(); + const fromNodeFull = nodeInfo.type; + const fromNode = fromNodeFull.includes('.') ? fromNodeFull.split('.').pop()! : fromNodeFull; + + const idField = nodeInfo.name as string; + + const emitFn = () => { + const data: INodeExecutionData = { + json: { + DATA:{ + ...parsedJson, + }, + METADATA: { + chain: workflowName, + from: fromNode, + id: idField, + time: Date.now(), + }, + }, + pairedItem: 0, + }; + + this.emit([[data]]); + }; + + const intervalId = setInterval(emitFn, interval); + + return { + closeFunction: async () => { + clearInterval(intervalId); + }, + }; + } +} diff --git a/custom_nodes_for_n8n-master/nodes/_HTTPIn/_HTTPIn.node.ts b/custom_nodes_for_n8n-master/nodes/_HTTPIn/_HTTPIn.node.ts new file mode 100644 index 0000000..69e4dd8 --- /dev/null +++ b/custom_nodes_for_n8n-master/nodes/_HTTPIn/_HTTPIn.node.ts @@ -0,0 +1,112 @@ +import { + IWebhookFunctions, + INodeExecutionData, +} from 'n8n-workflow'; +import { + INodeType, + INodeTypeDescription, + NodeConnectionType, +} from 'n8n-workflow'; + +export class _HTTPIn implements INodeType { + description: INodeTypeDescription = { + displayName: 'HTTPInput', + name: 'httpInput', + + group: ['trigger'], + version: 1, + description: 'Receive HTTP requests like DemoHttpTransport', + defaults: { + name: 'HTTPInput', + }, + inputs: [], + outputs: [NodeConnectionType.Main], + properties: [], + }; + + async execute(): Promise { + return [[]]; + } + + async webhook(this: IWebhookFunctions): Promise<{ workflowData: INodeExecutionData[][]; rawResponse: boolean }> { + const req = this.getRequestObject(); + const res = this.getResponseObject(); + + res.setHeader('Access-Control-Allow-Origin', '*'); + res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS'); + res.setHeader('Access-Control-Allow-Headers', '*'); + + if (req.method === 'OPTIONS') { + res.statusCode = 200; + res.end(); + return { workflowData: [[]], rawResponse: true }; + } + + const query = req.query || {}; + const chain = query.chain as string; + + if (!chain) { + res.statusCode = 400; + res.end("Error. Require param 'chain=chainName'"); + return { workflowData: [[]], rawResponse: true }; + } + + let body: any = null; + try { + const contentType = req.headers['content-type'] || ''; + if (contentType.includes('application/json')) { + body = await new Promise((resolve, reject) => { + let data = ''; + req.on('data', (chunk: any) => { data += chunk; }); + req.on('end', () => { + try { + resolve(JSON.parse(data)); + } catch (e) { + reject(e); + } + }); + req.on('error', (err: any) => reject(err)); + }); + } else { + body = await new Promise((resolve) => { + let data = ''; + req.on('data', (chunk: any) => { data += chunk; }); + req.on('end', () => resolve(data)); + }); + } + } catch (e) { + res.statusCode = 400; + res.end('Invalid body: ' + (e as Error).message); + return { workflowData: [[]], rawResponse: true }; + } + + + const nodeInfo = this.getNode(); + const workflowName = this.getWorkflow().name; + + const metadata = { + ...(body && body.METADATA ? body.METADATA : {}), // если тело уже имеет METADATA + from: nodeInfo.name, // имя текущего узла + id: nodeInfo.name, // можно использовать nodeInfo.type для типа + chain: chain, + workflow: workflowName, + time: Date.now(), + date: new Date().toLocaleDateString('ru-RU'), + }; + + const item: INodeExecutionData = { + json: { + METADATA: metadata, + DATA: body, + }, + }; + + res.statusCode = 200; + res.end('OK'); + + return { + workflowData: [[item]], + rawResponse: true, // мы сами ответили клиенту + }; + } +} diff --git a/custom_nodes_for_n8n-master/nodes/_MQTTInput/_MQTTInput.node.ts b/custom_nodes_for_n8n-master/nodes/_MQTTInput/_MQTTInput.node.ts new file mode 100644 index 0000000..359387b --- /dev/null +++ b/custom_nodes_for_n8n-master/nodes/_MQTTInput/_MQTTInput.node.ts @@ -0,0 +1,149 @@ +import { + INodeType, + INodeTypeDescription, + ITriggerFunctions, + ITriggerResponse, + INodeExecutionData, + NodeConnectionType, +} from 'n8n-workflow'; + +import mqtt from 'mqtt'; + +// Функция замены $var на process.env.VAR +function resolveEnvVariables(str: string): string { + if (typeof str !== 'string') return str; + return str.replace(/\$([a-zA-Z0-9_]+)/g, (_, v) => process.env[v] ?? ''); +} + +export class _MQTTInput implements INodeType { + description: INodeTypeDescription = { + displayName: 'MQTTInput', + name: 'mqttInput', + group: ['trigger'], + version: 1, + description: 'Subscribe to MQTT topics and emit incoming messages', + defaults: { + name: 'MQTTInput', + }, + inputs: [], // триггер — без входа + outputs: [NodeConnectionType.Main], + properties: [ + { + displayName: 'Host URL', + name: 'host', + type: 'string', + default: 'tcp://$mqtthost', + }, + { + displayName: 'Port', + name: 'port', + type: 'string', + default: '$mqttport', + }, + { + displayName: 'Username', + name: 'username', + type: 'string', + default: '$mqttuser', + }, + { + displayName: 'Password', + name: 'password', + type: 'string', + + default: '$mqttpassword', + }, + { + displayName: 'Topic', + name: 'topic', + type: 'string', + default: '$mqtt_topic', + }, + { + displayName: 'QoS', + name: 'qos', + type: 'number', + typeOptions: { + minValue: 0, + maxValue: 2, + }, + default: 1, + }, + ], + }; + + async trigger(this: ITriggerFunctions): Promise { + const rawHost = this.getNodeParameter('host', 0) as string; + const rawPort = this.getNodeParameter('port', 0) as string; + const rawUsername = this.getNodeParameter('username', 0) as string; + const rawPassword = this.getNodeParameter('password', 0) as string; + const rawTopic = this.getNodeParameter('topic', 0) as string; + + const qosRaw = this.getNodeParameter('qos', 0) as number; + const qos = (qosRaw === 0 || qosRaw === 1 || qosRaw === 2) ? qosRaw : 1; + + // Подставляем переменные окружения + const host = resolveEnvVariables(rawHost); + const port = resolveEnvVariables(rawPort); + const username = resolveEnvVariables(rawUsername); + const password = resolveEnvVariables(rawPassword); + const topic = resolveEnvVariables(rawTopic); + + const url = `${host}:${port}`; + + const workflowName = this.getWorkflow()?.name || ''; + const nodeInfo = this.getNode(); + const fromNodeFull = nodeInfo.type; + const fromNode = fromNodeFull.includes('.') ? fromNodeFull.split('.').pop()! : fromNodeFull; + const idField = nodeInfo.name as string; + + const client = mqtt.connect(url, { + username, + password, + }); + + client.on('connect', () => { + client.subscribe(topic, { qos }, (err) => { + if (err) { + this.emitError(err); + } + }); + }); + + client.on('message', (receivedTopic, message) => { + const payloadStr = message.toString(); + let payload: any; + try { + payload = JSON.parse(payloadStr); + } catch { + payload = { raw: payloadStr }; + } + + const data: INodeExecutionData = { + json: { + DATA: payload, + METADATA: { + chain: workflowName, + from: fromNode, + id: idField, + time: Date.now(), + mqtt_topic: receivedTopic, + }, + }, + pairedItem: 0, + }; + + this.emit([[data]]); + }); + + client.on('error', (err) => { + this.emitError(err); + }); + + return { + closeFunction: async () => { + client.end(); + }, + }; + } +} diff --git a/custom_nodes_for_n8n-master/nodes/_MQTTOut/_MQTTOut.node.ts b/custom_nodes_for_n8n-master/nodes/_MQTTOut/_MQTTOut.node.ts new file mode 100644 index 0000000..b2a559a --- /dev/null +++ b/custom_nodes_for_n8n-master/nodes/_MQTTOut/_MQTTOut.node.ts @@ -0,0 +1,141 @@ +import { + INodeType, + INodeTypeDescription, + IExecuteFunctions, + NodeConnectionType, +} from 'n8n-workflow'; + +import mqtt from 'mqtt'; + +function resolveEnvVariables(str: string): string { + return str.replace(/\$([a-zA-Z0-9_]+)/g, (_, v) => process.env[v] ?? ''); +} + +export class _MQTTOut implements INodeType { + description: INodeTypeDescription = { + displayName: 'MQTTOut', + name: 'mqttOut', + group: ['output'], + version: 1, + description: 'Publish messages to MQTT broker', + defaults: { + name: 'MQTTOut', + }, + inputs: [NodeConnectionType.Main], + outputs: [NodeConnectionType.Main], + credentials: [], + properties: [ + { + displayName: 'Host URL', + name: 'host', + type: 'string', + default: 'tcp://$mqtthost', + }, + { + displayName: 'Port', + name: 'port', + type: 'string', + default: '$mqttport', + }, + { + displayName: 'Username', + name: 'username', + type: 'string', + default: '$mqttuser', + }, + { + displayName: 'Password', + name: 'password', + type: 'string', + default: '$mqttpassword', + }, + { + displayName: 'QoS', + name: 'qos', + type: 'number', + typeOptions: { minValue: 0, maxValue: 2 }, + default: 1, + }, + { + displayName: 'Retain', + name: 'retain', + type: 'boolean', + default: false, + }, + { + displayName: 'Topic', + name: 'topic', + type: 'string', + default: '101_AAA_0.12_UserToLocation_Out', + displayOptions: { + show: { useMetadataTopic: [false] }, + }, + }, + { + displayName: 'Use topic from METADATA', + name: 'useMetadataTopic', + type: 'boolean', + default: false, + }, + ], + }; + + async execute(this: IExecuteFunctions) { + const item = this.getInputData()[0]; // всегда один элемент + + // Формируем METADATA заново + const nodeInfo = this.getNode(); + const workflowName = this.getWorkflow().name; + + item.json.METADATA = { + from: nodeInfo.name, + id: nodeInfo.name, + workflow: workflowName, + time: Date.now(), + }; + + // Получаем параметры + const rawHost = this.getNodeParameter('host', 0) as string; + const rawPort = this.getNodeParameter('port', 0) as string; + const rawUsername = this.getNodeParameter('username', 0) as string; + const rawPassword = this.getNodeParameter('password', 0) as string; + + const host = resolveEnvVariables(rawHost); + const port = resolveEnvVariables(rawPort); + const username = resolveEnvVariables(rawUsername); + const password = resolveEnvVariables(rawPassword); + + const qosRaw = this.getNodeParameter('qos', 0) as number; + const qos = (qosRaw === 0 || qosRaw === 1 || qosRaw === 2) ? qosRaw : 1; + + const retain = this.getNodeParameter('retain', 0) as boolean; + const useMetadataTopic = this.getNodeParameter('useMetadataTopic', 0) as boolean; + + const url = `${host}:${port}`; + + const metadata = item.json?.METADATA as { mqtt_topic?: string }; + const topic = useMetadataTopic + ? metadata?.mqtt_topic ?? 'undefined_topic' + : (this.getNodeParameter('topic', 0) as string); + + const payload = JSON.stringify(item.json.DATA); + + const client = mqtt.connect(url, { username, password }); + + await new Promise((resolve, reject) => { + client.on('connect', () => { + client.publish(topic, payload, { qos, retain }, (err) => { + client.end(); + if (err) return reject(err); + resolve(); + }); + }); + + client.on('error', (err) => { + reject(err); + }); + }); + + return this.prepareOutputData([item]); + } +} diff --git a/custom_nodes_for_n8n-master/nodes/_MyCustomNode/_MyCustomNode.node.ts b/custom_nodes_for_n8n-master/nodes/_MyCustomNode/_MyCustomNode.node.ts new file mode 100644 index 0000000..8fdcacf --- /dev/null +++ b/custom_nodes_for_n8n-master/nodes/_MyCustomNode/_MyCustomNode.node.ts @@ -0,0 +1,52 @@ +import { + INodeType, + INodeTypeDescription, + INodeExecutionData, + IExecuteFunctions, + NodeConnectionType, +} from 'n8n-workflow'; + +export class _MyCustomNode implements INodeType { + description: INodeTypeDescription = { + displayName: 'My Custom Node', + name: 'myCustomNode', + group: ['transform'], + version: 1, + description: 'Пример кастомного узла', + defaults: { + name: 'My Custom Node', + }, + inputs: [NodeConnectionType.Main], + outputs: [NodeConnectionType.Main], + properties: [ + { + displayName: 'Text to Append', + name: 'appendText', + type: 'string', + default: ' Hello n8n!', + description: 'Текст, который будет добавлен к входу', + }, + ], + }; + + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); + const returnData: INodeExecutionData[] = []; + + for (let i = 0; i < items.length; i++) { + const appendText = this.getNodeParameter('appendText', i, '') as string; + const input = items[i].json['input'] as string || ''; + + const newItem: INodeExecutionData = { + json: { + ...items[i].json, + result: input + appendText, + }, + }; + + returnData.push(newItem); + } + + return [returnData]; + } +} diff --git a/custom_nodes_for_n8n-master/nodes/_OPCInput/_OPCInput.node.ts b/custom_nodes_for_n8n-master/nodes/_OPCInput/_OPCInput.node.ts new file mode 100644 index 0000000..551c860 --- /dev/null +++ b/custom_nodes_for_n8n-master/nodes/_OPCInput/_OPCInput.node.ts @@ -0,0 +1,274 @@ +import { + ITriggerFunctions, + INodeType, + INodeTypeDescription, + NodeConnectionType +} from 'n8n-workflow'; + +import { + ClientSession, + MessageSecurityMode, + SecurityPolicy, + OPCUAClient, + AttributeIds, + UserIdentityInfoUserName, + UserTokenType, +} from 'node-opcua'; + +import * as fs from 'fs'; +import * as path from 'path'; + +function resolveEnvVariables(str: string): string { + if (typeof str !== 'string') return str; + return str.replace(/\$([a-zA-Z0-9_]+)/g, (_, v) => process.env[v] ?? ''); +} + +interface OpcInputOptions { + host: string; + port: string; + user?: string; + password?: string; + cert?: string; + key?: string; + sec_mode: string; + securityPolicyUri?: string; + applicationUri?: string; + NodeIdPath?: string; + ns: number; + interval: number; +} + +export class _OPCInput implements INodeType { + description: INodeTypeDescription = { + displayName: 'OPC Input Trigger', + name: 'opcInput', + group: ['trigger'], + version: 1, + description: 'Connect to OPC UA server and periodically fetch values', + defaults: { name: 'OPC Input' }, + inputs: [], + outputs: [NodeConnectionType.Main], + properties: [ + { displayName: 'Host', name: 'host', type: 'string', default: '' }, + { displayName: 'Port', name: 'port', type: 'string', default: '4840' }, + { displayName: 'Username', name: 'user', type: 'string', default: '' }, + { displayName: 'Password', name: 'password', type: 'string', typeOptions: { password: true }, default: '' }, + { displayName: 'Certificate File Path', name: 'cert', type: 'string', default: '' }, + { displayName: 'Private Key File Path', name: 'key', type: 'string', default: '' }, + { + displayName: 'Security Mode', + name: 'sec_mode', + type: 'options', + options: [ + { name: 'NONE', value: 'NONE' }, + { name: 'SIGN', value: 'SIGN' }, + { name: 'SIGNANDENCRYPT', value: 'SIGNANDENCRYPT' }, + ], + default: 'NONE', + }, + { displayName: 'Security Policy URI', name: 'securityPolicyUri', type: 'string', default: '' }, + { displayName: 'Application URI', name: 'applicationUri', type: 'string', default: '' }, + { displayName: 'NodeId Path', name: 'NodeIdPath', type: 'string', default: '' }, + { displayName: 'Namespace Index', name: 'ns', type: 'number', default: 1 }, + { displayName: 'Interval (ms)', name: 'interval', type: 'number', default: 5000 }, + ], + }; + + async trigger(this: ITriggerFunctions) { + const options: OpcInputOptions = { + host: resolveEnvVariables((this.getNodeParameter('host', '') as string) || process.env.OPC_HOST || 'localhost'), + port: resolveEnvVariables((this.getNodeParameter('port', '4840') as string) || process.env.OPC_PORT || '4840'), + user: resolveEnvVariables((this.getNodeParameter('user', '') as string) || process.env.OPC_USER || ''), + password: resolveEnvVariables((this.getNodeParameter('password', '') as string) || process.env.OPC_PASS || ''), + cert: resolveEnvVariables((this.getNodeParameter('cert', '') as string) || process.env.OPC_CERT || ''), + key: resolveEnvVariables((this.getNodeParameter('key', '') as string) || process.env.OPC_KEY || ''), + sec_mode: resolveEnvVariables((this.getNodeParameter('sec_mode', 'NONE') as string) || process.env.OPC_SEC_MODE || 'NONE'), + securityPolicyUri: resolveEnvVariables((this.getNodeParameter('securityPolicyUri', '') as string) || process.env.OPC_SEC_POLICY || ''), + applicationUri: resolveEnvVariables((this.getNodeParameter('applicationUri', '') as string) || process.env.OPC_APP_URI || ''), + NodeIdPath: resolveEnvVariables((this.getNodeParameter('NodeIdPath', '') as string) || process.env.OPC_NODE_PATH || ''), + ns: (this.getNodeParameter('ns', 1) as number) || Number(process.env.OPC_NS) || 1, + interval: (this.getNodeParameter('interval', 5000) as number) || Number(process.env.OPC_INTERVAL) || 5000, + }; + + const endpointUrl = `opc.tcp://${options.host}:${options.port}`; + + let securityMode: MessageSecurityMode; + switch (options.sec_mode) { + case 'SIGN': + securityMode = MessageSecurityMode.Sign; + break; + case 'SIGNANDENCRYPT': + securityMode = MessageSecurityMode.SignAndEncrypt; + break; + default: + securityMode = MessageSecurityMode.None; + } + + let certificateFile: string | undefined; + let privateKeyFile: string | undefined; + + if (process.env.OPC_CERT_BASE64) { + const certPath = path.join('/tmp', 'opc_cert.pem'); + fs.writeFileSync(certPath, Buffer.from(process.env.OPC_CERT_BASE64, 'base64')); + certificateFile = certPath; + } else if (options.cert && fs.existsSync(options.cert)) { + certificateFile = options.cert; + } + + if (process.env.OPC_KEY_BASE64) { + const keyPath = path.join('/tmp', 'opc_key.pem'); + fs.writeFileSync(keyPath, Buffer.from(process.env.OPC_KEY_BASE64, 'base64')); + privateKeyFile = keyPath; + } else if (options.key && fs.existsSync(options.key)) { + privateKeyFile = options.key; + } + + const client = OPCUAClient.create({ + securityMode, + securityPolicy: (options.securityPolicyUri as SecurityPolicy) || SecurityPolicy.None, + certificateFile, + privateKeyFile, + }); + + let connecting = false; + let disconnecting = false; + + async function safeDisconnect() { + if (disconnecting) return; + disconnecting = true; + try { await client.disconnect(); } catch { } + disconnecting = false; + } + + // Рекурсивный обход объекта / папки + const browseAndRead = async (session: ClientSession, nodeId: string): Promise => { + const browseResult = await session.browse(nodeId); + const results: any[] = []; + for (const ref of browseResult.references || []) { + if (ref.nodeClass === 2) { // Variable + try { + const dataValue = await session.read({ nodeId: ref.nodeId, attributeId: AttributeIds.Value }); + results.push({ + namespaceIndex: ref.nodeId.namespace, + browseName: ref.browseName.toString(), + displayName: ref.displayName.text, + identifier: ref.nodeId.value, + value: dataValue.value.value, + }); + } catch (e) { + results.push({ + namespaceIndex: ref.nodeId.namespace, + browseName: ref.browseName.toString(), + displayName: ref.displayName.text, + identifier: ref.nodeId.value, + value: `Error: ${(e as Error).message}`, + }); + } + } else { // Object / Folder + results.push({ + namespaceIndex: ref.nodeId.namespace, + browseName: ref.browseName.toString(), + displayName: ref.displayName.text, + identifier: ref.nodeId.value, + value: await browseAndRead(session, ref.nodeId.toString()), + }); + } + } + return results; + }; + + const emitValues = async () => { + if (connecting) return; + connecting = true; + + const workflowName = this.getWorkflow().name; + const nodeInfo = this.getNode(); + const fromNodeFull = nodeInfo.type; + const fromNode = fromNodeFull.includes('.') ? fromNodeFull.split('.').pop()! : fromNodeFull; + const idField = nodeInfo.name; + + try { + await client.connect(endpointUrl); + + const session = await client.createSession( + options.user + ? { + type: UserTokenType.UserName, + userName: options.user, + password: options.password || "", + } as UserIdentityInfoUserName + : undefined + ); + + const nodeId = `ns=${options.ns};s=${options.NodeIdPath}`; + let values: any[] = []; + + // Пробуем прочитать как переменную + try { + const dataValue = await session.read({ nodeId, attributeId: AttributeIds.Value }); + if (dataValue.value.value !== null && dataValue.value.value !== undefined) { + values = [dataValue.value.value]; + } else { + // Если это объект / папка — рекурсивное чтение + values = await browseAndRead(session, nodeId); + } + } catch { + values = await browseAndRead(session, nodeId); + } + + const output = [ + { + DATA: { + connection_status: true, + time: Date.now(), + values: [values], + }, + METADATA: { + chain: workflowName, + from: fromNode, + id: idField, + time: Date.now(), + }, + }, + ]; + + this.emit([this.helpers.returnJsonArray(output)]); + + await session.close(); + await safeDisconnect(); + } catch (err) { + const output = [ + { + DATA: { + connection_status: false, + time: Date.now(), + values: [], + error: (err as Error).message, + }, + METADATA: { + chain: workflowName, + from: fromNode, + id: idField, + time: Date.now(), + }, + }, + ]; + + this.emit([this.helpers.returnJsonArray(output)]); + await safeDisconnect(); + } finally { + connecting = false; + } + }; + + + const intervalHandle = setInterval(emitValues, options.interval); + + async function closeFunction() { + clearInterval(intervalHandle); + await safeDisconnect(); + } + + return { closeFunction }; + } +} diff --git a/custom_nodes_for_n8n-master/nodes/_OPCServer/_OPCServer.node.ts b/custom_nodes_for_n8n-master/nodes/_OPCServer/_OPCServer.node.ts new file mode 100644 index 0000000..1121d9b --- /dev/null +++ b/custom_nodes_for_n8n-master/nodes/_OPCServer/_OPCServer.node.ts @@ -0,0 +1,192 @@ +import { + INodeType, + INodeTypeDescription, + IExecuteFunctions, + NodeConnectionType, +} from 'n8n-workflow'; + +import { OPCUAClient, AttributeIds, DataType } from 'node-opcua'; +import mqtt from 'mqtt'; + +function getValueByPath(obj: any, path: string): any { + if (!path) return obj; + return path.split('.').reduce((acc, key) => acc?.[key], obj); +} + +export class _OPCServer implements INodeType { + description: INodeTypeDescription = { + displayName: 'OPCServer', + name: 'opcServer', + group: ['transform'], + version: 1, + description: 'Записывает данные в OPC UA и, при необходимости, публикует в MQTT', + defaults: { + name: 'OPCServer', + }, + inputs: [NodeConnectionType.Main], + outputs: [NodeConnectionType.Main], + properties: [ + { + displayName: 'Requests or Devices', + name: 'sectionDevices', + type: 'string', + default: 'Устройства', + }, + { + displayName: 'Путь до данных внутри DATA', + name: 'useKeyFromData', + type: 'string', + default: '', + }, + { + displayName: 'Имя сущности (например: Весы, Табло и т.д.)', + name: 'entityName', + type: 'string', + default: 'Состояние', + }, + { + displayName: 'Тип сущности', + name: 'entityType', + type: 'string', + default: 'Весы', + }, + { + displayName: 'Локация', + name: 'location', + type: 'string', + default: '9', + }, + { + displayName: 'Отправлять в MQTT', + name: 'sendToMqtt', + type: 'boolean', + default: false, + }, + { + displayName: 'Сетевой узел', + name: 'networkNode', + type: 'string', + default: 'dev_re_promuc_local', + }, + ], + }; + + async execute(this: IExecuteFunctions) { + const items = this.getInputData(); + const sectionDevices = this.getNodeParameter('sectionDevices', 0) as string; + const useKeyFromData = this.getNodeParameter('useKeyFromData', 0) as string; + const entityName = this.getNodeParameter('entityName', 0) as string; + const entityType = this.getNodeParameter('entityType', 0) as string; + const location = this.getNodeParameter('location', 0) as string; + const networkNode = this.getNodeParameter('networkNode', 0) as string; + const sendToMqtt = this.getNodeParameter('sendToMqtt', 0) as boolean; + + const opcHost = process.env.OPChost; + const opcPort = process.env.OPCport; + + if (!opcHost || !opcPort) { + throw new Error('OPChost или OPCport не заданы в переменных окружения'); + } + + const opcEndpoint = `opc.tcp://${opcHost}:${opcPort}`; + const client = OPCUAClient.create({ endpointMustExist: false }); + + await client.connect(opcEndpoint); + const session = await client.createSession(); + + for (let i = 0; i < items.length; i++) { + const item = items[i]; + const rawData = item.json.DATA as Record; + const metadata = item.json.METADATA as { nodeId?: string }; + + if (!rawData) continue; + + + + const dataToWrite = getValueByPath(rawData, useKeyFromData); + if (typeof dataToWrite !== 'object' || dataToWrite === null) { + throw new Error(`Не удалось получить данные по пути '${useKeyFromData}'`); + } + + let basePath: string; + if (typeof rawData.route === 'string') { + basePath = rawData.route; + } else { + basePath = `${networkNode}.${location}.${sectionDevices}.${entityType}.${entityName}`; + } + + const opcNamespacePath = `${basePath}`; + Object.entries(dataToWrite).forEach(([key, value]) => { + console.log(`key=${key}, value=`, value, typeof value); + }); + + const nodesToWrite = Object.entries(dataToWrite).map(([key, value]) => { + let dataType: DataType = DataType.String; + if (typeof value === 'boolean') dataType = DataType.Boolean; + else if (typeof value === 'number') dataType = DataType.Double; + + return { + nodeId: `ns=1;s=${opcNamespacePath}.${key}`, + attributeId: AttributeIds.Value, + value: { + value: { + dataType, + value, + }, + }, + }; + }); + + await session.write(nodesToWrite); + const writeResults = await session.write(nodesToWrite); + + writeResults.forEach((statusCode, index) => { + const nodeId = nodesToWrite[index].nodeId; + console.log(`Write to ${nodeId} => status: ${statusCode.name || statusCode.toString()}`); + }); + + + // ===== MQTT (если включено) ===== + if (sendToMqtt) { + const mqttHost = process.env.mqtthost; + const mqttPort = process.env.mqttport; + const mqttUser = process.env.mqttuser; + const mqttPass = process.env.mqttpassword; + + if (!mqttHost || !mqttPort || !mqttUser || !mqttPass) { + throw new Error('Отсутствуют переменные окружения для MQTT'); + } + + const payload = JSON.stringify(dataToWrite); + const mqttUrl = `mqtt://${mqttHost}:${mqttPort}`; + const mqttClient = mqtt.connect(mqttUrl, { + username: mqttUser, + password: mqttPass, + }); + + await new Promise((resolve, reject) => { + mqttClient.on('connect', () => { + mqttClient.publish(basePath, payload, { qos: 1, retain: false }, (err) => { + mqttClient.end(); + if (err) return reject(err); + resolve(); + }); + }); + + mqttClient.on('error', (err) => reject(err)); + }); + } + + + if (typeof item.json.DATA === 'object' && item.json.DATA !== null) { + (item.json.DATA as Record).route = opcNamespacePath; + } + + } + + await session.close(); + await client.disconnect(); + + return this.prepareOutputData(items); + } +} diff --git a/custom_nodes_for_n8n-master/nodes/_OPCWrite/_OPCWrite.node.ts b/custom_nodes_for_n8n-master/nodes/_OPCWrite/_OPCWrite.node.ts new file mode 100644 index 0000000..7f16abd --- /dev/null +++ b/custom_nodes_for_n8n-master/nodes/_OPCWrite/_OPCWrite.node.ts @@ -0,0 +1,299 @@ +import { + INodeType, + INodeTypeDescription, + INodeExecutionData, + NodeOperationError, + NodeConnectionType, +} from 'n8n-workflow'; + +// NOTE: We do NOT import IExecuteFunctions (you said it's not available). +// We'll use `this: any & OPCWrite` in execute. + +import { + OPCUAClient, + ClientSession, + AttributeIds, + DataType, + StatusCodes, + // node-opcua typings provide these enums/constructs +} from 'node-opcua'; + +export class _OPCWrite implements INodeType { + description: INodeTypeDescription = { + displayName: 'OPCWrite', + name: 'opcWrite', + icon: 'file:opc.png', + group: ['transform'], + version: 1, + description: 'Writes data to an OPC UA server (behavior like C++ open62541 example)', + defaults: { + name: 'OPCWrite', + color: '#772244', + }, + inputs: [NodeConnectionType.Main], + outputs: [NodeConnectionType.Main], + properties: [ + { + displayName: 'Host', + name: 'host', + type: 'string', + default: process.env.OPC_HOST || 'opc.tcp://localhost', + placeholder: 'opc.tcp://localhost', + required: true, + }, + { + displayName: 'Port', + name: 'port', + type: 'number', + default: Number(process.env.OPC_PORT) || 4840, + required: true, + }, + { + displayName: 'Node ID (identifier part or full ns=..;s=..)', + name: 'nodeId', + type: 'string', + default: process.env.OPC_NODE_ID || '', + required: true, + }, + { + displayName: 'Route (dot-path from DATA)', + name: 'route', + type: 'string', + default: 'value', + }, + { + displayName: 'Namespace index (used when nodeId is not full)', + name: 'ns', + type: 'number', + default: Number(process.env.OPC_NS) || 2, + }, + ], + }; + + // Single client & session stored on the instance (like C++) + private client: OPCUAClient | null = null; + private session: ClientSession | null = null; + private endpointUrlCached: string | null = null; + private connectedOnce = false; // tracks whether we already tried initial connect + + // Helper: replace ${ENV} in strings (like you asked earlier) + private replaceEnvVars(str: string): string { + if (!str) return str; + return str.replace(/\$\{([^}]+)\}/g, (_m, name) => process.env[name] ?? ''); + } + + private splitRoute(route: string): string[] { + if (!route) return []; + if (route.startsWith('DATA.')) route = route.slice(5); + return route.length ? route.split('.') : []; + } + + private getValueByRoute(obj: any, steps: string[]): any { + let cur = obj; + for (const step of steps) { + if (cur === null || cur === undefined) { + throw new Error(`не удалось найти поле: '${step}' (промежуточное значение пустое)`); + } + if (Array.isArray(cur)) { + const idx = Number(step); + if (Number.isNaN(idx)) throw new Error(`не удалось обратиться к элементу массива с индексом: ${step}`); + if (idx < 0 || idx >= cur.length) throw new Error(`Индекс вне диапазона: ${step}`); + cur = cur[idx]; + } else { + if (typeof cur !== 'object') throw new Error(`Поле ${step} не является объектом/массивом`); + if (!(step in cur)) throw new Error(`не удалось найти поле: '${step}'`); + cur = cur[step]; + } + } + return cur; + } + + /** + * Ensure client & session exist. To mimic C++ (which connects in ctor), + * we attempt to create client & connect on first call (synchronously awaited here). + * + * IMPORTANT: we do NOT implement robust reconnection here (only one attempt on BadSecureChannelClosed), + * to match the C++ behavior. + */ + private async ensureConnectedFirstTime(endpointUrl: string): Promise { + if (this.client && this.session && this.endpointUrlCached === endpointUrl) { + this.connectedOnce = true; + return; + } + + // If previously attempted and failed, we still try to create new client (like C++ does once) + try { + // create client and connect + this.client = OPCUAClient.create({ endpoint_must_exist: false }); + this.endpointUrlCached = endpointUrl; + // await immediate connect (C++ does synchronous connect in ctor) + await this.client.connect(endpointUrl); + this.session = await this.client.createSession(); + this.connectedOnce = true; + } catch (err) { + // In C++ you logged warning and carried on; do similar: keep client null but don't implement automatic retries + this.client = null; + this.session = null; + this.connectedOnce = false; + // throw to let node/user see connection error (C++ only warned; choose to reflect error) + throw err; + } + } + + /** + * Perform write, but mimic C++ behavior: + * - Try writing once. + * - If failure and error equals BadSecureChannelClosed (or status code indicates that), + * attempt the write a second time WITHOUT recreating client/session (just retry). + * - If still fails — throw. + */ + private async writeLikeCpp(nodeId: string, value: any, dataType: DataType): Promise { + if (!this.session) throw new Error('session not available'); + const nodesToWrite = [ + { + nodeId, + attributeId: AttributeIds.Value, + value: { + value: { + dataType, + value, + }, + }, + }, + ]; + + // first attempt + try { + const res = await (this.session as any).write(nodesToWrite); + const status = Array.isArray(res) ? res[0] : res; + if (status && status !== StatusCodes.Good) { + // emulate C++: if BADSECURECHANNELCLOSED then try once more + if (status === StatusCodes.BadSecureChannelClosed) { + // second attempt — without recreating client/session (like your C++ code tried write again) + const res2 = await (this.session as any).write(nodesToWrite); + const status2 = Array.isArray(res2) ? res2[0] : res2; + if (status2 && status2 !== StatusCodes.Good) { + throw new Error(`OPC UA write error after retry: ${status2.toString ? status2.toString() : status2}`); + } + } else { + throw new Error(`OPC UA write error: ${status.toString ? status.toString() : status}`); + } + } + return; + } catch (err: any) { + // node-opcua may throw; try to inspect error.statusCode + // If it's the secure channel closed, mimic C++: one retry call (without reconnect). + const sc = err && err.statusCode ? err.statusCode : null; + if (sc === StatusCodes.BadSecureChannelClosed) { + try { + const res2 = await (this.session as any).write(nodesToWrite); + const status2 = Array.isArray(res2) ? res2[0] : res2; + if (status2 && status2 !== StatusCodes.Good) { + throw new Error(`OPC UA write error after retry: ${status2.toString ? status2.toString() : status2}`); + } + return; + } catch (err2) { + throw err2; + } + } + // otherwise rethrow original error + throw err; + } + } + + // execute uses any for this to avoid requiring n8n-core types + async execute(this: any & _OPCWrite): Promise { + const workflowName = this.getWorkflow().name; + const nodeInfo = this.getNode(); + const fromNodeFull = nodeInfo.type; + const fromNode = fromNodeFull.includes('.') ? fromNodeFull.split('.').pop() : fromNodeFull; + const idField = nodeInfo.name; + + const itemCount = this.getInputData().length; + + // read params (allow ${ENV}) + const rawHost = this.getNodeParameter('host', 0) as string; + const rawPort = this.getNodeParameter('port', 0) as number; + const rawNodeId = this.getNodeParameter('nodeId', 0) as string; + const rawRoute = this.getNodeParameter('route', 0) as string; + const ns = this.getNodeParameter('ns', 0) as number; + + const host = this.replaceEnvVars(rawHost); + const port = rawPort; + const nodeIdParam = this.replaceEnvVars(rawNodeId); + const route = this.replaceEnvVars(rawRoute); + + // normalize endpoint url + let endpointUrl = host; + if (!/^opc.tcp:\/\//.test(endpointUrl)) endpointUrl = `opc.tcp://${endpointUrl}`; + if (!/:\d+$/.test(endpointUrl) && port) endpointUrl = `${endpointUrl}:${port}`; + + try { + if (!this.connectedOnce) { + await this.ensureConnectedFirstTime(endpointUrl); + } + } catch (err) { + throw new NodeOperationError(this.getNode(), `Не удалось подключиться к OPC UA: ${(err as Error).message || err}`); + } + + const outputs: INodeExecutionData[] = []; + const routeSteps = this.splitRoute(route); + + for (let i = 0; i < itemCount; i++) { + const item = this.getInputData()[i]; + const dataRoot = item.json['DATA']; + if (dataRoot === undefined) { + throw new NodeOperationError(this.getNode(), 'Входной объект не содержит поля DATA'); + } + + let val: any; + try { + val = routeSteps.length ? this.getValueByRoute(dataRoot, routeSteps) : dataRoot; + } catch (err) { + throw new NodeOperationError(this.getNode(), (err as Error).message); + } + + let dataType: DataType; + let valueToWrite: any = val; + if (typeof val === 'string') { + dataType = DataType.String; + } else if (typeof val === 'boolean') { + dataType = DataType.Boolean; + } else if (typeof val === 'number') { + if (Number.isInteger(val)) { + if (val >= -32768 && val <= 32767) dataType = (DataType as any).Int16 ?? DataType.Int32; + else dataType = (DataType as any).Int32 ?? DataType.Int32; + } else { + dataType = DataType.Double; + } + } else { + throw new NodeOperationError(this.getNode(), 'тип поля не является простым. Разрешены только Number, Boolean, String.'); + } + + let nodeIdFull = nodeIdParam; + if (!/^ns=\d+;/.test(nodeIdFull)) { + nodeIdFull = `ns=${ns};s=${nodeIdFull}`; + } + + try { + if (!this.session) throw new Error('session not available'); + await this.writeLikeCpp(nodeIdFull, valueToWrite, dataType); + } catch (err) { + throw new NodeOperationError(this.getNode(), `OPC UA write error: ${(err as Error).message || err}`); + } + + const outJson: any = { + DATA: val, + METADATA: { + chain: workflowName, + from: fromNode, + id: idField, + time: Date.now(), + }, + }; + outputs.push({ json: outJson }); + } + + return this.prepareOutputData(outputs); + } +} diff --git a/custom_nodes_for_n8n-master/nodes/_ORMwrite/_ORMwrite.node.ts b/custom_nodes_for_n8n-master/nodes/_ORMwrite/_ORMwrite.node.ts new file mode 100644 index 0000000..f468879 --- /dev/null +++ b/custom_nodes_for_n8n-master/nodes/_ORMwrite/_ORMwrite.node.ts @@ -0,0 +1,125 @@ +import { + INodeExecutionData, + INodeType, + INodeTypeDescription, + NodeConnectionType, + IExecuteFunctions +} from 'n8n-workflow'; +import { Client } from 'pg'; + +// Замена $VAR на process.env.VAR +function resolveEnvVariables(str: string): string { + return str.replace(/\$([a-zA-Z0-9_]+)/g, (_, v) => process.env[v] ?? ''); +} + +export class _ORMwrite implements INodeType { + description: INodeTypeDescription = { + displayName: 'ORM Write', + name: 'ormWrite', + group: ['transform'], + version: 1, + description: 'Writes data into PostgreSQL table (creates if not exists)', + defaults: { + name: 'ORM Write', + }, + inputs: [NodeConnectionType.Main], + outputs: [NodeConnectionType.Main], + properties: [ + { displayName: 'Host', name: 'host', type: 'string', default: '$dbhost', required: true }, + { displayName: 'Port', name: 'port', type: 'string', default: '$dbport' }, + { displayName: 'Database', name: 'database', type: 'string', default: '$dbname', required: true }, + { displayName: 'User', name: 'user', type: 'string', default: '$dbuser' }, + { displayName: 'Password', name: 'password', type: 'string', default: '$dbpassword' }, + { displayName: 'SSL', name: 'ssl', type: 'boolean', default: false }, + { displayName: 'Table Name', name: 'table', type: 'string', default: '', required: true }, + { displayName: 'Create Table If Not Exists', name: 'createIfNotExists', type: 'boolean', default: true }, + ], + }; + + async execute(this: IExecuteFunctions): Promise { + const item = this.getInputData()[0]; // всегда один элемент + + // Формируем METADATA заново + const nodeInfo = this.getNode(); + const workflowName = this.getWorkflow().name; + item.json.METADATA = { + from: nodeInfo.name, + id: nodeInfo.name, + workflow: workflowName, + time: Date.now(), + }; + + // Параметры подключения + const host = resolveEnvVariables(this.getNodeParameter('host', 0) as string); + const port = parseInt(resolveEnvVariables(this.getNodeParameter('port', 0) as string), 10) || 5432; + const database = resolveEnvVariables(this.getNodeParameter('database', 0) as string); + const user = resolveEnvVariables(this.getNodeParameter('user', 0) as string); + const password = resolveEnvVariables(this.getNodeParameter('password', 0) as string); + const ssl = this.getNodeParameter('ssl', 0) as boolean; + const table = this.getNodeParameter('table', 0) as string; + const createIfNotExists = this.getNodeParameter('createIfNotExists', 0) as boolean; + + const client = new Client({ host, port, database, user, password, ssl }); + await client.connect(); + + // Проверяем существование таблицы + const tableExistsRes = await client.query( + `SELECT EXISTS ( + SELECT FROM information_schema.tables + WHERE table_schema = 'public' AND table_name = $1 + ) AS exists`, + [table], + ); + const tableExists = tableExistsRes.rows[0].exists; + + const data = item.json.DATA as { [key: string]: any }; + if (typeof data !== 'object' || data === null) { + await client.end(); + throw new Error('DATA должно быть объектом в первом элементе'); + } + + // Создаём таблицу, если нужно + if (!tableExists && createIfNotExists) { + const columns = Object.entries(data) + .map(([key, value]) => { + if (key === 'id') throw new Error("Column 'id' is reserved"); + if (typeof value === 'number' && Number.isInteger(value)) return `"${key}" BIGINT`; + if (typeof value === 'number') return `"${key}" REAL`; + if (typeof value === 'boolean') return `"${key}" BOOLEAN`; + if (typeof value === 'string') return `"${key}" TEXT`; + return `"${key}" JSONB`; + }) + .join(', '); + await client.query(`CREATE TABLE "${table}" (id SERIAL PRIMARY KEY, ${columns});`); + } else if (!tableExists && !createIfNotExists) { + await client.end(); + throw new Error(`Table ${table} does not exist`); + } + + // Получаем список существующих столбцов + const colRes = await client.query( + `SELECT column_name FROM information_schema.columns + WHERE table_schema = 'public' AND table_name = $1 AND column_name != 'id'`, + [table], + ); + const columns = colRes.rows.map((r) => r.column_name); + + const usedCols = columns.filter((c) => data[c] !== undefined); + if (usedCols.length === 0) { + await client.end(); + throw new Error('Нет данных для вставки: ни один столбец не совпадает'); + } + + const values = usedCols.map((c) => data[c]); + const placeholders = usedCols.map((_, i) => `$${i + 1}`).join(', '); + + await client.query( + `INSERT INTO "${table}" (${usedCols.map((c) => `"${c}"`).join(', ')}) VALUES (${placeholders})`, + values, + ); + + await client.end(); + + return this.prepareOutputData([item]); + } +} diff --git a/custom_nodes_for_n8n-master/nodes/_Postgres/_Postgres.node.ts b/custom_nodes_for_n8n-master/nodes/_Postgres/_Postgres.node.ts new file mode 100644 index 0000000..bf209fe --- /dev/null +++ b/custom_nodes_for_n8n-master/nodes/_Postgres/_Postgres.node.ts @@ -0,0 +1,150 @@ +import { + INodeType, + INodeTypeDescription, + IExecuteFunctions, + INodeExecutionData, + NodeOperationError, + NodeConnectionType, +} from 'n8n-workflow'; + +import { Client } from 'pg'; + +function isRecordWithPostgresQuery(obj: unknown): obj is Record & { PostgresQuery: string } { + return ( + typeof obj === 'object' && + obj !== null && + !Array.isArray(obj) && + typeof (obj as Record).PostgresQuery === 'string' && + (obj as Record).PostgresQuery.trim() !== '' + ); +} + +export class _Postgres implements INodeType { + description: INodeTypeDescription = { + displayName: 'Postgres', + name: 'postgres', + group: ['output'], + version: 1, + description: 'Выполняет SQL запрос в Postgres из METADATA.PostgresQuery', + defaults: { + name: 'Postgres', + }, + inputs: [NodeConnectionType.Main], + outputs: [NodeConnectionType.Main], + properties: [ + { + displayName: 'Host', + name: 'host', + type: 'string', + default: process.env.DB_HOST || '', + placeholder: 'Например, localhost', + description: 'Postgres host из переменной окружения DB_HOST', + required: true, + }, + { + displayName: 'Port', + name: 'port', + type: 'number', + default: Number(process.env.DB_PORT) || 5432, + description: 'Порт Postgres из переменной окружения DB_PORT', + required: true, + }, + { + displayName: 'Database', + name: 'database', + type: 'string', + default: process.env.DB_NAME || '', + description: 'Имя базы данных из переменной окружения DB_NAME', + required: true, + }, + { + displayName: 'User', + name: 'user', + type: 'string', + default: process.env.DB_USER || '', + description: 'Пользователь базы из переменной окружения DB_USER', + required: true, + }, + { + displayName: 'Password', + name: 'password', + type: 'string', + typeOptions: { + password: true, + }, + default: process.env.DB_PASSWORD || '', + description: 'Пароль из переменной окружения DB_PASSWORD', + required: true, + }, + { + displayName: 'Use SSL', + name: 'ssl', + type: 'boolean', + default: process.env.DB_SSL === 'true' || false, + description: 'Использовать SSL-соединение', + }, + ], + }; + + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); + + if (items.length === 0) { + throw new NodeOperationError(this.getNode(), 'Нет входящих данных'); + } + + // Добавляем/дополняем METADATA для всех items + const nodeInfo = this.getNode(); + const workflowName = this.getWorkflow().name; + for (const item of items) { + item.json.METADATA = { + ...(item.json.METADATA as Record || {}), + from: nodeInfo.name, + id: nodeInfo.name, + workflow: workflowName, + time: Date.now(), + }; + } + + const firstItem = items[0]; + const metadata = firstItem.json.METADATA; + + if (!isRecordWithPostgresQuery(metadata)) { + throw new NodeOperationError(this.getNode(), 'METADATA.PostgresQuery не найден или не является строкой'); + } + + const query = metadata.PostgresQuery; + + // Параметры подключения + const host = this.getNodeParameter('host', 0) as string; + const port = this.getNodeParameter('port', 0) as number; + const database = this.getNodeParameter('database', 0) as string; + const user = this.getNodeParameter('user', 0) as string; + const password = this.getNodeParameter('password', 0) as string; + const ssl = this.getNodeParameter('ssl', 0) as boolean; + + const client = new Client({ + host, + port, + database, + user, + password, + ssl: ssl ? { rejectUnauthorized: false } : false, + }); + + try { + await client.connect(); + + const res = await client.query(query); + + await client.end(); + + return this.prepareOutputData(res.rows); + } catch (error: any) { + try { + await client.end(); + } catch { } + throw new NodeOperationError(this.getNode(), `Ошибка выполнения запроса: ${error.message}`); + } + } +} diff --git a/custom_nodes_for_n8n-master/nodes/_RestOutput/_RestOutput.node.ts b/custom_nodes_for_n8n-master/nodes/_RestOutput/_RestOutput.node.ts new file mode 100644 index 0000000..26ecf24 --- /dev/null +++ b/custom_nodes_for_n8n-master/nodes/_RestOutput/_RestOutput.node.ts @@ -0,0 +1,131 @@ +import { + INodeType, + INodeTypeDescription, + IExecuteFunctions, + INodeExecutionData, + NodeConnectionType, + IHttpRequestMethods, + IDataObject, +} from 'n8n-workflow'; + +export class _RestOutput implements INodeType { + description: INodeTypeDescription = { + displayName: 'RestOutput', + name: 'restOutput', + group: ['transform'], + version: 1, + description: 'Выполняет HTTP-запрос по URI из METADATA или из поля URI', + defaults: { + name: 'RestOutput', + }, + inputs: [NodeConnectionType.Main], + outputs: [NodeConnectionType.Main], + properties: [ + { + displayName: 'Динамическая настройка', + name: 'useDynamicUri', + type: 'boolean', + default: true, + description: 'Брать URI из METADATA или использовать указанный ниже', + }, + { + displayName: 'URI', + name: 'staticUri', + type: 'string', + default: '', + displayOptions: { + show: { + useDynamicUri: [false], + }, + }, + }, + { + displayName: 'Метод', + name: 'method', + type: 'options', + options: [ + { name: 'GET', value: 'GET' }, + { name: 'POST', value: 'POST' }, + { name: 'PUT', value: 'PUT' }, + { name: 'DELETE', value: 'DELETE' }, + ], + default: 'GET', + }, + { + displayName: 'Headers', + name: 'headers', + type: 'fixedCollection', + typeOptions: { multipleValues: true }, + default: {}, + options: [ + { + name: 'header', + displayName: 'Header', + values: [ + { name: 'key', displayName: 'Key', type: 'string', default: '' }, + { name: 'value', displayName: 'Value', type: 'string', default: '' }, + ], + }, + ], + }, + ], + }; + + async execute(this: IExecuteFunctions): Promise { + const item = this.getInputData()[0]; // один элемент + const useDynamicUri = this.getNodeParameter('useDynamicUri', 0) as boolean; + const staticUri = useDynamicUri ? undefined : this.getNodeParameter('staticUri', 0) as string; + const method = this.getNodeParameter('method', 0) as IHttpRequestMethods; + const headersInput = this.getNodeParameter('headers', 0, []) as { header: Array<{ key: string; value: string }> }; + + const workflowName = this.getWorkflow().name; + const nodeInfo = this.getNode(); + const fromNode = nodeInfo.type.split('.').pop()!; + const idField = nodeInfo.name; + + const headerObj: Record = {}; + for (const header of headersInput.header || []) { + if (header.key) { + headerObj[header.key] = header.value; + } + } + + interface CustomMetadata extends IDataObject { + HTTPoutput?: { + uri?: string; + }; + } + + const metadata = item.json?.METADATA as CustomMetadata | undefined; + const uri = useDynamicUri ? metadata?.HTTPoutput?.uri : staticUri; + + if (!uri) { + throw new Error('URI не задан ни в METADATA, ни вручную'); + } + + const response = await this.helpers.httpRequest({ + method, + url: uri, + headers: headerObj, + json: true, + }); + + return [[ + { + json: { + DATA: { + body: response, + headers: [], + status_code: 200, + }, + METADATA: { + chain: workflowName, + from: fromNode, + id: idField, + time: Date.now(), + }, + }, + }, + ]]; + } +} diff --git a/custom_nodes_for_n8n-master/nodes/_Schedule/_Schedule.node.ts b/custom_nodes_for_n8n-master/nodes/_Schedule/_Schedule.node.ts new file mode 100644 index 0000000..43ade37 --- /dev/null +++ b/custom_nodes_for_n8n-master/nodes/_Schedule/_Schedule.node.ts @@ -0,0 +1,97 @@ +import { + INodeType, + INodeTypeDescription, + ITriggerFunctions, + ITriggerResponse, + INodeExecutionData, + NodeConnectionType, +} from 'n8n-workflow'; +import cron from 'node-cron'; + +export class _Schedule implements INodeType { + description: INodeTypeDescription = { + displayName: 'Scheduler', + name: 'schedulerNode', + group: ['trigger'], + version: 1, + description: 'Срабатывает каждый день в заданное время и генерирует JSON + metadata', + defaults: { + name: 'Scheduler', + }, + inputs: [], + outputs: [NodeConnectionType.Main], + properties: [ + { + displayName: 'Часы (0–23)', + name: 'hour', + type: 'number', + default: 9, + typeOptions: { minValue: 0, maxValue: 23 }, + description: 'Время запуска — часы (по серверу)', + }, + { + displayName: 'Минуты (0–59)', + name: 'minute', + type: 'number', + default: 0, + typeOptions: { minValue: 0, maxValue: 59 }, + description: 'Время запуска — минуты (по серверу)', + }, + { + displayName: 'JSON на выходе', + name: 'jsonOutput', + type: 'string', + typeOptions: { rows: 6 }, + default: '{}', + description: 'Содержимое JSON, которое будет выдано при срабатывании', + }, + ], + }; + + async trigger(this: ITriggerFunctions): Promise { + const hour = this.getNodeParameter('hour', 0) as number; + const minute = this.getNodeParameter('minute', 0) as number; + const jsonOutputStr = this.getNodeParameter('jsonOutput', 0) as string; + + let parsedJson: any; + try { + parsedJson = JSON.parse(jsonOutputStr); + } catch (error) { + throw new Error('Ошибка при разборе JSON: ' + error); + } + + const workflowName = this.getWorkflow().name || ''; + const nodeInfo = this.getNode(); + const fromNodeFull = nodeInfo.type; + const fromNode = fromNodeFull.includes('.') ? fromNodeFull.split('.').pop()! : fromNodeFull; + const idField = nodeInfo.name as string; + + const emitFn = () => { + const data: INodeExecutionData = { + json: { + DATA: { ...parsedJson }, + METADATA: { + chain: workflowName, + from: fromNode, + id: idField, + time: Date.now(), + }, + }, + pairedItem: 0, + }; + + this.emit([[data]]); + }; + + // Генерируем cron-строку: "минуты часы * * *" + const cronExpression = `${minute} ${hour} * * *`; + + const task = cron.schedule(cronExpression, emitFn); + + return { + closeFunction: async () => { + task.stop(); + }, + }; + } +} diff --git a/custom_nodes_for_n8n-master/nodes/_ScriptFilter/_ScriptFilter.node.ts b/custom_nodes_for_n8n-master/nodes/_ScriptFilter/_ScriptFilter.node.ts new file mode 100644 index 0000000..65414e8 --- /dev/null +++ b/custom_nodes_for_n8n-master/nodes/_ScriptFilter/_ScriptFilter.node.ts @@ -0,0 +1,67 @@ +import { + INodeType, + INodeTypeDescription, + IExecuteFunctions, + INodeExecutionData, + NodeConnectionType, +} from 'n8n-workflow'; + +export class _ScriptFilter implements INodeType { + description: INodeTypeDescription = { + displayName: 'ScriptFilter', + name: 'scriptFilter', + group: ['transform'], + version: 1, + description: 'Выполняет скрипт на JavaScript над item', + defaults: { + name: 'ScriptFilter', + }, + inputs: [NodeConnectionType.Main], + outputs: [NodeConnectionType.Main], + properties: [ + { + displayName: 'Код скрипта', + name: 'code', + type: 'string', + typeOptions: { + rows: 30, + }, + default: 'obj = item.json;\nreturn obj;', + description: 'JavaScript-код, который будет выполнен над элементом', + }, + ], + }; + + async execute(this: IExecuteFunctions): Promise { + const item = this.getInputData()[0]; // берём один элемент + const code = this.getNodeParameter('code', 0) as string; + + // Создаем функцию вида: function(item) { ...код... } + const userFunction = new Function('item', code); + + // Формируем METADATA заново + const nodeInfo = this.getNode(); + const workflowName = this.getWorkflow().name; + + item.json.METADATA = { + from: nodeInfo.name, // текущий узел + id: nodeInfo.name, // идентификатор узла + workflow: workflowName, // имя workflow + time: Date.now(), + }; + + let outputData: INodeExecutionData; + + try { + const output = userFunction.call(null, item); + outputData = { + json: output.json ?? output, + binary: output.binary ?? undefined, + }; + } catch (error) { + throw new Error(`Ошибка выполнения скрипта: ${(error as Error).message}`); + } + + return [[outputData]]; + } +} diff --git a/custom_nodes_for_n8n-master/nodes/_StorageReader/_StorageReader.node.ts b/custom_nodes_for_n8n-master/nodes/_StorageReader/_StorageReader.node.ts new file mode 100644 index 0000000..e092a4c --- /dev/null +++ b/custom_nodes_for_n8n-master/nodes/_StorageReader/_StorageReader.node.ts @@ -0,0 +1,97 @@ +import { + INodeType, + INodeTypeDescription, + IExecuteFunctions, + INodeExecutionData, + NodeConnectionType, +} from 'n8n-workflow'; + +import * as redis from 'redis'; + +export class _StorageReader implements INodeType { + description: INodeTypeDescription = { + displayName: 'StorageReader', + name: 'storageReader', + group: ['transform'], + version: 1, + description: 'Получает из Redis ключи Storage и добавляет их в DATA, остальные данные передаёт дальше', + defaults: { + name: 'StorageReader', + }, + inputs: [NodeConnectionType.Main], + outputs: [NodeConnectionType.Main], + properties: [ + { + displayName: 'Redis Storage Keys', + name: 'redisStorageKeys', + type: 'string', + default: 'started_sessions,shift_restart', + description: 'Через запятую перечислите ключи из Redis для получения Storage', + }, + ], + }; + + async execute(this: IExecuteFunctions): Promise { + const item = this.getInputData()[0]; // Берём один элемент + + // Получаем ключи из параметров узла + const redisStorageKeysStr = this.getNodeParameter('redisStorageKeys', 0) as string; + const redisStorageKeys = redisStorageKeysStr.split(',').map(k => k.trim()).filter(k => k.length > 0); + + // Берём хост и порт из переменных окружения + const redisHost = process.env.REDIS_HOST || 'redis'; + const redisPort = Number(process.env.REDIS_PORT || '6379'); + + const client = redis.createClient({ + socket: { host: redisHost, port: redisPort }, + }); + + client.on('error', (err: Error) => this.logger.error('Redis Client Error', { message: err.message, stack: err.stack })); + + await client.connect(); + + const storageData: Record = {}; + + for (const key of redisStorageKeys) { + try { + const rawValue = await client.get(key); + if (rawValue) { + try { + storageData[key] = JSON.parse(rawValue); + } catch { + storageData[key] = rawValue; + } + } else { + storageData[key] = null; + } + } catch (e: unknown) { + this.logger.warn(`Ошибка при получении ключа "${key}" из Redis: ${(e as Error).message || e}`); + storageData[key] = null; + } + } + + await client.quit(); + + // Формируем METADATA заново + const nodeInfo = this.getNode(); + const workflowName = this.getWorkflow().name; + + const newItem: INodeExecutionData = { + json: { + DATA: { + ...(item.json.DATA && typeof item.json.DATA === 'object' ? item.json.DATA : {}), + Storage: storageData, + }, + METADATA: { + from: nodeInfo.name, + id: nodeInfo.name, + workflow: workflowName, + time: Date.now(), + }, + }, + binary: item.binary, + }; + + return [[newItem]]; + } +} diff --git a/custom_nodes_for_n8n-master/nodes/_StorageWriter/_StorageWriter.node.ts b/custom_nodes_for_n8n-master/nodes/_StorageWriter/_StorageWriter.node.ts new file mode 100644 index 0000000..bd32a75 --- /dev/null +++ b/custom_nodes_for_n8n-master/nodes/_StorageWriter/_StorageWriter.node.ts @@ -0,0 +1,90 @@ +import { + INodeType, + INodeTypeDescription, + IExecuteFunctions, + INodeExecutionData, + NodeConnectionType, +} from 'n8n-workflow'; +import * as redis from 'redis'; + +function getValueByPath(obj: any, path: string): any { + return path.split('.').reduce((acc, key) => (acc && typeof acc === 'object' ? acc[key] : undefined), obj); +} + +export class _StorageWriter implements INodeType { + description: INodeTypeDescription = { + displayName: 'StorageWriter', + name: 'storageWriter', + group: ['transform'], + version: 1, + description: 'Сохраняет данные в Redis по ключу', + defaults: { + name: 'StorageWriter', + }, + inputs: [NodeConnectionType.Main], + outputs: [NodeConnectionType.Main], + properties: [ + { + displayName: 'Redis Key', + name: 'redisKey', + type: 'string', + default: '', + required: true, + description: 'Ключ в Redis, под которым сохраняется значение', + }, + { + displayName: 'Path to Value (например, DATA.Storage.shift_restart)', + name: 'valuePath', + type: 'string', + default: '', + required: false, + description: 'Путь к значению внутри JSON. Если пусто — сохраняется весь DATA', + }, + ], + }; + + async execute(this: IExecuteFunctions): Promise { + const item = this.getInputData()[0]; // Берём один элемент + const json = item.json; + + const redisHost = process.env.REDIS_HOST || 'redis'; + const redisPort = Number(process.env.REDIS_PORT || '6379'); + + const client = redis.createClient({ + socket: { host: redisHost, port: redisPort }, + }); + + client.on('error', (err: Error) => + this.logger.error('Redis Client Error', { message: err.message, stack: err.stack }), + ); + + await client.connect(); + + // Формируем METADATA заново + const nodeInfo = this.getNode(); + const workflowName = this.getWorkflow().name; + + json.METADATA = { + from: nodeInfo.name, + id: nodeInfo.name, + workflow: workflowName, + time: Date.now(), + }; + + const key = this.getNodeParameter('redisKey', 0, '') as string; + const valuePath = this.getNodeParameter('valuePath', 0, '') as string; + + const valueToStore = valuePath ? getValueByPath(json, valuePath) : json.DATA; + + try { + await client.set(key, JSON.stringify(valueToStore)); + this.logger.info(`Сохранено в Redis: [${key}] =`, valueToStore); + } catch (e: unknown) { + this.logger.error(`Ошибка записи ключа "${key}" в Redis`, { error: e }); + } + + await client.quit(); + + return [[item]]; + } +} diff --git a/custom_nodes_for_n8n-master/nodes/_Summator/_Summator.node.ts b/custom_nodes_for_n8n-master/nodes/_Summator/_Summator.node.ts new file mode 100644 index 0000000..08807e5 --- /dev/null +++ b/custom_nodes_for_n8n-master/nodes/_Summator/_Summator.node.ts @@ -0,0 +1,60 @@ +import { + INodeType, + INodeTypeDescription, + INodeExecutionData, + IExecuteFunctions, + NodeConnectionType, + IDataObject +} from 'n8n-workflow'; + +export class _Summator implements INodeType { + description: INodeTypeDescription = { + displayName: 'Summator', + name: 'summator', + icon: 'fa:random', + group: ['transform'], + version: 1, + description: 'Aggregates DATA from multiple inputs into one object', + defaults: { + name: 'Summator', + color: '#772244', + }, + inputs: [NodeConnectionType.Main], + outputs: [NodeConnectionType.Main], + properties: [], + }; + + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); + + const workflowName = this.getWorkflow().name || ''; + const nodeInfo = this.getNode(); + const fromNodeFull = nodeInfo.type; + const fromNode = fromNodeFull.includes('.') ? fromNodeFull.split('.').pop()! : fromNodeFull; + const idField = nodeInfo.name as string; + + const parsedJson: Record = {}; + + for (const item of items) { + const json = item.json as any; // входные данные лежат в item.json + if (!json || !json.DATA || !json.METADATA || !json.METADATA.from) continue; + + const key = json.METADATA.from as string; + parsedJson[key] = json.DATA as IDataObject; + } + + const result: INodeExecutionData = { + json: { + DATA: parsedJson, + METADATA: { + chain: workflowName, + from: fromNode, + id: idField, + time: Date.now(), + }, + }, + }; + + return [[result]]; + } +} diff --git a/custom_nodes_for_n8n-master/nodes/_TimeConverter/_TimeConverter.node.ts b/custom_nodes_for_n8n-master/nodes/_TimeConverter/_TimeConverter.node.ts new file mode 100644 index 0000000..60090d0 --- /dev/null +++ b/custom_nodes_for_n8n-master/nodes/_TimeConverter/_TimeConverter.node.ts @@ -0,0 +1,149 @@ +import { IExecuteFunctions } from 'n8n-workflow'; +import { INodeType, INodeTypeDescription, NodeConnectionType } from 'n8n-workflow'; +import { DateTime } from 'luxon'; + +export class _TimeConverter implements INodeType { + description: INodeTypeDescription = { + displayName: 'Time Converter', + name: 'timeConverter', + group: ['transform'], + version: 1, + description: 'Convert between Unix timestamp and formatted time', + defaults: { + name: 'Time Converter', + }, + inputs: [NodeConnectionType.Main], + outputs: [NodeConnectionType.Main], + properties: [ + { + displayName: 'Source Field', + name: 'source', + type: 'string', + default: '', + description: 'Path to the field containing the time value (dot notation supported)', + }, + { + displayName: 'Destination Field', + name: 'dest', + type: 'string', + default: '', + description: 'Path to save the converted value', + }, + { + displayName: 'Date/Time Format', + name: 'dateTimeFormat', + type: 'string', + default: 'yyyy-MM-dd HH:mm:ss', + description: 'Luxon format string (use yyyy, MM, dd, HH, mm, ss, SSS for ms)', + }, + { + displayName: 'Mode', + name: 'mode', + type: 'options', + options: [ + { name: 'Unix Time → String', value: 'unixtime' }, + { name: 'String → Unix Time', value: 'time' }, + ], + default: 'unixtime', + }, + ], + }; + + async execute(this: IExecuteFunctions) { + const item = this.getInputData()[0]; // один элемент + if (!item) return [[]]; + + const source = this.getNodeParameter('source', 0) as string; + const dest = this.getNodeParameter('dest', 0) as string; + let dateTimeFormat = this.getNodeParameter('dateTimeFormat', 0) as string; + const mode = this.getNodeParameter('mode', 0) as string; + + if (dateTimeFormat.includes('%ms')) { + dateTimeFormat = dateTimeFormat.replace('%ms', 'SSS'); + } + + let value: any; + if (source.includes('.')) { + value = getValueByPath(item.json, source); + } else { + value = findValueDeep(item.json, source); + } + + if (value === undefined) { + throw new Error(`Source field "${source}" not found`); + } + + let result: string | number; + if (mode === 'unixtime') { + const ts = Number(value); + if (isNaN(ts)) throw new Error(`Value "${value}" is not a valid number`); + result = DateTime.fromMillis(ts).toFormat(dateTimeFormat); + } else if (mode === 'time') { + const dt = DateTime.fromFormat(String(value), dateTimeFormat); + if (!dt.isValid) throw new Error(`Invalid date/time format for value "${value}"`); + result = dt.toMillis(); + } else { + throw new Error(`Unknown mode: ${mode}`); + } + + if (dest.includes('.')) { + setValueByPath(item.json, dest, result); + } else { + item.json[dest] = result; + } + + // Полная перезапись METADATA + const workflowName = this.getWorkflow().name; + const nodeInfo = this.getNode(); + const fromNodeFull = nodeInfo.type; + const fromNode = fromNodeFull.includes('.') ? fromNodeFull.split('.').pop()! : fromNodeFull; + const idField = nodeInfo.name; + + item.json.METADATA = { + chain: workflowName, + from: fromNode, + id: idField, + time: Date.now(), + }; + + return this.prepareOutputData([item]); + } +} + +// --- Вспомогательные функции --- +function getValueByPath(obj: any, path: string): any { + return path.split('.').reduce((acc, key) => acc?.[key], obj); +} + +function setValueByPath(obj: any, path: string, value: any): void { + const keys = path.split('.'); + let current = obj; + keys.forEach((key, index) => { + if (index === keys.length - 1) { + current[key] = value; + } else { + if (!current[key] || typeof current[key] !== 'object') { + current[key] = {}; + } + current = current[key]; + } + }); +} + +function findValueDeep(obj: any, field: string): any { + if (obj && typeof obj === 'object') { + if (Object.prototype.hasOwnProperty.call(obj, field)) { + return obj[field]; + } + for (const key of Object.keys(obj)) { + const val = obj[key]; + if (typeof val === 'object') { + const found = findValueDeep(val, field); + if (found !== undefined) { + return found; + } + } + } + } + return undefined; +} diff --git a/custom_nodes_for_n8n-master/nodes/_WSDL/_WSDL.node.ts b/custom_nodes_for_n8n-master/nodes/_WSDL/_WSDL.node.ts new file mode 100644 index 0000000..1470137 --- /dev/null +++ b/custom_nodes_for_n8n-master/nodes/_WSDL/_WSDL.node.ts @@ -0,0 +1,127 @@ +import { IExecuteFunctions } from 'n8n-workflow'; +import { + INodeType, + INodeTypeDescription, + INodeExecutionData, + NodeConnectionType, + IDataObject, +} from 'n8n-workflow'; +import fetch from 'node-fetch'; + +export class _WSDL implements INodeType { + description: INodeTypeDescription = { + displayName: 'WSDL', + name: 'wsdl', + group: ['transform'], + version: 1, + description: 'Call a WSDL SOAP function and return the result', + defaults: { + name: 'WSDL', + }, + inputs: [NodeConnectionType.Main], + outputs: [NodeConnectionType.Main], + properties: [ + { + displayName: 'WSDL URI', + name: 'uri', + type: 'string', + default: '', + placeholder: 'https://example.com/service?wsdl', + description: 'WSDL endpoint URI', + }, + { + displayName: 'Function', + name: 'function', + type: 'string', + default: '', + description: 'SOAP function to call (e.g., CarList, StatusToString)', + }, + { + displayName: 'Parameter field in METADATA (optional)', + name: 'paramField', + type: 'string', + default: 'WSDLparam', + description: 'Имя поля в METADATA, которое передается как параметр функции', + }, + ], + }; + + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); + if (!items || items.length === 0) return [[]]; + + const json = items[0].json as IDataObject; + + const uri = this.getNodeParameter('uri', 0) as string; + const func = this.getNodeParameter('function', 0) as string; + const paramField = this.getNodeParameter('paramField', 0) as string; + + // Берём параметр из старого METADATA (если был) + let paramValue = ''; + if (json.METADATA && typeof json.METADATA === 'object' && (json.METADATA as IDataObject)[paramField]) { + paramValue = String((json.METADATA as IDataObject)[paramField]); + } + + // SOAP-заготовки + const req1 = ` + + `; + const req2 = ``; + + // Формируем тело запроса + let requestBody = ''; + if (func === 'CarList') { + if (!paramValue) throw new Error('METADATA.' + paramField + ' is required for CarList'); + requestBody = `${req1}${paramValue}${req2}`; + } else if (func === 'StatusToString') { + if (!paramValue) throw new Error('METADATA.' + paramField + ' is required for StatusToString'); + requestBody = `${req1}${paramValue}${req2}`; + } else { + requestBody = `${req1}${req2}`; + } + + // Выполняем POST + const resp = await fetch(uri, { + method: 'POST', + body: requestBody, + headers: { + 'Content-Type': 'text/xml; charset=UTF-8', + }, + }); + + const respText = await resp.text(); + + // Пробуем распарсить JSON, иначе строка + let bodyData: any; + try { + bodyData = JSON.parse(respText); + } catch { + bodyData = respText; + } + + // Заполняем DATA + json.DATA = { + WSDL: { + status_code: resp.status, + body: bodyData, + }, + }; + + // Полная перезапись METADATA в стиле BaseNodeTransform + const workflowName = this.getWorkflow().name; + const nodeInfo = this.getNode(); + const fromNodeFull = nodeInfo.type; + const fromNode = fromNodeFull.includes('.') ? fromNodeFull.split('.').pop()! : fromNodeFull; + const idField = nodeInfo.name; + + json.METADATA = { + chain: workflowName, + from: fromNode, + id: idField, + time: Date.now(), + function: func, + }; + + return this.prepareOutputData([items[0]]); + } +} diff --git a/custom_nodes_for_n8n-master/nodes/_Xml2json/_Xml2json.node.ts b/custom_nodes_for_n8n-master/nodes/_Xml2json/_Xml2json.node.ts new file mode 100644 index 0000000..724e9df --- /dev/null +++ b/custom_nodes_for_n8n-master/nodes/_Xml2json/_Xml2json.node.ts @@ -0,0 +1,73 @@ +import { INodeType, INodeTypeDescription, INodeExecutionData, NodeConnectionType, IExecuteFunctions, IDataObject } from 'n8n-workflow'; +import { XMLParser } from 'fast-xml-parser'; + +interface XmlData { + body?: string; + [key: string]: any; +} + +export class _Xml2json implements INodeType { + description: INodeTypeDescription = { + displayName: 'Xml2json', + name: 'xml2json', + group: ['transform'], + version: 1, + description: 'Convert XML string in DATA.body to JSON', + defaults: { name: 'Xml2json' }, + inputs: [NodeConnectionType.Main], + outputs: [NodeConnectionType.Main], + properties: [], + }; + + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); + if (!items || items.length === 0) return [[]]; + + const item = items[0]; + const data = (item.json.DATA as XmlData) || {}; + + const parser = new XMLParser({ ignoreAttributes: false, attributeNamePrefix: '' }); + + try { + let xmlStr = ''; + if (data.body && typeof data.body === 'string') { + xmlStr = data.body; + data.body = undefined; + } else if (typeof data === 'string') { + xmlStr = data; + } else if (data) { + xmlStr = JSON.stringify(data); + } + + const xmlStart = xmlStr.indexOf('') + 1; + let xmlContent = xmlStr.substring(xmlStart, xmlEnd).replace(/\r/g, '').replace(/\n/g, ''); + + const jsonObj = parser.parse(xmlContent); + + // Перезаписываем DATA + item.json.DATA = { ...data, ...jsonObj }; + + // Полная перезапись METADATA в стиле BaseNodeTransform + const workflowName = this.getWorkflow().name; + const nodeInfo = this.getNode(); + const fromNodeFull = nodeInfo.type; + const fromNode = fromNodeFull.includes('.') ? fromNodeFull.split('.').pop()! : fromNodeFull; + const idField = nodeInfo.name; + + item.json.METADATA = { + chain: workflowName, + from: fromNode, + id: idField, + time: Date.now(), + }; + + } catch (e) { + throw new Error('Xml2json error: ' + (e as Error).message); + } + + return this.prepareOutputData([item]); + } +} diff --git a/custom_nodes_for_n8n-master/package-lock.json b/custom_nodes_for_n8n-master/package-lock.json new file mode 100644 index 0000000..b867e36 --- /dev/null +++ b/custom_nodes_for_n8n-master/package-lock.json @@ -0,0 +1,4492 @@ +{ + "name": "custom-nodes", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "custom-nodes", + "version": "1.0.0", + "dependencies": { + "fast-xml-parser": "^5.2.5", + "luxon": "^3.7.1", + "mqtt": "^5.14.0", + "n8n-workflow": "^1.82.0", + "node-cron": "^4.2.1", + "node-fetch": "^2.7.0", + "node-opcua": "^2.156.0", + "pg": "^8.16.3", + "redis": "^5.6.1" + }, + "devDependencies": { + "@types/luxon": "^3.7.1", + "@types/node": "^20.5.1", + "@types/node-fetch": "^2.6.13", + "@types/pg": "^8.15.5", + "@types/redis": "^4.0.10", + "typescript": "^5.8.3" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.2.tgz", + "integrity": "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@n8n_io/riot-tmpl": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@n8n_io/riot-tmpl/-/riot-tmpl-4.0.0.tgz", + "integrity": "sha512-/xw8HQgYQlBCrt3IKpNSSB1CgpP7XArw1QTRjP+KEw+OHT8XGvHxXrW9VGdUu9RwDnzm/LFu+dNLeDmwJMeOwQ==", + "license": "MIT", + "dependencies": { + "eslint-config-riot": "^1.0.0" + } + }, + "node_modules/@n8n/tournament": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@n8n/tournament/-/tournament-1.0.6.tgz", + "integrity": "sha512-UGSxYXXVuOX0yL6HTLBStKYwLIa0+JmRKiSZSCMcM2s2Wax984KWT6XIA1TR/27i7yYpDk1MY14KsTPnuEp27A==", + "license": "Apache-2.0", + "dependencies": { + "@n8n_io/riot-tmpl": "^4.0.1", + "ast-types": "^0.16.1", + "esprima-next": "^5.8.4", + "recast": "^0.22.0" + }, + "engines": { + "node": ">=20.15", + "pnpm": ">=9.5" + } + }, + "node_modules/@n8n/tournament/node_modules/@n8n_io/riot-tmpl": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@n8n_io/riot-tmpl/-/riot-tmpl-4.0.1.tgz", + "integrity": "sha512-/zdRbEfTFjsm1NqnpPQHgZTkTdbp5v3VUxGeMA9098sps8jRCTraQkc3AQstJgHUm7ylBXJcIVhnVeLUMWAfwQ==", + "license": "MIT", + "dependencies": { + "eslint-config-riot": "^1.0.0" + } + }, + "node_modules/@n8n/tournament/node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@n8n/tournament/node_modules/recast": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.22.0.tgz", + "integrity": "sha512-5AAx+mujtXijsEavc5lWXBPQqrM4+Dl5qNH96N2aNeuJFUzpiiToKPsxQD/zAIJHspz7zz0maX0PCtCTFVlixQ==", + "license": "MIT", + "dependencies": { + "assert": "^2.0.0", + "ast-types": "0.15.2", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@n8n/tournament/node_modules/recast/node_modules/ast-types": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz", + "integrity": "sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@peculiar/asn1-cms": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.4.0.tgz", + "integrity": "sha512-TJvw5Tna/txvzzwnKUlCFd6zIz4R7qysHCaU6M2oe/MUT6EkvJDOzGGNY0hdjJYpuuHoqanQbIqEBhSLSWe1Tg==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.4.0", + "@peculiar/asn1-x509": "^2.4.0", + "@peculiar/asn1-x509-attr": "^2.4.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-csr": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.4.0.tgz", + "integrity": "sha512-9yQz0hQ9ynGr/I1X1v64QQGfRMbviHXyqY07cy69UzXa8s4ayCKx/TncU6lDWcTKs7P/X/AEcuJcG7Xbw0cl1A==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.4.0", + "@peculiar/asn1-x509": "^2.4.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-ecc": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.4.0.tgz", + "integrity": "sha512-fJiYUBCJBDkjh347zZe5H81BdJ0+OGIg0X9z06v8xXUoql3MFeENUX0JsjCaVaU9A0L85PefLPGYkIoGpTnXLQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.4.0", + "@peculiar/asn1-x509": "^2.4.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pfx": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.4.0.tgz", + "integrity": "sha512-fhpeoJ6T4nCLWT5tt3Un+BbyM1lLFnGXcRC2Ioe5ra2I0yptdjw05j20rV8BlUVzPIvUYpatq6joMQKe3ibh0w==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.4.0", + "@peculiar/asn1-pkcs8": "^2.4.0", + "@peculiar/asn1-rsa": "^2.4.0", + "@peculiar/asn1-schema": "^2.4.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.4.0.tgz", + "integrity": "sha512-4r2LtsAM0HWXLxetGTYKyBumky7W6C1EuiOctqhl7zFK5MHjiZ+9WOeaoeTPR1g3OEoeG7KEWIkaUOyRH4ojTw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.4.0", + "@peculiar/asn1-x509": "^2.4.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.4.0.tgz", + "integrity": "sha512-D7paqEVpu9wuWuClMN+vR5cqJWJITNPaMoa9R+FmkJ8ywF9UaS2JFI0RYclKILNoLdLg1N4eUCoJvM+ubsIIZQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.4.0", + "@peculiar/asn1-pfx": "^2.4.0", + "@peculiar/asn1-pkcs8": "^2.4.0", + "@peculiar/asn1-schema": "^2.4.0", + "@peculiar/asn1-x509": "^2.4.0", + "@peculiar/asn1-x509-attr": "^2.4.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-rsa": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.4.0.tgz", + "integrity": "sha512-6PP75voaEnOSlWR9sD25iCQyLgFZHXbmxvUfnnDcfL6Zh5h2iHW38+bve4LfH7a60x7fkhZZNmiYqAlAff9Img==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.4.0", + "@peculiar/asn1-x509": "^2.4.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.4.0.tgz", + "integrity": "sha512-umbembjIWOrPSOzEGG5vxFLkeM8kzIhLkgigtsOrfLKnuzxWxejAcUX+q/SoZCdemlODOcr5WiYa7+dIEzBXZQ==", + "license": "MIT", + "dependencies": { + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.4.0.tgz", + "integrity": "sha512-F7mIZY2Eao2TaoVqigGMLv+NDdpwuBKU1fucHPONfzaBS4JXXCNCmfO0Z3dsy7JzKGqtDcYC1mr9JjaZQZNiuw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.4.0", + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509-attr": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.4.0.tgz", + "integrity": "sha512-Tr5Zi+wcE2sfR0gKRvsPwXoA1U8CuDnwiFbxCS+5Z1Nck9zlHj86+4/EZhwucjKXwPEHk1ekhqb3iwISY/+E/w==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.4.0", + "@peculiar/asn1-x509": "^2.4.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@peculiar/webcrypto": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.5.0.tgz", + "integrity": "sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.3.8", + "@peculiar/json-schema": "^1.1.12", + "pvtsutils": "^1.3.5", + "tslib": "^2.6.2", + "webcrypto-core": "^1.8.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@peculiar/x509": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.13.0.tgz", + "integrity": "sha512-r9BOb1GZ3gx58Pog7u9x70spnHlCQPFm7u/ZNlFv+uBsU7kTDY9QkUD+l+X0awopDuCK1fkH3nEIZeMDSG/jlw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.3.15", + "@peculiar/asn1-csr": "^2.3.15", + "@peculiar/asn1-ecc": "^2.3.15", + "@peculiar/asn1-pkcs9": "^2.3.15", + "@peculiar/asn1-rsa": "^2.3.15", + "@peculiar/asn1-schema": "^2.3.15", + "@peculiar/asn1-x509": "^2.3.15", + "pvtsutils": "^1.3.6", + "reflect-metadata": "^0.2.2", + "tslib": "^2.8.1", + "tsyringe": "^4.10.0" + } + }, + "node_modules/@redis/bloom": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-5.6.1.tgz", + "integrity": "sha512-5/22U76IMEfn6TeZ+uvjXspHw+ykBF0kpBa8xouzeHaQMXs/auqBUOEYzU2VKYDvnd2RSpPTyIg82oB7PpUgLg==", + "license": "MIT", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@redis/client": "^5.6.1" + } + }, + "node_modules/@redis/client": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.6.1.tgz", + "integrity": "sha512-bWHmSFIJ5w1Y4aHsYs46XMDHKQsBHFRhNcllYaBxz2Zl+lu+gbm5yI9BqxvKh48bLTs/Wx1Kns0gN2WIasE8MA==", + "license": "MIT", + "dependencies": { + "cluster-key-slot": "1.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@redis/json": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-5.6.1.tgz", + "integrity": "sha512-cTggVzPIVuiFeXcEcnTRiUzV7rmUvM9KUYxWiHyjsAVACTEUe4ifKkvzrij0H/z3ammU5tfGACffDB3olBwtVA==", + "license": "MIT", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@redis/client": "^5.6.1" + } + }, + "node_modules/@redis/search": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-5.6.1.tgz", + "integrity": "sha512-+eOjx8O2YoKygjqkLpTHqcAq0zKLjior+ee2tRBx/3RSf1+OHxiC9Y6NstshQpvB1XHqTw9n7+f0+MsRJZrp0g==", + "license": "MIT", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@redis/client": "^5.6.1" + } + }, + "node_modules/@redis/time-series": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-5.6.1.tgz", + "integrity": "sha512-sd3q4jMJdoSO2akw1L9NrdFI1JJ6zeMgMUoTh4a34p9sY3AnOI4aDLCecy8L2IcPAP1oNR3TbLFJiCJDQ35QTA==", + "license": "MIT", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@redis/client": "^5.6.1" + } + }, + "node_modules/@ster5/global-mutex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ster5/global-mutex/-/global-mutex-2.0.0.tgz", + "integrity": "sha512-nlp5BM4E7ybkGt6ouZsohSnliWtXgRoUWHMl8uzi64gKwZSONsssEstfBGnQ0OpdQlE0HBP0qq9RDxP0JTW57w==", + "license": "MIT", + "dependencies": { + "@types/proper-lockfile": "^4.1.2", + "proper-lockfile": "^4.1.2" + } + }, + "node_modules/@types/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@types/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-V91DSJ2l0h0gRhVP4oBfBzRBN9lAbPUkGDMCnwedqPKX2d84aAMc9CulOvxdw1f7DfEYx99afab+Rsm3e52jhA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/async": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.25.tgz", + "integrity": "sha512-O6Th/DI18XjrL9TX8LO9F/g26qAz5vynmQqlXt/qLGrskvzCKXKc5/tATz3G2N6lM8eOf3M8/StB14FncAmocg==", + "license": "MIT" + }, + "node_modules/@types/dns-packet": { + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/@types/dns-packet/-/dns-packet-5.6.5.tgz", + "integrity": "sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/jsrsasign": { + "version": "10.5.15", + "resolved": "https://registry.npmjs.org/@types/jsrsasign/-/jsrsasign-10.5.15.tgz", + "integrity": "sha512-3stUTaSRtN09PPzVWR6aySD9gNnuymz+WviNHoTb85dKu+BjaV4uBbWWGykBBJkfwPtcNZVfTn2lbX00U+yhpQ==", + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.16", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.16.tgz", + "integrity": "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==", + "license": "MIT" + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", + "license": "MIT" + }, + "node_modules/@types/luxon": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.7.1.tgz", + "integrity": "sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mkdirp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.2.tgz", + "integrity": "sha512-o0K1tSO0Dx5X6xlU5F1D6625FawhC3dU3iqr25lluNv/+/QIVH8RLNEiVokgIZo+mz+87w/3Mkg/VvQS+J51fQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/multicast-dns": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@types/multicast-dns/-/multicast-dns-7.2.4.tgz", + "integrity": "sha512-ib5K4cIDR4Ro5SR3Sx/LROkMDa0BHz0OPaCBL/OSPDsAXEGZ3/KQeS6poBKYVN7BfjXDL9lWNwzyHVgt/wkyCw==", + "license": "MIT", + "dependencies": { + "@types/dns-packet": "*", + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.19.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.9.tgz", + "integrity": "sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.4" + } + }, + "node_modules/@types/node-fetch/node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/pg": { + "version": "8.15.5", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.5.tgz", + "integrity": "sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/proper-lockfile": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/proper-lockfile/-/proper-lockfile-4.1.4.tgz", + "integrity": "sha512-uo2ABllncSqg9F1D4nugVl9v93RmjxF6LJzQLMLDdPaXCUIDPeOJ21Gbqi43xNKzBi/WQ0Q0dICqufzQbMjipQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "*" + } + }, + "node_modules/@types/readable-stream": { + "version": "4.0.21", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.21.tgz", + "integrity": "sha512-19eKVv9tugr03IgfXlA9UVUVRbW6IuqRO5B92Dl4a6pT7K8uaGrNS0GkxiZD0BOk6PLuXl5FhWl//eX/pzYdTQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/redis": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@types/redis/-/redis-4.0.10.tgz", + "integrity": "sha512-7CLy5b5fzzEGVcOccgZjoMlNpPhX6d10jEeRy2YWbFuaMNrSPc9ExRsMYsd+0VxvEHucf4EWx24Ja7cSU1FGUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "redis": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.5.tgz", + "integrity": "sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==", + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz", + "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==", + "license": "MIT" + }, + "node_modules/@types/sshpk": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/@types/sshpk/-/sshpk-1.17.4.tgz", + "integrity": "sha512-5gI/7eJn6wmkuIuFY8JZJ1g5b30H9K5U5vKrvOuYu+hoZLb2xcVEgxhYZ2Vhbs0w/ACyzyfkJq0hQtBfSCugjw==", + "license": "MIT", + "dependencies": { + "@types/asn1": "*", + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "license": "MIT" + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1js": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.6.tgz", + "integrity": "sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==", + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ast-types": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz", + "integrity": "sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz", + "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/backoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", + "integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==", + "license": "MIT", + "dependencies": { + "precond": "0.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bl": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-6.1.1.tgz", + "integrity": "sha512-yYc8UIHrd1ZTLgNBIE7JjMzUPZH+dec3q7nWkrSHEbtvkQ3h6WKC63W9K5jthcL5EXFyMuWYq+2pq5WMSIgFHw==", + "license": "MIT", + "dependencies": { + "@types/readable-stream": "^4.0.0", + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^4.2.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/broker-factory": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/broker-factory/-/broker-factory-3.1.8.tgz", + "integrity": "sha512-xmVnYN0FZtynhPUmAnN+/MFRdbDi3syCuxWV7o7s78FcIN0pjDtn9mUrVqEgdjQkbfojRhlPWbYbXJkMCyddrg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.27.6", + "fast-unique-numbers": "^9.0.22", + "tslib": "^2.8.1", + "worker-factory": "^7.0.44" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commist": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/commist/-/commist-3.2.0.tgz", + "integrity": "sha512-4PIMoPniho+LqXmpS5d3NuGYncG6XWlkBSVGiWycL22dd42OYdUGil2CWuzklaJoNxyxUSpO4MKIBU94viWNAw==", + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-equal": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", + "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequeue": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/dequeue/-/dequeue-1.0.5.tgz", + "integrity": "sha512-2FIVJZTaWhUj0Y2uKmDAasTP6ZwFWRjkRc01MYN5jFm96iIzkYyNzGADfJ13C5W7CTN7XO9mBYDcVB68eNybBA==", + "engines": { + "node": "*" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ecc-jsbn/node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-config-riot": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-riot/-/eslint-config-riot-1.0.0.tgz", + "integrity": "sha512-NB/L/1Y30qyJcG5xZxCJKW/+bqyj+llbcCwo9DEz8bESIP0SLTOQ8T1DWCCFc+wJ61AMEstj4511PSScqMMfCw==", + "license": "MIT" + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima-next": { + "version": "5.8.4", + "resolved": "https://registry.npmjs.org/esprima-next/-/esprima-next-5.8.4.tgz", + "integrity": "sha512-8nYVZ4ioIH4Msjb/XmhnBdz5WRRBaYqevKa1cv9nGJdCehMbzZCPNEEnqfLCZVetUVrUPEcb5IYyu1GG4hFqgg==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-unique-numbers": { + "version": "9.0.22", + "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-9.0.22.tgz", + "integrity": "sha512-dBR+30yHAqBGvOuxxQdnn2lTLHCO6r/9B+M4yF8mNrzr3u1yiF+YVJ6u3GTyPN/VRWqaE1FcscZDdBgVKmrmQQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.27.6", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18.2.0" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.10.tgz", + "integrity": "sha512-V7O/fFKM539IC2bweloFWuoiJ9OtI3W2uIqJPWM8IT5xxNyt73QtvVqmSpcDmk07ivmmlKB+rRY0vpQjIYNtKw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/help-me": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", + "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", + "license": "MIT" + }, + "node_modules/hexy": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/hexy/-/hexy-0.3.5.tgz", + "integrity": "sha512-UCP7TIZPXz5kxYJnNOym+9xaenxCLor/JyhKieo8y8/bJWunGh9xbhy3YrgYJUQ87WwfXGm05X330DszOfINZw==", + "license": "MIT", + "bin": { + "hexy": "bin/hexy_cmd.js" + }, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/humanize": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/humanize/-/humanize-0.0.9.tgz", + "integrity": "sha512-bvZZ7vXpr1RKoImjuQ45hJb5OvE2oJafHysiD/AL3nkqTZH2hFCjQ3YZfCd63FefDitbJze/ispUPP0gfDsT2Q==", + "engines": { + "node": "*" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "license": "MIT" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/js-base64": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.2.tgz", + "integrity": "sha512-NnRs6dsyqUXejqk/yv2aiXlAvOs56sLkX6nUdeaNezI5LFFLlsZjOThmwnrcwh5ZZRwZlCMnVAY3CvhIhoVEKQ==", + "license": "BSD-3-Clause" + }, + "node_modules/js-sdsl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "license": "MIT" + }, + "node_modules/jsrsasign": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/jsrsasign/-/jsrsasign-11.1.0.tgz", + "integrity": "sha512-Ov74K9GihaK9/9WncTe1mPmvrO7Py665TUfUKvraXBpu+xcTWitrtuOwcjf4KMU9maPaYn0OuaWy0HOzy/GBXg==", + "license": "MIT", + "funding": { + "url": "https://github.com/kjur/jsrsasign#donations" + } + }, + "node_modules/jssha": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jssha/-/jssha-3.3.1.tgz", + "integrity": "sha512-VCMZj12FCFMQYcFLPRm/0lOBbLi8uM2BhXPTqw3U4YAfs4AZfiApOoBLoN8cQE60Z50m1MYMTQVCfgF/KaCVhQ==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "license": "Apache-2.0" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/luxon": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.1.tgz", + "integrity": "sha512-RkRWjA926cTvz5rAb1BqyWkKbbjzCGchDUIKMCUvNi17j6f6j8uHGDV82Aqcqtzd+icoYpELmG3ksgGiFNNcNg==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "license": "BSD-3-Clause", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mqtt": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-5.14.0.tgz", + "integrity": "sha512-H7EmeCJhbGblbWjm6APF5sAH3SkdI7lxHw/UkblZp8fjSNl8b2MsLcdAkIaQKxvZYmiORkdAjffvKjqQWPkd6w==", + "license": "MIT", + "dependencies": { + "@types/readable-stream": "^4.0.21", + "@types/ws": "^8.18.1", + "commist": "^3.2.0", + "concat-stream": "^2.0.0", + "debug": "^4.4.1", + "help-me": "^5.0.0", + "lru-cache": "^10.4.3", + "minimist": "^1.2.8", + "mqtt-packet": "^9.0.2", + "number-allocator": "^1.0.14", + "readable-stream": "^4.7.0", + "rfdc": "^1.4.1", + "socks": "^2.8.6", + "split2": "^4.2.0", + "worker-timers": "^8.0.23", + "ws": "^8.18.3" + }, + "bin": { + "mqtt": "build/bin/mqtt.js", + "mqtt_pub": "build/bin/pub.js", + "mqtt_sub": "build/bin/sub.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/mqtt-packet": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-9.0.2.tgz", + "integrity": "sha512-MvIY0B8/qjq7bKxdN1eD+nrljoeaai+qjLJgfRn3TiMuz0pamsIWY2bFODPZMSNmabsLANXsLl4EMoWvlaTZWA==", + "license": "MIT", + "dependencies": { + "bl": "^6.0.8", + "debug": "^4.3.4", + "process-nextick-args": "^2.0.1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/n8n-workflow": { + "version": "1.82.0", + "resolved": "https://registry.npmjs.org/n8n-workflow/-/n8n-workflow-1.82.0.tgz", + "integrity": "sha512-KScpufwmC7NtYhUbjQxfKUKrRq11qQH/yJScM3MsFCj2GCqNFQdlmZAmrWj30DeRlwgEdRzNW1LnGIKMGFEVqA==", + "license": "SEE LICENSE IN LICENSE.md", + "dependencies": { + "@n8n_io/riot-tmpl": "4.0.0", + "@n8n/tournament": "1.0.6", + "ast-types": "0.15.2", + "axios": "1.8.2", + "callsites": "3.1.0", + "deep-equal": "2.2.0", + "esprima-next": "5.8.4", + "form-data": "4.0.0", + "jmespath": "0.16.0", + "js-base64": "3.7.2", + "jssha": "3.3.1", + "lodash": "4.17.21", + "luxon": "3.4.4", + "md5": "2.3.0", + "recast": "0.21.5", + "title-case": "3.0.3", + "transliteration": "2.3.5", + "xml2js": "0.6.2", + "zod": "3.24.1" + } + }, + "node_modules/n8n-workflow/node_modules/luxon": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/node-cron": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-4.2.1.tgz", + "integrity": "sha512-lgimEHPE/QDgFlywTd8yTR61ptugX3Qer29efeyWw2rv259HtGBNn1vZVmp8lB9uo9wC0t/AT4iGqXxia+CJFg==", + "license": "ISC", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-opcua": { + "version": "2.156.0", + "resolved": "https://registry.npmjs.org/node-opcua/-/node-opcua-2.156.0.tgz", + "integrity": "sha512-N3dOl+3fEOPBDo6nHqshmGesiczEe4rArsbz9ji8Y/ocfcSMgBzuupUZF1PgyEtbpuN0z/7H87c+X0uTQMRx8Q==", + "license": "MIT", + "dependencies": { + "@types/semver": "^7.7.0", + "chalk": "4.1.2", + "node-opcua-address-space": "2.156.0", + "node-opcua-address-space-for-conformance-testing": "2.156.0", + "node-opcua-aggregates": "2.156.0", + "node-opcua-assert": "2.139.0", + "node-opcua-basic-types": "2.154.0", + "node-opcua-binary-stream": "2.153.0", + "node-opcua-certificate-manager": "2.154.0", + "node-opcua-client": "2.156.0", + "node-opcua-client-proxy": "2.156.0", + "node-opcua-common": "2.155.0", + "node-opcua-constants": "2.139.0", + "node-opcua-crypto": "4.16.0", + "node-opcua-data-access": "2.155.0", + "node-opcua-data-model": "2.155.0", + "node-opcua-data-value": "2.155.0", + "node-opcua-debug": "2.153.0", + "node-opcua-enum": "2.153.0", + "node-opcua-factory": "2.155.0", + "node-opcua-hostname": "2.139.0", + "node-opcua-nodeid": "2.153.0", + "node-opcua-nodesets": "2.155.0", + "node-opcua-numeric-range": "2.155.0", + "node-opcua-packet-analyzer": "2.155.0", + "node-opcua-secure-channel": "2.155.0", + "node-opcua-server": "2.156.0", + "node-opcua-server-discovery": "2.156.0", + "node-opcua-service-browse": "2.155.0", + "node-opcua-service-call": "2.155.0", + "node-opcua-service-discovery": "2.155.0", + "node-opcua-service-endpoints": "2.155.0", + "node-opcua-service-filter": "2.155.0", + "node-opcua-service-history": "2.155.0", + "node-opcua-service-node-management": "2.155.0", + "node-opcua-service-query": "2.155.0", + "node-opcua-service-read": "2.155.0", + "node-opcua-service-register-node": "2.155.0", + "node-opcua-service-secure-channel": "2.155.0", + "node-opcua-service-session": "2.155.0", + "node-opcua-service-subscription": "2.155.0", + "node-opcua-service-translate-browse-path": "2.155.0", + "node-opcua-service-write": "2.155.0", + "node-opcua-status-code": "2.153.0", + "node-opcua-transport": "2.155.0", + "node-opcua-types": "2.155.0", + "node-opcua-utils": "2.153.0", + "node-opcua-variant": "2.155.0", + "node-opcua-vendor-diagnostic": "2.156.0", + "semver": "^7.7.1" + }, + "engines": { + "node": ">=8.10" + }, + "funding": { + "url": "https://github.com/sponsors/erossignon" + } + }, + "node_modules/node-opcua-address-space": { + "version": "2.156.0", + "resolved": "https://registry.npmjs.org/node-opcua-address-space/-/node-opcua-address-space-2.156.0.tgz", + "integrity": "sha512-4ei7NkqOBdAa0HhOrB/o8Fy/h5y8m7sqNZfV7gWElZzAQ9rM8AWK/Ra70TDviMPYmXjuidNhAFGAilZlHzDswg==", + "license": "MIT", + "dependencies": { + "@types/lodash": "4.17.16", + "@types/semver": "^7.7.0", + "chalk": "4.1.2", + "dequeue": "^1.0.5", + "lodash": "4.17.21", + "node-opcua-address-space-base": "2.155.0", + "node-opcua-assert": "2.139.0", + "node-opcua-basic-types": "2.154.0", + "node-opcua-binary-stream": "2.153.0", + "node-opcua-client-dynamic-extension-object": "2.156.0", + "node-opcua-constants": "2.139.0", + "node-opcua-crypto": "4.16.0", + "node-opcua-data-access": "2.155.0", + "node-opcua-data-model": "2.155.0", + "node-opcua-data-value": "2.155.0", + "node-opcua-date-time": "2.153.0", + "node-opcua-debug": "2.153.0", + "node-opcua-enum": "2.153.0", + "node-opcua-extension-object": "2.155.0", + "node-opcua-factory": "2.155.0", + "node-opcua-nodeid": "2.153.0", + "node-opcua-nodeset-ua": "2.155.0", + "node-opcua-numeric-range": "2.155.0", + "node-opcua-object-registry": "2.153.0", + "node-opcua-pseudo-session": "2.156.0", + "node-opcua-schemas": "2.155.0", + "node-opcua-service-browse": "2.155.0", + "node-opcua-service-call": "2.155.0", + "node-opcua-service-history": "2.155.0", + "node-opcua-service-translate-browse-path": "2.155.0", + "node-opcua-service-write": "2.155.0", + "node-opcua-status-code": "2.153.0", + "node-opcua-types": "2.155.0", + "node-opcua-utils": "2.153.0", + "node-opcua-variant": "2.155.0", + "node-opcua-xml2json": "2.155.0", + "semver": "^7.7.1", + "thenify-ex": "4.4.0", + "xml-writer": "^1.7.0" + }, + "engines": { + "node": ">=6.10" + } + }, + "node_modules/node-opcua-address-space-base": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-address-space-base/-/node-opcua-address-space-base-2.155.0.tgz", + "integrity": "sha512-bYpVXZH+133dky7UFhZHjio7HgsR4xmmZ9rSwZpCgXcRb3qhhVPcj80u8c2m4dAekAFrI4TaJEOhtSlTzrPZfA==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.139.0", + "node-opcua-basic-types": "2.154.0", + "node-opcua-constants": "2.139.0", + "node-opcua-crypto": "4.16.0", + "node-opcua-data-model": "2.155.0", + "node-opcua-data-value": "2.155.0", + "node-opcua-date-time": "2.153.0", + "node-opcua-debug": "2.153.0", + "node-opcua-extension-object": "2.155.0", + "node-opcua-nodeid": "2.153.0", + "node-opcua-numeric-range": "2.155.0", + "node-opcua-schemas": "2.155.0", + "node-opcua-status-code": "2.153.0", + "node-opcua-types": "2.155.0", + "node-opcua-variant": "2.155.0" + }, + "engines": { + "node": ">=6.10" + } + }, + "node_modules/node-opcua-address-space-for-conformance-testing": { + "version": "2.156.0", + "resolved": "https://registry.npmjs.org/node-opcua-address-space-for-conformance-testing/-/node-opcua-address-space-for-conformance-testing-2.156.0.tgz", + "integrity": "sha512-3b1No+UGs1hiCZlG3t9f/lolqPpY+0ZUisDDOViWI7tinjRqRt7/W/gIqbeqfPWFl7fD+YYnGoclx7d+bkEtRQ==", + "license": "MIT", + "dependencies": { + "node-opcua-address-space": "2.156.0", + "node-opcua-assert": "2.139.0", + "node-opcua-basic-types": "2.154.0", + "node-opcua-data-access": "2.155.0", + "node-opcua-data-model": "2.155.0", + "node-opcua-data-value": "2.155.0", + "node-opcua-debug": "2.153.0", + "node-opcua-factory": "2.155.0", + "node-opcua-nodeid": "2.153.0", + "node-opcua-status-code": "2.153.0", + "node-opcua-variant": "2.155.0" + } + }, + "node_modules/node-opcua-aggregates": { + "version": "2.156.0", + "resolved": "https://registry.npmjs.org/node-opcua-aggregates/-/node-opcua-aggregates-2.156.0.tgz", + "integrity": "sha512-MovO2+dEW6xT7FVfMZzCvpyVkwFFjwHqzy9ndYdkaDOU6hLOvLamcJ8iqcqNq4lkWtUEjUufV3Xdj8BNx/ZB9g==", + "license": "MIT", + "dependencies": { + "node-opcua-address-space": "2.156.0", + "node-opcua-assert": "2.139.0", + "node-opcua-constants": "2.139.0", + "node-opcua-data-model": "2.155.0", + "node-opcua-data-value": "2.155.0", + "node-opcua-nodeid": "2.153.0", + "node-opcua-numeric-range": "2.155.0", + "node-opcua-server": "2.156.0", + "node-opcua-service-history": "2.155.0", + "node-opcua-status-code": "2.153.0", + "node-opcua-types": "2.155.0", + "node-opcua-utils": "2.153.0", + "node-opcua-variant": "2.155.0" + } + }, + "node_modules/node-opcua-alarm-condition": { + "version": "2.156.0", + "resolved": "https://registry.npmjs.org/node-opcua-alarm-condition/-/node-opcua-alarm-condition-2.156.0.tgz", + "integrity": "sha512-hdxkBVgCazqDdFK0lyYcRJvBlX6iI4j86YRBHF+3hpPwr/9UgE8BoTtBhBA8rnMyfVOOlaUw465XVJryu/edrA==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.139.0", + "node-opcua-basic-types": "2.154.0", + "node-opcua-constants": "2.139.0", + "node-opcua-data-model": "2.155.0", + "node-opcua-debug": "2.153.0", + "node-opcua-nodeid": "2.153.0", + "node-opcua-pseudo-session": "2.156.0", + "node-opcua-service-browse": "2.155.0", + "node-opcua-service-filter": "2.155.0", + "node-opcua-service-read": "2.155.0", + "node-opcua-service-subscription": "2.155.0", + "node-opcua-service-translate-browse-path": "2.155.0", + "node-opcua-status-code": "2.153.0", + "node-opcua-types": "2.155.0", + "node-opcua-utils": "2.153.0", + "node-opcua-variant": "2.155.0", + "thenify-ex": "4.4.0" + } + }, + "node_modules/node-opcua-assert": { + "version": "2.139.0", + "resolved": "https://registry.npmjs.org/node-opcua-assert/-/node-opcua-assert-2.139.0.tgz", + "integrity": "sha512-JdIE+FD+orAVxmUjP/naBNsU62ianW1zIg6Ebs/vgzu6ZezfTOdaky/ph02ydPG4nTafFOEvZ8eGeerWqaRY7g==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2" + } + }, + "node_modules/node-opcua-basic-types": { + "version": "2.154.0", + "resolved": "https://registry.npmjs.org/node-opcua-basic-types/-/node-opcua-basic-types-2.154.0.tgz", + "integrity": "sha512-yLf5xFF7cR0zhsaju6YU8Us5MK+IPe+azkbp7PkccM2D5eNvI8oYV+iBiY6/99tjY8EzWj/CE6jrn4auIItSOA==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.139.0", + "node-opcua-binary-stream": "2.153.0", + "node-opcua-buffer-utils": "2.153.0", + "node-opcua-date-time": "2.153.0", + "node-opcua-guid": "2.139.0", + "node-opcua-nodeid": "2.153.0", + "node-opcua-status-code": "2.153.0" + } + }, + "node_modules/node-opcua-binary-stream": { + "version": "2.153.0", + "resolved": "https://registry.npmjs.org/node-opcua-binary-stream/-/node-opcua-binary-stream-2.153.0.tgz", + "integrity": "sha512-SIYMJUJtgLr1w1eJEELqt3EpUsQ2ON2jLi/kHYQM9Fz904NUJMgcgeV7s3Y76BDoQSmR74DgHPf/TfLgTwKXCg==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.139.0", + "node-opcua-buffer-utils": "2.153.0" + } + }, + "node_modules/node-opcua-buffer-utils": { + "version": "2.153.0", + "resolved": "https://registry.npmjs.org/node-opcua-buffer-utils/-/node-opcua-buffer-utils-2.153.0.tgz", + "integrity": "sha512-xh8Af5LUKhvxjWHYDsEf9229Quk0eu311U1O+sgBFC1ak5jgI+LatdG52WSroy4o1ksmu/cgTzkFlNXVDQVs+g==", + "license": "MIT" + }, + "node_modules/node-opcua-certificate-manager": { + "version": "2.154.0", + "resolved": "https://registry.npmjs.org/node-opcua-certificate-manager/-/node-opcua-certificate-manager-2.154.0.tgz", + "integrity": "sha512-PnwbJWJlPgrCB7PKWy0tOW+oL9cF4Vo7fSSEEAXeJcFRozxeRSMXLsfDsMWA+lrq8Pd8mwBOgKTtvB6zTFcwvg==", + "license": "MIT", + "dependencies": { + "@types/mkdirp": "1.0.2", + "env-paths": "2.2.1", + "mkdirp": "1.0.4", + "node-opcua-assert": "2.139.0", + "node-opcua-crypto": "4.16.0", + "node-opcua-debug": "2.153.0", + "node-opcua-object-registry": "2.153.0", + "node-opcua-pki": "5.3.0", + "node-opcua-status-code": "2.153.0", + "thenify-ex": "4.4.0" + } + }, + "node_modules/node-opcua-chunkmanager": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-chunkmanager/-/node-opcua-chunkmanager-2.155.0.tgz", + "integrity": "sha512-dLWRviAunsQT1KxuFz7S6t1jq14mlnXgms+JE8UBO7x0wOewWfGssNbuRUnVaSRPPkrnbiawt4s6H7AB+ZPhjg==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.139.0", + "node-opcua-basic-types": "2.154.0", + "node-opcua-binary-stream": "2.153.0", + "node-opcua-buffer-utils": "2.153.0", + "node-opcua-factory": "2.155.0", + "node-opcua-packet-assembler": "2.153.0" + } + }, + "node_modules/node-opcua-client": { + "version": "2.156.0", + "resolved": "https://registry.npmjs.org/node-opcua-client/-/node-opcua-client-2.156.0.tgz", + "integrity": "sha512-m8O5fL0/6KuAYsDOfc7B8LoYLPW7fGwxlivZUBpIsmsb196zVvX1u6NF5GCxuzNDm4s3+X2+OKQQn9zR+uZ4EQ==", + "license": "MIT", + "dependencies": { + "@ster5/global-mutex": "^2.0.0", + "@types/async": "^3.2.24", + "async": "^3.2.6", + "chalk": "4.1.2", + "node-opcua-alarm-condition": "2.156.0", + "node-opcua-assert": "2.139.0", + "node-opcua-basic-types": "2.154.0", + "node-opcua-buffer-utils": "2.153.0", + "node-opcua-certificate-manager": "2.154.0", + "node-opcua-client-dynamic-extension-object": "2.156.0", + "node-opcua-common": "2.155.0", + "node-opcua-constants": "2.139.0", + "node-opcua-crypto": "4.16.0", + "node-opcua-data-model": "2.155.0", + "node-opcua-data-value": "2.155.0", + "node-opcua-date-time": "2.153.0", + "node-opcua-debug": "2.153.0", + "node-opcua-extension-object": "2.155.0", + "node-opcua-hostname": "2.139.0", + "node-opcua-nodeid": "2.153.0", + "node-opcua-object-registry": "2.153.0", + "node-opcua-pki": "5.3.0", + "node-opcua-pseudo-session": "2.156.0", + "node-opcua-schemas": "2.155.0", + "node-opcua-secure-channel": "2.155.0", + "node-opcua-service-browse": "2.155.0", + "node-opcua-service-call": "2.155.0", + "node-opcua-service-discovery": "2.155.0", + "node-opcua-service-endpoints": "2.155.0", + "node-opcua-service-filter": "2.155.0", + "node-opcua-service-history": "2.155.0", + "node-opcua-service-query": "2.155.0", + "node-opcua-service-read": "2.155.0", + "node-opcua-service-register-node": "2.155.0", + "node-opcua-service-secure-channel": "2.155.0", + "node-opcua-service-session": "2.155.0", + "node-opcua-service-subscription": "2.155.0", + "node-opcua-service-translate-browse-path": "2.155.0", + "node-opcua-service-write": "2.155.0", + "node-opcua-status-code": "2.153.0", + "node-opcua-types": "2.155.0", + "node-opcua-utils": "2.153.0", + "node-opcua-variant": "2.155.0", + "thenify-ex": "4.4.0" + } + }, + "node_modules/node-opcua-client-dynamic-extension-object": { + "version": "2.156.0", + "resolved": "https://registry.npmjs.org/node-opcua-client-dynamic-extension-object/-/node-opcua-client-dynamic-extension-object-2.156.0.tgz", + "integrity": "sha512-wekq/1mKCCll+ZwNbnHhhXGRmW4Ps9JyktvaujpWho3o6u4N0sbe5vOm6qj/1Fwkm+CkP30KB1KPlH4v5NJw0A==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.139.0", + "node-opcua-binary-stream": "2.153.0", + "node-opcua-constants": "2.139.0", + "node-opcua-data-model": "2.155.0", + "node-opcua-data-value": "2.155.0", + "node-opcua-debug": "2.153.0", + "node-opcua-extension-object": "2.155.0", + "node-opcua-factory": "2.155.0", + "node-opcua-nodeid": "2.153.0", + "node-opcua-pseudo-session": "2.156.0", + "node-opcua-schemas": "2.155.0", + "node-opcua-service-browse": "2.155.0", + "node-opcua-service-translate-browse-path": "2.155.0", + "node-opcua-status-code": "2.153.0", + "node-opcua-types": "2.155.0", + "node-opcua-variant": "2.155.0" + } + }, + "node_modules/node-opcua-client-proxy": { + "version": "2.156.0", + "resolved": "https://registry.npmjs.org/node-opcua-client-proxy/-/node-opcua-client-proxy-2.156.0.tgz", + "integrity": "sha512-bE0OyJEsPgk72iPdGCTz7nPNb6K78JO37wr+zrQ3CsceHPLhQ8aQGwztP8SHFoJaYKsFgrysZwPmGYrhmjHQbQ==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.139.0", + "node-opcua-constants": "2.139.0", + "node-opcua-data-model": "2.155.0", + "node-opcua-data-value": "2.155.0", + "node-opcua-debug": "2.153.0", + "node-opcua-nodeid": "2.153.0", + "node-opcua-pseudo-session": "2.156.0", + "node-opcua-service-browse": "2.155.0", + "node-opcua-service-call": "2.155.0", + "node-opcua-service-read": "2.155.0", + "node-opcua-service-subscription": "2.155.0", + "node-opcua-service-write": "2.155.0", + "node-opcua-status-code": "2.153.0", + "node-opcua-utils": "2.153.0", + "node-opcua-variant": "2.155.0" + } + }, + "node_modules/node-opcua-common": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-common/-/node-opcua-common-2.155.0.tgz", + "integrity": "sha512-BdBtOfdtspUqizuNyEU4yakAbykV3P6AfSU9Xj1FDSLuqdarPgkn8E3CfFlenUfbqFTHhimXv8MbzfjvNfgM+w==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.139.0", + "node-opcua-crypto": "4.16.0", + "node-opcua-types": "2.155.0" + } + }, + "node_modules/node-opcua-constants": { + "version": "2.139.0", + "resolved": "https://registry.npmjs.org/node-opcua-constants/-/node-opcua-constants-2.139.0.tgz", + "integrity": "sha512-C0L+LA2LTHixRFROpIRZ6FHu0Ha752R01xIhi8hUib5GVLGjL+6mdq2KQqlnFy3XPOAXH8z37p1j6EwwJm2HLw==", + "license": "MIT" + }, + "node_modules/node-opcua-crypto": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/node-opcua-crypto/-/node-opcua-crypto-4.16.0.tgz", + "integrity": "sha512-r3dRfHc7invXqYt+pjHPEj+YnQDJqfeIikNjWhQSTT9gVWuBOkHDAwPd6QxxJoTHlSp+/mczOWNKmufZ8E0u6Q==", + "license": "MIT", + "dependencies": { + "@peculiar/webcrypto": "^1.5.0", + "@peculiar/x509": "^1.12.3", + "@types/jsrsasign": "^10.5.15", + "@types/sshpk": "^1.17.4", + "assert": "^2.1.0", + "chalk": "^4.1.2", + "hexy": "0.3.5", + "jsrsasign": "^11.1.0", + "sshpk": "^1.18.0" + } + }, + "node_modules/node-opcua-data-access": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-data-access/-/node-opcua-data-access-2.155.0.tgz", + "integrity": "sha512-ZJQqOHpX+ICjYHxoCdqYTESS306rstOdsJ4gp7i4/+9y0fj9jPVlONluKoO/8O4EoKqSxoVSVHjHuxNG4Qz0cQ==", + "license": "MIT", + "dependencies": { + "node-opcua-data-model": "2.155.0", + "node-opcua-types": "2.155.0" + } + }, + "node_modules/node-opcua-data-model": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-data-model/-/node-opcua-data-model-2.155.0.tgz", + "integrity": "sha512-DsZZT3MZUfA7YVSe0uH3PpQK1/H4OgOA4YyA2kEz6EZU9ORD9tvS3qD02Vpx/kax9C35fLsBkB55xmrlZ0NurA==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.139.0", + "node-opcua-basic-types": "2.154.0", + "node-opcua-binary-stream": "2.153.0", + "node-opcua-enum": "2.153.0", + "node-opcua-factory": "2.155.0", + "node-opcua-nodeid": "2.153.0", + "node-opcua-status-code": "2.153.0" + } + }, + "node_modules/node-opcua-data-value": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-data-value/-/node-opcua-data-value-2.155.0.tgz", + "integrity": "sha512-/3V6Q+O36Z/rN7T9H98XmJ7adm0IAd8gZmP4zy5sgj24n88a8U/u+/YgB34dZLYXf5Fe7NRjIYXMhNx0/6Ct4A==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.139.0", + "node-opcua-basic-types": "2.154.0", + "node-opcua-binary-stream": "2.153.0", + "node-opcua-data-model": "2.155.0", + "node-opcua-date-time": "2.153.0", + "node-opcua-enum": "2.153.0", + "node-opcua-factory": "2.155.0", + "node-opcua-status-code": "2.153.0", + "node-opcua-variant": "2.155.0" + } + }, + "node_modules/node-opcua-date-time": { + "version": "2.153.0", + "resolved": "https://registry.npmjs.org/node-opcua-date-time/-/node-opcua-date-time-2.153.0.tgz", + "integrity": "sha512-JJWS+bNLT0LKM/Xkjz7FztCC55vKVd7/XE0rs4XUgoJonbAZ6s6NCNhl9dvOTed7CMyBExIM+Myy7D6kjgjz3A==", + "license": "MIT", + "dependencies": { + "@types/long": "4.0.2", + "long": "4.0.0", + "node-opcua-assert": "2.139.0", + "node-opcua-binary-stream": "2.153.0", + "node-opcua-utils": "2.153.0" + } + }, + "node_modules/node-opcua-debug": { + "version": "2.153.0", + "resolved": "https://registry.npmjs.org/node-opcua-debug/-/node-opcua-debug-2.153.0.tgz", + "integrity": "sha512-GR7/fhyfJYb8dNb6QtpILYRZ2Hn26S/TCJI2TelF2Z2z1iBJr0nPpUMrfkcdPmLnCyavYP8wi0SLWBRk0bwUag==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "hexy": "0.3.5", + "node-opcua-assert": "2.139.0", + "node-opcua-buffer-utils": "2.153.0" + } + }, + "node_modules/node-opcua-enum": { + "version": "2.153.0", + "resolved": "https://registry.npmjs.org/node-opcua-enum/-/node-opcua-enum-2.153.0.tgz", + "integrity": "sha512-sAKLVzTP5JARxIAsh5QksWt8xpJIfio8Zs9KGhwau58kJZb2x0stpzMPRs6s9X9/VOyqXixfacW++lAFQk8wwA==", + "license": "MIT" + }, + "node_modules/node-opcua-extension-object": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-extension-object/-/node-opcua-extension-object-2.155.0.tgz", + "integrity": "sha512-+cQDPnEybUQh/8g5zeM7XoAhpb48JMotjK3FrDHTe74SCUSzS0csatFPMud3m29tMhgL/VqeIkW1DiAnkKlMPQ==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-basic-types": "2.154.0", + "node-opcua-binary-stream": "2.153.0", + "node-opcua-debug": "2.153.0", + "node-opcua-factory": "2.155.0", + "node-opcua-nodeid": "2.153.0" + } + }, + "node_modules/node-opcua-factory": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-factory/-/node-opcua-factory-2.155.0.tgz", + "integrity": "sha512-w7h39unGBf/gaO0lMev7M7vCrflBMnga/4CMNd/FZG0tnVocvOJSbsHK11KI1OyPNJVwFnyFWroEpX+7PEcEdQ==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.139.0", + "node-opcua-basic-types": "2.154.0", + "node-opcua-binary-stream": "2.153.0", + "node-opcua-constants": "2.139.0", + "node-opcua-debug": "2.153.0", + "node-opcua-enum": "2.153.0", + "node-opcua-guid": "2.139.0", + "node-opcua-nodeid": "2.153.0", + "node-opcua-status-code": "2.153.0", + "node-opcua-utils": "2.153.0" + } + }, + "node_modules/node-opcua-generator": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-generator/-/node-opcua-generator-2.155.0.tgz", + "integrity": "sha512-JbyUgtDBeW3OKe19PPDwscheLJJt+Mx39n7MP/WeSEul+dcwgeiEYZRANZcWnYtIhHinyoSa5ZBzJ+EK5XzU4g==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.139.0", + "node-opcua-constants": "2.139.0", + "node-opcua-debug": "2.153.0", + "node-opcua-factory": "2.155.0", + "node-opcua-nodeid": "2.153.0", + "node-opcua-schemas": "2.155.0", + "node-opcua-utils": "2.153.0" + } + }, + "node_modules/node-opcua-guid": { + "version": "2.139.0", + "resolved": "https://registry.npmjs.org/node-opcua-guid/-/node-opcua-guid-2.139.0.tgz", + "integrity": "sha512-YQyU1SWeNYKMg5dw85OW9nG3umUVcVX3VSGO2wxl6oWuWVFgbwLbtz3+y9HVl4gc3LRVb9NPCVOWYmpXVxmPsA==", + "license": "MIT" + }, + "node_modules/node-opcua-hostname": { + "version": "2.139.0", + "resolved": "https://registry.npmjs.org/node-opcua-hostname/-/node-opcua-hostname-2.139.0.tgz", + "integrity": "sha512-hQ6LW6ccqqB8er+w89/mN23bhLy7VI9vOQ47tDMp+gWdWLE/oz/Uqwnk/x4/u1/3040wfEHxE4/vjWYPmvzIVA==", + "license": "MIT" + }, + "node_modules/node-opcua-nodeid": { + "version": "2.153.0", + "resolved": "https://registry.npmjs.org/node-opcua-nodeid/-/node-opcua-nodeid-2.153.0.tgz", + "integrity": "sha512-rBV/0WrAATX4cJm71zhCcuMHAPoVnBgu0zNtFS61hOJOtBa4S/cORdmhPUmdhHJu7+eRsor90A5+fvamMlWPaw==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.139.0", + "node-opcua-constants": "2.139.0", + "node-opcua-guid": "2.139.0" + } + }, + "node_modules/node-opcua-nodeset-ua": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-nodeset-ua/-/node-opcua-nodeset-ua-2.155.0.tgz", + "integrity": "sha512-cVBC0Dx6yIdoAf2FP5nNjyHiDrAf+0UpRJu9b/l85Xf4i5k5ErF9vF0eNPfj8mHhFAxBiSgc5qnlb6Nv/KrjLA==", + "license": "MIT", + "dependencies": { + "node-opcua-address-space-base": "2.155.0", + "node-opcua-basic-types": "2.154.0", + "node-opcua-data-access": "2.155.0", + "node-opcua-data-model": "2.155.0", + "node-opcua-data-value": "2.155.0", + "node-opcua-extension-object": "2.155.0", + "node-opcua-nodeid": "2.153.0", + "node-opcua-status-code": "2.153.0", + "node-opcua-variant": "2.155.0" + } + }, + "node_modules/node-opcua-nodesets": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-nodesets/-/node-opcua-nodesets-2.155.0.tgz", + "integrity": "sha512-VdJOQRKKRiqOiQFRnAhzI2AVcs1XkL3JYsvVu5x0TNnRiIQgyYIibB/+YlLOiflOxmR4EdrRoZ0G4lfZ37KP1w==", + "license": "MIT" + }, + "node_modules/node-opcua-numeric-range": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-numeric-range/-/node-opcua-numeric-range-2.155.0.tgz", + "integrity": "sha512-OUaW+mBnVGsqhJAcG6zFc98zo+z5jvlYHh34sbZHe+ZtLntZUo4j+fu3beRB1L21GIkkq7BFwFOCmG9OtsbRJw==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.139.0", + "node-opcua-basic-types": "2.154.0", + "node-opcua-binary-stream": "2.153.0", + "node-opcua-factory": "2.155.0", + "node-opcua-status-code": "2.153.0" + } + }, + "node_modules/node-opcua-object-registry": { + "version": "2.153.0", + "resolved": "https://registry.npmjs.org/node-opcua-object-registry/-/node-opcua-object-registry-2.153.0.tgz", + "integrity": "sha512-pAGpVXtxToT29rWZjrcmQLPEd426oHGVkq2alMMvFfS1n95CuCv01f5cwlHTlsEPAVsnA9FpBq+ictyxLicm5A==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.139.0", + "node-opcua-debug": "2.153.0" + } + }, + "node_modules/node-opcua-packet-analyzer": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-packet-analyzer/-/node-opcua-packet-analyzer-2.155.0.tgz", + "integrity": "sha512-0wMP7Dp4PQe5BeOe3n7uBb4GmgnFDqWfq13jIFqYdfFK6MK1h8xoA8NeRZ+OLr0lWrwXG6hmGnaV0gjlMTrLXg==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.139.0", + "node-opcua-basic-types": "2.154.0", + "node-opcua-binary-stream": "2.153.0", + "node-opcua-debug": "2.153.0", + "node-opcua-factory": "2.155.0", + "node-opcua-utils": "2.153.0" + } + }, + "node_modules/node-opcua-packet-assembler": { + "version": "2.153.0", + "resolved": "https://registry.npmjs.org/node-opcua-packet-assembler/-/node-opcua-packet-assembler-2.153.0.tgz", + "integrity": "sha512-g000ETNUL9FHjhw/fpdvHEVJBDiIq3H9EBBj/1pUwH9rdZag+vBMNbnhMcc8G3QFoHdKqaVdDfTOC3schMdL1A==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.139.0", + "node-opcua-debug": "2.153.0" + } + }, + "node_modules/node-opcua-pki": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/node-opcua-pki/-/node-opcua-pki-5.3.0.tgz", + "integrity": "sha512-Ne+EzDdiRnpaICoU9WKflPPJK/NNmAE4bnbSd/bNfz+tgrwijmzKWr1ffEtnpTOJvoMJ3hJUaUoj2rT1RFnYcA==", + "license": "MIT", + "dependencies": { + "@ster5/global-mutex": "^2.0.0", + "byline": "^5.0.0", + "chalk": "4.1.2", + "chokidar": "4.0.3", + "node-opcua-crypto": "4.16.0", + "progress": "^2.0.3", + "rimraf": "4.4.1", + "wget-improved-2": "^3.3.0", + "yargs": "17.7.2", + "yauzl": "^3.2.0" + }, + "bin": { + "pki": "bin/crypto_create_CA.js" + } + }, + "node_modules/node-opcua-pseudo-session": { + "version": "2.156.0", + "resolved": "https://registry.npmjs.org/node-opcua-pseudo-session/-/node-opcua-pseudo-session-2.156.0.tgz", + "integrity": "sha512-z4YYnaBcMYDFNriQbWC3eajZCnN9ur5kvEjO6YPtR5wt3BC/8BWKnh7Ki8UpYOcMVbf0fZjuSNJw9WDCZEExLg==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.139.0", + "node-opcua-basic-types": "2.154.0", + "node-opcua-constants": "2.139.0", + "node-opcua-data-model": "2.155.0", + "node-opcua-data-value": "2.155.0", + "node-opcua-debug": "2.153.0", + "node-opcua-nodeid": "2.153.0", + "node-opcua-service-browse": "2.155.0", + "node-opcua-service-call": "2.155.0", + "node-opcua-service-filter": "2.155.0", + "node-opcua-service-read": "2.155.0", + "node-opcua-service-subscription": "2.155.0", + "node-opcua-service-translate-browse-path": "2.155.0", + "node-opcua-service-write": "2.155.0", + "node-opcua-status-code": "2.153.0", + "node-opcua-types": "2.155.0", + "node-opcua-utils": "2.153.0", + "node-opcua-variant": "2.155.0", + "thenify-ex": "4.4.0" + } + }, + "node_modules/node-opcua-schemas": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-schemas/-/node-opcua-schemas-2.155.0.tgz", + "integrity": "sha512-E6W+Sj0+Wt92ZvblWGdCV78u2N3U6OybssdNeuB+oyXtX2wyqJRLhkXk09m5MWcNuUgEa3onnDFjsc5lyBra/A==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.139.0", + "node-opcua-binary-stream": "2.153.0", + "node-opcua-debug": "2.153.0", + "node-opcua-extension-object": "2.155.0", + "node-opcua-factory": "2.155.0", + "node-opcua-nodeid": "2.153.0", + "node-opcua-variant": "2.155.0", + "node-opcua-xml2json": "2.155.0" + } + }, + "node_modules/node-opcua-secure-channel": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-secure-channel/-/node-opcua-secure-channel-2.155.0.tgz", + "integrity": "sha512-xT7YvJ0SshS0bKs95DlJpZq9hveHFvuNo2ptD+lWsGJbp0gPZdQc9mPMoHb8eWEyOa7GWZPbjj+cEYPuCP0W8Q==", + "license": "MIT", + "dependencies": { + "backoff": "^2.5.0", + "chalk": "4.1.2", + "node-opcua-assert": "2.139.0", + "node-opcua-basic-types": "2.154.0", + "node-opcua-binary-stream": "2.153.0", + "node-opcua-certificate-manager": "2.154.0", + "node-opcua-chunkmanager": "2.155.0", + "node-opcua-common": "2.155.0", + "node-opcua-crypto": "4.16.0", + "node-opcua-debug": "2.153.0", + "node-opcua-factory": "2.155.0", + "node-opcua-nodeid": "2.153.0", + "node-opcua-object-registry": "2.153.0", + "node-opcua-packet-analyzer": "2.155.0", + "node-opcua-service-endpoints": "2.155.0", + "node-opcua-service-secure-channel": "2.155.0", + "node-opcua-status-code": "2.153.0", + "node-opcua-transport": "2.155.0", + "node-opcua-types": "2.155.0", + "node-opcua-utils": "2.153.0" + } + }, + "node_modules/node-opcua-server": { + "version": "2.156.0", + "resolved": "https://registry.npmjs.org/node-opcua-server/-/node-opcua-server-2.156.0.tgz", + "integrity": "sha512-drrY9lG2+1//yo9icHYit83RJiFSqznlzxPUanf2J8L2MK6xoRDRROb5KCEcdEEDhPGrELzloz+b7LZxAfSDcw==", + "license": "MIT", + "dependencies": { + "@ster5/global-mutex": "^2.0.0", + "async": "^3.2.6", + "chalk": "4.1.2", + "dequeue": "^1.0.5", + "lodash": "4.17.21", + "node-opcua-address-space": "2.156.0", + "node-opcua-address-space-base": "2.155.0", + "node-opcua-assert": "2.139.0", + "node-opcua-basic-types": "2.154.0", + "node-opcua-binary-stream": "2.153.0", + "node-opcua-certificate-manager": "2.154.0", + "node-opcua-client": "2.156.0", + "node-opcua-client-dynamic-extension-object": "2.156.0", + "node-opcua-common": "2.155.0", + "node-opcua-constants": "2.139.0", + "node-opcua-crypto": "4.16.0", + "node-opcua-data-model": "2.155.0", + "node-opcua-data-value": "2.155.0", + "node-opcua-date-time": "2.153.0", + "node-opcua-debug": "2.153.0", + "node-opcua-extension-object": "2.155.0", + "node-opcua-factory": "2.155.0", + "node-opcua-hostname": "2.139.0", + "node-opcua-nodeid": "2.153.0", + "node-opcua-nodesets": "2.155.0", + "node-opcua-numeric-range": "2.155.0", + "node-opcua-object-registry": "2.153.0", + "node-opcua-secure-channel": "2.155.0", + "node-opcua-service-browse": "2.155.0", + "node-opcua-service-call": "2.155.0", + "node-opcua-service-discovery": "2.155.0", + "node-opcua-service-endpoints": "2.155.0", + "node-opcua-service-filter": "2.155.0", + "node-opcua-service-history": "2.155.0", + "node-opcua-service-node-management": "2.155.0", + "node-opcua-service-query": "2.155.0", + "node-opcua-service-read": "2.155.0", + "node-opcua-service-register-node": "2.155.0", + "node-opcua-service-secure-channel": "2.155.0", + "node-opcua-service-session": "2.155.0", + "node-opcua-service-subscription": "2.155.0", + "node-opcua-service-translate-browse-path": "2.155.0", + "node-opcua-service-write": "2.155.0", + "node-opcua-status-code": "2.153.0", + "node-opcua-transport": "2.155.0", + "node-opcua-types": "2.155.0", + "node-opcua-utils": "2.153.0", + "node-opcua-variant": "2.155.0", + "thenify-ex": "4.4.0" + } + }, + "node_modules/node-opcua-server-discovery": { + "version": "2.156.0", + "resolved": "https://registry.npmjs.org/node-opcua-server-discovery/-/node-opcua-server-discovery-2.156.0.tgz", + "integrity": "sha512-F+MUe1mSF09kHJQYljsGJSFvhKWpXnDCYwsohlNTHnFFcwG0uPlWm6xhXlpnUJhV2cfbgZ/mj5mO/H39bfO2ZQ==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "env-paths": "2.2.1", + "node-opcua-assert": "2.139.0", + "node-opcua-basic-types": "2.154.0", + "node-opcua-certificate-manager": "2.154.0", + "node-opcua-common": "2.155.0", + "node-opcua-debug": "2.153.0", + "node-opcua-hostname": "2.139.0", + "node-opcua-object-registry": "2.153.0", + "node-opcua-secure-channel": "2.155.0", + "node-opcua-server": "2.156.0", + "node-opcua-service-discovery": "2.155.0", + "node-opcua-service-endpoints": "2.155.0", + "node-opcua-status-code": "2.153.0", + "sterfive-bonjour-service": "1.1.4", + "thenify-ex": "4.4.0" + } + }, + "node_modules/node-opcua-service-browse": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-browse/-/node-opcua-service-browse-2.155.0.tgz", + "integrity": "sha512-7iBRiM2tPXno2X+/mUvaP/WY666BfLywln6QQ7Syy9f8TjKZGQJq9xC6JOEXmWYKX9VLL/HkICwZ8HXKGJ3wzg==", + "license": "MIT", + "dependencies": { + "node-opcua-data-model": "2.155.0", + "node-opcua-types": "2.155.0" + } + }, + "node_modules/node-opcua-service-call": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-call/-/node-opcua-service-call-2.155.0.tgz", + "integrity": "sha512-IEoNZ/K8fX94jhJacSNa3iUdgEYxHkZaZdoEQJTVGxkUMjk9LqACoEk6J/H5rEWFtkdxDCmkm7shuBxDxvHItQ==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.139.0", + "node-opcua-nodeid": "2.153.0", + "node-opcua-types": "2.155.0", + "node-opcua-variant": "2.155.0" + } + }, + "node_modules/node-opcua-service-discovery": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-discovery/-/node-opcua-service-discovery-2.155.0.tgz", + "integrity": "sha512-Y2oX4MutD/T30vYVkm/+Lsp1a3KXO+Xr6I8dr0DELUwUCs6jc0FGXViocsI4Egs8+K5hyk7R3GGYxzoUJPO+lw==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.139.0", + "node-opcua-debug": "2.153.0", + "node-opcua-object-registry": "2.153.0", + "node-opcua-types": "2.155.0", + "sterfive-bonjour-service": "1.1.4" + } + }, + "node_modules/node-opcua-service-endpoints": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-endpoints/-/node-opcua-service-endpoints-2.155.0.tgz", + "integrity": "sha512-2jIkTsBeb3/8+KGymdLjYGkKgmBkmPrMYUIT8maHyVRAeznwkL97p+90QJELOOz3eGueA31afofjbCJ6lYIAbg==", + "license": "MIT", + "dependencies": { + "node-opcua-types": "2.155.0" + } + }, + "node_modules/node-opcua-service-filter": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-filter/-/node-opcua-service-filter-2.155.0.tgz", + "integrity": "sha512-hdjpzQYPXvAKtk11A8NZfHASDe3FiHNbnFHZtwHYqv/wm9f3I9bH5+hLjBjIh6us3/OS4dRGqiSHA8iOUYSZZg==", + "license": "MIT", + "dependencies": { + "node-opcua-address-space-base": "2.155.0", + "node-opcua-assert": "2.139.0", + "node-opcua-basic-types": "2.154.0", + "node-opcua-constants": "2.139.0", + "node-opcua-data-model": "2.155.0", + "node-opcua-data-value": "2.155.0", + "node-opcua-debug": "2.153.0", + "node-opcua-extension-object": "2.155.0", + "node-opcua-nodeid": "2.153.0", + "node-opcua-service-translate-browse-path": "2.155.0", + "node-opcua-status-code": "2.153.0", + "node-opcua-types": "2.155.0", + "node-opcua-variant": "2.155.0" + } + }, + "node_modules/node-opcua-service-history": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-history/-/node-opcua-service-history-2.155.0.tgz", + "integrity": "sha512-SHC8ye7WJRtYgNHiFOIYQF5iX/MYF1t8b5uISDxT0u3WnTyp+hZeDlzCIB/wVP/69st1FjyxMxJk838khdjvWA==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.139.0", + "node-opcua-data-value": "2.155.0", + "node-opcua-types": "2.155.0" + } + }, + "node_modules/node-opcua-service-node-management": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-node-management/-/node-opcua-service-node-management-2.155.0.tgz", + "integrity": "sha512-89w4FTDUrt31Oal5/EtcGtg9XPq2TVIFWVdc+jbxUx3J4FRsuW8j85Xx6P636qAV1YXi8roWXOEi6/wdSwGvtA==", + "license": "MIT", + "dependencies": { + "node-opcua-types": "2.155.0" + } + }, + "node_modules/node-opcua-service-query": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-query/-/node-opcua-service-query-2.155.0.tgz", + "integrity": "sha512-5iotbH6dFiqGvyOFhHudPurhF+ugYeF5JtWstR4TILePsdn+XhTvpN+A086XsOR00GSxgOKbiyFCwsjul8AzjA==", + "license": "MIT", + "dependencies": { + "node-opcua-types": "2.155.0" + } + }, + "node_modules/node-opcua-service-read": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-read/-/node-opcua-service-read-2.155.0.tgz", + "integrity": "sha512-GYOUe8w2FmwYllyT/M8b4cplyQqnSzXc0JkBxGSvgfIpgifzOJEzh4ExGSZfkYK694EBMUbBxMWnpYfLjPd23A==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.139.0", + "node-opcua-data-model": "2.155.0", + "node-opcua-data-value": "2.155.0", + "node-opcua-service-secure-channel": "2.155.0", + "node-opcua-types": "2.155.0" + } + }, + "node_modules/node-opcua-service-register-node": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-register-node/-/node-opcua-service-register-node-2.155.0.tgz", + "integrity": "sha512-9+FIF6e11Pw9ehlcf6W4br8v9nvHaLyrP4H23bKmuj/DvAwovEnyJyATK1zglR99OfZEp5mXP9jGuMzoyQ/FyQ==", + "license": "MIT", + "dependencies": { + "node-opcua-types": "2.155.0" + } + }, + "node_modules/node-opcua-service-secure-channel": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-secure-channel/-/node-opcua-service-secure-channel-2.155.0.tgz", + "integrity": "sha512-YF7KWHjdTepShzAazUfci0fhHUbP9DCwW1rOwp+i+CNWIR7e2f8U9hvkmmhFbryrEjPybrMJ8N9W62cO7NuTsA==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.139.0", + "node-opcua-basic-types": "2.154.0", + "node-opcua-binary-stream": "2.153.0", + "node-opcua-factory": "2.155.0", + "node-opcua-types": "2.155.0" + } + }, + "node_modules/node-opcua-service-session": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-session/-/node-opcua-service-session-2.155.0.tgz", + "integrity": "sha512-xbDlJ2Iv7gqm5ma+3DOWQqTbCOoq1++yVoebjcaUrhKvBQSBz3as+bOu47B355rAQSQ9e70E4AB47N8WYoFIaA==", + "license": "MIT", + "dependencies": { + "node-opcua-factory": "2.155.0", + "node-opcua-types": "2.155.0" + } + }, + "node_modules/node-opcua-service-subscription": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-subscription/-/node-opcua-service-subscription-2.155.0.tgz", + "integrity": "sha512-MgSbZIeYqasPQEHCjPERWNDQ08TUi59B/VMQ21zuwa8AqfElW3zMEHLiSgzZYMgLGWeSlDs02SWGjVbS4wN3OQ==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.139.0", + "node-opcua-types": "2.155.0", + "node-opcua-variant": "2.155.0" + } + }, + "node_modules/node-opcua-service-translate-browse-path": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-translate-browse-path/-/node-opcua-service-translate-browse-path-2.155.0.tgz", + "integrity": "sha512-iPONcmX/avD+bQi8SWsaK2W9wr9XPkDhxulKbGJ7z6RyIWp4SFvgdSvUyJ+z5NAl2QmqsD6xICaxOpmqcdeDGQ==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.139.0", + "node-opcua-constants": "2.139.0", + "node-opcua-data-model": "2.155.0", + "node-opcua-nodeid": "2.153.0", + "node-opcua-types": "2.155.0" + } + }, + "node_modules/node-opcua-service-write": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-service-write/-/node-opcua-service-write-2.155.0.tgz", + "integrity": "sha512-1F0VHGgIguz+JtyK2SsdU+/riDt0U+dsIboD2UPMJHuo4FpHa7XYuG4Eqnq2oQQzA0kasFEX3VNCFgxFfXJVRw==", + "license": "MIT", + "dependencies": { + "node-opcua-types": "2.155.0" + } + }, + "node_modules/node-opcua-status-code": { + "version": "2.153.0", + "resolved": "https://registry.npmjs.org/node-opcua-status-code/-/node-opcua-status-code-2.153.0.tgz", + "integrity": "sha512-CsAmJt4fEOAK+W/ex2q3UwGvlPPKKw/KD3/ImWjMv8JC0hL/pYojH/QqBrybyO+tuzv1RHr8HkvbpZZ0ShG5UQ==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.139.0", + "node-opcua-binary-stream": "2.153.0" + } + }, + "node_modules/node-opcua-transport": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-transport/-/node-opcua-transport-2.155.0.tgz", + "integrity": "sha512-iWUKibcUtZ8oJ2zbdMx/LR0O21afqvBAGovlCge5C1it0QVd6+ee2kfGnUkSMW4Q7vTLKHfAnFdb/2gb2P6MLA==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.139.0", + "node-opcua-basic-types": "2.154.0", + "node-opcua-binary-stream": "2.153.0", + "node-opcua-buffer-utils": "2.153.0", + "node-opcua-chunkmanager": "2.155.0", + "node-opcua-debug": "2.153.0", + "node-opcua-factory": "2.155.0", + "node-opcua-object-registry": "2.153.0", + "node-opcua-packet-assembler": "2.153.0", + "node-opcua-status-code": "2.153.0", + "node-opcua-utils": "2.153.0" + } + }, + "node_modules/node-opcua-types": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-types/-/node-opcua-types-2.155.0.tgz", + "integrity": "sha512-nT4c7Q9yVmQzWBCoJ4cenycyNvxuiA0ZJ71eisOc2bJ0tdYl7Vvi/N7vspoZ9zRaWQtf8FeM/mu/wduG3hdnjw==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.139.0", + "node-opcua-basic-types": "2.154.0", + "node-opcua-binary-stream": "2.153.0", + "node-opcua-data-model": "2.155.0", + "node-opcua-data-value": "2.155.0", + "node-opcua-enum": "2.153.0", + "node-opcua-extension-object": "2.155.0", + "node-opcua-factory": "2.155.0", + "node-opcua-generator": "2.155.0", + "node-opcua-nodeid": "2.153.0", + "node-opcua-numeric-range": "2.155.0", + "node-opcua-status-code": "2.153.0", + "node-opcua-variant": "2.155.0" + } + }, + "node_modules/node-opcua-utils": { + "version": "2.153.0", + "resolved": "https://registry.npmjs.org/node-opcua-utils/-/node-opcua-utils-2.153.0.tgz", + "integrity": "sha512-5H9b3d1wRou50Ozfa/L4iEBfuBUWSbwGTSrw13EWop354EZ+DC1DVx0ud5xNE0/7mLUezKplJTIFBEV2cKUexA==", + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "node-opcua-assert": "2.139.0" + } + }, + "node_modules/node-opcua-variant": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-variant/-/node-opcua-variant-2.155.0.tgz", + "integrity": "sha512-9Kxa2dEo14JgAdB8tcrMNz7COMjXYqeIbwlUWaEjCk3wZng0vcyOO9EX65LXkvN8q9UGjnRyaEa/W6tF6TK8zw==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.139.0", + "node-opcua-basic-types": "2.154.0", + "node-opcua-binary-stream": "2.153.0", + "node-opcua-data-model": "2.155.0", + "node-opcua-enum": "2.153.0", + "node-opcua-factory": "2.155.0", + "node-opcua-nodeid": "2.153.0", + "node-opcua-utils": "2.153.0" + } + }, + "node_modules/node-opcua-vendor-diagnostic": { + "version": "2.156.0", + "resolved": "https://registry.npmjs.org/node-opcua-vendor-diagnostic/-/node-opcua-vendor-diagnostic-2.156.0.tgz", + "integrity": "sha512-ZVR/t0htfo77FM7Ii7rtV1AXDD54g+qiXswybxt+Ae3Z91U1Ktx6n45QLzQ06ObiCKw6h9ShTFH1FHK7jB5J0Q==", + "license": "MIT", + "dependencies": { + "humanize": "0.0.9", + "node-opcua-address-space": "2.156.0", + "node-opcua-assert": "2.139.0", + "node-opcua-constants": "2.139.0", + "node-opcua-debug": "2.153.0", + "node-opcua-server": "2.156.0", + "node-opcua-status-code": "2.153.0", + "node-opcua-variant": "2.155.0" + } + }, + "node_modules/node-opcua-xml2json": { + "version": "2.155.0", + "resolved": "https://registry.npmjs.org/node-opcua-xml2json/-/node-opcua-xml2json-2.155.0.tgz", + "integrity": "sha512-8/shfup08D/yYew2zSDIQK1M9goifF+hHsJ7U0hdMM9zNPNdKgv9CdcdVfRY3PGa6YFGbgmlTbHPPtMcWVwd0Q==", + "license": "MIT", + "dependencies": { + "node-opcua-assert": "2.139.0", + "node-opcua-utils": "2.153.0", + "xml-writer": "^1.7.0" + } + }, + "node_modules/number-allocator": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.14.tgz", + "integrity": "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.1", + "js-sdsl": "4.3.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, + "node_modules/pg": { + "version": "8.16.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", + "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", + "license": "MIT", + "dependencies": { + "pg-connection-string": "^2.9.1", + "pg-pool": "^3.10.1", + "pg-protocol": "^1.10.3", + "pg-types": "2.2.0", + "pgpass": "1.0.5" + }, + "engines": { + "node": ">= 16.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.2.7" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz", + "integrity": "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==", + "license": "MIT", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz", + "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.1.tgz", + "integrity": "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", + "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/precond": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", + "integrity": "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz", + "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/recast": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.21.5.tgz", + "integrity": "sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==", + "license": "MIT", + "dependencies": { + "ast-types": "0.15.2", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/redis": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/redis/-/redis-5.6.1.tgz", + "integrity": "sha512-O9DwAvcBm/lrlkGE0A6gNBtUdA8J9oD9njeLYlLzmm+MGTR7nd7VkpspfXqeXFg3gm89zldDqckyaHhXfhY80g==", + "license": "MIT", + "dependencies": { + "@redis/bloom": "5.6.1", + "@redis/client": "5.6.1", + "@redis/json": "5.6.1", + "@redis/search": "5.6.1", + "@redis/time-series": "5.6.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "license": "ISC", + "dependencies": { + "glob": "^9.2.0" + }, + "bin": { + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "license": "ISC" + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.6.tgz", + "integrity": "sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA==", + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "license": "BSD-3-Clause" + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sshpk/node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "license": "MIT" + }, + "node_modules/sterfive-bonjour-service": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sterfive-bonjour-service/-/sterfive-bonjour-service-1.1.4.tgz", + "integrity": "sha512-QqDpnBb3KLD6ytdY2KSxsynw1jJAvzfOloQt83GQNXO6CGf84ZY+37tpOEZo1FzgUkFiVsL7pYyg71olDppI/w==", + "license": "MIT", + "dependencies": { + "@types/multicast-dns": "^7.2.1", + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.4" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/thenify-ex": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/thenify-ex/-/thenify-ex-4.4.0.tgz", + "integrity": "sha512-YHA/2DlY1vWpqGLCc7BzdT9aTrqyHCbsX5J3zbW68LLeD4RPwd+2tMEWshMP+27ikuTnaeKbFDmjqc7fKWmDew==", + "license": "MIT" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" + }, + "node_modules/title-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", + "integrity": "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/transliteration": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/transliteration/-/transliteration-2.3.5.tgz", + "integrity": "sha512-HAGI4Lq4Q9dZ3Utu2phaWgtm3vB6PkLUFqWAScg/UW+1eZ/Tg6Exo4oC0/3VUol/w4BlefLhUUSVBr/9/ZGQOw==", + "license": "MIT", + "dependencies": { + "yargs": "^17.5.1" + }, + "bin": { + "slugify": "dist/bin/slugify", + "transliterate": "dist/bin/transliterate" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsyringe": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", + "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", + "license": "MIT", + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/tsyringe/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "license": "MIT", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "license": "Unlicense" + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/webcrypto-core": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.8.1.tgz", + "integrity": "sha512-P+x1MvlNCXlKbLSOY4cYrdreqPG5hbzkmawbcXLKN/mf6DZW0SdNNkZ+sjwsqVkI4A4Ko2sPZmkZtCKY58w83A==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.3.13", + "@peculiar/json-schema": "^1.1.12", + "asn1js": "^3.0.5", + "pvtsutils": "^1.3.5", + "tslib": "^2.7.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/wget-improved-2": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/wget-improved-2/-/wget-improved-2-3.3.0.tgz", + "integrity": "sha512-NSPde/8mUqgmznPhO7oB5gS8IVUlR7GOlY857IaAf3PkkHbx/6FwZxUhW+GRP1GQbZDnCMF5fPieWXFng8Z43A==", + "license": "MIT", + "dependencies": { + "minimist": "1.2.6", + "tunnel": "0.0.6" + }, + "bin": { + "nwget": "bin/nwget" + }, + "engines": { + "node": ">= 0.6.18" + } + }, + "node_modules/wget-improved-2/node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "license": "MIT" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/worker-factory": { + "version": "7.0.44", + "resolved": "https://registry.npmjs.org/worker-factory/-/worker-factory-7.0.44.tgz", + "integrity": "sha512-08AuUfWi+KeZI+KC7nU4pU/9tDeAFvE5NSWk+K9nIfuQc6UlOsZtjjeGVYVEn+DEchyXNJ5i10HCn0xRzFXEQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.27.6", + "fast-unique-numbers": "^9.0.22", + "tslib": "^2.8.1" + } + }, + "node_modules/worker-timers": { + "version": "8.0.23", + "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-8.0.23.tgz", + "integrity": "sha512-1BnWHNNiu5YEutgF7eVZEqNntAsij2oG0r66xDdScoY3fKGFrok2y0xA8OgG6FA+3srrmAplSY6JN5h9jV5D0w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.27.6", + "tslib": "^2.8.1", + "worker-timers-broker": "^8.0.9", + "worker-timers-worker": "^9.0.9" + } + }, + "node_modules/worker-timers-broker": { + "version": "8.0.9", + "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-8.0.9.tgz", + "integrity": "sha512-WJsd7aIvu2GBTXp7IBGT1NKnt3ZbiJ2wqb7Pl4nFJXC8pek84+X68TJGVvvrqwHgHPNxSlzpU1nadhcW4PDD7A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.27.6", + "broker-factory": "^3.1.8", + "fast-unique-numbers": "^9.0.22", + "tslib": "^2.8.1", + "worker-timers-worker": "^9.0.9" + } + }, + "node_modules/worker-timers-worker": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-9.0.9.tgz", + "integrity": "sha512-OOKTMdHbzx7FaXCW40RS8RxAqLF/R8xU5/YA7CFasDy+jBA5yQWUusSQJUFFTV2Z9ZOpnR+ZWgte/IuAqOAEVw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.27.6", + "tslib": "^2.8.1", + "worker-factory": "^7.0.44" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-writer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/xml-writer/-/xml-writer-1.7.0.tgz", + "integrity": "sha512-elFVMRiV5jb59fbc87zzVa0C01QLBEWP909mRuWqFqrYC5wNTH5QW4AaKMNv7d6zAsuOulkD7wnztZNLQW0Nfg==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", + "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "pend": "~1.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/zod": { + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", + "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/custom_nodes_for_n8n-master/package.json b/custom_nodes_for_n8n-master/package.json new file mode 100644 index 0000000..78d68fc --- /dev/null +++ b/custom_nodes_for_n8n-master/package.json @@ -0,0 +1,29 @@ +{ + "name": "custom-nodes", + "version": "1.0.0", + "n8n": { + "nodes": "dist" + }, + "scripts": { + "build": "tsc" + }, + "dependencies": { + "fast-xml-parser": "^5.2.5", + "luxon": "^3.7.1", + "mqtt": "^5.14.0", + "n8n-workflow": "^1.82.0", + "node-cron": "^4.2.1", + "node-fetch": "^2.7.0", + "node-opcua": "^2.156.0", + "pg": "^8.16.3", + "redis": "^5.6.1" + }, + "devDependencies": { + "@types/luxon": "^3.7.1", + "@types/node": "^20.5.1", + "@types/node-fetch": "^2.6.13", + "@types/pg": "^8.15.5", + "@types/redis": "^4.0.10", + "typescript": "^5.8.3" + } +} diff --git a/custom_nodes_for_n8n-master/tsconfig.json b/custom_nodes_for_n8n-master/tsconfig.json new file mode 100644 index 0000000..c50eb74 --- /dev/null +++ b/custom_nodes_for_n8n-master/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "CommonJS", + "declaration": true, + "outDir": "dist", + + "rootDir": "./", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true + }, + + "include": ["nodes/**/*.ts"] +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100755 index 0000000..4d8a588 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,135 @@ +services: + n8n: + image: n8n/n8n + build: + context: . + dockerfile: Dockerfile + restart: no + ports: + - "5678:5678" + environment: + - N8N_FEATURE_FLAG_PROJECTS=true + - N8N_PROJECT_MANAGEMENT_STORAGE_TYPE=filesystem + - N8N_PROJECT_MANAGEMENT_STORAGE_PATH=/home/node/.n8n/projects + - NODE_FUNCTION_ALLOW_BUILTIN=* + - NODE_FUNCTION_ALLOW_EXTERNAL=node-opcua,redis + - REDIS_HOST=dev.re.promuc.local + - REDIS_PORT=6379 + - dbhost=dev.re.promuc.local + - dbname=promuc + - dbpassword=changeme + - dbuser=postgres + - dbport=5432 + + - mqtthost=dev.re.promuc.local + - mqttport=1883 + - mqttpassword=user + - mqttuser=user + + - OPChost=dev.re.promuc.local + - OPCport=4840 + + - OPCobjects=dev_re_promuc_local + - OWEN_host=10.186.6.31 + - OWEN_port=4840 + - PromTVinfo=http://10.186.6.21/device/info/all + - PGRST_HOST=dev.re.promuc.local + - PGRST_PORT=3000 + - N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom/nodes + - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true + - N8N_RUNNERS_ENABLED=true + - N8N_DIAGNOSTICS_ENABLED=false + - N8N_HIDE_USAGE_SURVEY=true + volumes: + - ./n8n_data:/home/node/.n8n + - ./custom_nodes_for_n8n-master/dist/nodes:/home/node/.n8n/custom/nodes + + extra_hosts: + - "dev.re.promuc.local:10.186.1.203" + zookeeper: + image: confluentinc/cp-zookeeper:7.2.1 + hostname: zookeeper + container_name: zookeeper + ports: + - "2181:2181" + environment: + ZOOKEEPER_CLIENT_PORT: 2181 + ZOOKEEPER_TICK_TIME: 2000 + + kafka: + image: confluentinc/cp-server:7.2.1 + hostname: kafka + restart: on-failure + container_name: kafka + depends_on: + - zookeeper + ports: + - "9092:9092" + - "9997:9997" + environment: + KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181' + KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT + KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092 + KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 + KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 + KAFKA_CONFLUENT_LICENSE_TOPIC_REPLICATION_FACTOR: 1 + KAFKA_CONFLUENT_BALANCER_TOPIC_REPLICATION_FACTOR: 1 + KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 + KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 + KAFKA_JMX_PORT: 9997 + KAFKA_JMX_HOSTNAME: kafka + + kafka-ui: + container_name: kafka-ui + image: provectuslabs/kafka-ui:latest + ports: + - 8082:8080 + environment: + DYNAMIC_CONFIG_ENABLED: true + KAFKA_CLUSTERS_0_NAME: local + KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:29092 + depends_on: + - kafka + + kibana: + image: kibana:7.16.1 + container_name: kib + ports: + - "5601:5601" + depends_on: + - elasticsearch + logging: + driver: none + + schema-registry: + image: confluentinc/cp-schema-registry:7.2.1 + hostname: schema-registry + container_name: schema-registry + depends_on: + - zookeeper + - kafka + ports: + - "8081:8081" + environment: + SCHEMA_REGISTRY_HOST_NAME: schema-registry + SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS: 'PLAINTEXT://kafka:29092' + SCHEMA_REGISTRY_LISTENERS: http://0.0.0.0:8081 + SCHEMA_REGISTRY_ADVERTISED_LISTENERS: 'PLAINTEXT://schema-registry:8081' + + elasticsearch: + image: elasticsearch:7.16.1 + container_name: elasticsearch + environment: + discovery.type: single-node + ES_JAVA_OPTS: "-Xms512m -Xmx512m" + ports: + - "9200:9200" + - "9300:9300" + healthcheck: + test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"] + interval: 10s + timeout: 10s + retries: 3 + logging: + driver: none + diff --git a/n8n_data/config b/n8n_data/config new file mode 100644 index 0000000..77dfeec --- /dev/null +++ b/n8n_data/config @@ -0,0 +1,3 @@ +{ + "encryptionKey": "pmk5oJi+piEp1JIALZHC18bYJv7ff4Dm" +} \ No newline at end of file diff --git a/n8n_data/crash.journal b/n8n_data/crash.journal new file mode 100644 index 0000000..e69de29 diff --git a/n8n_data/custom_nodes/ReturnTextNode/ReturnTextNode.ts b/n8n_data/custom_nodes/ReturnTextNode/ReturnTextNode.ts new file mode 100644 index 0000000..f5007fa --- /dev/null +++ b/n8n_data/custom_nodes/ReturnTextNode/ReturnTextNode.ts @@ -0,0 +1,43 @@ +import { INodeType, INodeTypeDescription, INodeExecutionData, IExecuteFunctions } from 'n8n-workflow'; + +export class ReturnTextNode implements INodeType { + description: INodeTypeDescription = { + displayName: 'Return Text', + name: 'returnTextNode', + group: ['transform'], + version: 1, + description: 'Returns user input as text', + defaults: { + name: 'Return Text', + }, + inputs: ['main'], + outputs: ['main'], + properties: [ + { + displayName: 'Text to Return', + name: 'message', + type: 'string', + default: '', + placeholder: 'Type your message here...', + required: true, + description: 'Message to return', + }, + ], + }; + + async execute(this: IExecuteFunctions): Promise { + const returnData: INodeExecutionData[] = []; + + for (let i = 0; i < this.getInputData().length; i++) { + const message = this.getNodeParameter('message', i) as string; + + returnData.push({ + json: { + message, + }, + }); + } + + return [returnData]; + } +} diff --git a/n8n_data/database.sqlite b/n8n_data/database.sqlite new file mode 100644 index 0000000..81f64b2 Binary files /dev/null and b/n8n_data/database.sqlite differ diff --git a/n8n_data/n8nEventLog-1.log b/n8n_data/n8nEventLog-1.log new file mode 100644 index 0000000..a251ab4 --- /dev/null +++ b/n8n_data/n8nEventLog-1.log @@ -0,0 +1,18 @@ +{"__type":"$$EventMessageWorkflow","id":"38fb003c-e637-4784-a6ca-26354fd6adef","ts":"2025-08-14T09:20:16.277+00:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"16517","workflowId":"qiPDdm8n03EB1TEH","isManual":false,"workflowName":"My workflow 3"}} +{"__type":"$$EventMessageConfirm","confirm":"38fb003c-e637-4784-a6ca-26354fd6adef","ts":"2025-08-14T09:20:16.277+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageNode","id":"bba6c554-26aa-4760-9e75-3a72ff02161a","ts":"2025-08-14T09:20:16.278+00:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"qiPDdm8n03EB1TEH","workflowName":"My workflow 3","executionId":"16517","nodeType":"CUSTOM.generatorNode","nodeName":"Generator","nodeId":"0a0d7e4e-f0b5-4700-85cd-8c07800c94d7"}} +{"__type":"$$EventMessageConfirm","confirm":"bba6c554-26aa-4760-9e75-3a72ff02161a","ts":"2025-08-14T09:20:16.278+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageNode","id":"0f223c3f-87c9-483a-a76c-d93d888cbd51","ts":"2025-08-14T09:20:17.284+00:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"qiPDdm8n03EB1TEH","workflowName":"My workflow 3","executionId":"16517","nodeType":"CUSTOM.generatorNode","nodeName":"Generator","nodeId":"0a0d7e4e-f0b5-4700-85cd-8c07800c94d7"}} +{"__type":"$$EventMessageConfirm","confirm":"0f223c3f-87c9-483a-a76c-d93d888cbd51","ts":"2025-08-14T09:20:17.284+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageWorkflow","id":"dc742c96-820a-4321-b2cf-ee4301f06af3","ts":"2025-08-14T09:20:17.285+00:00","eventName":"n8n.workflow.success","message":"n8n.workflow.success","payload":{"userId":"a63ef5f0-aafa-4080-ad3f-07f0ef522852","executionId":"16517","success":true,"isManual":true,"workflowId":"qiPDdm8n03EB1TEH","workflowName":"My workflow 3"}} +{"__type":"$$EventMessageConfirm","confirm":"dc742c96-820a-4321-b2cf-ee4301f06af3","ts":"2025-08-14T09:20:17.285+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageWorkflow","id":"3aca5b31-2111-4c9d-93a9-1b96be5ef1cc","ts":"2025-08-14T09:20:44.070+00:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"16518","workflowId":"qiPDdm8n03EB1TEH","isManual":false,"workflowName":"My workflow 3"}} +{"__type":"$$EventMessageConfirm","confirm":"3aca5b31-2111-4c9d-93a9-1b96be5ef1cc","ts":"2025-08-14T09:20:44.070+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageNode","id":"c89133f4-e945-439c-a691-11ab03924227","ts":"2025-08-14T09:20:44.070+00:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"qiPDdm8n03EB1TEH","workflowName":"My workflow 3","executionId":"16518","nodeType":"CUSTOM.opcWrite","nodeName":"OPCWrite","nodeId":"402da9a8-56fc-490b-9b43-ebd0b611a4d2"}} +{"__type":"$$EventMessageConfirm","confirm":"c89133f4-e945-439c-a691-11ab03924227","ts":"2025-08-14T09:20:44.070+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageNode","id":"38b53f14-3e99-4f53-b72b-e3f6273d6ffa","ts":"2025-08-14T09:20:44.099+00:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"qiPDdm8n03EB1TEH","workflowName":"My workflow 3","executionId":"16518","nodeType":"CUSTOM.opcWrite","nodeName":"OPCWrite","nodeId":"402da9a8-56fc-490b-9b43-ebd0b611a4d2"}} +{"__type":"$$EventMessageConfirm","confirm":"38b53f14-3e99-4f53-b72b-e3f6273d6ffa","ts":"2025-08-14T09:20:44.099+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageWorkflow","id":"60006334-1803-428a-bd2e-ce181a2366f9","ts":"2025-08-14T09:20:44.099+00:00","eventName":"n8n.workflow.failed","message":"n8n.workflow.failed","payload":{"userId":"a63ef5f0-aafa-4080-ad3f-07f0ef522852","executionId":"16518","success":false,"isManual":true,"workflowId":"qiPDdm8n03EB1TEH","workflowName":"My workflow 3","lastNodeExecuted":"OPCWrite","errorMessage":"this.replaceEnvVars is not a function"}} +{"__type":"$$EventMessageConfirm","confirm":"60006334-1803-428a-bd2e-ce181a2366f9","ts":"2025-08-14T09:20:44.100+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageAudit","id":"1b591b32-676c-430a-8bdd-845a004f5530","ts":"2025-08-14T09:20:47.190+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"a63ef5f0-aafa-4080-ad3f-07f0ef522852","_email":"leoleonkis3@gmail.com","_firstName":"Андрей","_lastName":"Киселёв","globalRole":"global:owner","workflowId":"qiPDdm8n03EB1TEH","workflowName":"My workflow 3"}} +{"__type":"$$EventMessageConfirm","confirm":"1b591b32-676c-430a-8bdd-845a004f5530","ts":"2025-08-14T09:20:47.190+00:00","source":{"id":"0","name":"eventBus"}} diff --git a/n8n_data/n8nEventLog-2.log b/n8n_data/n8nEventLog-2.log new file mode 100644 index 0000000..3ca3abe --- /dev/null +++ b/n8n_data/n8nEventLog-2.log @@ -0,0 +1,16 @@ +{"__type":"$$EventMessageWorkflow","id":"c8e63be8-25fc-4dc5-badd-a2535cda9e50","ts":"2025-08-14T09:15:00.048+00:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"16515","workflowId":"qiPDdm8n03EB1TEH","isManual":false,"workflowName":"My workflow 3"}} +{"__type":"$$EventMessageConfirm","confirm":"c8e63be8-25fc-4dc5-badd-a2535cda9e50","ts":"2025-08-14T09:15:00.048+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageNode","id":"33ec76e7-8733-4bb2-85b1-1c6a46333c91","ts":"2025-08-14T09:15:00.049+00:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"qiPDdm8n03EB1TEH","workflowName":"My workflow 3","executionId":"16515","nodeType":"CUSTOM.generatorNode","nodeName":"Generator","nodeId":"19ea6183-2637-4cde-9553-bc7a51337b95"}} +{"__type":"$$EventMessageConfirm","confirm":"33ec76e7-8733-4bb2-85b1-1c6a46333c91","ts":"2025-08-14T09:15:00.049+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageNode","id":"c4cb4c24-9f8e-47ac-a95a-4552d0853689","ts":"2025-08-14T09:15:01.055+00:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"qiPDdm8n03EB1TEH","workflowName":"My workflow 3","executionId":"16515","nodeType":"CUSTOM.generatorNode","nodeName":"Generator","nodeId":"19ea6183-2637-4cde-9553-bc7a51337b95"}} +{"__type":"$$EventMessageConfirm","confirm":"c4cb4c24-9f8e-47ac-a95a-4552d0853689","ts":"2025-08-14T09:15:01.055+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageWorkflow","id":"05fde6c1-705e-4253-a680-75a2e7bbcebb","ts":"2025-08-14T09:15:01.060+00:00","eventName":"n8n.workflow.success","message":"n8n.workflow.success","payload":{"userId":"a63ef5f0-aafa-4080-ad3f-07f0ef522852","executionId":"16515","success":true,"isManual":true,"workflowId":"qiPDdm8n03EB1TEH","workflowName":"My workflow 3"}} +{"__type":"$$EventMessageConfirm","confirm":"05fde6c1-705e-4253-a680-75a2e7bbcebb","ts":"2025-08-14T09:15:01.061+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageWorkflow","id":"a5d16b8d-7c25-4bde-a06f-3014bc549338","ts":"2025-08-14T09:15:49.583+00:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"16516","workflowId":"qiPDdm8n03EB1TEH","isManual":false,"workflowName":"My workflow 3"}} +{"__type":"$$EventMessageConfirm","confirm":"a5d16b8d-7c25-4bde-a06f-3014bc549338","ts":"2025-08-14T09:15:49.583+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageNode","id":"be7de743-7e33-4e76-882c-1ce21776e04b","ts":"2025-08-14T09:15:49.584+00:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"qiPDdm8n03EB1TEH","workflowName":"My workflow 3","executionId":"16516","nodeType":"CUSTOM.opcWrite","nodeName":"OPCWrite","nodeId":"33f19896-7f56-44fc-a8fe-fac6a145d0e6"}} +{"__type":"$$EventMessageConfirm","confirm":"be7de743-7e33-4e76-882c-1ce21776e04b","ts":"2025-08-14T09:15:49.584+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageNode","id":"6324a10e-bbbd-413a-b766-00b31130afff","ts":"2025-08-14T09:15:49.611+00:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"qiPDdm8n03EB1TEH","workflowName":"My workflow 3","executionId":"16516","nodeType":"CUSTOM.opcWrite","nodeName":"OPCWrite","nodeId":"33f19896-7f56-44fc-a8fe-fac6a145d0e6"}} +{"__type":"$$EventMessageConfirm","confirm":"6324a10e-bbbd-413a-b766-00b31130afff","ts":"2025-08-14T09:15:49.611+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageWorkflow","id":"8bd8e441-b933-41a5-9bee-07600dba068d","ts":"2025-08-14T09:15:49.612+00:00","eventName":"n8n.workflow.failed","message":"n8n.workflow.failed","payload":{"userId":"a63ef5f0-aafa-4080-ad3f-07f0ef522852","executionId":"16516","success":false,"isManual":true,"workflowId":"qiPDdm8n03EB1TEH","workflowName":"My workflow 3","lastNodeExecuted":"OPCWrite","errorMessage":"self.replaceEnvVars is not a function"}} +{"__type":"$$EventMessageConfirm","confirm":"8bd8e441-b933-41a5-9bee-07600dba068d","ts":"2025-08-14T09:15:49.612+00:00","source":{"id":"0","name":"eventBus"}} diff --git a/n8n_data/n8nEventLog-3.log b/n8n_data/n8nEventLog-3.log new file mode 100644 index 0000000..61f5cd1 --- /dev/null +++ b/n8n_data/n8nEventLog-3.log @@ -0,0 +1,26 @@ +{"__type":"$$EventMessageAudit","id":"e34c4bac-a387-4489-bd8c-1b6316cb75e7","ts":"2025-08-14T08:51:24.530+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"a63ef5f0-aafa-4080-ad3f-07f0ef522852","_email":"leoleonkis3@gmail.com","_firstName":"Андрей","_lastName":"Киселёв","globalRole":"global:owner","workflowId":"qiPDdm8n03EB1TEH","workflowName":"My workflow 3"}} +{"__type":"$$EventMessageConfirm","confirm":"e34c4bac-a387-4489-bd8c-1b6316cb75e7","ts":"2025-08-14T08:51:24.531+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageWorkflow","id":"62132895-92f2-426a-92f5-319fa7bdc430","ts":"2025-08-14T08:55:22.253+00:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"16512","workflowId":"qiPDdm8n03EB1TEH","isManual":false,"workflowName":"My workflow 3"}} +{"__type":"$$EventMessageConfirm","confirm":"62132895-92f2-426a-92f5-319fa7bdc430","ts":"2025-08-14T08:55:22.253+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageNode","id":"d2073fa0-5041-4a81-9a11-1193f7f5c93c","ts":"2025-08-14T08:55:22.254+00:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"qiPDdm8n03EB1TEH","workflowName":"My workflow 3","executionId":"16512","nodeType":"CUSTOM.generatorNode","nodeName":"Generator","nodeId":"deee8837-17a9-4c7a-8468-fdc2ab61c85d"}} +{"__type":"$$EventMessageConfirm","confirm":"d2073fa0-5041-4a81-9a11-1193f7f5c93c","ts":"2025-08-14T08:55:22.254+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageNode","id":"66d38d8a-e3b8-406b-843a-be36a7ce8c88","ts":"2025-08-14T08:55:23.260+00:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"qiPDdm8n03EB1TEH","workflowName":"My workflow 3","executionId":"16512","nodeType":"CUSTOM.generatorNode","nodeName":"Generator","nodeId":"deee8837-17a9-4c7a-8468-fdc2ab61c85d"}} +{"__type":"$$EventMessageConfirm","confirm":"66d38d8a-e3b8-406b-843a-be36a7ce8c88","ts":"2025-08-14T08:55:23.261+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageWorkflow","id":"40e14060-1eb3-49a9-a552-f01e4306a34f","ts":"2025-08-14T08:55:23.266+00:00","eventName":"n8n.workflow.success","message":"n8n.workflow.success","payload":{"userId":"a63ef5f0-aafa-4080-ad3f-07f0ef522852","executionId":"16512","success":true,"isManual":true,"workflowId":"qiPDdm8n03EB1TEH","workflowName":"My workflow 3"}} +{"__type":"$$EventMessageConfirm","confirm":"40e14060-1eb3-49a9-a552-f01e4306a34f","ts":"2025-08-14T08:55:23.266+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageWorkflow","id":"de480afa-7d0a-4f59-858e-d0cebe02b90d","ts":"2025-08-14T09:01:56.440+00:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"16513","workflowId":"qiPDdm8n03EB1TEH","isManual":false,"workflowName":"My workflow 3"}} +{"__type":"$$EventMessageConfirm","confirm":"de480afa-7d0a-4f59-858e-d0cebe02b90d","ts":"2025-08-14T09:01:56.440+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageNode","id":"90f25449-0048-4cc3-aa02-7a6929644528","ts":"2025-08-14T09:01:56.441+00:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"qiPDdm8n03EB1TEH","workflowName":"My workflow 3","executionId":"16513","nodeType":"CUSTOM.opcWrite","nodeName":"OPCWrite","nodeId":"d6d1c615-490f-426c-9703-f350efbde40a"}} +{"__type":"$$EventMessageConfirm","confirm":"90f25449-0048-4cc3-aa02-7a6929644528","ts":"2025-08-14T09:01:56.441+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageNode","id":"4507ba1a-0bdd-4a7b-8527-53ecbc312d0f","ts":"2025-08-14T09:01:56.472+00:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"qiPDdm8n03EB1TEH","workflowName":"My workflow 3","executionId":"16513","nodeType":"CUSTOM.opcWrite","nodeName":"OPCWrite","nodeId":"d6d1c615-490f-426c-9703-f350efbde40a"}} +{"__type":"$$EventMessageConfirm","confirm":"4507ba1a-0bdd-4a7b-8527-53ecbc312d0f","ts":"2025-08-14T09:01:56.472+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageWorkflow","id":"326c245c-db65-4ab4-a4ea-3591fcb4eaf2","ts":"2025-08-14T09:01:56.473+00:00","eventName":"n8n.workflow.failed","message":"n8n.workflow.failed","payload":{"userId":"a63ef5f0-aafa-4080-ad3f-07f0ef522852","executionId":"16513","success":false,"isManual":true,"workflowId":"qiPDdm8n03EB1TEH","workflowName":"My workflow 3","lastNodeExecuted":"OPCWrite","errorMessage":"this.replaceEnvVars is not a function"}} +{"__type":"$$EventMessageConfirm","confirm":"326c245c-db65-4ab4-a4ea-3591fcb4eaf2","ts":"2025-08-14T09:01:56.473+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageWorkflow","id":"f7e79bd7-0c92-437e-b3c6-acc50ae1c1b5","ts":"2025-08-14T09:02:34.541+00:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"16514","workflowId":"qiPDdm8n03EB1TEH","isManual":false,"workflowName":"My workflow 3"}} +{"__type":"$$EventMessageConfirm","confirm":"f7e79bd7-0c92-437e-b3c6-acc50ae1c1b5","ts":"2025-08-14T09:02:34.541+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageNode","id":"8773f968-15a1-4ea3-a738-e3e41f2db407","ts":"2025-08-14T09:02:34.542+00:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"qiPDdm8n03EB1TEH","workflowName":"My workflow 3","executionId":"16514","nodeType":"CUSTOM.opcWrite","nodeName":"OPCWrite","nodeId":"d6d1c615-490f-426c-9703-f350efbde40a"}} +{"__type":"$$EventMessageConfirm","confirm":"8773f968-15a1-4ea3-a738-e3e41f2db407","ts":"2025-08-14T09:02:34.542+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageNode","id":"dcf070b2-64e5-4e89-8a87-0afd633449d2","ts":"2025-08-14T09:02:34.544+00:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"qiPDdm8n03EB1TEH","workflowName":"My workflow 3","executionId":"16514","nodeType":"CUSTOM.opcWrite","nodeName":"OPCWrite","nodeId":"d6d1c615-490f-426c-9703-f350efbde40a"}} +{"__type":"$$EventMessageConfirm","confirm":"dcf070b2-64e5-4e89-8a87-0afd633449d2","ts":"2025-08-14T09:02:34.545+00:00","source":{"id":"0","name":"eventBus"}} +{"__type":"$$EventMessageWorkflow","id":"d653b888-88f6-4463-8efe-7a32e16176ef","ts":"2025-08-14T09:02:34.545+00:00","eventName":"n8n.workflow.failed","message":"n8n.workflow.failed","payload":{"userId":"a63ef5f0-aafa-4080-ad3f-07f0ef522852","executionId":"16514","success":false,"isManual":true,"workflowId":"qiPDdm8n03EB1TEH","workflowName":"My workflow 3","lastNodeExecuted":"OPCWrite","errorMessage":"this.replaceEnvVars is not a function"}} +{"__type":"$$EventMessageConfirm","confirm":"d653b888-88f6-4463-8efe-7a32e16176ef","ts":"2025-08-14T09:02:34.545+00:00","source":{"id":"0","name":"eventBus"}} diff --git a/n8n_data/n8nEventLog.log b/n8n_data/n8nEventLog.log new file mode 100644 index 0000000..e69de29 diff --git a/n8n_data/nodes/package.json b/n8n_data/nodes/package.json new file mode 100755 index 0000000..9e96546 --- /dev/null +++ b/n8n_data/nodes/package.json @@ -0,0 +1,5 @@ +{ + "name": "installed-nodes", + "private": true, + "dependencies": {} +} \ No newline at end of file