diff --git a/.github/workflows/integration-flows.yaml b/.github/workflows/integration-flows.yaml index 6b81caaacb..500d940413 100644 --- a/.github/workflows/integration-flows.yaml +++ b/.github/workflows/integration-flows.yaml @@ -28,7 +28,7 @@ jobs: run: | # Build, install CLI and verify it can run npm install - npm run build -w @nangohq/node -w @nangohq/shared -w nango + npm run build -w @nangohq/node -w @nangohq/utils -w @nangohq/shared -w nango npm install -g ./packages/cli NANGO_CLI_UPGRADE_MODE=ignore nango version --debug diff --git a/package-lock.json b/package-lock.json index 74a16f4364..3b9bc1f104 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,8 @@ "packages/runner", "packages/persist", "packages/jobs", - "packages/webapp" + "packages/webapp", + "packages/utils" ], "dependencies": { "@babel/parser": "^7.22.5", @@ -91,7 +92,8 @@ }, "node_modules/@aws-crypto/crc32c": { "version": "3.0.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz", + "integrity": "sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==", "dependencies": { "@aws-crypto/util": "^3.0.0", "@aws-sdk/types": "^3.222.0", @@ -198,28 +200,45 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/@aws-sdk/client-sso-oidc": { + "node_modules/@aws-sdk/client-s3": { "version": "3.348.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.348.0.tgz", - "integrity": "sha512-tvHpcycx4EALvk38I9rAOdPeHvBDezqIB4lrE7AvnOJljlvCcdQ2gXa9GDrwrM7zuYBIZMBRE/njTMrCwoOdAA==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.348.0.tgz", + "integrity": "sha512-19ShUJL/Kqol4pW2S6axD85oL2JIh91ctUgqPEuu5BzGyEgq5s+HP/DDNzcdsTKl7gfCfaIULf01yWU6RwY1EA==", "dependencies": { + "@aws-crypto/sha1-browser": "3.0.0", "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.348.0", "@aws-sdk/config-resolver": "3.347.0", + "@aws-sdk/credential-provider-node": "3.348.0", + "@aws-sdk/eventstream-serde-browser": "3.347.0", + "@aws-sdk/eventstream-serde-config-resolver": "3.347.0", + "@aws-sdk/eventstream-serde-node": "3.347.0", "@aws-sdk/fetch-http-handler": "3.347.0", + "@aws-sdk/hash-blob-browser": "3.347.0", "@aws-sdk/hash-node": "3.347.0", + "@aws-sdk/hash-stream-node": "3.347.0", "@aws-sdk/invalid-dependency": "3.347.0", + "@aws-sdk/md5-js": "3.347.0", + "@aws-sdk/middleware-bucket-endpoint": "3.347.0", "@aws-sdk/middleware-content-length": "3.347.0", "@aws-sdk/middleware-endpoint": "3.347.0", + "@aws-sdk/middleware-expect-continue": "3.347.0", + "@aws-sdk/middleware-flexible-checksums": "3.347.0", "@aws-sdk/middleware-host-header": "3.347.0", + "@aws-sdk/middleware-location-constraint": "3.347.0", "@aws-sdk/middleware-logger": "3.347.0", "@aws-sdk/middleware-recursion-detection": "3.347.0", "@aws-sdk/middleware-retry": "3.347.0", + "@aws-sdk/middleware-sdk-s3": "3.347.0", "@aws-sdk/middleware-serde": "3.347.0", + "@aws-sdk/middleware-signing": "3.347.0", + "@aws-sdk/middleware-ssec": "3.347.0", "@aws-sdk/middleware-stack": "3.347.0", "@aws-sdk/middleware-user-agent": "3.347.0", "@aws-sdk/node-config-provider": "3.347.0", "@aws-sdk/node-http-handler": "3.348.0", + "@aws-sdk/signature-v4-multi-region": "3.347.0", "@aws-sdk/smithy-client": "3.347.0", "@aws-sdk/types": "3.347.0", "@aws-sdk/url-parser": "3.347.0", @@ -230,63 +249,129 @@ "@aws-sdk/util-defaults-mode-node": "3.347.0", "@aws-sdk/util-endpoints": "3.347.0", "@aws-sdk/util-retry": "3.347.0", + "@aws-sdk/util-stream-browser": "3.347.0", + "@aws-sdk/util-stream-node": "3.348.0", "@aws-sdk/util-user-agent-browser": "3.347.0", "@aws-sdk/util-user-agent-node": "3.347.0", "@aws-sdk/util-utf8": "3.310.0", + "@aws-sdk/util-waiter": "3.347.0", + "@aws-sdk/xml-builder": "3.310.0", "@smithy/protocol-http": "^1.0.1", "@smithy/types": "^1.0.0", + "fast-xml-parser": "4.2.4", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-host-header": { + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/types": { "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.347.0.tgz", - "integrity": "sha512-kpKmR9OvMlnReqp5sKcJkozbj1wmlblbVSbnQAIkzeQj2xD5dnVR3Nn2ogQKxSmU1Fv7dEroBtrruJ1o3fY38A==", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", "dependencies": { - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-logger": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.347.0.tgz", - "integrity": "sha512-NYC+Id5UCkVn+3P1t/YtmHt75uED06vwaKyxDy0UmB2K66PZLVtwWbLpVWrhbroaw1bvUHYcRyQ9NIfnVcXQjA==", + "node_modules/@aws-sdk/client-s3/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": { - "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.347.0.tgz", - "integrity": "sha512-qfnSvkFKCAMjMHR31NdsT0gv5Sq/ZHTUD4yQsSLpbVQ6iYAS834lrzXt41iyEHt57Y514uG7F/Xfvude3u4icQ==", + "node_modules/@aws-sdk/client-s3/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.348.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.348.0.tgz", + "integrity": "sha512-5S23gVKBl0fhZ96RD8LdPhMKeh8E5fmebyZxMNZuWliSXz++Q9ZCrwPwQbkks3duPOTcKKobs3IoqP82HoXMvQ==", "dependencies": { - "@aws-sdk/protocol-http": "3.347.0", + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.347.0", + "@aws-sdk/fetch-http-handler": "3.347.0", + "@aws-sdk/hash-node": "3.347.0", + "@aws-sdk/invalid-dependency": "3.347.0", + "@aws-sdk/middleware-content-length": "3.347.0", + "@aws-sdk/middleware-endpoint": "3.347.0", + "@aws-sdk/middleware-host-header": "3.347.0", + "@aws-sdk/middleware-logger": "3.347.0", + "@aws-sdk/middleware-recursion-detection": "3.347.0", + "@aws-sdk/middleware-retry": "3.347.0", + "@aws-sdk/middleware-serde": "3.347.0", + "@aws-sdk/middleware-stack": "3.347.0", + "@aws-sdk/middleware-user-agent": "3.347.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/node-http-handler": "3.348.0", + "@aws-sdk/smithy-client": "3.347.0", "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.347.0", + "@aws-sdk/util-defaults-mode-node": "3.347.0", + "@aws-sdk/util-endpoints": "3.347.0", + "@aws-sdk/util-retry": "3.347.0", + "@aws-sdk/util-user-agent-browser": "3.347.0", + "@aws-sdk/util-user-agent-node": "3.347.0", + "@aws-sdk/util-utf8": "3.310.0", + "@smithy/protocol-http": "^1.0.1", + "@smithy/types": "^1.0.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.347.0.tgz", - "integrity": "sha512-wJbGN3OE1/daVCrwk49whhIr9E0j1N4gWwN/wi4WuyYIA+5lMUfVp0aGIOvZR+878DxuFz2hQ4XcZVT4K2WvQw==", + "node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.348.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.348.0.tgz", + "integrity": "sha512-tvHpcycx4EALvk38I9rAOdPeHvBDezqIB4lrE7AvnOJljlvCcdQ2gXa9GDrwrM7zuYBIZMBRE/njTMrCwoOdAA==", "dependencies": { - "@aws-sdk/protocol-http": "3.347.0", + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.347.0", + "@aws-sdk/fetch-http-handler": "3.347.0", + "@aws-sdk/hash-node": "3.347.0", + "@aws-sdk/invalid-dependency": "3.347.0", + "@aws-sdk/middleware-content-length": "3.347.0", + "@aws-sdk/middleware-endpoint": "3.347.0", + "@aws-sdk/middleware-host-header": "3.347.0", + "@aws-sdk/middleware-logger": "3.347.0", + "@aws-sdk/middleware-recursion-detection": "3.347.0", + "@aws-sdk/middleware-retry": "3.347.0", + "@aws-sdk/middleware-serde": "3.347.0", + "@aws-sdk/middleware-stack": "3.347.0", + "@aws-sdk/middleware-user-agent": "3.347.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/node-http-handler": "3.348.0", + "@aws-sdk/smithy-client": "3.347.0", "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.347.0", + "@aws-sdk/util-defaults-mode-node": "3.347.0", "@aws-sdk/util-endpoints": "3.347.0", + "@aws-sdk/util-retry": "3.347.0", + "@aws-sdk/util-user-agent-browser": "3.347.0", + "@aws-sdk/util-user-agent-node": "3.347.0", + "@aws-sdk/util-utf8": "3.310.0", + "@smithy/protocol-http": "^1.0.1", + "@smithy/types": "^1.0.0", "tslib": "^2.5.0" }, "engines": { @@ -304,62 +389,108 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-endpoints": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.347.0.tgz", - "integrity": "sha512-/WUkirizeNAqwVj0zkcrqdQ9pUm1HY5kU+qy7xTR0OebkuJauglkmSTMD+56L1JPunWqHhlwCMVRaz5eaJdSEQ==", + "node_modules/@aws-sdk/client-sso-oidc/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": { - "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-user-agent-browser": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/types": { "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.347.0.tgz", - "integrity": "sha512-ydxtsKVtQefgbk1Dku1q7pMkjDYThauG9/8mQkZUAVik55OUZw71Zzr3XO8J8RKvQG8lmhPXuAQ0FKAyycc0RA==", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", "dependencies": { - "@aws-sdk/types": "3.347.0", - "bowser": "^2.11.0", "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.347.0.tgz", - "integrity": "sha512-6X0b9qGsbD1s80PmbaB6v1/ZtLfSx6fjRX8caM7NN0y/ObuLoX8LhYnW6WlB2f1+xb4EjaCNgpP/zCf98MXosw==", + "node_modules/@aws-sdk/client-sso/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/client-sso/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.348.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.348.0.tgz", + "integrity": "sha512-4iaQlWAOHMEF4xjR/FB/ws3aUjXjJHwbsIcqbdYAxsKijDYYTZYCPc/gM0NE1yi28qlNYNhMzHipe5xTYbU2Eg==", "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.347.0", + "@aws-sdk/credential-provider-node": "3.348.0", + "@aws-sdk/fetch-http-handler": "3.347.0", + "@aws-sdk/hash-node": "3.347.0", + "@aws-sdk/invalid-dependency": "3.347.0", + "@aws-sdk/middleware-content-length": "3.347.0", + "@aws-sdk/middleware-endpoint": "3.347.0", + "@aws-sdk/middleware-host-header": "3.347.0", + "@aws-sdk/middleware-logger": "3.347.0", + "@aws-sdk/middleware-recursion-detection": "3.347.0", + "@aws-sdk/middleware-retry": "3.347.0", + "@aws-sdk/middleware-sdk-sts": "3.347.0", + "@aws-sdk/middleware-serde": "3.347.0", + "@aws-sdk/middleware-signing": "3.347.0", + "@aws-sdk/middleware-stack": "3.347.0", + "@aws-sdk/middleware-user-agent": "3.347.0", "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/node-http-handler": "3.348.0", + "@aws-sdk/smithy-client": "3.347.0", "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.347.0", + "@aws-sdk/util-defaults-mode-node": "3.347.0", + "@aws-sdk/util-endpoints": "3.347.0", + "@aws-sdk/util-retry": "3.347.0", + "@aws-sdk/util-user-agent-browser": "3.347.0", + "@aws-sdk/util-user-agent-node": "3.347.0", + "@aws-sdk/util-utf8": "3.310.0", + "@smithy/protocol-http": "^1.0.1", + "@smithy/types": "^1.0.0", + "fast-xml-parser": "4.2.4", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } } }, - "node_modules/@aws-sdk/client-sso-oidc/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==", + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/types": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", "dependencies": { - "@smithy/types": "^1.2.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/types": { + "node_modules/@aws-sdk/client-sts/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==", @@ -370,7 +501,7 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/tslib": { + "node_modules/@aws-sdk/client-sts/node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" @@ -405,6 +536,35 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.347.0.tgz", + "integrity": "sha512-UnEM+LKGpXKzw/1WvYEQsC6Wj9PupYZdQOE+e2Dgy2dqk/pVFy4WueRtFXYDT2B41ppv3drdXUuKZRIDVqIgNQ==", + "dependencies": { + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env/node_modules/@aws-sdk/types": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/@aws-sdk/credential-provider-imds": { "version": "3.347.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.347.0.tgz", @@ -436,6 +596,168 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.348.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.348.0.tgz", + "integrity": "sha512-0IEH5mH/cz2iLyr/+pSa3sCsQcGADiLSEn6yivsXdfz1zDqBiv+ffDoL0+Pvnp+TKf8sA6OlX8PgoMoEBvBdKw==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.347.0", + "@aws-sdk/credential-provider-imds": "3.347.0", + "@aws-sdk/credential-provider-process": "3.347.0", + "@aws-sdk/credential-provider-sso": "3.348.0", + "@aws-sdk/credential-provider-web-identity": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/types": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.348.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.348.0.tgz", + "integrity": "sha512-ngRWphm9e36i58KqVi7Z8WOub+k0cSl+JZaAmgfFm0+dsfBG5uheo598OeiwWV0DqlilvaQZFaMVQgG2SX/tHg==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.347.0", + "@aws-sdk/credential-provider-imds": "3.347.0", + "@aws-sdk/credential-provider-ini": "3.348.0", + "@aws-sdk/credential-provider-process": "3.347.0", + "@aws-sdk/credential-provider-sso": "3.348.0", + "@aws-sdk/credential-provider-web-identity": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/types": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.347.0.tgz", + "integrity": "sha512-yl1z4MsaBdXd4GQ2halIvYds23S67kElyOwz7g8kaQ4kHj+UoYWxz3JVW/DGusM6XmQ9/F67utBrUVA0uhQYyw==", + "dependencies": { + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process/node_modules/@aws-sdk/types": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.348.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.348.0.tgz", + "integrity": "sha512-5cQao705376KgGkLv9xgkQ3T5H7KdNddWuyoH2wDcrHd1BA2Lnrell3Yyh7R6jQeV7uCQE/z0ugUOKhDqNKIqQ==", + "dependencies": { + "@aws-sdk/client-sso": "3.348.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/token-providers": "3.348.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/types": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.347.0.tgz", + "integrity": "sha512-DxoTlVK8lXjS1zVphtz/Ab+jkN/IZor9d6pP2GjJHNoAIIzXfRwwj5C8vr4eTayx/5VJ7GRP91J8GJ2cKly8Qw==", + "dependencies": { + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@aws-sdk/types": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/@aws-sdk/eventstream-codec": { "version": "3.347.0", "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-codec/-/eventstream-codec-3.347.0.tgz", @@ -758,20 +1080,22 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/@aws-sdk/middleware-content-length": { + "node_modules/@aws-sdk/middleware-bucket-endpoint": { "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.347.0.tgz", - "integrity": "sha512-i4qtWTDImMaDUtwKQPbaZpXsReiwiBomM1cWymCU4bhz81HL01oIxOxOBuiM+3NlDoCSPr3KI6txZSz/8cqXCQ==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.347.0.tgz", + "integrity": "sha512-i9n4ylkGmGvizVcTfN4L+oN10OCL2DKvyMa4cCAVE1TJrsnaE0g7IOOyJGUS8p5KJYQrKVR7kcsa2L1S0VeEcA==", "dependencies": { "@aws-sdk/protocol-http": "3.347.0", "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-arn-parser": "3.310.0", + "@aws-sdk/util-config-provider": "3.310.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-content-length/node_modules/@aws-sdk/types": { + "node_modules/@aws-sdk/middleware-bucket-endpoint/node_modules/@aws-sdk/types": { "version": "3.347.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", @@ -782,27 +1106,25 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-content-length/node_modules/tslib": { + "node_modules/@aws-sdk/middleware-bucket-endpoint/node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/@aws-sdk/middleware-endpoint": { + "node_modules/@aws-sdk/middleware-content-length": { "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.347.0.tgz", - "integrity": "sha512-unF0c6dMaUL1ffU+37Ugty43DgMnzPWXr/Jup/8GbK5fzzWT5NQq6dj9KHPubMbWeEjQbmczvhv25JuJdK8gNQ==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.347.0.tgz", + "integrity": "sha512-i4qtWTDImMaDUtwKQPbaZpXsReiwiBomM1cWymCU4bhz81HL01oIxOxOBuiM+3NlDoCSPr3KI6txZSz/8cqXCQ==", "dependencies": { - "@aws-sdk/middleware-serde": "3.347.0", + "@aws-sdk/protocol-http": "3.347.0", "@aws-sdk/types": "3.347.0", - "@aws-sdk/url-parser": "3.347.0", - "@aws-sdk/util-middleware": "3.347.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/types": { + "node_modules/@aws-sdk/middleware-content-length/node_modules/@aws-sdk/types": { "version": "3.347.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", @@ -813,29 +1135,27 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-endpoint/node_modules/tslib": { + "node_modules/@aws-sdk/middleware-content-length/node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/@aws-sdk/middleware-retry": { + "node_modules/@aws-sdk/middleware-endpoint": { "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.347.0.tgz", - "integrity": "sha512-CpdM+8dCSbX96agy4FCzOfzDmhNnGBM/pxrgIVLm5nkYTLuXp/d7ubpFEUHULr+4hCd5wakHotMt7yO29NFaVw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.347.0.tgz", + "integrity": "sha512-unF0c6dMaUL1ffU+37Ugty43DgMnzPWXr/Jup/8GbK5fzzWT5NQq6dj9KHPubMbWeEjQbmczvhv25JuJdK8gNQ==", "dependencies": { - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/service-error-classification": "3.347.0", + "@aws-sdk/middleware-serde": "3.347.0", "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", "@aws-sdk/util-middleware": "3.347.0", - "@aws-sdk/util-retry": "3.347.0", - "tslib": "^2.5.0", - "uuid": "^8.3.2" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-retry/node_modules/@aws-sdk/types": { + "node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/types": { "version": "3.347.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", @@ -846,24 +1166,17 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-retry/node_modules/tslib": { + "node_modules/@aws-sdk/middleware-endpoint/node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/@aws-sdk/middleware-retry/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@aws-sdk/middleware-serde": { + "node_modules/@aws-sdk/middleware-expect-continue": { "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.347.0.tgz", - "integrity": "sha512-x5Foi7jRbVJXDu9bHfyCbhYDH5pKK+31MmsSJ3k8rY8keXLBxm2XEEg/AIoV9/TUF9EeVvZ7F1/RmMpJnWQsEg==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.347.0.tgz", + "integrity": "sha512-95M1unD1ENL0tx35dfyenSfx0QuXBSKtOi/qJja6LfX5771C5fm5ZTOrsrzPFJvRg/wj8pCOVWRZk+d5+jvfOQ==", "dependencies": { + "@aws-sdk/protocol-http": "3.347.0", "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, @@ -871,7 +1184,7 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-serde/node_modules/@aws-sdk/types": { + "node_modules/@aws-sdk/middleware-expect-continue/node_modules/@aws-sdk/types": { "version": "3.347.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", @@ -882,42 +1195,29 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-serde/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@aws-sdk/middleware-stack": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.347.0.tgz", - "integrity": "sha512-Izidg4rqtYMcKuvn2UzgEpPLSmyd8ub9+LQ2oIzG3mpIzCBITq7wp40jN1iNkMg+X6KEnX9vdMJIYZsPYMCYuQ==", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-stack/node_modules/tslib": { + "node_modules/@aws-sdk/middleware-expect-continue/node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/@aws-sdk/node-config-provider": { + "node_modules/@aws-sdk/middleware-flexible-checksums": { "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.347.0.tgz", - "integrity": "sha512-faU93d3+5uTTUcotGgMXF+sJVFjrKh+ufW+CzYKT4yUHammyaIab/IbTPWy2hIolcEGtuPeVoxXw8TXbkh/tuw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.347.0.tgz", + "integrity": "sha512-Pda7VMAIyeHw9nMp29rxdFft3EF4KP/tz/vLB6bqVoBNbLujo5rxn3SGOgStgIz7fuMLQQfoWIsmvxUm+Fp+Dw==", "dependencies": { - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-crypto/crc32": "3.0.0", + "@aws-crypto/crc32c": "3.0.0", + "@aws-sdk/is-array-buffer": "3.310.0", + "@aws-sdk/protocol-http": "3.347.0", "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-utf8": "3.310.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/node-config-provider/node_modules/@aws-sdk/types": { + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-sdk/types": { "version": "3.347.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", @@ -928,19 +1228,17 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/node-config-provider/node_modules/tslib": { + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/@aws-sdk/node-http-handler": { - "version": "3.348.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.348.0.tgz", - "integrity": "sha512-wxdgc4tO5F6lN4wHr0CZ4TyIjDW/ORp4SJZdWYNs2L5J7+/SwqgJY2lxRlGi0i7Md+apAdE3sT3ukVQ/9pVfPg==", + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.347.0.tgz", + "integrity": "sha512-kpKmR9OvMlnReqp5sKcJkozbj1wmlblbVSbnQAIkzeQj2xD5dnVR3Nn2ogQKxSmU1Fv7dEroBtrruJ1o3fY38A==", "dependencies": { - "@aws-sdk/abort-controller": "3.347.0", "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/querystring-builder": "3.347.0", "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, @@ -948,7 +1246,7 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/node-http-handler/node_modules/@aws-sdk/types": { + "node_modules/@aws-sdk/middleware-host-header/node_modules/@aws-sdk/types": { "version": "3.347.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", @@ -959,15 +1257,15 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/node-http-handler/node_modules/tslib": { + "node_modules/@aws-sdk/middleware-host-header/node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/@aws-sdk/property-provider": { + "node_modules/@aws-sdk/middleware-location-constraint": { "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.347.0.tgz", - "integrity": "sha512-t3nJ8CYPLKAF2v9nIHOHOlF0CviQbTvbFc2L4a+A+EVd/rM4PzL3+3n8ZJsr0h7f6uD04+b5YRFgKgnaqLXlEg==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.347.0.tgz", + "integrity": "sha512-x5fcEV7q8fQ0OmUO+cLhN5iPqGoLWtC3+aKHIfRRb2BpOO1khyc1FKzsIAdeQz2hfktq4j+WsrmcPvFKv51pSg==", "dependencies": { "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" @@ -976,7 +1274,7 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/property-provider/node_modules/@aws-sdk/types": { + "node_modules/@aws-sdk/middleware-location-constraint/node_modules/@aws-sdk/types": { "version": "3.347.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", @@ -987,15 +1285,15 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/property-provider/node_modules/tslib": { + "node_modules/@aws-sdk/middleware-location-constraint/node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/@aws-sdk/protocol-http": { + "node_modules/@aws-sdk/middleware-logger": { "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.347.0.tgz", - "integrity": "sha512-2YdBhc02Wvy03YjhGwUxF0UQgrPWEy8Iq75pfS42N+/0B/+eWX1aQgfjFxIpLg7YSjT5eKtYOQGlYd4MFTgj9g==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.347.0.tgz", + "integrity": "sha512-NYC+Id5UCkVn+3P1t/YtmHt75uED06vwaKyxDy0UmB2K66PZLVtwWbLpVWrhbroaw1bvUHYcRyQ9NIfnVcXQjA==", "dependencies": { "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" @@ -1004,7 +1302,7 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/protocol-http/node_modules/@aws-sdk/types": { + "node_modules/@aws-sdk/middleware-logger/node_modules/@aws-sdk/types": { "version": "3.347.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", @@ -1015,25 +1313,25 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/protocol-http/node_modules/tslib": { + "node_modules/@aws-sdk/middleware-logger/node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/@aws-sdk/querystring-builder": { + "node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.347.0.tgz", - "integrity": "sha512-phtKTe6FXoV02MoPkIVV6owXI8Mwr5IBN3bPoxhcPvJG2AjEmnetSIrhb8kwc4oNhlwfZwH6Jo5ARW/VEWbZtg==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.347.0.tgz", + "integrity": "sha512-qfnSvkFKCAMjMHR31NdsT0gv5Sq/ZHTUD4yQsSLpbVQ6iYAS834lrzXt41iyEHt57Y514uG7F/Xfvude3u4icQ==", "dependencies": { + "@aws-sdk/protocol-http": "3.347.0", "@aws-sdk/types": "3.347.0", - "@aws-sdk/util-uri-escape": "3.310.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/querystring-builder/node_modules/@aws-sdk/types": { + "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/@aws-sdk/types": { "version": "3.347.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", @@ -1044,15 +1342,395 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/querystring-builder/node_modules/tslib": { + "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/@aws-sdk/querystring-parser": { + "node_modules/@aws-sdk/middleware-retry": { "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.347.0.tgz", - "integrity": "sha512-5VXOhfZz78T2W7SuXf2avfjKglx1VZgZgp9Zfhrt/Rq+MTu2D+PZc5zmJHhYigD7x83jLSLogpuInQpFMA9LgA==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.347.0.tgz", + "integrity": "sha512-CpdM+8dCSbX96agy4FCzOfzDmhNnGBM/pxrgIVLm5nkYTLuXp/d7ubpFEUHULr+4hCd5wakHotMt7yO29NFaVw==", + "dependencies": { + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/service-error-classification": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-middleware": "3.347.0", + "@aws-sdk/util-retry": "3.347.0", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-retry/node_modules/@aws-sdk/types": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-retry/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@aws-sdk/middleware-retry/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.347.0.tgz", + "integrity": "sha512-TLr92+HMvamrhJJ0VDhA/PiUh4rTNQz38B9dB9ikohTaRgm+duP+mRiIv16tNPZPGl8v82Thn7Ogk2qPByNDtg==", + "dependencies": { + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-arn-parser": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@aws-sdk/types": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.347.0.tgz", + "integrity": "sha512-38LJ0bkIoVF3W97x6Jyyou72YV9Cfbml4OaDEdnrCOo0EssNZM5d7RhjMvQDwww7/3OBY/BzeOcZKfJlkYUXGw==", + "dependencies": { + "@aws-sdk/middleware-signing": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sts/node_modules/@aws-sdk/types": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sts/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@aws-sdk/middleware-serde": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.347.0.tgz", + "integrity": "sha512-x5Foi7jRbVJXDu9bHfyCbhYDH5pKK+31MmsSJ3k8rY8keXLBxm2XEEg/AIoV9/TUF9EeVvZ7F1/RmMpJnWQsEg==", + "dependencies": { + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-serde/node_modules/@aws-sdk/types": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-serde/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.347.0.tgz", + "integrity": "sha512-zVBF/4MGKnvhAE/J+oAL/VAehiyv+trs2dqSQXwHou9j8eA8Vm8HS2NdOwpkZQchIxTuwFlqSusDuPEdYFbvGw==", + "dependencies": { + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/signature-v4": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-middleware": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing/node_modules/@aws-sdk/types": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.347.0.tgz", + "integrity": "sha512-467VEi2elPmUGcHAgTmzhguZ3lwTpwK+3s+pk312uZtVsS9rP1MAknYhpS3ZvssiqBUVPx8m29cLcC6Tx5nOJg==", + "dependencies": { + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec/node_modules/@aws-sdk/types": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@aws-sdk/middleware-stack": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.347.0.tgz", + "integrity": "sha512-Izidg4rqtYMcKuvn2UzgEpPLSmyd8ub9+LQ2oIzG3mpIzCBITq7wp40jN1iNkMg+X6KEnX9vdMJIYZsPYMCYuQ==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-stack/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.347.0.tgz", + "integrity": "sha512-wJbGN3OE1/daVCrwk49whhIr9E0j1N4gWwN/wi4WuyYIA+5lMUfVp0aGIOvZR+878DxuFz2hQ4XcZVT4K2WvQw==", + "dependencies": { + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-endpoints": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@aws-sdk/types": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@aws-sdk/node-config-provider": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.347.0.tgz", + "integrity": "sha512-faU93d3+5uTTUcotGgMXF+sJVFjrKh+ufW+CzYKT4yUHammyaIab/IbTPWy2hIolcEGtuPeVoxXw8TXbkh/tuw==", + "dependencies": { + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/node-config-provider/node_modules/@aws-sdk/types": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/node-config-provider/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@aws-sdk/node-http-handler": { + "version": "3.348.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.348.0.tgz", + "integrity": "sha512-wxdgc4tO5F6lN4wHr0CZ4TyIjDW/ORp4SJZdWYNs2L5J7+/SwqgJY2lxRlGi0i7Md+apAdE3sT3ukVQ/9pVfPg==", + "dependencies": { + "@aws-sdk/abort-controller": "3.347.0", + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/querystring-builder": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/node-http-handler/node_modules/@aws-sdk/types": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/node-http-handler/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@aws-sdk/property-provider": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.347.0.tgz", + "integrity": "sha512-t3nJ8CYPLKAF2v9nIHOHOlF0CviQbTvbFc2L4a+A+EVd/rM4PzL3+3n8ZJsr0h7f6uD04+b5YRFgKgnaqLXlEg==", + "dependencies": { + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/property-provider/node_modules/@aws-sdk/types": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/property-provider/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@aws-sdk/protocol-http": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.347.0.tgz", + "integrity": "sha512-2YdBhc02Wvy03YjhGwUxF0UQgrPWEy8Iq75pfS42N+/0B/+eWX1aQgfjFxIpLg7YSjT5eKtYOQGlYd4MFTgj9g==", + "dependencies": { + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/protocol-http/node_modules/@aws-sdk/types": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/protocol-http/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@aws-sdk/querystring-builder": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.347.0.tgz", + "integrity": "sha512-phtKTe6FXoV02MoPkIVV6owXI8Mwr5IBN3bPoxhcPvJG2AjEmnetSIrhb8kwc4oNhlwfZwH6Jo5ARW/VEWbZtg==", + "dependencies": { + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-uri-escape": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/querystring-builder/node_modules/@aws-sdk/types": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/querystring-builder/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@aws-sdk/querystring-parser": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.347.0.tgz", + "integrity": "sha512-5VXOhfZz78T2W7SuXf2avfjKglx1VZgZgp9Zfhrt/Rq+MTu2D+PZc5zmJHhYigD7x83jLSLogpuInQpFMA9LgA==", "dependencies": { "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" @@ -1131,6 +1809,44 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.347.0.tgz", + "integrity": "sha512-838h7pbRCVYWlTl8W+r5+Z5ld7uoBObgAn7/RB1MQ4JjlkfLdN7emiITG6ueVL+7gWZNZc/4dXR/FJSzCgrkxQ==", + "dependencies": { + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/signature-v4": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@aws-sdk/signature-v4-crt": "^3.118.0" + }, + "peerDependenciesMeta": { + "@aws-sdk/signature-v4-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/types": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/@aws-sdk/signature-v4/node_modules/@aws-sdk/types": { "version": "3.347.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", @@ -1176,6 +1892,37 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.348.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.348.0.tgz", + "integrity": "sha512-nTjoJkUsJUrJTZuqaeMD9PW2//Rdg2HgfDjiyC4jmAXtayWYCi11mqauurMaUHJ3p5qJ8f5xzxm6vBTbrftPag==", + "dependencies": { + "@aws-sdk/client-sso-oidc": "3.348.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/types": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/@aws-sdk/types": { "version": "3.428.0", "license": "Apache-2.0", @@ -1219,7 +1966,8 @@ }, "node_modules/@aws-sdk/util-arn-parser": { "version": "3.310.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.310.0.tgz", + "integrity": "sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==", "dependencies": { "tslib": "^2.5.0" }, @@ -1229,7 +1977,8 @@ }, "node_modules/@aws-sdk/util-arn-parser/node_modules/tslib": { "version": "2.6.2", - "license": "0BSD" + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/@aws-sdk/util-base64": { "version": "3.310.0", @@ -1372,6 +2121,34 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.347.0.tgz", + "integrity": "sha512-/WUkirizeNAqwVj0zkcrqdQ9pUm1HY5kU+qy7xTR0OebkuJauglkmSTMD+56L1JPunWqHhlwCMVRaz5eaJdSEQ==", + "dependencies": { + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints/node_modules/@aws-sdk/types": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/@aws-sdk/util-hex-encoding": { "version": "3.310.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.310.0.tgz", @@ -1510,48 +2287,54 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/@aws-sdk/util-utf8": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.310.0.tgz", - "integrity": "sha512-DnLfFT8uCO22uOJc0pt0DsSNau1GTisngBCDw8jQuWT5CqogMJu4b/uXmwEqfj8B3GX6Xsz8zOd6JpRlPftQoA==", + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.347.0.tgz", + "integrity": "sha512-ydxtsKVtQefgbk1Dku1q7pMkjDYThauG9/8mQkZUAVik55OUZw71Zzr3XO8J8RKvQG8lmhPXuAQ0FKAyycc0RA==", "dependencies": { - "@aws-sdk/util-buffer-from": "3.310.0", + "@aws-sdk/types": "3.347.0", + "bowser": "^2.11.0", "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/util-utf8-browser": { - "version": "3.259.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/util-user-agent-browser/node_modules/@aws-sdk/types": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/util-utf8-browser/node_modules/tslib": { - "version": "2.5.3", - "license": "0BSD" - }, - "node_modules/@aws-sdk/util-utf8/node_modules/tslib": { + "node_modules/@aws-sdk/util-user-agent-browser/node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/@aws-sdk/util-waiter": { + "node_modules/@aws-sdk/util-user-agent-node": { "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.347.0.tgz", - "integrity": "sha512-3ze/0PkwkzUzLncukx93tZgGL0JX9NaP8DxTi6WzflnL/TEul5Z63PCruRNK0om17iZYAWKrf8q2mFoHYb4grA==", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.347.0.tgz", + "integrity": "sha512-6X0b9qGsbD1s80PmbaB6v1/ZtLfSx6fjRX8caM7NN0y/ObuLoX8LhYnW6WlB2f1+xb4EjaCNgpP/zCf98MXosw==", "dependencies": { - "@aws-sdk/abort-controller": "3.347.0", + "@aws-sdk/node-config-provider": "3.347.0", "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/util-waiter/node_modules/@aws-sdk/types": { + "node_modules/@aws-sdk/util-user-agent-node/node_modules/@aws-sdk/types": { "version": "3.347.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", @@ -1562,22 +2345,79 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/util-waiter/node_modules/tslib": { + "node_modules/@aws-sdk/util-user-agent-node/node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/@aws-sdk/xml-builder": { + "node_modules/@aws-sdk/util-utf8": { "version": "3.310.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.310.0.tgz", + "integrity": "sha512-DnLfFT8uCO22uOJc0pt0DsSNau1GTisngBCDw8jQuWT5CqogMJu4b/uXmwEqfj8B3GX6Xsz8zOd6JpRlPftQoA==", "dependencies": { + "@aws-sdk/util-buffer-from": "3.310.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/xml-builder/node_modules/tslib": { + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-utf8-browser/node_modules/tslib": { + "version": "2.5.3", + "license": "0BSD" + }, + "node_modules/@aws-sdk/util-utf8/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@aws-sdk/util-waiter": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.347.0.tgz", + "integrity": "sha512-3ze/0PkwkzUzLncukx93tZgGL0JX9NaP8DxTi6WzflnL/TEul5Z63PCruRNK0om17iZYAWKrf8q2mFoHYb4grA==", + "dependencies": { + "@aws-sdk/abort-controller": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-waiter/node_modules/@aws-sdk/types": { + "version": "3.347.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", + "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-waiter/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.310.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/xml-builder/node_modules/tslib": { "version": "2.5.3", "license": "0BSD" }, @@ -5770,6 +6610,10 @@ "resolved": "packages/shared", "link": true }, + "node_modules/@nangohq/utils": { + "resolved": "packages/utils", + "link": true + }, "node_modules/@nangohq/webapp": { "resolved": "packages/webapp", "link": true @@ -6461,6 +7305,34 @@ "@sinonjs/commons": "^1.7.0" } }, + "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/@smithy/protocol-http/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/@smithy/protocol-http/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/@smithy/types": { "version": "2.3.5", "license": "Apache-2.0", @@ -14354,6 +15226,27 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-xml-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.4.tgz", + "integrity": "sha512-fbfMDvgBNIdDJLdLOwacjFAPYt67tr31H9ZhWSm45CDAxvd0I6WTlSOUo7K2P/K5sA5JgMKG64PI3DMcaFdWpQ==", + "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/fastest-levenshtein": { "version": "1.0.16", "dev": true, @@ -14525,13 +15418,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/file-stream-rotator": { - "version": "0.6.1", - "license": "MIT", - "dependencies": { - "moment": "^2.29.1" - } - }, "node_modules/filelist": { "version": "1.0.4", "license": "Apache-2.0", @@ -19402,13 +20288,6 @@ "version": "1.0.3", "license": "MIT" }, - "node_modules/moment": { - "version": "2.29.4", - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/ms": { "version": "2.1.2", "license": "MIT" @@ -19809,13 +20688,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-hash": { - "version": "2.2.0", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", @@ -24197,7 +25069,8 @@ }, "node_modules/strnum": { "version": "1.0.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" }, "node_modules/stubborn-fs": { "version": "1.2.5", @@ -26662,22 +27535,6 @@ "node": ">= 12.0.0" } }, - "node_modules/winston-daily-rotate-file": { - "version": "4.7.1", - "license": "MIT", - "dependencies": { - "file-stream-rotator": "^0.6.1", - "object-hash": "^2.0.1", - "triple-beam": "^1.3.0", - "winston-transport": "^4.4.0" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "winston": "^3" - } - }, "node_modules/winston-transport": { "version": "4.5.0", "license": "MIT", @@ -28356,12 +29213,23 @@ "version": "0.39.8", "license": "SEE LICENSE IN LICENSE FILE IN GIT REPOSITORY" }, + "packages/internals": { + "name": "@nangohq/nango-internals", + "version": "1.0.0", + "extraneous": true, + "license": "SEE LICENSE IN LICENSE FILE IN GIT REPOSITORY", + "dependencies": { + "winston": "^3.8.2" + }, + "devDependencies": {} + }, "packages/jobs": { "name": "@nangohq/nango-jobs", "version": "1.0.0", "dependencies": { "@nangohq/nango-runner": "^1.0.0", "@nangohq/shared": "^0.39.8", + "@nangohq/utils": "file:../utils", "@temporalio/activity": "^1.9.1", "@temporalio/client": "^1.9.1", "@temporalio/worker": "^1.9.1", @@ -29312,6 +30180,7 @@ "license": "SEE LICENSE IN LICENSE FILE IN GIT REPOSITORY", "dependencies": { "@nangohq/shared": "^0.39.8", + "@nangohq/utils": "file:../utils", "dd-trace": "5.2.0", "express": "^4.18.2", "zod": "^3.22.4", @@ -30250,6 +31119,7 @@ "license": "SEE LICENSE IN LICENSE FILE IN GIT REPOSITORY", "dependencies": { "@nangohq/shared": "^0.39.8", + "@nangohq/utils": "file:../utils", "@trpc/client": "^10.44.0", "@trpc/server": "^10.44.0", "connect-timeout": "^1.9.0", @@ -31174,6 +32044,7 @@ "dependencies": { "@hapi/boom": "^10.0.1", "@nangohq/shared": "^0.39.8", + "@nangohq/utils": "file:../utils", "@workos-inc/node": "^6.2.0", "axios": "^1.3.4", "body-parser": "1.20.2", @@ -31202,8 +32073,6 @@ "redis": "^4.6.11", "simple-oauth2": "^5.0.0", "uuid": "^9.0.0", - "winston": "^3.8.2", - "winston-daily-rotate-file": "^4.7.1", "ws": "^8.12.1" }, "devDependencies": { @@ -31832,930 +32701,424 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/server/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/server/node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/server/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/server/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "packages/server/node_modules/rollup": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz", - "integrity": "sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.13.0", - "@rollup/rollup-android-arm64": "4.13.0", - "@rollup/rollup-darwin-arm64": "4.13.0", - "@rollup/rollup-darwin-x64": "4.13.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.13.0", - "@rollup/rollup-linux-arm64-gnu": "4.13.0", - "@rollup/rollup-linux-arm64-musl": "4.13.0", - "@rollup/rollup-linux-riscv64-gnu": "4.13.0", - "@rollup/rollup-linux-x64-gnu": "4.13.0", - "@rollup/rollup-linux-x64-musl": "4.13.0", - "@rollup/rollup-win32-arm64-msvc": "4.13.0", - "@rollup/rollup-win32-ia32-msvc": "4.13.0", - "@rollup/rollup-win32-x64-msvc": "4.13.0", - "fsevents": "~2.3.2" - } - }, - "packages/server/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/server/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/server/node_modules/strip-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.0.0.tgz", - "integrity": "sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==", - "dev": true, - "dependencies": { - "js-tokens": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "packages/server/node_modules/tinypool": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.2.tgz", - "integrity": "sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/server/node_modules/vite-node": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.4.0.tgz", - "integrity": "sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==", - "dev": true, - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/server/node_modules/vite-node/node_modules/vite": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.6.tgz", - "integrity": "sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==", - "dev": true, - "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.35", - "rollup": "^4.2.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "packages/server/node_modules/vitest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.4.0.tgz", - "integrity": "sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==", - "dev": true, - "dependencies": { - "@vitest/expect": "1.4.0", - "@vitest/runner": "1.4.0", - "@vitest/snapshot": "1.4.0", - "@vitest/spy": "1.4.0", - "@vitest/utils": "1.4.0", - "acorn-walk": "^8.3.2", - "chai": "^4.3.10", - "debug": "^4.3.4", - "execa": "^8.0.1", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "tinybench": "^2.5.1", - "tinypool": "^0.8.2", - "vite": "^5.0.0", - "vite-node": "1.4.0", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.4.0", - "@vitest/ui": "1.4.0", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "packages/server/node_modules/vitest/node_modules/vite": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.6.tgz", - "integrity": "sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==", - "dev": true, - "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.35", - "rollup": "^4.2.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "packages/server/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/shared": { - "name": "@nangohq/shared", - "version": "0.39.8", - "license": "SEE LICENSE IN LICENSE FILE IN GIT REPOSITORY", - "dependencies": { - "@aws-sdk/client-s3": "3.348.0", - "@datadog/datadog-api-client": "^1.16.0", - "@hapi/boom": "^10.0.1", - "@nangohq/node": "^0.39.8", - "@sentry/node": "^7.105.0", - "@temporalio/client": "^1.9.1", - "amqplib": "^0.10.3", - "archiver": "^6.0.1", - "axios": "^1.3.4", - "braintree": "^3.15.0", - "chalk": "^5.3.0", - "cors": "^2.8.5", - "dayjs": "^1.11.7", - "dayjs-plugin-utc": "^0.1.2", - "dd-trace": "5.2.0", - "ejs": "^3.1.5", - "exponential-backoff": "^3.1.1", - "form-data": "4.0.0", - "fs-extra": "^11.1.1", - "human-to-cron": "^0.3.1", - "ip": "^2.0.1", - "js-yaml": "^4.1.0", - "jsonwebtoken": "^9.0.2", - "knex": "3.1.0", - "lodash-es": "^4.17.21", - "md5": "^2.3.0", - "ms": "3.0.0-canary.1", - "openapi3-ts": "^4.1.2", - "parse-link-header": "^2.0.0", - "pg": "^8.8.0", - "posthog-node": "^3.1.3", - "qs": "^6.11.2", - "redis": "^4.6.11", - "rimraf": "^5.0.1", - "semver": "^7.5.4", - "serialize-error": "11.0.3", - "simple-oauth2": "^5.0.0", - "uuid": "^9.0.0", - "winston": "^3.8.2", - "winston-daily-rotate-file": "^4.7.1" - }, - "devDependencies": { - "@octokit/types": "^9.2.1", - "@types/amqplib": "^0.8.2", - "@types/cors": "^2.8.12", - "@types/debug": "^4.1.7", - "@types/fs-extra": "^11.0.1", - "@types/human-to-cron": "^0.3.0", - "@types/js-yaml": "^4.0.5", - "@types/lodash-es": "^4.17.10", - "@types/node": "^18.7.6", - "@types/parse-link-header": "^2.0.0", - "@types/uuid": "^9.0.0", - "typescript": "^5.3.3", - "vitest": "1.4.0" - }, - "engines": { - "node": ">=16.7", - "npm": ">=6.14.11" - } - }, - "packages/shared/node_modules/@aws-sdk/client-s3": { - "version": "3.348.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.348.0.tgz", - "integrity": "sha512-19ShUJL/Kqol4pW2S6axD85oL2JIh91ctUgqPEuu5BzGyEgq5s+HP/DDNzcdsTKl7gfCfaIULf01yWU6RwY1EA==", - "dependencies": { - "@aws-crypto/sha1-browser": "3.0.0", - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.348.0", - "@aws-sdk/config-resolver": "3.347.0", - "@aws-sdk/credential-provider-node": "3.348.0", - "@aws-sdk/eventstream-serde-browser": "3.347.0", - "@aws-sdk/eventstream-serde-config-resolver": "3.347.0", - "@aws-sdk/eventstream-serde-node": "3.347.0", - "@aws-sdk/fetch-http-handler": "3.347.0", - "@aws-sdk/hash-blob-browser": "3.347.0", - "@aws-sdk/hash-node": "3.347.0", - "@aws-sdk/hash-stream-node": "3.347.0", - "@aws-sdk/invalid-dependency": "3.347.0", - "@aws-sdk/md5-js": "3.347.0", - "@aws-sdk/middleware-bucket-endpoint": "3.347.0", - "@aws-sdk/middleware-content-length": "3.347.0", - "@aws-sdk/middleware-endpoint": "3.347.0", - "@aws-sdk/middleware-expect-continue": "3.347.0", - "@aws-sdk/middleware-flexible-checksums": "3.347.0", - "@aws-sdk/middleware-host-header": "3.347.0", - "@aws-sdk/middleware-location-constraint": "3.347.0", - "@aws-sdk/middleware-logger": "3.347.0", - "@aws-sdk/middleware-recursion-detection": "3.347.0", - "@aws-sdk/middleware-retry": "3.347.0", - "@aws-sdk/middleware-sdk-s3": "3.347.0", - "@aws-sdk/middleware-serde": "3.347.0", - "@aws-sdk/middleware-signing": "3.347.0", - "@aws-sdk/middleware-ssec": "3.347.0", - "@aws-sdk/middleware-stack": "3.347.0", - "@aws-sdk/middleware-user-agent": "3.347.0", - "@aws-sdk/node-config-provider": "3.347.0", - "@aws-sdk/node-http-handler": "3.348.0", - "@aws-sdk/signature-v4-multi-region": "3.347.0", - "@aws-sdk/smithy-client": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/url-parser": "3.347.0", - "@aws-sdk/util-base64": "3.310.0", - "@aws-sdk/util-body-length-browser": "3.310.0", - "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.347.0", - "@aws-sdk/util-defaults-mode-node": "3.347.0", - "@aws-sdk/util-endpoints": "3.347.0", - "@aws-sdk/util-retry": "3.347.0", - "@aws-sdk/util-stream-browser": "3.347.0", - "@aws-sdk/util-stream-node": "3.348.0", - "@aws-sdk/util-user-agent-browser": "3.347.0", - "@aws-sdk/util-user-agent-node": "3.347.0", - "@aws-sdk/util-utf8": "3.310.0", - "@aws-sdk/util-waiter": "3.347.0", - "@aws-sdk/xml-builder": "3.310.0", - "@smithy/protocol-http": "^1.0.1", - "@smithy/types": "^1.0.0", - "fast-xml-parser": "4.2.4", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/shared/node_modules/@aws-sdk/client-sso": { - "version": "3.348.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.348.0.tgz", - "integrity": "sha512-5S23gVKBl0fhZ96RD8LdPhMKeh8E5fmebyZxMNZuWliSXz++Q9ZCrwPwQbkks3duPOTcKKobs3IoqP82HoXMvQ==", - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.347.0", - "@aws-sdk/fetch-http-handler": "3.347.0", - "@aws-sdk/hash-node": "3.347.0", - "@aws-sdk/invalid-dependency": "3.347.0", - "@aws-sdk/middleware-content-length": "3.347.0", - "@aws-sdk/middleware-endpoint": "3.347.0", - "@aws-sdk/middleware-host-header": "3.347.0", - "@aws-sdk/middleware-logger": "3.347.0", - "@aws-sdk/middleware-recursion-detection": "3.347.0", - "@aws-sdk/middleware-retry": "3.347.0", - "@aws-sdk/middleware-serde": "3.347.0", - "@aws-sdk/middleware-stack": "3.347.0", - "@aws-sdk/middleware-user-agent": "3.347.0", - "@aws-sdk/node-config-provider": "3.347.0", - "@aws-sdk/node-http-handler": "3.348.0", - "@aws-sdk/smithy-client": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/url-parser": "3.347.0", - "@aws-sdk/util-base64": "3.310.0", - "@aws-sdk/util-body-length-browser": "3.310.0", - "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.347.0", - "@aws-sdk/util-defaults-mode-node": "3.347.0", - "@aws-sdk/util-endpoints": "3.347.0", - "@aws-sdk/util-retry": "3.347.0", - "@aws-sdk/util-user-agent-browser": "3.347.0", - "@aws-sdk/util-user-agent-node": "3.347.0", - "@aws-sdk/util-utf8": "3.310.0", - "@smithy/protocol-http": "^1.0.1", - "@smithy/types": "^1.0.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/shared/node_modules/@aws-sdk/client-sts": { - "version": "3.348.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.348.0.tgz", - "integrity": "sha512-4iaQlWAOHMEF4xjR/FB/ws3aUjXjJHwbsIcqbdYAxsKijDYYTZYCPc/gM0NE1yi28qlNYNhMzHipe5xTYbU2Eg==", - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.347.0", - "@aws-sdk/credential-provider-node": "3.348.0", - "@aws-sdk/fetch-http-handler": "3.347.0", - "@aws-sdk/hash-node": "3.347.0", - "@aws-sdk/invalid-dependency": "3.347.0", - "@aws-sdk/middleware-content-length": "3.347.0", - "@aws-sdk/middleware-endpoint": "3.347.0", - "@aws-sdk/middleware-host-header": "3.347.0", - "@aws-sdk/middleware-logger": "3.347.0", - "@aws-sdk/middleware-recursion-detection": "3.347.0", - "@aws-sdk/middleware-retry": "3.347.0", - "@aws-sdk/middleware-sdk-sts": "3.347.0", - "@aws-sdk/middleware-serde": "3.347.0", - "@aws-sdk/middleware-signing": "3.347.0", - "@aws-sdk/middleware-stack": "3.347.0", - "@aws-sdk/middleware-user-agent": "3.347.0", - "@aws-sdk/node-config-provider": "3.347.0", - "@aws-sdk/node-http-handler": "3.348.0", - "@aws-sdk/smithy-client": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/url-parser": "3.347.0", - "@aws-sdk/util-base64": "3.310.0", - "@aws-sdk/util-body-length-browser": "3.310.0", - "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.347.0", - "@aws-sdk/util-defaults-mode-node": "3.347.0", - "@aws-sdk/util-endpoints": "3.347.0", - "@aws-sdk/util-retry": "3.347.0", - "@aws-sdk/util-user-agent-browser": "3.347.0", - "@aws-sdk/util-user-agent-node": "3.347.0", - "@aws-sdk/util-utf8": "3.310.0", - "@smithy/protocol-http": "^1.0.1", - "@smithy/types": "^1.0.0", - "fast-xml-parser": "4.2.4", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/shared/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.347.0.tgz", - "integrity": "sha512-UnEM+LKGpXKzw/1WvYEQsC6Wj9PupYZdQOE+e2Dgy2dqk/pVFy4WueRtFXYDT2B41ppv3drdXUuKZRIDVqIgNQ==", - "dependencies": { - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/shared/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.348.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.348.0.tgz", - "integrity": "sha512-0IEH5mH/cz2iLyr/+pSa3sCsQcGADiLSEn6yivsXdfz1zDqBiv+ffDoL0+Pvnp+TKf8sA6OlX8PgoMoEBvBdKw==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.347.0", - "@aws-sdk/credential-provider-imds": "3.347.0", - "@aws-sdk/credential-provider-process": "3.347.0", - "@aws-sdk/credential-provider-sso": "3.348.0", - "@aws-sdk/credential-provider-web-identity": "3.347.0", - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/shared-ini-file-loader": "3.347.0", - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/shared/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.348.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.348.0.tgz", - "integrity": "sha512-ngRWphm9e36i58KqVi7Z8WOub+k0cSl+JZaAmgfFm0+dsfBG5uheo598OeiwWV0DqlilvaQZFaMVQgG2SX/tHg==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.347.0", - "@aws-sdk/credential-provider-imds": "3.347.0", - "@aws-sdk/credential-provider-ini": "3.348.0", - "@aws-sdk/credential-provider-process": "3.347.0", - "@aws-sdk/credential-provider-sso": "3.348.0", - "@aws-sdk/credential-provider-web-identity": "3.347.0", - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/shared-ini-file-loader": "3.347.0", - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/shared/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.347.0.tgz", - "integrity": "sha512-yl1z4MsaBdXd4GQ2halIvYds23S67kElyOwz7g8kaQ4kHj+UoYWxz3JVW/DGusM6XmQ9/F67utBrUVA0uhQYyw==", - "dependencies": { - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/shared-ini-file-loader": "3.347.0", - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/shared/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.348.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.348.0.tgz", - "integrity": "sha512-5cQao705376KgGkLv9xgkQ3T5H7KdNddWuyoH2wDcrHd1BA2Lnrell3Yyh7R6jQeV7uCQE/z0ugUOKhDqNKIqQ==", - "dependencies": { - "@aws-sdk/client-sso": "3.348.0", - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/shared-ini-file-loader": "3.347.0", - "@aws-sdk/token-providers": "3.348.0", - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/shared/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.347.0.tgz", - "integrity": "sha512-DxoTlVK8lXjS1zVphtz/Ab+jkN/IZor9d6pP2GjJHNoAIIzXfRwwj5C8vr4eTayx/5VJ7GRP91J8GJ2cKly8Qw==", - "dependencies": { - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/shared/node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.347.0.tgz", - "integrity": "sha512-i9n4ylkGmGvizVcTfN4L+oN10OCL2DKvyMa4cCAVE1TJrsnaE0g7IOOyJGUS8p5KJYQrKVR7kcsa2L1S0VeEcA==", - "dependencies": { - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/util-arn-parser": "3.310.0", - "@aws-sdk/util-config-provider": "3.310.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/shared/node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.347.0.tgz", - "integrity": "sha512-95M1unD1ENL0tx35dfyenSfx0QuXBSKtOi/qJja6LfX5771C5fm5ZTOrsrzPFJvRg/wj8pCOVWRZk+d5+jvfOQ==", - "dependencies": { - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/shared/node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.347.0.tgz", - "integrity": "sha512-Pda7VMAIyeHw9nMp29rxdFft3EF4KP/tz/vLB6bqVoBNbLujo5rxn3SGOgStgIz7fuMLQQfoWIsmvxUm+Fp+Dw==", - "dependencies": { - "@aws-crypto/crc32": "3.0.0", - "@aws-crypto/crc32c": "3.0.0", - "@aws-sdk/is-array-buffer": "3.310.0", - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/util-utf8": "3.310.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/shared/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.347.0.tgz", - "integrity": "sha512-kpKmR9OvMlnReqp5sKcJkozbj1wmlblbVSbnQAIkzeQj2xD5dnVR3Nn2ogQKxSmU1Fv7dEroBtrruJ1o3fY38A==", - "dependencies": { - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" + "dev": true, + "dependencies": { + "path-key": "^4.0.0" }, "engines": { - "node": ">=14.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/shared/node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.347.0.tgz", - "integrity": "sha512-x5fcEV7q8fQ0OmUO+cLhN5iPqGoLWtC3+aKHIfRRb2BpOO1khyc1FKzsIAdeQz2hfktq4j+WsrmcPvFKv51pSg==", + "packages/server/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, "dependencies": { - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/shared/node_modules/@aws-sdk/middleware-logger": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.347.0.tgz", - "integrity": "sha512-NYC+Id5UCkVn+3P1t/YtmHt75uED06vwaKyxDy0UmB2K66PZLVtwWbLpVWrhbroaw1bvUHYcRyQ9NIfnVcXQjA==", + "packages/server/node_modules/p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "dev": true, "dependencies": { - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/shared/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.347.0.tgz", - "integrity": "sha512-qfnSvkFKCAMjMHR31NdsT0gv5Sq/ZHTUD4yQsSLpbVQ6iYAS834lrzXt41iyEHt57Y514uG7F/Xfvude3u4icQ==", - "dependencies": { - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" - }, + "packages/server/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, "engines": { - "node": ">=14.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/shared/node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.347.0.tgz", - "integrity": "sha512-TLr92+HMvamrhJJ0VDhA/PiUh4rTNQz38B9dB9ikohTaRgm+duP+mRiIv16tNPZPGl8v82Thn7Ogk2qPByNDtg==", + "packages/server/node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dependencies": { - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/util-arn-parser": "3.310.0", - "tslib": "^2.5.0" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">= 0.8" } }, - "packages/shared/node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.347.0.tgz", - "integrity": "sha512-38LJ0bkIoVF3W97x6Jyyou72YV9Cfbml4OaDEdnrCOo0EssNZM5d7RhjMvQDwww7/3OBY/BzeOcZKfJlkYUXGw==", + "packages/server/node_modules/rollup": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz", + "integrity": "sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==", + "dev": true, "dependencies": { - "@aws-sdk/middleware-signing": "3.347.0", - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.13.0", + "@rollup/rollup-android-arm64": "4.13.0", + "@rollup/rollup-darwin-arm64": "4.13.0", + "@rollup/rollup-darwin-x64": "4.13.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.13.0", + "@rollup/rollup-linux-arm64-gnu": "4.13.0", + "@rollup/rollup-linux-arm64-musl": "4.13.0", + "@rollup/rollup-linux-riscv64-gnu": "4.13.0", + "@rollup/rollup-linux-x64-gnu": "4.13.0", + "@rollup/rollup-linux-x64-musl": "4.13.0", + "@rollup/rollup-win32-arm64-msvc": "4.13.0", + "@rollup/rollup-win32-ia32-msvc": "4.13.0", + "@rollup/rollup-win32-x64-msvc": "4.13.0", + "fsevents": "~2.3.2" } }, - "packages/shared/node_modules/@aws-sdk/middleware-signing": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.347.0.tgz", - "integrity": "sha512-zVBF/4MGKnvhAE/J+oAL/VAehiyv+trs2dqSQXwHou9j8eA8Vm8HS2NdOwpkZQchIxTuwFlqSusDuPEdYFbvGw==", - "dependencies": { - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/signature-v4": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/util-middleware": "3.347.0", - "tslib": "^2.5.0" + "packages/server/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/server/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, "engines": { - "node": ">=14.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/shared/node_modules/@aws-sdk/middleware-ssec": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.347.0.tgz", - "integrity": "sha512-467VEi2elPmUGcHAgTmzhguZ3lwTpwK+3s+pk312uZtVsS9rP1MAknYhpS3ZvssiqBUVPx8m29cLcC6Tx5nOJg==", + "packages/server/node_modules/strip-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.0.0.tgz", + "integrity": "sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==", + "dev": true, "dependencies": { - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" + "js-tokens": "^8.0.2" }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "packages/server/node_modules/tinypool": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.2.tgz", + "integrity": "sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==", + "dev": true, "engines": { "node": ">=14.0.0" } }, - "packages/shared/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.347.0.tgz", - "integrity": "sha512-wJbGN3OE1/daVCrwk49whhIr9E0j1N4gWwN/wi4WuyYIA+5lMUfVp0aGIOvZR+878DxuFz2hQ4XcZVT4K2WvQw==", + "packages/server/node_modules/vite-node": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.4.0.tgz", + "integrity": "sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==", + "dev": true, "dependencies": { - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/util-endpoints": "3.347.0", - "tslib": "^2.5.0" + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" }, "engines": { - "node": ">=14.0.0" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "packages/shared/node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.347.0.tgz", - "integrity": "sha512-838h7pbRCVYWlTl8W+r5+Z5ld7uoBObgAn7/RB1MQ4JjlkfLdN7emiITG6ueVL+7gWZNZc/4dXR/FJSzCgrkxQ==", + "packages/server/node_modules/vite-node/node_modules/vite": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.6.tgz", + "integrity": "sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==", + "dev": true, "dependencies": { - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/signature-v4": "3.347.0", - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" + "esbuild": "^0.19.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" }, "engines": { - "node": ">=14.0.0" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" }, "peerDependencies": { - "@aws-sdk/signature-v4-crt": "^3.118.0" + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" }, "peerDependenciesMeta": { - "@aws-sdk/signature-v4-crt": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { "optional": true } } }, - "packages/shared/node_modules/@aws-sdk/token-providers": { - "version": "3.348.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.348.0.tgz", - "integrity": "sha512-nTjoJkUsJUrJTZuqaeMD9PW2//Rdg2HgfDjiyC4jmAXtayWYCi11mqauurMaUHJ3p5qJ8f5xzxm6vBTbrftPag==", + "packages/server/node_modules/vitest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.4.0.tgz", + "integrity": "sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==", + "dev": true, "dependencies": { - "@aws-sdk/client-sso-oidc": "3.348.0", - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/shared-ini-file-loader": "3.347.0", - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" + "@vitest/expect": "1.4.0", + "@vitest/runner": "1.4.0", + "@vitest/snapshot": "1.4.0", + "@vitest/spy": "1.4.0", + "@vitest/utils": "1.4.0", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.2", + "vite": "^5.0.0", + "vite-node": "1.4.0", + "why-is-node-running": "^2.2.2" }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/shared/node_modules/@aws-sdk/types": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", - "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", - "dependencies": { - "tslib": "^2.5.0" + "bin": { + "vitest": "vitest.mjs" }, "engines": { - "node": ">=14.0.0" - } - }, - "packages/shared/node_modules/@aws-sdk/util-endpoints": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.347.0.tgz", - "integrity": "sha512-/WUkirizeNAqwVj0zkcrqdQ9pUm1HY5kU+qy7xTR0OebkuJauglkmSTMD+56L1JPunWqHhlwCMVRaz5eaJdSEQ==", - "dependencies": { - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" + "node": "^18.0.0 || >=20.0.0" }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/shared/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.347.0.tgz", - "integrity": "sha512-ydxtsKVtQefgbk1Dku1q7pMkjDYThauG9/8mQkZUAVik55OUZw71Zzr3XO8J8RKvQG8lmhPXuAQ0FKAyycc0RA==", - "dependencies": { - "@aws-sdk/types": "3.347.0", - "bowser": "^2.11.0", - "tslib": "^2.5.0" + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "1.4.0", + "@vitest/ui": "1.4.0", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } } }, - "packages/shared/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.347.0.tgz", - "integrity": "sha512-6X0b9qGsbD1s80PmbaB6v1/ZtLfSx6fjRX8caM7NN0y/ObuLoX8LhYnW6WlB2f1+xb4EjaCNgpP/zCf98MXosw==", + "packages/server/node_modules/vitest/node_modules/vite": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.6.tgz", + "integrity": "sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==", + "dev": true, "dependencies": { - "@aws-sdk/node-config-provider": "3.347.0", - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" + "esbuild": "^0.19.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" }, "engines": { - "node": ">=14.0.0" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" }, "peerDependencies": { - "aws-crt": ">=1.0.0" + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" }, "peerDependenciesMeta": { - "aws-crt": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { "optional": true } } }, + "packages/server/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/shared": { + "name": "@nangohq/shared", + "version": "0.39.8", + "license": "SEE LICENSE IN LICENSE FILE IN GIT REPOSITORY", + "dependencies": { + "@aws-sdk/client-s3": "3.348.0", + "@datadog/datadog-api-client": "^1.16.0", + "@hapi/boom": "^10.0.1", + "@nangohq/node": "^0.39.8", + "@nangohq/utils": "file:../utils", + "@sentry/node": "^7.105.0", + "@temporalio/client": "^1.9.1", + "amqplib": "^0.10.3", + "archiver": "^6.0.1", + "axios": "^1.3.4", + "braintree": "^3.15.0", + "chalk": "^5.3.0", + "cors": "^2.8.5", + "dayjs": "^1.11.7", + "dayjs-plugin-utc": "^0.1.2", + "dd-trace": "5.2.0", + "ejs": "^3.1.5", + "exponential-backoff": "^3.1.1", + "form-data": "4.0.0", + "fs-extra": "^11.1.1", + "human-to-cron": "^0.3.1", + "ip": "^2.0.1", + "js-yaml": "^4.1.0", + "jsonwebtoken": "^9.0.2", + "knex": "3.1.0", + "lodash-es": "^4.17.21", + "md5": "^2.3.0", + "ms": "3.0.0-canary.1", + "openapi3-ts": "^4.1.2", + "parse-link-header": "^2.0.0", + "pg": "^8.8.0", + "posthog-node": "^3.1.3", + "qs": "^6.11.2", + "redis": "^4.6.11", + "rimraf": "^5.0.1", + "semver": "^7.5.4", + "serialize-error": "11.0.3", + "simple-oauth2": "^5.0.0", + "uuid": "^9.0.0" + }, + "devDependencies": { + "@octokit/types": "^9.2.1", + "@types/amqplib": "^0.8.2", + "@types/cors": "^2.8.12", + "@types/debug": "^4.1.7", + "@types/fs-extra": "^11.0.1", + "@types/human-to-cron": "^0.3.0", + "@types/js-yaml": "^4.0.5", + "@types/lodash-es": "^4.17.10", + "@types/node": "^18.7.6", + "@types/parse-link-header": "^2.0.0", + "@types/uuid": "^9.0.0", + "typescript": "^5.3.3", + "vitest": "1.4.0" + }, + "engines": { + "node": ">=16.7", + "npm": ">=6.14.11" + } + }, "packages/shared/node_modules/@esbuild/android-arm": { "version": "0.19.12", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", @@ -33108,29 +33471,6 @@ "node": ">=12" } }, - "packages/shared/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" - } - }, - "packages/shared/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" - } - }, "packages/shared/node_modules/@types/uuid": { "version": "9.0.1", "dev": true, @@ -33375,27 +33715,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "packages/shared/node_modules/fast-xml-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.4.tgz", - "integrity": "sha512-fbfMDvgBNIdDJLdLOwacjFAPYt67tr31H9ZhWSm45CDAxvd0I6WTlSOUo7K2P/K5sA5JgMKG64PI3DMcaFdWpQ==", - "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" - } - }, "packages/shared/node_modules/get-stream": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", @@ -33677,11 +33996,6 @@ "node": ">=14.0.0" } }, - "packages/shared/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, "packages/shared/node_modules/vite-node": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.4.0.tgz", @@ -33903,6 +34217,15 @@ "node": ">= 12.0.0" } }, + "packages/utils": { + "name": "@nangohq/utils", + "version": "1.0.0", + "license": "SEE LICENSE IN LICENSE FILE IN GIT REPOSITORY", + "dependencies": { + "winston": "3.8.2" + }, + "devDependencies": {} + }, "packages/webapp": { "name": "@nangohq/webapp", "version": "1.0.0", diff --git a/package.json b/package.json index bb7ed3d3ff..e474d2827b 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "packages/runner", "packages/persist", "packages/jobs", - "packages/webapp" + "packages/webapp", + "packages/utils" ], "scripts": { "create:migration": "cd packages/shared/lib/db && knex migrate:make $1 --esm --knexfile ./knexfile.cjs", diff --git a/packages/jobs/Dockerfile b/packages/jobs/Dockerfile index ace81c57bd..21364186de 100644 --- a/packages/jobs/Dockerfile +++ b/packages/jobs/Dockerfile @@ -10,6 +10,7 @@ WORKDIR /nango COPY packages/node-client/ packages/node-client/ COPY packages/shared/ packages/shared/ +COPY packages/utils/ packages/utils/ COPY packages/jobs/ packages/jobs/ COPY packages/runner/ packages/runner/ COPY package*.json ./ diff --git a/packages/jobs/lib/activities.ts b/packages/jobs/lib/activities.ts index bc1c51233f..1622b66151 100644 --- a/packages/jobs/lib/activities.ts +++ b/packages/jobs/lib/activities.ts @@ -20,12 +20,14 @@ import { LogTypes, isInitialSyncStillRunning, getSyncByIdAndName, - logger, getLastSyncDate } from '@nangohq/shared'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; import integrationService from './integration.service.js'; import type { ContinuousSyncArgs, InitialSyncArgs, ActionArgs, WebhookArgs } from './models/worker'; +const logger = getLogger('Jobs'); + export async function routeSync(args: InitialSyncArgs): Promise { const { syncId, syncJobId, syncName, nangoConnection, debug } = args; let environmentId = nangoConnection?.environment_id; diff --git a/packages/jobs/lib/app.ts b/packages/jobs/lib/app.ts index f8f8bf867f..48eced5639 100644 --- a/packages/jobs/lib/app.ts +++ b/packages/jobs/lib/app.ts @@ -4,12 +4,14 @@ import { server } from './server.js'; import { cronAutoIdleDemo } from './crons/autoIdleDemo.js'; import { deleteOldActivityLogs } from './crons/deleteOldActivities.js'; import { deleteSyncsData } from './crons/deleteSyncsData.js'; -import { logger } from '@nangohq/shared'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; + +const logger = getLogger('Jobs'); try { const port = parseInt(process.env['NANGO_JOBS_PORT'] || '') || 3005; server.listen(port); - logger.info(`🚀 Jobs service ready at http://localhost:${port}`); + logger.info(`🚀 service ready at http://localhost:${port}`); const temporalNs = process.env['TEMPORAL_NAMESPACE'] || 'default'; const temporal = new Temporal(temporalNs); @@ -29,6 +31,6 @@ try { }); }); } catch (err) { - logger.error(`[JOBS]: ${JSON.stringify(err)}`); + logger.error(`${JSON.stringify(err)}`); process.exit(1); } diff --git a/packages/jobs/lib/crons/autoIdleDemo.ts b/packages/jobs/lib/crons/autoIdleDemo.ts index 0229f8506b..e2f0567424 100644 --- a/packages/jobs/lib/crons/autoIdleDemo.ts +++ b/packages/jobs/lib/crons/autoIdleDemo.ts @@ -11,11 +11,13 @@ import { updateScheduleStatus, isErr, findPausableDemoSyncs, - logger, SpanTypes } from '@nangohq/shared'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; import tracer from 'dd-trace'; +const logger = getLogger('Jobs'); + export function cronAutoIdleDemo(): void { schedule('1 * * * *', () => { const span = tracer.startSpan(SpanTypes.JOBS_IDLE_DEMO); diff --git a/packages/jobs/lib/crons/deleteOldActivities.ts b/packages/jobs/lib/crons/deleteOldActivities.ts index db18b14643..34c20debc8 100644 --- a/packages/jobs/lib/crons/deleteOldActivities.ts +++ b/packages/jobs/lib/crons/deleteOldActivities.ts @@ -1,8 +1,11 @@ import * as cron from 'node-cron'; -import { deleteLog, deleteLogsMessages, errorManager, ErrorSourceEnum, findOldActivities, logger, MetricTypes, telemetry } from '@nangohq/shared'; +import { deleteLog, deleteLogsMessages, errorManager, ErrorSourceEnum, findOldActivities, MetricTypes, telemetry } from '@nangohq/shared'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; import tracer from 'dd-trace'; import { setTimeout } from 'node:timers/promises'; +const logger = getLogger('Jobs'); + // Retention in days const retention = parseInt(process.env['NANGO_CLEAR_ACTIVITIES_RETENTION'] || '', 10) || 15; const limitLog = parseInt(process.env['NANGO_CLEAR_ACTIVITIES_LIMIT'] || '', 10) || 2000; diff --git a/packages/jobs/lib/crons/deleteSyncsData.ts b/packages/jobs/lib/crons/deleteSyncsData.ts index 866760bea0..1d5f874097 100644 --- a/packages/jobs/lib/crons/deleteSyncsData.ts +++ b/packages/jobs/lib/crons/deleteSyncsData.ts @@ -2,7 +2,6 @@ import * as cron from 'node-cron'; import { errorManager, ErrorSourceEnum, - logger, MetricTypes, softDeleteSchedules, telemetry, @@ -11,8 +10,11 @@ import { db, findRecentlyDeletedSync } from '@nangohq/shared'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; import tracer from 'dd-trace'; +const logger = getLogger('Jobs'); + const limitJobs = 1000; const limitSchedules = 1000; const limitRecords = 1000; diff --git a/packages/jobs/lib/integration.service.ts b/packages/jobs/lib/integration.service.ts index 8fc9aa03a8..740ed31d3e 100644 --- a/packages/jobs/lib/integration.service.ts +++ b/packages/jobs/lib/integration.service.ts @@ -1,16 +1,7 @@ import type { Context } from '@temporalio/activity'; import type { IntegrationServiceInterface, NangoIntegrationData, NangoProps, ServiceResponse } from '@nangohq/shared'; -import { - createActivityLogMessage, - localFileService, - remoteFileService, - isCloud, - isProd, - integrationFilesAreRemote, - NangoError, - formatScriptError, - isOk -} from '@nangohq/shared'; +import { integrationFilesAreRemote, isCloud, isProd } from '@nangohq/utils/dist/environment/detection.js'; +import { createActivityLogMessage, localFileService, remoteFileService, NangoError, formatScriptError, isOk } from '@nangohq/shared'; import type { Runner } from './runner/runner.js'; import { getOrStartRunner, getRunnerId } from './runner/runner.js'; import tracer from 'dd-trace'; @@ -82,7 +73,7 @@ class IntegrationService implements IntegrationServiceInterface { .setTag('syncName', syncName); try { const script: string | null = - (isCloud() || integrationFilesAreRemote()) && !optionalLoadLocation + (isCloud || integrationFilesAreRemote) && !optionalLoadLocation ? await remoteFileService.getFile(integrationData.fileLocation as string, environmentId) : localFileService.getIntegrationFile(syncName, optionalLoadLocation); @@ -120,7 +111,7 @@ class IntegrationService implements IntegrationServiceInterface { const accountId = nangoProps.accountId; // a runner per account in prod only - const runnerId = isProd() ? getRunnerId(`${accountId}`) : getRunnerId('default'); + const runnerId = isProd ? getRunnerId(`${accountId}`) : getRunnerId('default'); // fallback to default runner if account runner isn't ready yet const runner = await getOrStartRunner(runnerId).catch(() => getOrStartRunner(getRunnerId('default'))); diff --git a/packages/jobs/lib/runner/local.runner.ts b/packages/jobs/lib/runner/local.runner.ts index d2dc6d609c..6846475533 100644 --- a/packages/jobs/lib/runner/local.runner.ts +++ b/packages/jobs/lib/runner/local.runner.ts @@ -3,7 +3,9 @@ import { RunnerType } from './runner.js'; import type { ChildProcess } from 'child_process'; import { execSync, spawn } from 'child_process'; import { getRunnerClient } from '@nangohq/nango-runner'; -import { logger } from '@nangohq/shared'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; + +const logger = getLogger('Jobs'); export class LocalRunner implements Runner { public client: any; diff --git a/packages/jobs/lib/runner/remote.runner.ts b/packages/jobs/lib/runner/remote.runner.ts index 31fec90031..6336c4582c 100644 --- a/packages/jobs/lib/runner/remote.runner.ts +++ b/packages/jobs/lib/runner/remote.runner.ts @@ -1,8 +1,10 @@ -import { logger } from '@nangohq/shared'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; import type { Runner } from './runner.js'; import { RunnerType } from './runner.js'; import { getRunnerClient } from '@nangohq/nango-runner'; +const logger = getLogger('Jobs'); + export class RemoteRunner implements Runner { public client: any; public runnerType: RunnerType = RunnerType.Remote; diff --git a/packages/jobs/lib/runner/render.runner.ts b/packages/jobs/lib/runner/render.runner.ts index 1c33602d98..47b89d4db8 100644 --- a/packages/jobs/lib/runner/render.runner.ts +++ b/packages/jobs/lib/runner/render.runner.ts @@ -2,7 +2,8 @@ import type { Runner } from './runner.js'; import { RunnerType } from './runner.js'; import type { ProxyAppRouter } from '@nangohq/nango-runner'; import { getRunnerClient } from '@nangohq/nango-runner'; -import { NodeEnv, getEnv, getPersistAPIUrl } from '@nangohq/shared'; +import { env } from '@nangohq/utils/dist/environment/detection.js'; +import { NodeEnv, getPersistAPIUrl } from '@nangohq/shared'; import { RenderAPI } from './render.api.js'; import tracer from 'dd-trace'; @@ -56,7 +57,7 @@ export class RenderRunner implements Runner { if (res.data.length > 0) { svc = res.data[0].service; } else { - const imageTag = getEnv(); + const imageTag = env; const ownerId = process.env['RUNNER_OWNER_ID']; if (!ownerId) { throw new Error('RUNNER_OWNER_ID is not set'); diff --git a/packages/jobs/lib/runner/runner.ts b/packages/jobs/lib/runner/runner.ts index 2969bbdb77..aa15436860 100644 --- a/packages/jobs/lib/runner/runner.ts +++ b/packages/jobs/lib/runner/runner.ts @@ -2,8 +2,12 @@ import type { KVStore } from '@nangohq/shared/lib/utils/kvstore/KVStore.js'; import { LocalRunner } from './local.runner.js'; import { RenderRunner } from './render.runner.js'; import { RemoteRunner } from './remote.runner.js'; -import { getEnv, getRedisUrl, InMemoryKVStore, RedisKVStore, isEnterprise, logger } from '@nangohq/shared'; +import { isEnterprise, env } from '@nangohq/utils/dist/environment/detection.js'; +import { getRedisUrl, InMemoryKVStore, RedisKVStore } from '@nangohq/shared'; import type { ProxyAppRouter } from '@nangohq/nango-runner'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; + +const logger = getLogger('Runner'); export enum RunnerType { Local = 'local', @@ -21,7 +25,7 @@ export interface Runner { } export function getRunnerId(suffix: string): string { - return `${getEnv()}-runner-account-${suffix}`; + return `${env}-runner-account-${suffix}`; } export async function getOrStartRunner(runnerId: string): Promise { @@ -53,7 +57,7 @@ export async function getOrStartRunner(runnerId: string): Promise { } const isRender = process.env['IS_RENDER'] === 'true'; let runner: Runner; - if (isEnterprise()) { + if (isEnterprise) { runner = await RemoteRunner.getOrStart(runnerId); } else if (isRender) { runner = await RenderRunner.getOrStart(runnerId); diff --git a/packages/jobs/lib/server.ts b/packages/jobs/lib/server.ts index f6fb805468..ca03699cbb 100644 --- a/packages/jobs/lib/server.ts +++ b/packages/jobs/lib/server.ts @@ -3,7 +3,9 @@ import { createHTTPServer } from '@trpc/server/adapters/standalone'; import superjson from 'superjson'; import { z } from 'zod'; import { suspendRunner } from './runner/runner.js'; -import { logger } from '@nangohq/shared'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; + +const logger = getLogger('Jobs'); export const t = initTRPC.create({ transformer: superjson diff --git a/packages/jobs/lib/temporal.ts b/packages/jobs/lib/temporal.ts index 4258ca1d33..af3bc6c7cb 100644 --- a/packages/jobs/lib/temporal.ts +++ b/packages/jobs/lib/temporal.ts @@ -3,7 +3,11 @@ import fs from 'fs-extra'; import * as dotenv from 'dotenv'; import { createRequire } from 'module'; import * as activities from './activities.js'; -import { SYNC_TASK_QUEUE, WEBHOOK_TASK_QUEUE, isProd, isEnterprise, logger } from '@nangohq/shared'; +import { SYNC_TASK_QUEUE, WEBHOOK_TASK_QUEUE } from '@nangohq/shared'; +import { isProd, isEnterprise } from '@nangohq/utils/dist/environment/detection.js'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; + +const logger = getLogger('Jobs.Temporal'); const TEMPORAL_WORKER_MAX_CONCURRENCY = parseInt(process.env['TEMPORAL_WORKER_MAX_CONCURRENCY'] || '0') || 500; @@ -26,7 +30,7 @@ export class Temporal { let crt: Buffer | null = null; let key: Buffer | null = null; - if (isProd() || isEnterprise()) { + if (isProd || isEnterprise) { crt = await fs.readFile(`/etc/secrets/${this.namespace}.crt`); key = await fs.readFile(`/etc/secrets/${this.namespace}.key`); } @@ -35,7 +39,7 @@ export class Temporal { const connection = await NativeConnection.connect({ address: process.env['TEMPORAL_ADDRESS'] || 'localhost:7233', tls: - !isProd() && !isEnterprise() + !isProd && !isEnterprise ? false : { clientCertPair: { diff --git a/packages/jobs/nodemon.json b/packages/jobs/nodemon.json index 586aa9f368..bcc60becec 100644 --- a/packages/jobs/nodemon.json +++ b/packages/jobs/nodemon.json @@ -1,7 +1,7 @@ { - "watch": ["lib", "../shared/lib", "../../.env"], - "ext": "ts,json", - "ignore": ["lib/**/*.spec.ts"], - "exec": "tsx -r dotenv/config lib/app.ts dotenv_config_path=./../../.env", - "signal": "SIGTERM" -} \ No newline at end of file + "watch": ["lib", "../shared/dist", "../utils/dist", "../../.env"], + "ext": "ts,json", + "ignore": ["lib/**/*.spec.ts"], + "exec": "tsx -r dotenv/config lib/app.ts dotenv_config_path=./../../.env", + "signal": "SIGTERM" +} diff --git a/packages/jobs/package.json b/packages/jobs/package.json index cbe792356e..8487cc9791 100644 --- a/packages/jobs/package.json +++ b/packages/jobs/package.json @@ -17,6 +17,7 @@ "dependencies": { "@nangohq/nango-runner": "^1.0.0", "@nangohq/shared": "^0.39.8", + "@nangohq/utils": "file:../utils", "@temporalio/activity": "^1.9.1", "@temporalio/client": "^1.9.1", "@temporalio/worker": "^1.9.1", diff --git a/packages/jobs/tsconfig.json b/packages/jobs/tsconfig.json index d35f14bc29..3072de4f5e 100644 --- a/packages/jobs/tsconfig.json +++ b/packages/jobs/tsconfig.json @@ -10,9 +10,10 @@ }, { "path": "../runner" + }, + { + "path": "../utils" } ], - "include": [ - "lib/**/*" - ] + "include": ["lib/**/*"] } diff --git a/packages/persist/Dockerfile b/packages/persist/Dockerfile index 8f556f5bc6..d0dbc5604f 100644 --- a/packages/persist/Dockerfile +++ b/packages/persist/Dockerfile @@ -11,6 +11,7 @@ WORKDIR /nango COPY packages/node-client/ packages/node-client/ COPY packages/shared/ packages/shared/ COPY packages/persist/ packages/persist/ +COPY packages/utils/ packages/utils/ COPY package*.json ./ RUN npm pkg delete scripts.prepare diff --git a/packages/persist/lib/app.ts b/packages/persist/lib/app.ts index 5fc15f5516..cc5c7acbc9 100644 --- a/packages/persist/lib/app.ts +++ b/packages/persist/lib/app.ts @@ -1,10 +1,13 @@ import './tracer.js'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; import { server } from './server.js'; +const logger = getLogger('Persist'); + try { const port = parseInt(process.env['NANGO_PERSIST_PORT'] || '') || 3007; server.listen(port, () => { - console.log(`🚀 Persist API ready at http://localhost:${port}`); + logger.info(`🚀 API ready at http://localhost:${port}`); }); } catch (err) { console.error(`Persist API error: ${err}`); diff --git a/packages/persist/lib/server.ts b/packages/persist/lib/server.ts index 87197d2bcf..71ce5f2375 100644 --- a/packages/persist/lib/server.ts +++ b/packages/persist/lib/server.ts @@ -2,8 +2,11 @@ import express from 'express'; import type { Request, Response, NextFunction } from 'express'; import { validateRequest } from 'zod-express'; import { z } from 'zod'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; import persistController from './controllers/persist.controller.js'; -import { logLevelValues, logger } from '@nangohq/shared'; +import { logLevelValues } from '@nangohq/shared'; + +const logger = getLogger('Persist'); export const server = express(); server.use(express.json({ limit: '100mb' })); @@ -12,14 +15,14 @@ server.use((req: Request, res: Response, next: NextFunction) => { const originalSend = res.send; res.send = function (body: any) { if (res.statusCode >= 400) { - logger.info(`[Persist] [Error] ${req.method} ${req.path} ${res.statusCode} '${JSON.stringify(body)}'`); + logger.info(`[Error] ${req.method} ${req.path} ${res.statusCode} '${JSON.stringify(body)}'`); } originalSend.call(this, body) as any; return this; }; next(); if (res.statusCode < 400) { - logger.info(`[Persist] ${req.method} ${req.path} ${res.statusCode}`); + logger.info(`${req.method} ${req.path} ${res.statusCode}`); } }); diff --git a/packages/persist/nodemon.json b/packages/persist/nodemon.json index 4471f18643..c71f2b06ec 100644 --- a/packages/persist/nodemon.json +++ b/packages/persist/nodemon.json @@ -1,6 +1,6 @@ { - "watch": ["lib", "../shared/lib", "../../.env"], - "ext": "ts,json", - "ignore": ["lib/**/*.test.ts"], - "exec": "tsc && tsx -r dotenv/config lib/app.ts dotenv_config_path=./../../.env" -} \ No newline at end of file + "watch": ["lib", "../shared/dist", "../utils/dist", "../../.env"], + "ext": "ts,json", + "ignore": ["lib/**/*.test.ts"], + "exec": "tsc && tsx -r dotenv/config lib/app.ts dotenv_config_path=./../../.env" +} diff --git a/packages/persist/package.json b/packages/persist/package.json index de34985fd9..b6ce435245 100644 --- a/packages/persist/package.json +++ b/packages/persist/package.json @@ -18,6 +18,7 @@ }, "license": "SEE LICENSE IN LICENSE FILE IN GIT REPOSITORY", "dependencies": { + "@nangohq/utils": "file:../utils", "@nangohq/shared": "^0.39.8", "dd-trace": "5.2.0", "express": "^4.18.2", diff --git a/packages/persist/tsconfig.json b/packages/persist/tsconfig.json index dd2652e614..d30dc0d768 100644 --- a/packages/persist/tsconfig.json +++ b/packages/persist/tsconfig.json @@ -4,6 +4,6 @@ "rootDir": "lib", "outDir": "dist" }, - "references": [{ "path": "../shared" }], + "references": [{ "path": "../shared" }, { "path": "../utils" }], "include": ["lib/**/*"] -} \ No newline at end of file +} diff --git a/packages/runner/Dockerfile b/packages/runner/Dockerfile index be6335fafa..f4328b8dde 100644 --- a/packages/runner/Dockerfile +++ b/packages/runner/Dockerfile @@ -10,6 +10,7 @@ WORKDIR /nango COPY packages/node-client/ packages/node-client/ COPY packages/shared/ packages/shared/ +COPY packages/utils/ packages/utils/ COPY packages/runner/ packages/runner/ COPY package*.json ./ diff --git a/packages/runner/lib/app.ts b/packages/runner/lib/app.ts index 76b29b555d..16603a72c7 100644 --- a/packages/runner/lib/app.ts +++ b/packages/runner/lib/app.ts @@ -1,12 +1,14 @@ import './tracer.js'; import { server } from './server.js'; -import { logger } from '@nangohq/shared'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; + +const logger = getLogger('Runner'); try { const port = parseInt(process.argv[2] || '') || 3006; const id = process.argv[3] || process.env['RUNNER_ID'] || 'unknown-id'; server.listen(port, () => { - logger.info(`🚀 Runner '${id}' ready at http://localhost:${port}`); + logger.info(`🚀 '${id}' ready at http://localhost:${port}`); }); } catch (err) { logger.error(`Unable to start runner: ${JSON.stringify(err)}`); diff --git a/packages/runner/lib/server.ts b/packages/runner/lib/server.ts index f1251ca2d1..ea628ecd33 100644 --- a/packages/runner/lib/server.ts +++ b/packages/runner/lib/server.ts @@ -3,12 +3,15 @@ import * as trpcExpress from '@trpc/server/adapters/express'; import express from 'express'; import type { Request, Response, NextFunction } from 'express'; import timeout from 'connect-timeout'; -import { logger, type NangoProps, type RunnerOutput } from '@nangohq/shared'; +import type { NangoProps, RunnerOutput } from '@nangohq/shared'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; import { exec } from './exec.js'; import { cancel } from './cancel.js'; import superjson from 'superjson'; import { fetch } from 'undici'; +const logger = getLogger('Runner'); + export const t = initTRPC.create({ transformer: superjson }); diff --git a/packages/runner/nodemon.json b/packages/runner/nodemon.json index 4471f18643..c71f2b06ec 100644 --- a/packages/runner/nodemon.json +++ b/packages/runner/nodemon.json @@ -1,6 +1,6 @@ { - "watch": ["lib", "../shared/lib", "../../.env"], - "ext": "ts,json", - "ignore": ["lib/**/*.test.ts"], - "exec": "tsc && tsx -r dotenv/config lib/app.ts dotenv_config_path=./../../.env" -} \ No newline at end of file + "watch": ["lib", "../shared/dist", "../utils/dist", "../../.env"], + "ext": "ts,json", + "ignore": ["lib/**/*.test.ts"], + "exec": "tsc && tsx -r dotenv/config lib/app.ts dotenv_config_path=./../../.env" +} diff --git a/packages/runner/package.json b/packages/runner/package.json index 6dff66340c..e866820b53 100644 --- a/packages/runner/package.json +++ b/packages/runner/package.json @@ -19,6 +19,7 @@ "license": "SEE LICENSE IN LICENSE FILE IN GIT REPOSITORY", "dependencies": { "@nangohq/shared": "^0.39.8", + "@nangohq/utils": "file:../utils", "@trpc/client": "^10.44.0", "@trpc/server": "^10.44.0", "connect-timeout": "^1.9.0", diff --git a/packages/runner/tsconfig.json b/packages/runner/tsconfig.json index dd2652e614..d30dc0d768 100644 --- a/packages/runner/tsconfig.json +++ b/packages/runner/tsconfig.json @@ -4,6 +4,6 @@ "rootDir": "lib", "outDir": "dist" }, - "references": [{ "path": "../shared" }], + "references": [{ "path": "../shared" }, { "path": "../utils" }], "include": ["lib/**/*"] -} \ No newline at end of file +} diff --git a/packages/server/Dockerfile b/packages/server/Dockerfile index 4f476c0eb8..c0665ec133 100644 --- a/packages/server/Dockerfile +++ b/packages/server/Dockerfile @@ -13,6 +13,7 @@ COPY packages/server/ packages/server/ COPY package*.json ./ COPY packages/webapp/build/ packages/webapp/build/ COPY packages/shared/ packages/shared/ +COPY packages/utils/ packages/utils/ COPY packages/node-client/ packages/node-client/ RUN npm pkg delete scripts.prepare diff --git a/packages/server/lib/clients/auth.client.ts b/packages/server/lib/clients/auth.client.ts index b1a62d70f3..be462b5dff 100644 --- a/packages/server/lib/clients/auth.client.ts +++ b/packages/server/lib/clients/auth.client.ts @@ -4,7 +4,8 @@ import { BasicStrategy } from 'passport-http'; import express from 'express'; import session from 'express-session'; import path from 'path'; -import { dirname, AUTH_ENABLED, isBasicAuthEnabled, userService, database } from '@nangohq/shared'; +import { AUTH_ENABLED, isBasicAuthEnabled } from '@nangohq/utils/dist/environment/detection.js'; +import { dirname, userService, database } from '@nangohq/shared'; import crypto from 'crypto'; import util from 'util'; import cookieParser from 'cookie-parser'; @@ -66,7 +67,7 @@ export function setupAuth(app: express.Express) { new BasicStrategy(async function (username, password, done) { const user = await userService.getUserById(0); - if (!isBasicAuthEnabled()) { + if (!isBasicAuthEnabled) { return done(null, user); } diff --git a/packages/server/lib/clients/email.client.ts b/packages/server/lib/clients/email.client.ts index 880526fa23..4587a645b3 100644 --- a/packages/server/lib/clients/email.client.ts +++ b/packages/server/lib/clients/email.client.ts @@ -1,5 +1,8 @@ import formData from 'form-data'; import Mailgun from 'mailgun.js'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; + +const logger = getLogger('Server.EmailClient'); class EmailClient { private static instance: EmailClient; @@ -22,9 +25,9 @@ class EmailClient { send(email: string, subject: string, html: string) { if (process.env['MAILGUN_API_KEY'] === undefined || process.env['MAILGUN_API_KEY'] === 'EMPTY' || !this.client) { - console.log('Email client not configured'); - console.log('The following email would have been sent:'); - console.log(email, subject, html); + logger.info('Email client not configured'); + logger.info('The following email would have been sent:'); + logger.info(email, subject, html); return; } return this.client.messages.create('email.nango.dev', { diff --git a/packages/server/lib/clients/publisher.client.ts b/packages/server/lib/clients/publisher.client.ts index 7a4191eef6..2c221cfec1 100644 --- a/packages/server/lib/clients/publisher.client.ts +++ b/packages/server/lib/clients/publisher.client.ts @@ -2,11 +2,13 @@ import type { WebSocket } from 'ws'; import type { RedisClientType } from 'redis'; import * as uuid from 'uuid'; import { createClient } from 'redis'; -import logger from '../utils/logger.js'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; import type { WSErr } from '../utils/web-socket-error.js'; import { errorHtml, successHtml } from '../utils/utils.js'; import { getRedisUrl } from '@nangohq/shared'; +const logger = getLogger('Server.Publisher'); + const enum MessageType { ConnectionAck = 'connection_ack', Error = 'error', diff --git a/packages/server/lib/controllers/access.middleware.ts b/packages/server/lib/controllers/access.middleware.ts index 79ac893ffa..2cec069574 100644 --- a/packages/server/lib/controllers/access.middleware.ts +++ b/packages/server/lib/controllers/access.middleware.ts @@ -1,21 +1,22 @@ import type { Request, Response, NextFunction } from 'express'; +import { isCloud, isBasicAuthEnabled } from '@nangohq/utils/dist/environment/detection.js'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; import { LogActionEnum, ErrorSourceEnum, environmentService, - isCloud, setAccount, setEnvironmentId, - isBasicAuthEnabled, errorManager, userService, - logger, stringifyError, telemetry, MetricTypes } from '@nangohq/shared'; import tracer from 'dd-trace'; +const logger = getLogger('AccessMiddleware'); + export class AccessMiddleware { async secretKeyAuth(req: Request, res: Response, next: NextFunction) { const authorizationHeader = req.get('authorization'); @@ -123,14 +124,14 @@ export class AccessMiddleware { } // Protected by basic auth: should be signed in. - if (isBasicAuthEnabled()) { + if (isBasicAuthEnabled) { res.status(401).send({ error: 'Not authenticated.' }); return; } } admin(req: Request, res: Response, next: NextFunction) { - if (!isCloud()) { + if (!isCloud) { return errorManager.errRes(res, 'only_nango_cloud'); } diff --git a/packages/server/lib/controllers/account.controller.ts b/packages/server/lib/controllers/account.controller.ts index fa8f07d242..f0e83840b5 100644 --- a/packages/server/lib/controllers/account.controller.ts +++ b/packages/server/lib/controllers/account.controller.ts @@ -1,10 +1,11 @@ import type { Request, Response, NextFunction } from 'express'; import type { LogLevel } from '@nangohq/shared'; -import { accountService, userService, errorManager, LogActionEnum, createActivityLogAndLogMessage, isCloud } from '@nangohq/shared'; +import { isCloud } from '@nangohq/utils/dist/environment/detection.js'; +import { accountService, userService, errorManager, LogActionEnum, createActivityLogAndLogMessage } from '@nangohq/shared'; import { getUserAccountAndEnvironmentFromSession } from '../utils/utils.js'; export const NANGO_ADMIN_UUID = process.env['NANGO_ADMIN_UUID']; -export const AUTH_ADMIN_SWITCH_ENABLED = NANGO_ADMIN_UUID && isCloud(); +export const AUTH_ADMIN_SWITCH_ENABLED = NANGO_ADMIN_UUID && isCloud; export const AUTH_ADMIN_SWITCH_MS = 600 * 1000; class AccountController { diff --git a/packages/server/lib/controllers/auth.controller.ts b/packages/server/lib/controllers/auth.controller.ts index d1d9e8ce04..035837116f 100644 --- a/packages/server/lib/controllers/auth.controller.ts +++ b/packages/server/lib/controllers/auth.controller.ts @@ -6,6 +6,7 @@ import { resetPasswordSecret, getUserAccountAndEnvironmentFromSession } from '.. import jwt from 'jsonwebtoken'; import EmailClient from '../clients/email.client.js'; import type { User, Result } from '@nangohq/shared'; +import { isCloud, baseUrl, basePublicUrl } from '@nangohq/utils/dist/environment/detection.js'; import { userService, accountService, @@ -17,9 +18,6 @@ import { environmentService, analytics, AnalyticsTypes, - isCloud, - getBaseUrl, - getBasePublicUrl, NangoError, createOnboardingProvider } from '@nangohq/shared'; @@ -42,7 +40,7 @@ let workos: WorkOS | null = null; if (process.env['WORKOS_API_KEY'] && process.env['WORKOS_CLIENT_ID']) { workos = new WorkOS(process.env['WORKOS_API_KEY']); } else { - if (isCloud()) { + if (isCloud) { throw new NangoError('workos_not_configured'); } } @@ -177,9 +175,9 @@ class AuthController { } const event = joinedWithToken ? AnalyticsTypes.ACCOUNT_JOINED : AnalyticsTypes.ACCOUNT_CREATED; - analytics.track(event, account.id, {}, isCloud() ? { email: email } : {}); + analytics.track(event, account.id, {}, isCloud ? { email: email } : {}); - if (isCloud() && !joinedWithToken) { + if (isCloud && !joinedWithToken) { // On Cloud version, create default provider config to simplify onboarding. const env = await environmentService.getByEnvironmentName(account.id, 'dev'); if (env) { @@ -284,7 +282,7 @@ class AuthController { 'Nango password reset', `

