From 3dc31d5ddda79910aba748848558517469eb4686 Mon Sep 17 00:00:00 2001 From: OJ Abba Date: Thu, 13 Feb 2025 12:43:02 +0000 Subject: [PATCH 01/22] [Chore] Bump `@deskpro/app-sdk` to version 6.0.3 --- package.json | 2 +- pnpm-lock.yaml | 32 ++++++++++++++++---------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 82785de..249bf83 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "bumpManifestVer": "node ./bin/bumpManifestVer.js" }, "dependencies": { - "@deskpro/app-sdk": "^5.1.1", + "@deskpro/app-sdk": "^6.0.3", "@deskpro/deskpro-ui": "^8.2.0", "@heroicons/react": "1.0.6", "@tanstack/react-query": "^4.36.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 93b922b..329b273 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@deskpro/app-sdk': - specifier: ^5.1.1 - version: 5.1.1(@deskpro/deskpro-ui@8.2.0(@types/web@0.0.86)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2) + specifier: ^6.0.3 + version: 6.0.3(@deskpro/deskpro-ui@8.2.0(@types/web@0.0.86)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2) '@deskpro/deskpro-ui': specifier: ^8.2.0 version: 8.2.0(@types/web@0.0.86)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) @@ -122,7 +122,7 @@ importers: version: 5.7.2 vite: specifier: ^6.0.11 - version: 6.0.11(@types/node@22.10.5)(sass@1.83.1) + version: 6.0.11(@types/node@22.10.5)(sass@1.84.0) packages: @@ -326,8 +326,8 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@deskpro/app-sdk@5.1.1': - resolution: {integrity: sha512-GVwjVb/8EX4aBHtDu7YqWKpVPxslyFy0nAEjbo59hycy73KPqV0UdOCQNM5LasZnrC1U6epV/BYVQrUDplTzuw==} + '@deskpro/app-sdk@6.0.3': + resolution: {integrity: sha512-7IYRxJ6SRCKrsSFO5bZwGYhRoEvX08LPv0pDGIxhNejrqp+eaDb8hjobKnPKwK22pRNJ/riExGPsbGXeSuuCZQ==} engines: {node: '>=20.0.0'} peerDependencies: '@deskpro/deskpro-ui': ^8.0.0 @@ -2278,8 +2278,8 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - libphonenumber-js@1.11.17: - resolution: {integrity: sha512-Jr6v8thd5qRlOlc6CslSTzGzzQW03uiscab7KHQZX1Dfo4R6n6FDhZ0Hri6/X7edLIDv9gl4VMZXhxTjLnl0VQ==} + libphonenumber-js@1.11.19: + resolution: {integrity: sha512-bW/Yp/9dod6fmyR+XqSUL1N5JE7QRxQ3KrBIbYS1FTv32e5i3SEtQVX+71CYNv8maWNSOgnlCoNp9X78f/cKiA==} lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -2727,8 +2727,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sass@1.83.1: - resolution: {integrity: sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA==} + sass@1.84.0: + resolution: {integrity: sha512-XDAbhEPJRxi7H0SxrnOpiXFQoUJHwkR2u3Zc4el+fK/Tt5Hpzw5kkQ59qVDfvdaUq6gCrEZIbySFBM2T9DNKHg==} engines: {node: '>=14.0.0'} hasBin: true @@ -3410,7 +3410,7 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@deskpro/app-sdk@5.1.1(@deskpro/deskpro-ui@8.2.0(@types/web@0.0.86)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2)': + '@deskpro/app-sdk@6.0.3(@deskpro/deskpro-ui@8.2.0(@types/web@0.0.86)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2)': dependencies: '@deskpro/deskpro-ui': 8.2.0(@types/web@0.0.86)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@fortawesome/fontawesome-svg-core': 6.7.2 @@ -3426,7 +3426,7 @@ snapshots: fuse.js: 7.0.0 handlebars: 4.7.7 i18n-iso-countries: 7.13.0 - libphonenumber-js: 1.11.17 + libphonenumber-js: 1.11.19 modern-normalize: 1.1.0 penpal: 6.2.1 react: 18.3.1 @@ -3435,7 +3435,7 @@ snapshots: react-flatpickr: 3.10.7(react@18.3.1) react-intl: 5.25.1(react@18.3.1)(typescript@5.7.2) regenerator-runtime: 0.14.1 - sass: 1.83.1 + sass: 1.84.0 shortcut-buttons-flatpickr: 0.4.0 styled-components: 6.1.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1) ts-pattern: 4.3.0 @@ -5762,7 +5762,7 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - libphonenumber-js@1.11.17: {} + libphonenumber-js@1.11.19: {} lines-and-columns@1.2.4: {} @@ -6191,7 +6191,7 @@ snapshots: safer-buffer@2.1.2: {} - sass@1.83.1: + sass@1.84.0: dependencies: chokidar: 4.0.3 immutable: 5.0.3 @@ -6487,7 +6487,7 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - vite@6.0.11(@types/node@22.10.5)(sass@1.83.1): + vite@6.0.11(@types/node@22.10.5)(sass@1.84.0): dependencies: esbuild: 0.24.2 postcss: 8.4.49 @@ -6495,7 +6495,7 @@ snapshots: optionalDependencies: '@types/node': 22.10.5 fsevents: 2.3.3 - sass: 1.83.1 + sass: 1.84.0 w3c-xmlserializer@4.0.0: dependencies: From aa641bda4bd648888ba77434a68d7b4c2af16730 Mon Sep 17 00:00:00 2001 From: OJ Abba Date: Thu, 13 Feb 2025 12:45:58 +0000 Subject: [PATCH 02/22] [Chore] Bump `esbuild` to version 0.25.0 (SC-180924) --- package.json | 7 +- pnpm-lock.yaml | 211 +++++++++++++++++++++++++------------------------ 2 files changed, 113 insertions(+), 105 deletions(-) diff --git a/package.json b/package.json index 249bf83..fcf3645 100644 --- a/package.json +++ b/package.json @@ -54,5 +54,10 @@ "ts-jest": "^27.1.5", "typescript": "^5.7.2", "vite": "^6.0.11" + }, + "pnpm": { + "overrides": { + "esbuild": "^0.25.0" + } } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 329b273..13f1b86 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,9 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + esbuild: ^0.25.0 + importers: .: @@ -360,152 +363,152 @@ packages: '@emotion/unitless@0.8.1': resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} - '@esbuild/aix-ppc64@0.24.2': - resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + '@esbuild/aix-ppc64@0.25.0': + resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.24.2': - resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + '@esbuild/android-arm64@0.25.0': + resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.24.2': - resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + '@esbuild/android-arm@0.25.0': + resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.24.2': - resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + '@esbuild/android-x64@0.25.0': + resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.24.2': - resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + '@esbuild/darwin-arm64@0.25.0': + resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.24.2': - resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + '@esbuild/darwin-x64@0.25.0': + resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.24.2': - resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + '@esbuild/freebsd-arm64@0.25.0': + resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.2': - resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + '@esbuild/freebsd-x64@0.25.0': + resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.24.2': - resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + '@esbuild/linux-arm64@0.25.0': + resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.24.2': - resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + '@esbuild/linux-arm@0.25.0': + resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.24.2': - resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + '@esbuild/linux-ia32@0.25.0': + resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.24.2': - resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + '@esbuild/linux-loong64@0.25.0': + resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.24.2': - resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + '@esbuild/linux-mips64el@0.25.0': + resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.24.2': - resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + '@esbuild/linux-ppc64@0.25.0': + resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.24.2': - resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + '@esbuild/linux-riscv64@0.25.0': + resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.24.2': - resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + '@esbuild/linux-s390x@0.25.0': + resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.24.2': - resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + '@esbuild/linux-x64@0.25.0': + resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.24.2': - resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + '@esbuild/netbsd-arm64@0.25.0': + resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.2': - resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + '@esbuild/netbsd-x64@0.25.0': + resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.24.2': - resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + '@esbuild/openbsd-arm64@0.25.0': + resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.2': - resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + '@esbuild/openbsd-x64@0.25.0': + resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.24.2': - resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + '@esbuild/sunos-x64@0.25.0': + resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.24.2': - resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + '@esbuild/win32-arm64@0.25.0': + resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.24.2': - resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + '@esbuild/win32-ia32@0.25.0': + resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.24.2': - resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + '@esbuild/win32-x64@0.25.0': + resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1583,8 +1586,8 @@ packages: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} - esbuild@0.24.2: - resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + esbuild@0.25.0: + resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} engines: {node: '>=18'} hasBin: true @@ -3490,79 +3493,79 @@ snapshots: '@emotion/unitless@0.8.1': {} - '@esbuild/aix-ppc64@0.24.2': + '@esbuild/aix-ppc64@0.25.0': optional: true - '@esbuild/android-arm64@0.24.2': + '@esbuild/android-arm64@0.25.0': optional: true - '@esbuild/android-arm@0.24.2': + '@esbuild/android-arm@0.25.0': optional: true - '@esbuild/android-x64@0.24.2': + '@esbuild/android-x64@0.25.0': optional: true - '@esbuild/darwin-arm64@0.24.2': + '@esbuild/darwin-arm64@0.25.0': optional: true - '@esbuild/darwin-x64@0.24.2': + '@esbuild/darwin-x64@0.25.0': optional: true - '@esbuild/freebsd-arm64@0.24.2': + '@esbuild/freebsd-arm64@0.25.0': optional: true - '@esbuild/freebsd-x64@0.24.2': + '@esbuild/freebsd-x64@0.25.0': optional: true - '@esbuild/linux-arm64@0.24.2': + '@esbuild/linux-arm64@0.25.0': optional: true - '@esbuild/linux-arm@0.24.2': + '@esbuild/linux-arm@0.25.0': optional: true - '@esbuild/linux-ia32@0.24.2': + '@esbuild/linux-ia32@0.25.0': optional: true - '@esbuild/linux-loong64@0.24.2': + '@esbuild/linux-loong64@0.25.0': optional: true - '@esbuild/linux-mips64el@0.24.2': + '@esbuild/linux-mips64el@0.25.0': optional: true - '@esbuild/linux-ppc64@0.24.2': + '@esbuild/linux-ppc64@0.25.0': optional: true - '@esbuild/linux-riscv64@0.24.2': + '@esbuild/linux-riscv64@0.25.0': optional: true - '@esbuild/linux-s390x@0.24.2': + '@esbuild/linux-s390x@0.25.0': optional: true - '@esbuild/linux-x64@0.24.2': + '@esbuild/linux-x64@0.25.0': optional: true - '@esbuild/netbsd-arm64@0.24.2': + '@esbuild/netbsd-arm64@0.25.0': optional: true - '@esbuild/netbsd-x64@0.24.2': + '@esbuild/netbsd-x64@0.25.0': optional: true - '@esbuild/openbsd-arm64@0.24.2': + '@esbuild/openbsd-arm64@0.25.0': optional: true - '@esbuild/openbsd-x64@0.24.2': + '@esbuild/openbsd-x64@0.25.0': optional: true - '@esbuild/sunos-x64@0.24.2': + '@esbuild/sunos-x64@0.25.0': optional: true - '@esbuild/win32-arm64@0.24.2': + '@esbuild/win32-arm64@0.25.0': optional: true - '@esbuild/win32-ia32@0.24.2': + '@esbuild/win32-ia32@0.25.0': optional: true - '@esbuild/win32-x64@0.24.2': + '@esbuild/win32-x64@0.25.0': optional: true '@eslint/eslintrc@1.4.1': @@ -4777,33 +4780,33 @@ snapshots: dependencies: es-errors: 1.3.0 - esbuild@0.24.2: + esbuild@0.25.0: optionalDependencies: - '@esbuild/aix-ppc64': 0.24.2 - '@esbuild/android-arm': 0.24.2 - '@esbuild/android-arm64': 0.24.2 - '@esbuild/android-x64': 0.24.2 - '@esbuild/darwin-arm64': 0.24.2 - '@esbuild/darwin-x64': 0.24.2 - '@esbuild/freebsd-arm64': 0.24.2 - '@esbuild/freebsd-x64': 0.24.2 - '@esbuild/linux-arm': 0.24.2 - '@esbuild/linux-arm64': 0.24.2 - '@esbuild/linux-ia32': 0.24.2 - '@esbuild/linux-loong64': 0.24.2 - '@esbuild/linux-mips64el': 0.24.2 - '@esbuild/linux-ppc64': 0.24.2 - '@esbuild/linux-riscv64': 0.24.2 - '@esbuild/linux-s390x': 0.24.2 - '@esbuild/linux-x64': 0.24.2 - '@esbuild/netbsd-arm64': 0.24.2 - '@esbuild/netbsd-x64': 0.24.2 - '@esbuild/openbsd-arm64': 0.24.2 - '@esbuild/openbsd-x64': 0.24.2 - '@esbuild/sunos-x64': 0.24.2 - '@esbuild/win32-arm64': 0.24.2 - '@esbuild/win32-ia32': 0.24.2 - '@esbuild/win32-x64': 0.24.2 + '@esbuild/aix-ppc64': 0.25.0 + '@esbuild/android-arm': 0.25.0 + '@esbuild/android-arm64': 0.25.0 + '@esbuild/android-x64': 0.25.0 + '@esbuild/darwin-arm64': 0.25.0 + '@esbuild/darwin-x64': 0.25.0 + '@esbuild/freebsd-arm64': 0.25.0 + '@esbuild/freebsd-x64': 0.25.0 + '@esbuild/linux-arm': 0.25.0 + '@esbuild/linux-arm64': 0.25.0 + '@esbuild/linux-ia32': 0.25.0 + '@esbuild/linux-loong64': 0.25.0 + '@esbuild/linux-mips64el': 0.25.0 + '@esbuild/linux-ppc64': 0.25.0 + '@esbuild/linux-riscv64': 0.25.0 + '@esbuild/linux-s390x': 0.25.0 + '@esbuild/linux-x64': 0.25.0 + '@esbuild/netbsd-arm64': 0.25.0 + '@esbuild/netbsd-x64': 0.25.0 + '@esbuild/openbsd-arm64': 0.25.0 + '@esbuild/openbsd-x64': 0.25.0 + '@esbuild/sunos-x64': 0.25.0 + '@esbuild/win32-arm64': 0.25.0 + '@esbuild/win32-ia32': 0.25.0 + '@esbuild/win32-x64': 0.25.0 escalade@3.2.0: {} @@ -6489,7 +6492,7 @@ snapshots: vite@6.0.11(@types/node@22.10.5)(sass@1.84.0): dependencies: - esbuild: 0.24.2 + esbuild: 0.25.0 postcss: 8.4.49 rollup: 4.32.1 optionalDependencies: From 6bf3aa1ead655e6a6a0bd2224b84e3b9d180b9bc Mon Sep 17 00:00:00 2001 From: OJ Abba Date: Wed, 19 Feb 2025 13:09:16 +0000 Subject: [PATCH 03/22] [Chore] Remove `esbuild` override --- package.json | 5 -- pnpm-lock.yaml | 211 ++++++++++++++++++++++++------------------------- 2 files changed, 104 insertions(+), 112 deletions(-) diff --git a/package.json b/package.json index fcf3645..3040428 100644 --- a/package.json +++ b/package.json @@ -54,10 +54,5 @@ "ts-jest": "^27.1.5", "typescript": "^5.7.2", "vite": "^6.0.11" - }, - "pnpm": { - "overrides": { - "esbuild": "^0.25.0" - } } } \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 13f1b86..329b273 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,9 +4,6 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -overrides: - esbuild: ^0.25.0 - importers: .: @@ -363,152 +360,152 @@ packages: '@emotion/unitless@0.8.1': resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} - '@esbuild/aix-ppc64@0.25.0': - resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} + '@esbuild/aix-ppc64@0.24.2': + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.0': - resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} + '@esbuild/android-arm64@0.24.2': + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.0': - resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} + '@esbuild/android-arm@0.24.2': + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.0': - resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} + '@esbuild/android-x64@0.24.2': + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.0': - resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} + '@esbuild/darwin-arm64@0.24.2': + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.0': - resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} + '@esbuild/darwin-x64@0.24.2': + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.0': - resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} + '@esbuild/freebsd-arm64@0.24.2': + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.0': - resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} + '@esbuild/freebsd-x64@0.24.2': + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.0': - resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} + '@esbuild/linux-arm64@0.24.2': + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.0': - resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} + '@esbuild/linux-arm@0.24.2': + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.0': - resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} + '@esbuild/linux-ia32@0.24.2': + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.0': - resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} + '@esbuild/linux-loong64@0.24.2': + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.0': - resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} + '@esbuild/linux-mips64el@0.24.2': + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.0': - resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} + '@esbuild/linux-ppc64@0.24.2': + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.0': - resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} + '@esbuild/linux-riscv64@0.24.2': + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.0': - resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} + '@esbuild/linux-s390x@0.24.2': + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.0': - resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} + '@esbuild/linux-x64@0.24.2': + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.0': - resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} + '@esbuild/netbsd-arm64@0.24.2': + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.0': - resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} + '@esbuild/netbsd-x64@0.24.2': + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.0': - resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} + '@esbuild/openbsd-arm64@0.24.2': + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.0': - resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} + '@esbuild/openbsd-x64@0.24.2': + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.25.0': - resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} + '@esbuild/sunos-x64@0.24.2': + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.0': - resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} + '@esbuild/win32-arm64@0.24.2': + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.0': - resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} + '@esbuild/win32-ia32@0.24.2': + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.0': - resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} + '@esbuild/win32-x64@0.24.2': + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1586,8 +1583,8 @@ packages: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} - esbuild@0.25.0: - resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} + esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} engines: {node: '>=18'} hasBin: true @@ -3493,79 +3490,79 @@ snapshots: '@emotion/unitless@0.8.1': {} - '@esbuild/aix-ppc64@0.25.0': + '@esbuild/aix-ppc64@0.24.2': optional: true - '@esbuild/android-arm64@0.25.0': + '@esbuild/android-arm64@0.24.2': optional: true - '@esbuild/android-arm@0.25.0': + '@esbuild/android-arm@0.24.2': optional: true - '@esbuild/android-x64@0.25.0': + '@esbuild/android-x64@0.24.2': optional: true - '@esbuild/darwin-arm64@0.25.0': + '@esbuild/darwin-arm64@0.24.2': optional: true - '@esbuild/darwin-x64@0.25.0': + '@esbuild/darwin-x64@0.24.2': optional: true - '@esbuild/freebsd-arm64@0.25.0': + '@esbuild/freebsd-arm64@0.24.2': optional: true - '@esbuild/freebsd-x64@0.25.0': + '@esbuild/freebsd-x64@0.24.2': optional: true - '@esbuild/linux-arm64@0.25.0': + '@esbuild/linux-arm64@0.24.2': optional: true - '@esbuild/linux-arm@0.25.0': + '@esbuild/linux-arm@0.24.2': optional: true - '@esbuild/linux-ia32@0.25.0': + '@esbuild/linux-ia32@0.24.2': optional: true - '@esbuild/linux-loong64@0.25.0': + '@esbuild/linux-loong64@0.24.2': optional: true - '@esbuild/linux-mips64el@0.25.0': + '@esbuild/linux-mips64el@0.24.2': optional: true - '@esbuild/linux-ppc64@0.25.0': + '@esbuild/linux-ppc64@0.24.2': optional: true - '@esbuild/linux-riscv64@0.25.0': + '@esbuild/linux-riscv64@0.24.2': optional: true - '@esbuild/linux-s390x@0.25.0': + '@esbuild/linux-s390x@0.24.2': optional: true - '@esbuild/linux-x64@0.25.0': + '@esbuild/linux-x64@0.24.2': optional: true - '@esbuild/netbsd-arm64@0.25.0': + '@esbuild/netbsd-arm64@0.24.2': optional: true - '@esbuild/netbsd-x64@0.25.0': + '@esbuild/netbsd-x64@0.24.2': optional: true - '@esbuild/openbsd-arm64@0.25.0': + '@esbuild/openbsd-arm64@0.24.2': optional: true - '@esbuild/openbsd-x64@0.25.0': + '@esbuild/openbsd-x64@0.24.2': optional: true - '@esbuild/sunos-x64@0.25.0': + '@esbuild/sunos-x64@0.24.2': optional: true - '@esbuild/win32-arm64@0.25.0': + '@esbuild/win32-arm64@0.24.2': optional: true - '@esbuild/win32-ia32@0.25.0': + '@esbuild/win32-ia32@0.24.2': optional: true - '@esbuild/win32-x64@0.25.0': + '@esbuild/win32-x64@0.24.2': optional: true '@eslint/eslintrc@1.4.1': @@ -4780,33 +4777,33 @@ snapshots: dependencies: es-errors: 1.3.0 - esbuild@0.25.0: + esbuild@0.24.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.0 - '@esbuild/android-arm': 0.25.0 - '@esbuild/android-arm64': 0.25.0 - '@esbuild/android-x64': 0.25.0 - '@esbuild/darwin-arm64': 0.25.0 - '@esbuild/darwin-x64': 0.25.0 - '@esbuild/freebsd-arm64': 0.25.0 - '@esbuild/freebsd-x64': 0.25.0 - '@esbuild/linux-arm': 0.25.0 - '@esbuild/linux-arm64': 0.25.0 - '@esbuild/linux-ia32': 0.25.0 - '@esbuild/linux-loong64': 0.25.0 - '@esbuild/linux-mips64el': 0.25.0 - '@esbuild/linux-ppc64': 0.25.0 - '@esbuild/linux-riscv64': 0.25.0 - '@esbuild/linux-s390x': 0.25.0 - '@esbuild/linux-x64': 0.25.0 - '@esbuild/netbsd-arm64': 0.25.0 - '@esbuild/netbsd-x64': 0.25.0 - '@esbuild/openbsd-arm64': 0.25.0 - '@esbuild/openbsd-x64': 0.25.0 - '@esbuild/sunos-x64': 0.25.0 - '@esbuild/win32-arm64': 0.25.0 - '@esbuild/win32-ia32': 0.25.0 - '@esbuild/win32-x64': 0.25.0 + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 escalade@3.2.0: {} @@ -6492,7 +6489,7 @@ snapshots: vite@6.0.11(@types/node@22.10.5)(sass@1.84.0): dependencies: - esbuild: 0.25.0 + esbuild: 0.24.2 postcss: 8.4.49 rollup: 4.32.1 optionalDependencies: From f67b8204b612ef091a8c1a7ee8d9352fb4a95466 Mon Sep 17 00:00:00 2001 From: OJ Abba Date: Mon, 3 Mar 2025 13:10:14 +0000 Subject: [PATCH 04/22] [Feat] Introduce absolute imports --- tsconfig.json | 6 +++++- vite.config.ts | 9 ++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index 87248a1..492399f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,7 +15,11 @@ "isolatedModules": true, "noEmit": true, "jsx": "react-jsx", - "types": ["vite/client", "jest", "@testing-library/jest-dom", "@typescript/lib-dom"] + "types": ["vite/client", "jest", "@testing-library/jest-dom", "@typescript/lib-dom"], + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } }, "include": ["./src"] } diff --git a/vite.config.ts b/vite.config.ts index 345ace9..e35dab9 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,6 +1,8 @@ import { defineConfig } from "vite"; -import react from "@vitejs/plugin-react"; import copy from "rollup-plugin-copy"; +import path from "path"; +import react from "@vitejs/plugin-react"; + // https://vitejs.dev/config/ export default defineConfig({ @@ -9,6 +11,11 @@ export default defineConfig({ server:{ allowedHosts: true }, + resolve:{ + alias: { + "@": path.resolve(__dirname, "src"), + }, + }, build: { rollupOptions: { onwarn(warning, warn) { From 8819977a1f5f5a8ba947664b8bffab6830f14ffb Mon Sep 17 00:00:00 2001 From: OJ Abba Date: Mon, 3 Mar 2025 13:11:34 +0000 Subject: [PATCH 05/22] [Chore] Update Vite server port --- vite.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/vite.config.ts b/vite.config.ts index e35dab9..4f51e72 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -9,6 +9,7 @@ export default defineConfig({ base: "", plugins: [react()], server:{ + port: 3003, allowedHosts: true }, resolve:{ From f2f902f9cd7b7f47103a15564765f9dd46ec41fc Mon Sep 17 00:00:00 2001 From: OJ Abba Date: Mon, 3 Mar 2025 16:25:39 +0000 Subject: [PATCH 06/22] [Feat] Add new SurveyMonkey api functions --- src/api/SurveyMonkey/getAccessToken.ts | 32 +++++++++++++++++++++++++ src/api/SurveyMonkey/getCurrentUser.ts | 33 ++++++++++++++++++++++++++ src/api/SurveyMonkey/index.ts | 2 ++ 3 files changed, 67 insertions(+) create mode 100644 src/api/SurveyMonkey/getAccessToken.ts create mode 100644 src/api/SurveyMonkey/getCurrentUser.ts create mode 100644 src/api/SurveyMonkey/index.ts diff --git a/src/api/SurveyMonkey/getAccessToken.ts b/src/api/SurveyMonkey/getAccessToken.ts new file mode 100644 index 0000000..7ebc9db --- /dev/null +++ b/src/api/SurveyMonkey/getAccessToken.ts @@ -0,0 +1,32 @@ +import { IDeskproClient, proxyFetch } from "@deskpro/app-sdk"; + +export default async function getAccessToken( + client: IDeskproClient, + code: string, + callbackURL: string +) { + try { + const fetch = await proxyFetch(client); + + const response = await fetch(`https://api.surveymonkey.com/oauth/token`, { + method: "POST", + headers: { "Content-Type": "application/x-www-form-urlencoded" }, + body: new URLSearchParams({ + grant_type: "authorization_code", + client_id: "__client_id__", + client_secret: "__client_secret__", + code: code, + redirect_uri: callbackURL, + }).toString() + }); + + if (!response.ok) { + throw new Error("Failed to fetch access token"); + } + + const data = await response.json(); + return data; + } catch (error) { + throw new Error("Error fetching access token"); + } +} \ No newline at end of file diff --git a/src/api/SurveyMonkey/getCurrentUser.ts b/src/api/SurveyMonkey/getCurrentUser.ts new file mode 100644 index 0000000..242eb54 --- /dev/null +++ b/src/api/SurveyMonkey/getCurrentUser.ts @@ -0,0 +1,33 @@ +import { ACCESS_TOKEN_PATH, OAUTH2_ACCESS_TOKEN_PATH } from "@/constants/deskpro"; +import { adminGenericProxyFetch, IDeskproClient, proxyFetch as deskproProxyFetch } from "@deskpro/app-sdk"; +import { isResponseError } from "../api"; +import { User } from "@/types/user"; + +/** + * Returns the data of the active SurveyMonkey user + * + * @param client The Deskpro client + * @param accessToken Optional access token used for authentication (SHOULD ONLY BE USED IN THE ADMIN DRAWER) + */ +export default async function getCurrentUser(client: IDeskproClient, accessToken?: string): Promise { + try { + const proxyFetch = await (accessToken ? adminGenericProxyFetch : deskproProxyFetch)(client) + const isUsingOAuth2 = (await client.getUserState("isUsingOAuth"))[0]?.data + + const response = await proxyFetch(`https://api.surveymonkey.net/v3/users/me`, { + headers: { + method: "GET", + "Content-Type": "application/json", + // Set Authorization header based on the available credentials (Access token or OAuth2 token) + Authorization: ` Bearer ${accessToken ?? (isUsingOAuth2 ? `[user[${OAUTH2_ACCESS_TOKEN_PATH}]]` : ACCESS_TOKEN_PATH)}`, + }, + }); + + if (isResponseError(response)) { + throw new Error(await response.text()); + } + return await response.json(); + } catch { + return null + } +} diff --git a/src/api/SurveyMonkey/index.ts b/src/api/SurveyMonkey/index.ts new file mode 100644 index 0000000..600fc7e --- /dev/null +++ b/src/api/SurveyMonkey/index.ts @@ -0,0 +1,2 @@ +export {default as getCurrentUser} from "./getCurrentUser" +export {default as getAccessToken} from "./getAccessToken" \ No newline at end of file From 219ee015da27057e9a991a7f5ac7e27d139ddb27 Mon Sep 17 00:00:00 2001 From: OJ Abba Date: Mon, 3 Mar 2025 16:27:16 +0000 Subject: [PATCH 07/22] [Feat] Add OAuth constants --- src/constants/deskpro.ts | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/constants/deskpro.ts diff --git a/src/constants/deskpro.ts b/src/constants/deskpro.ts new file mode 100644 index 0000000..229c578 --- /dev/null +++ b/src/constants/deskpro.ts @@ -0,0 +1,4 @@ +export const OAUTH2_ACCESS_TOKEN_PATH = "oauth2/access_token" +export const OAUTH2_REFRESH_TOKEN_PATH = "oauth2/refresh_token" + +export const ACCESS_TOKEN_PATH = "__access_token__" From fd1273f1300be1beab762ed70f6c1a9c857679f4 Mon Sep 17 00:00:00 2001 From: OJ Abba Date: Mon, 3 Mar 2025 16:28:38 +0000 Subject: [PATCH 08/22] [Feat] Create `useLogout` hook --- src/hooks/deskpro/index.ts | 1 + src/hooks/deskpro/useLogout.ts | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 src/hooks/deskpro/index.ts create mode 100644 src/hooks/deskpro/useLogout.ts diff --git a/src/hooks/deskpro/index.ts b/src/hooks/deskpro/index.ts new file mode 100644 index 0000000..6d8c1d9 --- /dev/null +++ b/src/hooks/deskpro/index.ts @@ -0,0 +1 @@ +export { useLogout } from "./useLogout" \ No newline at end of file diff --git a/src/hooks/deskpro/useLogout.ts b/src/hooks/deskpro/useLogout.ts new file mode 100644 index 0000000..eb71353 --- /dev/null +++ b/src/hooks/deskpro/useLogout.ts @@ -0,0 +1,25 @@ +import { OAUTH2_ACCESS_TOKEN_PATH } from "@/constants/deskpro"; +import { useCallback } from "react"; +import { useDeskproAppClient } from "@deskpro/app-sdk"; +import { useNavigate } from "react-router-dom"; + +export function useLogout() { + const navigate = useNavigate(); + const { client } = useDeskproAppClient(); + + const logoutActiveUser = useCallback(() => { + if (!client) { + return; + } + + client.setBadgeCount(0) + + client.deleteUserState(OAUTH2_ACCESS_TOKEN_PATH) + .catch(() => { }) + .finally(() => { + navigate("/login"); + }); + }, [client, navigate]); + + return { logoutActiveUser }; +} \ No newline at end of file From 9ca397dc365decc820c5ee3b9adac1fa357e251a Mon Sep 17 00:00:00 2001 From: OJ Abba Date: Mon, 3 Mar 2025 16:32:22 +0000 Subject: [PATCH 09/22] [Feat] Create "login" page --- src/pages/Login/LoginPage.tsx | 36 ++++++++++++ src/pages/Login/index.ts | 1 + src/pages/Login/useLogin.ts | 107 ++++++++++++++++++++++++++++++++++ 3 files changed, 144 insertions(+) create mode 100644 src/pages/Login/LoginPage.tsx create mode 100644 src/pages/Login/index.ts create mode 100644 src/pages/Login/useLogin.ts diff --git a/src/pages/Login/LoginPage.tsx b/src/pages/Login/LoginPage.tsx new file mode 100644 index 0000000..3358df1 --- /dev/null +++ b/src/pages/Login/LoginPage.tsx @@ -0,0 +1,36 @@ +import { AnchorButton, H3, Stack } from "@deskpro/deskpro-ui" +import { ErrorBlock } from "@/components/ErrorBlock" +import { FC } from "react" +import { useDeskproElements, useInitialisedDeskproAppClient } from "@deskpro/app-sdk" +import useLogin from "./useLogin" + +const LoginPage: FC = () => { + useDeskproElements(({ registerElement, clearElements }) => { + clearElements() + registerElement("refreshButton", { type: "refresh_button" }) + }) + + useInitialisedDeskproAppClient((client)=>{ + client.setTitle("Login") + }, []) + + const { onSignIn, authUrl, isLoading, error } = useLogin(); + + return ( + +

Log into your SurveyMonkey account.

+ + + {error && } +
+ ) +} + +export default LoginPage \ No newline at end of file diff --git a/src/pages/Login/index.ts b/src/pages/Login/index.ts new file mode 100644 index 0000000..f815230 --- /dev/null +++ b/src/pages/Login/index.ts @@ -0,0 +1 @@ +export { default } from "./LoginPage"; diff --git a/src/pages/Login/useLogin.ts b/src/pages/Login/useLogin.ts new file mode 100644 index 0000000..aad52fa --- /dev/null +++ b/src/pages/Login/useLogin.ts @@ -0,0 +1,107 @@ +import { ContextData, Settings } from "@/types/deskpro"; +import { createSearchParams, useNavigate } from "react-router-dom"; +import { getAccessToken, getCurrentUser } from "@/api/SurveyMonkey"; +import { OAUTH2_ACCESS_TOKEN_PATH, OAUTH2_REFRESH_TOKEN_PATH } from "@/constants/deskpro"; +import { OAuth2Result, useDeskproLatestAppContext, useInitialisedDeskproAppClient } from "@deskpro/app-sdk"; +import { useCallback, useState } from "react"; + +interface UseLogin { + onSignIn: () => void, + authUrl: string | null, + error: null | string, + isLoading: boolean, +}; + +export default function useLogin(): UseLogin { + const [authUrl, setAuthUrl] = useState(null) + const [error, setError] = useState(null) + const [isLoading, setIsLoading] = useState(false) + const navigate = useNavigate() + + const { context } = useDeskproLatestAppContext() + + const user = context?.data?.ticket?.primaryUser || context?.data?.user + + + useInitialisedDeskproAppClient(async (client) => { + if (context?.settings.use_deskpro_saas === undefined || !user) { + // Make sure settings have loaded. + return + } + + // Ensure they aren't using access tokens + if (context.settings.use_access_token === true) { + setError("Enable OAuth to access this page"); + return + + } + const mode = context?.settings.use_deskpro_saas ? 'global' : 'local'; + + const clientId = context?.settings.client_id; + if (mode === 'local' && typeof clientId !== 'string') { + // Local mode requires a clientId. + setError("A client ID is required"); + return + } + const oauth2 = mode === "local" ? + await client.startOauth2Local( + ({ state, callbackUrl }) => { + return `https://api.surveymonkey.com/oauth/authorize?${createSearchParams([ + ["client_id", clientId ?? ""], + ["state", state], + ["redirect_uri", callbackUrl], + ["response_type", "code"] + ])}`; + }, + /\bcode=(?[^&#]+)/, + async (code: string): Promise => { + // Extract the callback URL from the authorization URL + const url = new URL(oauth2.authorizationUrl); + const redirectUri = url.searchParams.get("redirect_uri"); + + if (!redirectUri) { + throw new Error("Failed to get callback URL"); + } + + const data = await getAccessToken(client, code, redirectUri); + + return { data } + } + ) + // Global Proxy Service + : await client.startOauth2Global("TW2mwcHyQwCmkrzNjgdMAQ"); + + setAuthUrl(oauth2.authorizationUrl) + setIsLoading(false) + + try { + const result = await oauth2.poll() + + await client.setUserState(OAUTH2_ACCESS_TOKEN_PATH, result.data.access_token, { backend: true }) + + if (result.data.refresh_token) { + await client.setUserState(OAUTH2_REFRESH_TOKEN_PATH, result.data.refresh_token, { backend: true }) + } + + const activeUser = await getCurrentUser(client) + + if (!activeUser) { + throw new Error("Error authenticating user") + } + + navigate("/home") + } catch (error) { + setError(error instanceof Error ? error.message : 'Unknown error'); + setIsLoading(false); + } + }, [setAuthUrl, context?.settings.use_deskpro_saas]) + + const onSignIn = useCallback(() => { + setIsLoading(true); + window.open(authUrl ?? "", '_blank'); + }, [setIsLoading, authUrl]); + + + return { authUrl, onSignIn, error, isLoading } + +} \ No newline at end of file From 18d5822039aa4f0cfdd1d0921bbe1648385defdb Mon Sep 17 00:00:00 2001 From: OJ Abba Date: Mon, 3 Mar 2025 16:35:21 +0000 Subject: [PATCH 10/22] [Feat] Add OAuth2/Global proxy settings --- manifest.json | 89 +++++++++++++++++++++++++++++---- src/pages/AdminCallbackPage.tsx | 51 +++++++++++++++++++ src/pages/VerifySettings.tsx | 41 ++++++++------- src/types/deskpro.ts | 31 ++++++++++++ src/types/settings.ts | 3 -- src/types/surveymonkey.ts | 12 +++++ 6 files changed, 195 insertions(+), 32 deletions(-) create mode 100644 src/pages/AdminCallbackPage.tsx create mode 100644 src/types/deskpro.ts delete mode 100644 src/types/settings.ts create mode 100644 src/types/surveymonkey.ts diff --git a/manifest.json b/manifest.json index f3453be..7ee0aee 100644 --- a/manifest.json +++ b/manifest.json @@ -8,31 +8,100 @@ "isSingleInstall": false, "hasDevMode": true, "serveUrl": "https://apps-cdn.deskpro-service.com/__name__/__version__", - "targets": [{ "target": "ticket_sidebar", "entrypoint": "index.html" }], + "secrets": "duigHU4j5LpEnl/z10+g9hlSrHOF6k2LIrpDyjiitWrP+9Axm1b7yofWi5PIAPzmUiwvP+SxlayYwmLGdc+Qq/qnsmzcZ4RVdd5gnqqhEv88w8skemjyFtk8/dMlrGfUY/prhhhm2Km3X5Y18+8cWVCCI0d36fKHuo33TgXdUg1QkezWeYflUj7PVCJgIARlXg6S/Rn65++O/6DMVXkxRP8r59Y0AhIUgJY9rxNRCneXUHG59cJ4Jx5OcHtbzIKNlpiWAfzsjzccNlveHSDGRzkiYraflh/YYMIWe1iheEa5+WvZpQidx4KAYqqrsYYkN1+1Nk5+Dh9C74pE+epoW5q+me4CcJR5CfAlMpMZnr32ecyJqkyWBmMk1swRnhlTNx7BEcmzy3xyAFscR/fhdJlQIkcbq9/YykRiIAKDAFmvLYhn4SbwVZMhlWTOvn2Ottt82HRr7lP6ZKZNkqaeuW63egzrowcJxR6KJRcDQqYrCQoLHOyK4wnqJ+XCU1DW4A2nAZJmTkykkgIwJt+eMKOmrErh9QArSibV+X6XBc14vUGRwed62GhzNoWZv/kU//gp8AZkwWRGhYbUQcxT+JPcN4HOqvJSPofJXTuDKZ6879oSO6S0mAuE87OzFWRKuGOhMgoXvwxzysXTnEDKsMOKZVsmlD3GWR/wReVk4q3OAGPpLo6z5f1Ly5PJtSA7KLhMUo37a+UEto6/H935oiSuHZQb1XYqvxT5Wm3k2EuFVMqqL9zxaUSKR6bbunX9mrL00lTRQTTNVjyj5bk6gcWc0oZFoZDlKbJCfS2al5pJMAsjZEFAdRtUi06WnHtKKpAYULbyBEFE+fSs9a7A9JuXyEXNYXha6c8biniO9yUr/XrKrOo0PAyaEFgRum7mHdPTlf3OJ5AQR1f+WgvpU9zm/tAou6gGJYtp0e/ePIBnaMT+cCTZPbxJcgR9iZ21RPwdiD5YTSehTuDjvpsEwKHJiGSW57BxLcJasUQ9CWjGQmBtm2YKtQ8g2/W03WuvOY8QwfZSpKyW3pHWtNSUVKjOjh4pldRXjwEjWSmRW/MH1zyQIBSGV9WF4pir9ny0tdE9cA/VQGzYZUYM7Rc+zw==", + "targets": [ + { + "target": "ticket_sidebar", + "entrypoint": "index.html" + } + ], "settings": { - "api_key": { - "title": "API Key", - "description": "The API key can be obtained by following our setup guide", + "use_deskpro_saas": { + "title": "One-Click Installation", + "type": "boolean", + "default": true, + "isRequired": false, + "isBackendOnly": false, + "order": 5 + }, + "use_access_token": { + "title": "Use Access Token", + "type": "boolean", + "isRequired": false, + "isBackendOnly": false, + "default": false, + "condition": "settings.use_deskpro_saas != true", + "order": 10 + }, + "access_token": { + "title": "Access Token", + "description": "The access token can be obtained by following our setup guide", "type": "string", - "isRequired": true, - "isBackendOnly": true + "isRequired": false, + "isBackendOnly": true, + "condition": "settings.use_deskpro_saas != true && settings.use_access_token == true", + "order": 20 }, "verify_settings": { "title": "", "type": "app_embedded", - "options": { "entrypoint": "#/admin/verify_settings" }, + "options": { + "entrypoint": "#/admin/verify_settings", + "height": "30px" + }, "isRequired": false, "isBackendOnly": true, - "order": 20 + "condition": "settings.use_deskpro_saas != true && settings.use_access_token == true", + "order": 30 + }, + "client_id": { + "title": "Client ID", + "type": "string", + "isRequired": false, + "isBackendOnly": false, + "condition": "settings.use_deskpro_saas != true && settings.use_access_token != true", + "order": 40 + }, + "client_secret": { + "title": "Client Secret", + "type": "string", + "isRequired": false, + "isBackendOnly": true, + "condition": "settings.use_deskpro_saas != true && settings.use_access_token != true", + "order": 50 + }, + "callback_url": { + "title": "Callback URL", + "type": "app_embedded", + "options": { + "entrypoint": "#/admin/callback" + }, + "isRequired": false, + "isBackendOnly": true, + "condition": "settings.use_deskpro_saas != true && settings.use_access_token != true", + "order": 60 } }, "proxy": { "whitelist": [ { + "url": "https://api.surveymonkey.net/v3/.*", - "methods": ["GET", "POST", "PATCH"], + "methods": [ + "GET", + "POST", + "PATCH" + ], + "timeout": 20 + }, + { + + "url": "https://api.surveymonkey.com/oauth/.*", + "methods": [ + "POST" + ], "timeout": 20 } ] } -} +} \ No newline at end of file diff --git a/src/pages/AdminCallbackPage.tsx b/src/pages/AdminCallbackPage.tsx new file mode 100644 index 0000000..e9f8172 --- /dev/null +++ b/src/pages/AdminCallbackPage.tsx @@ -0,0 +1,51 @@ +import { CopyToClipboardInput, LoadingSpinner, OAuth2Result, useInitialisedDeskproAppClient, } from "@deskpro/app-sdk"; +import { createSearchParams } from "react-router-dom"; +import { P1 } from "@deskpro/deskpro-ui"; +import { useState } from "react"; +import styled from "styled-components"; +import type { FC } from "react"; + +const Description = styled(P1)` + margin-top: 8px; + margin-bottom: 16px; + color: ${({ theme }) => theme.colors.grey80}; +`; + +const AdminCallbackPage: FC = () => { + const [callbackUrl, setCallbackUrl] = useState(null) + + useInitialisedDeskproAppClient(async (client) => { + const oauth2 = await client.startOauth2Local( + ({ callbackUrl, state }) => { + return `https://api.surveymonkey.com/oauth/authorize?${createSearchParams([ + ["response_type", "code"], + ["client_id", "xxx"], + ["state", state], + ["redirect_uri", callbackUrl], + ])}` + }, + /code=(?[0-9a-f]+)/, + async (): Promise => ({ data: { access_token: "", refresh_token: "" } }) + ) + + const url = new URL(oauth2.authorizationUrl); + const redirectUri = url.searchParams.get("redirect_uri") + + if (redirectUri) { + setCallbackUrl(redirectUri) + } + }) + + if (!callbackUrl) { + return () + } + + return ( + <> + + The callback URL will be required during the SurveyMonkey app setup + + ); +}; + +export default AdminCallbackPage diff --git a/src/pages/VerifySettings.tsx b/src/pages/VerifySettings.tsx index a60a143..9750baa 100644 --- a/src/pages/VerifySettings.tsx +++ b/src/pages/VerifySettings.tsx @@ -1,12 +1,11 @@ -import { useState, useCallback } from "react"; -import styled from "styled-components"; +import { getCurrentUser } from "@/api/SurveyMonkey"; +import { nbsp, AUTH_ERROR } from "@/constants"; import { TSpan, Stack, Button } from "@deskpro/deskpro-ui"; import { useDeskproAppEvents, useDeskproAppClient } from "@deskpro/app-sdk"; -import { getCurrentUser } from "../api/api"; -import { nbsp, AUTH_ERROR } from "../constants"; +import { useState, useCallback } from "react"; +import styled from "styled-components"; import type { FC } from "react"; -import type { Settings } from "../types/settings"; -import type { User } from "../types/user"; +import type { User } from "@/types/user"; const Invalid = styled(TSpan)` color: ${({ theme }) => theme.colors.red100}; @@ -18,13 +17,13 @@ const Secondary = styled(TSpan)` const VerifySettings: FC = () => { const { client } = useDeskproAppClient(); - const [user, setUser] = useState(null); - const [settings, setSettings] = useState({}); + const [user, setUser] = useState(null); + const [settings, setSettings] = useState<{ access_token?: string }>({}); const [isLoading, setIsLoading] = useState(false); - const [error, setError] = useState(null); + const [error, setError] = useState(null); const onVerifySettings = useCallback(() => { - if (!client || !settings?.api_key) { + if (!client || !settings?.access_token) { return; } @@ -32,15 +31,19 @@ const VerifySettings: FC = () => { setError(""); setUser(null); - return getCurrentUser(client, settings.api_key) - .then(setUser) - .catch((err) => { - try { - setError(JSON.parse(err?.message || "{}")?.error?.message); - } catch (e) { - setError(AUTH_ERROR); + return getCurrentUser(client, settings.access_token) + .then((user)=>{ + if(user){ + setUser(user) + }else{ + setError(AUTH_ERROR) } }) + .catch((e) => { +console.log(e) + setError(AUTH_ERROR); + + }) .finally(() => setIsLoading(false)); }, [client, settings]); @@ -55,7 +58,7 @@ const VerifySettings: FC = () => { intent="secondary" onClick={onVerifySettings} loading={isLoading} - disabled={!settings?.api_key || isLoading} + disabled={!settings?.access_token || isLoading} /> {nbsp} {!user @@ -70,4 +73,4 @@ const VerifySettings: FC = () => { ); }; -export { VerifySettings }; +export default VerifySettings diff --git a/src/types/deskpro.ts b/src/types/deskpro.ts new file mode 100644 index 0000000..e7a9263 --- /dev/null +++ b/src/types/deskpro.ts @@ -0,0 +1,31 @@ +/** Deskpro types */ +export type Settings = { + client_id?: string, + use_deskpro_saas?: boolean, + use_access_token?: boolean, + }; + + export type ContextData = { + ticket?: { + id: string, + subject: string, + permalinkUrl: string, + primaryUser: { + id: string, + email: string + displayName: string + firstName: string + lastName: string + } + }, + user?: { + id: string + isAgent: boolean + firstName: string + lastName: string + name: string + titlePrefix: string + primaryEmail: string + emails: string[] + } + }; \ No newline at end of file diff --git a/src/types/settings.ts b/src/types/settings.ts deleted file mode 100644 index adb69ca..0000000 --- a/src/types/settings.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface Settings { - api_key?: string; -} diff --git a/src/types/surveymonkey.ts b/src/types/surveymonkey.ts new file mode 100644 index 0000000..56f9e0e --- /dev/null +++ b/src/types/surveymonkey.ts @@ -0,0 +1,12 @@ +type SurveyMonkeyScope = + | "users_read" + | "surveys_read" + | "collectors_read" + | "collectors_write" + | "contacts_read" + | "contacts_write" + | "surveys_write" + | "responses_read" + | "webhooks_read" + | "webhooks_write" + | "library_read" \ No newline at end of file From 70235e9ec60669bbd14ba2d27a3babac4fb48576 Mon Sep 17 00:00:00 2001 From: OJ Abba Date: Mon, 3 Mar 2025 16:38:43 +0000 Subject: [PATCH 11/22] [Fix] Fix lint errors --- src/pages/VerifySettings.tsx | 1 - src/types/surveymonkey.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/pages/VerifySettings.tsx b/src/pages/VerifySettings.tsx index 9750baa..627644c 100644 --- a/src/pages/VerifySettings.tsx +++ b/src/pages/VerifySettings.tsx @@ -40,7 +40,6 @@ const VerifySettings: FC = () => { } }) .catch((e) => { -console.log(e) setError(AUTH_ERROR); }) diff --git a/src/types/surveymonkey.ts b/src/types/surveymonkey.ts index 56f9e0e..6fe6af1 100644 --- a/src/types/surveymonkey.ts +++ b/src/types/surveymonkey.ts @@ -1,4 +1,4 @@ -type SurveyMonkeyScope = +export type SurveyMonkeyScope = | "users_read" | "surveys_read" | "collectors_read" From 214e025e821050a134f05a415bd482da3b67a1bc Mon Sep 17 00:00:00 2001 From: OJ Abba Date: Mon, 3 Mar 2025 16:39:24 +0000 Subject: [PATCH 12/22] [Feat] Create "loading" page --- src/pages/Loading/LoadingPage.tsx | 80 +++++++++++++++++++++++++++++++ src/pages/Loading/index.ts | 1 + src/pages/VerifySettings.tsx | 2 +- 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 src/pages/Loading/LoadingPage.tsx create mode 100644 src/pages/Loading/index.ts diff --git a/src/pages/Loading/LoadingPage.tsx b/src/pages/Loading/LoadingPage.tsx new file mode 100644 index 0000000..82459f5 --- /dev/null +++ b/src/pages/Loading/LoadingPage.tsx @@ -0,0 +1,80 @@ +import { ErrorBlock } from "@/components/ErrorBlock"; +import { FC, useState } from "react"; +import { getCurrentUser } from "@/api/SurveyMonkey"; +import { LoadingSpinner, useDeskproAppClient, useDeskproElements, useDeskproLatestAppContext, useInitialisedDeskproAppClient } from "@deskpro/app-sdk"; +import { Settings, ContextData } from "@/types/deskpro"; +import { Stack } from "@deskpro/deskpro-ui"; +import { useNavigate } from "react-router-dom"; + +const LoadingPage: FC = () => { + const { client } = useDeskproAppClient() + const { context } = useDeskproLatestAppContext() + + const [isAuthenticated, setIsAuthenticated] = useState(false) + const [isFetchingAuth, setIsFetchingAuth] = useState(true) + + const navigate = useNavigate(); + + // Determine authentication method from settings + const isUsingOAuth = context?.settings.use_access_token !== true + const user = context?.data?.ticket?.primaryUser || context?.data?.user + + useDeskproElements(({ registerElement, clearElements }) => { + clearElements() + registerElement("refreshButton", { type: "refresh_button" }) + }); + + useInitialisedDeskproAppClient((client) => { + client.setTitle("SurveyMonkey") + + if (!context || !context?.settings || !user) { + return + } + + // Store the authentication method in the user state + client.setUserState("isUsingOAuth", isUsingOAuth) + + // Verify authentication status + // If OAuth2 mode and the user is logged in the request would be make with their stored access token + // If access token mode the request would be made with the access token provided in the app setup + getCurrentUser(client) + .then((user) => { + if (user) { + setIsAuthenticated(true) + } + }) + .catch(() => { }) + .finally(() => { + setIsFetchingAuth(false) + }) + }, [context, context?.settings]) + + if (!client || !user || isFetchingAuth) { + return () + } + if (isAuthenticated) { + + navigate("/home") + } else { + + if (isUsingOAuth) { + navigate("/login") + } else { + // Show error for invalid access tokens (expired or not present) + return ( + + + + ) + } + + } + + + + return ( + + ); +}; + +export default LoadingPage; diff --git a/src/pages/Loading/index.ts b/src/pages/Loading/index.ts new file mode 100644 index 0000000..a583868 --- /dev/null +++ b/src/pages/Loading/index.ts @@ -0,0 +1 @@ +export { default } from "./LoadingPage"; diff --git a/src/pages/VerifySettings.tsx b/src/pages/VerifySettings.tsx index 627644c..136ca9e 100644 --- a/src/pages/VerifySettings.tsx +++ b/src/pages/VerifySettings.tsx @@ -39,7 +39,7 @@ const VerifySettings: FC = () => { setError(AUTH_ERROR) } }) - .catch((e) => { + .catch(() => { setError(AUTH_ERROR); }) From cf4fd957fdc04673f9945015c366ee9e3e76dd3a Mon Sep 17 00:00:00 2001 From: OJ Abba Date: Mon, 3 Mar 2025 16:41:13 +0000 Subject: [PATCH 13/22] [Chore] Add OAuth headers to `request` in `api.ts` --- src/api/api.ts | 35 +++++++---------------------------- 1 file changed, 7 insertions(+), 28 deletions(-) diff --git a/src/api/api.ts b/src/api/api.ts index 8225868..5d89876 100644 --- a/src/api/api.ts +++ b/src/api/api.ts @@ -1,33 +1,10 @@ -import { - proxyFetch, - IDeskproClient, - adminGenericProxyFetch, -} from "@deskpro/app-sdk"; -import { ISurvey, ISurveyWithDetails } from "../types/survey"; -import { ICollector, ICollectorWithDetails } from "../types/collector"; +import { ACCESS_TOKEN_PATH, OAUTH2_ACCESS_TOKEN_PATH } from "@/constants/deskpro"; +import { ICollector, ICollectorWithDetails } from "@/types/collector"; +import { ISurvey, ISurveyWithDetails } from "@/types/survey"; +import { proxyFetch, IDeskproClient } from "@deskpro/app-sdk"; export type RequestMethod = "GET" | "POST" | "PATCH" | "DELETE"; -export const getCurrentUser = async ( - client: IDeskproClient, - apiKey: string, -) => { - const dpFetch = await adminGenericProxyFetch(client); - const response = await dpFetch(`https://api.surveymonkey.net/v3/users/me`, { - headers: { - method: "GET", - "Content-Type": "application/json", - Authorization: ` Bearer ${apiKey}`, - }, - }); - - if (isResponseError(response)) { - throw new Error(await response.text()); - } - - return response.json(); -}; - export const getSurveysWithCollectors = async (client: IDeskproClient) => { const surveys = await getSurveys(client); @@ -125,11 +102,13 @@ export const request = async ( ) => { const fetch = await proxyFetch(client); + const isUsingOAuth2 = (await client.getUserState("isUsingOAuth"))[0]?.data + const options: RequestInit = { method, headers: { "Content-Type": "application/json", - Authorization: ` Bearer __api_key__`, + Authorization: ` Bearer ${isUsingOAuth2? `[user[${OAUTH2_ACCESS_TOKEN_PATH}]]` : ACCESS_TOKEN_PATH}`, }, }; From 8484cf3e2f948cb7f0203e866c1f1d96060b3ed9 Mon Sep 17 00:00:00 2001 From: OJ Abba Date: Mon, 3 Mar 2025 16:41:47 +0000 Subject: [PATCH 14/22] [Chore[ Add new pages to `App` --- src/App.tsx | 19 ++++++++++--------- src/pages/index.ts | 5 +++++ 2 files changed, 15 insertions(+), 9 deletions(-) create mode 100644 src/pages/index.ts diff --git a/src/App.tsx b/src/App.tsx index 47661d6..573c748 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,12 +1,11 @@ -import { LoadingSpinner } from "@deskpro/app-sdk"; -import { Suspense } from "react"; +import { AdminCallbackPage, HomePage, LoadingPage, LoginPage, VerifySettingsPage } from "./pages"; import { ErrorBoundary } from "react-error-boundary"; +import { ErrorFallback } from "./components/ErrorFallback/ErrorFallback"; import { HashRouter, Route, Routes } from "react-router-dom"; -import { Main } from "./pages/Main"; -import { VerifySettings } from "./pages/VerifySettings"; +import { LoadingSpinner } from "@deskpro/app-sdk"; import { QueryErrorResetBoundary } from "@tanstack/react-query"; -import { ErrorFallback } from "./components/ErrorFallback/ErrorFallback"; -import { Redirect } from "./components/Redirect/Redirect"; +import { Suspense } from "react"; + function App() { return ( @@ -16,9 +15,11 @@ function App() { {({ reset }) => ( - } /> - } /> - } /> + } /> + } /> + } /> + } /> + } /> )} diff --git a/src/pages/index.ts b/src/pages/index.ts new file mode 100644 index 0000000..68e7159 --- /dev/null +++ b/src/pages/index.ts @@ -0,0 +1,5 @@ +export { default as AdminCallbackPage } from "./AdminCallbackPage" +export { default as VerifySettingsPage } from "./VerifySettings" +export { default as LoadingPage } from "./Loading" +export { default as LoginPage } from "./Login" +export { default as HomePage } from "./Main" \ No newline at end of file From 2b2868a553e876b85dfee768e09334ccebf75a6c Mon Sep 17 00:00:00 2001 From: OJ Abba Date: Mon, 3 Mar 2025 16:42:49 +0000 Subject: [PATCH 15/22] [Feat] Add logout functionality to the "home" page --- src/pages/Main.tsx | 45 +++++++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/src/pages/Main.tsx b/src/pages/Main.tsx index 7ba7fa6..8a41047 100644 --- a/src/pages/Main.tsx +++ b/src/pages/Main.tsx @@ -1,24 +1,43 @@ -import { - LoadingSpinner, - useInitialisedDeskproAppClient, - useQueryWithClient, -} from "@deskpro/app-sdk"; -import { getSurveysWithCollectors } from "../api/api"; -import { FieldMapping } from "../components/FieldMapping/FieldMapping"; -import { Container } from "../components/Layout"; -import surveyJson from "../mapping/survey.json"; - -export const Main = () => { +import { AppElementPayload, LoadingSpinner, useDeskproAppEvents, useDeskproLatestAppContext, useInitialisedDeskproAppClient, useQueryWithClient, } from "@deskpro/app-sdk"; +import { Container } from "@/components/Layout"; +import { ContextData, Settings } from "@/types/deskpro"; +import { FieldMapping } from "@/components/FieldMapping/FieldMapping"; +import { getSurveysWithCollectors } from "@/api/api"; +import { useLogout } from "@/hooks/deskpro"; +import surveyJson from "@/mapping/survey.json"; + +const Main = () => { + const { logoutActiveUser } = useLogout() + const { context } = useDeskproLatestAppContext() + const isUsingOAuth = context?.settings.use_access_token !== true + + useInitialisedDeskproAppClient((client) => { client.setTitle("SurveyMonkey"); client.registerElement("refreshButton", { type: "refresh_button" }); - client.registerElement("nutshellHomeButton", { + client.registerElement("homeButton", { type: "home_button", }); + if (isUsingOAuth) { + client.registerElement("menuButton", { type: "menu", items: [{ title: "Logout" }] }); + } }); + useDeskproAppEvents({ + onElementEvent(id: string, _type: string, _payload?: AppElementPayload) { + switch (id) { + case "menuButton": + if (isUsingOAuth) { + logoutActiveUser() + } + + break; + } + }, + }) + const surveysWithCollectorsQuery = useQueryWithClient(["abc"], (client) => getSurveysWithCollectors(client) ); @@ -43,3 +62,5 @@ export const Main = () => { ); }; + +export default Main From 52de961a7917f68c2d1322cf012198feebc64b8d Mon Sep 17 00:00:00 2001 From: OJ Abba Date: Mon, 3 Mar 2025 16:43:18 +0000 Subject: [PATCH 16/22] [Chore] Kill `Redirect` --- src/components/Redirect/Redirect.tsx | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 src/components/Redirect/Redirect.tsx diff --git a/src/components/Redirect/Redirect.tsx b/src/components/Redirect/Redirect.tsx deleted file mode 100644 index cdbc94d..0000000 --- a/src/components/Redirect/Redirect.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { useEffect } from "react"; -import { useNavigate } from "react-router-dom"; - -export const Redirect = () => { - const navigate = useNavigate(); - useEffect(() => { - navigate("/"); - }, [navigate]); - - return
; -}; From c22aa86fd6b039b8bc18d9de4d71a94b9ec4ceda Mon Sep 17 00:00:00 2001 From: OJ Abba Date: Mon, 3 Mar 2025 16:59:21 +0000 Subject: [PATCH 17/22] [Fix] Fix failing `Main` test --- jest.config.js | 1 + src/pages/Main.tsx | 2 +- tests/pages/Main.test.tsx | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/jest.config.js b/jest.config.js index 6b41972..75e56d2 100644 --- a/jest.config.js +++ b/jest.config.js @@ -35,6 +35,7 @@ module.exports = { "^.+\\.mjs$": "@swc/jest", }, moduleNameMapper: { + "^@/(.*)$": "/src/$1", "\\.(jpg|ico|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "/config/jest/fileTransform.js", "\\.(css|less)$": "/config/jest/fileTransform.js", diff --git a/src/pages/Main.tsx b/src/pages/Main.tsx index 8a41047..cf8dfc1 100644 --- a/src/pages/Main.tsx +++ b/src/pages/Main.tsx @@ -9,7 +9,7 @@ import surveyJson from "@/mapping/survey.json"; const Main = () => { const { logoutActiveUser } = useLogout() const { context } = useDeskproLatestAppContext() - const isUsingOAuth = context?.settings.use_access_token !== true + const isUsingOAuth = context?.settings?.use_access_token !== true useInitialisedDeskproAppClient((client) => { diff --git a/tests/pages/Main.test.tsx b/tests/pages/Main.test.tsx index 2d8343d..495eefb 100644 --- a/tests/pages/Main.test.tsx +++ b/tests/pages/Main.test.tsx @@ -1,7 +1,7 @@ import { lightTheme, ThemeProvider } from "@deskpro/deskpro-ui"; import { cleanup, render, waitFor } from "@testing-library/react/"; import React from "react"; -import { Main } from "../../src/pages/Main"; +import Main from "../../src/pages/Main"; const renderPage = () => { return render( From ba25437c76994b20cf83a5d386ea53d4cc388dde Mon Sep 17 00:00:00 2001 From: OJ Abba Date: Mon, 3 Mar 2025 17:16:47 +0000 Subject: [PATCH 18/22] [Chore] Update setup guide to include OAuth --- SETUP.md | 29 +++++++++++++++++++- docs/assets/setup/surveymonkey_setup_04.png | Bin 0 -> 42911 bytes 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 docs/assets/setup/surveymonkey_setup_04.png diff --git a/SETUP.md b/SETUP.md index d72944a..3d03563 100644 --- a/SETUP.md +++ b/SETUP.md @@ -1,4 +1,8 @@ -# SurveyMonkey Instructions +# SurveyMonkey Setup Instructions + +Follow these steps to install and configure the SurveyMonkey app using either an Access Token or OAuth credentials. + +## Using Access Token First, go to the SurveyMonkey developer website ([developer.surveymonkey.com](https://developer.surveymonkey.com), or [developer.eu.surveymonkey.com](https://developer.eu.surveymonkey.com/) if you are based in EU) and log in to your account. @@ -17,3 +21,26 @@ While on the settings tab in the SurveyMonkey developer website, scroll down to [![](/docs/assets/setup/surveymonkey_setup_03.png)](/docs/assets/setup/surveymonkey_setup_03.png) Once you're happy with your settings, click the "Install" button to install the app. + +## Using OAuth + +First, go to the SurveyMonkey developer website ([developer.surveymonkey.com](https://developer.surveymonkey.com), or [developer.eu.surveymonkey.com](https://developer.eu.surveymonkey.com/) if you are based in EU) and log in to your account. + +[![](/docs/assets/setup/surveymonkey_setup_01.png)](/docs/assets/setup/surveymonkey_setup_01.png) + +Once you're logged in, click on the __"My Apps"__ tab at the top. After that click on __"Add a New App"__, and fill in the required fields, making sure to select Private App as the App Type. + +[![](/docs/assets/setup/surveymonkey_setup_02.png)](/docs/assets/setup/surveymonkey_setup_02.png) + + +On the "Details" page copy the `Client ID` and `Secret` and input the credentials in the settings tab in Deskpro. + +[![](/docs/assets/setup/surveymonkey_setup_04.png)](/docs/assets/setup/surveymonkey_setup_04.png) + +Head over to the __Settings__ tab in the SurveyMonkey website, and enter the `Callback URL` from Deskpro in the "OAuth Redirect URL" field. + +While on the settings tab in the SurveyMonkey developer website, scroll down to scopes and set __View Response Details__, __View Contacts__, __View Surveys__, __View Collectors__, __View Users__, and __View Responses__ to "Required", and click on Update Scopes. + +[![](/docs/assets/setup/surveymonkey_setup_03.png)](/docs/assets/setup/surveymonkey_setup_03.png) + +Once you're happy with your settings, click the "Install" button to install the app. diff --git a/docs/assets/setup/surveymonkey_setup_04.png b/docs/assets/setup/surveymonkey_setup_04.png new file mode 100644 index 0000000000000000000000000000000000000000..0b796070a977290838184fb5b36b7218c6bf46f0 GIT binary patch literal 42911 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 literal 0 HcmV?d00001 From f63cfa391c4906d34de4207d1aca618eef693a1a Mon Sep 17 00:00:00 2001 From: OJ Abba Date: Fri, 14 Mar 2025 16:00:12 +0000 Subject: [PATCH 19/22] [Bug] Fix runaway polling bug in useLogin (SC-183520) --- src/pages/Login/useLogin.ts | 66 +++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 24 deletions(-) diff --git a/src/pages/Login/useLogin.ts b/src/pages/Login/useLogin.ts index aad52fa..feeb54d 100644 --- a/src/pages/Login/useLogin.ts +++ b/src/pages/Login/useLogin.ts @@ -2,7 +2,7 @@ import { ContextData, Settings } from "@/types/deskpro"; import { createSearchParams, useNavigate } from "react-router-dom"; import { getAccessToken, getCurrentUser } from "@/api/SurveyMonkey"; import { OAUTH2_ACCESS_TOKEN_PATH, OAUTH2_REFRESH_TOKEN_PATH } from "@/constants/deskpro"; -import { OAuth2Result, useDeskproLatestAppContext, useInitialisedDeskproAppClient } from "@deskpro/app-sdk"; +import { IOAuth2, OAuth2Result, useDeskproLatestAppContext, useInitialisedDeskproAppClient } from "@deskpro/app-sdk"; import { useCallback, useState } from "react"; interface UseLogin { @@ -16,13 +16,15 @@ export default function useLogin(): UseLogin { const [authUrl, setAuthUrl] = useState(null) const [error, setError] = useState(null) const [isLoading, setIsLoading] = useState(false) + const [isPolling, setIsPolling] = useState(false) + const [oauth2Context, setOAuth2Context] = useState(null) + const navigate = useNavigate() const { context } = useDeskproLatestAppContext() const user = context?.data?.ticket?.primaryUser || context?.data?.user - useInitialisedDeskproAppClient(async (client) => { if (context?.settings.use_deskpro_saas === undefined || !user) { // Make sure settings have loaded. @@ -33,30 +35,31 @@ export default function useLogin(): UseLogin { if (context.settings.use_access_token === true) { setError("Enable OAuth to access this page"); return - } const mode = context?.settings.use_deskpro_saas ? 'global' : 'local'; const clientId = context?.settings.client_id; - if (mode === 'local' && typeof clientId !== 'string') { + if (mode === 'local' && (typeof clientId !== 'string' || clientId.trim() === "")) { // Local mode requires a clientId. setError("A client ID is required"); return } - const oauth2 = mode === "local" ? + + // Start OAuth process depending on the authentication mode + const oauth2Response = mode === "local" ? await client.startOauth2Local( ({ state, callbackUrl }) => { return `https://api.surveymonkey.com/oauth/authorize?${createSearchParams([ ["client_id", clientId ?? ""], ["state", state], ["redirect_uri", callbackUrl], - ["response_type", "code"] + ["response_type", "code"] ])}`; }, /\bcode=(?[^&#]+)/, async (code: string): Promise => { // Extract the callback URL from the authorization URL - const url = new URL(oauth2.authorizationUrl); + const url = new URL(oauth2Response.authorizationUrl); const redirectUri = url.searchParams.get("redirect_uri"); if (!redirectUri) { @@ -71,37 +74,52 @@ export default function useLogin(): UseLogin { // Global Proxy Service : await client.startOauth2Global("TW2mwcHyQwCmkrzNjgdMAQ"); - setAuthUrl(oauth2.authorizationUrl) - setIsLoading(false) + setAuthUrl(oauth2Response.authorizationUrl) + setOAuth2Context(oauth2Response) - try { - const result = await oauth2.poll() + }, [setAuthUrl, context?.settings.use_deskpro_saas]) - await client.setUserState(OAUTH2_ACCESS_TOKEN_PATH, result.data.access_token, { backend: true }) + useInitialisedDeskproAppClient((client) => { + if (!user || !oauth2Context) { + return + } - if (result.data.refresh_token) { - await client.setUserState(OAUTH2_REFRESH_TOKEN_PATH, result.data.refresh_token, { backend: true }) - } + const startPolling = async () => { + try { + const result = await oauth2Context.poll() - const activeUser = await getCurrentUser(client) + await client.setUserState(OAUTH2_ACCESS_TOKEN_PATH, result.data.access_token, { backend: true }) - if (!activeUser) { - throw new Error("Error authenticating user") + if (result.data.refresh_token) { + await client.setUserState(OAUTH2_REFRESH_TOKEN_PATH, result.data.refresh_token, { backend: true }) + } + + const activeUser = await getCurrentUser(client) + + if (!activeUser) { + throw new Error("Error authenticating user") + } + + navigate("/home") + } catch (error) { + setError(error instanceof Error ? error.message : 'Unknown error'); + } finally { + setIsLoading(false) + setIsPolling(false) } + } - navigate("/home") - } catch (error) { - setError(error instanceof Error ? error.message : 'Unknown error'); - setIsLoading(false); + if (isPolling) { + void startPolling() } - }, [setAuthUrl, context?.settings.use_deskpro_saas]) + }, [isPolling, user, oauth2Context, navigate]) const onSignIn = useCallback(() => { setIsLoading(true); + setIsPolling(true); window.open(authUrl ?? "", '_blank'); }, [setIsLoading, authUrl]); - return { authUrl, onSignIn, error, isLoading } } \ No newline at end of file From d8f75a7ea37a33e14188b4515aa417b6919f5689 Mon Sep 17 00:00:00 2001 From: OJ Abba Date: Fri, 14 Mar 2025 16:03:34 +0000 Subject: [PATCH 20/22] [Chore] Bump `vite` to version 6.2.2 (SC-180924) --- package.json | 2 +- pnpm-lock.yaml | 226 ++++++++++++++++++++++++------------------------- 2 files changed, 114 insertions(+), 114 deletions(-) diff --git a/package.json b/package.json index 3040428..ff2d942 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,6 @@ "styled-components": "^6.1.14", "ts-jest": "^27.1.5", "typescript": "^5.7.2", - "vite": "^6.0.11" + "vite": "^6.2.2" } } \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 329b273..3c31a84 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -121,8 +121,8 @@ importers: specifier: ^5.7.2 version: 5.7.2 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@22.10.5)(sass@1.84.0) + specifier: ^6.2.2 + version: 6.2.2(@types/node@22.10.5)(sass@1.84.0) packages: @@ -360,152 +360,152 @@ packages: '@emotion/unitless@0.8.1': resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} - '@esbuild/aix-ppc64@0.24.2': - resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + '@esbuild/aix-ppc64@0.25.1': + resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.24.2': - resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + '@esbuild/android-arm64@0.25.1': + resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.24.2': - resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + '@esbuild/android-arm@0.25.1': + resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.24.2': - resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + '@esbuild/android-x64@0.25.1': + resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.24.2': - resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + '@esbuild/darwin-arm64@0.25.1': + resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.24.2': - resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + '@esbuild/darwin-x64@0.25.1': + resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.24.2': - resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + '@esbuild/freebsd-arm64@0.25.1': + resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.2': - resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + '@esbuild/freebsd-x64@0.25.1': + resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.24.2': - resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + '@esbuild/linux-arm64@0.25.1': + resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.24.2': - resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + '@esbuild/linux-arm@0.25.1': + resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.24.2': - resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + '@esbuild/linux-ia32@0.25.1': + resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.24.2': - resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + '@esbuild/linux-loong64@0.25.1': + resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.24.2': - resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + '@esbuild/linux-mips64el@0.25.1': + resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.24.2': - resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + '@esbuild/linux-ppc64@0.25.1': + resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.24.2': - resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + '@esbuild/linux-riscv64@0.25.1': + resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.24.2': - resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + '@esbuild/linux-s390x@0.25.1': + resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.24.2': - resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + '@esbuild/linux-x64@0.25.1': + resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.24.2': - resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + '@esbuild/netbsd-arm64@0.25.1': + resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.2': - resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + '@esbuild/netbsd-x64@0.25.1': + resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.24.2': - resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + '@esbuild/openbsd-arm64@0.25.1': + resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.2': - resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + '@esbuild/openbsd-x64@0.25.1': + resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.24.2': - resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + '@esbuild/sunos-x64@0.25.1': + resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.24.2': - resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + '@esbuild/win32-arm64@0.25.1': + resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.24.2': - resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + '@esbuild/win32-ia32@0.25.1': + resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.24.2': - resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + '@esbuild/win32-x64@0.25.1': + resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1583,8 +1583,8 @@ packages: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} - esbuild@0.24.2: - resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + esbuild@0.25.1: + resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} engines: {node: '>=18'} hasBin: true @@ -2518,8 +2518,8 @@ packages: resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} - postcss@8.4.49: - resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -3035,8 +3035,8 @@ packages: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} - vite@6.0.11: - resolution: {integrity: sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==} + vite@6.2.2: + resolution: {integrity: sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -3490,79 +3490,79 @@ snapshots: '@emotion/unitless@0.8.1': {} - '@esbuild/aix-ppc64@0.24.2': + '@esbuild/aix-ppc64@0.25.1': optional: true - '@esbuild/android-arm64@0.24.2': + '@esbuild/android-arm64@0.25.1': optional: true - '@esbuild/android-arm@0.24.2': + '@esbuild/android-arm@0.25.1': optional: true - '@esbuild/android-x64@0.24.2': + '@esbuild/android-x64@0.25.1': optional: true - '@esbuild/darwin-arm64@0.24.2': + '@esbuild/darwin-arm64@0.25.1': optional: true - '@esbuild/darwin-x64@0.24.2': + '@esbuild/darwin-x64@0.25.1': optional: true - '@esbuild/freebsd-arm64@0.24.2': + '@esbuild/freebsd-arm64@0.25.1': optional: true - '@esbuild/freebsd-x64@0.24.2': + '@esbuild/freebsd-x64@0.25.1': optional: true - '@esbuild/linux-arm64@0.24.2': + '@esbuild/linux-arm64@0.25.1': optional: true - '@esbuild/linux-arm@0.24.2': + '@esbuild/linux-arm@0.25.1': optional: true - '@esbuild/linux-ia32@0.24.2': + '@esbuild/linux-ia32@0.25.1': optional: true - '@esbuild/linux-loong64@0.24.2': + '@esbuild/linux-loong64@0.25.1': optional: true - '@esbuild/linux-mips64el@0.24.2': + '@esbuild/linux-mips64el@0.25.1': optional: true - '@esbuild/linux-ppc64@0.24.2': + '@esbuild/linux-ppc64@0.25.1': optional: true - '@esbuild/linux-riscv64@0.24.2': + '@esbuild/linux-riscv64@0.25.1': optional: true - '@esbuild/linux-s390x@0.24.2': + '@esbuild/linux-s390x@0.25.1': optional: true - '@esbuild/linux-x64@0.24.2': + '@esbuild/linux-x64@0.25.1': optional: true - '@esbuild/netbsd-arm64@0.24.2': + '@esbuild/netbsd-arm64@0.25.1': optional: true - '@esbuild/netbsd-x64@0.24.2': + '@esbuild/netbsd-x64@0.25.1': optional: true - '@esbuild/openbsd-arm64@0.24.2': + '@esbuild/openbsd-arm64@0.25.1': optional: true - '@esbuild/openbsd-x64@0.24.2': + '@esbuild/openbsd-x64@0.25.1': optional: true - '@esbuild/sunos-x64@0.24.2': + '@esbuild/sunos-x64@0.25.1': optional: true - '@esbuild/win32-arm64@0.24.2': + '@esbuild/win32-arm64@0.25.1': optional: true - '@esbuild/win32-ia32@0.24.2': + '@esbuild/win32-ia32@0.25.1': optional: true - '@esbuild/win32-x64@0.24.2': + '@esbuild/win32-x64@0.25.1': optional: true '@eslint/eslintrc@1.4.1': @@ -4777,33 +4777,33 @@ snapshots: dependencies: es-errors: 1.3.0 - esbuild@0.24.2: + esbuild@0.25.1: optionalDependencies: - '@esbuild/aix-ppc64': 0.24.2 - '@esbuild/android-arm': 0.24.2 - '@esbuild/android-arm64': 0.24.2 - '@esbuild/android-x64': 0.24.2 - '@esbuild/darwin-arm64': 0.24.2 - '@esbuild/darwin-x64': 0.24.2 - '@esbuild/freebsd-arm64': 0.24.2 - '@esbuild/freebsd-x64': 0.24.2 - '@esbuild/linux-arm': 0.24.2 - '@esbuild/linux-arm64': 0.24.2 - '@esbuild/linux-ia32': 0.24.2 - '@esbuild/linux-loong64': 0.24.2 - '@esbuild/linux-mips64el': 0.24.2 - '@esbuild/linux-ppc64': 0.24.2 - '@esbuild/linux-riscv64': 0.24.2 - '@esbuild/linux-s390x': 0.24.2 - '@esbuild/linux-x64': 0.24.2 - '@esbuild/netbsd-arm64': 0.24.2 - '@esbuild/netbsd-x64': 0.24.2 - '@esbuild/openbsd-arm64': 0.24.2 - '@esbuild/openbsd-x64': 0.24.2 - '@esbuild/sunos-x64': 0.24.2 - '@esbuild/win32-arm64': 0.24.2 - '@esbuild/win32-ia32': 0.24.2 - '@esbuild/win32-x64': 0.24.2 + '@esbuild/aix-ppc64': 0.25.1 + '@esbuild/android-arm': 0.25.1 + '@esbuild/android-arm64': 0.25.1 + '@esbuild/android-x64': 0.25.1 + '@esbuild/darwin-arm64': 0.25.1 + '@esbuild/darwin-x64': 0.25.1 + '@esbuild/freebsd-arm64': 0.25.1 + '@esbuild/freebsd-x64': 0.25.1 + '@esbuild/linux-arm': 0.25.1 + '@esbuild/linux-arm64': 0.25.1 + '@esbuild/linux-ia32': 0.25.1 + '@esbuild/linux-loong64': 0.25.1 + '@esbuild/linux-mips64el': 0.25.1 + '@esbuild/linux-ppc64': 0.25.1 + '@esbuild/linux-riscv64': 0.25.1 + '@esbuild/linux-s390x': 0.25.1 + '@esbuild/linux-x64': 0.25.1 + '@esbuild/netbsd-arm64': 0.25.1 + '@esbuild/netbsd-x64': 0.25.1 + '@esbuild/openbsd-arm64': 0.25.1 + '@esbuild/openbsd-x64': 0.25.1 + '@esbuild/sunos-x64': 0.25.1 + '@esbuild/win32-arm64': 0.25.1 + '@esbuild/win32-ia32': 0.25.1 + '@esbuild/win32-x64': 0.25.1 escalade@3.2.0: {} @@ -5965,7 +5965,7 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.4.49: + postcss@8.5.3: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 @@ -6487,10 +6487,10 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - vite@6.0.11(@types/node@22.10.5)(sass@1.84.0): + vite@6.2.2(@types/node@22.10.5)(sass@1.84.0): dependencies: - esbuild: 0.24.2 - postcss: 8.4.49 + esbuild: 0.25.1 + postcss: 8.5.3 rollup: 4.32.1 optionalDependencies: '@types/node': 22.10.5 From 131f7a0156fb399025d0cf4a149d55de1cd222af Mon Sep 17 00:00:00 2001 From: OJ Abba Date: Tue, 18 Mar 2025 16:42:18 +0000 Subject: [PATCH 21/22] [Chore] Update GPS branding to "Advanced Connect" --- manifest.json | 19 ++++++++++--------- src/pages/Login/useLogin.ts | 7 +++---- src/types/deskpro.ts | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/manifest.json b/manifest.json index 7ee0aee..43c2648 100644 --- a/manifest.json +++ b/manifest.json @@ -16,10 +16,11 @@ } ], "settings": { - "use_deskpro_saas": { - "title": "One-Click Installation", + "use_advanced_connect": { + "title": "Advanced Connect", + "description": "Follow the setup guide and use your credentials to connect the app to Deskpro.", "type": "boolean", - "default": true, + "default": false, "isRequired": false, "isBackendOnly": false, "order": 5 @@ -30,7 +31,7 @@ "isRequired": false, "isBackendOnly": false, "default": false, - "condition": "settings.use_deskpro_saas != true", + "condition": "settings.use_advanced_connect != false", "order": 10 }, "access_token": { @@ -39,7 +40,7 @@ "type": "string", "isRequired": false, "isBackendOnly": true, - "condition": "settings.use_deskpro_saas != true && settings.use_access_token == true", + "condition": "settings.use_advanced_connect != false && settings.use_access_token == true", "order": 20 }, "verify_settings": { @@ -51,7 +52,7 @@ }, "isRequired": false, "isBackendOnly": true, - "condition": "settings.use_deskpro_saas != true && settings.use_access_token == true", + "condition": "settings.use_advanced_connect != false && settings.use_access_token == true", "order": 30 }, "client_id": { @@ -59,7 +60,7 @@ "type": "string", "isRequired": false, "isBackendOnly": false, - "condition": "settings.use_deskpro_saas != true && settings.use_access_token != true", + "condition": "settings.use_advanced_connect != false && settings.use_access_token != true", "order": 40 }, "client_secret": { @@ -67,7 +68,7 @@ "type": "string", "isRequired": false, "isBackendOnly": true, - "condition": "settings.use_deskpro_saas != true && settings.use_access_token != true", + "condition": "settings.use_advanced_connect != false && settings.use_access_token != true", "order": 50 }, "callback_url": { @@ -78,7 +79,7 @@ }, "isRequired": false, "isBackendOnly": true, - "condition": "settings.use_deskpro_saas != true && settings.use_access_token != true", + "condition": "settings.use_advanced_connect != false && settings.use_access_token != true", "order": 60 } }, diff --git a/src/pages/Login/useLogin.ts b/src/pages/Login/useLogin.ts index feeb54d..02406f5 100644 --- a/src/pages/Login/useLogin.ts +++ b/src/pages/Login/useLogin.ts @@ -26,8 +26,7 @@ export default function useLogin(): UseLogin { const user = context?.data?.ticket?.primaryUser || context?.data?.user useInitialisedDeskproAppClient(async (client) => { - if (context?.settings.use_deskpro_saas === undefined || !user) { - // Make sure settings have loaded. + if (!user) { return } @@ -36,7 +35,7 @@ export default function useLogin(): UseLogin { setError("Enable OAuth to access this page"); return } - const mode = context?.settings.use_deskpro_saas ? 'global' : 'local'; + const mode = context?.settings.use_advanced_connect === false ? 'global' : 'local'; const clientId = context?.settings.client_id; if (mode === 'local' && (typeof clientId !== 'string' || clientId.trim() === "")) { @@ -77,7 +76,7 @@ export default function useLogin(): UseLogin { setAuthUrl(oauth2Response.authorizationUrl) setOAuth2Context(oauth2Response) - }, [setAuthUrl, context?.settings.use_deskpro_saas]) + }, [setAuthUrl, context?.settings.use_advanced_connect]) useInitialisedDeskproAppClient((client) => { if (!user || !oauth2Context) { diff --git a/src/types/deskpro.ts b/src/types/deskpro.ts index e7a9263..a772803 100644 --- a/src/types/deskpro.ts +++ b/src/types/deskpro.ts @@ -1,7 +1,7 @@ /** Deskpro types */ export type Settings = { client_id?: string, - use_deskpro_saas?: boolean, + use_advanced_connect?: boolean, use_access_token?: boolean, }; From faf3bebf1b87025fb9d0e376e211a62c963b9aed Mon Sep 17 00:00:00 2001 From: OJ Abba Date: Tue, 18 Mar 2025 16:51:07 +0000 Subject: [PATCH 22/22] [Bug] Fix `isUsingOAuth` logic --- src/pages/Loading/LoadingPage.tsx | 2 +- src/pages/Login/useLogin.ts | 3 ++- src/pages/Main.tsx | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/pages/Loading/LoadingPage.tsx b/src/pages/Loading/LoadingPage.tsx index 82459f5..2d6b539 100644 --- a/src/pages/Loading/LoadingPage.tsx +++ b/src/pages/Loading/LoadingPage.tsx @@ -16,7 +16,7 @@ const LoadingPage: FC = () => { const navigate = useNavigate(); // Determine authentication method from settings - const isUsingOAuth = context?.settings.use_access_token !== true + const isUsingOAuth = context?.settings.use_access_token !== true || context.settings.use_advanced_connect === false const user = context?.data?.ticket?.primaryUser || context?.data?.user useDeskproElements(({ registerElement, clearElements }) => { diff --git a/src/pages/Login/useLogin.ts b/src/pages/Login/useLogin.ts index 02406f5..0227b5c 100644 --- a/src/pages/Login/useLogin.ts +++ b/src/pages/Login/useLogin.ts @@ -24,6 +24,7 @@ export default function useLogin(): UseLogin { const { context } = useDeskproLatestAppContext() const user = context?.data?.ticket?.primaryUser || context?.data?.user + const isUsingOAuth = context?.settings.use_access_token !== true || context.settings.use_advanced_connect === false useInitialisedDeskproAppClient(async (client) => { if (!user) { @@ -31,7 +32,7 @@ export default function useLogin(): UseLogin { } // Ensure they aren't using access tokens - if (context.settings.use_access_token === true) { + if (!isUsingOAuth) { setError("Enable OAuth to access this page"); return } diff --git a/src/pages/Main.tsx b/src/pages/Main.tsx index cf8dfc1..20c23f1 100644 --- a/src/pages/Main.tsx +++ b/src/pages/Main.tsx @@ -9,8 +9,8 @@ import surveyJson from "@/mapping/survey.json"; const Main = () => { const { logoutActiveUser } = useLogout() const { context } = useDeskproLatestAppContext() - const isUsingOAuth = context?.settings?.use_access_token !== true + const isUsingOAuth = context?.settings?.use_access_token !== true || context.settings.use_advanced_connect === false useInitialisedDeskproAppClient((client) => { client.setTitle("SurveyMonkey");