Merge branch 'main' into feature/splunk-direct-delivery

This commit is contained in:
ukrocks007 2024-04-17 14:32:46 +05:30
commit 6665967f20
25 changed files with 2907 additions and 894 deletions

View File

@ -32,7 +32,7 @@ jobs:
IMAGE_SUFFIX: ${{ steps.version.outputs.IMAGE_SUFFIX }}
IMAGE_PATH: ${{ steps.version.outputs.IMAGE_PATH }}
env:
NEXTAUTH_SECRET: ${{ secrets.NEXTAUTH_SECRET }}
NEXTAUTH_SECRET: secret
NEXTAUTH_URL: http://localhost:5225
NEXTAUTH_ACL: '*@boxyhq.com'
DB_ENGINE: sql
@ -42,8 +42,8 @@ jobs:
SAML_AUDIENCE: https://saml.boxyhq.com
JACKSON_API_KEYS: secret
OPENID_JWS_ALG: RS256
OPENID_RSA_PUBLIC_KEY: ${{ secrets.OPENID_RSA_PUBLIC_KEY }}
OPENID_RSA_PRIVATE_KEY: ${{ secrets.OPENID_RSA_PRIVATE_KEY }}
OPENID_RSA_PUBLIC_KEY: 'LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQm9qQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FZOEFNSUlCaWdLQ0FZRUFtRzRtVXhmYll3OTAxRHNzZXVaSwpqMlFSVXIrL2FpWWxyVCs1NkxwK1pETDByVmhpVVdHSCtBK09jT24xZW9mS2tJTktvVTBVQmR1S2RTZ2ZuNkk0Ckg2cUNTdXhCaW50alloZTM5a1ZqMXFUL2o3UGtCWXFtQXhxVnZiY25lMERCczJBVnUyeStSS3ZBMC9RQUUwQk0KMlJrakFCcXFQTHFHOWtLSVBmTHJSVG82ZGNuNjduZm10bCtHNkVQVEtqRWZpRExvYWJ3bFF6VGJQVm5UcGVLbgo2V0NPMkpFVHpicng3T1k2S0J1QTllVDJlRS9CNGVPeVU1bUlqVEVhV1BqcmFZWWVPNnVyVEo5Qmsxa3pveWNrClZ2MG94K2VCZUh2NEpDSVhicGJxQnN3L0hhekVyWFJjQjR5TGVDd0lnRUllL2xhRkJiOE5odVdCQ3NmNXd4Z3EKNzZIc0xYN2FBSEwraGZEaDJmayt2aFlWQmc4dlBwQ0QrODJiLzBQMHhkRXR1elViMlo5eDdxNjR1alBBSTJsMwpSUWdqVzdvV0xDVHZRRVB0SUd3SVppRGdSM1FYRk5pYVpuQUFCalVwSElyVG1DYW85N3hPS1ZOS0FaUk9kWHpRCko0anM5SlZvZnFmTmViQ1hBWFVBOExwYlNtS3g4S3VRZkVQeXVUUTAzR3lCQWdNQkFBRT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg=='
OPENID_RSA_PRIVATE_KEY: 'LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUcvUUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQnVjd2dnYmpBZ0VBQW9JQmdRQ1liaVpURjl0akQzVFUKT3l4NjVrcVBaQkZTdjc5cUppV3RQN25vdW41a012U3RXR0pSWVlmNEQ0NXc2ZlY2aDhxUWcwcWhUUlFGMjRwMQpLQitmb2pnZnFvSks3RUdLZTJOaUY3ZjJSV1BXcFArUHMrUUZpcVlER3BXOXR5ZDdRTUd6WUJXN2JMNUVxOERUCjlBQVRRRXpaR1NNQUdxbzh1b2IyUW9nOTh1dEZPanAxeWZydWQrYTJYNGJvUTlNcU1SK0lNdWhwdkNWRE5OczkKV2RPbDRxZnBZSTdZa1JQTnV2SHM1am9vRzREMTVQWjRUOEhoNDdKVG1ZaU5NUnBZK090cGhoNDdxNnRNbjBHVApXVE9qSnlSVy9Takg1NEY0ZS9na0loZHVsdW9HekQ4ZHJNU3RkRndIakl0NExBaUFRaDcrVm9VRnZ3Mkc1WUVLCngvbkRHQ3J2b2V3dGZ0b0FjdjZGOE9IWitUNitGaFVHRHk4K2tJUDd6WnYvUS9URjBTMjdOUnZabjNIdXJyaTYKTThBamFYZEZDQ05idWhZc0pPOUFRKzBnYkFobUlPQkhkQmNVMkpwbWNBQUdOU2tjaXRPWUpxajN2RTRwVTBvQgpsRTUxZk5BbmlPejBsV2grcDgxNXNKY0JkUUR3dWx0S1lySHdxNUI4US9LNU5EVGNiSUVDQXdFQUFRS0NBWUFMCkNYL0VLTUF4a1MwUkVIdFJKMU5yQkZDR1RMek9FWGJOTDRYMU9tcThNOTNZWHVQWWwyNnVXU2NEMlViMWNUZHIKUlJ4dVowdTl2RmF2VXNGT2NHTXV0TXlVSXYwQWExeUgvZVpyd2p5L1RpbDBsTzZiOFowQmNNZDZxaFJGWmd3WQpna3EwakdSUENkNHZvclZ1TDJ2WkZPcytQdEFJajJ1R0VZMTJxZHdjQWtJNUpPL0MzR0x6M2VFaGVJYkY0WEp5CmJOZzhEcnZtZk1GcXRQSkFxdE9rY0FITDM5NWVtVXlhN2hVME1nQ2huV3QwelBhaGxmaUR1ZVJqcjlSajhKc1QKZllqcGQzelZZc0ZQMy85aWRjRW9NUk1DVEFnelZEVXBrbCt3ajhrOFVxTWUvdjdrVFlKTHBQMHQ5N2xsR3FaUwo4dEdpeXRidTRlems5NDNFZ2IwNDM3Q1VndVdQV3BsVzEzUDlSSUV4bkZjd2F4Uk15RWV1RFRxcHg1NWxTdE81CmZXOTdzSFFuM2dQbWVpaTVRODdUM0FzYkY5bHZ5d1g5bDlMdUJoc0RLdlRRVVRpV2cyRFV6bjlQRWRFb0xLWnYKd0xFU1VDZkFSd1NzZU5Kbm80TlRPUUc3ekFvdEsvRFhWWms4NFZ5dUlvMEpsS08wM202dEpORXl5Z1gwNUtrQwpnY0VBMExvSHVlRXAzOHRheWU0aEROWlFqVi9tc1RKek56SmhVOGZXNFlZaGMyOFdFVlF2N0lTNUw2N2draGhxCkoxUklEZTBtYUI5a1Q1Z09GR1VPdy9JYUdxWnB4WUphcUlZZ25GeFk4VmE4cHB6R0hFV25xeEdMNytESHg2U0oKb3FHUkd4UWRUU1QvY3lZZnVyR2RHaVVMd08xZjF5dUJVM01WdEU1S2VSRTlDSEVUV2FiOEhXQ0VhekFsNWVxOAo2aVNXdU9wQlFRa3NucStudTNIYXNPOGIxOU4zZ0x5Y2ZWb1ZzWnByd0RENzBCTXZkTFNDdVVrNW0rY1FINVdsCkN2dVpBb0hCQUxyMERmdTE1UjZuUTFIT3BTODFVSXNqTzJ0dm12OVpQMjVqbklPdUYxYnFob0xzTEdCbkhnUkwKM1VZNnRmT3E2a2ZZZlZwWWxINjZ4MHRvK3lvQ2Fodk11NXo0ZEV3M2hQb1F5Tk1IZkcyQklMOVVhV3VjZEFHWgpYOXY2WkI5U3o3NWd2M3BJQUZwdzhwUHlvZzhqbWdDM1dQaXBIek0wOTRCYmZJL0tramlYeWNrRGx5ZDAvZ2FQCmhPbXV1MnM4aVl6QUcwd1BpOFJ4VVRTS2tFZnlUNnF4ZGxwdUFNTEhkTGxKdnRKejMrNWEzZlJvUmdXb1Vld3kKcHlodXpHZkpLUUtCd0dqS3JTeFdibGFNV3hWOGQ1MWhUK25hbHhDcG1vekF2M3AzbjF0MG93QzRhZVRqVm5neApubVBoTWFCSG42d0ZOWFBBZDRMWkY5eWFJNTk3cVRFWk1KL21vcjNsbHl4NndvNmVFbzJBRlpDMHJ3WHN0cVE5ClYvdGo2QWxFZzFGaU9sN1U5MjBPd1MySG0zQjQwYjRaa1ZBWUhRRURONWUwOU5Xa1pPRnBsVEhTeTNzOFNlRloKM3NHTjE4a1oxQ1RkbjhwUTJkZ1VDaEhWY0ttOEhLYXVOVlZqTnVFc1VJamluSGVoWnEyRUtqaXFHUzVIbmtYMgpESFZJU2FFQjJXMnRLUUtCd0RnRkphT0ZUOUN0b2ppRFNYQXA4NmFkdWhKcGNQS1BGYmpJVklBSXpLbVl3UkcrCkgxWUwwQ3pOWnRMQ2lQOG8rZWJwY2paK1VKRGcreE1YdEJ0VWVlTTJxQWxUVWRYODFQWHh6WnVlcEtSVGl6S0oKNHNVQ0xxakVBcnR4L2twOGtBK21BZnBzVk43RTlZdHJxekFLSlAyTjh6VWZ5Ritad1loTzRiWmNweEFhTzdibQpRb2JxUWF4Sm1UUkV6WmhHblpqMWY3aDgrQTYzUGZRV2lVRmwxSVY3ZzlGNUlQVTh1emRDWjlHOE14L0RUcnNMCis5OTZIb0krYzJSa1B3L2ljUUtCd1FDNDF1VzlRQWVkRzdXWFNvMGcrYXNkSm9rNEQrZ21iZCtkQnU4R1R4MUIKWlBlVlRzZ0wwR1NMVXVrNlZHRXh2RkV0cWhoaHh2amdXdWpNaVBDd093cFBxQ1JaYmVnSDM4WG1pMWh5dXNIeQpwYzh1ekU0OHZ1ajgvYlJScDR4MFppQXJJZUZGOGNCaVV4Y292ZCtOYzd6d1dsTGhaakJkNS9mL3U2VllGS0Y0CktjSkRjb1JaWWM3Tm9DSXA4aFpBSlhXNjFWMXY3NWVxVDlYUldHaVNkNlB3Z3ZhQzUwNkFPeVgvOWNJNFltSVIKeHppM3RweW40bmJjUUdFZHpsMHFKVVU9Ci0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K'
PLANETSCALE_URL: mysql://root:mysql@localhost:3308/mysql
DYNAMODB_URL: 'http://localhost:8000'
BOXYHQ_NO_ANALYTICS: '1'
@ -117,8 +117,8 @@ jobs:
env:
APP_URL: http://localhost:4000
ENTITY_ID: https://saml.example.com/entityid
PUBLIC_KEY: ${{ secrets.MOCK_SAML_PUBLIC_KEY }}
PRIVATE_KEY: ${{ secrets.MOCK_SAML_PRIVATE_KEY }}
PUBLIC_KEY: 'LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURiVENDQWxXZ0F3SUJBZ0lVUWR0Q05FRnRGYWF6OUtNYkp6eUhCVm5vMWZFd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1JURUxNQWtHQTFVRUJoTUNSMEl4RXpBUkJnTlZCQWdNQ2xOdmJXVXRVM1JoZEdVeElUQWZCZ05WQkFvTQpHRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpEQWdGdzB5TkRBME1UUXhNVFUwTkRkYUdBOHpNREl6Ck1EZ3hOakV4TlRRME4xb3dSVEVMTUFrR0ExVUVCaE1DUjBJeEV6QVJCZ05WQkFnTUNsTnZiV1V0VTNSaGRHVXgKSVRBZkJnTlZCQW9NR0VsdWRHVnlibVYwSUZkcFpHZHBkSE1nVUhSNUlFeDBaRENDQVNJd0RRWUpLb1pJaHZjTgpBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXpaTFprL2VBUXExZ3BmdWR0cklXdC9MbzZaRjFveXp4T09PV2xmCndSR1ZoT1VjbkEwb2g1SmxXdUQ4TjdEQzMyY2p0OER3dXpRcGZWcWk0M1hOVnhNbG4yTm9NUlJJNVhjQlpYMkYKai9mdnphTG5nUkk1ZkQ3WGxHRGlQcktHOGVWR2YvUzAzYnVWS2d1VzFaSldUL0xlZzlqNWtXS3RxWTA0a3M1SwpET29IN0JOaGNYaXE2R2ZYek5FL0F0WFBKYWF1OU1SRG5ZclYvVFlINENBR2hSclNBc0pROU5zYXJFWjZKN21SClY2VE4xNU9KS2ZpSHhRUURNMWJvTkYzdVMwSkFuc3BtcElHTERlQ0xzdkNHTEwyeGFxVHJXVzVvMnlrWkxsYm4KSThuOG1WcHBQams2MElsVFUyWjJ5TW9ZL0VmRE9CcUIwSWdNa1U3dzlQSVdla01DQXdFQUFhTlRNRkV3SFFZRApWUjBPQkJZRUZCaUNTNEswejdlR2lWYXI2dlUrb2lzWEdkWlVNQjhHQTFVZEl3UVlNQmFBRkJpQ1M0SzB6N2VHCmlWYXI2dlUrb2lzWEdkWlVNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUIKQUNpMFZSN0lHdmdHbmdyL1lpZkxZZzZwWUlFc010cGFsMmYxekMzZGpkRElPTHlmVk12aTJzdUtUazM2MkNGeApXU2lxaVc4UXhPbDZlZTdrUVhTbnpJVlRMb2hwcm5WVFVmeUpXUlpJdThvbGpkREprSE9yekV3YktqZUhsbU1PClZxODZGbzBpN0NnTG1oTjh1dDVyNFdHdytYVElZc2lkZC9SaUFGMlFRMVR4QkJaN3hoZVJlU0o5M0tGd29FbkQKcU5hLzE2VUpsdWpXbmRTMEF2Q09weEFnWXJFL1czbzJqUWVnczZmMnhWemozbFc2WVpEaVg5YXBrUTVKZWlscwp3WFRuSHMvL3dlcCsvWndYbXcrYXQrNXRXRU9ycU15TERDbXpFc294MFBmQUhZdlQ4M0hTMWZtL2RiQUJHNlJwCkcxTU41OUMyYmRxUHd3K0hUVEplZFVvPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg=='
PRIVATE_KEY: 'LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2d0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktrd2dnU2xBZ0VBQW9JQkFRRE0yUzJaUDNnRUt0WUsKWDduYmF5RnJmeTZPbVJkYU1zOFRqamxwWDhFUmxZVGxISndOS0llU1pWcmcvRGV3d3Q5bkk3ZkE4THMwS1gxYQpvdU4xelZjVEpaOWphREVVU09WM0FXVjloWS8zNzgyaTU0RVNPWHcrMTVSZzRqNnlodkhsUm4vMHROMjdsU29MCmx0V1NWay95M29QWStaRmlyYW1OT0pMT1NnenFCK3dUWVhGNHF1aG4xOHpSUHdMVnp5V21ydlRFUTUySzFmMDIKQitBZ0JvVWEwZ0xDVVBUYkdxeEdlaWU1a1Zla3pkZVRpU240aDhVRUF6Tlc2RFJkN2t0Q1FKN0tacVNCaXczZwppN0x3aGl5OXNXcWs2MWx1YU5zcEdTNVc1eVBKL0psYWFUNDVPdENKVTFObWRzaktHUHhId3pnYWdkQ0lESkZPCjhQVHlGbnBEQWdNQkFBRUNnZ0VBQ0NPbytDblpidkQweUR5OWVjWnI4WVdBS0JKVkp6UlZuZ1ZNcXE4dlVLK00KTkQ1S3hRc1ROL0huQm9GL0JQcjVQWFBoM1R5emM0TWlnL05zN2tWV2JHQldVUERXNG1OekdxTm5rUEU1b3pSWQpDMXovZCtYbzFlWmk4dWFLYnpXRmJ3SzZHdE1FN0dzazNJa0Z1MmJLam0vZzlVSVZVTUp0dGpyRk9vVWV0ajNBCkpFWU5TZFplWFA2Z0RXeitlR0F6V2RXRnlNZ1hHT0hCanVMekt1S3kwb2xQaUFHRTJIMlhicHlCSEk2K09taHUKemU4VEhYSUg0YW1TOTdaN0ZlWTdZaDZPV0xoeVByaVh3VGZjNk1NaktubUdWOWQ3RytVanIyS3NVNGtYMG1MRApQKzhsS1NqVnFvUjF2YUswWEJiV0Fnd0kwbVd4TjhQMFZqSzRjMzJUNFFLQmdRRG9wZUJ6cE1xVjFlY24ydkFzCnkvRW5JeXdMcUlBVUZuRXRsRnlnMkVOM2ZZMDRkUTBqOWNzM0ZqbXNQK3grYjA1U2pJK05vVVQzRUowNC96Uk8KMFcvcmc0cEVTUlNDOHRtelliUGkycktrc2xLSDhmUWd2YzZKV1FVUThsWWx2elh6OTZiTFlxeFNtK0EwZ1Z4QQpEc2JNQk5NZDEzdk5Wa1VjTURsMnNveTNMUUtCZ1FEaGFQWnF4QzRxSVB1TlhOZE5EbExRVGZIWGxFMzRRTXVaCnNiM3J1NVdwbkJOdWpCU0xHREV2a0pvckprcUZ1b3VYUnVOOGIrd3BObi9lc0c3TjZyM3o5bHltRkI1VE1Ba3kKTlBPR0dDNWdqOU0wVytGTmw4M2dIVkN6eVgxa3VyR2t1amVHM1F1b2RoYXZBaWpqUzdnNW5Nb1J3OEpwcitUdwp4NEtKMC92ZEx3S0JnUURBSjVHMXNweXBHVjJ0YTRZSVdnSTZvekJVQ0w2UTJPQnVGeVpTcTQwOStuTlQrRW44Ck01Mi9TQm9talQzV1NEVFd0Y1l6NHNuRmp2RnRERXkxOVFLTjhiMllIUXhXQkNPUHA5a2VQQ2hsSSt4SzRLc1YKQi9DNVBNK1VhYlNCeE9iWk5PbU0vMWo1ZWttNjFFWFBtdVRUeWdCZG00ZGoyQ2VJMnNQN3FBblZtUUtCZ1FDZgp0T0N5OE9ETWxLWG1tTnNyQzNUOWhkeE9KQlBDU3haMmhRck5WUkZMSlB4WG5RU0pNTkRZcEptMjdPQnNNNm5uCnV5QSs4SVhoQlc0Lzk3M3FRK0htVXExK05rN3VIZURHSStKUEpoN2w1OEY3SFlaYWxhNFdsbTZ4azVjMm9WaHcKSUVoclUzNkpFM0lxK1ZyREFNazhlS3hyUGNvblc2cllObU4xQ0M4eG5RS0JnUURiOGZTeDBQcHg1WisxL2tCMwpxVGc2RDJYY1YyZGVWNFdsOS9JQ2owRHFqaGpXekJjaThuTjUyb3ZoSmVXcFVxWnJ1eStVWTg2cVRuK09oNGVJClNkZFRBb0F2cU1sL2gzVzdCRUdad2NsclRJSWRqTHVmK0FuRGN5S0lKY21CUG9JZGsydzZ4dkNWczJqbmdEOTMKcjZ0R3VoNHlvM2pIRkRTR0Y3dDdCRk5RSEE9PQotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCg=='
steps:
- uses: actions/checkout@v4
@ -261,6 +261,7 @@ jobs:
with:
format: spdx
artifact-name: npm_sbom.spdx
upload-artifact-retention: 1
- name: Publish report [SPDX]
uses: anchore/sbom-action/publish-sbom@v0
with:
@ -270,6 +271,7 @@ jobs:
with:
format: cyclonedx
artifact-name: npm_sbom.cyclonedx
upload-artifact-retention: 1
- name: Publish report [CycloneDx]
uses: anchore/sbom-action/publish-sbom@v0
with:
@ -299,6 +301,7 @@ jobs:
with:
format: spdx
artifact-name: sbom.spdx
upload-artifact-retention: 1
- name: Publish report [SPDX]
uses: anchore/sbom-action/publish-sbom@v0
with:
@ -308,6 +311,7 @@ jobs:
with:
format: cyclonedx
artifact-name: sbom.cyclonedx
upload-artifact-retention: 1
- name: Publish report [CycloneDx]
uses: anchore/sbom-action/publish-sbom@v0
with:
@ -333,6 +337,7 @@ jobs:
image: ${{ needs.ci.outputs.IMAGE_PATH }}:${{ needs.ci.outputs.PUBLISH_TAG }}
format: spdx
artifact-name: docker_sbom.spdx
upload-artifact-retention: 1
- name: Publish report [Docker][SPDX]
if: github.ref == 'refs/heads/release'
uses: anchore/sbom-action/publish-sbom@v0
@ -345,6 +350,7 @@ jobs:
image: ${{ needs.ci.outputs.IMAGE_PATH }}:${{ needs.ci.outputs.PUBLISH_TAG }}
format: cyclonedx
artifact-name: docker_sbom.cyclonedx
upload-artifact-retention: 1
- name: Publish report [Docker][CycloneDx]
if: github.ref == 'refs/heads/release'
uses: anchore/sbom-action/publish-sbom@v0

