diff --git a/client/package-lock.json b/client/package-lock.json index eb559a8f2..6d710e174 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -95,7 +95,7 @@ "@emotion/babel-plugin": "^11.13.5", "@emotion/react": "^11.14.0", "@eslint/js": "^9.29.0", - "@playwright/test": "^1.53.0", + "@playwright/test": "^1.53.1", "@sentry/webpack-plugin": "^3.5.0", "@testing-library/dom": "^10.4.0", "@testing-library/jest-dom": "^6.6.3", @@ -111,7 +111,7 @@ "jsdom": "^26.0.0", "memfs": "^4.17.2", "os-browserify": "^0.3.0", - "playwright": "^1.53.0", + "playwright": "^1.53.1", "react-error-overlay": "^6.1.0", "redux-logger": "^3.0.6", "source-map-explorer": "^2.5.3", @@ -121,7 +121,7 @@ "vite-plugin-node-polyfills": "^0.23.0", "vite-plugin-pwa": "^1.0.0", "vite-plugin-style-import": "^2.0.0", - "vitest": "^3.2.3", + "vitest": "^3.2.4", "workbox-window": "^7.3.0" }, "engines": { @@ -3516,13 +3516,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.53.0.tgz", - "integrity": "sha512-15hjKreZDcp7t6TL/7jkAo6Df5STZN09jGiv5dbP9A6vMVncXRqE7/B2SncsyOwrkZRBH2i6/TPOL8BVmm3c7w==", + "version": "1.53.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.53.1.tgz", + "integrity": "sha512-Z4c23LHV0muZ8hfv4jw6HngPJkbbtZxTkxPNIg7cJcTc9C28N/p2q7g3JZS2SiKBBHJ3uM1dgDye66bB7LEk5w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.53.0" + "playwright": "1.53.1" }, "bin": { "playwright": "cli.js" @@ -5840,15 +5840,15 @@ } }, "node_modules/@vitest/expect": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.3.tgz", - "integrity": "sha512-W2RH2TPWVHA1o7UmaFKISPvdicFJH+mjykctJFoAkUw+SPTJTGjUNdKscFBrqM7IPnCVu6zihtKYa7TkZS1dkQ==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", "dev": true, "license": "MIT", "dependencies": { "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.3", - "@vitest/utils": "3.2.3", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" }, @@ -5857,13 +5857,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.3.tgz", - "integrity": "sha512-cP6fIun+Zx8he4rbWvi+Oya6goKQDZK+Yq4hhlggwQBbrlOQ4qtZ+G4nxB6ZnzI9lyIb+JnvyiJnPC2AGbKSPA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.2.3", + "@vitest/spy": "3.2.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, @@ -5904,9 +5904,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.3.tgz", - "integrity": "sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", "dev": true, "license": "MIT", "dependencies": { @@ -5917,13 +5917,13 @@ } }, "node_modules/@vitest/runner": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.3.tgz", - "integrity": "sha512-83HWYisT3IpMaU9LN+VN+/nLHVBCSIUKJzGxC5RWUOsK1h3USg7ojL+UXQR3b4o4UBIWCYdD2fxuzM7PQQ1u8w==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.2.3", + "@vitest/utils": "3.2.4", "pathe": "^2.0.3", "strip-literal": "^3.0.0" }, @@ -5939,13 +5939,13 @@ "license": "MIT" }, "node_modules/@vitest/snapshot": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.3.tgz", - "integrity": "sha512-9gIVWx2+tysDqUmmM1L0hwadyumqssOL1r8KJipwLx5JVYyxvVRfxvMq7DaWbZZsCqZnu/dZedaZQh4iYTtneA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.3", + "@vitest/pretty-format": "3.2.4", "magic-string": "^0.30.17", "pathe": "^2.0.3" }, @@ -5971,9 +5971,9 @@ "license": "MIT" }, "node_modules/@vitest/spy": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.3.tgz", - "integrity": "sha512-JHu9Wl+7bf6FEejTCREy+DmgWe+rQKbK+y32C/k5f4TBIAlijhJbRBIRIOCEpVevgRsCQR2iHRUH2/qKVM/plw==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", "dev": true, "license": "MIT", "dependencies": { @@ -5984,14 +5984,14 @@ } }, "node_modules/@vitest/utils": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.3.tgz", - "integrity": "sha512-4zFBCU5Pf+4Z6v+rwnZ1HU1yzOKKvDkMXZrymE2PBlbjKJRlrOxbvpfPSvJTGRIwGoahaOGvp+kbCoxifhzJ1Q==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.3", - "loupe": "^3.1.3", + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" }, "funding": { @@ -11622,9 +11622,9 @@ } }, "node_modules/loupe": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", - "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz", + "integrity": "sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==", "dev": true, "license": "MIT" }, @@ -13337,13 +13337,13 @@ } }, "node_modules/playwright": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.0.tgz", - "integrity": "sha512-ghGNnIEYZC4E+YtclRn4/p6oYbdPiASELBIYkBXfaTVKreQUYbMUYQDwS12a8F0/HtIjr/CkGjtwABeFPGcS4Q==", + "version": "1.53.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.1.tgz", + "integrity": "sha512-LJ13YLr/ocweuwxyGf1XNFWIU4M2zUSo149Qbp+A4cpwDjsxRPj7k6H25LBrEHiEwxvRbD8HdwvQmRMSvquhYw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.53.0" + "playwright-core": "1.53.1" }, "bin": { "playwright": "cli.js" @@ -13356,9 +13356,9 @@ } }, "node_modules/playwright-core": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.0.tgz", - "integrity": "sha512-mGLg8m0pm4+mmtB7M89Xw/GSqoNC+twivl8ITteqvAndachozYe2ZA7srU6uleV1vEdAHYqjq+SV8SNxRRFYBw==", + "version": "1.53.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.1.tgz", + "integrity": "sha512-Z46Oq7tLAyT0lGoFx4DOuB1IA9D1TPj0QkYxpPVUnGDqHHvDpCftu1J2hM2PiWsNMoZh8+LQaarAWcDfPBc6zg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -16694,9 +16694,9 @@ } }, "node_modules/tinypool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.0.tgz", - "integrity": "sha512-7CotroY9a8DKsKprEy/a14aCCm8jYVmR7aFy4fpkZM8sdpNJbKkixuNjgM50yCmip2ezc8z4N7k3oe2+rfRJCQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", "dev": true, "license": "MIT", "engines": { @@ -17588,9 +17588,9 @@ } }, "node_modules/vite-node": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.3.tgz", - "integrity": "sha512-gc8aAifGuDIpZHrPjuHyP4dpQmYXqWw7D1GmDnWeNWP654UEXzVfQ5IHPSK5HaHkwB/+p1atpYpSdw/2kOv8iQ==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", "dev": true, "license": "MIT", "dependencies": { @@ -17786,20 +17786,20 @@ } }, "node_modules/vitest": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.3.tgz", - "integrity": "sha512-E6U2ZFXe3N/t4f5BwUaVCKRLHqUpk1CBWeMh78UT4VaTPH/2dyvH6ALl29JTovEPu9dVKr/K/J4PkXgrMbw4Ww==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", "dependencies": { "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.3", - "@vitest/mocker": "3.2.3", - "@vitest/pretty-format": "^3.2.3", - "@vitest/runner": "3.2.3", - "@vitest/snapshot": "3.2.3", - "@vitest/spy": "3.2.3", - "@vitest/utils": "3.2.3", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", @@ -17810,10 +17810,10 @@ "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.14", - "tinypool": "^1.1.0", + "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", - "vite-node": "3.2.3", + "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "bin": { @@ -17829,8 +17829,8 @@ "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.2.3", - "@vitest/ui": "3.2.3", + "@vitest/browser": "3.2.4", + "@vitest/ui": "3.2.4", "happy-dom": "*", "jsdom": "*" }, diff --git a/client/package.json b/client/package.json index c85b2eb5f..955a343b2 100644 --- a/client/package.json +++ b/client/package.json @@ -135,7 +135,7 @@ "@emotion/babel-plugin": "^11.13.5", "@emotion/react": "^11.14.0", "@eslint/js": "^9.29.0", - "@playwright/test": "^1.53.0", + "@playwright/test": "^1.53.1", "@sentry/webpack-plugin": "^3.5.0", "@testing-library/dom": "^10.4.0", "@testing-library/jest-dom": "^6.6.3", @@ -151,7 +151,7 @@ "jsdom": "^26.0.0", "memfs": "^4.17.2", "os-browserify": "^0.3.0", - "playwright": "^1.53.0", + "playwright": "^1.53.1", "react-error-overlay": "^6.1.0", "redux-logger": "^3.0.6", "source-map-explorer": "^2.5.3", @@ -161,7 +161,7 @@ "vite-plugin-node-polyfills": "^0.23.0", "vite-plugin-pwa": "^1.0.0", "vite-plugin-style-import": "^2.0.0", - "vitest": "^3.2.3", + "vitest": "^3.2.4", "workbox-window": "^7.3.0" } } diff --git a/package-lock.json b/package-lock.json index e99e38a05..e598c0600 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,14 +9,14 @@ "version": "0.2.0", "license": "UNLICENSED", "dependencies": { - "@aws-sdk/client-cloudwatch-logs": "^3.830.0", + "@aws-sdk/client-cloudwatch-logs": "^3.832.0", "@aws-sdk/client-elasticache": "^3.830.0", - "@aws-sdk/client-s3": "^3.830.0", + "@aws-sdk/client-s3": "^3.832.0", "@aws-sdk/client-secrets-manager": "^3.830.0", "@aws-sdk/client-ses": "^3.830.0", "@aws-sdk/credential-provider-node": "^3.830.0", - "@aws-sdk/lib-storage": "^3.830.0", - "@aws-sdk/s3-request-presigner": "^3.830.0", + "@aws-sdk/lib-storage": "^3.832.0", + "@aws-sdk/s3-request-presigner": "^3.832.0", "@opensearch-project/opensearch": "^2.13.0", "@socket.io/admin-ui": "^0.5.1", "@socket.io/redis-adapter": "^8.3.0", @@ -24,9 +24,9 @@ "aws4": "^1.13.2", "axios": "^1.10.0", "better-queue": "^3.8.12", - "bullmq": "^5.54.2", + "bullmq": "^5.54.3", "chart.js": "^4.5.0", - "cloudinary": "^2.6.1", + "cloudinary": "^2.7.0", "compression": "^1.8.0", "cookie-parser": "^1.4.7", "cors": "^2.8.5", @@ -74,7 +74,7 @@ "p-limit": "^3.1.0", "prettier": "^3.5.3", "supertest": "^7.1.1", - "vitest": "^3.2.3" + "vitest": "^3.2.4" }, "engines": { "node": ">=22.13.0", @@ -284,9 +284,9 @@ } }, "node_modules/@aws-sdk/client-cloudwatch-logs": { - "version": "3.830.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.830.0.tgz", - "integrity": "sha512-jg4kpECjBcNemGtVr5IK3ZMKRZzrmG4VbxhgECHgxqNPgb+HeAcSOMa3ZsgStRnpwDEazfgYTJyBktZIC/XuuA==", + "version": "3.832.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.832.0.tgz", + "integrity": "sha512-Xpu1HKMafA9j7j/ttvKYcv0a4XRFCOBQFjKvsZTrKeGZoVzoEP+IKBfy8+pGI3zLZEm5N6J5d1ifXbZ+9F0icA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -403,9 +403,9 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.830.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.830.0.tgz", - "integrity": "sha512-Cti+zj1lqvQIScXFQv8/t1xo3pvcvk/ObmGIbyLzfgcYpKMHaIWhzhi6aN+z4dYEv1EwrukC9tNoqScyShc5tw==", + "version": "3.832.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.832.0.tgz", + "integrity": "sha512-S+md1zCe71SEuaRDuLHq4mzhYYkVxR1ENa8NwrgInfYoC4xo8/pESoR6i0ZZpcLs0Jw4EyVInWYs4GgDHW70qQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", @@ -463,12 +463,27 @@ "@smithy/util-stream": "^4.2.2", "@smithy/util-utf8": "^4.0.0", "@smithy/util-waiter": "^4.0.5", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, + "node_modules/@aws-sdk/client-s3/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@aws-sdk/client-secrets-manager": { "version": "3.830.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.830.0.tgz", @@ -798,9 +813,9 @@ } }, "node_modules/@aws-sdk/lib-storage": { - "version": "3.830.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.830.0.tgz", - "integrity": "sha512-jHNM1HhOmwMB5sguttXozL1HiDPf0yovu2o2L3ijMvexSUlrtqE2b2JjevMfVq7xZ5RYhBnQ+T8Q4MUclI8GnQ==", + "version": "3.832.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.832.0.tgz", + "integrity": "sha512-NM+q0WD8TCreo+tvKy0AZytHQQC19zXVG8iapDhafLNs1W72zAQ659pTfVzsC00Zvwtsp0LI/b2FWTjkjTAAdA==", "license": "Apache-2.0", "dependencies": { "@smithy/abort-controller": "^4.0.4", @@ -815,7 +830,7 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-s3": "^3.830.0" + "@aws-sdk/client-s3": "^3.832.0" } }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { @@ -1057,9 +1072,9 @@ } }, "node_modules/@aws-sdk/s3-request-presigner": { - "version": "3.830.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.830.0.tgz", - "integrity": "sha512-IEiSJfuf/hcf9WvCmvV35ci1yGcV3IYKS0e6l5xPRLYDNBrAWao9j8mrp0N4WCD3Nr+3xZRY5JglEFAH6CN3OQ==", + "version": "3.832.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.832.0.tgz", + "integrity": "sha512-zXuwfaAYu99LUF7/6iBr3UlKCMaMImBwfmLXJQlvtE3ebrERXQuISME9Vjd2oG+hJ6XcX6RJqkeIvZBytMzvRw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/signature-v4-multi-region": "3.826.0", @@ -2566,9 +2581,9 @@ "license": "BSD-3-Clause" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.42.0.tgz", - "integrity": "sha512-gldmAyS9hpj+H6LpRNlcjQWbuKUtb94lodB9uCz71Jm+7BxK1VIOo7y62tZZwxhA7j1ylv/yQz080L5WkS+LoQ==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.0.tgz", + "integrity": "sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA==", "cpu": [ "arm" ], @@ -2580,9 +2595,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.42.0.tgz", - "integrity": "sha512-bpRipfTgmGFdCZDFLRvIkSNO1/3RGS74aWkJJTFJBH7h3MRV4UijkaEUeOMbi9wxtxYmtAbVcnMtHTPBhLEkaw==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.0.tgz", + "integrity": "sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw==", "cpu": [ "arm64" ], @@ -2594,9 +2609,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.42.0.tgz", - "integrity": "sha512-JxHtA081izPBVCHLKnl6GEA0w3920mlJPLh89NojpU2GsBSB6ypu4erFg/Wx1qbpUbepn0jY4dVWMGZM8gplgA==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.0.tgz", + "integrity": "sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==", "cpu": [ "arm64" ], @@ -2608,9 +2623,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.42.0.tgz", - "integrity": "sha512-rv5UZaWVIJTDMyQ3dCEK+m0SAn6G7H3PRc2AZmExvbDvtaDc+qXkei0knQWcI3+c9tEs7iL/4I4pTQoPbNL2SA==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.0.tgz", + "integrity": "sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==", "cpu": [ "x64" ], @@ -2622,9 +2637,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.42.0.tgz", - "integrity": "sha512-fJcN4uSGPWdpVmvLuMtALUFwCHgb2XiQjuECkHT3lWLZhSQ3MBQ9pq+WoWeJq2PrNxr9rPM1Qx+IjyGj8/c6zQ==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.0.tgz", + "integrity": "sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ==", "cpu": [ "arm64" ], @@ -2636,9 +2651,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.42.0.tgz", - "integrity": "sha512-CziHfyzpp8hJpCVE/ZdTizw58gr+m7Y2Xq5VOuCSrZR++th2xWAz4Nqk52MoIIrV3JHtVBhbBsJcAxs6NammOQ==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.0.tgz", + "integrity": "sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g==", "cpu": [ "x64" ], @@ -2650,9 +2665,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.42.0.tgz", - "integrity": "sha512-UsQD5fyLWm2Fe5CDM7VPYAo+UC7+2Px4Y+N3AcPh/LdZu23YcuGPegQly++XEVaC8XUTFVPscl5y5Cl1twEI4A==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.0.tgz", + "integrity": "sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ==", "cpu": [ "arm" ], @@ -2664,9 +2679,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.42.0.tgz", - "integrity": "sha512-/i8NIrlgc/+4n1lnoWl1zgH7Uo0XK5xK3EDqVTf38KvyYgCU/Rm04+o1VvvzJZnVS5/cWSd07owkzcVasgfIkQ==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.0.tgz", + "integrity": "sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg==", "cpu": [ "arm" ], @@ -2678,9 +2693,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.42.0.tgz", - "integrity": "sha512-eoujJFOvoIBjZEi9hJnXAbWg+Vo1Ov8n/0IKZZcPZ7JhBzxh2A+2NFyeMZIRkY9iwBvSjloKgcvnjTbGKHE44Q==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.0.tgz", + "integrity": "sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==", "cpu": [ "arm64" ], @@ -2692,9 +2707,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.42.0.tgz", - "integrity": "sha512-/3NrcOWFSR7RQUQIuZQChLND36aTU9IYE4j+TB40VU78S+RA0IiqHR30oSh6P1S9f9/wVOenHQnacs/Byb824g==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.0.tgz", + "integrity": "sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==", "cpu": [ "arm64" ], @@ -2706,9 +2721,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.42.0.tgz", - "integrity": "sha512-O8AplvIeavK5ABmZlKBq9/STdZlnQo7Sle0LLhVA7QT+CiGpNVe197/t8Aph9bhJqbDVGCHpY2i7QyfEDDStDg==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.0.tgz", + "integrity": "sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg==", "cpu": [ "loong64" ], @@ -2720,9 +2735,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.42.0.tgz", - "integrity": "sha512-6Qb66tbKVN7VyQrekhEzbHRxXXFFD8QKiFAwX5v9Xt6FiJ3BnCVBuyBxa2fkFGqxOCSGGYNejxd8ht+q5SnmtA==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.0.tgz", + "integrity": "sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ==", "cpu": [ "ppc64" ], @@ -2734,9 +2749,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.42.0.tgz", - "integrity": "sha512-KQETDSEBamQFvg/d8jajtRwLNBlGc3aKpaGiP/LvEbnmVUKlFta1vqJqTrvPtsYsfbE/DLg5CC9zyXRX3fnBiA==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.0.tgz", + "integrity": "sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA==", "cpu": [ "riscv64" ], @@ -2748,9 +2763,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.42.0.tgz", - "integrity": "sha512-qMvnyjcU37sCo/tuC+JqeDKSuukGAd+pVlRl/oyDbkvPJ3awk6G6ua7tyum02O3lI+fio+eM5wsVd66X0jQtxw==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.0.tgz", + "integrity": "sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q==", "cpu": [ "riscv64" ], @@ -2762,9 +2777,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.42.0.tgz", - "integrity": "sha512-I2Y1ZUgTgU2RLddUHXTIgyrdOwljjkmcZ/VilvaEumtS3Fkuhbw4p4hgHc39Ypwvo2o7sBFNl2MquNvGCa55Iw==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.0.tgz", + "integrity": "sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA==", "cpu": [ "s390x" ], @@ -2776,9 +2791,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.42.0.tgz", - "integrity": "sha512-Gfm6cV6mj3hCUY8TqWa63DB8Mx3NADoFwiJrMpoZ1uESbK8FQV3LXkhfry+8bOniq9pqY1OdsjFWNsSbfjPugw==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.0.tgz", + "integrity": "sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==", "cpu": [ "x64" ], @@ -2790,9 +2805,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.42.0.tgz", - "integrity": "sha512-g86PF8YZ9GRqkdi0VoGlcDUb4rYtQKyTD1IVtxxN4Hpe7YqLBShA7oHMKU6oKTCi3uxwW4VkIGnOaH/El8de3w==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.0.tgz", + "integrity": "sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==", "cpu": [ "x64" ], @@ -2804,9 +2819,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.42.0.tgz", - "integrity": "sha512-+axkdyDGSp6hjyzQ5m1pgcvQScfHnMCcsXkx8pTgy/6qBmWVhtRVlgxjWwDp67wEXXUr0x+vD6tp5W4x6V7u1A==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.0.tgz", + "integrity": "sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==", "cpu": [ "arm64" ], @@ -2818,9 +2833,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.42.0.tgz", - "integrity": "sha512-F+5J9pelstXKwRSDq92J0TEBXn2nfUrQGg+HK1+Tk7VOL09e0gBqUHugZv7SW4MGrYj41oNCUe3IKCDGVlis2g==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.0.tgz", + "integrity": "sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA==", "cpu": [ "ia32" ], @@ -2832,9 +2847,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.42.0.tgz", - "integrity": "sha512-LpHiJRwkaVz/LqjHjK8LCi8osq7elmpwujwbXKNW88bM8eeGxavJIKKjkjpMHAh/2xfnrt1ZSnhTv41WYUHYmA==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.0.tgz", + "integrity": "sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==", "cpu": [ "x64" ], @@ -3717,9 +3732,9 @@ "license": "MIT" }, "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, @@ -3881,15 +3896,15 @@ "license": "MIT" }, "node_modules/@vitest/expect": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.3.tgz", - "integrity": "sha512-W2RH2TPWVHA1o7UmaFKISPvdicFJH+mjykctJFoAkUw+SPTJTGjUNdKscFBrqM7IPnCVu6zihtKYa7TkZS1dkQ==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", "dev": true, "license": "MIT", "dependencies": { "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.3", - "@vitest/utils": "3.2.3", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" }, @@ -3898,13 +3913,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.3.tgz", - "integrity": "sha512-cP6fIun+Zx8he4rbWvi+Oya6goKQDZK+Yq4hhlggwQBbrlOQ4qtZ+G4nxB6ZnzI9lyIb+JnvyiJnPC2AGbKSPA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.2.3", + "@vitest/spy": "3.2.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, @@ -3925,9 +3940,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.3.tgz", - "integrity": "sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", "dev": true, "license": "MIT", "dependencies": { @@ -3938,13 +3953,13 @@ } }, "node_modules/@vitest/runner": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.3.tgz", - "integrity": "sha512-83HWYisT3IpMaU9LN+VN+/nLHVBCSIUKJzGxC5RWUOsK1h3USg7ojL+UXQR3b4o4UBIWCYdD2fxuzM7PQQ1u8w==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.2.3", + "@vitest/utils": "3.2.4", "pathe": "^2.0.3", "strip-literal": "^3.0.0" }, @@ -3953,13 +3968,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.3.tgz", - "integrity": "sha512-9gIVWx2+tysDqUmmM1L0hwadyumqssOL1r8KJipwLx5JVYyxvVRfxvMq7DaWbZZsCqZnu/dZedaZQh4iYTtneA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.3", + "@vitest/pretty-format": "3.2.4", "magic-string": "^0.30.17", "pathe": "^2.0.3" }, @@ -3968,9 +3983,9 @@ } }, "node_modules/@vitest/spy": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.3.tgz", - "integrity": "sha512-JHu9Wl+7bf6FEejTCREy+DmgWe+rQKbK+y32C/k5f4TBIAlijhJbRBIRIOCEpVevgRsCQR2iHRUH2/qKVM/plw==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", "dev": true, "license": "MIT", "dependencies": { @@ -3981,14 +3996,14 @@ } }, "node_modules/@vitest/utils": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.3.tgz", - "integrity": "sha512-4zFBCU5Pf+4Z6v+rwnZ1HU1yzOKKvDkMXZrymE2PBlbjKJRlrOxbvpfPSvJTGRIwGoahaOGvp+kbCoxifhzJ1Q==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.3", - "loupe": "^3.1.3", + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" }, "funding": { @@ -4659,9 +4674,9 @@ } }, "node_modules/bullmq": { - "version": "5.54.2", - "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.54.2.tgz", - "integrity": "sha512-Qm75wtgKLP1FH92N+l01D1AErX+uLdMlfadvY2XMBmE4gx5qeTbat4b2Zil1U82Ipqn5Vz7kpNE0cgw/hznAGA==", + "version": "5.54.3", + "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.54.3.tgz", + "integrity": "sha512-MVK2pOkB3hvrIcubwI8dS4qWHJLNKakKPpgRBTw91sIpPZArmvZ4t2hvryyEaJXJbAS/JHd6pKYOUd+RGRkWQQ==", "license": "MIT", "dependencies": { "cron-parser": "^4.9.0", @@ -4974,9 +4989,9 @@ } }, "node_modules/cloudinary": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-2.6.1.tgz", - "integrity": "sha512-Dt7o3p4VzxYoTi+EqWkVQmGy6WiXIyMcG5Gbr9kPR/EQ+jZa+3FFzlDKfDx1uDsaB1aTR1gYeO6wZqrgLFaByQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-2.7.0.tgz", + "integrity": "sha512-qrqDn31+qkMCzKu1GfRpzPNAO86jchcNwEHCUiqvPHNSFqu7FTNF9FuAkBUyvM1CFFgFPu64NT0DyeREwLwK0w==", "license": "MIT", "dependencies": { "lodash": "^4.17.21", @@ -6734,9 +6749,9 @@ } }, "node_modules/fdir": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz", - "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==", + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", "dev": true, "license": "MIT", "peerDependencies": { @@ -8766,9 +8781,9 @@ } }, "node_modules/loupe": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", - "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz", + "integrity": "sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==", "dev": true, "license": "MIT" }, @@ -9765,9 +9780,9 @@ } }, "node_modules/postcss": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.4.tgz", - "integrity": "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -10344,13 +10359,13 @@ "license": "MIT" }, "node_modules/rollup": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.42.0.tgz", - "integrity": "sha512-LW+Vse3BJPyGJGAJt1j8pWDKPd73QM8cRXYK1IxOBgL2AGLu7Xd2YOW0M2sLUBCkF5MshXXtMApyEAEzMVMsnw==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.0.tgz", + "integrity": "sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.7" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -10360,26 +10375,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.42.0", - "@rollup/rollup-android-arm64": "4.42.0", - "@rollup/rollup-darwin-arm64": "4.42.0", - "@rollup/rollup-darwin-x64": "4.42.0", - "@rollup/rollup-freebsd-arm64": "4.42.0", - "@rollup/rollup-freebsd-x64": "4.42.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.42.0", - "@rollup/rollup-linux-arm-musleabihf": "4.42.0", - "@rollup/rollup-linux-arm64-gnu": "4.42.0", - "@rollup/rollup-linux-arm64-musl": "4.42.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.42.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.42.0", - "@rollup/rollup-linux-riscv64-gnu": "4.42.0", - "@rollup/rollup-linux-riscv64-musl": "4.42.0", - "@rollup/rollup-linux-s390x-gnu": "4.42.0", - "@rollup/rollup-linux-x64-gnu": "4.42.0", - "@rollup/rollup-linux-x64-musl": "4.42.0", - "@rollup/rollup-win32-arm64-msvc": "4.42.0", - "@rollup/rollup-win32-ia32-msvc": "4.42.0", - "@rollup/rollup-win32-x64-msvc": "4.42.0", + "@rollup/rollup-android-arm-eabi": "4.44.0", + "@rollup/rollup-android-arm64": "4.44.0", + "@rollup/rollup-darwin-arm64": "4.44.0", + "@rollup/rollup-darwin-x64": "4.44.0", + "@rollup/rollup-freebsd-arm64": "4.44.0", + "@rollup/rollup-freebsd-x64": "4.44.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.44.0", + "@rollup/rollup-linux-arm-musleabihf": "4.44.0", + "@rollup/rollup-linux-arm64-gnu": "4.44.0", + "@rollup/rollup-linux-arm64-musl": "4.44.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.44.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.44.0", + "@rollup/rollup-linux-riscv64-gnu": "4.44.0", + "@rollup/rollup-linux-riscv64-musl": "4.44.0", + "@rollup/rollup-linux-s390x-gnu": "4.44.0", + "@rollup/rollup-linux-x64-gnu": "4.44.0", + "@rollup/rollup-linux-x64-musl": "4.44.0", + "@rollup/rollup-win32-arm64-msvc": "4.44.0", + "@rollup/rollup-win32-ia32-msvc": "4.44.0", + "@rollup/rollup-win32-x64-msvc": "4.44.0", "fsevents": "~2.3.2" } }, @@ -11760,9 +11775,9 @@ } }, "node_modules/tinypool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.0.tgz", - "integrity": "sha512-7CotroY9a8DKsKprEy/a14aCCm8jYVmR7aFy4fpkZM8sdpNJbKkixuNjgM50yCmip2ezc8z4N7k3oe2+rfRJCQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", "dev": true, "license": "MIT", "engines": { @@ -12198,9 +12213,9 @@ } }, "node_modules/vite-node": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.3.tgz", - "integrity": "sha512-gc8aAifGuDIpZHrPjuHyP4dpQmYXqWw7D1GmDnWeNWP654UEXzVfQ5IHPSK5HaHkwB/+p1atpYpSdw/2kOv8iQ==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", "dev": true, "license": "MIT", "dependencies": { @@ -12221,20 +12236,20 @@ } }, "node_modules/vitest": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.3.tgz", - "integrity": "sha512-E6U2ZFXe3N/t4f5BwUaVCKRLHqUpk1CBWeMh78UT4VaTPH/2dyvH6ALl29JTovEPu9dVKr/K/J4PkXgrMbw4Ww==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", "dependencies": { "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.3", - "@vitest/mocker": "3.2.3", - "@vitest/pretty-format": "^3.2.3", - "@vitest/runner": "3.2.3", - "@vitest/snapshot": "3.2.3", - "@vitest/spy": "3.2.3", - "@vitest/utils": "3.2.3", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", @@ -12245,10 +12260,10 @@ "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.14", - "tinypool": "^1.1.0", + "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", - "vite-node": "3.2.3", + "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "bin": { @@ -12264,8 +12279,8 @@ "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.2.3", - "@vitest/ui": "3.2.3", + "@vitest/browser": "3.2.4", + "@vitest/ui": "3.2.4", "happy-dom": "*", "jsdom": "*" }, diff --git a/package.json b/package.json index 951fc588a..656a0c36c 100644 --- a/package.json +++ b/package.json @@ -16,14 +16,14 @@ "job-totals-fixtures:local": "docker exec node-app /usr/bin/node /app/download-job-totals-fixtures.js" }, "dependencies": { - "@aws-sdk/client-cloudwatch-logs": "^3.830.0", + "@aws-sdk/client-cloudwatch-logs": "^3.832.0", "@aws-sdk/client-elasticache": "^3.830.0", - "@aws-sdk/client-s3": "^3.830.0", + "@aws-sdk/client-s3": "^3.832.0", "@aws-sdk/client-secrets-manager": "^3.830.0", "@aws-sdk/client-ses": "^3.830.0", "@aws-sdk/credential-provider-node": "^3.830.0", - "@aws-sdk/lib-storage": "^3.830.0", - "@aws-sdk/s3-request-presigner": "^3.830.0", + "@aws-sdk/lib-storage": "^3.832.0", + "@aws-sdk/s3-request-presigner": "^3.832.0", "@opensearch-project/opensearch": "^2.13.0", "@socket.io/admin-ui": "^0.5.1", "@socket.io/redis-adapter": "^8.3.0", @@ -31,9 +31,9 @@ "aws4": "^1.13.2", "axios": "^1.10.0", "better-queue": "^3.8.12", - "bullmq": "^5.54.2", + "bullmq": "^5.54.3", "chart.js": "^4.5.0", - "cloudinary": "^2.6.1", + "cloudinary": "^2.7.0", "compression": "^1.8.0", "cookie-parser": "^1.4.7", "cors": "^2.8.5", @@ -81,6 +81,6 @@ "p-limit": "^3.1.0", "prettier": "^3.5.3", "supertest": "^7.1.1", - "vitest": "^3.2.3" + "vitest": "^3.2.4" } } diff --git a/server/integrations/partsManagement/partsManagementVehicleDamageEstimateAddRq.js b/server/integrations/partsManagement/partsManagementVehicleDamageEstimateAddRq.js index 03a68ca0d..661ef40fd 100644 --- a/server/integrations/partsManagement/partsManagementVehicleDamageEstimateAddRq.js +++ b/server/integrations/partsManagement/partsManagementVehicleDamageEstimateAddRq.js @@ -1,3 +1,8 @@ +// no-dd-sa:javascript-code-style/assignment-name +// The above disables camel case inspection for the file, +// CamelCase is used for GraphQL and database fields, and it is easier +// to maintain consistency with the existing codebase. + const xml2js = require("xml2js"); const client = require("../../graphql-client/graphql-client").client; @@ -21,13 +26,15 @@ const INSERT_PARTS_ORDERS = ` /** * Handles incoming VehicleDamageEstimateAddRq XML, - * parses every known field, inserts a Job + nested JobLines, + * parses every known field (including estimator, adjuster, + * repair facility), nests Vehicle and JobLines inserts, * then any PartsOrders (grouped per SupplierRefNum). */ const partsManagementVehicleDamageEstimateAddRq = async (req, res) => { const { logger } = req; const xml = req.body; + // ── PARSE XML ──────────────────────────────────────────────────────────────── let payload; try { payload = await xml2js.parseStringPromise(xml, { @@ -37,6 +44,7 @@ const partsManagementVehicleDamageEstimateAddRq = async (req, res) => { logger.log("parts-xml-parse", "debug", null, null, { success: true }); } catch (err) { logger.log("parts-xml-parse-error", "error", null, null, { error: err }); + console.dir(err); return res.status(400).send("Invalid XML"); } @@ -47,89 +55,118 @@ const partsManagementVehicleDamageEstimateAddRq = async (req, res) => { } try { - // - // ── SHOP ID ─────────────────────────────────────────────────────────────────── - // - // pulled directly from in your XML - // + // ── SHOP ID ──────────────────────────────────────────────────────────────── const shopId = rq.ShopID || rq.shopId; if (!shopId) { throw { status: 400, message: "Missing in XML" }; } - // - // ── DOCUMENT INFO ───────────────────────────────────────────────────────────── - // - const { RqUID, RefClaimNum } = rq; + // ── DOCUMENT INFO ────────────────────────────────────────────────────────── + const { RefClaimNum } = rq; const doc = rq.DocumentInfo || {}; const comment = doc.Comment || null; - const transmitDate = doc.TransmitDateTime || null; + const date_exported = doc.TransmitDateTime || null; - // capture all entries const docVers = doc.DocumentVer ? (Array.isArray(doc.DocumentVer) ? doc.DocumentVer : [doc.DocumentVer]) : []; const documentVersions = docVers.map((dv) => ({ code: dv.DocumentVerCode, num: dv.DocumentVerNum })); - // pull out any OtherReferenceInfo (RO Number + Job UUID) - const otherRefs = doc.ReferenceInfo?.OtherReferenceInfo - ? Array.isArray(doc.ReferenceInfo.OtherReferenceInfo) - ? doc.ReferenceInfo.OtherReferenceInfo - : [doc.ReferenceInfo.OtherReferenceInfo] - : []; - const originalRoNumber = otherRefs.find((r) => r.OtherReferenceName === "RO Number")?.OtherRefNum; - const originalJobUuid = otherRefs.find((r) => r.OtherReferenceName === "Job UUID")?.OtherRefNum; - - // - // ── EVENT INFO ──────────────────────────────────────────────────────────────── - // + // ── EVENT INFO ────────────────────────────────────────────────────────────── const ev = rq.EventInfo || {}; - const assignEv = ev.AssignmentEvent || {}; - const assignmentEvent = { - number: assignEv.AssignmentNumber, - type: assignEv.AssignmentType, - date: assignEv.AssignmentDate, - createdAt: assignEv.CreateDateTime - }; - const repairEv = ev.RepairEvent || {}; - const scheduled_completion = repairEv.TargetCompletionDateTime || null; - const scheduled_in = repairEv.RequestedPickUpDateTime || null; + const asgn = ev.AssignmentEvent || {}; + const asgn_no = asgn.AssignmentNumber || null; + const asgn_type = asgn.AssignmentType || null; + const asgn_date = asgn.AssignmentDate || null; + const scheduled_completion = ev.RepairEvent?.TargetCompletionDateTime || null; + const scheduled_in = ev.RepairEvent?.RequestedPickUpDateTime || null; - // - // ── CLAIM INFO ──────────────────────────────────────────────────────────────── - // + // ── CLAIM INFO ────────────────────────────────────────────────────────────── const ci = rq.ClaimInfo || {}; - const clm_no = ci.ClaimNum; - const ClaimStatus = ci.ClaimStatus || null; + const clm_no = ci.ClaimNum || null; + const status = ci.ClaimStatus || null; const policy_no = ci.PolicyInfo?.PolicyNum || null; const ded_amt = parseFloat(ci.PolicyInfo?.CoverageInfo?.Coverage?.DeductibleInfo?.DeductibleAmt || 0); - // if your XML ever has a `` you'd parse it here const clm_total = parseFloat(ci.Cieca_ttl || 0); - // - // ── OWNER ───────────────────────────────────────────────────────────────────── - // - const ownerParty = rq.AdminInfo?.Owner?.Party || {}; - const ownerName = ownerParty.PersonInfo?.PersonName || {}; - const ownerOrg = ownerParty.OrgInfo || {}; - const ownerAddr = ownerParty.PersonInfo?.Communications?.Address || {}; - const ownerComms = ownerParty.ContactInfo?.Communications + // ── ADMIN / OWNER INFO ────────────────────────────────────────────────────── + const admin = rq.AdminInfo || {}; + + // Owner + const ownerParty = admin.Owner?.Party || {}; + const ownr_fn = ownerParty.PersonInfo?.PersonName?.FirstName || null; + const ownr_ln = ownerParty.PersonInfo?.PersonName?.LastName || null; + const ownr_co_nm = ownerParty.OrgInfo?.CompanyName || null; + const adr = ownerParty.PersonInfo?.Communications?.Address || {}; + const ownr_addr1 = adr.Address1 || null; + const ownr_addr2 = adr.Address2 || null; + const ownr_city = adr.City || null; + const ownr_st = adr.StateProvince || null; + const ownr_zip = adr.PostalCode || null; + const ownr_ctry = adr.Country || null; + + const ownrComms = ownerParty.ContactInfo?.Communications ? Array.isArray(ownerParty.ContactInfo.Communications) ? ownerParty.ContactInfo.Communications : [ownerParty.ContactInfo.Communications] : []; - let ownerPhone = null, - ownerEmail = null; - ownerComms.forEach((c) => { - if (c.CommQualifier === "CP") ownerPhone = c.CommPhone; - if (c.CommQualifier === "EM") ownerEmail = c.CommEmail; + let ownr_ph1 = null, + ownr_ph2 = null, + ownr_fax = null, + ownr_ea = null; + ownrComms.forEach((c) => { + if (c.CommQualifier === "CP") ownr_ph1 = c.CommPhone; + if (c.CommQualifier === "WP") ownr_ph2 = c.CommPhone; + if (c.CommQualifier === "FX") ownr_fax = c.CommPhone; + if (c.CommQualifier === "EM") ownr_ea = c.CommEmail; }); - const ownerPrefContact = ownerParty.PreferredContactMethod || null; + const preferred_contact = ownerParty.PreferredContactMethod || null; - // - // ── VEHICLE INFO ────────────────────────────────────────────────────────────── - // + // Estimator → map to est_… fields + const estParty = admin.Estimator?.Party || {}; + const est_fn = estParty.PersonInfo?.PersonName?.FirstName || null; + const est_ln = estParty.PersonInfo?.PersonName?.LastName || null; + const est_aff = admin.Estimator?.Affiliation || null; + const estComms = estParty.ContactInfo?.Communications + ? Array.isArray(estParty.ContactInfo.Communications) + ? estParty.ContactInfo.Communications + : [estParty.ContactInfo.Communications] + : []; + const est_ea = estComms.find((c) => c.CommQualifier === "EM")?.CommEmail || null; + + // Adjuster → map to agt_… fields + const adjParty = admin.Adjuster?.Party || {}; + const agt_ct_fn = adjParty.PersonInfo?.PersonName?.FirstName || null; + const agt_ct_ln = adjParty.PersonInfo?.PersonName?.LastName || null; + const adjComms = adjParty.ContactInfo?.Communications + ? Array.isArray(adjParty.ContactInfo.Communications) + ? adjParty.ContactInfo.Communications + : [adjParty.ContactInfo.Communications] + : []; + const agt_ct_ph = adjComms.find((c) => c.CommQualifier === "CP")?.CommPhone || null; + const agt_ea = adjComms.find((c) => c.CommQualifier === "EM")?.CommEmail || null; + + // Repair Facility → map to servicing_dealer, servicing_dealer_contact + const rfParty = admin.RepairFacility?.Party || {}; + const servicing_dealer = rfParty.OrgInfo?.CompanyName || null; + const rfAdr = rfParty.OrgInfo?.Communications?.Address || {}; + const servicing_dealer_addr1 = rfAdr.Address1 || null; + const servicing_dealer_city = rfAdr.City || null; + const servicing_dealer_st = rfAdr.StateProvince || null; + const servicing_dealer_zip = rfAdr.PostalCode || null; + const servicing_dealer_ctry = rfAdr.Country || null; + const rfComms = rfParty.ContactInfo?.Communications + ? Array.isArray(rfParty.ContactInfo.Communications) + ? rfParty.ContactInfo.Communications + : [rfParty.ContactInfo.Communications] + : []; + const servicing_dealer_contact = + rfComms.find((c) => c.CommQualifier === "WP")?.CommPhone || + rfComms.find((c) => c.CommQualifier === "FX")?.CommPhone || + null; + + // ── VEHICLE INFO (nested relationship) ────────────────────────────────────── const vin = rq.VehicleInfo?.VINInfo?.VINNum || null; const plate_no = rq.VehicleInfo?.License?.LicensePlateNum || null; const plate_st = rq.VehicleInfo?.License?.LicensePlateStateProvince || null; @@ -137,32 +174,44 @@ const partsManagementVehicleDamageEstimateAddRq = async (req, res) => { const v_model_yr = desc.ModelYear || null; const v_make_desc = desc.MakeDesc || null; const v_model_desc = desc.ModelName || null; + const v_color = rq.VehicleInfo?.Paint?.Exterior?.ColorName || null; const body_style = desc.BodyStyle || null; const engine_desc = desc.EngineDesc || null; const production_date = desc.ProductionDate || null; - const sub_model_desc = desc.SubModelDesc || null; - const fuel_type = desc.FuelType || null; - const v_color = rq.VehicleInfo?.Paint?.Exterior?.ColorName || null; - const drivable = rq.VehicleInfo?.Condition?.DrivableInd === "Y"; + const v_options = desc.SubModelDesc || null; + const v_type = desc.FuelType || null; + const driveable = rq.VehicleInfo?.Condition?.DrivableInd === "Y"; - // - // ── PROFILE & RATES ─────────────────────────────────────────────────────────── - // + const vehicleData = { + shopid: shopId, + vin, + plate_no, + plate_st, + year: v_model_yr, + make: v_make_desc, + model: v_model_desc, + color: v_color, + bstyle: body_style, + engine: engine_desc, + prod_dt: production_date, + options: v_options, + type: v_type, + condition: driveable + }; + + // ── PROFILE & RATES ───────────────────────────────────────────────────────── const rateInfos = rq.ProfileInfo?.RateInfo ? Array.isArray(rq.ProfileInfo.RateInfo) ? rq.ProfileInfo.RateInfo : [rq.ProfileInfo.RateInfo] : []; - const rates = {}; // main { rate_lab, rate_laf, … } - const rateTier = {}; // e.g. { MA2S: [ {tier, pct}, … ] } - const materialCalc = {}; // e.g. { LAR: { CalcMethodCode, CalcMaxHours }, … } - + const rates = {}, + rateTier = {}, + materialCalc = {}; rateInfos.forEach((r) => { - if (!r || !r.RateType) return; - const t = r.RateType; - // main per‐unit rate - if (r.Rate) rates[`rate_${t.toLowerCase()}`] = parseFloat(r.Rate) || 0; - // any tier settings + if (!r.RateType) return; + const t = r.RateType.toLowerCase(); + if (r.Rate) rates[`rate_${t}`] = parseFloat(r.Rate) || 0; if (r.RateTierInfo) { const tiers = Array.isArray(r.RateTierInfo) ? r.RateTierInfo : [r.RateTierInfo]; rateTier[t] = tiers.map((ti) => ({ @@ -170,15 +219,12 @@ const partsManagementVehicleDamageEstimateAddRq = async (req, res) => { pct: parseFloat(ti.Percentage) || 0 })); } - // any material‐calc limits if (r.MaterialCalcSettings) { materialCalc[t] = r.MaterialCalcSettings; } }); - // - // ── DAMAGE LINES → joblinesData ───────────────────────────────────────────── - // + // ── DAMAGE LINES → joblinesData ──────────────────────────────────────────── const damageLines = Array.isArray(rq.DamageLineInfo) ? rq.DamageLineInfo : [rq.DamageLineInfo]; const joblinesData = damageLines.map((line) => ({ line_no: parseInt(line.LineNum, 10), @@ -190,25 +236,21 @@ const partsManagementVehicleDamageEstimateAddRq = async (req, res) => { line_desc: line.LineDesc || null, // parts - part_type: line.PartInfo.PartType || null, - part_qty: parseInt(line.PartInfo.Quantity || 0, 10), - db_price: parseFloat(line.PartInfo.PartPrice || 0), - act_price: parseFloat(line.PartInfo.PartPrice || 0), - oem_partno: line.PartInfo.OEMPartNum || null, + part_type: line.PartInfo?.PartType || null, + part_qty: parseInt(line.PartInfo?.Quantity || 0, 10), + db_price: parseFloat(line.PartInfo?.PartPrice || 0), + act_price: parseFloat(line.PartInfo?.PartPrice || 0), + oem_partno: line.PartInfo?.OEMPartNum || null, - // non-OEM block - non_oem_part_num: line.PartInfo?.NonOEM?.NonOEMPartNum || null, - non_oem_part_price: parseFloat(line.PartInfo?.NonOEM?.NonOEMPartPrice || 0), - supplier_ref_num: line.PartInfo?.NonOEM?.SupplierRefNum || null, - part_selected_ind: line.PartInfo?.NonOEM?.PartSelectedInd === "1", + // non-OEM → not persisted at jobline level - after_market_usage: line.PartInfo.AfterMarketUsage || null, - certification_type: line.PartInfo.CertificationType || null, - tax_part: line.PartInfo.TaxableInd === "1", - glass_flag: line.PartInfo.GlassPartInd === "1", + after_market_usage: line.PartInfo?.AfterMarketUsage || null, + certification_type: line.PartInfo?.CertificationType || null, + tax_part: line.PartInfo?.TaxableInd === "1", + glass_flag: line.PartInfo?.GlassPartInd === "1", price_j: line.PriceJudgmentInd === "1", price_inc: line.PriceInclInd === "1", - order_by_application_ind: String(line.PartInfo.OrderByApplicationInd).toLowerCase() === "true", + order_by_application_ind: String(line.PartInfo?.OrderByApplicationInd).toLowerCase() === "true", // labor mod_lbr_ty: line.LaborInfo?.LaborType || null, @@ -216,103 +258,101 @@ const partsManagementVehicleDamageEstimateAddRq = async (req, res) => { lbr_op: line.LaborInfo?.LaborOperation || null, lbr_amt: parseFloat(line.LaborInfo?.LaborAmt || 0), - // linkage & memo parent_line_no: line.ParentLineNum ? parseInt(line.ParentLineNum, 10) : null, notes: line.LineMemo || null })); - // - // ── BUILD & INSERT THE JOB ─────────────────────────────────────────────────── - // + // ── BUILD & INSERT THE JOB ────────────────────────────────────────────────── const jobInput = { shopid: shopId, - - // identifiers ro_number: RefClaimNum, - original_ro_number: originalRoNumber, - original_job_uuid: originalJobUuid, - // claim & policy clm_no, - status: ClaimStatus, + status, clm_total, policy_no, ded_amt, - // timestamps & comments comment, - date_exported: transmitDate, + date_exported, + asgn_no, + asgn_type, + asgn_date, + scheduled_completion, + scheduled_in, - // owner - ownr_fn: ownerName.FirstName || null, - ownr_ln: ownerName.LastName || null, - ownr_co_nm: ownerOrg.CompanyName || null, - ownr_addr1: ownerAddr.Address1 || null, - ownr_city: ownerAddr.City || null, - ownr_st: ownerAddr.StateProvince || null, - ownr_zip: ownerAddr.PostalCode || null, - ownr_country: ownerAddr.Country || null, - ownr_ph1: ownerPhone, - ownr_ea: ownerEmail, - ownr_pref_contact: ownerPrefContact, + ownr_fn, + ownr_ln, + ownr_co_nm, + ownr_addr1, + ownr_addr2, + ownr_city, + ownr_st, + ownr_zip, + ownr_ctry, + ownr_ph1, + ownr_ph2, + ownr_fax, + ownr_ea, + preferred_contact, - // vehicle - v_vin: vin, - plate_no, - plate_st, - v_model_yr, - v_make_desc, - v_model_desc, - v_color, - body_style, - engine_desc, - production_date, - sub_model_desc, - fuel_type, - drivable, + est_co_id: est_aff, + est_ct_fn: est_fn, + est_ct_ln: est_ln, + est_ea, + + agt_ct_fn, + agt_ct_ln, + agt_ct_ph, + agt_ea, + + servicing_dealer, + servicing_dealer_addr1, + servicing_dealer_city, + servicing_dealer_st, + servicing_dealer_zip, + servicing_dealer_ctry, + servicing_dealer_contact, - // labor & material rates ...rates, - // everything extra in one JSON column production_vars: { - rqUid: RqUID, documentVersions, - assignmentEvent, - scheduled_completion, - scheduled_in, rateTier, materialCalc }, - // nested joblines + vehicle: { data: vehicleData }, joblines: { data: joblinesData } }; logger.log("parts-insert-job", "debug", null, null, { jobInput }); - const jobResp = await client.request(INSERT_JOB_WITH_LINES, { - job: jobInput - }); - const newJob = jobResp.insert_jobs_one; + const { insert_jobs_one: newJob } = await client.request(INSERT_JOB_WITH_LINES, { job: jobInput }); const jobId = newJob.id; logger.log("parts-job-created", "info", jobId, null); - // // ── BUILD & INSERT PARTS ORDERS ──────────────────────────────────────────── - // - // group lines by their SupplierRefNum - const insertedMap = newJob.joblines.reduce((m, ln) => { - m[ln.unq_seq] = ln.id; - return m; + const seqToId = newJob.joblines.reduce((map, ln) => { + map[ln.unq_seq] = ln.id; + return map; }, {}); + + const currentDate = new Date().toISOString().slice(0, 10); + // TODO: we should not need to capture the order status from the XML, + const defaultStatus = process.env.DEFAULT_PARTS_ORDER_STATUS || ""; + + // TODO: This will be the username of the bodyshop user used for the integration. + const userEmail = req.headers["x-hasura-user-id"] || "system@example.com"; + + // group by vendor const poGroups = {}; damageLines.forEach((line) => { - const pt = line.PartInfo.PartType; - const qty = parseInt(line.PartInfo.Quantity || 0, 10); + const pt = line.PartInfo?.PartType; + const qty = parseInt(line.PartInfo?.Quantity || 0, 10); if (["PAN", "PAC", "PAM", "PAA"].includes(pt) && qty > 0) { - const vendorid = line.PartInfo?.NonOEM?.SupplierRefNum || process.env.DEFAULT_VENDOR_ID; - if (!poGroups[vendorid]) poGroups[vendorid] = []; - poGroups[vendorid].push({ + // TODO: We should not need to capture the vendor ID from the XML + const vid = line.PartInfo?.NonOEM?.SupplierRefNum || process.env.DEFAULT_VENDOR_ID || null; + (poGroups[vid] = poGroups[vid] || []).push({ line, unq_seq: parseInt(line.UniqueSequenceNum, 10) }); @@ -323,18 +363,27 @@ const partsManagementVehicleDamageEstimateAddRq = async (req, res) => { jobid: jobId, vendorid, order_number: `${clm_no}-${entries[0].line.LineNum}`, + order_date: currentDate, + orderedby: "XML-API", + user_email: userEmail, + status: defaultStatus, parts_order_lines: { - data: entries.map(({ line, unq_seq }) => ({ - job_line_id: insertedMap[unq_seq], - part_type: line.PartInfo.PartType, - quantity: parseInt(line.PartInfo.Quantity || 0, 10), - act_price: parseFloat(line.PartInfo.PartPrice || 0), - db_price: parseFloat(line.PartInfo.PartPrice || 0), - line_desc: line.LineDesc, - non_oem_part_num: line.PartInfo?.NonOEM?.NonOEMPartNum || null, - non_oem_part_price: parseFloat(line.PartInfo?.NonOEM?.NonOEMPartPrice || 0), - part_selected_ind: line.PartInfo?.NonOEM?.PartSelectedInd === "1" - })) + data: entries.map(({ line, unq_seq }) => { + const pi = line.PartInfo || {}; + const nonOEM = pi.NonOEM || {}; + return { + job_line_id: seqToId[unq_seq], + line_desc: line.LineDesc || null, + oem_partno: pi.OEMPartNum || null, + db_price: parseFloat(pi.PartPrice || 0), + act_price: parseFloat(pi.PartPrice || 0), + line_remarks: line.LineMemo || null, + quantity: parseInt(pi.Quantity || 1, 10), + part_type: pi.PartType || null, + cost: nonOEM.NonOEMPartPrice ? parseFloat(nonOEM.NonOEMPartPrice) : null, + cm_received: null + }; + }) } })); diff --git a/server/integrations/partsManagement/sampleBody.xml b/server/integrations/partsManagement/sampleBody.xml new file mode 100644 index 000000000..53926ddbe --- /dev/null +++ b/server/integrations/partsManagement/sampleBody.xml @@ -0,0 +1,340 @@ + + + + 12345 + + + 17e5ccc4-cdfb-4cf3-a08d-ecfa8d145d6f + CLM123 + + + + + SV + 1 + + + VN + 1 + + + + RO Number + RO-987 + + + Job UUID + abcde-12345-uuid + + + Include OEM where possible + 2025-06-18T12:00:00Z + + + + + + 1 + Estimate + 2025-06-18T11:30:00Z + 2025-06-18T11:29:00Z + + + 2025-06-25T17:00:00Z + 2025-06-22T09:00:00Z + + + + + + CLM123 + Open + + POL456 + + + + 500.00 + + + + + 1500.50 + + + + + + + + + + John + Doe + + + AL +
+ 100 Main St + Metropolis + NY + 10001 + USA +
+
+
+ + + CP + 5551234567 + + + EM + john.doe@example.com + + +
+
+ + + + + + + Jane + Smith + + + + + EM + jane.smith@example.com + + + + EST001 + + + + + + + AutoFix + + AL +
+ 200 Repair Rd + Mechanicsburg + PA + 17055 + USA +
+
+
+ + + WP + 5559876543 + + + FX + 5559876544 + + +
+
+ + + + + + + Alice + Johnson + + + + + + + + + + PartsRUs + + + + + + + + + XmlSender + + + + + + + + + ThirdPartyAdmin + + + TPA + +
+ + + + + LABOR + 100.0 + + 1 + 50.0 + + + + + + + + 1HGCM82633A004352 + + + ABC1234 + CA + + + 2020 + Honda + Accord + Sedan + 2.0L + 2019-10-10 + Sport + Gasoline + + + + Blue + + + + Y + + + + + + 1 + 1001 + 0 + 0 + 1 + 0 + Draft + Front Bumper + + PAA + 1 + 200.00 + OEM123 + + NONOEM123 + 180.00 + VEND1 + 1 + + 1 + OV + C + 0 + 0 + 0 + false + + + LAB + OP1 + 2.5 + 250.00 + + Replace bumper + + + + + 2 + 1002 + 0 + 0 + 0 + 0 + Draft + Windshield + + PAG + 1 + 572.06 + 5610104082 + + 5610104082 + 572.06 + VEND2 + 1 + + 1 + NU + 1 + 0 + 0 + false + + + LAB + OP11 + 3.7 + 370.00 + + Replace windshield + + + + + 3 + 1003 + 0 + 0 + 1 + 0 + Draft + Sublet Upholstery Repair + + UpholsteryCo + 200.00 + 2.0 + + Stitching match required + + + + + 4 + 1004 + 0 + 0 + 1 + 0 + Draft + Dent Repair Door + + LAD + OP3 + 1.5 + 150.00 + + Requires touch-up + +
diff --git a/server/routes/intergrationRoutes.js b/server/routes/intergrationRoutes.js index 38b8d44fb..4af112a97 100644 --- a/server/routes/intergrationRoutes.js +++ b/server/routes/intergrationRoutes.js @@ -1,5 +1,6 @@ const express = require("express"); const router = express.Router(); +const bodyParser = require("body-parser"); // Add body-parser dependency // Pull secrets from env const { VSSTA_INTEGRATION_SECRET, PARTS_MANAGEMENT_INTEGRATION_SECRET } = process.env; @@ -20,12 +21,15 @@ if (typeof PARTS_MANAGEMENT_INTEGRATION_SECRET === "string" && PARTS_MANAGEMENT_ const partsManagementIntegrationMiddleware = require("../middleware/partsManagementIntegrationMiddleware"); const partsManagementVehicleDamageEstimateAddRq = require("../integrations/partsManagement/partsManagementVehicleDamageEstimateAddRq"); - router.post("/parts-management/provision", partsManagementIntegrationMiddleware, partsManagementProvisioning); + // Add XML parsing middleware for the VehicleDamageEstimateAddRq route router.post( "/parts-management/VehicleDamageEstimateAddRq", + bodyParser.raw({ type: "application/xml", limit: "10mb" }), // Parse XML body partsManagementIntegrationMiddleware, partsManagementVehicleDamageEstimateAddRq ); + + router.post("/parts-management/provision", partsManagementIntegrationMiddleware, partsManagementProvisioning); } else { console.warn("PARTS_MANAGEMENT_INTEGRATION_SECRET is not set — skipping /parts-management/provision route"); }