Reset your password

Someone requested a password reset.

-

Reset password

+

Reset password

If you didn't initiate this request, please contact us immediately at support@nango.dev

` ) .catch((e: Error) => { @@ -334,7 +332,7 @@ class AuthController { const oAuthUrl = workos?.userManagement.getAuthorizationUrl({ clientId: process.env['WORKOS_CLIENT_ID'] || '', provider, - redirectUri: `${getBasePublicUrl()}/api/v1/login/callback` + redirectUri: `${basePublicUrl}/api/v1/login/callback` }); res.send({ url: oAuthUrl }); @@ -381,7 +379,7 @@ class AuthController { const oAuthUrl = workos?.userManagement.getAuthorizationUrl({ clientId: process.env['WORKOS_CLIENT_ID'] || '', provider, - redirectUri: `${getBasePublicUrl()}/api/v1/login/callback`, + redirectUri: `${basePublicUrl}/api/v1/login/callback`, state: JSON.stringify(inviteParams) }); @@ -417,7 +415,7 @@ class AuthController { if (err) { return next(err); } - res.redirect(`${getBasePublicUrl()}/`); + res.redirect(`${basePublicUrl}/`); }); return; @@ -462,7 +460,7 @@ class AuthController { if (err) { return next(err); } - res.redirect(`${getBasePublicUrl()}/`); + res.redirect(`${basePublicUrl}/`); }); } catch (err) { next(err); diff --git a/packages/server/lib/controllers/config.controller.ts b/packages/server/lib/controllers/config.controller.ts index 4227a9d743..fe59d43e3c 100644 --- a/packages/server/lib/controllers/config.controller.ts +++ b/packages/server/lib/controllers/config.controller.ts @@ -8,9 +8,9 @@ import type { Integration as ProviderIntegration, Config } from '@nangohq/shared'; +import { isHosted } from '@nangohq/utils/dist/environment/detection.js'; import { flowService, - isHosted, getConfigWithEndpointsByProviderConfigKey, AuthModes, errorManager, @@ -351,7 +351,7 @@ class ConfigController { } as IntegrationWithCreds) : ({ unique_key: config.unique_key, provider: config.provider, syncs, actions } as ProviderIntegration); - if (includeFlows && !isHosted()) { + if (includeFlows && !isHosted) { const availableFlows = flowService.getAllAvailableFlowsAsStandardConfig(); const [availableFlowsForProvider] = availableFlows.filter((flow) => flow.providerConfigKey === config.provider); diff --git a/packages/server/lib/controllers/environment.controller.ts b/packages/server/lib/controllers/environment.controller.ts index 6384527eb5..45aeb6a49d 100644 --- a/packages/server/lib/controllers/environment.controller.ts +++ b/packages/server/lib/controllers/environment.controller.ts @@ -1,12 +1,11 @@ import type { Request, Response, NextFunction } from 'express'; import type { Environment } from '@nangohq/shared'; +import { isCloud, baseUrl } from '@nangohq/utils/dist/environment/detection.js'; import { accountService, hmacService, environmentService, errorManager, - getBaseUrl, - isCloud, getWebsocketsPath, getOauthCallbackUrl, getGlobalWebhookReceiveUrl, @@ -39,7 +38,6 @@ class EnvironmentController { const environments = await environmentService.getEnvironmentsByAccountId(account.id); const version = packageJsonFile().version; - const baseUrl = getBaseUrl(); const onboarding = await getOnboardingProgress(user.id); res.status(200).send({ environments, @@ -63,7 +61,7 @@ class EnvironmentController { } const { environment, account, user } = response; - if (!isCloud()) { + if (!isCloud) { environment.websockets_path = getWebsocketsPath(); if (process.env[`NANGO_SECRET_KEY_${environment.name.toUpperCase()}`]) { environment.secret_key = process.env[`NANGO_SECRET_KEY_${environment.name.toUpperCase()}`] as string; @@ -83,7 +81,7 @@ class EnvironmentController { const environmentVariables = await environmentService.getEnvironmentVariables(environment.id); res.status(200).send({ - account: { ...environment, env_variables: environmentVariables, host: getBaseUrl(), uuid: account.uuid, email: user.email } + account: { ...environment, env_variables: environmentVariables, host: baseUrl, uuid: account.uuid, email: user.email } }); } catch (err) { next(err); diff --git a/packages/server/lib/controllers/onboarding.controller.ts b/packages/server/lib/controllers/onboarding.controller.ts index f437a5f2a4..31bc670b0c 100644 --- a/packages/server/lib/controllers/onboarding.controller.ts +++ b/packages/server/lib/controllers/onboarding.controller.ts @@ -26,13 +26,15 @@ import { createActivityLog, LogActionEnum, isErr, - logger, analytics, AnalyticsTypes } from '@nangohq/shared'; import type { CustomerFacingDataRecord, IncomingPreBuiltFlowConfig } from '@nangohq/shared'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; import { getUserAccountAndEnvironmentFromSession } from '../utils/utils.js'; +const logger = getLogger('Server.Onboarding'); + interface OnboardingStatus { id: number; progress: number; diff --git a/packages/server/lib/controllers/ratelimit.middleware.ts b/packages/server/lib/controllers/ratelimit.middleware.ts index a9d9cfe251..d56a25b889 100644 --- a/packages/server/lib/controllers/ratelimit.middleware.ts +++ b/packages/server/lib/controllers/ratelimit.middleware.ts @@ -2,7 +2,10 @@ import type { Request, Response, NextFunction } from 'express'; import { createClient } from 'redis'; import type { RateLimiterRes } from 'rate-limiter-flexible'; import { RateLimiterRedis, RateLimiterMemory } from 'rate-limiter-flexible'; -import { getAccount, getRedisUrl, logger } from '@nangohq/shared'; +import { getAccount, getRedisUrl } from '@nangohq/shared'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; + +const logger = getLogger('RateLimiter'); const rateLimiter = await (async () => { const opts = { diff --git a/packages/server/lib/controllers/user.controller.ts b/packages/server/lib/controllers/user.controller.ts index 9d7679b70e..51dbcd0f3f 100644 --- a/packages/server/lib/controllers/user.controller.ts +++ b/packages/server/lib/controllers/user.controller.ts @@ -1,7 +1,8 @@ import { getUserAccountAndEnvironmentFromSession } from '../utils/utils.js'; import type { Request, Response, NextFunction } from 'express'; import EmailClient from '../clients/email.client.js'; -import { errorManager, userService, getBaseUrl, isCloud, isEnterprise } from '@nangohq/shared'; +import { isCloud, isEnterprise, baseUrl } from '@nangohq/utils/dist/environment/detection.js'; +import { errorManager, userService } from '@nangohq/shared'; export interface GetUser { user: { @@ -108,7 +109,7 @@ class UserController { if (!invited) { throw new Error('Failed to invite user.'); } - if (isCloud() || isEnterprise()) { + if (isCloud || isEnterprise) { const emailClient = EmailClient.getInstance(); emailClient.send( invited.email, @@ -118,7 +119,7 @@ class UserController {

You are invited to join the ${account.name} account on Nango.

-

Join this account by clicking here and completing your signup.

+

Join this account by clicking here and completing your signup.

Questions or issues? We are happy to help on the Slack community!

diff --git a/packages/server/lib/jobs/index.ts b/packages/server/lib/jobs/index.ts index 3283d3a8c3..f5b1f28b23 100644 --- a/packages/server/lib/jobs/index.ts +++ b/packages/server/lib/jobs/index.ts @@ -1,7 +1,8 @@ -import { isCloud, encryptionManager } from '@nangohq/shared'; +import { isCloud } from '@nangohq/utils/dist/environment/detection.js'; +import { encryptionManager } from '@nangohq/shared'; export async function encryptDataRecords(): Promise { - if (isCloud()) { + if (isCloud) { await encryptionManager.encryptAllDataRecords(); } } diff --git a/packages/server/lib/server.ts b/packages/server/lib/server.ts index 43287c1110..8927d9ede5 100644 --- a/packages/server/lib/server.ts +++ b/packages/server/lib/server.ts @@ -33,26 +33,17 @@ import passport from 'passport'; import environmentController from './controllers/environment.controller.js'; import accountController from './controllers/account.controller.js'; import type { Response, Request } from 'express'; -import Logger from './utils/logger.js'; -import { - getGlobalOAuthCallbackUrl, - environmentService, - getPort, - AUTH_ENABLED, - MANAGED_AUTH_ENABLED, - isCloud, - isEnterprise, - isBasicAuthEnabled, - errorManager, - getWebsocketsPath, - packageJsonFile -} from '@nangohq/shared'; +import { isCloud, isEnterprise, AUTH_ENABLED, MANAGED_AUTH_ENABLED, isBasicAuthEnabled } from '@nangohq/utils/dist/environment/detection.js'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; +import { getGlobalOAuthCallbackUrl, environmentService, getPort, errorManager, getWebsocketsPath, packageJsonFile } from '@nangohq/shared'; import oAuthSessionService from './services/oauth-session.service.js'; import migrate from './utils/migrate.js'; import tracer from 'dd-trace'; const { NANGO_MIGRATE_AT_START = 'true' } = process.env; +const logger = getLogger('Server'); + const app = express(); // Auth @@ -61,9 +52,9 @@ setupAuth(app); const apiAuth = [authMiddleware.secretKeyAuth.bind(authMiddleware), rateLimiterMiddleware]; const apiPublicAuth = [authMiddleware.publicKeyAuth.bind(authMiddleware), rateLimiterMiddleware]; const webAuth = - isCloud() || isEnterprise() + isCloud || isEnterprise ? [passport.authenticate('session'), authMiddleware.sessionAuth.bind(authMiddleware), rateLimiterMiddleware] - : isBasicAuthEnabled() + : isBasicAuthEnabled ? [passport.authenticate('basic', { session: false }), authMiddleware.basicAuth.bind(authMiddleware), rateLimiterMiddleware] : [authMiddleware.noAuth.bind(authMiddleware), rateLimiterMiddleware]; @@ -88,7 +79,7 @@ const upload = multer({ storage: multer.memoryStorage() }); if (NANGO_MIGRATE_AT_START === 'true') { await migrate(); } else { - Logger.info('Not migrating database'); + logger.info('Not migrating database'); } await environmentService.cacheSecrets(); @@ -226,7 +217,7 @@ app.route('/api/v1/onboarding/sync-status').post(webAuth, onboardingController.c app.route('/api/v1/onboarding/action').post(webAuth, onboardingController.writeGithubIssue.bind(onboardingController)); // Hosted signin -if (!isCloud() && !isEnterprise()) { +if (!isCloud && !isEnterprise) { app.route('/api/v1/basic').get(webAuth, (_: Request, res: Response) => { res.status(200).send(); }); @@ -254,8 +245,8 @@ wss.on('connection', async (ws: WebSocket) => { const port = getPort(); server.listen(port, () => { - Logger.info(`✅ Nango Server with version ${packageJsonFile().version} is listening on port ${port}. OAuth callback URL: ${getGlobalOAuthCallbackUrl()}`); - Logger.info( + logger.info(`✅ Nango Server with version ${packageJsonFile().version} is listening on port ${port}. OAuth callback URL: ${getGlobalOAuthCallbackUrl()}`); + logger.info( `\n | | | | | | |\n | | | | | | |\n | | | | | | | \n \\ | / \\ | / \\ | / \\ | / \\ | / \\ | / \\ | /\n \\|/ \\|/ \\|/ \\|/ \\|/ \\|/ \\|/\n------------------------------------------\nLaunch Nango at http://localhost:${port}\n------------------------------------------\n /|\\ /|\\ /|\\ /|\\ /|\\ /|\\ /|\\\n / | \\ / | \\ / | \\ / | \\ / | \\ / | \\ / | \\\n | | | | | | |\n | | | | | | |\n | | | | | | |` ); }); diff --git a/packages/server/lib/utils/logger.ts b/packages/server/lib/utils/logger.ts deleted file mode 100644 index e50ede0931..0000000000 --- a/packages/server/lib/utils/logger.ts +++ /dev/null @@ -1,20 +0,0 @@ -import winston from 'winston'; -import type { Logger } from 'winston'; - -const nangoLogFormat = winston.format.printf((info) => { - return `${info['timestamp']} [${info['level'].toUpperCase()}] ${info['message']}`; -}); - -class NangoLogger { - logger: Logger; - - constructor() { - this.logger = winston.createLogger({ - levels: winston.config.syslog.levels, - format: winston.format.combine(winston.format.timestamp(), nangoLogFormat), - transports: [new winston.transports.Console({ level: process.env['LOG_LEVEL'] || 'info' })] - }); - } -} - -export default new NangoLogger().logger; diff --git a/packages/server/lib/utils/migrate.ts b/packages/server/lib/utils/migrate.ts index 51f86fb6be..599f4258e3 100644 --- a/packages/server/lib/utils/migrate.ts +++ b/packages/server/lib/utils/migrate.ts @@ -1,11 +1,14 @@ -import Logger from '../utils/logger.js'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; + +const logger = getLogger('Server'); + import { encryptionManager, KnexDatabase } from '@nangohq/shared'; export default async function migrate() { const db = new KnexDatabase({ timeoutMs: 0 }); // Disable timeout for migrations - Logger.info('Migrating database ...'); + logger.info('Migrating database ...'); await db.knex.raw(`CREATE SCHEMA IF NOT EXISTS ${db.schema()}`); await db.migrate(process.env['NANGO_DB_MIGRATION_FOLDER'] || '../shared/lib/db/migrations'); await encryptionManager.encryptDatabaseIfNeeded(); - Logger.info('✅ Migrated database'); + logger.info('✅ Migrated database'); } diff --git a/packages/server/lib/utils/utils.ts b/packages/server/lib/utils/utils.ts index 0e539c2137..00a5faf55a 100644 --- a/packages/server/lib/utils/utils.ts +++ b/packages/server/lib/utils/utils.ts @@ -2,10 +2,12 @@ import { fileURLToPath } from 'url'; import path from 'path'; import type { Request } from 'express'; import type { User, Environment, Account, Template as ProviderTemplate, ServiceResponse } from '@nangohq/shared'; -import logger from './logger.js'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; import type { WSErr } from './web-socket-error.js'; import { NangoError, userService, environmentService, interpolateString } from '@nangohq/shared'; +const logger = getLogger('Server.Utils'); + export async function getUserAccountAndEnvironmentFromSession( req: Request ): Promise> { diff --git a/packages/server/nodemon.json b/packages/server/nodemon.json index 46c44855d5..5292530ee5 100644 --- a/packages/server/nodemon.json +++ b/packages/server/nodemon.json @@ -1,6 +1,6 @@ { - "watch": ["lib", "../shared/lib", "../../.env", "../shared/providers.yaml"], - "ext": "ts,json", - "ignore": ["src/**/*.spec.ts"], - "exec": "tsx -r dotenv/config lib/server.ts Dotenv_config_path=./../../.env" + "watch": ["lib", "../shared/dist", "../utils/dist", "../../.env", "../shared/providers.yaml"], + "ext": "ts,json", + "ignore": ["src/**/*.spec.ts"], + "exec": "tsx -r dotenv/config lib/server.ts Dotenv_config_path=./../../.env" } diff --git a/packages/server/package.json b/packages/server/package.json index 9b7a89a051..8c629ad7bb 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -24,6 +24,7 @@ "dependencies": { "@hapi/boom": "^10.0.1", "@nangohq/shared": "^0.39.8", + "@nangohq/utils": "file:../utils", "@workos-inc/node": "^6.2.0", "axios": "^1.3.4", "body-parser": "1.20.2", @@ -52,8 +53,6 @@ "redis": "^4.6.11", "simple-oauth2": "^5.0.0", "uuid": "^9.0.0", - "winston": "^3.8.2", - "winston-daily-rotate-file": "^4.7.1", "ws": "^8.12.1" }, "devDependencies": { diff --git a/packages/server/tsconfig.json b/packages/server/tsconfig.json index 8b8f6a40f3..e16701dc92 100644 --- a/packages/server/tsconfig.json +++ b/packages/server/tsconfig.json @@ -10,10 +10,10 @@ }, { "path": "../node-client" + }, + { + "path": "../utils" } ], - "include": [ - "lib/**/*", - "../shared/lib/express.d.ts", - ] + "include": ["lib/**/*", "../shared/lib/express.d.ts"] } diff --git a/packages/shared/lib/clients/sync.client.ts b/packages/shared/lib/clients/sync.client.ts index fd600e4bf5..c2e92dd08b 100644 --- a/packages/shared/lib/clients/sync.client.ts +++ b/packages/shared/lib/clients/sync.client.ts @@ -30,8 +30,11 @@ import telemetry, { LogTypes, MetricTypes } from '../utils/telemetry.js'; import errorManager, { ErrorSourceEnum } from '../utils/error.manager.js'; import { NangoError } from '../utils/error.js'; import type { RunnerOutput } from '../models/Runner.js'; -import { isTest, isProd } from '../utils/utils.js'; +import { isTest, isProd } from '@nangohq/utils/dist/environment/detection.js'; import { isErr, resultOk, type Result, resultErr } from '../utils/result.js'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; + +const logger = getLogger('Sync.Client'); const generateActionWorkflowId = (actionName: string, connectionId: string) => `${SYNC_TASK_QUEUE}.ACTION:${actionName}.${connectionId}.${Date.now()}`; const generateWebhookWorkflowId = (parentSyncName: string, webhookName: string, connectionId: string) => @@ -61,14 +64,14 @@ class SyncClient { } private static async create(): Promise { - if (isTest()) { + if (isTest) { return new SyncClient(true as any); } try { const connection = await Connection.connect({ address: process.env['TEMPORAL_ADDRESS'] || 'localhost:7233', - tls: isProd() + tls: isProd ? { clientCertPair: { crt: await fs.readFile(`/etc/secrets/${namespace}.crt`), @@ -99,7 +102,7 @@ class SyncClient { const nangoConnection = (await connectionService.getConnectionById(nangoConnectionId)) as NangoConnection; const nangoConfig = await getSyncConfig(nangoConnection); if (!nangoConfig) { - console.log( + logger.error( 'Failed to load the Nango config - will not start any syncs! If you expect to see a sync make sure you used the nango cli deploy command' ); return; @@ -108,12 +111,12 @@ class SyncClient { const providerConfigKey = nangoConnection?.provider_config_key; if (!integrations[providerConfigKey]) { - console.log(`No syncs registered for provider ${providerConfigKey} - will not start any syncs!`); + logger.info(`No syncs registered for provider ${providerConfigKey} - will not start any syncs!`); return; } if (!this.client) { - console.log('Failed to get a Temporal client - will not start any syncs!'); + logger.info('Failed to get a Temporal client - will not start any syncs!'); return; } @@ -160,7 +163,7 @@ class SyncClient { connection_id: nangoConnection.connection_id, provider_config_key: nangoConnection.provider_config_key, provider: syncConfig.provider, - session_id: sync?.id?.toString() as string, + session_id: sync?.id?.toString(), environment_id: nangoConnection.environment_id, operation_name: syncName }); @@ -211,12 +214,12 @@ class SyncClient { }); } - const res = await this.triggerInitialSync({ activityLogId, jobId, nangoConnection, syncId: sync.id!, syncName, debug }); + const res = await this.triggerInitialSync({ activityLogId, jobId, nangoConnection, syncId: sync.id, syncName, debug }); if (!res) { throw new NangoError('failed_to_start_initial_sync'); } } else { - await createSyncJob(sync.id as string, SyncType.INITIAL, SyncStatus.PAUSED, jobId, nangoConnection); + await createSyncJob(sync.id, SyncType.INITIAL, SyncStatus.PAUSED, jobId, nangoConnection); } const { interval, offset } = response; @@ -257,13 +260,7 @@ class SyncClient { await scheduleHandle.pause(); } - await createSyncSchedule( - sync.id as string, - interval, - offset, - syncData.auto_start === false ? ScheduleStatus.PAUSED : ScheduleStatus.RUNNING, - scheduleId - ); + await createSyncSchedule(sync.id, interval, offset, syncData.auto_start === false ? ScheduleStatus.PAUSED : ScheduleStatus.RUNNING, scheduleId); if (scheduleHandle) { await createActivityLogMessageAndEnd({ @@ -816,13 +813,13 @@ class SyncClient { const handle = await this.client?.workflow.start('initialSync', { taskQueue: SYNC_TASK_QUEUE, workflowId: jobId, - args: [{ syncId: syncId, syncJobId: syncJobId.id!, nangoConnection, syncName, debug }] + args: [{ syncId: syncId, syncJobId: syncJobId.id, nangoConnection, syncName, debug }] }); if (!handle) { return false; } - await updateRunId(syncJobId.id as number, handle.firstExecutionRunId); + await updateRunId(syncJobId.id, handle.firstExecutionRunId); return true; } diff --git a/packages/shared/lib/hooks/hooks.ts b/packages/shared/lib/hooks/hooks.ts index 1d93b78eb3..ce78cf23fc 100644 --- a/packages/shared/lib/hooks/hooks.ts +++ b/packages/shared/lib/hooks/hooks.ts @@ -10,7 +10,7 @@ import type { Template as ProviderTemplate } from '../models/Provider.js'; import integrationPostConnectionScript from '../integrations/scripts/connection/connection.manager.js'; import webhookService from '../services/notification/webhook.service.js'; import { SpanTypes } from '../utils/telemetry.js'; -import { isCloud, isLocal, isEnterprise } from '../utils/utils.js'; +import { isCloud, isLocal, isEnterprise } from '@nangohq/utils/dist/environment/detection.js'; import type { Result } from '../utils/result.js'; import { resultOk, resultErr } from '../utils/result.js'; import { NangoError } from '../utils/error.js'; @@ -21,7 +21,7 @@ export const connectionCreated = async ( activityLogId: number | null, options: { initiateSync?: boolean; runPostConnectionScript?: boolean } = { initiateSync: true, runPostConnectionScript: true } ): Promise => { - const hosted = !isCloud() && !isLocal() && !isEnterprise(); + const hosted = !isCloud && !isLocal && !isEnterprise; if (options.initiateSync === true && !hosted) { const syncClient = await SyncClient.getInstance(); diff --git a/packages/shared/lib/index.ts b/packages/shared/lib/index.ts index d9142db748..7f7819cded 100644 --- a/packages/shared/lib/index.ts +++ b/packages/shared/lib/index.ts @@ -19,7 +19,6 @@ import syncOrchestrator from './services/sync/orchestrator.service.js'; import flowService from './services/flow.service.js'; import slackNotificationService from './services/notification/slack.service.js'; import analytics, { AnalyticsTypes } from './utils/analytics.js'; -import logger from './logger/console.js'; import routeWebhook from './integrations/scripts/webhook/webhook.manager.js'; import featureFlags from './utils/featureflags.js'; @@ -82,6 +81,5 @@ export { analytics, AnalyticsTypes, routeWebhook, - logger, featureFlags }; diff --git a/packages/shared/lib/integrations/scripts/webhook/github-app-oauth-webhook-routing.ts b/packages/shared/lib/integrations/scripts/webhook/github-app-oauth-webhook-routing.ts index 3e38619c1e..ebbeb9f1cb 100644 --- a/packages/shared/lib/integrations/scripts/webhook/github-app-oauth-webhook-routing.ts +++ b/packages/shared/lib/integrations/scripts/webhook/github-app-oauth-webhook-routing.ts @@ -4,8 +4,11 @@ import type { Config as ProviderConfig } from '../../../models/Provider.js'; import type { Connection, ConnectionConfig } from '../../../models/Connection.js'; import connectionService from '../../../services/connection.service.js'; import configService from '../../../services/config.service.js'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; import crypto from 'crypto'; +const logger = getLogger('Webhook.GithubAppOauth'); + function validate(integration: ProviderConfig, headerSignature: string, body: any): boolean { const custom = integration.custom as Record; const private_key = custom['private_key']; @@ -27,7 +30,7 @@ export default async function route(nango: Nango, integration: ProviderConfig, h const valid = validate(integration, signature, body); if (!valid) { - console.log('Github App webhook signature invalid. Exiting'); + logger.error('Github App webhook signature invalid. Exiting'); return; } } @@ -50,7 +53,7 @@ async function handleCreateWebhook(integration: ProviderConfig, body: any) { ); if (connections?.length === 0) { - console.log('No connections found for app_id', get(body, 'installation.app_id')); + logger.info('No connections found for app_id', get(body, 'installation.app_id')); return; } else { const installationId = get(body, 'installation.id'); @@ -58,7 +61,7 @@ async function handleCreateWebhook(integration: ProviderConfig, body: any) { // if there is no matching connection or if the connection config already has an installation_id, exit if (!connection || connection.connection_config['installation_id']) { - console.log('no connection or existing installation_id'); + logger.info('no connection or existing installation_id'); return; } diff --git a/packages/shared/lib/integrations/scripts/webhook/github-app-webhook-routing.ts b/packages/shared/lib/integrations/scripts/webhook/github-app-webhook-routing.ts index 93c390d2fe..2f478f7f46 100644 --- a/packages/shared/lib/integrations/scripts/webhook/github-app-webhook-routing.ts +++ b/packages/shared/lib/integrations/scripts/webhook/github-app-webhook-routing.ts @@ -1,7 +1,11 @@ import type { InternalNango as Nango } from './internal-nango.js'; import type { Config as ProviderConfig } from '../../../models/Provider.js'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; + import crypto from 'crypto'; +const logger = getLogger('Webook.GithubApp'); + function validate(integration: ProviderConfig, headerSignature: string, body: any): boolean { const hash = `${integration.oauth_client_id}${integration.oauth_client_secret}${integration.app_link}`; const secret = crypto.createHash('sha256').update(hash).digest('hex'); @@ -18,11 +22,11 @@ export default async function route(nango: Nango, integration: ProviderConfig, h const signature = headers['x-hub-signature-256']; if (signature) { - console.log('Signature found, verifying...'); + logger.info('Signature found, verifying...'); const valid = validate(integration, signature, body); if (!valid) { - console.log('Github App webhook signature invalid'); + logger.error('Github App webhook signature invalid'); return; } } diff --git a/packages/shared/lib/integrations/scripts/webhook/hubspot-webhook-routing.ts b/packages/shared/lib/integrations/scripts/webhook/hubspot-webhook-routing.ts index 5c2c5be0be..0c7df34515 100644 --- a/packages/shared/lib/integrations/scripts/webhook/hubspot-webhook-routing.ts +++ b/packages/shared/lib/integrations/scripts/webhook/hubspot-webhook-routing.ts @@ -1,8 +1,10 @@ import type { InternalNango as Nango } from './internal-nango.js'; import type { Config as ProviderConfig } from '../../../models/Provider.js'; -import logger from '../../../logger/console.js'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; import crypto from 'crypto'; +const logger = getLogger('Webhook.Hubspot'); + export function validate(integration: ProviderConfig, headers: Record, body: any): boolean { const signature = headers['x-hubspot-signature']; @@ -20,7 +22,7 @@ export default async function route(nango: Nango, integration: ProviderConfig, h const valid = validate(integration, headers, body); if (!valid) { - logger.error('Hubspot webhook signature invalid'); + logger.error('webhook signature invalid'); return; } diff --git a/packages/shared/lib/integrations/scripts/webhook/linear-webhook-routing.ts b/packages/shared/lib/integrations/scripts/webhook/linear-webhook-routing.ts index 3bf4f3bb85..c0b39b8359 100644 --- a/packages/shared/lib/integrations/scripts/webhook/linear-webhook-routing.ts +++ b/packages/shared/lib/integrations/scripts/webhook/linear-webhook-routing.ts @@ -1,9 +1,11 @@ import crypto from 'node:crypto'; import type { Config as ProviderConfig } from '../../../models/Provider.js'; -import logger from '../../../logger/console.js'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; import type { WebhookHandler } from './types.js'; +const logger = getLogger('Webhook.Linear'); + interface LinearBody { action: string; data: Record; @@ -23,15 +25,15 @@ function validate(integration: ProviderConfig, headerSignature: string, rawBody: const route: WebhookHandler = async (nango, integration, headers, body, rawBody) => { const signature = headers['linear-signature']; - logger.info('[webhook/linear] received', { configId: integration.id }); + logger.info('received', { configId: integration.id }); if (!validate(integration, signature, rawBody)) { - logger.error('[webhook/linear] invalid signature', { configId: integration.id }); + logger.error('invalid signature', { configId: integration.id }); return; } const parsedBody = body as LinearBody; - logger.info(`[webhook/linear] valid ${parsedBody.type}`, { configId: integration.id }); + logger.info(`valid ${parsedBody.type}`, { configId: integration.id }); const response = await nango.executeScriptForWebhooks(integration, parsedBody, 'type', 'organizationId', 'organizationId'); diff --git a/packages/shared/lib/integrations/scripts/webhook/webhook.manager.ts b/packages/shared/lib/integrations/scripts/webhook/webhook.manager.ts index d42b24f4f6..8faaa3dd80 100644 --- a/packages/shared/lib/integrations/scripts/webhook/webhook.manager.ts +++ b/packages/shared/lib/integrations/scripts/webhook/webhook.manager.ts @@ -4,14 +4,16 @@ import webhookService from '../../../services/notification/webhook.service.js'; import telemetry, { LogTypes } from '../../../utils/telemetry.js'; import { LogActionEnum } from '../../../models/Activity.js'; import { internalNango } from './internal-nango.js'; -import logger from '../../../logger/console.js'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; + +const logger = getLogger('Webhook.Manager'); import * as webhookHandlers from './index.js'; import type { WebhookHandlersMap, WebhookResponse } from './types.js'; const handlers: WebhookHandlersMap = webhookHandlers as unknown as WebhookHandlersMap; -async function execute(environmentUuid: string, providerConfigKey: string, headers: Record, body: any, rawBody: string): Promise { +async function execute(environmentUuid: string, providerConfigKey: string, headers: Record, body: any, rawBody: string): Promise { if (!body) { return; } @@ -34,7 +36,7 @@ async function execute(environmentUuid: string, providerConfigKey: string, heade res = await handler(internalNango, integration, headers, body, rawBody); } } catch (e) { - logger.error(`[webhook/manager] error processing incoming webhook for ${providerConfigKey} - `, e); + logger.error(`error processing incoming webhook for ${providerConfigKey} - `, e); await telemetry.log(LogTypes.INCOMING_WEBHOOK_FAILED_PROCESSING, 'Incoming webhook failed processing', LogActionEnum.WEBHOOK, { accountId: String(accountId), diff --git a/packages/shared/lib/logger/console.ts b/packages/shared/lib/logger/console.ts deleted file mode 100644 index e50ede0931..0000000000 --- a/packages/shared/lib/logger/console.ts +++ /dev/null @@ -1,20 +0,0 @@ -import winston from 'winston'; -import type { Logger } from 'winston'; - -const nangoLogFormat = winston.format.printf((info) => { - return `${info['timestamp']} [${info['level'].toUpperCase()}] ${info['message']}`; -}); - -class NangoLogger { - logger: Logger; - - constructor() { - this.logger = winston.createLogger({ - levels: winston.config.syslog.levels, - format: winston.format.combine(winston.format.timestamp(), nangoLogFormat), - transports: [new winston.transports.Console({ level: process.env['LOG_LEVEL'] || 'info' })] - }); - } -} - -export default new NangoLogger().logger; diff --git a/packages/shared/lib/sdk/sync.ts b/packages/shared/lib/sdk/sync.ts index 65ee5e67a6..dd37623e82 100644 --- a/packages/shared/lib/sdk/sync.ts +++ b/packages/shared/lib/sdk/sync.ts @@ -6,9 +6,11 @@ import axios from 'axios'; import { getPersistAPIUrl, safeStringify } from '../utils/utils.js'; import type { IntegrationWithCreds } from '@nangohq/node/lib/types.js'; import type { UserProvidedProxyConfiguration } from '../models/Proxy.js'; -import logger from '../logger/console.js'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; import telemetry, { MetricTypes } from '../utils/telemetry.js'; +const logger = getLogger('SDK'); + /* * * NOTICE!! diff --git a/packages/shared/lib/services/activity/activity.service.ts b/packages/shared/lib/services/activity/activity.service.ts index d472b2e242..a845f59945 100644 --- a/packages/shared/lib/services/activity/activity.service.ts +++ b/packages/shared/lib/services/activity/activity.service.ts @@ -3,7 +3,9 @@ import type { ActivityLog, ActivityLogMessage, LogAction } from '../../models/Ac import { LogActionEnum } from '../../models/Activity.js'; import errorManager, { ErrorSourceEnum } from '../../utils/error.manager.js'; -import logger from '../../logger/console.js'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; + +const logger = getLogger('Activity'); const activityLogTableName = '_nango_activity_logs'; const activityLogMessageTableName = '_nango_activity_log_messages'; diff --git a/packages/shared/lib/services/config.service.ts b/packages/shared/lib/services/config.service.ts index ad0163069e..6a1abc09f8 100644 --- a/packages/shared/lib/services/config.service.ts +++ b/packages/shared/lib/services/config.service.ts @@ -4,7 +4,8 @@ import db from '../db/database.js'; import yaml from 'js-yaml'; import fs from 'fs'; import path from 'path'; -import { isCloud, dirname } from '../utils/utils.js'; +import { isCloud } from '@nangohq/utils/dist/environment/detection.js'; +import { dirname } from '../utils/utils.js'; import { NangoError } from '../utils/error.js'; import encryptionManager from '../utils/encryption.manager.js'; import syncOrchestrator from './sync/orchestrator.service.js'; @@ -180,7 +181,7 @@ class ConfigService { await syncOrchestrator.deleteSyncsByProviderConfig(environment_id, providerConfigKey); - if (isCloud()) { + if (isCloud) { const config = await this.getProviderConfig(providerConfigKey, environment_id); await deleteSyncFilesForConfig(config?.id as number, environment_id); } diff --git a/packages/shared/lib/services/connection.service.ts b/packages/shared/lib/services/connection.service.ts index 6193ec92e2..a8d5ab20c0 100644 --- a/packages/shared/lib/services/connection.service.ts +++ b/packages/shared/lib/services/connection.service.ts @@ -27,6 +27,7 @@ import { getFreshOAuth2Credentials } from '../clients/oauth2.client.js'; import { NangoError } from '../utils/error.js'; import type { Metadata, ConnectionConfig, Connection, StoredConnection, BaseConnection, NangoConnection } from '../models/Connection.js'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; import type { ServiceResponse } from '../models/Generic.js'; import encryptionManager from '../utils/encryption.manager.js'; import telemetry, { LogTypes } from '../utils/telemetry.js'; @@ -47,6 +48,8 @@ import { InMemoryKVStore } from '../utils/kvstore/InMemoryStore.js'; import { RedisKVStore } from '../utils/kvstore/RedisStore.js'; import type { KVStore } from '../utils/kvstore/KVStore.js'; +const logger = getLogger('Connection'); + type KeyValuePairs = Record; class ConnectionService { @@ -820,7 +823,7 @@ class ConnectionService { const { success, error, response: credentials } = await this.getAppCredentials(template, integration, connectionConfig); if (!success || !credentials) { - console.log(error); + logger.error(error); return; } diff --git a/packages/shared/lib/services/environment.service.ts b/packages/shared/lib/services/environment.service.ts index ffbf4de60e..6b07804eab 100644 --- a/packages/shared/lib/services/environment.service.ts +++ b/packages/shared/lib/services/environment.service.ts @@ -7,7 +7,7 @@ import type { Account } from '../models/Admin.js'; import { LogActionEnum } from '../models/Activity.js'; import accountService from './account.service.js'; import errorManager, { ErrorSourceEnum } from '../utils/error.manager.js'; -import { isCloud } from '../utils/utils.js'; +import { isCloud } from '@nangohq/utils/dist/environment/detection.js'; const TABLE = '_nango_environments'; @@ -82,7 +82,7 @@ class EnvironmentService { } async getAccountIdAndEnvironmentIdBySecretKey(secretKey: string): Promise<{ accountId: number; environmentId: number } | null> { - if (!isCloud()) { + if (!isCloud) { const environmentVariables = Object.keys(process.env).filter((key) => key.startsWith('NANGO_SECRET_KEY_')) || []; if (environmentVariables.length > 0) { for (const environmentVariable of environmentVariables) { @@ -160,7 +160,7 @@ class EnvironmentService { } async getAccountIdAndEnvironmentIdByPublicKey(publicKey: string): Promise<{ accountId: number; environmentId: number } | null> { - if (!isCloud()) { + if (!isCloud) { const environmentVariables = Object.keys(process.env).filter((key) => key.startsWith('NANGO_PUBLIC_KEY_')) || []; if (environmentVariables.length > 0) { for (const environmentVariable of environmentVariables) { diff --git a/packages/shared/lib/services/file/remote.service.ts b/packages/shared/lib/services/file/remote.service.ts index 0e4c8d24a6..1c4575f515 100644 --- a/packages/shared/lib/services/file/remote.service.ts +++ b/packages/shared/lib/services/file/remote.service.ts @@ -3,7 +3,7 @@ import type { GetObjectCommandOutput } from '@aws-sdk/client-s3'; import { CopyObjectCommand, PutObjectCommand, GetObjectCommand, S3Client, DeleteObjectsCommand } from '@aws-sdk/client-s3'; import { Readable } from 'stream'; import archiver from 'archiver'; -import { isCloud, isEnterprise, isLocal } from '../../utils/utils.js'; +import { isCloud, isEnterprise, isLocal } from '@nangohq/utils/dist/environment/detection.js'; import { NangoError } from '../../utils/error.js'; import errorManager, { ErrorSourceEnum } from '../../utils/error.manager.js'; import { LogActionEnum } from '../../models/Activity.js'; @@ -12,9 +12,9 @@ import { nangoConfigFile } from '../nango-config.service.js'; import localFileService from './local.service.js'; let client: S3Client | null = null; -let useS3 = !isLocal(); +let useS3 = !isLocal; -if (isEnterprise()) { +if (isEnterprise) { useS3 = Boolean(process.env['AWS_REGION'] && process.env['AWS_BUCKET_NAME']); client = new S3Client({ region: (process.env['AWS_REGION'] as string) || 'us-west-2' @@ -34,7 +34,7 @@ class RemoteFileService { publicRoute = 'integration-templates'; async upload(fileContents: string, fileName: string, environmentId: number): Promise { - if (isEnterprise() && !useS3) { + if (isEnterprise && !useS3) { const fileNameOnly = fileName.split('/').slice(-1)[0]; const versionStrippedFileName = fileNameOnly?.replace(/-v[\d.]+(?=\.js$)/, ''); localFileService.putIntegrationFile(versionStrippedFileName as string, fileContents, fileName.endsWith('.js')); @@ -86,7 +86,7 @@ class RemoteFileService { try { const s3FilePath = `${this.publicRoute}/${integrationName}/${fileName}`; - if (isCloud()) { + if (isCloud) { await client?.send( new CopyObjectCommand({ Bucket: this.bucket, @@ -167,14 +167,14 @@ class RemoteFileService { } else { return { success: false, error: null, response: null }; } - } catch (e) { + } catch { const error = new NangoError('integration_file_not_found'); return { success: false, error, response: null }; } } async deleteFiles(fileNames: string[]): Promise { - if (!isCloud() && !useS3) { + if (!isCloud && !useS3) { return; } @@ -210,7 +210,7 @@ class RemoteFileService { nangoConfigId: number, file_location: string ): Promise { - if (!isCloud() && !useS3) { + if (!isCloud && !useS3) { return localFileService.zipAndSendFiles(res, integrationName, accountId, environmentId, nangoConfigId); } else { const nangoConfigLocation = file_location.split('/').slice(0, -3).join('/'); diff --git a/packages/shared/lib/services/notification/slack.service.ts b/packages/shared/lib/services/notification/slack.service.ts index 4187868278..1631124a28 100644 --- a/packages/shared/lib/services/notification/slack.service.ts +++ b/packages/shared/lib/services/notification/slack.service.ts @@ -7,7 +7,7 @@ import environmentService from '../environment.service.js'; import type { LogLevel } from '../../models/Activity.js'; import { LogActionEnum } from '../../models/Activity.js'; import { updateSuccess as updateSuccessActivityLog, createActivityLogMessage, createActivityLog } from '../activity/activity.service.js'; -import { getBasePublicUrl } from '../../utils/utils.js'; +import { basePublicUrl } from '@nangohq/utils/dist/environment/detection.js'; import connectionService from '../connection.service.js'; import accountService from '../account.service.js'; import SyncClient from '../../clients/sync.client.js'; @@ -262,7 +262,7 @@ class SlackService { const date = new Date(); const dateString = date.toISOString().split('T')[0]; const payload: NotificationPayload = { - content: `*${syncName}* (${flowType.toLowerCase()}) is failing for ${count} ${connection}. Read <${getBasePublicUrl()}/${envName}/activity?activity_log_id=${originalActivityLogId}&script=${syncName}&date=${dateString}|logs>.`, + content: `*${syncName}* (${flowType.toLowerCase()}) is failing for ${count} ${connection}. Read <${basePublicUrl}/${envName}/activity?activity_log_id=${originalActivityLogId}&script=${syncName}&date=${dateString}|logs>.`, status: 'open', providerConfigKey: nangoConnection.provider_config_key, provider @@ -344,11 +344,11 @@ class SlackService { let payloadContent = ''; if (connectionCount === 0) { - payloadContent = `[Resolved] *${syncName}* (${syncType.toLowerCase()}) failed. Read <${getBasePublicUrl()}/${envName}/activity?activity_log_id=${originalActivityLogId}|logs>.`; + payloadContent = `[Resolved] *${syncName}* (${syncType.toLowerCase()}) failed. Read <${basePublicUrl}/${envName}/activity?activity_log_id=${originalActivityLogId}|logs>.`; } else { const count = connectionCount; const connection = count === 1 ? 'connection' : 'connections'; - payloadContent = `*${syncName}* (${syncType.toLowerCase()}) is failing for ${count} ${connection}. Read <${getBasePublicUrl()}/${envName}/activity?activity_log_id=${originalActivityLogId}|logs>.`; + payloadContent = `*${syncName}* (${syncType.toLowerCase()}) is failing for ${count} ${connection}. Read <${basePublicUrl}/${envName}/activity?activity_log_id=${originalActivityLogId}|logs>.`; } const payload: NotificationPayload = { diff --git a/packages/shared/lib/services/proxy.service.ts b/packages/shared/lib/services/proxy.service.ts index d7e597f3d0..2e6c8114f5 100644 --- a/packages/shared/lib/services/proxy.service.ts +++ b/packages/shared/lib/services/proxy.service.ts @@ -12,7 +12,9 @@ import { interpolateIfNeeded, connectionCopyWithParsedConnectionConfig, mapProxy import { NangoError } from '../utils/error.js'; import type { ActivityLogMessage } from '../models/Activity.js'; import type { Template as ProviderTemplate } from '../models/Provider.js'; -import { logger } from '../index.js'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; + +const logger = getLogger('Proxy'); interface Activities { activityLogs: ActivityLogMessage[]; diff --git a/packages/shared/lib/services/sync/config/config.service.ts b/packages/shared/lib/services/sync/config/config.service.ts index 4ee6720532..84e6961ba9 100644 --- a/packages/shared/lib/services/sync/config/config.service.ts +++ b/packages/shared/lib/services/sync/config/config.service.ts @@ -1,6 +1,6 @@ import semver from 'semver'; import db, { schema, dbNamespace } from '../../../db/database.js'; -import logger from '../../../logger/console.js'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; import configService from '../../config.service.js'; import remoteFileService from '../../file/remote.service.js'; import { LogActionEnum } from '../../../models/Activity.js'; @@ -12,6 +12,8 @@ import type { Config as ProviderConfig } from '../../../models/Provider.js'; import type { NangoConfig, NangoConfigV1, NangoV2Integration, StandardNangoConfig, NangoIntegrationDataV2 } from '../../../models/NangoConfig.js'; import errorManager, { ErrorSourceEnum } from '../../../utils/error.manager.js'; +const logger = getLogger('Sync.Config'); + const TABLE = dbNamespace + 'sync_configs'; type extendedSyncConfig = SyncConfig & { provider: string; unique_key: string; endpoints_object: { method: string; path: string }[] }; diff --git a/packages/shared/lib/services/sync/config/deploy.service.ts b/packages/shared/lib/services/sync/config/deploy.service.ts index e3060a07bc..b8f4909d52 100644 --- a/packages/shared/lib/services/sync/config/deploy.service.ts +++ b/packages/shared/lib/services/sync/config/deploy.service.ts @@ -27,7 +27,7 @@ import type { import { SyncConfigType } from '../../../models/Sync.js'; import { NangoError } from '../../../utils/error.js'; import telemetry, { LogTypes } from '../../../utils/telemetry.js'; -import { getEnv } from '../../../utils/utils.js'; +import { env } from '@nangohq/utils/dist/environment/detection.js'; import { nangoConfigFile } from '../../nango-config.service.js'; import { getSyncAndActionConfigByParams, increment, getSyncAndActionConfigsBySyncNameAndConfigId } from './config.service.js'; @@ -75,7 +75,6 @@ export async function deploy( }); const activityLogId = await createActivityLog(log); - const env = getEnv(); if (nangoYamlBody) { await remoteFileService.upload(nangoYamlBody, `${env}/account/${accountId}/environment/${environment_id}/${nangoConfigFile}`, environment_id); @@ -247,8 +246,6 @@ export async function deployPreBuilt( let nango_config_id: number; let provider_config_key: string; - const env = getEnv(); - if (nangoYamlBody) { await remoteFileService.upload(nangoYamlBody, `${env}/account/${accountId}/environment/${environment_id}/${nangoConfigFile}`, environment_id); } else { @@ -311,7 +308,7 @@ export async function deployPreBuilt( const syncsConfig = await getSyncsByProviderConfigAndSyncName(environment_id, provider_config_key, sync_name); for (const syncConfig of syncsConfig) { const { success, error } = await updateSyncScheduleFrequency( - syncConfig.id as string, + syncConfig.id, syncConfig?.frequency || runs, sync_name, environment_id, @@ -624,7 +621,7 @@ async function compileDeployInfo( for (const syncConfig of syncsConfig) { const { success, error } = await updateSyncScheduleFrequency( - syncConfig.id as string, + syncConfig.id, syncConfig?.frequency || runs, syncName, environment_id, diff --git a/packages/shared/lib/services/sync/data/data.service.ts b/packages/shared/lib/services/sync/data/data.service.ts index fdc4366417..be1941fc87 100644 --- a/packages/shared/lib/services/sync/data/data.service.ts +++ b/packages/shared/lib/services/sync/data/data.service.ts @@ -4,7 +4,9 @@ import { createActivityLogMessage } from '../../activity/activity.service.js'; import type { UpsertResponse } from '../../../models/Data.js'; import type { DataRecord } from '../../../models/Sync.js'; import encryptionManager from '../../../utils/encryption.manager.js'; -import { logger } from '../../../index.js'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; + +const logger = getLogger('Sync.Data'); const RECORD_UNIQUE_KEY = 'external_id'; const RECORDS_TABLE = '_nango_sync_data_records'; diff --git a/packages/shared/lib/services/sync/run.service.ts b/packages/shared/lib/services/sync/run.service.ts index 7e9db00b83..0cb69f652c 100644 --- a/packages/shared/lib/services/sync/run.service.ts +++ b/packages/shared/lib/services/sync/run.service.ts @@ -12,7 +12,8 @@ import { getLastSyncDate, setLastSyncDate } from './sync.service.js'; import environmentService from '../environment.service.js'; import slackNotificationService from '../notification/slack.service.js'; import webhookService from '../notification/webhook.service.js'; -import { isCloud, integrationFilesAreRemote, getApiUrl, isJsOrTsType } from '../../utils/utils.js'; +import { integrationFilesAreRemote, isCloud } from '@nangohq/utils/dist/environment/detection.js'; +import { getApiUrl, isJsOrTsType } from '../../utils/utils.js'; import errorManager, { ErrorSourceEnum } from '../../utils/error.manager.js'; import { NangoError } from '../../utils/error.js'; import telemetry, { LogTypes, MetricTypes } from '../../utils/telemetry.js'; @@ -228,7 +229,7 @@ export default class SyncRun { } } - if (!isCloud() && !integrationFilesAreRemote() && !isPublic) { + if (!isCloud && !integrationFilesAreRemote && !isPublic) { const { path: integrationFilePath, result: integrationFileResult } = localFileService.checkForIntegrationDistFile( this.syncName, this.loadLocation diff --git a/packages/shared/lib/services/user.service.ts b/packages/shared/lib/services/user.service.ts index 1346d952ac..433726915c 100644 --- a/packages/shared/lib/services/user.service.ts +++ b/packages/shared/lib/services/user.service.ts @@ -1,6 +1,6 @@ import db from '../db/database.js'; import * as uuid from 'uuid'; -import { isEnterprise } from '../utils/utils.js'; +import { isEnterprise } from '@nangohq/utils/dist/environment/detection.js'; import type { User, InviteUser } from '../models/Admin.js'; class UserService { @@ -137,7 +137,7 @@ class UserService { async getInvitedUserByToken(token: string): Promise { const date = new Date(); - if (isEnterprise() && process.env['NANGO_ADMIN_INVITE_TOKEN'] === token) { + if (isEnterprise && process.env['NANGO_ADMIN_INVITE_TOKEN'] === token) { return { id: 1, email: '', diff --git a/packages/shared/lib/utils/analytics.ts b/packages/shared/lib/utils/analytics.ts index e7670c80c0..889a140930 100644 --- a/packages/shared/lib/utils/analytics.ts +++ b/packages/shared/lib/utils/analytics.ts @@ -1,5 +1,7 @@ import { PostHog } from 'posthog-node'; -import { getBaseUrl, localhostUrl, UserType, isCloud, isStaging, packageJsonFile } from '../utils/utils.js'; +import { isCloud, isStaging, baseUrl } from '@nangohq/utils/dist/environment/detection.js'; +import { localhostUrl } from '@nangohq/utils/dist/environment/constants.js'; +import { UserType, packageJsonFile } from '../utils/utils.js'; import ip from 'ip'; import errorManager, { ErrorSourceEnum } from './error.manager.js'; import accountService from '../services/account.service.js'; @@ -55,7 +57,7 @@ class Analytics { constructor() { try { - if (process.env['TELEMETRY']?.toLowerCase() !== 'false' && !isStaging()) { + if (process.env['TELEMETRY']?.toLowerCase() !== 'false' && !isStaging) { this.client = new PostHog('phc_4S2pWFTyPYT1i7zwC8YYQqABvGgSAzNHubUkdEFvcTl'); this.client.enable(); this.packageVersion = packageJsonFile().version; @@ -77,7 +79,6 @@ class Analytics { eventProperties = eventProperties || {}; userProperties = userProperties || {}; - const baseUrl = getBaseUrl(); const userType = this.getUserType(accountId, baseUrl); const userId = this.getUserIdWithType(userType, accountId, baseUrl); @@ -86,7 +87,7 @@ class Analytics { eventProperties['user-account'] = userId; eventProperties['nango-server-version'] = this.packageVersion || 'unknown'; - if (isCloud() && accountId != null) { + if (isCloud && accountId != null) { const account: Account | null = await accountService.getAccountById(accountId); if (account !== null && account.id !== undefined) { const users: User[] | null = await userService.getUsersByAccountId(account.id); diff --git a/packages/shared/lib/utils/encryption.manager.ts b/packages/shared/lib/utils/encryption.manager.ts index b07777aad1..500f682871 100644 --- a/packages/shared/lib/utils/encryption.manager.ts +++ b/packages/shared/lib/utils/encryption.manager.ts @@ -1,7 +1,7 @@ import type { CipherGCMTypes } from 'crypto'; import utils from 'node:util'; import crypto from 'crypto'; -import logger from '../logger/console.js'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; import type { Config as ProviderConfig } from '../models/Provider'; import type { DBConfig } from '../models/Generic.js'; import type { Environment } from '../models/Environment.js'; @@ -10,6 +10,8 @@ import type { Connection, ApiConnection, StoredConnection } from '../models/Conn import type { RawDataRecordResult, DataRecord, DataRecordWithMetadata, RecordWrapCustomerFacingDataRecord, UnencryptedRawRecord } from '../models/Sync.js'; import db from '../db/database.js'; +const logger = getLogger('Encryption.Manager'); + interface DataRecordJson { encryptedValue: string; [key: string]: any; diff --git a/packages/shared/lib/utils/error.manager.ts b/packages/shared/lib/utils/error.manager.ts index 0cd931a877..499d6e1a4c 100644 --- a/packages/shared/lib/utils/error.manager.ts +++ b/packages/shared/lib/utils/error.manager.ts @@ -3,14 +3,17 @@ import type { EventHint } from '@sentry/node'; import sentry from '@sentry/node'; import type { Tracer } from 'dd-trace'; import type { ErrorEvent } from '@sentry/types'; -import logger from '../logger/console.js'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; import { NangoError } from './error.js'; import type { Response, Request } from 'express'; -import { isCloud, getEnvironmentId, getAccountIdAndEnvironmentIdFromSession, isApiAuthenticated, isUserAuthenticated, packageJsonFile } from './utils.js'; +import { isCloud } from '@nangohq/utils/dist/environment/detection.js'; +import { getEnvironmentId, getAccountIdAndEnvironmentIdFromSession, isApiAuthenticated, isUserAuthenticated, packageJsonFile } from './utils.js'; import environmentService from '../services/environment.service.js'; import accountService from '../services/account.service.js'; import userService from '../services/user.service.js'; +const logger = getLogger('ErrorManager'); + export enum ErrorSourceEnum { PLATFORM = 'platform', CUSTOMER = 'customer' @@ -30,7 +33,7 @@ interface ErrorOptionalConfig { class ErrorManager { constructor() { try { - if (isCloud() && process.env['SENTRY_DNS']) { + if (isCloud && process.env['SENTRY_DNS']) { const packageVersion = packageJsonFile().version; sentry.init({ dsn: process.env['SENTRY_DNS'], diff --git a/packages/shared/lib/utils/featureflags.ts b/packages/shared/lib/utils/featureflags.ts index df5ed09908..ef70f260ec 100644 --- a/packages/shared/lib/utils/featureflags.ts +++ b/packages/shared/lib/utils/featureflags.ts @@ -1,7 +1,9 @@ -import { logger } from '../index.js'; +import { getLogger } from '@nangohq/utils/dist/logger.js'; import { RedisKVStore } from './kvstore/RedisStore.js'; import { getRedisUrl } from './utils.js'; +const logger = getLogger('FeatureFlags'); + class FeatureFlags { redis: RedisKVStore | undefined; diff --git a/packages/shared/lib/utils/telemetry.ts b/packages/shared/lib/utils/telemetry.ts index 35cab764de..9ef93202a1 100644 --- a/packages/shared/lib/utils/telemetry.ts +++ b/packages/shared/lib/utils/telemetry.ts @@ -1,5 +1,5 @@ import { v2, client } from '@datadog/datadog-api-client'; -import { isCloud } from './utils.js'; +import { isCloud } from '@nangohq/utils/dist/environment/detection.js'; import tracer from 'dd-trace'; export enum LogTypes { @@ -62,7 +62,7 @@ class Telemetry { private logInstance: v2.LogsApi | undefined; constructor() { try { - if (isCloud() && process.env['DD_API_KEY'] && process.env['DD_APP_KEY']) { + if (isCloud && process.env['DD_API_KEY'] && process.env['DD_APP_KEY']) { const configuration = client.createConfiguration(); configuration.setServerVariables({ site: 'us3.datadoghq.com' diff --git a/packages/shared/lib/utils/utils.ts b/packages/shared/lib/utils/utils.ts index aca503bab9..fd4b433e02 100644 --- a/packages/shared/lib/utils/utils.ts +++ b/packages/shared/lib/utils/utils.ts @@ -2,6 +2,7 @@ import type { Request, Response } from 'express'; import path, { resolve } from 'path'; import { readFileSync } from 'fs'; import { fileURLToPath } from 'url'; +import { isEnterprise, isStaging, isProd } from '@nangohq/utils/dist/environment/detection.js'; import { NangoError } from './error.js'; import type { User, Account } from '../models/Admin.js'; import type { Environment } from '../models/Environment.js'; @@ -34,9 +35,6 @@ export enum NodeEnv { Prod = 'production' } -export const AUTH_ENABLED = isCloud() || isEnterprise(); -export const MANAGED_AUTH_ENABLED = isCloud() || isLocal(); - export const JAVASCRIPT_AND_TYPESCRIPT_TYPES = { primitives: ['string', 'number', 'boolean', 'bigint', 'symbol', 'undefined', 'null'], aliases: ['String', 'Number', 'Boolean', 'BigInt', 'Symbol', 'Undefined', 'Null', 'bool', 'char', 'integer', 'int', 'date', 'object'], @@ -62,42 +60,6 @@ export function isJsOrTsType(type?: string): boolean { return genericTypeRegex.test(baseType); } -export function getEnv() { - if (isStaging()) { - return NodeEnv.Staging; - } else if (isProd()) { - return NodeEnv.Prod; - } else { - return NodeEnv.Dev; - } -} - -export function isLocal() { - return getBaseUrl() === localhostUrl; -} - -export function isCloud() { - return process.env['NANGO_CLOUD']?.toLowerCase() === 'true'; -} - -export function isEnterprise() { - return process.env['NANGO_ENTERPRISE']?.toLowerCase() === 'true'; -} - -export function integrationFilesAreRemote() { - const useS3 = Boolean(process.env['AWS_REGION'] && process.env['AWS_BUCKET_NAME']); - - return isEnterprise() && useS3; -} - -export function isStaging() { - return process.env['NODE_ENV'] === NodeEnv.Staging; -} - -export function isHosted() { - return !isCloud() && !isLocal() && !isEnterprise(); -} - export function getPort() { if (process.env['SERVER_PORT']) { return +process.env['SERVER_PORT']; @@ -126,22 +88,6 @@ export function getPersistAPIUrl() { return process.env['PERSIST_SERVICE_URL'] || 'http://localhost:3007'; } -export function isDev() { - return process.env['NODE_ENV'] === NodeEnv.Dev; -} - -export function isProd() { - return process.env['NODE_ENV'] === NodeEnv.Prod; -} - -export function isTest(): boolean { - return Boolean(process.env['CI'] !== undefined || process.env['VITEST']); -} - -export function isBasicAuthEnabled() { - return !isCloud() && process.env['NANGO_DASHBOARD_USERNAME'] && process.env['NANGO_DASHBOARD_PASSWORD']; -} - function getServerHost() { return process.env['SERVER_HOST'] || process.env['SERVER_RUN_MODE'] === 'DOCKERIZED' ? 'http://nango-server' : 'http://localhost'; } @@ -187,18 +133,6 @@ export function isTokenExpired(expireDate: Date, bufferInSeconds: number): boole return dateDiffMs < bufferInSeconds * 1000; } -export function getBaseUrl() { - return process.env['NANGO_SERVER_URL'] || localhostUrl; -} - -export function getBasePublicUrl() { - if (process.env['NANGO_SERVER_URL']) { - return process.env['NANGO_SERVER_URL'].replace('api.', 'app.'); - } else { - return getBaseUrl(); - } -} - /** * Get Oauth callback url base url. * @desc for ease of use with APIs that require a secure redirect @@ -211,11 +145,11 @@ export function getLocalOAuthCallbackUrlBaseUrl() { } export function getApiUrl() { - if (isStaging()) { + if (isStaging) { return stagingHost; - } else if (isEnterprise()) { + } else if (isEnterprise) { return process.env['NANGO_SERVER_URL'] as string; - } else if (isProd()) { + } else if (isProd) { return cloudHost; } return getServerBaseUrl(); diff --git a/packages/shared/package.json b/packages/shared/package.json index 21b2aaef88..bc31a2b7de 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -21,6 +21,7 @@ "@datadog/datadog-api-client": "^1.16.0", "@hapi/boom": "^10.0.1", "@nangohq/node": "^0.39.8", + "@nangohq/utils": "file:../utils", "@sentry/node": "^7.105.0", "@temporalio/client": "^1.9.1", "amqplib": "^0.10.3", @@ -54,9 +55,7 @@ "semver": "^7.5.4", "serialize-error": "11.0.3", "simple-oauth2": "^5.0.0", - "uuid": "^9.0.0", - "winston": "^3.8.2", - "winston-daily-rotate-file": "^4.7.1" + "uuid": "^9.0.0" }, "engines": { "node": ">=16.7", diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json index f0cd3a5058..fe668fe095 100644 --- a/packages/shared/tsconfig.json +++ b/packages/shared/tsconfig.json @@ -7,6 +7,9 @@ "references": [ { "path": "../node-client" + }, + { + "path": "../utils" } ], "include": ["lib/**/*"] diff --git a/packages/utils/.gitignore b/packages/utils/.gitignore new file mode 100644 index 0000000000..8c3aba0aad --- /dev/null +++ b/packages/utils/.gitignore @@ -0,0 +1,3 @@ +tsconfig.tsbuildinfo +dist/* +node_modules diff --git a/packages/utils/lib/environment/constants.ts b/packages/utils/lib/environment/constants.ts new file mode 100644 index 0000000000..b0c0e4ec79 --- /dev/null +++ b/packages/utils/lib/environment/constants.ts @@ -0,0 +1,11 @@ +const PORT = process.env['SERVER_PORT'] || 3003; + +export const localhostUrl = `http://localhost:${PORT}`; +export const cloudHost = 'https://api.nango.dev'; +export const stagingHost = 'https://api-staging.nango.dev'; + +export enum NodeEnv { + Dev = 'development', + Staging = 'staging', + Prod = 'production' +} diff --git a/packages/utils/lib/environment/detection.ts b/packages/utils/lib/environment/detection.ts new file mode 100644 index 0000000000..251d635792 --- /dev/null +++ b/packages/utils/lib/environment/detection.ts @@ -0,0 +1,22 @@ +import { NodeEnv, localhostUrl } from './constants.js'; + +export const baseUrl = process.env['NANGO_SERVER_URL'] || localhostUrl; +export const basePublicUrl = process.env['NANGO_SERVER_URL'] ? process.env['NANGO_SERVER_URL'].replace('api.', 'app.') : baseUrl; + +export const isStaging = process.env['NODE_ENV'] === NodeEnv.Staging; +export const isProd = process.env['NODE_ENV'] === NodeEnv.Prod; +export const isCloud = process.env['NANGO_CLOUD']?.toLowerCase() === 'true'; +export const isLocal = baseUrl === localhostUrl; +export const isEnterprise = process.env['NANGO_ENTERPRISE']?.toLowerCase() === 'true'; +export const isDev = process.env['NODE_ENV'] === NodeEnv.Dev; +export const isTest = Boolean(process.env['CI'] !== undefined || process.env['VITEST']); +export const isBasicAuthEnabled = !isCloud && process.env['NANGO_DASHBOARD_USERNAME'] && process.env['NANGO_DASHBOARD_PASSWORD']; +export const isHosted = !isCloud && !isLocal && !isEnterprise; + +export const AUTH_ENABLED = isCloud || isEnterprise; +export const MANAGED_AUTH_ENABLED = isCloud || isLocal; + +export const env = isStaging ? NodeEnv.Staging : isProd ? NodeEnv.Prod : NodeEnv.Dev; + +export const useS3 = Boolean(process.env['AWS_REGION'] && process.env['AWS_BUCKET_NAME']); +export const integrationFilesAreRemote = isEnterprise && useS3; diff --git a/packages/utils/lib/logger.ts b/packages/utils/lib/logger.ts new file mode 100644 index 0000000000..9e303e8c30 --- /dev/null +++ b/packages/utils/lib/logger.ts @@ -0,0 +1,16 @@ +import winston from 'winston'; +import type { Logger } from 'winston'; + +const nangoLogFormat = (service = '') => { + return winston.format.printf((info) => { + return `${info['timestamp']} [${info.level.toUpperCase()}]${service ? ` [${service}] ` : ''}${info.message}`; + }); +}; + +export function getLogger(service?: string): Logger { + return winston.createLogger({ + levels: winston.config.syslog.levels, + format: winston.format.combine(winston.format.timestamp(), nangoLogFormat(service)), + transports: [new winston.transports.Console({ level: process.env['LOG_LEVEL'] || 'info' })] + }); +} diff --git a/packages/utils/package.json b/packages/utils/package.json new file mode 100644 index 0000000000..2aab41d8fb --- /dev/null +++ b/packages/utils/package.json @@ -0,0 +1,19 @@ +{ + "name": "@nangohq/utils", + "version": "1.0.0", + "description": "Utils for use in Nango applications", + "type": "module", + "main": "dist/index.js", + "typings": "dist/index.d.ts", + "keywords": [], + "repository": { + "type": "git", + "url": "git+https://github.com/NangoHQ/nango.git", + "directory": "packages/utils" + }, + "license": "SEE LICENSE IN LICENSE FILE IN GIT REPOSITORY", + "dependencies": { + "winston": "3.8.2" + }, + "devDependencies": {} +} diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json new file mode 100644 index 0000000000..40518d51fa --- /dev/null +++ b/packages/utils/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "lib", + "outDir": "dist" + }, + "include": ["lib/**/*"] +} diff --git a/packages/webapp/src/pages/Connection/Show.tsx b/packages/webapp/src/pages/Connection/Show.tsx index 942948a1eb..8bbce7f63e 100644 --- a/packages/webapp/src/pages/Connection/Show.tsx +++ b/packages/webapp/src/pages/Connection/Show.tsx @@ -15,7 +15,7 @@ import IntegrationLogo from '../../components/ui/IntegrationLogo'; import Button from '../../components/ui/button/Button'; import Syncs from './Syncs'; import Authorization from './Authorization'; -import { SyncResponse, Connection } from '../../types'; +import type { SyncResponse, Connection } from '../../types'; import PageNotFound from '../PageNotFound'; import { useStore } from '../../store'; diff --git a/tsconfig.build.json b/tsconfig.build.json index fe9672180f..eaf0561edc 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -7,6 +7,9 @@ { "path": "packages/frontend" }, + { + "path": "packages/utils" + }, { "path": "packages/jobs" },