From 040329868d4a4dbcede4bfd2b6972821db2ebbf6 Mon Sep 17 00:00:00 2001 From: chulanovskyi-bs Date: Wed, 10 Jul 2024 14:46:16 +0300 Subject: [PATCH 01/18] feat: replaced aws sdk with direct glue client package --- forward_engineering/api.js | 18 +- package-lock.json | 1569 ++++++++++++++--- package.json | 4 +- reverse_engineering/api.js | 4 +- .../helpers/connectionHelper.js | 38 +- 5 files changed, 1337 insertions(+), 296 deletions(-) diff --git a/forward_engineering/api.js b/forward_engineering/api.js index ad335894..5de3cfe9 100644 --- a/forward_engineering/api.js +++ b/forward_engineering/api.js @@ -1,6 +1,6 @@ 'use strict'; -const aws = require('aws-sdk'); +const { GlueClient, CreateDatabaseCommand, CreateTableCommand } = require('@aws-sdk/client-glue'); const { getDatabaseStatement } = require('./helpers/databaseHelper'); const { getTableStatement } = require('./helpers/tableHelper'); const { getIndexes } = require('./helpers/indexHelper'); @@ -142,7 +142,8 @@ module.exports = { } const dbCreatePromises = db.map(async statement => { logger.progress({ message: 'Creating database', containerName: statement.DatabaseInput.Name }); - return await glueInstance.createDatabase(statement).promise(); + const command = new CreateDatabaseCommand(statement); + return await glueInstance.send(command); }); await Promise.all(dbCreatePromises); const tableCreatePromises = table.map(async statement => { @@ -151,7 +152,8 @@ module.exports = { containerName: statement.DatabaseName, entityName: statement.TableInput.Name, }); - return await glueInstance.createTable(statement).promise(); + const command = new CreateTableCommand(statement); + return await glueInstance.send(command); }); await Promise.all(tableCreatePromises); callback(); @@ -192,8 +194,14 @@ const buildAWSCLIModelScript = (containerData, tablesSchemas = {}) => { const getGlueInstance = (connectionInfo, app) => { const { accessKeyId, secretAccessKey, region, sessionToken } = connectionInfo; - aws.config.update({ accessKeyId, secretAccessKey, region, sessionToken }); - return new aws.Glue(); + return new GlueClient({ + region, + credentials: { + accessKeyId, + secretAccessKey, + sessionToken, + }, + }); }; const composeCLIStatements = (statements = []) => { diff --git a/package-lock.json b/package-lock.json index b46acab1..ec5fad58 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,15 @@ { "name": "Glue", - "version": "0.2.1", + "version": "0.2.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "Glue", - "version": "0.2.1", + "version": "0.2.2", "dependencies": { + "@aws-sdk/client-glue": "3.613.0", "antlr4": "4.8.0", - "aws-sdk": "2.1603.0", "lodash": "4.17.21" }, "devDependencies": { @@ -33,6 +33,627 @@ "hackoladePlugin": "1.2.0" } }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-glue": { + "version": "3.613.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-glue/-/client-glue-3.613.0.tgz", + "integrity": "sha512-wkzzWhjTxky5eK7KWEOO1sAHX6b6MABCuuoFMbhv7MaSf+Uxs8IbVWQk6pYKcs1zjSwfIpB6TO1jUlGqdbVczw==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.613.0", + "@aws-sdk/client-sts": "3.613.0", + "@aws-sdk/core": "3.609.0", + "@aws-sdk/credential-provider-node": "3.613.0", + "@aws-sdk/middleware-host-header": "3.609.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.609.0", + "@aws-sdk/middleware-user-agent": "3.609.0", + "@aws-sdk/region-config-resolver": "3.609.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.609.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.609.0", + "@smithy/config-resolver": "^3.0.4", + "@smithy/core": "^2.2.4", + "@smithy/fetch-http-handler": "^3.2.0", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.3", + "@smithy/middleware-endpoint": "^3.0.4", + "@smithy/middleware-retry": "^3.0.7", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.3", + "@smithy/node-http-handler": "^3.1.1", + "@smithy/protocol-http": "^4.0.3", + "@smithy/smithy-client": "^3.1.5", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.7", + "@smithy/util-defaults-mode-node": "^3.0.7", + "@smithy/util-endpoints": "^2.0.4", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.609.0.tgz", + "integrity": "sha512-gqXGFDkIpKHCKAbeJK4aIDt3tiwJ26Rf5Tqw9JS6BYXsdMeOB8FTzqD9R+Yc1epHd8s5L94sdqXT5PapgxFZrg==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.609.0", + "@aws-sdk/middleware-host-header": "3.609.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.609.0", + "@aws-sdk/middleware-user-agent": "3.609.0", + "@aws-sdk/region-config-resolver": "3.609.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.609.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.609.0", + "@smithy/config-resolver": "^3.0.4", + "@smithy/core": "^2.2.4", + "@smithy/fetch-http-handler": "^3.2.0", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.3", + "@smithy/middleware-endpoint": "^3.0.4", + "@smithy/middleware-retry": "^3.0.7", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.3", + "@smithy/node-http-handler": "^3.1.1", + "@smithy/protocol-http": "^4.0.3", + "@smithy/smithy-client": "^3.1.5", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.7", + "@smithy/util-defaults-mode-node": "^3.0.7", + "@smithy/util-endpoints": "^2.0.4", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.613.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.613.0.tgz", + "integrity": "sha512-VINgHA30f6Itjtj6ZAxkx86XhyFYa7UBfv2Ju+9QGcAr2Y3HU+Mh9g6QaTwDqIM5QG6Pgss24NaAItWGJHFf5A==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.609.0", + "@aws-sdk/credential-provider-node": "3.613.0", + "@aws-sdk/middleware-host-header": "3.609.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.609.0", + "@aws-sdk/middleware-user-agent": "3.609.0", + "@aws-sdk/region-config-resolver": "3.609.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.609.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.609.0", + "@smithy/config-resolver": "^3.0.4", + "@smithy/core": "^2.2.4", + "@smithy/fetch-http-handler": "^3.2.0", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.3", + "@smithy/middleware-endpoint": "^3.0.4", + "@smithy/middleware-retry": "^3.0.7", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.3", + "@smithy/node-http-handler": "^3.1.1", + "@smithy/protocol-http": "^4.0.3", + "@smithy/smithy-client": "^3.1.5", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.7", + "@smithy/util-defaults-mode-node": "^3.0.7", + "@smithy/util-endpoints": "^2.0.4", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.613.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.613.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.613.0.tgz", + "integrity": "sha512-S+KvQI4XEivY3vyIY+IPY7Fw8vFvX/q3pkNC9qEhnAs+/w7vT6vhVBHsaugYVlsMuNtNvmyc8P+Q/gzOEtLCTw==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.613.0", + "@aws-sdk/core": "3.609.0", + "@aws-sdk/credential-provider-node": "3.613.0", + "@aws-sdk/middleware-host-header": "3.609.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.609.0", + "@aws-sdk/middleware-user-agent": "3.609.0", + "@aws-sdk/region-config-resolver": "3.609.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.609.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.609.0", + "@smithy/config-resolver": "^3.0.4", + "@smithy/core": "^2.2.4", + "@smithy/fetch-http-handler": "^3.2.0", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.3", + "@smithy/middleware-endpoint": "^3.0.4", + "@smithy/middleware-retry": "^3.0.7", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.3", + "@smithy/node-http-handler": "^3.1.1", + "@smithy/protocol-http": "^4.0.3", + "@smithy/smithy-client": "^3.1.5", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.7", + "@smithy/util-defaults-mode-node": "^3.0.7", + "@smithy/util-endpoints": "^2.0.4", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.609.0.tgz", + "integrity": "sha512-ptqw+DTxLr01+pKjDUuo53SEDzI+7nFM3WfQaEo0yhDg8vWw8PER4sWj1Ysx67ksctnZesPUjqxd5SHbtdBxiA==", + "dependencies": { + "@smithy/core": "^2.2.4", + "@smithy/protocol-http": "^4.0.3", + "@smithy/signature-v4": "^3.1.2", + "@smithy/smithy-client": "^3.1.5", + "@smithy/types": "^3.3.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.609.0.tgz", + "integrity": "sha512-v69ZCWcec2iuV9vLVJMa6fAb5xwkzN4jYIT8yjo2c4Ia/j976Q+TPf35Pnz5My48Xr94EFcaBazrWedF+kwfuQ==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.613.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.613.0.tgz", + "integrity": "sha512-MCiUFxowFzprzIXFXsqbp/3DViJ7nFmBW+XJkoRQWqNmThbkz/E8sb40WmL9UFdZHJph2KDjzABKYH5f0lHZaA==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/fetch-http-handler": "^3.2.0", + "@smithy/node-http-handler": "^3.1.1", + "@smithy/property-provider": "^3.1.3", + "@smithy/protocol-http": "^4.0.3", + "@smithy/smithy-client": "^3.1.5", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.0.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.613.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.613.0.tgz", + "integrity": "sha512-scHV7K0YpllYMWxPnqxssWU+7S3WNXH1m5Rw8Ax96pfcfnaoatiWXps2XSSdGlChdF9gNVnewjRKFOTLyyzdAw==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.609.0", + "@aws-sdk/credential-provider-http": "3.613.0", + "@aws-sdk/credential-provider-process": "3.609.0", + "@aws-sdk/credential-provider-sso": "3.609.0", + "@aws-sdk/credential-provider-web-identity": "3.609.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.1.3", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.613.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.613.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.613.0.tgz", + "integrity": "sha512-n3yd0CDuUKcQFhjRLAQfQpZyZ2ddrHC7QOKQqE+Fkx+Fs5zoG+NRLK1EBkBW/G9zk8Ck4+rG3OOI3CuNpJ2PCw==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.609.0", + "@aws-sdk/credential-provider-http": "3.613.0", + "@aws-sdk/credential-provider-ini": "3.613.0", + "@aws-sdk/credential-provider-process": "3.609.0", + "@aws-sdk/credential-provider-sso": "3.609.0", + "@aws-sdk/credential-provider-web-identity": "3.609.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.1.3", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.609.0.tgz", + "integrity": "sha512-Ux35nGOSJKZWUIM3Ny0ROZ8cqPRUEkh+tR3X2o9ydEbFiLq3eMMyEnHJqx4EeUjLRchidlm4CCid9GxMe5/gdw==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.609.0.tgz", + "integrity": "sha512-oQPGDKMMIxjvTcm86g07RPYeC7mCNk+29dPpY15ZAPRpAF7F0tircsC3wT9fHzNaKShEyK5LuI5Kg/uxsdy+Iw==", + "dependencies": { + "@aws-sdk/client-sso": "3.609.0", + "@aws-sdk/token-providers": "3.609.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.609.0.tgz", + "integrity": "sha512-U+PG8NhlYYF45zbr1km3ROtBMYqyyj/oK8NRp++UHHeuavgrP+4wJ4wQnlEaKvJBjevfo3+dlIBcaeQ7NYejWg==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.609.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.609.0.tgz", + "integrity": "sha512-iTKfo158lc4jLDfYeZmYMIBHsn8m6zX+XB6birCSNZ/rrlzAkPbGE43CNdKfvjyWdqgLMRXF+B+OcZRvqhMXPQ==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", + "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.609.0.tgz", + "integrity": "sha512-6sewsYB7/o/nbUfA99Aa/LokM+a/u4Wpm/X2o0RxOsDtSB795ObebLJe2BxY5UssbGaWkn7LswyfvrdZNXNj1w==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.609.0.tgz", + "integrity": "sha512-nbq7MXRmeXm4IDqh+sJRAxGPAq0OfGmGIwKvJcw66hLoG8CmhhVMZmIAEBDFr57S+YajGwnLLRt+eMI05MMeVA==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.609.0", + "@smithy/protocol-http": "^4.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.609.0.tgz", + "integrity": "sha512-lMHBG8zg9GWYBc9/XVPKyuAUd7iKqfPP7z04zGta2kGNOKbUTeqmAdc1gJGku75p4kglIPlGBorOxti8DhRmKw==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.609.0.tgz", + "integrity": "sha512-WvhW/7XSf+H7YmtiIigQxfDVZVZI7mbKikQ09YpzN7FeN3TmYib1+0tB+EE9TbICkwssjiFc71FEBEh4K9grKQ==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.609.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.609.0.tgz", + "integrity": "sha512-Rh+3V8dOvEeE1aQmUy904DYWtLUEJ7Vf5XBPlQ6At3pBhp+zpXbsnpZzVL33c8lW1xfj6YPwtO6gOeEsl1juCQ==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "@smithy/util-endpoints": "^2.0.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.568.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz", + "integrity": "sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", + "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.609.0.tgz", + "integrity": "sha512-DlZBwQ/HkZyf3pOWc7+wjJRk5R7x9YxHhs2szHwtv1IW30KMabjjjX0GMlGJ9LLkBHkbaaEY/w9Tkj12XRLhRg==", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", @@ -416,139 +1037,662 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@hackolade/hck-esbuild-plugins-pack": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@hackolade/hck-esbuild-plugins-pack/-/hck-esbuild-plugins-pack-0.0.1.tgz", + "integrity": "sha512-Y4e3BJ28KOc9NWF3pfTOMlyWImfQx5h8gE+eQF0QWBOZO1M/TuAadiChUmu6QgrbBXzz2dAW0Fetl5IO5bolsw==", + "dev": true, + "dependencies": { + "fs-extra": "^11.1.1" + }, + "peerDependencies": { + "esbuild": ">= 0.17.10" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", + "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.5.tgz", + "integrity": "sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.2.6.tgz", + "integrity": "sha512-tBbVIv/ui7/lLTKayYJJvi8JLVL2SwOQTbNFEOrvzSE3ktByvsa1erwBOnAMo8N5Vu30g7lN4lLStrU75oDGuw==", + "dependencies": { + "@smithy/middleware-endpoint": "^3.0.5", + "@smithy/middleware-retry": "^3.0.9", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/protocol-http": "^4.0.3", + "@smithy/smithy-client": "^3.1.7", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.1.4.tgz", + "integrity": "sha512-NKyH01m97Xa5xf3pB2QOF3lnuE8RIK0hTVNU5zvZAwZU8uspYO4DHQVlK+Y5gwSrujTfHvbfd1D9UFJAc0iYKQ==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.1.tgz", + "integrity": "sha512-0w0bgUvZmfa0vHN8a+moByhCJT07WN6AHKEhFSOLsDpnszm+5dLVv5utGaqbhOrZ/aF5x3xuPMs/oMCd+4O5xg==", + "dependencies": { + "@smithy/protocol-http": "^4.0.3", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/hash-node": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.3.tgz", + "integrity": "sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==", + "dependencies": { + "@smithy/types": "^3.3.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz", + "integrity": "sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.3.tgz", + "integrity": "sha512-Dbz2bzexReYIQDWMr+gZhpwBetNXzbhnEMhYKA6urqmojO14CsXjnsoPYO8UL/xxcawn8ZsuVU61ElkLSltIUQ==", + "dependencies": { + "@smithy/protocol-http": "^4.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.0.5.tgz", + "integrity": "sha512-V4acqqrh5tDxUEGVTOgf2lYMZqPQsoGntCrjrJZEeBzEzDry2d2vcI1QCXhGltXPPY+BMc6eksZMguA9fIY8vA==", + "dependencies": { + "@smithy/middleware-serde": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.9.tgz", + "integrity": "sha512-Mrv9omExU1gA7Y0VEJG2LieGfPYtwwcEiOnVGZ54a37NEMr66TJ0glFslOJFuKWG6izg5DpKIUmDV9rRxjm47Q==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.0.3", + "@smithy/service-error-classification": "^3.0.3", + "@smithy/smithy-client": "^3.1.7", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-retry/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", + "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", + "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", + "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", + "dependencies": { + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.2.tgz", + "integrity": "sha512-Td3rUNI7qqtoSLTsJBtsyfoG4cF/XMFmJr6Z2dX8QNzIi6tIW6YmuyFml8mJ2cNpyWNqITKbROMOFrvQjmsOvw==", + "dependencies": { + "@smithy/abort-controller": "^3.1.1", + "@smithy/protocol-http": "^4.0.3", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", + "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.0.3.tgz", + "integrity": "sha512-x5jmrCWwQlx+Zv4jAtc33ijJ+vqqYN+c/ZkrnpvEe/uDas7AT7A/4Rc2CdfxgWv4WFGmEqODIrrUToPN6DDkGw==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", + "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", + "dependencies": { + "@smithy/types": "^3.3.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", + "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz", + "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==", + "dependencies": { + "@smithy/types": "^3.3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", + "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-3.1.2.tgz", + "integrity": "sha512-3BcPylEsYtD0esM4Hoyml/+s7WP2LFhcM3J2AGdcL2vx9O60TtfpDOL72gjb4lU8NeRPeKAwR77YNyyGvMbuEA==", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/types": "^3.3.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.7.tgz", + "integrity": "sha512-nZbJZB0XI3YnaFBWGDBr7kjaew6O0oNYNmopyIz6gKZEbxzrtH7rwvU1GcVxcSFoOwWecLJEe79fxEMljHopFQ==", + "dependencies": { + "@smithy/middleware-endpoint": "^3.0.5", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/protocol-http": "^4.0.3", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.0.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", + "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", + "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", + "dependencies": { + "@smithy/querystring-parser": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/util-base64": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", + "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", + "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", + "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=16.0.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.9.tgz", + "integrity": "sha512-WKPcElz92MAQG09miBdb0GxEH/MwD5GfE8g07WokITq5g6J1ROQfYCKC1wNnkqAGfrSywT7L0rdvvqlBplqiyA==", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@smithy/property-provider": "^3.1.3", + "@smithy/smithy-client": "^3.1.7", + "@smithy/types": "^3.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 10.0.0" } }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.9.tgz", + "integrity": "sha512-dQLrUqFxqpf0GvEKEuFdgXcdZwz6oFm752h4d6C7lQz+RLddf761L2r7dSwGWzESMMB3wKj0jL+skRhEGlecjw==", + "dependencies": { + "@smithy/config-resolver": "^3.0.5", + "@smithy/credential-provider-imds": "^3.1.4", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/smithy-client": "^3.1.7", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 10.0.0" } }, - "node_modules/@hackolade/hck-esbuild-plugins-pack": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@hackolade/hck-esbuild-plugins-pack/-/hck-esbuild-plugins-pack-0.0.1.tgz", - "integrity": "sha512-Y4e3BJ28KOc9NWF3pfTOMlyWImfQx5h8gE+eQF0QWBOZO1M/TuAadiChUmu6QgrbBXzz2dAW0Fetl5IO5bolsw==", - "dev": true, + "node_modules/@smithy/util-endpoints": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz", + "integrity": "sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==", "dependencies": { - "fs-extra": "^11.1.1" + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "esbuild": ">= 0.17.10" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, + "node_modules/@smithy/util-hex-encoding": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "tslib": "^2.6.2" }, "engines": { - "node": ">=10.10.0" + "node": ">=16.0.0" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" + "node_modules/@smithy/util-middleware": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", + "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, + "node_modules/@smithy/util-retry": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz", + "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@smithy/service-error-classification": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 8" + "node": ">=16.0.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, + "node_modules/@smithy/util-stream": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.0.6.tgz", + "integrity": "sha512-w9i//7egejAIvplX821rPWWgaiY1dxsQUw0hXX7qwa/uZ9U3zplqTQ871jWadkcVB9gFDhkPWYVZf4yfFbZ0xA==", + "dependencies": { + "@smithy/fetch-http-handler": "^3.2.1", + "@smithy/node-http-handler": "^3.1.2", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 8" + "node": ">=16.0.0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, + "node_modules/@smithy/util-uri-escape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">= 8" + "node": ">=16.0.0" } }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" }, - "funding": { - "url": "https://opencollective.com/unts" + "engines": { + "node": ">=16.0.0" } }, "node_modules/@types/json5": { @@ -999,6 +2143,7 @@ "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==", + "dev": true, "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -1009,51 +2154,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/aws-sdk": { - "version": "2.1603.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1603.0.tgz", - "integrity": "sha512-AB54LyTODyiTKdtUzE0LzhnPbumYH3KhDstje8i4KfeBSGCeszTgq89YfOVpSy5twfu9WpsJ2cHOxlrlXn9cpg==", - "hasInstallScript": true, - "dependencies": { - "buffer": "4.9.2", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.16.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "util": "^0.12.4", - "uuid": "8.0.0", - "xml2js": "0.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, "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==", "dev": true }, - "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" - } - ] + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" }, "node_modules/brace-expansion": { "version": "1.1.11", @@ -1077,20 +2187,11 @@ "node": ">=8" } }, - "node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -1301,6 +2402,7 @@ "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==", + "dev": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -1452,6 +2554,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -1463,6 +2566,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, "engines": { "node": ">= 0.4" } @@ -1932,14 +3036,6 @@ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true }, - "node_modules/events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/execa": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", @@ -2015,6 +3111,27 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -2088,6 +3205,7 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, "dependencies": { "is-callable": "^1.1.3" } @@ -2116,6 +3234,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2151,6 +3270,7 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -2294,6 +3414,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -2335,6 +3456,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, "dependencies": { "es-define-property": "^1.0.0" }, @@ -2346,6 +3468,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -2357,6 +3480,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -2368,6 +3492,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, "dependencies": { "has-symbols": "^1.0.3" }, @@ -2382,6 +3507,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -2398,11 +3524,6 @@ "node": ">=14.18.0" } }, - "node_modules/ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", @@ -2460,7 +3581,8 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "node_modules/internal-slot": { "version": "1.0.7", @@ -2476,21 +3598,6 @@ "node": ">= 0.4" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-array-buffer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", @@ -2539,6 +3646,7 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -2609,20 +3717,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -2766,6 +3860,7 @@ "version": "1.1.13", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, "dependencies": { "which-typed-array": "^1.1.14" }, @@ -2788,25 +3883,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "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==", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -3381,6 +4463,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, "engines": { "node": ">= 0.4" } @@ -3430,15 +4513,6 @@ "node": ">=6" } }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -3639,11 +4713,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" - }, "node_modules/semver": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", @@ -3660,6 +4729,7 @@ "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==", + "dev": true, "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -3926,6 +4996,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4011,8 +5086,7 @@ "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/type-check": { "version": "0.4.0", @@ -4158,40 +5232,6 @@ "punycode": "^2.1.0" } }, - "node_modules/url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" - }, - "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==", - "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/uuid": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", - "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4227,6 +5267,7 @@ "version": "1.1.15", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -4312,26 +5353,6 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "node_modules/xml2js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", - "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", - "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==", - "engines": { - "node": ">=4.0" - } - }, "node_modules/yaml": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", diff --git a/package.json b/package.json index 3c37630c..432d5211 100644 --- a/package.json +++ b/package.json @@ -33,8 +33,8 @@ }, "description": "Hackolade plugin for AWS Glue Data Catalog", "dependencies": { + "@aws-sdk/client-glue": "3.613.0", "antlr4": "4.8.0", - "aws-sdk": "2.1603.0", "lodash": "4.17.21" }, "lint-staged": { @@ -64,4 +64,4 @@ "prettier": "3.2.5", "simple-git-hooks": "2.11.1" } -} \ No newline at end of file +} diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index d7688e38..02d9b9e6 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -14,9 +14,7 @@ const { setDependencies, dependencies } = require('./appDependencies'); module.exports = { async connect(connectionInfo) { - const connection = await connectionHelper.connect(connectionInfo); - - return connection; + return connectionHelper.connect(connectionInfo); }, disconnect(connectionInfo, cb) { diff --git a/reverse_engineering/helpers/connectionHelper.js b/reverse_engineering/helpers/connectionHelper.js index 12837644..99539dde 100644 --- a/reverse_engineering/helpers/connectionHelper.js +++ b/reverse_engineering/helpers/connectionHelper.js @@ -1,4 +1,10 @@ -const aws = require('aws-sdk'); +const { + GlueClient, + GetTableCommand, + GetTablesCommand, + GetDatabaseCommand, + GetDatabasesCommand, +} = require('@aws-sdk/client-glue'); const fs = require('fs'); const https = require('https'); const { mapTableData } = require('./tablePropertiesHelper'); @@ -63,9 +69,16 @@ const createConnection = async connectionInfo => { } : {}; - aws.config.update({ accessKeyId, secretAccessKey, region, sessionToken, ...httpOptions }); - - return new aws.Glue(); + return new GlueClient({ + region, + credentials: { + accessKeyId, + secretAccessKey, + sessionToken, + }, + // TODO: verify ssl options to be applied correctly + ...httpOptions, + }); }; const connect = async connectionInfo => { if (connection) { @@ -89,9 +102,8 @@ const close = () => { const createInstance = (connection, _) => { const getDatabases = async () => { - const dbsData = await connection - .getDatabases({ MaxResults: MAX_RESULTS, NextToken: databaseLoadContinuationToken }) - .promise(); + const command = new GetDatabasesCommand({ MaxResults: MAX_RESULTS, NextToken: databaseLoadContinuationToken }); + const dbsData = await connection.send(command); databaseLoadContinuationToken = dbsData.NextToken ? dbsData.NextToken : null; @@ -102,14 +114,14 @@ const createInstance = (connection, _) => { }; const getDatabaseDescription = async dbName => { - const db = await connection.getDatabase({ Name: dbName }).promise(); + const command = new GetDatabaseCommand({ Name: dbName }); + const db = await connection.send(command); return db.Database.Description; }; const getTableList = async (dbName, nextToken) => { - const tableListResponse = await connection - .getTables({ DatabaseName: dbName, ...(nextToken && { NextToken: nextToken }) }) - .promise(); + const command = new GetTablesCommand({ DatabaseName: dbName, ...(nextToken && { NextToken: nextToken }) }); + const tableListResponse = await connection.send(command); let nextTableList = []; if (tableListResponse.NextToken) { @@ -125,7 +137,9 @@ const createInstance = (connection, _) => { }; const getTable = async (dbName, tableName) => { - const rawTableData = await connection.getTable({ DatabaseName: dbName, Name: tableName }).promise(); + const command = new GetTableCommand({ DatabaseName: dbName, Name: tableName }); + + const rawTableData = await connection.send(command); return mapTableData(rawTableData, _); }; From 06fd128c3845bf4a3d95d7280ace6150963ca21c Mon Sep 17 00:00:00 2001 From: chulanovskyi-bs <56116665+chulanovskyi-bs@users.noreply.github.com> Date: Thu, 18 Jul 2024 13:56:48 +0300 Subject: [PATCH 02/18] fix: handle the missing Type of the column (#39) --- forward_engineering/api.js | 5 ++-- reverse_engineering/api.js | 23 +++++++++++++------ .../helpers/connectionHelper.js | 4 ++-- .../helpers/tablePropertiesHelper.js | 21 +++++++++++++++-- 4 files changed, 40 insertions(+), 13 deletions(-) diff --git a/forward_engineering/api.js b/forward_engineering/api.js index 5de3cfe9..5c7a2c76 100644 --- a/forward_engineering/api.js +++ b/forward_engineering/api.js @@ -1,6 +1,6 @@ 'use strict'; -const { GlueClient, CreateDatabaseCommand, CreateTableCommand } = require('@aws-sdk/client-glue'); +const { GlueClient, CreateDatabaseCommand, CreateTableCommand, GetDatabasesCommand } = require('@aws-sdk/client-glue'); const { getDatabaseStatement } = require('./helpers/databaseHelper'); const { getTableStatement } = require('./helpers/tableHelper'); const { getIndexes } = require('./helpers/indexHelper'); @@ -169,7 +169,8 @@ module.exports = { const glueInstance = getGlueInstance(connectionInfo, app); try { - await glueInstance.getDatabases().promise(); + const command = new GetDatabasesCommand(); + await glueInstance.send(command); callback(); } catch (err) { logger.log('error', { message: err.message, stack: err.stack, error: err }, 'Connection failed'); diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index 02d9b9e6..02d3ef7f 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -28,7 +28,7 @@ module.exports = { logInfo('Test connection', connectionInfo, logger); const connection = await this.connect(connectionInfo); - const instance = connectionHelper.createInstance(connection, dependencies.lodash); + const instance = connectionHelper.createInstance({ connection, _: dependencies.lodash, logger }); try { await instance.getDatabases(); @@ -46,7 +46,7 @@ module.exports = { try { const connection = await this.connect(connectionInfo); - const instance = connectionHelper.createInstance(connection, dependencies.lodash); + const instance = connectionHelper.createInstance({ connection, _: dependencies.lodash, logger }); const { databaseList, isFullyUploaded } = await instance.getDatabases(); const dbsCollections = databaseList.map(async db => { const dbCollections = await instance.getTables(db.Name); @@ -89,7 +89,7 @@ module.exports = { try { const connection = await this.connect(data); - const instance = connectionHelper.createInstance(connection, dependencies.lodash); + const instance = connectionHelper.createInstance({ connection, _: dependencies.lodash, logger }); const tablesDataPromise = databases.map(async dbName => { const dbDescription = await instance.getDatabaseDescription(dbName); @@ -102,7 +102,10 @@ module.exports = { }); const tableData = await instance.getTable(dbName, tableName); - const jsonSchema = getColumnsSchema([...tableData.columns, ...tableData.partitionKeys]); + const jsonSchema = getColumnsSchema({ + columns: [...tableData.columns, ...tableData.partitionKeys], + logger, + }); return { dbName, @@ -191,10 +194,16 @@ const handleErrorObject = (error, title) => { return { title, ...errorProperties }; }; -const getColumnsSchema = columns => { +const getColumnsSchema = ({ columns, logger }) => { return columns.reduce((acc, item) => { - const sanitizedTypeString = item.type.replace(/\s/g, ''); - let columnSchema = schemaHelper.getJsonSchema(sanitizedTypeString); + if (!item) { + return acc; + } + if (!item.type) { + logger.log('info', item, 'Column Type is missing, fallback to string'); + } + const sanitizedTypeString = item.type?.replace(/\s/g, '') || 'string'; + const columnSchema = schemaHelper.getJsonSchema(sanitizedTypeString); schemaHelper.setProperty(item.name, columnSchema, acc); return acc; }, {}); diff --git a/reverse_engineering/helpers/connectionHelper.js b/reverse_engineering/helpers/connectionHelper.js index 99539dde..6d7806d8 100644 --- a/reverse_engineering/helpers/connectionHelper.js +++ b/reverse_engineering/helpers/connectionHelper.js @@ -100,7 +100,7 @@ const close = () => { } }; -const createInstance = (connection, _) => { +const createInstance = ({ connection, _ = {}, logger = {} }) => { const getDatabases = async () => { const command = new GetDatabasesCommand({ MaxResults: MAX_RESULTS, NextToken: databaseLoadContinuationToken }); const dbsData = await connection.send(command); @@ -141,7 +141,7 @@ const createInstance = (connection, _) => { const rawTableData = await connection.send(command); - return mapTableData(rawTableData, _); + return mapTableData({ tableData: rawTableData, _, logger }); }; return { diff --git a/reverse_engineering/helpers/tablePropertiesHelper.js b/reverse_engineering/helpers/tablePropertiesHelper.js index 602bf141..e2d96405 100644 --- a/reverse_engineering/helpers/tablePropertiesHelper.js +++ b/reverse_engineering/helpers/tablePropertiesHelper.js @@ -59,7 +59,24 @@ const getNumBuckets = (numBuckets = 0) => { return numBuckets < 1 ? undefined : numBuckets; }; -const mapTableData = (tableData, _) => { +const mapColumns = ({ columns = [], logger = {} }) => { + let hasErrors = false; + + const mapped = columns.map(({ Type, Name }) => { + if (!Type || !Name) { + hasErrors = true; + } + return { name: Name, type: Type }; + }); + + if (hasErrors) { + logger.log('info', columns, 'Some columns are missing required Type or Name'); + } + + return mapped; +}; + +const mapTableData = ({ tableData, _, logger }) => { const partitionKeys = tableData.Table.PartitionKeys || []; return { @@ -83,7 +100,7 @@ const mapTableData = (tableData, _) => { classification: getClassification(tableData.Table.Parameters), }, partitionKeys: tableData.Table.PartitionKeys || [], - columns: tableData.Table.StorageDescriptor.Columns.map(({ Type, Name }) => ({ name: Name, type: Type })), + columns: mapColumns({ columns: tableData.Table.StorageDescriptor.Columns, logger }), }; }; From defa62eeb430094a9d4cd7e784d357062374edef Mon Sep 17 00:00:00 2001 From: chulanovskyi Date: Thu, 18 Jul 2024 14:22:07 +0300 Subject: [PATCH 03/18] feat: added fetch-http-handler --- package-lock.json | 105 ++++++++++++++++++ package.json | 1 + .../helpers/connectionHelper.js | 28 ++--- 3 files changed, 121 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index ec5fad58..2c39f153 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.2.2", "dependencies": { "@aws-sdk/client-glue": "3.613.0", + "@aws-sdk/fetch-http-handler": "3.374.0", "antlr4": "4.8.0", "lodash": "4.17.21" }, @@ -494,6 +495,110 @@ "@aws-sdk/client-sts": "^3.609.0" } }, + "node_modules/@aws-sdk/fetch-http-handler": { + "version": "3.374.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.374.0.tgz", + "integrity": "sha512-Xt+4F6tGi/q9Z32kLo8SSm9krLlCY2oTLxCfP3/1SKY2wqWKHjAgpLmPD+GW7fdMjAwhDqzW5ZhcSmvHNvoD/w==", + "deprecated": "This package has moved to @smithy/fetch-http-handler", + "dependencies": { + "@smithy/fetch-http-handler": "^1.0.1", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/fetch-http-handler/node_modules/@smithy/fetch-http-handler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-1.1.0.tgz", + "integrity": "sha512-N22C9R44u5WGlcY+Wuv8EXmCAq62wWwriRAuoczMEwAIjPbvHSthyPSLqI4S7kAST1j6niWg8kwpeJ3ReAv3xg==", + "dependencies": { + "@smithy/protocol-http": "^1.2.0", + "@smithy/querystring-builder": "^1.1.0", + "@smithy/types": "^1.2.0", + "@smithy/util-base64": "^1.1.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/fetch-http-handler/node_modules/@smithy/is-array-buffer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-1.1.0.tgz", + "integrity": "sha512-twpQ/n+3OWZJ7Z+xu43MJErmhB/WO/mMTnqR6PwWQShvSJ/emx5d1N59LQZk6ZpTAeuRWrc+eHhkzTp9NFjNRQ==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/fetch-http-handler/node_modules/@smithy/protocol-http": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-1.2.0.tgz", + "integrity": "sha512-GfGfruksi3nXdFok5RhgtOnWe5f6BndzYfmEXISD+5gAGdayFGpjWu5pIqIweTudMtse20bGbc+7MFZXT1Tb8Q==", + "dependencies": { + "@smithy/types": "^1.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/fetch-http-handler/node_modules/@smithy/querystring-builder": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-1.1.0.tgz", + "integrity": "sha512-gDEi4LxIGLbdfjrjiY45QNbuDmpkwh9DX4xzrR2AzjjXpxwGyfSpbJaYhXARw9p17VH0h9UewnNQXNwaQyYMDA==", + "dependencies": { + "@smithy/types": "^1.2.0", + "@smithy/util-uri-escape": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/fetch-http-handler/node_modules/@smithy/types": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.2.0.tgz", + "integrity": "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/fetch-http-handler/node_modules/@smithy/util-base64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-1.1.0.tgz", + "integrity": "sha512-FpYmDmVbOXAxqvoVCwqehUN0zXS+lN8V7VS9O7I8MKeVHdSTsZzlwiMEvGoyTNOXWn8luF4CTDYgNHnZViR30g==", + "dependencies": { + "@smithy/util-buffer-from": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/fetch-http-handler/node_modules/@smithy/util-buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-1.1.0.tgz", + "integrity": "sha512-9m6NXE0ww+ra5HKHCHig20T+FAwxBAm7DIdwc/767uGWbRcY720ybgPacQNB96JMOI7xVr/CDa3oMzKmW4a+kw==", + "dependencies": { + "@smithy/is-array-buffer": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/fetch-http-handler/node_modules/@smithy/util-uri-escape": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-1.1.0.tgz", + "integrity": "sha512-/jL/V1xdVRt5XppwiaEU8Etp5WHZj609n0xMTuehmCqdoOFbId1M+aEeDWZsQ+8JbEB/BJ6ynY2SlYmOaKtt8w==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@aws-sdk/middleware-host-header": { "version": "3.609.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.609.0.tgz", diff --git a/package.json b/package.json index 432d5211..b14ea0ef 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "description": "Hackolade plugin for AWS Glue Data Catalog", "dependencies": { "@aws-sdk/client-glue": "3.613.0", + "@aws-sdk/fetch-http-handler": "3.374.0", "antlr4": "4.8.0", "lodash": "4.17.21" }, diff --git a/reverse_engineering/helpers/connectionHelper.js b/reverse_engineering/helpers/connectionHelper.js index 6d7806d8..b196e0f4 100644 --- a/reverse_engineering/helpers/connectionHelper.js +++ b/reverse_engineering/helpers/connectionHelper.js @@ -5,6 +5,7 @@ const { GetDatabaseCommand, GetDatabasesCommand, } = require('@aws-sdk/client-glue'); +const { FetchHttpHandler } = require('@aws-sdk/fetch-http-handler'); const fs = require('fs'); const https = require('https'); const { mapTableData } = require('./tablePropertiesHelper'); @@ -28,6 +29,7 @@ const readCertificateFile = path => { }); }); }; + const getSslOptions = async connectionInfo => { switch (connectionInfo.sslType) { case 'Server validation': { @@ -57,17 +59,18 @@ const getSslOptions = async connectionInfo => { const createConnection = async connectionInfo => { const { accessKeyId, secretAccessKey, region, sessionToken } = connectionInfo; const sslOptions = await getSslOptions(connectionInfo); - const httpOptions = sslOptions.ssl - ? { - httpOptions: { - agent: new https.Agent({ - rejectUnauthorized: true, - ...sslOptions, - }), - }, - ...sslOptions, - } - : {}; + + const agent = new https.Agent({ + rejectUnauthorized: true, + ...sslOptions, + }); + + const httpHandler = new FetchHttpHandler({ + httpAgent: agent, + httpsAgent: agent, + // UtilityProcess.fork() creates a Chromium child process and Chromium does provide the Fetch API. + fetch: fetch, + }); return new GlueClient({ region, @@ -76,8 +79,7 @@ const createConnection = async connectionInfo => { secretAccessKey, sessionToken, }, - // TODO: verify ssl options to be applied correctly - ...httpOptions, + requestHandler: httpHandler, }); }; const connect = async connectionInfo => { From 0cc7d641adc79bb3279e927a391ba1b9fcca64d1 Mon Sep 17 00:00:00 2001 From: chulanovskyi-bs Date: Thu, 18 Jul 2024 18:09:08 +0300 Subject: [PATCH 04/18] chore: move HttpHandler to its own place --- reverse_engineering/helpers/connectionHelper.js | 11 +++-------- reverse_engineering/httpHandler/HttpHandler.js | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 reverse_engineering/httpHandler/HttpHandler.js diff --git a/reverse_engineering/helpers/connectionHelper.js b/reverse_engineering/helpers/connectionHelper.js index b196e0f4..65d59702 100644 --- a/reverse_engineering/helpers/connectionHelper.js +++ b/reverse_engineering/helpers/connectionHelper.js @@ -5,10 +5,10 @@ const { GetDatabaseCommand, GetDatabasesCommand, } = require('@aws-sdk/client-glue'); -const { FetchHttpHandler } = require('@aws-sdk/fetch-http-handler'); const fs = require('fs'); const https = require('https'); const { mapTableData } = require('./tablePropertiesHelper'); +const { HttpHandler } = require('../httpHandler/HttpHandler'); let connection; let databaseLoadContinuationToken; @@ -65,12 +65,7 @@ const createConnection = async connectionInfo => { ...sslOptions, }); - const httpHandler = new FetchHttpHandler({ - httpAgent: agent, - httpsAgent: agent, - // UtilityProcess.fork() creates a Chromium child process and Chromium does provide the Fetch API. - fetch: fetch, - }); + const httpHandler = new HttpHandler(agent); return new GlueClient({ region, @@ -79,7 +74,7 @@ const createConnection = async connectionInfo => { secretAccessKey, sessionToken, }, - requestHandler: httpHandler, + requestHandler: httpHandler.handler, }); }; const connect = async connectionInfo => { diff --git a/reverse_engineering/httpHandler/HttpHandler.js b/reverse_engineering/httpHandler/HttpHandler.js new file mode 100644 index 00000000..c08bfac0 --- /dev/null +++ b/reverse_engineering/httpHandler/HttpHandler.js @@ -0,0 +1,16 @@ +const { FetchHttpHandler } = require('@aws-sdk/fetch-http-handler'); + +class HttpHandler { + handler = null; + + constructor(agent) { + this.agent = agent; + this.handler = new FetchHttpHandler(); + } + + get() { + return this.handler; + } +} + +module.exports = { HttpHandler }; From c4731e19e09b9f21b9398364a10642dc51a8c14a Mon Sep 17 00:00:00 2001 From: chulanovskyi Date: Tue, 23 Jul 2024 13:05:31 +0300 Subject: [PATCH 05/18] temp: skeleton for a controller --- .../httpHandler/HttpHandler.js | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/reverse_engineering/httpHandler/HttpHandler.js b/reverse_engineering/httpHandler/HttpHandler.js index c08bfac0..dba537b7 100644 --- a/reverse_engineering/httpHandler/HttpHandler.js +++ b/reverse_engineering/httpHandler/HttpHandler.js @@ -1,3 +1,7 @@ +/** + * @typedef {import('@aws-sdk/client-glue/dist-types/GlueClient').ClientDefaults[requestHandler]} RequestHandler + **/ + const { FetchHttpHandler } = require('@aws-sdk/fetch-http-handler'); class HttpHandler { @@ -11,6 +15,93 @@ class HttpHandler { get() { return this.handler; } + + /** + * Handles an HTTP request. + * + * @param { HttpRequest } request - The HTTP request to handle. + * @param { Object } [options] - The handler options. + * @param { AbortSignal } [options.abortSignal] - An abort signal to cancel the request. + * @returns { Promise<{ response: HttpResponse }> } A promise that resolves with the HTTP response. + */ + handle(request, { abortSignal } = {}) { + const requestTimeoutInMs = this.requestTimeout; + + // if the request was already aborted, prevent doing extra work + if (abortSignal?.aborted) { + const abortError = new Error('Request aborted'); + abortError.name = 'AbortError'; + return Promise.reject(abortError); + } + + let path = request.path; + if (request.query) { + // const queryString = buildQueryString(request.query); + // if (queryString) { + // path += `?${queryString}`; + // } + } + + const { port, method } = request; + const url = `${request.protocol}//${request.hostname}${port ? `:${port}` : ''}${path}`; + + const body = method === 'GET' || method === 'HEAD' ? undefined : request.body; + const requestOptions = { + body, + headers: new Headers(request.headers), + method: method, + }; + + if (typeof AbortController !== 'undefined') { + requestOptions['signal'] = abortSignal; + } + + const fetchRequest = new Request(url, requestOptions); + const raceOfPromises = [ + fetch(fetchRequest).then(response => { + const fetchHeaders = response.headers; + const transformedHeaders = {}; + + for (const pair of fetchHeaders.entries()) { + transformedHeaders[pair[0]] = pair[1]; + } + + const hasReadableStream = response.body !== undefined; + + // Return the response with buffered body + if (!hasReadableStream) { + return response.blob().then(body => ({ + // response: new HttpResponse({ + // headers: transformedHeaders, + // statusCode: response.status, + // body, + // }), + })); + } + // Return the response with streaming body + return { + // response: new HttpResponse({ + // headers: transformedHeaders, + // statusCode: response.status, + // body: response.body, + // }), + }; + }), + // requestTimeout(requestTimeoutInMs), + ]; + if (abortSignal) { + raceOfPromises.push( + new Promise()((resolve, reject) => { + abortSignal.onabort = () => { + const abortError = new Error('Request aborted'); + abortError.name = 'AbortError'; + reject(abortError); + }; + }), + ); + } + return Promise.race(raceOfPromises); + } } module.exports = { HttpHandler }; From 3fe9cd3214255b9fd124df2bbdc16e4169edf875 Mon Sep 17 00:00:00 2001 From: chulanovskyi Date: Fri, 30 Aug 2024 11:59:48 +0300 Subject: [PATCH 06/18] feat: replaced @aws-sdk/fetch-http-handler with own HttpHandler that uses electron.net.fetch explicitly --- reverse_engineering/api.js | 14 +-- .../connectionSettingsModalConfig.json | 75 ------------ .../helpers/connectionHelper.js | 63 ++-------- .../httpHandler/HttpHandler.js | 107 ----------------- shared/httpHandler/httpHandler.js | 109 ++++++++++++++++++ shared/httpHandler/queryBuilder.js | 25 ++++ shared/httpHandler/requestTimeout.js | 13 +++ 7 files changed, 161 insertions(+), 245 deletions(-) delete mode 100644 reverse_engineering/httpHandler/HttpHandler.js create mode 100644 shared/httpHandler/httpHandler.js create mode 100644 shared/httpHandler/queryBuilder.js create mode 100644 shared/httpHandler/requestTimeout.js diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index bc375730..b3641fc9 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -13,21 +13,19 @@ const connectionHelper = require('./helpers/connectionHelper'); const { setDependencies, dependencies } = require('./appDependencies'); module.exports = { - async connect(connectionInfo) { - return connectionHelper.connect(connectionInfo); + async connect({ connectionInfo, logger }) { + return connectionHelper.connect({ connectionInfo, logger }); }, disconnect(connectionInfo, logger, cb, app) { connectionHelper.close(); - cb(); }, async testConnection(connectionInfo, logger, cb, app) { - setDependencies(app); logInfo('Test connection', connectionInfo, logger); - const connection = await this.connect(connectionInfo); + const connection = await this.connect({ connectionInfo, logger }); const instance = connectionHelper.createInstance({ connection, _: dependencies.lodash, logger }); try { @@ -45,7 +43,7 @@ module.exports = { logInfo('Retrieving databases and tables information', connectionInfo, logger); try { - const connection = await this.connect(connectionInfo); + const connection = await this.connect({ connectionInfo, logger }); const instance = connectionHelper.createInstance({ connection, _: dependencies.lodash, logger }); const { databaseList, isFullyUploaded } = await instance.getDatabases(); const dbsCollections = databaseList.map(async db => { @@ -88,7 +86,7 @@ module.exports = { const tables = collectionData.collections; try { - const connection = await this.connect(data); + const connection = await this.connect({ connectionInfo: data, logger }); const instance = connectionHelper.createInstance({ connection, _: dependencies.lodash, logger }); const tablesDataPromise = databases.map(async dbName => { @@ -177,7 +175,7 @@ const handleFileData = filePath => { return new Promise((resolve, reject) => { fs.readFile(filePath, 'utf-8', (err, content) => { if (err) { - reject(err); + reject(new Error(`handle file data error: ${err}`)); } else { resolve(content); } diff --git a/reverse_engineering/connection_settings_modal/connectionSettingsModalConfig.json b/reverse_engineering/connection_settings_modal/connectionSettingsModalConfig.json index 6c0e294f..c3e94b94 100644 --- a/reverse_engineering/connection_settings_modal/connectionSettingsModalConfig.json +++ b/reverse_engineering/connection_settings_modal/connectionSettingsModalConfig.json @@ -121,80 +121,5 @@ "isHiddenKey": true } ] - }, - { - "lowerTab": "SSL", - "structure": [ - { - "inputLabel": "SSL", - "inputKeyword": "sslType", - "inputType": "select", - "options": [ - { - "value": "Off", - "label": "Off" - }, - { - "value": "Server validation", - "label": "Server validation" - }, - { - "value": "Server and client validation", - "label": "Server and client validation" - } - ] - }, - { - "inputLabel": "Certificate Authority", - "inputKeyword": "certAuthorityPath", - "inputType": "file", - "inputPlaceholder": "Certificate Authority", - "extensions": ["pem", "crt", "key", "cer"], - "dependency": { - "key": "sslType", - "value": "Server validation" - } - }, - { - "inputLabel": "Client Certificate", - "inputKeyword": "clientCert", - "inputType": "file", - "inputPlaceholder": "Client Certificate", - "extensions": ["pem", "crt", "key", "cer"], - "dependency": { - "key": "sslType", - "value": "Server and client validation" - }, - "validation": { - "regex": "([^\\s])" - } - }, - { - "inputLabel": "Client Private Key", - "inputKeyword": "clientPrivateKey", - "inputType": "file", - "inputPlaceholder": "Client Private Key", - "dependency": { - "key": "sslType", - "value": "Server and client validation" - }, - "validation": { - "regex": "([^\\s])" - } - }, - { - "inputLabel": "Password", - "inputKeyword": "clientKeyPassword", - "inputType": "password", - "inputPlaceholder": "Password", - "dependency": { - "key": "sslType", - "value": "Server and client validation" - }, - "validation": { - "regex": "([^\\s])" - } - } - ] } ] diff --git a/reverse_engineering/helpers/connectionHelper.js b/reverse_engineering/helpers/connectionHelper.js index 65d59702..3ce8de0b 100644 --- a/reverse_engineering/helpers/connectionHelper.js +++ b/reverse_engineering/helpers/connectionHelper.js @@ -8,64 +8,17 @@ const { const fs = require('fs'); const https = require('https'); const { mapTableData } = require('./tablePropertiesHelper'); -const { HttpHandler } = require('../httpHandler/HttpHandler'); +const { HttpHandler } = require('../../shared/httpHandler/httpHandler'); let connection; let databaseLoadContinuationToken; const MAX_RESULTS = 100; -const readCertificateFile = path => { - if (!path) { - return Promise.resolve(''); - } - - return new Promise(resolve => { - fs.readFile(path, 'utf8', (err, data) => { - if (err) { - resolve(''); - } - resolve(data); - }); - }); -}; - -const getSslOptions = async connectionInfo => { - switch (connectionInfo.sslType) { - case 'Server validation': { - const certAuthority = await readCertificateFile(connectionInfo.certAuthorityPath); - return { - ssl: true, - ca: [certAuthority], - }; - } - case 'Server and client validation': { - const certAuthority = await readCertificateFile(connectionInfo.certAuthorityPath); - const key = await readCertificateFile(connectionInfo.clientPrivateKey); - const cert = await readCertificateFile(connectionInfo.clientCert); - return { - ssl: true, - ca: [certAuthority], - key: [key], - cert: [cert], - passphrase: connectionInfo.clientKeyPassword, - }; - } - default: - return { ssl: false }; - } -}; - -const createConnection = async connectionInfo => { - const { accessKeyId, secretAccessKey, region, sessionToken } = connectionInfo; - const sslOptions = await getSslOptions(connectionInfo); - - const agent = new https.Agent({ - rejectUnauthorized: true, - ...sslOptions, - }); +const createConnection = async ({ connectionInfo, logger }) => { + const { accessKeyId, secretAccessKey, region, sessionToken, queryRequestTimeout } = connectionInfo; - const httpHandler = new HttpHandler(agent); + const httpHandler = new HttpHandler({ logger, requestTimeout: queryRequestTimeout }); return new GlueClient({ region, @@ -74,15 +27,15 @@ const createConnection = async connectionInfo => { secretAccessKey, sessionToken, }, - requestHandler: httpHandler.handler, + requestHandler: httpHandler, }); }; -const connect = async connectionInfo => { +const connect = async ({ connectionInfo, logger }) => { if (connection) { return connection; } - connection = await createConnection(connectionInfo); + connection = await createConnection({ connectionInfo, logger }); return connection; }; @@ -106,7 +59,7 @@ const createInstance = ({ connection, _ = {}, logger = {} }) => { return { databaseList: dbsData.DatabaseList, - isFullyUploaded: !Boolean(dbsData.NextToken), + isFullyUploaded: !dbsData.NextToken, }; }; diff --git a/reverse_engineering/httpHandler/HttpHandler.js b/reverse_engineering/httpHandler/HttpHandler.js deleted file mode 100644 index dba537b7..00000000 --- a/reverse_engineering/httpHandler/HttpHandler.js +++ /dev/null @@ -1,107 +0,0 @@ -/** - * @typedef {import('@aws-sdk/client-glue/dist-types/GlueClient').ClientDefaults[requestHandler]} RequestHandler - **/ - -const { FetchHttpHandler } = require('@aws-sdk/fetch-http-handler'); - -class HttpHandler { - handler = null; - - constructor(agent) { - this.agent = agent; - this.handler = new FetchHttpHandler(); - } - - get() { - return this.handler; - } - - /** - * Handles an HTTP request. - * - * @param { HttpRequest } request - The HTTP request to handle. - * @param { Object } [options] - The handler options. - * @param { AbortSignal } [options.abortSignal] - An abort signal to cancel the request. - * @returns { Promise<{ response: HttpResponse }> } A promise that resolves with the HTTP response. - */ - handle(request, { abortSignal } = {}) { - const requestTimeoutInMs = this.requestTimeout; - - // if the request was already aborted, prevent doing extra work - if (abortSignal?.aborted) { - const abortError = new Error('Request aborted'); - abortError.name = 'AbortError'; - return Promise.reject(abortError); - } - - let path = request.path; - if (request.query) { - // const queryString = buildQueryString(request.query); - // if (queryString) { - // path += `?${queryString}`; - // } - } - - const { port, method } = request; - const url = `${request.protocol}//${request.hostname}${port ? `:${port}` : ''}${path}`; - - const body = method === 'GET' || method === 'HEAD' ? undefined : request.body; - const requestOptions = { - body, - headers: new Headers(request.headers), - method: method, - }; - - if (typeof AbortController !== 'undefined') { - requestOptions['signal'] = abortSignal; - } - - const fetchRequest = new Request(url, requestOptions); - const raceOfPromises = [ - fetch(fetchRequest).then(response => { - const fetchHeaders = response.headers; - const transformedHeaders = {}; - - for (const pair of fetchHeaders.entries()) { - transformedHeaders[pair[0]] = pair[1]; - } - - const hasReadableStream = response.body !== undefined; - - // Return the response with buffered body - if (!hasReadableStream) { - return response.blob().then(body => ({ - // response: new HttpResponse({ - // headers: transformedHeaders, - // statusCode: response.status, - // body, - // }), - })); - } - // Return the response with streaming body - return { - // response: new HttpResponse({ - // headers: transformedHeaders, - // statusCode: response.status, - // body: response.body, - // }), - }; - }), - // requestTimeout(requestTimeoutInMs), - ]; - if (abortSignal) { - raceOfPromises.push( - new Promise()((resolve, reject) => { - abortSignal.onabort = () => { - const abortError = new Error('Request aborted'); - abortError.name = 'AbortError'; - reject(abortError); - }; - }), - ); - } - return Promise.race(raceOfPromises); - } -} - -module.exports = { HttpHandler }; diff --git a/shared/httpHandler/httpHandler.js b/shared/httpHandler/httpHandler.js new file mode 100644 index 00000000..588a4e3c --- /dev/null +++ b/shared/httpHandler/httpHandler.js @@ -0,0 +1,109 @@ +/** + * @typedef {import('@aws-sdk/client-glue/dist-types/GlueClient').ClientDefaults[requestHandler]} RequestHandler + * @typedef {import('@smithy/protocol-http/dist-types').HttpRequest} HttpRequest + * @typedef {import('@smithy/protocol-http/dist-types').HttpResponse} HttpResponse + **/ + +const { net } = require('electron'); +const { isEmpty } = require('lodash'); +const { requestTimeout } = require('./requestTimeout'); +const { queryBuilder } = require('./queryBuilder'); + +/** + * @class + * @implements { RequestHandler } + */ +class HttpHandler { + constructor({ requestTimeout, logger } = {}) { + this.requestTimeout = requestTimeout; + this.logger = logger; + } + + getAbortError = () => { + const abortError = new Error('Request aborted'); + abortError.name = 'AbortError'; + return abortError; + }; + + /** + * @param { HttpRequest } request + * @param { Object } [options] + * @param { AbortSignal } [options.abortSignal] + * @returns { Promise<{ response: HttpResponse }> } + */ + async handle(request, { abortSignal } = {}) { + if (abortSignal?.aborted) { + return Promise.reject(this.getAbortError()); + } + + const { method, query, protocol, port, hostname, body, headers: requestHeaders } = request; + + const headers = new Headers(requestHeaders); + const headersToSkip = ['content-length', 'host']; + headersToSkip.forEach(header => headers.delete(header)); + + let { path } = request; + + if (!isEmpty(query) && typeof query === 'object') { + path += `?${queryBuilder({ query })}`; + } + + const portParam = port ? `:${port}` : ''; + + const url = `${protocol}//${hostname}${portParam}${path}`; + + const methodsWithoutBody = ['GET', 'HEAD']; + + const requestOptions = { + body: methodsWithoutBody.includes(method) ? undefined : body, + headers, + method, + }; + + if (typeof AbortController !== 'undefined') { + requestOptions.signal = abortSignal; + } + + const fetchRequest = new Request(url, requestOptions); + + this.logger?.log('info', { fetchRequest }, 'RE http request'); + + const resultResolver = async result => { + const fetchHeaders = result.headers; + const transformedHeaders = {}; + + for (const [headerKey, headerValue] of fetchHeaders.entries()) { + transformedHeaders[headerKey] = headerValue; + } + + const hasReadableStream = result.body !== undefined; + + const response = { + headers: transformedHeaders, + statusCode: result.status, + body: hasReadableStream ? result.body : await result.blob(), + }; + + return { response }; + }; + + const race = [ + net.fetch(fetchRequest).then(resultResolver), + requestTimeout({ requestTimeout: this.requestTimeout }), + ]; + + if (abortSignal) { + race.push( + new Promise((resolve, reject) => { + abortSignal.onabort = () => { + reject(this.getAbortError()); + }; + }), + ); + } + + return Promise.race(race); + } +} + +module.exports = { HttpHandler }; diff --git a/shared/httpHandler/queryBuilder.js b/shared/httpHandler/queryBuilder.js new file mode 100644 index 00000000..1c347d2c --- /dev/null +++ b/shared/httpHandler/queryBuilder.js @@ -0,0 +1,25 @@ +function queryBuilder({ query }) { + const parts = []; + + for (const key of Object.keys(query)) { + const value = query[key]; + const escapedKey = encodeURIComponent(key); + + if (Array.isArray(value)) { + value.forEach(arrayValue => { + parts.push(`${escapedKey}=${encodeURIComponent(arrayValue)}`); + }); + } else { + let qsEntry = escapedKey; + + if (value || typeof value === 'string') { + qsEntry += `=${encodeURIComponent(value)}`; + } + parts.push(qsEntry); + } + } + + return parts.join('&'); +} + +module.exports = { queryBuilder }; diff --git a/shared/httpHandler/requestTimeout.js b/shared/httpHandler/requestTimeout.js new file mode 100644 index 00000000..1af22925 --- /dev/null +++ b/shared/httpHandler/requestTimeout.js @@ -0,0 +1,13 @@ +function requestTimeout({ requestTimeout = 0 }) { + return new Promise((_, reject) => { + if (requestTimeout) { + setTimeout(() => { + const timeoutError = new Error(`Request did not complete within ${requestTimeout} ms`); + timeoutError.name = 'TimeoutError'; + reject(timeoutError); + }, requestTimeout); + } + }); +} + +module.exports = { requestTimeout }; From c147b46a85dd98b3642ca88451d78c2560fbeac4 Mon Sep 17 00:00:00 2001 From: chulanovskyi Date: Fri, 30 Aug 2024 12:25:44 +0300 Subject: [PATCH 07/18] chore: refactored lodash dependency usage --- forward_engineering/api.js | 26 +++++++------------ forward_engineering/appDependencies.js | 10 ------- forward_engineering/helpers/generalHelper.js | 7 +++-- forward_engineering/helpers/indexHelper.js | 4 +-- forward_engineering/helpers/tableHelper.js | 6 ++--- reverse_engineering/adaptJsonSchema.js | 12 ++++----- reverse_engineering/api.js | 26 +++++++------------ reverse_engineering/appDependencies.js | 10 ------- reverse_engineering/commandsService.js | 23 +++++++--------- .../helpers/connectionHelper.js | 4 +-- reverse_engineering/helpers/mapJsonSchema.js | 6 +++-- .../helpers/tablePropertiesHelper.js | 5 ++-- .../hqlToCollectionsVisitor.js | 8 +++--- reverse_engineering/schemaHelper.js | 6 ++--- 14 files changed, 57 insertions(+), 96 deletions(-) delete mode 100644 forward_engineering/appDependencies.js delete mode 100644 reverse_engineering/appDependencies.js diff --git a/forward_engineering/api.js b/forward_engineering/api.js index 5c7a2c76..c409dde9 100644 --- a/forward_engineering/api.js +++ b/forward_engineering/api.js @@ -1,5 +1,6 @@ 'use strict'; +const _ = require('lodash'); const { GlueClient, CreateDatabaseCommand, CreateTableCommand, GetDatabasesCommand } = require('@aws-sdk/client-glue'); const { getDatabaseStatement } = require('./helpers/databaseHelper'); const { getTableStatement } = require('./helpers/tableHelper'); @@ -9,12 +10,10 @@ const { getGlueDatabaseCreateStatement } = require('./helpers/awsCliScriptHelper const { getGlueTableCreateStatement } = require('./helpers/awsCliScriptHelpers/glueTableHelper'); const { getApiStatements } = require('./helpers/awsCliScriptHelpers/applyToInstanceHelper'); const sqlFormatter = require('./custom_modules/sql-formatter'); -const { setDependencies, dependencies } = require('./appDependencies'); module.exports = { - generateScript(data, logger, callback, app) { + generateScript(data, logger, callback) { try { - setDependencies(app); const jsonSchema = JSON.parse(data.jsonSchema); const modelDefinitions = JSON.parse(data.modelDefinitions); const internalDefinitions = JSON.parse(data.internalDefinitions); @@ -24,9 +23,7 @@ module.exports = { if (data.options.targetScriptOptions && data.options.targetScriptOptions.keyword === 'hiveQl') { const needMinify = ( - dependencies.lodash - .get(data, 'options.additionalOptions', []) - .find(option => option.id === 'minify') || {} + _.get(data, 'options.additionalOptions', []).find(option => option.id === 'minify') || {} ).value; return callback( @@ -58,9 +55,8 @@ module.exports = { } }, - generateContainerScript(data, logger, callback, app) { + generateContainerScript(data, logger, callback) { try { - setDependencies(app); const containerData = data.containerData; const modelDefinitions = JSON.parse(data.modelDefinitions); const externalDefinitions = JSON.parse(data.externalDefinitions); @@ -69,9 +65,7 @@ module.exports = { const internalDefinitions = parseEntities(data.entities, data.internalDefinitions); if (data.options.targetScriptOptions && data.options.targetScriptOptions.keyword === 'hiveQl') { const needMinify = ( - dependencies.lodash - .get(data, 'options.additionalOptions', []) - .find(option => option.id === 'minify') || {} + _.get(data, 'options.additionalOptions', []).find(option => option.id === 'minify') || {} ).value; const foreignKeyHashTable = foreignKeyHelper.getForeignKeyHashTable( @@ -125,7 +119,6 @@ module.exports = { }, async applyToInstance(data, logger, callback, app) { - setDependencies(app); if (!data.script) { return callback({ message: 'Empty script' }); } @@ -133,7 +126,7 @@ module.exports = { logger.clear(); logger.log('info', data, data.hiddenKeys); - const glueInstance = getGlueInstance(data, app); + const glueInstance = getGlueInstance(data); try { const { db, table } = getApiStatements(data.script); @@ -163,10 +156,9 @@ module.exports = { }, async testConnection(connectionInfo, logger, callback, app) { - setDependencies(app); logger.log('info', connectionInfo, 'Test connection', connectionInfo.hiddenKeys); - const glueInstance = getGlueInstance(connectionInfo, app); + const glueInstance = getGlueInstance(connectionInfo); try { const command = new GetDatabasesCommand(); @@ -188,12 +180,12 @@ const buildAWSCLIScript = (containerData, tableSchema) => { const buildAWSCLIModelScript = (containerData, tablesSchemas = {}) => { const dbStatement = getGlueDatabaseCreateStatement(containerData[0]); const tablesStatements = Object.entries(tablesSchemas).map(([key, value]) => { - return getGlueTableCreateStatement(value, dependencies.lodash.get(containerData[0], 'name', '')); + return getGlueTableCreateStatement(value, _.get(containerData[0], 'name', '')); }); return composeCLIStatements([dbStatement, ...tablesStatements]); }; -const getGlueInstance = (connectionInfo, app) => { +const getGlueInstance = connectionInfo => { const { accessKeyId, secretAccessKey, region, sessionToken } = connectionInfo; return new GlueClient({ region, diff --git a/forward_engineering/appDependencies.js b/forward_engineering/appDependencies.js deleted file mode 100644 index 287e4ac5..00000000 --- a/forward_engineering/appDependencies.js +++ /dev/null @@ -1,10 +0,0 @@ -let dependencies = {}; - -const setDependencies = app => { - dependencies.lodash = app.require('lodash'); -}; - -module.exports = { - setDependencies, - dependencies, -}; diff --git a/forward_engineering/helpers/generalHelper.js b/forward_engineering/helpers/generalHelper.js index f96b7978..9b7126de 100644 --- a/forward_engineering/helpers/generalHelper.js +++ b/forward_engineering/helpers/generalHelper.js @@ -1,6 +1,5 @@ 'use strict'; - -const { dependencies } = require('../appDependencies'); +const _ = require('lodash'); const buildStatement = (mainStatement, isActivated) => { let composeStatements = (...statements) => { @@ -84,7 +83,7 @@ const commentDeactivatedStatements = (statement, isActivated = true) => { }; const commentDeactivatedInlineKeys = (keys, deactivatedKeyNames) => { - const [activatedKeys, deactivatedKeys] = dependencies.lodash.partition( + const [activatedKeys, deactivatedKeys] = _.partition( keys, key => !(deactivatedKeyNames.has(key) || deactivatedKeyNames.has(key.slice(1, -1))), ); @@ -114,7 +113,7 @@ const removeRedundantTrailingCommaFromStatement = statement => { if (splitedStatement.length < 4 || !splitedStatement[splitedStatement.length - 2].trim().startsWith('--')) { return statement; } - const lineWithTrailingCommaIndex = dependencies.lodash.findLastIndex(splitedStatement, line => { + const lineWithTrailingCommaIndex = _.findLastIndex(splitedStatement, line => { if (line.trim() !== ');' && !line.trim().startsWith('--')) { return true; } diff --git a/forward_engineering/helpers/indexHelper.js b/forward_engineering/helpers/indexHelper.js index b1a4db53..45b8df9a 100644 --- a/forward_engineering/helpers/indexHelper.js +++ b/forward_engineering/helpers/indexHelper.js @@ -1,6 +1,6 @@ 'use strict'; -const { dependencies } = require('../appDependencies'); +const _ = require('lodash'); const { getTab, buildStatement, getName, replaceSpaceWithUnderscore } = require('./generalHelper'); const schemaHelper = require('./jsonSchemaHelper'); const { getItemByPath } = require('./jsonSchemaHelper'); @@ -36,7 +36,7 @@ const getIndexKeys = (keys, jsonSchema, definitions) => { [jsonSchema, ...definitions], ); const idToNameHashTable = schemaHelper.getIdToNameHashTable([jsonSchema, ...definitions]); - const [activatedKeys, deactivatedKeys] = dependencies.lodash.partition(paths, path => { + const [activatedKeys, deactivatedKeys] = _.partition(paths, path => { const item = getItemByPath(path, jsonSchema); return item ? item.isActivated : true; }); diff --git a/forward_engineering/helpers/tableHelper.js b/forward_engineering/helpers/tableHelper.js index 1e986330..5b201e82 100644 --- a/forward_engineering/helpers/tableHelper.js +++ b/forward_engineering/helpers/tableHelper.js @@ -1,5 +1,6 @@ 'use strict'; +const _ = require('lodash'); const { buildStatement, getName, @@ -12,7 +13,6 @@ const { } = require('./generalHelper'); const { getColumnsStatement, getColumnStatement, getColumns } = require('./columnHelper'); const keyHelper = require('./keyHelper'); -const { dependencies } = require('../appDependencies'); const getCreateStatement = ({ dbName, @@ -105,7 +105,7 @@ const getSortedKeys = (sortedKeys, deactivatedColumnNames, isParentItemActivated if (!Array.isArray(sortedKeys) || !sortedKeys.length) { return ''; } - const [activatedKeys, deactivatedKeys] = dependencies.lodash.partition( + const [activatedKeys, deactivatedKeys] = _.partition( sortedKeys, keyData => !deactivatedColumnNames.has(keyData.name), ); @@ -129,7 +129,7 @@ const getPartitionKeyStatement = (keys, isParentActivated) => { return ''; } - const [activatedKeys, deactivatedKeys] = dependencies.lodash.partition(keys, key => key.isActivated); + const [activatedKeys, deactivatedKeys] = _.partition(keys, key => key.isActivated); if (!isParentActivated || deactivatedKeys.length === 0) { return { isAllKeysDeactivated: false, keysString: getKeysStatement(keys) }; } diff --git a/reverse_engineering/adaptJsonSchema.js b/reverse_engineering/adaptJsonSchema.js index 43b0a7f6..cc012394 100644 --- a/reverse_engineering/adaptJsonSchema.js +++ b/reverse_engineering/adaptJsonSchema.js @@ -1,16 +1,14 @@ -const { setDependencies } = require('./appDependencies'); +const _ = require('lodash'); const mapJsonSchema = require('./helpers/mapJsonSchema'); -const adaptJsonSchema = (data, logger, callback, app) => { +const adaptJsonSchema = (data, logger, callback) => { try { - setDependencies(app); - const _ = app.require('lodash'); const jsonSchema = JSON.parse(data.jsonSchema); - const result = mapJsonSchema(_)(jsonSchema, {}, (schema, parentJsonSchema, key) => { + const result = mapJsonSchema(jsonSchema, {}, (schema, parentJsonSchema, key) => { if (schema.type === 'array' && !schema.subtype) { return { ...schema, - subtype: getArraySubtypeByChildren(_, schema), + subtype: getArraySubtypeByChildren(schema), }; } else { return schema; @@ -31,7 +29,7 @@ const adaptJsonSchema = (data, logger, callback, app) => { } }; -const getArraySubtypeByChildren = (_, arraySchema) => { +const getArraySubtypeByChildren = arraySchema => { const subtype = type => `array<${type}>`; if (!arraySchema.items) { diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index b3641fc9..e2c5a713 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -1,7 +1,7 @@ -'use strict'; -const logHelper = require('./logHelper'); const fs = require('fs'); const antlr4 = require('antlr4'); +const _ = require('lodash'); +const logHelper = require('./logHelper'); const HiveLexer = require('./parser/HiveLexer.js'); const HiveParser = require('./parser/HiveParser.js'); const hqlToCollectionsVisitor = require('./hqlToCollectionsVisitor.js'); @@ -10,23 +10,22 @@ const ExprErrorListener = require('./antlrErrorListener'); const { adaptJsonSchema } = require('./adaptJsonSchema'); const schemaHelper = require('./schemaHelper'); const connectionHelper = require('./helpers/connectionHelper'); -const { setDependencies, dependencies } = require('./appDependencies'); module.exports = { async connect({ connectionInfo, logger }) { return connectionHelper.connect({ connectionInfo, logger }); }, - disconnect(connectionInfo, logger, cb, app) { + disconnect(connectionInfo, logger, cb) { connectionHelper.close(); cb(); }, - async testConnection(connectionInfo, logger, cb, app) { + async testConnection(connectionInfo, logger, cb) { logInfo('Test connection', connectionInfo, logger); const connection = await this.connect({ connectionInfo, logger }); - const instance = connectionHelper.createInstance({ connection, _: dependencies.lodash, logger }); + const instance = connectionHelper.createInstance({ connection, logger }); try { await instance.getDatabases(); @@ -37,14 +36,12 @@ module.exports = { } }, - async getDbCollectionsNames(connectionInfo, logger, cb, app) { - setDependencies(app); - + async getDbCollectionsNames(connectionInfo, logger, cb) { logInfo('Retrieving databases and tables information', connectionInfo, logger); try { const connection = await this.connect({ connectionInfo, logger }); - const instance = connectionHelper.createInstance({ connection, _: dependencies.lodash, logger }); + const instance = connectionHelper.createInstance({ connection, logger }); const { databaseList, isFullyUploaded } = await instance.getDatabases(); const dbsCollections = databaseList.map(async db => { const dbCollections = await instance.getTables(db.Name); @@ -77,8 +74,7 @@ module.exports = { } }, - async getDbCollectionsData(data, logger, cb, app) { - setDependencies(app); + async getDbCollectionsData(data, logger, cb) { logger.log('info', data, 'Retrieving schema', data.hiddenKeys); const { collectionData } = data; @@ -87,7 +83,7 @@ module.exports = { try { const connection = await this.connect({ connectionInfo: data, logger }); - const instance = connectionHelper.createInstance({ connection, _: dependencies.lodash, logger }); + const instance = connectionHelper.createInstance({ connection, logger }); const tablesDataPromise = databases.map(async dbName => { const dbDescription = await instance.getDatabaseDescription(dbName); @@ -137,10 +133,8 @@ module.exports = { } }, - reFromFile: async (data, logger, callback, app) => { + reFromFile: async (data, logger, callback) => { try { - setDependencies(app); - const _ = dependencies.lodash; const input = await handleFileData(data.filePath); const chars = new antlr4.InputStream(input); const lexer = new HiveLexer.HiveLexer(chars); diff --git a/reverse_engineering/appDependencies.js b/reverse_engineering/appDependencies.js deleted file mode 100644 index 287e4ac5..00000000 --- a/reverse_engineering/appDependencies.js +++ /dev/null @@ -1,10 +0,0 @@ -let dependencies = {}; - -const setDependencies = app => { - dependencies.lodash = app.require('lodash'); -}; - -module.exports = { - setDependencies, - dependencies, -}; diff --git a/reverse_engineering/commandsService.js b/reverse_engineering/commandsService.js index f2001b58..966e366c 100644 --- a/reverse_engineering/commandsService.js +++ b/reverse_engineering/commandsService.js @@ -1,4 +1,4 @@ -const { dependencies } = require('./appDependencies'); +const _ = require('lodash'); const { set, findEntityIndex, @@ -49,7 +49,7 @@ const convertCommandsToEntities = (commands, originalScript) => { const bucket = statementData.bucketName || entitiesData.currentBucket; - if (dependencies.lodash.keys(COMMANDS_ACTION_MAP).includes(command)) { + if (_.keys(COMMANDS_ACTION_MAP).includes(command)) { return COMMANDS_ACTION_MAP[command](entitiesData, bucket, statementData, originalScript); } @@ -182,7 +182,7 @@ const updateField = (entitiesData, bucket, statementData) => { } const entity = entities[index]; - const field = dependencies.lodash.get(entity, 'schema.properties', {})[statementData.name]; + const field = _.get(entity, 'schema.properties', {})[statementData.name]; if (!field) { return entitiesData; } @@ -348,8 +348,6 @@ const addRelationship = (entitiesData, bucket, statementData) => { }; const updateProperties = (properties, statementData) => { - const _ = dependencies.lodash; - return _.fromPairs( _.keys(properties).map(columnName => { if (!statementData.fields.includes(columnName)) { @@ -419,9 +417,9 @@ const addToResourcePlan = (entitiesData, bucket, statementData) => { const updatedResourcePlan = { ...resourcePlans[resourcePlanIndex], - [identifier + 's']: dependencies.lodash - .get(resourcePlans, `${resourcePlanIndex}.${identifier + 's'}`, []) - .concat(statementData[identifier]), + [identifier + 's']: _.get(resourcePlans, `${resourcePlanIndex}.${identifier + 's'}`, []).concat( + statementData[identifier], + ), }; return { @@ -443,7 +441,7 @@ const addMapping = (entitiesData, bucket, statementData) => { } const planPools = resourcePlans[resourceIndex].pools || []; - const poolIndex = dependencies.lodash.findIndex(planPools, ({ name }) => name === statementData.poolName); + const poolIndex = _.findIndex(planPools, ({ name }) => name === statementData.poolName); if (poolIndex < 0) { return entitiesData; } @@ -639,7 +637,7 @@ const removeMapping = (entitiesData, bucket, statementData) => { } const planPools = resourcePlans[resourceIndex].pools || []; - const poolIndex = dependencies.lodash.findIndex(planPools, ({ mappings }) => + const poolIndex = _.findIndex(planPools, ({ mappings }) => (mappings || []).find(({ name }) => name === statementData.name), ); if (poolIndex < 0) { @@ -680,11 +678,11 @@ const updateEntityLevelData = (entitiesData, bucket, statementData) => { }; const getResourcePlanIndex = (resourcePlans, resourceName) => { - return dependencies.lodash.findIndex(resourcePlans, plan => plan.name === resourceName); + return _.findIndex(resourcePlans, plan => plan.name === resourceName); }; const addMappingToPoolByIndex = (pools, poolIndex, mapping) => { - return { ...pools[poolIndex], mappings: dependencies.lodash.get(pools[poolIndex], 'mappings', []).concat(mapping) }; + return { ...pools[poolIndex], mappings: _.get(pools[poolIndex], 'mappings', []).concat(mapping) }; }; const removeMappingFromPool = (pools, poolIndex, mappingName) => { @@ -692,7 +690,6 @@ const removeMappingFromPool = (pools, poolIndex, mappingName) => { }; const getResourcePlanAndItemIndexes = (resourcePlans, statementData, identifier) => { - const _ = dependencies.lodash; const resourcePlanIndex = getResourcePlanIndex(resourcePlans, statementData.resourceName); const items = _.get(resourcePlans, `${resourcePlanIndex}.${identifier + 's'}`, []); const itemIndex = _.findIndex(items, ({ name }) => name === statementData[identifier]); diff --git a/reverse_engineering/helpers/connectionHelper.js b/reverse_engineering/helpers/connectionHelper.js index 3ce8de0b..74c91b3a 100644 --- a/reverse_engineering/helpers/connectionHelper.js +++ b/reverse_engineering/helpers/connectionHelper.js @@ -50,7 +50,7 @@ const close = () => { } }; -const createInstance = ({ connection, _ = {}, logger = {} }) => { +const createInstance = ({ connection, logger = {} }) => { const getDatabases = async () => { const command = new GetDatabasesCommand({ MaxResults: MAX_RESULTS, NextToken: databaseLoadContinuationToken }); const dbsData = await connection.send(command); @@ -91,7 +91,7 @@ const createInstance = ({ connection, _ = {}, logger = {} }) => { const rawTableData = await connection.send(command); - return mapTableData({ tableData: rawTableData, _, logger }); + return mapTableData({ tableData: rawTableData, logger }); }; return { diff --git a/reverse_engineering/helpers/mapJsonSchema.js b/reverse_engineering/helpers/mapJsonSchema.js index 390e4a64..aed55ec8 100644 --- a/reverse_engineering/helpers/mapJsonSchema.js +++ b/reverse_engineering/helpers/mapJsonSchema.js @@ -1,4 +1,6 @@ -const mapJsonSchema = _ => (jsonSchema, parentJsonSchema, callback, key) => { +const _ = require('lodash'); + +const mapJsonSchema = (jsonSchema, parentJsonSchema, callback, key) => { const mapProperties = (properties, mapper) => Object.keys(properties).reduce((newProperties, propertyName) => { const schema = mapper(properties[propertyName], propertyName); @@ -76,7 +78,7 @@ const mapJsonSchema = _ => (jsonSchema, parentJsonSchema, callback, key) => { return jsonSchema; } const copyJsonSchema = Object.assign({}, jsonSchema); - const mapper = _.partial(mapJsonSchema(_), _, copyJsonSchema, callback); + const mapper = _.partial(mapJsonSchema, _, copyJsonSchema, callback); const propertiesLike = ['properties', 'definitions', 'patternProperties']; const itemsLike = ['items', 'not']; const choices = ['oneOf', 'allOf', 'anyOf']; diff --git a/reverse_engineering/helpers/tablePropertiesHelper.js b/reverse_engineering/helpers/tablePropertiesHelper.js index b4b1a9db..e494d22b 100644 --- a/reverse_engineering/helpers/tablePropertiesHelper.js +++ b/reverse_engineering/helpers/tablePropertiesHelper.js @@ -1,3 +1,5 @@ +const _ = require('lodash'); + const mapSortColumns = (items = []) => { return items.map(item => ({ name: item.Column, @@ -17,7 +19,6 @@ const mapSerDeParameters = (parameters = {}) => { return Object.entries(parameters).reduce((acc, [key, value]) => { if (key !== 'paths') { acc.push({ serDeKey: key, serDeValue: value }); - return acc; } return acc; }, []); @@ -76,7 +77,7 @@ const mapColumns = ({ columns = [], logger = {} }) => { return mapped; }; -const mapTableData = ({ tableData, _, logger }) => { +const mapTableData = ({ tableData, logger }) => { const partitionKeys = mapColumns({ columns: tableData.Table.PartitionKeys, logger }); return { diff --git a/reverse_engineering/hqlToCollectionsVisitor.js b/reverse_engineering/hqlToCollectionsVisitor.js index 89cb8280..162b4cec 100644 --- a/reverse_engineering/hqlToCollectionsVisitor.js +++ b/reverse_engineering/hqlToCollectionsVisitor.js @@ -1,3 +1,4 @@ +const _ = require('lodash'); const { HiveParserVisitor } = require('./parser/HiveParserVisitor'); const { HiveParser } = require('./parser/HiveParser'); const { @@ -29,7 +30,6 @@ const { } = require('./commandsService'); const schemaHelper = require('./schemaHelper'); -const { dependencies } = require('./appDependencies'); const ALLOWED_COMMANDS = [ HiveParser.RULE_createTableStatement, @@ -70,7 +70,6 @@ class Visitor extends HiveParserVisitor { } visitCreateTableStatement(ctx) { - const _ = dependencies.lodash; const [tableName, tableLikeName] = this.visit(ctx.tableName()); const compositePartitionKey = this.visitWhenExists(ctx, 'tablePartition', []); const { compositeClusteringKey, numBuckets, sortedByKey } = this.visitWhenExists(ctx, 'tableBuckets', {}); @@ -750,7 +749,7 @@ class Visitor extends HiveParserVisitor { if (!complexTypes) { return { - type: dependencies.lodash.uniq(types.map(schema => schema.type)), + type: _.uniq(types.map(schema => schema.type)), }; } @@ -1022,7 +1021,6 @@ class Visitor extends HiveParserVisitor { } visitCreateIndexStatement(ctx) { - const _ = dependencies.lodash; const { name, database, table, columns, SecIndxHandler } = this.visit(ctx.createIndexMainStatement()); const SecIndxWithDeferredRebuild = Boolean(ctx.KW_WITH() && ctx.KW_DEFERRED() && ctx.KW_REBUILD()); const SecIndxProperties = this.visitWhenExists(ctx, 'tableProperties'); @@ -1100,7 +1098,7 @@ class Visitor extends HiveParserVisitor { } visitRpAssignList(ctx) { - return this.visit(ctx.rpAssign()).find(({ parallelism }) => !dependencies.lodash.isEmpty(parallelism)); + return this.visit(ctx.rpAssign()).find(({ parallelism }) => !_.isEmpty(parallelism)); } visitRpAssign(ctx) { diff --git a/reverse_engineering/schemaHelper.js b/reverse_engineering/schemaHelper.js index d23b19cd..736991a4 100644 --- a/reverse_engineering/schemaHelper.js +++ b/reverse_engineering/schemaHelper.js @@ -1,4 +1,4 @@ -const { dependencies } = require('./appDependencies'); +const _ = require('lodash'); const cleanContent = str => { const start = str.indexOf('<'); @@ -188,7 +188,7 @@ const parseSet = ([content], sample = []) => { const parsePrimitive = ([type]) => { const preparedType = type.trim().toLowerCase(); const hiveType = preparedType.replace(/\(.*?\)$/, ''); - const modifiers = dependencies.lodash.get(preparedType.match(/\((.*?)\)$/), '[1]', '').split(','); + const modifiers = _.get(preparedType.match(/\((.*?)\)$/), '[1]', '').split(','); switch (hiveType) { case 'string': @@ -243,7 +243,7 @@ const parseUnion = (types, sample) => { if (!complexTypes) { return { - type: dependencies.lodash.uniq(jsonSchemas.map(schema => schema.type)), + type: _.uniq(jsonSchemas.map(schema => schema.type)), }; } From 7141bf1886327ad0d2876e338a9d5430180803a4 Mon Sep 17 00:00:00 2001 From: chulanovskyi Date: Fri, 30 Aug 2024 12:26:02 +0300 Subject: [PATCH 08/18] chore: removed `@aws-sdk/fetch-http-handler` package --- package-lock.json | 109 +--------------------------------------------- package.json | 1 - 2 files changed, 2 insertions(+), 108 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2c39f153..87889095 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,14 @@ { "name": "Glue", - "version": "0.2.2", + "version": "0.2.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "Glue", - "version": "0.2.2", + "version": "0.2.8", "dependencies": { "@aws-sdk/client-glue": "3.613.0", - "@aws-sdk/fetch-http-handler": "3.374.0", "antlr4": "4.8.0", "lodash": "4.17.21" }, @@ -495,110 +494,6 @@ "@aws-sdk/client-sts": "^3.609.0" } }, - "node_modules/@aws-sdk/fetch-http-handler": { - "version": "3.374.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.374.0.tgz", - "integrity": "sha512-Xt+4F6tGi/q9Z32kLo8SSm9krLlCY2oTLxCfP3/1SKY2wqWKHjAgpLmPD+GW7fdMjAwhDqzW5ZhcSmvHNvoD/w==", - "deprecated": "This package has moved to @smithy/fetch-http-handler", - "dependencies": { - "@smithy/fetch-http-handler": "^1.0.1", - "tslib": "^2.5.0" - } - }, - "node_modules/@aws-sdk/fetch-http-handler/node_modules/@smithy/fetch-http-handler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-1.1.0.tgz", - "integrity": "sha512-N22C9R44u5WGlcY+Wuv8EXmCAq62wWwriRAuoczMEwAIjPbvHSthyPSLqI4S7kAST1j6niWg8kwpeJ3ReAv3xg==", - "dependencies": { - "@smithy/protocol-http": "^1.2.0", - "@smithy/querystring-builder": "^1.1.0", - "@smithy/types": "^1.2.0", - "@smithy/util-base64": "^1.1.0", - "tslib": "^2.5.0" - } - }, - "node_modules/@aws-sdk/fetch-http-handler/node_modules/@smithy/is-array-buffer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-1.1.0.tgz", - "integrity": "sha512-twpQ/n+3OWZJ7Z+xu43MJErmhB/WO/mMTnqR6PwWQShvSJ/emx5d1N59LQZk6ZpTAeuRWrc+eHhkzTp9NFjNRQ==", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/fetch-http-handler/node_modules/@smithy/protocol-http": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-1.2.0.tgz", - "integrity": "sha512-GfGfruksi3nXdFok5RhgtOnWe5f6BndzYfmEXISD+5gAGdayFGpjWu5pIqIweTudMtse20bGbc+7MFZXT1Tb8Q==", - "dependencies": { - "@smithy/types": "^1.2.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/fetch-http-handler/node_modules/@smithy/querystring-builder": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-1.1.0.tgz", - "integrity": "sha512-gDEi4LxIGLbdfjrjiY45QNbuDmpkwh9DX4xzrR2AzjjXpxwGyfSpbJaYhXARw9p17VH0h9UewnNQXNwaQyYMDA==", - "dependencies": { - "@smithy/types": "^1.2.0", - "@smithy/util-uri-escape": "^1.1.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/fetch-http-handler/node_modules/@smithy/types": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.2.0.tgz", - "integrity": "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/fetch-http-handler/node_modules/@smithy/util-base64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-1.1.0.tgz", - "integrity": "sha512-FpYmDmVbOXAxqvoVCwqehUN0zXS+lN8V7VS9O7I8MKeVHdSTsZzlwiMEvGoyTNOXWn8luF4CTDYgNHnZViR30g==", - "dependencies": { - "@smithy/util-buffer-from": "^1.1.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/fetch-http-handler/node_modules/@smithy/util-buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-1.1.0.tgz", - "integrity": "sha512-9m6NXE0ww+ra5HKHCHig20T+FAwxBAm7DIdwc/767uGWbRcY720ybgPacQNB96JMOI7xVr/CDa3oMzKmW4a+kw==", - "dependencies": { - "@smithy/is-array-buffer": "^1.1.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/fetch-http-handler/node_modules/@smithy/util-uri-escape": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-1.1.0.tgz", - "integrity": "sha512-/jL/V1xdVRt5XppwiaEU8Etp5WHZj609n0xMTuehmCqdoOFbId1M+aEeDWZsQ+8JbEB/BJ6ynY2SlYmOaKtt8w==", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@aws-sdk/middleware-host-header": { "version": "3.609.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.609.0.tgz", diff --git a/package.json b/package.json index 0c0c9b43..fcd02878 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,6 @@ "description": "Hackolade plugin for AWS Glue Data Catalog", "dependencies": { "@aws-sdk/client-glue": "3.613.0", - "@aws-sdk/fetch-http-handler": "3.374.0", "antlr4": "4.8.0", "lodash": "4.17.21" }, From d5fdf6672269a2abbe2eae7f2db86c17a312d783 Mon Sep 17 00:00:00 2001 From: chulanovskyi Date: Fri, 30 Aug 2024 12:30:25 +0300 Subject: [PATCH 09/18] feat: start using own request handler in FE --- forward_engineering/api.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/forward_engineering/api.js b/forward_engineering/api.js index c409dde9..3f509186 100644 --- a/forward_engineering/api.js +++ b/forward_engineering/api.js @@ -10,6 +10,7 @@ const { getGlueDatabaseCreateStatement } = require('./helpers/awsCliScriptHelper const { getGlueTableCreateStatement } = require('./helpers/awsCliScriptHelpers/glueTableHelper'); const { getApiStatements } = require('./helpers/awsCliScriptHelpers/applyToInstanceHelper'); const sqlFormatter = require('./custom_modules/sql-formatter'); +const { HttpHandler } = require('../shared/httpHandler/httpHandler'); module.exports = { generateScript(data, logger, callback) { @@ -118,7 +119,7 @@ module.exports = { } }, - async applyToInstance(data, logger, callback, app) { + async applyToInstance(data, logger, callback) { if (!data.script) { return callback({ message: 'Empty script' }); } @@ -126,7 +127,7 @@ module.exports = { logger.clear(); logger.log('info', data, data.hiddenKeys); - const glueInstance = getGlueInstance(data); + const glueInstance = getGlueInstance({ connectionInfo: data, logger }); try { const { db, table } = getApiStatements(data.script); @@ -155,10 +156,10 @@ module.exports = { } }, - async testConnection(connectionInfo, logger, callback, app) { + async testConnection(connectionInfo, logger, callback) { logger.log('info', connectionInfo, 'Test connection', connectionInfo.hiddenKeys); - const glueInstance = getGlueInstance(connectionInfo); + const glueInstance = getGlueInstance({ connectionInfo, logger }); try { const command = new GetDatabasesCommand(); @@ -185,8 +186,10 @@ const buildAWSCLIModelScript = (containerData, tablesSchemas = {}) => { return composeCLIStatements([dbStatement, ...tablesStatements]); }; -const getGlueInstance = connectionInfo => { - const { accessKeyId, secretAccessKey, region, sessionToken } = connectionInfo; +const getGlueInstance = ({ connectionInfo, logger }) => { + const { accessKeyId, secretAccessKey, region, sessionToken, queryRequestTimeout } = connectionInfo; + const httpHandler = new HttpHandler({ logger, requestTimeout: queryRequestTimeout }); + return new GlueClient({ region, credentials: { @@ -194,6 +197,7 @@ const getGlueInstance = connectionInfo => { secretAccessKey, sessionToken, }, + requestHandler: httpHandler, }); }; From 954b681c510a26c2934441123c58e010321e644b Mon Sep 17 00:00:00 2001 From: chulanovskyi Date: Fri, 30 Aug 2024 13:06:49 +0300 Subject: [PATCH 10/18] chore: use lodash discreetly --- forward_engineering/api.js | 8 ++-- forward_engineering/helpers/generalHelper.js | 6 +-- forward_engineering/helpers/indexHelper.js | 4 +- forward_engineering/helpers/tableHelper.js | 6 +-- reverse_engineering/adaptJsonSchema.js | 4 +- reverse_engineering/api.js | 4 +- reverse_engineering/commandsService.js | 24 ++++++------ reverse_engineering/helpers/mapJsonSchema.js | 38 ++++++++++++------- .../helpers/tablePropertiesHelper.js | 8 ++-- .../hqlToCollectionsVisitor.js | 14 +++---- reverse_engineering/schemaHelper.js | 6 +-- 11 files changed, 67 insertions(+), 55 deletions(-) diff --git a/forward_engineering/api.js b/forward_engineering/api.js index 3f509186..aaa87fdd 100644 --- a/forward_engineering/api.js +++ b/forward_engineering/api.js @@ -1,6 +1,6 @@ 'use strict'; -const _ = require('lodash'); +const { get } = require('lodash'); const { GlueClient, CreateDatabaseCommand, CreateTableCommand, GetDatabasesCommand } = require('@aws-sdk/client-glue'); const { getDatabaseStatement } = require('./helpers/databaseHelper'); const { getTableStatement } = require('./helpers/tableHelper'); @@ -24,7 +24,7 @@ module.exports = { if (data.options.targetScriptOptions && data.options.targetScriptOptions.keyword === 'hiveQl') { const needMinify = ( - _.get(data, 'options.additionalOptions', []).find(option => option.id === 'minify') || {} + get(data, 'options.additionalOptions', []).find(option => option.id === 'minify') || {} ).value; return callback( @@ -66,7 +66,7 @@ module.exports = { const internalDefinitions = parseEntities(data.entities, data.internalDefinitions); if (data.options.targetScriptOptions && data.options.targetScriptOptions.keyword === 'hiveQl') { const needMinify = ( - _.get(data, 'options.additionalOptions', []).find(option => option.id === 'minify') || {} + get(data, 'options.additionalOptions', []).find(option => option.id === 'minify') || {} ).value; const foreignKeyHashTable = foreignKeyHelper.getForeignKeyHashTable( @@ -181,7 +181,7 @@ const buildAWSCLIScript = (containerData, tableSchema) => { const buildAWSCLIModelScript = (containerData, tablesSchemas = {}) => { const dbStatement = getGlueDatabaseCreateStatement(containerData[0]); const tablesStatements = Object.entries(tablesSchemas).map(([key, value]) => { - return getGlueTableCreateStatement(value, _.get(containerData[0], 'name', '')); + return getGlueTableCreateStatement(value, get(containerData[0], 'name', '')); }); return composeCLIStatements([dbStatement, ...tablesStatements]); }; diff --git a/forward_engineering/helpers/generalHelper.js b/forward_engineering/helpers/generalHelper.js index 9b7126de..42e3fb70 100644 --- a/forward_engineering/helpers/generalHelper.js +++ b/forward_engineering/helpers/generalHelper.js @@ -1,5 +1,5 @@ 'use strict'; -const _ = require('lodash'); +const { partition, findLastIndex } = require('lodash'); const buildStatement = (mainStatement, isActivated) => { let composeStatements = (...statements) => { @@ -83,7 +83,7 @@ const commentDeactivatedStatements = (statement, isActivated = true) => { }; const commentDeactivatedInlineKeys = (keys, deactivatedKeyNames) => { - const [activatedKeys, deactivatedKeys] = _.partition( + const [activatedKeys, deactivatedKeys] = partition( keys, key => !(deactivatedKeyNames.has(key) || deactivatedKeyNames.has(key.slice(1, -1))), ); @@ -113,7 +113,7 @@ const removeRedundantTrailingCommaFromStatement = statement => { if (splitedStatement.length < 4 || !splitedStatement[splitedStatement.length - 2].trim().startsWith('--')) { return statement; } - const lineWithTrailingCommaIndex = _.findLastIndex(splitedStatement, line => { + const lineWithTrailingCommaIndex = findLastIndex(splitedStatement, line => { if (line.trim() !== ');' && !line.trim().startsWith('--')) { return true; } diff --git a/forward_engineering/helpers/indexHelper.js b/forward_engineering/helpers/indexHelper.js index 45b8df9a..ed531784 100644 --- a/forward_engineering/helpers/indexHelper.js +++ b/forward_engineering/helpers/indexHelper.js @@ -1,6 +1,6 @@ 'use strict'; -const _ = require('lodash'); +const { partition } = require('lodash'); const { getTab, buildStatement, getName, replaceSpaceWithUnderscore } = require('./generalHelper'); const schemaHelper = require('./jsonSchemaHelper'); const { getItemByPath } = require('./jsonSchemaHelper'); @@ -36,7 +36,7 @@ const getIndexKeys = (keys, jsonSchema, definitions) => { [jsonSchema, ...definitions], ); const idToNameHashTable = schemaHelper.getIdToNameHashTable([jsonSchema, ...definitions]); - const [activatedKeys, deactivatedKeys] = _.partition(paths, path => { + const [activatedKeys, deactivatedKeys] = partition(paths, path => { const item = getItemByPath(path, jsonSchema); return item ? item.isActivated : true; }); diff --git a/forward_engineering/helpers/tableHelper.js b/forward_engineering/helpers/tableHelper.js index 5b201e82..55960d83 100644 --- a/forward_engineering/helpers/tableHelper.js +++ b/forward_engineering/helpers/tableHelper.js @@ -1,6 +1,6 @@ 'use strict'; -const _ = require('lodash'); +const { partition } = require('lodash'); const { buildStatement, getName, @@ -105,7 +105,7 @@ const getSortedKeys = (sortedKeys, deactivatedColumnNames, isParentItemActivated if (!Array.isArray(sortedKeys) || !sortedKeys.length) { return ''; } - const [activatedKeys, deactivatedKeys] = _.partition( + const [activatedKeys, deactivatedKeys] = partition( sortedKeys, keyData => !deactivatedColumnNames.has(keyData.name), ); @@ -129,7 +129,7 @@ const getPartitionKeyStatement = (keys, isParentActivated) => { return ''; } - const [activatedKeys, deactivatedKeys] = _.partition(keys, key => key.isActivated); + const [activatedKeys, deactivatedKeys] = partition(keys, key => key.isActivated); if (!isParentActivated || deactivatedKeys.length === 0) { return { isAllKeysDeactivated: false, keysString: getKeysStatement(keys) }; } diff --git a/reverse_engineering/adaptJsonSchema.js b/reverse_engineering/adaptJsonSchema.js index cc012394..5efe7a0c 100644 --- a/reverse_engineering/adaptJsonSchema.js +++ b/reverse_engineering/adaptJsonSchema.js @@ -1,4 +1,4 @@ -const _ = require('lodash'); +const { uniq } = require('lodash'); const mapJsonSchema = require('./helpers/mapJsonSchema'); const adaptJsonSchema = (data, logger, callback) => { @@ -36,7 +36,7 @@ const getArraySubtypeByChildren = arraySchema => { return; } - if (Array.isArray(arraySchema.items) && _.uniq(arraySchema.items.map(item => item.type)).length > 1) { + if (Array.isArray(arraySchema.items) && uniq(arraySchema.items.map(item => item.type)).length > 1) { return subtype('union'); } diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index e2c5a713..b2a73322 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -1,6 +1,6 @@ const fs = require('fs'); const antlr4 = require('antlr4'); -const _ = require('lodash'); +const { flatten } = require('lodash'); const logHelper = require('./logHelper'); const HiveLexer = require('./parser/HiveLexer.js'); const HiveParser = require('./parser/HiveParser.js'); @@ -150,7 +150,7 @@ module.exports = { const commands = tree.accept(hqlToCollectionsGenerator); const { result, info, relationships } = commandsService.convertCommandsToReDocs( - _.flatten(commands).filter(Boolean), + flatten(commands).filter(Boolean), input, ); callback(null, result, info, relationships, 'multipleSchema'); diff --git a/reverse_engineering/commandsService.js b/reverse_engineering/commandsService.js index 966e366c..40f721da 100644 --- a/reverse_engineering/commandsService.js +++ b/reverse_engineering/commandsService.js @@ -1,4 +1,4 @@ -const _ = require('lodash'); +const { keys, get, fromPairs, findIndex } = require('lodash'); const { set, findEntityIndex, @@ -49,7 +49,7 @@ const convertCommandsToEntities = (commands, originalScript) => { const bucket = statementData.bucketName || entitiesData.currentBucket; - if (_.keys(COMMANDS_ACTION_MAP).includes(command)) { + if (keys(COMMANDS_ACTION_MAP).includes(command)) { return COMMANDS_ACTION_MAP[command](entitiesData, bucket, statementData, originalScript); } @@ -182,7 +182,7 @@ const updateField = (entitiesData, bucket, statementData) => { } const entity = entities[index]; - const field = _.get(entity, 'schema.properties', {})[statementData.name]; + const field = get(entity, 'schema.properties', {})[statementData.name]; if (!field) { return entitiesData; } @@ -348,8 +348,8 @@ const addRelationship = (entitiesData, bucket, statementData) => { }; const updateProperties = (properties, statementData) => { - return _.fromPairs( - _.keys(properties).map(columnName => { + return fromPairs( + keys(properties).map(columnName => { if (!statementData.fields.includes(columnName)) { return [columnName, properties[columnName]]; } @@ -417,7 +417,7 @@ const addToResourcePlan = (entitiesData, bucket, statementData) => { const updatedResourcePlan = { ...resourcePlans[resourcePlanIndex], - [identifier + 's']: _.get(resourcePlans, `${resourcePlanIndex}.${identifier + 's'}`, []).concat( + [identifier + 's']: get(resourcePlans, `${resourcePlanIndex}.${identifier + 's'}`, []).concat( statementData[identifier], ), }; @@ -441,7 +441,7 @@ const addMapping = (entitiesData, bucket, statementData) => { } const planPools = resourcePlans[resourceIndex].pools || []; - const poolIndex = _.findIndex(planPools, ({ name }) => name === statementData.poolName); + const poolIndex = findIndex(planPools, ({ name }) => name === statementData.poolName); if (poolIndex < 0) { return entitiesData; } @@ -637,7 +637,7 @@ const removeMapping = (entitiesData, bucket, statementData) => { } const planPools = resourcePlans[resourceIndex].pools || []; - const poolIndex = _.findIndex(planPools, ({ mappings }) => + const poolIndex = findIndex(planPools, ({ mappings }) => (mappings || []).find(({ name }) => name === statementData.name), ); if (poolIndex < 0) { @@ -678,11 +678,11 @@ const updateEntityLevelData = (entitiesData, bucket, statementData) => { }; const getResourcePlanIndex = (resourcePlans, resourceName) => { - return _.findIndex(resourcePlans, plan => plan.name === resourceName); + return findIndex(resourcePlans, plan => plan.name === resourceName); }; const addMappingToPoolByIndex = (pools, poolIndex, mapping) => { - return { ...pools[poolIndex], mappings: _.get(pools[poolIndex], 'mappings', []).concat(mapping) }; + return { ...pools[poolIndex], mappings: get(pools[poolIndex], 'mappings', []).concat(mapping) }; }; const removeMappingFromPool = (pools, poolIndex, mappingName) => { @@ -691,8 +691,8 @@ const removeMappingFromPool = (pools, poolIndex, mappingName) => { const getResourcePlanAndItemIndexes = (resourcePlans, statementData, identifier) => { const resourcePlanIndex = getResourcePlanIndex(resourcePlans, statementData.resourceName); - const items = _.get(resourcePlans, `${resourcePlanIndex}.${identifier + 's'}`, []); - const itemIndex = _.findIndex(items, ({ name }) => name === statementData[identifier]); + const items = get(resourcePlans, `${resourcePlanIndex}.${identifier + 's'}`, []); + const itemIndex = findIndex(items, ({ name }) => name === statementData[identifier]); return { resourcePlanIndex, itemIndex }; }; diff --git a/reverse_engineering/helpers/mapJsonSchema.js b/reverse_engineering/helpers/mapJsonSchema.js index aed55ec8..4863732d 100644 --- a/reverse_engineering/helpers/mapJsonSchema.js +++ b/reverse_engineering/helpers/mapJsonSchema.js @@ -1,11 +1,11 @@ -const _ = require('lodash'); +const { isEmpty, isPlainObject, has, partial } = require('lodash'); const mapJsonSchema = (jsonSchema, parentJsonSchema, callback, key) => { const mapProperties = (properties, mapper) => Object.keys(properties).reduce((newProperties, propertyName) => { const schema = mapper(properties[propertyName], propertyName); - if (_.isEmpty(schema)) { + if (isEmpty(schema)) { return newProperties; } @@ -13,8 +13,8 @@ const mapJsonSchema = (jsonSchema, parentJsonSchema, callback, key) => { }, {}); const mapItems = (items, mapper) => { if (Array.isArray(items)) { - return items.map((jsonSchema, i) => mapper(jsonSchema, i)).filter(item => !_.isEmpty(item)); - } else if (_.isPlainObject(items)) { + return items.map((jsonSchema, i) => mapper(jsonSchema, i)).filter(item => !isEmpty(item)); + } else if (isPlainObject(items)) { return mapper(items, 0); } else { return items; @@ -35,16 +35,16 @@ const mapJsonSchema = (jsonSchema, parentJsonSchema, callback, key) => { const subSchema = subSchemasUpdated[0]; - if (!_.has(subSchema, 'properties')) { + if (!has(subSchema, 'properties')) { return subSchemasUpdated; } - if (!_.has(parentJsonSchema, 'properties')) { + if (!has(parentJsonSchema, 'properties')) { parentJsonSchema.properties = {}; } Object.keys(subSchema.properties).forEach(key => { - if (_.has(parentJsonSchema, 'properties.' + key)) { + if (has(parentJsonSchema, 'properties.' + key)) { return; } @@ -61,7 +61,7 @@ const mapJsonSchema = (jsonSchema, parentJsonSchema, callback, key) => { const schema = mapper(jsonSchema[propertyName], propertyName); - if (_.isEmpty(schema)) { + if (isEmpty(schema)) { const copySchema = Object.assign({}, jsonSchema); delete copySchema[propertyName]; @@ -74,18 +74,30 @@ const mapJsonSchema = (jsonSchema, parentJsonSchema, callback, key) => { }); }, jsonSchema); }; - if (!_.isPlainObject(jsonSchema)) { + if (!isPlainObject(jsonSchema)) { return jsonSchema; } const copyJsonSchema = Object.assign({}, jsonSchema); - const mapper = _.partial(mapJsonSchema, _, copyJsonSchema, callback); + const mapper = partial(mapJsonSchema, partial.placeholder, copyJsonSchema, callback); const propertiesLike = ['properties', 'definitions', 'patternProperties']; const itemsLike = ['items', 'not']; const choices = ['oneOf', 'allOf', 'anyOf']; - const jsonSchemaWithNewProperties = applyTo(propertiesLike, copyJsonSchema, _.partial(mapProperties, _, mapper)); - const updatedItems = applyTo(itemsLike, jsonSchemaWithNewProperties, _.partial(mapItems, _, mapper)); - const newJsonSchema = applyTo(choices, updatedItems, _.partial(mapChoices, updatedItems, _, mapper)); + const jsonSchemaWithNewProperties = applyTo( + propertiesLike, + copyJsonSchema, + partial(mapProperties, partial.placeholder, mapper), + ); + const updatedItems = applyTo( + itemsLike, + jsonSchemaWithNewProperties, + partial(mapItems, partial.placeholder, mapper), + ); + const newJsonSchema = applyTo( + choices, + updatedItems, + partial(mapChoices, updatedItems, partial.placeholder, mapper), + ); return callback(newJsonSchema, parentJsonSchema, key); }; diff --git a/reverse_engineering/helpers/tablePropertiesHelper.js b/reverse_engineering/helpers/tablePropertiesHelper.js index e494d22b..57819f3c 100644 --- a/reverse_engineering/helpers/tablePropertiesHelper.js +++ b/reverse_engineering/helpers/tablePropertiesHelper.js @@ -1,4 +1,4 @@ -const _ = require('lodash'); +const { get } = require('lodash'); const mapSortColumns = (items = []) => { return items.map(item => ({ @@ -11,8 +11,8 @@ const getSerDeLibrary = (data = {}) => { return data.SerializationLibrary; }; -const mapSerDePaths = (_, data = {}) => { - return _.get(data, 'Parameters.paths', '').split(','); +const mapSerDePaths = (data = {}) => { + return get(data, 'Parameters.paths', '').split(','); }; const mapSerDeParameters = (parameters = {}) => { @@ -96,7 +96,7 @@ const mapTableData = ({ tableData, logger }) => { inputFormatClassname: tableData.Table.StorageDescriptor?.InputFormat, outputFormatClassname: tableData.Table.StorageDescriptor?.OutputFormat, serDeLibrary: getSerDeLibrary(tableData.Table.StorageDescriptor?.SerdeInfo), - parameterPaths: mapSerDePaths(_, tableData.Table.StorageDescriptor?.SerdeInfo), + parameterPaths: mapSerDePaths(tableData.Table.StorageDescriptor?.SerdeInfo), serDeParameters: mapSerDeParameters(tableData.Table.StorageDescriptor?.SerdeInfo?.Parameters), classification: getClassification(tableData.Table.Parameters), }, diff --git a/reverse_engineering/hqlToCollectionsVisitor.js b/reverse_engineering/hqlToCollectionsVisitor.js index 162b4cec..9f6a31dd 100644 --- a/reverse_engineering/hqlToCollectionsVisitor.js +++ b/reverse_engineering/hqlToCollectionsVisitor.js @@ -1,4 +1,4 @@ -const _ = require('lodash'); +const { pickBy, isNumber, isBoolean, isEmpty, uniq } = require('lodash'); const { HiveParserVisitor } = require('./parser/HiveParserVisitor'); const { HiveParser } = require('./parser/HiveParser'); const { @@ -103,7 +103,7 @@ class Visitor extends HiveParserVisitor { properties: { ...properties, ...convertKeysToProperties(compositePartitionKey) }, }), tableLikeName: (tableLikeName || {}).table, - entityLevelData: _.pickBy( + entityLevelData: pickBy( { temporaryTable, externalTable, @@ -120,7 +120,7 @@ class Visitor extends HiveParserVisitor { ...storedAsTable, ...tableRowFormat, }, - prop => _.isNumber(prop) || _.isBoolean(prop) || !_.isEmpty(prop), + prop => isNumber(prop) || isBoolean(prop) || !isEmpty(prop), ), }, ...tableForeignKeys.map(fkData => ({ @@ -749,7 +749,7 @@ class Visitor extends HiveParserVisitor { if (!complexTypes) { return { - type: _.uniq(types.map(schema => schema.type)), + type: uniq(types.map(schema => schema.type)), }; } @@ -1033,7 +1033,7 @@ class Visitor extends HiveParserVisitor { collectionName: table, name, columns, - data: _.pickBy( + data: pickBy( { SecIndxWithDeferredRebuild, SecIndxHandler, @@ -1041,7 +1041,7 @@ class Visitor extends HiveParserVisitor { SecIndxTable, SecIndxComments, }, - prop => _.isBoolean(prop) || !_.isEmpty(prop), + prop => isBoolean(prop) || !isEmpty(prop), ), }; } @@ -1098,7 +1098,7 @@ class Visitor extends HiveParserVisitor { } visitRpAssignList(ctx) { - return this.visit(ctx.rpAssign()).find(({ parallelism }) => !_.isEmpty(parallelism)); + return this.visit(ctx.rpAssign()).find(({ parallelism }) => !isEmpty(parallelism)); } visitRpAssign(ctx) { diff --git a/reverse_engineering/schemaHelper.js b/reverse_engineering/schemaHelper.js index 736991a4..db71d663 100644 --- a/reverse_engineering/schemaHelper.js +++ b/reverse_engineering/schemaHelper.js @@ -1,4 +1,4 @@ -const _ = require('lodash'); +const { get, uniq } = require('lodash'); const cleanContent = str => { const start = str.indexOf('<'); @@ -188,7 +188,7 @@ const parseSet = ([content], sample = []) => { const parsePrimitive = ([type]) => { const preparedType = type.trim().toLowerCase(); const hiveType = preparedType.replace(/\(.*?\)$/, ''); - const modifiers = _.get(preparedType.match(/\((.*?)\)$/), '[1]', '').split(','); + const modifiers = get(preparedType.match(/\((.*?)\)$/), '[1]', '').split(','); switch (hiveType) { case 'string': @@ -243,7 +243,7 @@ const parseUnion = (types, sample) => { if (!complexTypes) { return { - type: _.uniq(jsonSchemas.map(schema => schema.type)), + type: uniq(jsonSchemas.map(schema => schema.type)), }; } From 37063a38f31d1dba358573ad91f93bdec72b4f30 Mon Sep 17 00:00:00 2001 From: chulanovskyi Date: Fri, 30 Aug 2024 13:10:17 +0300 Subject: [PATCH 11/18] fix: declared `electron` as external package --- esbuild.package.js | 1 + 1 file changed, 1 insertion(+) diff --git a/esbuild.package.js b/esbuild.package.js index abf352dc..3e14673c 100644 --- a/esbuild.package.js +++ b/esbuild.package.js @@ -34,5 +34,6 @@ esbuild }), addReleaseFlag(path.resolve(RELEASE_FOLDER_PATH, 'package.json')), ], + external: ['electron'], }) .catch(() => process.exit(1)); From 34dd747686d7c3b8782c9d623d15cccad39008a9 Mon Sep 17 00:00:00 2001 From: chulanovskyi Date: Fri, 30 Aug 2024 13:24:25 +0300 Subject: [PATCH 12/18] chore: declared `electron` as peer dependency --- package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index fcd02878..519bc61d 100644 --- a/package.json +++ b/package.json @@ -64,5 +64,8 @@ "lint-staged": "14.0.1", "prettier": "3.2.5", "simple-git-hooks": "2.11.1" - } + }, + "peerDependencies": { + "electron": "^31" + } } From d1f39503f950b08fa6bfdf312e00bf174258fca6 Mon Sep 17 00:00:00 2001 From: chulanovskyi Date: Fri, 30 Aug 2024 13:38:40 +0300 Subject: [PATCH 13/18] fix: preserve error trace in reject --- reverse_engineering/api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index b2a73322..23b55e55 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -169,7 +169,7 @@ const handleFileData = filePath => { return new Promise((resolve, reject) => { fs.readFile(filePath, 'utf-8', (err, content) => { if (err) { - reject(new Error(`handle file data error: ${err}`)); + reject(err); } else { resolve(content); } From 50c1732210083ba4ff9b97c56336b5fb0850a21b Mon Sep 17 00:00:00 2001 From: chulanovskyi-bs <56116665+chulanovskyi-bs@users.noreply.github.com> Date: Fri, 30 Aug 2024 11:25:33 +0000 Subject: [PATCH 14/18] Update shared/httpHandler/httpHandler.js Co-authored-by: Ugo Bechameil --- shared/httpHandler/httpHandler.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/shared/httpHandler/httpHandler.js b/shared/httpHandler/httpHandler.js index 588a4e3c..06204319 100644 --- a/shared/httpHandler/httpHandler.js +++ b/shared/httpHandler/httpHandler.js @@ -70,11 +70,7 @@ class HttpHandler { const resultResolver = async result => { const fetchHeaders = result.headers; - const transformedHeaders = {}; - - for (const [headerKey, headerValue] of fetchHeaders.entries()) { - transformedHeaders[headerKey] = headerValue; - } + const transformedHeaders = Object.fromEntries(fetchHeaders.entries()); const hasReadableStream = result.body !== undefined; From 45ade36d5182ea3dbda4d00d5d3b7704726a8e2b Mon Sep 17 00:00:00 2001 From: chulanovskyi Date: Fri, 30 Aug 2024 14:28:20 +0300 Subject: [PATCH 15/18] chore: replace Promise.reject with a throw statement --- shared/httpHandler/httpHandler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/httpHandler/httpHandler.js b/shared/httpHandler/httpHandler.js index 588a4e3c..86e388db 100644 --- a/shared/httpHandler/httpHandler.js +++ b/shared/httpHandler/httpHandler.js @@ -33,7 +33,7 @@ class HttpHandler { */ async handle(request, { abortSignal } = {}) { if (abortSignal?.aborted) { - return Promise.reject(this.getAbortError()); + throw this.getAbortError(); } const { method, query, protocol, port, hostname, body, headers: requestHeaders } = request; From ea27b561516382d68fb0e9ce48e271fac9ab4f16 Mon Sep 17 00:00:00 2001 From: chulanovskyi Date: Fri, 30 Aug 2024 14:43:45 +0300 Subject: [PATCH 16/18] fix: replaced own implementation of query builder with native URLSearchParams --- shared/httpHandler/httpHandler.js | 3 +-- shared/httpHandler/queryBuilder.js | 25 ------------------------- 2 files changed, 1 insertion(+), 27 deletions(-) delete mode 100644 shared/httpHandler/queryBuilder.js diff --git a/shared/httpHandler/httpHandler.js b/shared/httpHandler/httpHandler.js index ff1ba33c..9247457b 100644 --- a/shared/httpHandler/httpHandler.js +++ b/shared/httpHandler/httpHandler.js @@ -7,7 +7,6 @@ const { net } = require('electron'); const { isEmpty } = require('lodash'); const { requestTimeout } = require('./requestTimeout'); -const { queryBuilder } = require('./queryBuilder'); /** * @class @@ -45,7 +44,7 @@ class HttpHandler { let { path } = request; if (!isEmpty(query) && typeof query === 'object') { - path += `?${queryBuilder({ query })}`; + path += `?${new URLSearchParams(query).toString()}`; } const portParam = port ? `:${port}` : ''; diff --git a/shared/httpHandler/queryBuilder.js b/shared/httpHandler/queryBuilder.js deleted file mode 100644 index 1c347d2c..00000000 --- a/shared/httpHandler/queryBuilder.js +++ /dev/null @@ -1,25 +0,0 @@ -function queryBuilder({ query }) { - const parts = []; - - for (const key of Object.keys(query)) { - const value = query[key]; - const escapedKey = encodeURIComponent(key); - - if (Array.isArray(value)) { - value.forEach(arrayValue => { - parts.push(`${escapedKey}=${encodeURIComponent(arrayValue)}`); - }); - } else { - let qsEntry = escapedKey; - - if (value || typeof value === 'string') { - qsEntry += `=${encodeURIComponent(value)}`; - } - parts.push(qsEntry); - } - } - - return parts.join('&'); -} - -module.exports = { queryBuilder }; From e647e5ded71a540779b544cb4c03934433396686 Mon Sep 17 00:00:00 2001 From: chulanovskyi Date: Fri, 30 Aug 2024 14:45:24 +0300 Subject: [PATCH 17/18] chore: made the contract more explicit --- shared/httpHandler/requestTimeout.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/httpHandler/requestTimeout.js b/shared/httpHandler/requestTimeout.js index 1af22925..98fc7a02 100644 --- a/shared/httpHandler/requestTimeout.js +++ b/shared/httpHandler/requestTimeout.js @@ -1,4 +1,4 @@ -function requestTimeout({ requestTimeout = 0 }) { +async function requestTimeout({ requestTimeout = 0 }) { return new Promise((_, reject) => { if (requestTimeout) { setTimeout(() => { From 2ab079f66e23d20a98b085fc6a6cb82c6c23c37b Mon Sep 17 00:00:00 2001 From: chulanovskyi Date: Fri, 30 Aug 2024 14:55:40 +0300 Subject: [PATCH 18/18] chore: updated package-lock.json --- package-lock.json | 654 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 628 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index 87889095..e6e72de1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,6 +31,9 @@ "engines": { "hackolade": "6.9.11", "hackoladePlugin": "1.2.0" + }, + "peerDependencies": { + "electron": "^31" } }, "node_modules/@aws-crypto/sha256-browser": { @@ -654,6 +657,68 @@ } } }, + "node_modules/@electron/get": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", + "peer": true, + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@electron/get/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@electron/get/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/get/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@electron/get/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", @@ -1172,6 +1237,18 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, "node_modules/@smithy/abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", @@ -1695,12 +1772,79 @@ "node": ">=16.0.0" } }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "peer": true, + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "peer": true, + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "peer": true + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.16.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.2.tgz", + "integrity": "sha512-91s/n4qUPV/wg8eE9KHYW1kouTfDk2FPGjXbBMfRWP/2vg1rCXNQL1OCabwGs0XSdukuK+MwCDXE30QpSeMUhQ==", + "peer": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.11.0.tgz", @@ -2160,6 +2304,13 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "optional": true, + "peer": true + }, "node_modules/bowser": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", @@ -2187,6 +2338,57 @@ "node": ">=8" } }, + "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==", + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "peer": true, + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "peer": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "peer": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -2271,6 +2473,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "peer": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2379,7 +2593,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -2392,17 +2605,53 @@ } } }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "peer": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "peer": true, + "engines": { + "node": ">=10" + } + }, "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==", - "dev": true, + "devOptional": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -2419,7 +2668,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, + "devOptional": true, "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -2454,6 +2703,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "optional": true, + "peer": true + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -2484,12 +2740,48 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, + "node_modules/electron": { + "version": "31.4.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-31.4.0.tgz", + "integrity": "sha512-YTwKoAA+nrJMlI1TTHnIXLYWoQLKnhbkz0qxZcI7Hadcy0UaFMFs9xzwvH2MnrRpVJy7RKo49kVGuvSdRl8zMA==", + "hasInstallScript": true, + "peer": true, + "dependencies": { + "@electron/get": "^2.0.0", + "@types/node": "^20.9.0", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 12.20.55" + } + }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "peer": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "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==", + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/es-abstract": { "version": "1.23.3", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", @@ -2554,7 +2846,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, + "devOptional": true, "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -2566,7 +2858,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, + "devOptional": true, "engines": { "node": ">= 0.4" } @@ -2623,6 +2915,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "optional": true, + "peer": true + }, "node_modules/esbuild": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", @@ -2678,7 +2977,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, + "devOptional": true, "engines": { "node": ">=10" }, @@ -3059,6 +3358,41 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "peer": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "peer": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3141,6 +3475,15 @@ "reusify": "^1.0.4" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "peer": true, + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -3234,7 +3577,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, + "devOptional": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3270,7 +3613,7 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, + "devOptional": true, "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -3347,6 +3690,24 @@ "node": ">=10.13.0" } }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "optional": true, + "peer": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, "node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -3378,7 +3739,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, + "devOptional": true, "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" @@ -3414,7 +3775,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, + "devOptional": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -3422,11 +3783,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "peer": true, + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, "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==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/graphemer": { "version": "1.4.0", @@ -3456,7 +3841,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, + "devOptional": true, "dependencies": { "es-define-property": "^1.0.0" }, @@ -3468,7 +3853,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, + "devOptional": true, "engines": { "node": ">= 0.4" }, @@ -3480,7 +3865,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, + "devOptional": true, "engines": { "node": ">= 0.4" }, @@ -3507,7 +3892,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, + "devOptional": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -3515,6 +3900,25 @@ "node": ">= 0.4" } }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "peer": true + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "peer": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, "node_modules/human-signals": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", @@ -3904,8 +4308,7 @@ "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -3919,6 +4322,13 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "optional": true, + "peer": true + }, "node_modules/json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", @@ -3947,7 +4357,6 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, "dependencies": { "json-buffer": "3.0.1" } @@ -4110,6 +4519,28 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "optional": true, + "peer": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -4150,6 +4581,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "peer": true, + "engines": { + "node": ">=4" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -4174,8 +4614,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/natural-compare": { "version": "1.4.0", @@ -4183,6 +4622,18 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/npm-run-path": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", @@ -4223,7 +4674,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, + "devOptional": true, "engines": { "node": ">= 0.4" } @@ -4299,7 +4750,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -4336,6 +4786,15 @@ "node": ">= 0.8.0" } }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -4435,6 +4894,12 @@ "node": ">=8" } }, + "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==", + "peer": true + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -4504,6 +4969,25 @@ "node": ">=6.0.0" } }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "peer": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -4533,6 +5017,18 @@ } ] }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", @@ -4568,6 +5064,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "peer": true + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -4577,6 +5079,18 @@ "node": ">=4" } }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "peer": true, + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/restore-cursor": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", @@ -4649,6 +5163,24 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "optional": true, + "peer": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -4717,7 +5249,7 @@ "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true, + "devOptional": true, "bin": { "semver": "bin/semver.js" }, @@ -4725,6 +5257,42 @@ "node": ">=10" } }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "optional": true, + "peer": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "optional": true, + "peer": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -4849,6 +5417,13 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "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==", + "optional": true, + "peer": true + }, "node_modules/string-argv": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", @@ -5001,6 +5576,18 @@ "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "peer": true, + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -5214,6 +5801,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "peer": true + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -5350,8 +5943,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/yaml": { "version": "2.3.1", @@ -5362,6 +5954,16 @@ "node": ">= 14" } }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "peer": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",