View File

@ -47,7 +47,7 @@ const CreateDirectory = ({
excludeFields={
setupLinkToken
? ['name', 'tenant', 'product', 'webhook_url', 'webhook_secret', 'log_webhook_events']
: undefined
: ['log_webhook_events']
}
urls={{
post: setupLinkToken

File diff suppressed because it is too large Load Diff

View File

@ -26,21 +26,21 @@
},
"devDependencies": {
"@rollup/plugin-typescript": "11.1.6",
"@types/node": "20.12.4",
"@types/react": "18.2.74",
"@typescript-eslint/eslint-plugin": "7.5.0",
"@typescript-eslint/parser": "7.5.0",
"@types/node": "20.12.7",
"@types/react": "18.2.79",
"@typescript-eslint/eslint-plugin": "7.7.0",
"@typescript-eslint/parser": "7.7.0",
"@vitejs/plugin-react": "4.2.1",
"eslint": "8.57.0",
"eslint-plugin-react-hooks": "4.6.0",
"eslint-plugin-react-refresh": "0.4.6",
"prettier": "3.2.5",
"react-daisyui": "5.0.0",
"typescript": "5.4.4",
"vite": "5.2.8"
"typescript": "5.4.5",
"vite": "5.2.9"
},
"optionalDependencies": {
"@rollup/rollup-linux-x64-gnu": "4.14.0"
"@rollup/rollup-linux-x64-gnu": "4.14.3"
},
"peerDependencies": {
"@boxyhq/react-ui": ">=3.3.42",

View File

@ -1,13 +1,14 @@
import useSWR from 'swr';
import { useTranslation } from 'next-i18next';
import EyeIcon from '@heroicons/react/24/outline/EyeIcon';
import type { Group } from '../types';
import type { ApiSuccess, Group } from '../types';
import { fetcher, addQueryParamsToPath } from '../utils';
import { DirectoryTab } from '../dsync';
import { usePaginate, useDirectory } from '../hooks';
import { TableBodyType } from '../shared/Table';
import { Loading, Table, EmptyState, Error, Pagination, PageHeader, pageLimit } from '../shared';
import { useRouter } from '../hooks';
import { useEffect } from 'react';
export const DirectoryGroups = ({
urls,
@ -18,7 +19,7 @@ export const DirectoryGroups = ({
}) => {
const { router } = useRouter();
const { t } = useTranslation('common');
const { paginate, setPaginate, pageTokenMap } = usePaginate(router!);
const { paginate, setPaginate, pageTokenMap, setPageTokenMap } = usePaginate(router!);
const params = {
pageOffset: paginate.offset,
@ -26,6 +27,7 @@ export const DirectoryGroups = ({
};
// For DynamoDB
// Use the (next)pageToken mapped to the previous page offset to get the current page
if (paginate.offset > 0 && pageTokenMap[paginate.offset - pageLimit]) {
params['pageToken'] = pageTokenMap[paginate.offset - pageLimit];
}
@ -33,7 +35,15 @@ export const DirectoryGroups = ({
const getUrl = addQueryParamsToPath(urls.getGroups, params);
const { directory, isLoadingDirectory, directoryError } = useDirectory(urls.getDirectory);
const { data, isLoading, error } = useSWR<{ data: Group[] }>(getUrl, fetcher);
const { data, isLoading, error } = useSWR<ApiSuccess<Group[]>>(getUrl, fetcher);
const nextPageToken = data?.pageToken;
useEffect(() => {
if (nextPageToken) {
setPageTokenMap((tokenMap) => ({ ...tokenMap, [paginate.offset]: nextPageToken }));
}
}, [nextPageToken, paginate.offset]);
if (isLoading || isLoadingDirectory) {
return <Loading />;

View File

@ -1,13 +1,14 @@
import useSWR from 'swr';
import { useTranslation } from 'next-i18next';
import EyeIcon from '@heroicons/react/24/outline/EyeIcon';
import type { User } from '../types';
import type { ApiSuccess, User } from '../types';
import { addQueryParamsToPath, fetcher } from '../utils';
import { DirectoryTab } from '../dsync';
import { usePaginate, useDirectory } from '../hooks';
import { TableBodyType } from '../shared/Table';
import { Loading, Table, EmptyState, Error, Pagination, PageHeader, pageLimit } from '../shared';
import { useRouter } from '../hooks';
import { useEffect } from 'react';
export const DirectoryUsers = ({
urls,
@ -18,7 +19,7 @@ export const DirectoryUsers = ({
}) => {
const { router } = useRouter();
const { t } = useTranslation('common');
const { paginate, setPaginate, pageTokenMap } = usePaginate(router!);
const { paginate, setPaginate, pageTokenMap, setPageTokenMap } = usePaginate(router!);
const params = {
pageOffset: paginate.offset,
@ -26,6 +27,7 @@ export const DirectoryUsers = ({
};
// For DynamoDB
// Use the (next)pageToken mapped to the previous page offset to get the current page
if (paginate.offset > 0 && pageTokenMap[paginate.offset - pageLimit]) {
params['pageToken'] = pageTokenMap[paginate.offset - pageLimit];
}
@ -33,7 +35,15 @@ export const DirectoryUsers = ({
const getUrl = addQueryParamsToPath(urls.getUsers, params);
const { directory, isLoadingDirectory, directoryError } = useDirectory(urls.getDirectory);
const { data, isLoading, error } = useSWR<{ data: User[] }>(getUrl, fetcher);
const { data, isLoading, error } = useSWR<ApiSuccess<User[]>>(getUrl, fetcher);
const nextPageToken = data?.pageToken;
useEffect(() => {
if (nextPageToken) {
setPageTokenMap((tokenMap) => ({ ...tokenMap, [paginate.offset]: nextPageToken }));
}
}, [nextPageToken, paginate.offset]);
if (isLoading || isLoadingDirectory) {
return <Loading />;

View File

@ -1,8 +1,8 @@
import useSWR from 'swr';
import { useState } from 'react';
import { useEffect, useState } from 'react';
import { useTranslation } from 'next-i18next';
import EyeIcon from '@heroicons/react/24/outline/EyeIcon';
import type { WebhookEventLog } from '../types';
import { ApiSuccess, type WebhookEventLog } from '../types';
import { fetcher, addQueryParamsToPath } from '../utils';
import { DirectoryTab } from '../dsync';
import { usePaginate, useDirectory } from '../hooks';
@ -32,7 +32,7 @@ export const DirectoryWebhookLogs = ({
const { router } = useRouter();
const { t } = useTranslation('common');
const [delModalVisible, setDelModalVisible] = useState(false);
const { paginate, setPaginate, pageTokenMap } = usePaginate(router!);
const { paginate, setPaginate, pageTokenMap, setPageTokenMap } = usePaginate(router!);
const params = {
pageOffset: paginate.offset,
@ -40,6 +40,7 @@ export const DirectoryWebhookLogs = ({
};
// For DynamoDB
// Use the (next)pageToken mapped to the previous page offset to get the current page
if (paginate.offset > 0 && pageTokenMap[paginate.offset - pageLimit]) {
params['pageToken'] = pageTokenMap[paginate.offset - pageLimit];
}
@ -47,7 +48,15 @@ export const DirectoryWebhookLogs = ({
const getUrl = addQueryParamsToPath(urls.getEvents, params);
const { directory, isLoadingDirectory, directoryError } = useDirectory(urls.getDirectory);
const { data, isLoading, error } = useSWR<{ data: WebhookEventLog[] }>(getUrl, fetcher);
const { data, isLoading, error } = useSWR<ApiSuccess<WebhookEventLog[]>>(getUrl, fetcher);
const nextPageToken = data?.pageToken;
useEffect(() => {
if (nextPageToken) {
setPageTokenMap((tokenMap) => ({ ...tokenMap, [paginate.offset]: nextPageToken }));
}
}, [nextPageToken, paginate.offset]);
if (isLoading || isLoadingDirectory) {
return <Loading />;

View File

@ -17,6 +17,7 @@ import { TableBodyType } from '../shared/Table';
import { pageLimit } from '../shared/Pagination';
import { usePaginate } from '../hooks';
import { useRouter } from '../hooks';
import { useEffect } from 'react';
type ExcludeFields = keyof Pick<SAMLFederationApp, 'product'>;
@ -35,7 +36,7 @@ export const FederatedSAMLApps = ({
}) => {
const { router } = useRouter();
const { t } = useTranslation('common');
const { paginate, setPaginate, pageTokenMap } = usePaginate(router!);
const { paginate, setPaginate, pageTokenMap, setPageTokenMap } = usePaginate(router!);
let getAppsUrl = `${urls.getApps}?pageOffset=${paginate.offset}&pageLimit=${pageLimit}`;
@ -44,7 +45,18 @@ export const FederatedSAMLApps = ({
getAppsUrl += `&pageToken=${pageTokenMap[paginate.offset - pageLimit]}`;
}
const { data, isLoading, error } = useSWR<{ data: SAMLFederationApp[] }>(getAppsUrl, fetcher);
const { data, isLoading, error } = useSWR<{ data: SAMLFederationApp[]; pageToken?: string }>(
getAppsUrl,
fetcher
);
const nextPageToken = data?.pageToken;
useEffect(() => {
if (nextPageToken) {
setPageTokenMap((tokenMap) => ({ ...tokenMap, [paginate.offset]: nextPageToken }));
}
}, [nextPageToken, paginate.offset]);
if (isLoading) {
return <Loading />;

View File

@ -1,5 +1,5 @@
import useSWR from 'swr';
import { useState } from 'react';
import { useEffect, useState } from 'react';
import { useTranslation } from 'next-i18next';
import EyeIcon from '@heroicons/react/24/outline/EyeIcon';
import TrashIcon from '@heroicons/react/24/outline/TrashIcon';
@ -51,7 +51,7 @@ export const SetupLinks = ({
const [showSetupLink, setShowSetupLink] = useState(false);
const [showRegenModal, setShowRegenModal] = useState(false);
const [setupLink, setSetupLink] = useState<SetupLink | null>(null);
const { paginate, setPaginate, pageTokenMap } = usePaginate(router!);
const { paginate, setPaginate, pageTokenMap, setPageTokenMap } = usePaginate(router!);
const params = {
pageOffset: paginate.offset,
@ -65,7 +65,18 @@ export const SetupLinks = ({
}
const getLinksUrl = addQueryParamsToPath(urls.getLinks, params);
const { data, isLoading, error, mutate } = useSWR<{ data: SetupLink[] }>(getLinksUrl, fetcher);
const { data, isLoading, error, mutate } = useSWR<{ data: SetupLink[]; pageToken?: string }>(
getLinksUrl,
fetcher
);
const nextPageToken = data?.pageToken;
useEffect(() => {
if (nextPageToken) {
setPageTokenMap((tokenMap) => ({ ...tokenMap, [paginate.offset]: nextPageToken }));
}
}, [nextPageToken, paginate.offset]);
if (isLoading) {
return <Loading />;

369
npm/package-lock.json generated
View File

@ -9,21 +9,21 @@
"version": "0.0.0",
"license": "Apache 2.0",
"dependencies": {
"@aws-sdk/client-dynamodb": "3.549.0",
"@aws-sdk/credential-providers": "3.549.0",
"@aws-sdk/util-dynamodb": "3.549.0",
"@aws-sdk/client-dynamodb": "3.554.0",
"@aws-sdk/credential-providers": "3.554.0",
"@aws-sdk/util-dynamodb": "3.554.0",
"@boxyhq/error-code-mnemonic": "0.1.1",
"@boxyhq/metrics": "0.2.6",
"@boxyhq/saml20": "1.5.0",
"@googleapis/admin": "16.0.0",
"axios": "1.6.8",
"encoding": "0.1.13",
"jose": "5.2.3",
"jose": "5.2.4",
"lodash": "4.17.21",
"mixpanel": "0.18.0",
"mongodb": "6.5.0",
"mssql": "10.0.2",
"mysql2": "3.9.2",
"mysql2": "3.9.4",
"node-forge": "1.3.1",
"openid-client": "5.6.5",
"pg": "8.11.5",
@ -35,7 +35,7 @@
"devDependencies": {
"@faker-js/faker": "8.4.1",
"@types/lodash": "4.17.0",
"@types/node": "20.12.4",
"@types/node": "20.12.7",
"@types/sinon": "17.0.3",
"@types/tap": "15.0.11",
"cross-env": "7.0.3",
@ -45,7 +45,7 @@
"tap": "18.7.2",
"ts-node": "10.9.2",
"tsconfig-paths": "4.2.0",
"typescript": "5.4.4"
"typescript": "5.4.5"
},
"engines": {
"node": ">=16",
@ -77,21 +77,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@aws-crypto/crc32": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz",
"integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==",
"dependencies": {
"@aws-crypto/util": "^3.0.0",
"@aws-sdk/types": "^3.222.0",
"tslib": "^1.11.1"
}
},
"node_modules/@aws-crypto/crc32/node_modules/tslib": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
},
"node_modules/@aws-crypto/ie11-detection": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz",
@ -169,15 +154,15 @@
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
},
"node_modules/@aws-sdk/client-cognito-identity": {
"version": "3.549.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.549.0.tgz",
"integrity": "sha512-KrmjksANuWZTLx8JGtHXsHJ8bA72DoH5rMXhAUQSeSwGYlJKQWeBN9um4XtOOP6fMO9FtEorsG9cxJRk92M7Yw==",
"version": "3.554.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.554.0.tgz",
"integrity": "sha512-/rFufn75nrCj5gTpTLIlDxjGoPeAj+gC3JLVqS2Tlpqx3YhqHiz+jYaHYJbkvrcLMEdDFqaoO3DI7y/GcD59Mg==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
"@aws-sdk/client-sts": "3.549.0",
"@aws-sdk/core": "3.549.0",
"@aws-sdk/credential-provider-node": "3.549.0",
"@aws-sdk/client-sts": "3.554.0",
"@aws-sdk/core": "3.554.0",
"@aws-sdk/credential-provider-node": "3.554.0",
"@aws-sdk/middleware-host-header": "3.535.0",
"@aws-sdk/middleware-logger": "3.535.0",
"@aws-sdk/middleware-recursion-detection": "3.535.0",
@ -188,26 +173,26 @@
"@aws-sdk/util-user-agent-browser": "3.535.0",
"@aws-sdk/util-user-agent-node": "3.535.0",
"@smithy/config-resolver": "^2.2.0",
"@smithy/core": "^1.4.1",
"@smithy/core": "^1.4.2",
"@smithy/fetch-http-handler": "^2.5.0",
"@smithy/hash-node": "^2.2.0",
"@smithy/invalid-dependency": "^2.2.0",
"@smithy/middleware-content-length": "^2.2.0",
"@smithy/middleware-endpoint": "^2.5.0",
"@smithy/middleware-retry": "^2.3.0",
"@smithy/middleware-endpoint": "^2.5.1",
"@smithy/middleware-retry": "^2.3.1",
"@smithy/middleware-serde": "^2.3.0",
"@smithy/middleware-stack": "^2.2.0",
"@smithy/node-config-provider": "^2.3.0",
"@smithy/node-http-handler": "^2.5.0",
"@smithy/protocol-http": "^3.3.0",
"@smithy/smithy-client": "^2.5.0",
"@smithy/smithy-client": "^2.5.1",
"@smithy/types": "^2.12.0",
"@smithy/url-parser": "^2.2.0",
"@smithy/util-base64": "^2.3.0",
"@smithy/util-body-length-browser": "^2.2.0",
"@smithy/util-body-length-node": "^2.3.0",
"@smithy/util-defaults-mode-browser": "^2.2.0",
"@smithy/util-defaults-mode-node": "^2.3.0",
"@smithy/util-defaults-mode-browser": "^2.2.1",
"@smithy/util-defaults-mode-node": "^2.3.1",
"@smithy/util-endpoints": "^1.2.0",
"@smithy/util-middleware": "^2.2.0",
"@smithy/util-retry": "^2.2.0",
@ -219,15 +204,15 @@
}
},
"node_modules/@aws-sdk/client-dynamodb": {
"version": "3.549.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.549.0.tgz",
"integrity": "sha512-0pwxpR7AuoRk+K6l2G+/jVSaALcFDt3b8EC0mEU0WhLZoWIS4Zvue3RUbnwEMyKckydO2DgYshsCvSSmLDjlcA==",
"version": "3.554.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.554.0.tgz",
"integrity": "sha512-w1Bepf3r8tTSymBiXqDHfzDc7J9b0sRbQeRtFUmCI9HFiQkLhDigGBkorNkJohCzwO1Pxh6Z4/a0mWZ7d8f1Zw==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
"@aws-sdk/client-sts": "3.549.0",
"@aws-sdk/core": "3.549.0",
"@aws-sdk/credential-provider-node": "3.549.0",
"@aws-sdk/client-sts": "3.554.0",
"@aws-sdk/core": "3.554.0",
"@aws-sdk/credential-provider-node": "3.554.0",
"@aws-sdk/middleware-endpoint-discovery": "3.535.0",
"@aws-sdk/middleware-host-header": "3.535.0",
"@aws-sdk/middleware-logger": "3.535.0",
@ -239,26 +224,26 @@
"@aws-sdk/util-user-agent-browser": "3.535.0",
"@aws-sdk/util-user-agent-node": "3.535.0",
"@smithy/config-resolver": "^2.2.0",
"@smithy/core": "^1.4.1",
"@smithy/core": "^1.4.2",
"@smithy/fetch-http-handler": "^2.5.0",
"@smithy/hash-node": "^2.2.0",
"@smithy/invalid-dependency": "^2.2.0",
"@smithy/middleware-content-length": "^2.2.0",
"@smithy/middleware-endpoint": "^2.5.0",
"@smithy/middleware-retry": "^2.3.0",
"@smithy/middleware-endpoint": "^2.5.1",
"@smithy/middleware-retry": "^2.3.1",
"@smithy/middleware-serde": "^2.3.0",
"@smithy/middleware-stack": "^2.2.0",
"@smithy/node-config-provider": "^2.3.0",
"@smithy/node-http-handler": "^2.5.0",
"@smithy/protocol-http": "^3.3.0",
"@smithy/smithy-client": "^2.5.0",
"@smithy/smithy-client": "^2.5.1",
"@smithy/types": "^2.12.0",
"@smithy/url-parser": "^2.2.0",
"@smithy/util-base64": "^2.3.0",
"@smithy/util-body-length-browser": "^2.2.0",
"@smithy/util-body-length-node": "^2.3.0",
"@smithy/util-defaults-mode-browser": "^2.2.0",
"@smithy/util-defaults-mode-node": "^2.3.0",
"@smithy/util-defaults-mode-browser": "^2.2.1",
"@smithy/util-defaults-mode-node": "^2.3.1",
"@smithy/util-endpoints": "^1.2.0",
"@smithy/util-middleware": "^2.2.0",
"@smithy/util-retry": "^2.2.0",
@ -272,13 +257,13 @@
}
},
"node_modules/@aws-sdk/client-sso": {
"version": "3.549.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.549.0.tgz",
"integrity": "sha512-lz+yflOAj5Q263FlCsKpNqttaCb2NPh8jC76gVCqCt7TPxRDBYVaqg0OZYluDaETIDNJi4DwN2Azcck7ilwuPw==",
"version": "3.554.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.554.0.tgz",
"integrity": "sha512-yj6CgIxCT3UwMumEO481KH4QvwArkAPzD7Xvwe1QKgJATc9bKNEo/FxV8LfnWIJ7nOtMDxbNxYLMXH/Fs1qGaQ==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
"@aws-sdk/core": "3.549.0",
"@aws-sdk/core": "3.554.0",
"@aws-sdk/middleware-host-header": "3.535.0",
"@aws-sdk/middleware-logger": "3.535.0",
"@aws-sdk/middleware-recursion-detection": "3.535.0",
@ -289,26 +274,26 @@
"@aws-sdk/util-user-agent-browser": "3.535.0",
"@aws-sdk/util-user-agent-node": "3.535.0",
"@smithy/config-resolver": "^2.2.0",
"@smithy/core": "^1.4.1",
"@smithy/core": "^1.4.2",
"@smithy/fetch-http-handler": "^2.5.0",
"@smithy/hash-node": "^2.2.0",
"@smithy/invalid-dependency": "^2.2.0",
"@smithy/middleware-content-length": "^2.2.0",
"@smithy/middleware-endpoint": "^2.5.0",
"@smithy/middleware-retry": "^2.3.0",
"@smithy/middleware-endpoint": "^2.5.1",
"@smithy/middleware-retry": "^2.3.1",
"@smithy/middleware-serde": "^2.3.0",
"@smithy/middleware-stack": "^2.2.0",
"@smithy/node-config-provider": "^2.3.0",
"@smithy/node-http-handler": "^2.5.0",
"@smithy/protocol-http": "^3.3.0",
"@smithy/smithy-client": "^2.5.0",
"@smithy/smithy-client": "^2.5.1",
"@smithy/types": "^2.12.0",
"@smithy/url-parser": "^2.2.0",
"@smithy/util-base64": "^2.3.0",
"@smithy/util-body-length-browser": "^2.2.0",
"@smithy/util-body-length-node": "^2.3.0",
"@smithy/util-defaults-mode-browser": "^2.2.0",
"@smithy/util-defaults-mode-node": "^2.3.0",
"@smithy/util-defaults-mode-browser": "^2.2.1",
"@smithy/util-defaults-mode-node": "^2.3.1",
"@smithy/util-endpoints": "^1.2.0",
"@smithy/util-middleware": "^2.2.0",
"@smithy/util-retry": "^2.2.0",
@ -320,14 +305,14 @@
}
},
"node_modules/@aws-sdk/client-sso-oidc": {
"version": "3.549.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.549.0.tgz",
"integrity": "sha512-FbB4A78ILAb8sM4TfBd+3CrQcfZIhe0gtVZNbaxpq5cJZh1K7oZ8vPfKw4do9JWkDUXPLsD9Bwz12f8/JpAb6Q==",
"version": "3.554.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.554.0.tgz",
"integrity": "sha512-M86rkiRqbZBF5VyfTQ/vttry9VSoQkZ1oCqYF+SAGlXmD0Of8587yRSj2M4rYe0Uj7nRQIfSnhDYp1UzsZeRfQ==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
"@aws-sdk/client-sts": "3.549.0",
"@aws-sdk/core": "3.549.0",
"@aws-sdk/client-sts": "3.554.0",
"@aws-sdk/core": "3.554.0",
"@aws-sdk/middleware-host-header": "3.535.0",
"@aws-sdk/middleware-logger": "3.535.0",
"@aws-sdk/middleware-recursion-detection": "3.535.0",
@ -338,26 +323,26 @@
"@aws-sdk/util-user-agent-browser": "3.535.0",
"@aws-sdk/util-user-agent-node": "3.535.0",
"@smithy/config-resolver": "^2.2.0",
"@smithy/core": "^1.4.1",
"@smithy/core": "^1.4.2",
"@smithy/fetch-http-handler": "^2.5.0",
"@smithy/hash-node": "^2.2.0",
"@smithy/invalid-dependency": "^2.2.0",
"@smithy/middleware-content-length": "^2.2.0",
"@smithy/middleware-endpoint": "^2.5.0",
"@smithy/middleware-retry": "^2.3.0",
"@smithy/middleware-endpoint": "^2.5.1",
"@smithy/middleware-retry": "^2.3.1",
"@smithy/middleware-serde": "^2.3.0",
"@smithy/middleware-stack": "^2.2.0",
"@smithy/node-config-provider": "^2.3.0",
"@smithy/node-http-handler": "^2.5.0",
"@smithy/protocol-http": "^3.3.0",
"@smithy/smithy-client": "^2.5.0",
"@smithy/smithy-client": "^2.5.1",
"@smithy/types": "^2.12.0",
"@smithy/url-parser": "^2.2.0",
"@smithy/util-base64": "^2.3.0",
"@smithy/util-body-length-browser": "^2.2.0",
"@smithy/util-body-length-node": "^2.3.0",
"@smithy/util-defaults-mode-browser": "^2.2.0",
"@smithy/util-defaults-mode-node": "^2.3.0",
"@smithy/util-defaults-mode-browser": "^2.2.1",
"@smithy/util-defaults-mode-node": "^2.3.1",
"@smithy/util-endpoints": "^1.2.0",
"@smithy/util-middleware": "^2.2.0",
"@smithy/util-retry": "^2.2.0",
@ -368,17 +353,17 @@
"node": ">=14.0.0"
},
"peerDependencies": {
"@aws-sdk/credential-provider-node": "^3.549.0"
"@aws-sdk/credential-provider-node": "^3.554.0"
}
},
"node_modules/@aws-sdk/client-sts": {
"version": "3.549.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.549.0.tgz",
"integrity": "sha512-63IreJ598Dzvpb+6sy81KfIX5iQxnrWSEtlyeCdC2GO6gmSQVwJzc9kr5pAC83lHmlZcm/Q3KZr3XBhRQqP0og==",
"version": "3.554.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.554.0.tgz",
"integrity": "sha512-EhaA6T0M0DNg5M8TCF1a7XJI5D/ZxAF3dgVIchyF98iNzjYgl/7U8K6hJay2A11aFvVu70g46xYMpz3Meky4wQ==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
"@aws-sdk/core": "3.549.0",
"@aws-sdk/core": "3.554.0",
"@aws-sdk/middleware-host-header": "3.535.0",
"@aws-sdk/middleware-logger": "3.535.0",
"@aws-sdk/middleware-recursion-detection": "3.535.0",
@ -389,26 +374,26 @@
"@aws-sdk/util-user-agent-browser": "3.535.0",
"@aws-sdk/util-user-agent-node": "3.535.0",
"@smithy/config-resolver": "^2.2.0",
"@smithy/core": "^1.4.1",
"@smithy/core": "^1.4.2",
"@smithy/fetch-http-handler": "^2.5.0",
"@smithy/hash-node": "^2.2.0",
"@smithy/invalid-dependency": "^2.2.0",
"@smithy/middleware-content-length": "^2.2.0",
"@smithy/middleware-endpoint": "^2.5.0",
"@smithy/middleware-retry": "^2.3.0",
"@smithy/middleware-endpoint": "^2.5.1",
"@smithy/middleware-retry": "^2.3.1",
"@smithy/middleware-serde": "^2.3.0",
"@smithy/middleware-stack": "^2.2.0",
"@smithy/node-config-provider": "^2.3.0",
"@smithy/node-http-handler": "^2.5.0",
"@smithy/protocol-http": "^3.3.0",
"@smithy/smithy-client": "^2.5.0",
"@smithy/smithy-client": "^2.5.1",
"@smithy/types": "^2.12.0",
"@smithy/url-parser": "^2.2.0",
"@smithy/util-base64": "^2.3.0",
"@smithy/util-body-length-browser": "^2.2.0",
"@smithy/util-body-length-node": "^2.3.0",
"@smithy/util-defaults-mode-browser": "^2.2.0",
"@smithy/util-defaults-mode-node": "^2.3.0",
"@smithy/util-defaults-mode-browser": "^2.2.1",
"@smithy/util-defaults-mode-node": "^2.3.1",
"@smithy/util-endpoints": "^1.2.0",
"@smithy/util-middleware": "^2.2.0",
"@smithy/util-retry": "^2.2.0",
@ -419,18 +404,18 @@
"node": ">=14.0.0"
},
"peerDependencies": {
"@aws-sdk/credential-provider-node": "^3.549.0"
"@aws-sdk/credential-provider-node": "^3.554.0"
}
},
"node_modules/@aws-sdk/core": {
"version": "3.549.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.549.0.tgz",
"integrity": "sha512-jC61OxJn72r/BbuDRCcluiw05Xw9eVLG0CwxQpF3RocxfxyZqlrGYaGecZ8Wy+7g/3sqGRC/Ar5eUhU1YcLx7w==",
"version": "3.554.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.554.0.tgz",
"integrity": "sha512-JrG7ToTLeNf+/S3IiCUPVw9jEDB0DXl5ho8n/HwOa946mv+QyCepCuV2U/8f/1KAX0mD8Ufm/E4/cbCbFHgbSg==",
"dependencies": {
"@smithy/core": "^1.4.1",
"@smithy/core": "^1.4.2",
"@smithy/protocol-http": "^3.3.0",
"@smithy/signature-v4": "^2.2.0",
"@smithy/smithy-client": "^2.5.0",
"@smithy/signature-v4": "^2.2.1",
"@smithy/smithy-client": "^2.5.1",
"@smithy/types": "^2.12.0",
"fast-xml-parser": "4.2.5",
"tslib": "^2.6.2"
@ -440,11 +425,11 @@
}
},
"node_modules/@aws-sdk/credential-provider-cognito-identity": {
"version": "3.549.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.549.0.tgz",
"integrity": "sha512-EADYw4JimdZ3mGhxtAXSdARNunw/4T7Vd82vvsvqavqL3S9jt5+2SrZ2/PYrweJHLRFggMHcBs82FRql1efMaA==",
"version": "3.554.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.554.0.tgz",
"integrity": "sha512-soF84soy9rTAfzsH1ODP0AnJt5JlsJI8k1aWtC08/Al0CZjLkxDRHzaB1wxubFyT2Ql6bpxbDfU6KDFXsQIpdA==",
"dependencies": {
"@aws-sdk/client-cognito-identity": "3.549.0",
"@aws-sdk/client-cognito-identity": "3.554.0",
"@aws-sdk/types": "3.535.0",
"@smithy/property-provider": "^2.2.0",
"@smithy/types": "^2.12.0",
@ -469,16 +454,16 @@
}
},
"node_modules/@aws-sdk/credential-provider-http": {
"version": "3.535.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.535.0.tgz",
"integrity": "sha512-kdj1wCmOMZ29jSlUskRqN04S6fJ4dvt0Nq9Z32SA6wO7UG8ht6Ot9h/au/eTWJM3E1somZ7D771oK7dQt9b8yw==",
"version": "3.552.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.552.0.tgz",
"integrity": "sha512-vsmu7Cz1i45pFEqzVb4JcFmAmVnWFNLsGheZc8SCptlqCO5voETrZZILHYIl4cjKkSDk3pblBOf0PhyjqWW6WQ==",
"dependencies": {
"@aws-sdk/types": "3.535.0",
"@smithy/fetch-http-handler": "^2.5.0",
"@smithy/node-http-handler": "^2.5.0",
"@smithy/property-provider": "^2.2.0",
"@smithy/protocol-http": "^3.3.0",
"@smithy/smithy-client": "^2.5.0",
"@smithy/smithy-client": "^2.5.1",
"@smithy/types": "^2.12.0",
"@smithy/util-stream": "^2.2.0",
"tslib": "^2.6.2"
@ -488,15 +473,15 @@
}
},
"node_modules/@aws-sdk/credential-provider-ini": {
"version": "3.549.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.549.0.tgz",
"integrity": "sha512-k6IIrluZjQpzui5Din8fW3bFFhHaJ64XrsfYx0Ks1mb7xan84dJxmYP3tdDDmLzUeJv5h95ag88taHfjY9rakA==",
"version": "3.554.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.554.0.tgz",
"integrity": "sha512-BQenhg43S6TMJHxrdjDVdVF+HH5tA1op9ZYLyJrvV5nn7CCO4kyAkkOuSAv1NkL+RZsIkW0/vHTXwQOQw3cUsg==",
"dependencies": {
"@aws-sdk/client-sts": "3.549.0",
"@aws-sdk/client-sts": "3.554.0",
"@aws-sdk/credential-provider-env": "3.535.0",
"@aws-sdk/credential-provider-process": "3.535.0",
"@aws-sdk/credential-provider-sso": "3.549.0",
"@aws-sdk/credential-provider-web-identity": "3.549.0",
"@aws-sdk/credential-provider-sso": "3.554.0",
"@aws-sdk/credential-provider-web-identity": "3.554.0",
"@aws-sdk/types": "3.535.0",
"@smithy/credential-provider-imds": "^2.3.0",
"@smithy/property-provider": "^2.2.0",
@ -509,16 +494,16 @@
}
},
"node_modules/@aws-sdk/credential-provider-node": {
"version": "3.549.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.549.0.tgz",
"integrity": "sha512-f3YgalsMuywEAVX4AUm9tojqrBdfpAac0+D320ePzas0Ntbp7ItYu9ceKIhgfzXO3No7P3QK0rCrOxL+ABTn8Q==",
"version": "3.554.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.554.0.tgz",
"integrity": "sha512-poX/+2OE3oxqp4f5MiaJh251p8l+bzcFwgcDBwz0e2rcpvMSYl9jw4AvGnCiG2bmf9yhNJdftBiS1A+KjxV0qA==",
"dependencies": {
"@aws-sdk/credential-provider-env": "3.535.0",
"@aws-sdk/credential-provider-http": "3.535.0",
"@aws-sdk/credential-provider-ini": "3.549.0",
"@aws-sdk/credential-provider-http": "3.552.0",
"@aws-sdk/credential-provider-ini": "3.554.0",
"@aws-sdk/credential-provider-process": "3.535.0",
"@aws-sdk/credential-provider-sso": "3.549.0",
"@aws-sdk/credential-provider-web-identity": "3.549.0",
"@aws-sdk/credential-provider-sso": "3.554.0",
"@aws-sdk/credential-provider-web-identity": "3.554.0",
"@aws-sdk/types": "3.535.0",
"@smithy/credential-provider-imds": "^2.3.0",
"@smithy/property-provider": "^2.2.0",
@ -546,12 +531,12 @@
}
},
"node_modules/@aws-sdk/credential-provider-sso": {
"version": "3.549.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.549.0.tgz",
"integrity": "sha512-BGopRKHs7W8zkoH8qmSHrjudj263kXbhVkAUPxVUz0I28+CZNBgJC/RfVCbOpzmysIQEpwSqvOv1y0k+DQzIJQ==",
"version": "3.554.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.554.0.tgz",
"integrity": "sha512-8QPpwBA31i/fZ7lDZJC4FA9EdxLg5SJ8sPB2qLSjp5UTGTYL2HRl0Eznkb7DXyp/wImsR/HFR1NxuFCCVotLCg==",
"dependencies": {
"@aws-sdk/client-sso": "3.549.0",
"@aws-sdk/token-providers": "3.549.0",
"@aws-sdk/client-sso": "3.554.0",
"@aws-sdk/token-providers": "3.554.0",
"@aws-sdk/types": "3.535.0",
"@smithy/property-provider": "^2.2.0",
"@smithy/shared-ini-file-loader": "^2.4.0",
@ -563,11 +548,11 @@
}
},
"node_modules/@aws-sdk/credential-provider-web-identity": {
"version": "3.549.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.549.0.tgz",
"integrity": "sha512-QzclVXPxuwSI7515l34sdvliVq5leroO8P7RQFKRgfyQKO45o1psghierwG3PgV6jlMiv78FIAGJBr/n4qZ7YA==",
"version": "3.554.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.554.0.tgz",
"integrity": "sha512-HN54DzLjepw5ZWSF9ycGevhFTyg6pjLuLKy5Y8t/f1jFDComzYdGEDe0cdV9YO653W3+PQwZZGz09YVygGYBLg==",
"dependencies": {
"@aws-sdk/client-sts": "3.549.0",
"@aws-sdk/client-sts": "3.554.0",
"@aws-sdk/types": "3.535.0",
"@smithy/property-provider": "^2.2.0",
"@smithy/types": "^2.12.0",
@ -578,21 +563,21 @@
}
},
"node_modules/@aws-sdk/credential-providers": {
"version": "3.549.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.549.0.tgz",
"integrity": "sha512-icbw8zCX2eSGPGBZLD6HKSgUMnpL95KzUikr94sVN81UuP1EnueaWj6gnErqP2Dr05ZEF9wMZxwd91qu8kVTNw==",
"version": "3.554.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.554.0.tgz",
"integrity": "sha512-UMmJ4M7RknSz1p0981t57QUw6DibPEo/GG8+env6Q8dHrEc3pnRL206f1zxLcqzT5RI50XstH/bDtnyC7uRYiw==",
"dependencies": {
"@aws-sdk/client-cognito-identity": "3.549.0",
"@aws-sdk/client-sso": "3.549.0",
"@aws-sdk/client-sts": "3.549.0",
"@aws-sdk/credential-provider-cognito-identity": "3.549.0",
"@aws-sdk/client-cognito-identity": "3.554.0",
"@aws-sdk/client-sso": "3.554.0",
"@aws-sdk/client-sts": "3.554.0",
"@aws-sdk/credential-provider-cognito-identity": "3.554.0",
"@aws-sdk/credential-provider-env": "3.535.0",
"@aws-sdk/credential-provider-http": "3.535.0",
"@aws-sdk/credential-provider-ini": "3.549.0",
"@aws-sdk/credential-provider-node": "3.549.0",
"@aws-sdk/credential-provider-http": "3.552.0",
"@aws-sdk/credential-provider-ini": "3.554.0",
"@aws-sdk/credential-provider-node": "3.554.0",
"@aws-sdk/credential-provider-process": "3.535.0",
"@aws-sdk/credential-provider-sso": "3.549.0",
"@aws-sdk/credential-provider-web-identity": "3.549.0",
"@aws-sdk/credential-provider-sso": "3.554.0",
"@aws-sdk/credential-provider-web-identity": "3.554.0",
"@aws-sdk/types": "3.535.0",
"@smithy/credential-provider-imds": "^2.3.0",
"@smithy/property-provider": "^2.2.0",
@ -704,11 +689,11 @@
}
},
"node_modules/@aws-sdk/token-providers": {
"version": "3.549.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.549.0.tgz",
"integrity": "sha512-rJyeXkXknLukRFGuMQOgKnPBa+kLODJtOqEBf929SpQ96f1I6ytdndmWbB5B/OQN5Fu5DOOQUQqJypDQVl5ibQ==",
"version": "3.554.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.554.0.tgz",
"integrity": "sha512-KMMQ5Cw0FUPL9H8g69Lp08xtzRo7r/MK+lBV6LznWBbCP/NwtZ8awVHaPy2P31z00cWtu9MYkUTviWPqJTaBvg==",
"dependencies": {
"@aws-sdk/client-sso-oidc": "3.549.0",
"@aws-sdk/client-sso-oidc": "3.554.0",
"@aws-sdk/types": "3.535.0",
"@smithy/property-provider": "^2.2.0",
"@smithy/shared-ini-file-loader": "^2.4.0",
@ -732,9 +717,9 @@
}
},
"node_modules/@aws-sdk/util-dynamodb": {
"version": "3.549.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.549.0.tgz",
"integrity": "sha512-HvJmvDNw9GN1vxWjbM7jYqv+DvQVeL21kLQ+Tth24QRPA1tiCrUuBi+lerRZ8fHG/kiZMTGyJ7UOPvljGD84dw==",
"version": "3.554.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.554.0.tgz",
"integrity": "sha512-Q81Rj38Ban8iV0C1b0cOEHWVHveIW67zVyd2gJvn1xdeKz+N4zCCUviL9Dwfsi6YgOaP+eQaaCptsBA0Nrx7YA==",
"dependencies": {
"tslib": "^2.6.2"
},
@ -1186,7 +1171,7 @@
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
"integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
"dev": true,
"devOptional": true,
"dependencies": {
"@jridgewell/trace-mapping": "0.3.9"
},
@ -1365,7 +1350,7 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"dev": true,
"devOptional": true,
"engines": {
"node": ">=6.0.0"
}
@ -1374,13 +1359,13 @@
"version": "1.4.15",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
"integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
"dev": true
"devOptional": true
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.9",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
"integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
"dev": true,
"devOptional": true,
"dependencies": {
"@jridgewell/resolve-uri": "^3.0.3",
"@jridgewell/sourcemap-codec": "^1.4.10"
@ -2091,17 +2076,6 @@
"node": ">=14.0.0"
}
},
"node_modules/@smithy/eventstream-codec": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.2.0.tgz",
"integrity": "sha512-8janZoJw85nJmQZc4L8TuePp2pk1nxLgkxIR0TUjKJ5Dkj5oelB9WtiSSGXCQvNsJl0VSTvK/2ueMXxvpa9GVw==",
"dependencies": {
"@aws-crypto/crc32": "3.0.0",
"@smithy/types": "^2.12.0",
"@smithy/util-hex-encoding": "^2.2.0",
"tslib": "^2.6.2"
}
},
"node_modules/@smithy/fetch-http-handler": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.5.0.tgz",
@ -2323,11 +2297,10 @@
}
},
"node_modules/@smithy/signature-v4": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.2.0.tgz",
"integrity": "sha512-+B5TNzj/fRZzVW3z8UUJOkNx15+4E0CLuvJmJUA1JUIZFp3rdJ/M2H5r2SqltaVPXL0oIxv/6YK92T9TsFGbFg==",
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.2.1.tgz",
"integrity": "sha512-j5fHgL1iqKTsKJ1mTcw88p0RUcidDu95AWSeZTgiYJb+QcfwWU/UpBnaqiB59FNH5MiAZuSbOBnZlwzeeY2tIw==",
"dependencies": {
"@smithy/eventstream-codec": "^2.2.0",
"@smithy/is-array-buffer": "^2.2.0",
"@smithy/types": "^2.12.0",
"@smithy/util-hex-encoding": "^2.2.0",
@ -2433,12 +2406,12 @@
}
},
"node_modules/@smithy/util-defaults-mode-browser": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.2.0.tgz",
"integrity": "sha512-2okTdZaCBvOJszAPU/KSvlimMe35zLOKbQpHhamFJmR7t95HSe0K3C92jQPjKY3PmDBD+7iMkOnuW05F5OlF4g==",
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.2.1.tgz",
"integrity": "sha512-RtKW+8j8skk17SYowucwRUjeh4mCtnm5odCL0Lm2NtHQBsYKrNW0od9Rhopu9wF1gHMfHeWF7i90NwBz/U22Kw==",
"dependencies": {
"@smithy/property-provider": "^2.2.0",
"@smithy/smithy-client": "^2.5.0",
"@smithy/smithy-client": "^2.5.1",
"@smithy/types": "^2.12.0",
"bowser": "^2.11.0",
"tslib": "^2.6.2"
@ -2448,15 +2421,15 @@
}
},
"node_modules/@smithy/util-defaults-mode-node": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.3.0.tgz",
"integrity": "sha512-hfKXnNLmsW9cmLb/JXKIvtuO6Cf4SuqN5PN1C2Ru/TBIws+m1wSgb+A53vo0r66xzB6E82inKG2J7qtwdi+Kkw==",
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.3.1.tgz",
"integrity": "sha512-vkMXHQ0BcLFysBMWgSBLSk3+leMpFSyyFj8zQtv5ZyUBx8/owVh1/pPEkzmW/DR/Gy/5c8vjLDD9gZjXNKbrpA==",
"dependencies": {
"@smithy/config-resolver": "^2.2.0",
"@smithy/credential-provider-imds": "^2.3.0",
"@smithy/node-config-provider": "^2.3.0",
"@smithy/property-provider": "^2.2.0",
"@smithy/smithy-client": "^2.5.0",
"@smithy/smithy-client": "^2.5.1",
"@smithy/types": "^2.12.0",
"tslib": "^2.6.2"
},
@ -3101,22 +3074,22 @@
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
"integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==",
"dev": true
"devOptional": true
},
"node_modules/@tsconfig/node12": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
"integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
"dev": true
"devOptional": true
},
"node_modules/@tsconfig/node14": {
"version": "1.0.3",
"dev": true,
"devOptional": true,
"license": "MIT"
},
"node_modules/@tsconfig/node16": {
"version": "1.0.4",
"dev": true,
"devOptional": true,
"license": "MIT"
},
"node_modules/@tsconfig/node18": {
@ -3166,9 +3139,9 @@
"dev": true
},
"node_modules/@types/node": {
"version": "20.12.4",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.4.tgz",
"integrity": "sha512-E+Fa9z3wSQpzgYQdYmme5X3OTuejnnTx88A6p6vkkJosR3KBz+HpE3kqNm98VE6cfLFcISx7zW7MsJkH6KwbTw==",
"version": "20.12.7",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz",
"integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==",
"dependencies": {
"undici-types": "~5.26.4"
}
@ -3263,7 +3236,7 @@
"version": "8.11.3",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
"integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
"dev": true,
"devOptional": true,
"bin": {
"acorn": "bin/acorn"
},
@ -3275,7 +3248,7 @@
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz",
"integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==",
"dev": true,
"devOptional": true,
"engines": {
"node": ">=0.4.0"
}
@ -3372,7 +3345,7 @@
},
"node_modules/arg": {
"version": "4.1.3",
"dev": true,
"devOptional": true,
"license": "MIT"
},
"node_modules/array-buffer-byte-length": {
@ -4181,7 +4154,7 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
"dev": true
"devOptional": true
},
"node_modules/cross-env": {
"version": "7.0.3",
@ -4309,7 +4282,7 @@
},
"node_modules/diff": {
"version": "4.0.2",
"dev": true,
"devOptional": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.3.1"
@ -5311,7 +5284,7 @@
"version": "9.0.5",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz",
"integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==",
"dev": true,
"devOptional": true,
"dependencies": {
"jsbn": "1.1.0",
"sprintf-js": "^1.1.3"
@ -5714,9 +5687,9 @@
}
},
"node_modules/jose": {
"version": "5.2.3",
"resolved": "https://registry.npmjs.org/jose/-/jose-5.2.3.tgz",
"integrity": "sha512-KUXdbctm1uHVL8BYhnyHkgp3zDX5KW8ZhAKVFEfUbU2P8Alpzjb+48hHvjOdQIyPshoblhzsuqOwEEAbtHVirA==",
"version": "5.2.4",
"resolved": "https://registry.npmjs.org/jose/-/jose-5.2.4.tgz",
"integrity": "sha512-6ScbIk2WWCeXkmzF6bRPmEuaqy1m8SbsRFMa/FLrSCkGIhj8OLVG/IH+XHVmNMx/KUo8cVWEE6oKR4dJ+S0Rkg==",
"funding": {
"url": "https://github.com/sponsors/panva"
}
@ -5741,7 +5714,7 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
"integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==",
"dev": true
"devOptional": true
},
"node_modules/json-bigint": {
"version": "1.0.0",
@ -5979,7 +5952,7 @@
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
"dev": true
"devOptional": true
},
"node_modules/make-fetch-happen": {
"version": "13.0.0",
@ -6382,9 +6355,9 @@
}
},
"node_modules/mysql2": {
"version": "3.9.2",
"resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.2.tgz",
"integrity": "sha512-3Cwg/UuRkAv/wm6RhtPE5L7JlPB877vwSF6gfLAS68H+zhH+u5oa3AieqEd0D0/kC3W7qIhYbH419f7O9i/5nw==",
"version": "3.9.4",
"resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.4.tgz",
"integrity": "sha512-OEESQuwxMza803knC1YSt7NMuc1BrK9j7gZhCSs2WAyxr1vfiI7QLaLOKTh5c9SWGz98qVyQUbK8/WckevNQhg==",
"dependencies": {
"denque": "^2.1.0",
"generate-function": "^2.3.1",
@ -7317,6 +7290,20 @@
"node": ">=0.10.0"
}
},
"node_modules/react-dom": {
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
"integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
"dev": true,
"peer": true,
"dependencies": {
"loose-envify": "^1.1.0",
"scheduler": "^0.23.0"
},
"peerDependencies": {
"react": "^18.2.0"
}
},
"node_modules/react-element-to-jsx-string": {
"version": "15.0.0",
"resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz",
@ -7801,7 +7788,7 @@
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
"integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
"dev": true,
"devOptional": true,
"engines": {
"node": ">= 6.0.0",
"npm": ">= 3.0.0"
@ -7811,7 +7798,7 @@
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz",
"integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==",
"dev": true,
"devOptional": true,
"dependencies": {
"ip-address": "^9.0.5",
"smart-buffer": "^4.2.0"
@ -8404,7 +8391,7 @@
},
"node_modules/ts-node": {
"version": "10.9.2",
"dev": true,
"devOptional": true,
"license": "MIT",
"dependencies": {
"@cspotcode/source-map-support": "^0.8.0",
@ -8753,10 +8740,10 @@
}
},
"node_modules/typescript": {
"version": "5.4.4",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.4.tgz",
"integrity": "sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==",
"dev": true,
"version": "5.4.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
"integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
"devOptional": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@ -8843,7 +8830,7 @@
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
"integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
"dev": true
"devOptional": true
},
"node_modules/v8-to-istanbul": {
"version": "9.2.0",
@ -9293,7 +9280,7 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
"dev": true,
"devOptional": true,
"engines": {
"node": ">=6"
}

View File

@ -39,21 +39,21 @@
"coverage-map": "map.js"
},
"dependencies": {
"@aws-sdk/client-dynamodb": "3.549.0",
"@aws-sdk/credential-providers": "3.549.0",
"@aws-sdk/util-dynamodb": "3.549.0",
"@aws-sdk/client-dynamodb": "3.554.0",
"@aws-sdk/credential-providers": "3.554.0",
"@aws-sdk/util-dynamodb": "3.554.0",
"@boxyhq/error-code-mnemonic": "0.1.1",
"@boxyhq/metrics": "0.2.6",
"@boxyhq/saml20": "1.5.0",
"@googleapis/admin": "16.0.0",
"axios": "1.6.8",
"encoding": "0.1.13",
"jose": "5.2.3",
"jose": "5.2.4",
"lodash": "4.17.21",
"mixpanel": "0.18.0",
"mongodb": "6.5.0",
"mssql": "10.0.2",
"mysql2": "3.9.2",
"mysql2": "3.9.4",
"node-forge": "1.3.1",
"openid-client": "5.6.5",
"pg": "8.11.5",
@ -65,7 +65,7 @@
"devDependencies": {
"@faker-js/faker": "8.4.1",
"@types/lodash": "4.17.0",
"@types/node": "20.12.4",
"@types/node": "20.12.7",
"@types/sinon": "17.0.3",
"@types/tap": "15.0.11",
"cross-env": "7.0.3",
@ -75,7 +75,7 @@
"tap": "18.7.2",
"ts-node": "10.9.2",
"tsconfig-paths": "4.2.0",
"typescript": "5.4.4"
"typescript": "5.4.5"
},
"engines": {
"node": ">=16",

View File

@ -95,7 +95,7 @@ export class GoogleProvider implements IDirectoryProvider {
return {
data: users,
metadata: {
nextPageToken: response.data.nextPageToken,
pageToken: response.data.nextPageToken ?? undefined,
hasNextPage: !!response.data.nextPageToken,
},
};

View File

@ -1,6 +1,13 @@
import { randomUUID } from 'crypto';
import type { Group, DatabaseStore, PaginationParams, Response, GroupMembership } from '../../typings';
import type {
Group,
DatabaseStore,
PaginationParams,
Response,
GroupMembership,
Records,
} from '../../typings';
import * as dbutils from '../../db/utils';
import { apiError, JacksonError } from '../../controller/error';
import { Base } from './Base';
@ -238,10 +245,10 @@ export class Groups extends Base {
directoryId?: string;
}
): Promise<Response<Group[]>> {
const { pageOffset, pageLimit, directoryId } = params;
const { pageOffset, pageLimit, pageToken, directoryId } = params;
try {
let groups: Group[] = [];
let result: Records;
// Filter by directoryId
if (directoryId) {
@ -250,12 +257,12 @@ export class Groups extends Base {
value: directoryId,
};
groups = (await this.store('groups').getByIndex(index, pageOffset, pageLimit)).data;
result = await this.store('groups').getByIndex(index, pageOffset, pageLimit, pageToken);
} else {
groups = (await this.store('groups').getAll(pageOffset, pageLimit)).data;
result = await this.store('groups').getAll(pageOffset, pageLimit, pageToken);
}
return { data: groups, error: null };
return { data: result.data, error: null, pageToken: result.pageToken };
} catch (err: any) {
return apiError(err);
}

View File

@ -1,4 +1,4 @@
import type { User, DatabaseStore, PaginationParams, Response } from '../../typings';
import type { User, DatabaseStore, PaginationParams, Response, Records } from '../../typings';
import { apiError, JacksonError } from '../../controller/error';
import { Base } from './Base';
import { keyFromParts } from '../../db/utils';
@ -180,30 +180,29 @@ export class Users extends Base {
public async getAll({
pageOffset,
pageLimit,
pageToken,
directoryId,
}: PaginationParams & {
directoryId?: string;
} = {}): Promise<Response<User[]>> {
try {
let users: User[] = [];
let result: Records;
// Filter by directoryId
if (directoryId) {
users = (
await this.store('users').getByIndex(
{
name: indexNames.directoryId,
value: directoryId,
},
pageOffset,
pageLimit
)
).data as User[];
result = await this.store('users').getByIndex(
{
name: indexNames.directoryId,
value: directoryId,
},
pageOffset,
pageLimit,
pageToken
);
} else {
users = (await this.store('users').getAll(pageOffset, pageLimit)).data;
result = await this.store('users').getAll(pageOffset, pageLimit, pageToken);
}
return { data: users, error: null };
return { data: result.data, error: null, pageToken: result.pageToken };
} catch (err: any) {
return apiError(err);
}

View File

@ -6,6 +6,7 @@ import type {
WebhookEventLog,
DirectorySyncEvent,
PaginationParams,
Records,
} from '../../typings';
import { Base } from './Base';
import { webhookLogsTTL } from '../utils';
@ -125,9 +126,9 @@ export class WebhookEventsLogger extends Base {
*/
// Get the event logs for a directory paginated
public async getAll(params: GetAllParams = {}) {
const { pageOffset, pageLimit, directoryId } = params;
const { pageOffset, pageLimit, pageToken, directoryId } = params;
let eventLogs: WebhookEventLog[] = [];
let result: Records<WebhookEventLog>;
if (directoryId) {
const index = {
@ -135,12 +136,12 @@ export class WebhookEventsLogger extends Base {
value: directoryId,
};
eventLogs = (await this.eventStore().getByIndex(index, pageOffset, pageLimit)).data;
result = await this.eventStore().getByIndex(index, pageOffset, pageLimit, pageToken);
} else {
eventLogs = (await this.eventStore().getAll(pageOffset, pageLimit)).data;
result = await this.eventStore().getAll(pageOffset, pageLimit, pageToken);
}
return eventLogs;
return { data: result.data, pageToken: result.pageToken };
}
public async delete(id: string) {

View File

@ -21,7 +21,7 @@ const parseUserRoles = (roles: string | string[]) => {
export const parseGroupOperation = (operation: GroupPatchOperation) => {
const { op, path, value } = operation;
if (path === 'members') {
if (path === 'members' && typeof value == 'object') {
if (op === 'add') {
return {
action: 'addGroupMember',
@ -47,11 +47,18 @@ export const parseGroupOperation = (operation: GroupPatchOperation) => {
}
// Update group name
if (op === 'replace' && 'displayName' in value) {
return {
action: 'updateGroupName',
displayName: value.displayName,
};
if (op === 'replace') {
if (path == 'displayName' && typeof value == 'string') {
return {
action: 'updateGroupName',
displayName: value,
};
} else if (typeof value == 'object' && 'displayName' in value) {
return {
action: 'updateGroupName',
displayName: value.displayName,
};
}
}
return {

View File

@ -164,10 +164,12 @@ export type UserPatchOperation = {
export type GroupPatchOperation = {
op: 'add' | 'remove' | 'replace';
path?: 'members' | 'displayName';
value: {
value: string;
display?: string;
}[];
value:
| string
| {
value: string;
display?: string;
}[];
};
export type GroupMembership = {
@ -176,7 +178,7 @@ export type GroupMembership = {
user_id: string;
};
export type Response<T> = { data: T; error: null } | { data: null; error: ApiError };
export type Response<T> = { data: T; error: null; pageToken?: string } | { data: null; error: ApiError };
export type EventCallback = (event: DirectorySyncEvent) => Promise<void>;

View File

@ -140,7 +140,7 @@ tap.test('Event batching', async (t) => {
});
t.test('Should log the webhook events if logging is enabled', async (t) => {
const logs = await directorySync.webhookLogs
const { data: logs } = await directorySync.webhookLogs
.setTenantAndProduct(directory1Payload.tenant, directory1Payload.product)
.getAll();
@ -157,7 +157,7 @@ tap.test('Event batching', async (t) => {
});
t.test('Should not log the webhook events if logging is disabled', async (t) => {
const logs = await directorySync.webhookLogs
const { data: logs } = await directorySync.webhookLogs
.setTenantAndProduct(directory2Payload.tenant, directory2Payload.product)
.getAll();

View File

@ -17,38 +17,23 @@ const directoryPayload = {
google_refresh_token: 'refresh_token',
};
const fakeGoogleDirectory = {
users: [
{
id: 'elizasmith',
primaryEmail: 'eliza@example.com',
name: {
givenName: 'Eliza',
familyName: 'Smith',
},
suspended: false,
password: 'password',
hashFunction: 'SHA-1',
changePasswordAtNextLogin: false,
ipWhitelisted: false,
etag: 'abcd1234',
},
{
id: 'johndoe',
primaryEmail: 'john@example.com',
name: {
givenName: 'John',
familyName: 'Doe',
},
suspended: false,
password: 'password',
hashFunction: 'SHA-1',
changePasswordAtNextLogin: false,
ipWhitelisted: false,
etag: 'efgh5678',
},
],
type User = {
id: string;
primaryEmail: string;
name: {
givenName: string;
familyName: string;
};
suspended: boolean;
password: string;
hashFunction: string;
changePasswordAtNextLogin: boolean;
ipWhitelisted: boolean;
etag: string;
};
const fakeGoogleDirectory = {
users: [] as User[],
groups: [
{
id: 'engineering',
@ -75,20 +60,19 @@ const fakeGoogleDirectory = {
nonEditableAliases: ['sales-group456@example.com'],
},
],
members: {
engineering: [
{
kind: 'directory#member',
id: 'elizasmith',
email: 'eliza@example.com',
id: 'elizasmith1',
email: 'eliza1@example.com',
role: 'MANAGER',
type: 'USER',
},
{
kind: 'directory#member',
id: 'johndoe',
email: 'johndoe@example.com',
id: 'elizasmith2',
email: 'elizasmith2@example.com',
role: 'MANAGER',
type: 'USER',
},
@ -96,8 +80,8 @@ const fakeGoogleDirectory = {
sales: [
{
kind: 'directory#member',
id: 'elizasmith',
email: 'eliza@example.com',
id: 'elizasmith1',
email: 'eliza1@example.com',
role: 'MANAGER',
type: 'USER',
},
@ -114,15 +98,41 @@ const fakeGoogleDirectory = {
},
};
for (let i = 1; i <= 5000; i++) {
fakeGoogleDirectory.users.push({
id: `elizasmith${i}`,
primaryEmail: `eliza${i}@example.com`,
name: {
givenName: `Eliza${i}`,
familyName: 'Smith',
},
suspended: false,
password: 'password',
hashFunction: 'SHA-1',
changePasswordAtNextLogin: false,
ipWhitelisted: false,
etag: 'abcd1234',
});
}
const pageSize = 200;
const numOfPages = fakeGoogleDirectory.users.length / pageSize;
// Mock /admin/directory/v1/users
const mockUsersAPI = (users: any[]) => {
nock('https://admin.googleapis.com')
.get('/admin/directory/v1/users')
.query({
const mockUsersAPI = async (users: any[]) => {
for (let i = 0; i < users.length / pageSize; i++) {
const query: any = {
maxResults: 200,
domain: 'boxyhq.com',
})
.reply(200, { users });
};
if (i !== 0) {
query.pageToken = `${i}`;
}
const _users = users.slice(i * pageSize, i * pageSize + pageSize);
nock('https://admin.googleapis.com')
.get('/admin/directory/v1/users')
.query(query)
.reply(200, { users: _users, nextPageToken: i === numOfPages - 1 ? undefined : `${i + 1}` });
}
};
// Mock /admin/directory/v1/groups
@ -133,6 +143,7 @@ const mockGroupsAPI = (groups: any[]) => {
maxResults: 200,
domain: 'boxyhq.com',
})
// Gets invoked 2 times - 1 for syncGroups, 2nd time inside syncGroupMembers
.times(2)
.reply(200, { groups });
};
@ -182,50 +193,50 @@ tap.test('Sync 1', async (t) => {
await directorySyncController.sync();
nock.cleanAll();
t.strictSame(events.length, 7);
// 5k users, 2 groups, 3 group members
t.strictSame(events.length, 5005);
t.strictSame(events[0].event, 'user.created');
t.strictSame(events[0].data.id, fakeGoogleDirectory.users[0].id);
t.strictSame(events[0].data.raw, fakeGoogleDirectory.users[0]);
t.strictSame(events[1].event, 'user.created');
t.strictSame(events[1].data.id, fakeGoogleDirectory.users[1].id);
t.strictSame(events[1].data.raw, fakeGoogleDirectory.users[1]);
t.strictSame(events[4999].event, 'user.created');
t.strictSame(events[4999].data.id, fakeGoogleDirectory.users[4999].id);
t.strictSame(events[4999].data.raw, fakeGoogleDirectory.users[4999]);
t.strictSame(events[2].event, 'group.created');
t.strictSame(events[2].data.id, fakeGoogleDirectory.groups[0].id);
t.strictSame(events[2].data.raw, fakeGoogleDirectory.groups[0]);
t.strictSame(events[5000].event, 'group.created');
t.strictSame(events[5000].data.id, fakeGoogleDirectory.groups[0].id);
t.strictSame(events[5000].data.raw, fakeGoogleDirectory.groups[0]);
t.strictSame(events[3].event, 'group.created');
t.strictSame(events[3].data.id, fakeGoogleDirectory.groups[1].id);
t.strictSame(events[3].data.raw, fakeGoogleDirectory.groups[1]);
t.strictSame(events[5001].event, 'group.created');
t.strictSame(events[5001].data.id, fakeGoogleDirectory.groups[1].id);
t.strictSame(events[5001].data.raw, fakeGoogleDirectory.groups[1]);
t.strictSame(events[4].event, 'group.user_added');
t.strictSame(events[4].data.id, fakeGoogleDirectory.users[0].id);
t.strictSame(events[4].data.raw, fakeGoogleDirectory.users[0]);
t.strictSame(events[5002].event, 'group.user_added');
t.strictSame(events[5002].data.id, fakeGoogleDirectory.users[0].id);
t.strictSame(events[5002].data.raw, fakeGoogleDirectory.users[0]);
// Check that the user was added to the group
if ('group' in events[4].data) {
t.strictSame(events[4].data.group.id, fakeGoogleDirectory.groups[0].id);
if ('group' in events[5002].data) {
t.strictSame(events[5002].data.group.id, fakeGoogleDirectory.groups[0].id);
}
t.strictSame(events[5].event, 'group.user_added');
t.strictSame(events[5].data.id, fakeGoogleDirectory.users[1].id);
t.strictSame(events[5].data.raw, fakeGoogleDirectory.users[1]);
t.strictSame(events[5003].event, 'group.user_added');
t.strictSame(events[5003].data.id, fakeGoogleDirectory.users[1].id);
t.strictSame(events[5003].data.raw, fakeGoogleDirectory.users[1]);
// Check that the user was added to the group
if ('group' in events[5].data) {
t.strictSame(events[5].data.group.id, fakeGoogleDirectory.groups[0].id);
if ('group' in events[5003].data) {
t.strictSame(events[5003].data.group.id, fakeGoogleDirectory.groups[0].id);
}
t.strictSame(events[6].event, 'group.user_added');
t.strictSame(events[6].data.id, fakeGoogleDirectory.users[0].id);
t.strictSame(events[6].data.raw, fakeGoogleDirectory.users[0]);
t.strictSame(events[5004].event, 'group.user_added');
t.strictSame(events[5004].data.id, fakeGoogleDirectory.users[0].id);
t.strictSame(events[5004].data.raw, fakeGoogleDirectory.users[0]);
// Check that the user was added to the group
if ('group' in events[6].data) {
t.strictSame(events[6].data.group.id, fakeGoogleDirectory.groups[1].id);
if ('group' in events[5004].data) {
t.strictSame(events[5004].data.group.id, fakeGoogleDirectory.groups[1].id);
}
t.end();
@ -355,14 +366,14 @@ tap.test('Sync 4', async (t) => {
tap.test('Sync 5', async (t) => {
events = [];
// Remove elizasmith from the engineering group
// Remove elizasmith1 from the engineering group
fakeGoogleDirectory.members.engineering.shift();
// Add elizasmith to the marketing group
// Add elizasmith1 to the marketing group
fakeGoogleDirectory.members.marketing.push({
kind: 'directory#member',
id: 'elizasmith',
email: 'eliza@example.com',
id: 'elizasmith1',
email: 'eliza1@example.com',
role: 'MANAGER',
type: 'USER',
});

View File

@ -78,7 +78,7 @@ tap.test('Webhook Events /', async (t) => {
// Create a user
await directorySync.requests.handle(usersRequest.create(directory, users[0]));
const events = await directorySync.webhookLogs.getAll();
const { data: events } = await directorySync.webhookLogs.getAll();
t.equal(events.length, 0);
@ -100,7 +100,7 @@ tap.test('Webhook Events /', async (t) => {
// Create a user
await directorySync.requests.handle(usersRequest.create(directory, users[0]));
const events = await directorySync.webhookLogs.getAll();
const { data: events } = await directorySync.webhookLogs.getAll();
t.equal(events.length, 0);
@ -114,7 +114,7 @@ tap.test('Webhook Events /', async (t) => {
// Create a user
await directorySync.requests.handle(usersRequest.create(directory, users[0]));
const logs = await directorySync.webhookLogs.getAll();
const { data: logs } = await directorySync.webhookLogs.getAll();
const log = await directorySync.webhookLogs.get(logs[0].id);
@ -144,7 +144,7 @@ tap.test('Webhook Events /', async (t) => {
mock.verify();
mock.restore();
const logs = await directorySync.webhookLogs.getAll();
const { data: logs } = await directorySync.webhookLogs.getAll();
t.ok(logs);
t.equal(logs.length, 3);
@ -193,7 +193,7 @@ tap.test('Webhook Events /', async (t) => {
mock.verify();
mock.restore();
const logs = await directorySync.webhookLogs.getAll();
const { data: logs } = await directorySync.webhookLogs.getAll();
t.ok(logs);
t.equal(logs.length, 3);
@ -251,7 +251,7 @@ tap.test('Webhook Events /', async (t) => {
mock.verify();
mock.restore();
const logs = await directorySync.webhookLogs.getAll();
const { data: logs } = await directorySync.webhookLogs.getAll();
t.ok(logs);
t.equal(logs.length, 4);

864
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"name": "jackson",
"version": "1.22.1",
"version": "1.23.1",
"private": true,
"description": "SAML 2.0 service",
"keywords": [
@ -79,12 +79,12 @@
"cross-env": "7.0.3",
"daisyui": "4.10.1",
"formik": "2.4.5",
"i18next": "23.10.1",
"i18next": "23.11.2",
"medium-zoom": "1.1.0",
"micromatch": "4.0.5",
"next": "14.1.4",
"next": "14.2.1",
"next-auth": "4.24.7",
"next-i18next": "15.2.0",
"next-i18next": "15.3.0",
"next-mdx-remote": "4.4.1",
"nodemailer": "6.9.13",
"raw-body": "2.5.2",
@ -100,9 +100,9 @@
"swr": "2.2.5"
},
"devDependencies": {
"@playwright/test": "1.43.0",
"@playwright/test": "1.43.1",
"@types/cors": "2.8.17",
"@types/micromatch": "4.0.6",
"@types/micromatch": "4.0.7",
"@types/node": "20.11.30",
"@types/react": "18.2.67",
"@typescript-eslint/eslint-plugin": "7.3.1",
@ -110,14 +110,14 @@
"autoprefixer": "10.4.19",
"env-cmd": "10.1.0",
"eslint": "8.57.0",
"eslint-config-next": "14.1.4",
"eslint-config-next": "14.2.1",
"eslint-config-prettier": "9.1.0",
"eslint-plugin-i18next": "6.0.3",
"jose": "5.2.3",
"postcss": "8.4.38",
"prettier": "3.2.5",
"prettier-plugin-tailwindcss": "0.5.13",
"release-it": "17.1.1",
"prettier-plugin-tailwindcss": "0.5.14",
"release-it": "17.2.0",
"swagger-jsdoc": "6.2.8",
"tailwindcss": "3.4.3",
"ts-node": "10.9.2",

View File

@ -3,6 +3,7 @@ import jackson from '@lib/jackson';
import retraced from '@ee/retraced';
import { defaultHandler } from '@lib/api';
import { ApiError } from '@lib/error';
import { parsePaginateApiParams } from '@lib/utils';
const handler = async (req: NextApiRequest, res: NextApiResponse) => {
await defaultHandler(req, res, {
@ -15,7 +16,9 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => {
const handleGET = async (req: NextApiRequest, res: NextApiResponse) => {
const { directorySyncController } = await jackson();
const { directoryId, offset, limit } = req.query as { directoryId: string; offset: string; limit: string };
const { directoryId } = req.query as { directoryId: string };
const { pageOffset, pageLimit, pageToken } = parsePaginateApiParams(req.query);
const { data: directory, error } = await directorySyncController.directories.get(directoryId);
@ -23,18 +26,20 @@ const handleGET = async (req: NextApiRequest, res: NextApiResponse) => {
throw new ApiError(error.message, error.code);
}
const pageOffset = parseInt(offset);
const pageLimit = parseInt(limit);
const events = await directorySyncController.webhookLogs
const result = await directorySyncController.webhookLogs
.setTenantAndProduct(directory.tenant, directory.product)
.getAll({
pageOffset,
pageLimit,
pageToken,
directoryId,
});
res.json({ data: events });
if (result.pageToken) {
res.setHeader('jackson-pagetoken', result.pageToken);
}
res.json({ data: result.data });
};
// Delete all events

View File

@ -2,6 +2,7 @@ import type { NextApiRequest, NextApiResponse } from 'next';
import jackson from '@lib/jackson';
import { defaultHandler } from '@lib/api';
import { ApiError } from '@lib/error';
import { parsePaginateApiParams } from '@lib/utils';
const handler = async (req: NextApiRequest, res: NextApiResponse) => {
await defaultHandler(req, res, {
@ -13,7 +14,9 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => {
const handleGET = async (req: NextApiRequest, res: NextApiResponse) => {
const { directorySyncController } = await jackson();
const { directoryId, offset, limit } = req.query as { directoryId: string; offset: string; limit: string };
const { directoryId } = req.query as { directoryId: string };
const { pageOffset, pageLimit, pageToken } = parsePaginateApiParams(req.query);
const { data: directory, error } = await directorySyncController.directories.get(directoryId);
@ -21,18 +24,17 @@ const handleGET = async (req: NextApiRequest, res: NextApiResponse) => {
throw new ApiError(error.message, error.code);
}
const pageOffset = parseInt(offset);
const pageLimit = parseInt(limit);
const { data: groups, error: groupsError } = await directorySyncController.groups
const result = await directorySyncController.groups
.setTenantAndProduct(directory.tenant, directory.product)
.getAll({ pageOffset, pageLimit, directoryId });
.getAll({ pageOffset, pageLimit, pageToken, directoryId });
if (groupsError) {
throw new ApiError(groupsError.message, groupsError.code);
if (result.error) {
throw new ApiError(result.error.message, result.error.code);
} else if (result.pageToken) {
res.setHeader('jackson-pagetoken', result.pageToken);
}
res.json({ data: groups });
res.json({ data: result.data });
};
export default handler;

View File

@ -2,6 +2,7 @@ import type { NextApiRequest, NextApiResponse } from 'next';
import jackson from '@lib/jackson';
import { defaultHandler } from '@lib/api';
import { ApiError } from '@lib/error';
import { parsePaginateApiParams } from '@lib/utils';
const handler = async (req: NextApiRequest, res: NextApiResponse) => {
await defaultHandler(req, res, {
@ -13,7 +14,11 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => {
const handleGET = async (req: NextApiRequest, res: NextApiResponse) => {
const { directorySyncController } = await jackson();
const { directoryId, offset, limit } = req.query as { directoryId: string; offset: string; limit: string };
const { directoryId } = req.query as {
directoryId: string;
};
const { pageOffset, pageLimit, pageToken } = parsePaginateApiParams(req.query);
const { data: directory, error } = await directorySyncController.directories.get(directoryId);
@ -21,18 +26,17 @@ const handleGET = async (req: NextApiRequest, res: NextApiResponse) => {
throw new ApiError(error.message, error.code);
}
const pageOffset = parseInt(offset);
const pageLimit = parseInt(limit);
const { data: users, error: usersError } = await directorySyncController.users
const result = await directorySyncController.users
.setTenantAndProduct(directory.tenant, directory.product)
.getAll({ pageOffset, pageLimit, directoryId });
.getAll({ pageOffset, pageLimit, pageToken, directoryId });
if (usersError) {
throw new ApiError(usersError.message, usersError.code);
if (result.error) {
throw new ApiError(result.error.message, result.error.code);
} else if (result.pageToken) {
res.setHeader('jackson-pagetoken', result.pageToken);
}
res.json({ data: users });
res.json({ data: result.data });
};
export default handler;