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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

369
npm/package-lock.json generated
View File

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

View File

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

View File

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

View File

@ -1,6 +1,13 @@
import { randomUUID } from 'crypto'; 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 * as dbutils from '../../db/utils';
import { apiError, JacksonError } from '../../controller/error'; import { apiError, JacksonError } from '../../controller/error';
import { Base } from './Base'; import { Base } from './Base';
@ -238,10 +245,10 @@ export class Groups extends Base {
directoryId?: string; directoryId?: string;
} }
): Promise<Response<Group[]>> { ): Promise<Response<Group[]>> {
const { pageOffset, pageLimit, directoryId } = params; const { pageOffset, pageLimit, pageToken, directoryId } = params;
try { try {
let groups: Group[] = []; let result: Records;
// Filter by directoryId // Filter by directoryId
if (directoryId) { if (directoryId) {
@ -250,12 +257,12 @@ export class Groups extends Base {
value: directoryId, value: directoryId,
}; };
groups = (await this.store('groups').getByIndex(index, pageOffset, pageLimit)).data; result = await this.store('groups').getByIndex(index, pageOffset, pageLimit, pageToken);
} else { } 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) { } catch (err: any) {
return apiError(err); 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 { apiError, JacksonError } from '../../controller/error';
import { Base } from './Base'; import { Base } from './Base';
import { keyFromParts } from '../../db/utils'; import { keyFromParts } from '../../db/utils';
@ -180,30 +180,29 @@ export class Users extends Base {
public async getAll({ public async getAll({
pageOffset, pageOffset,
pageLimit, pageLimit,
pageToken,
directoryId, directoryId,
}: PaginationParams & { }: PaginationParams & {
directoryId?: string; directoryId?: string;
} = {}): Promise<Response<User[]>> { } = {}): Promise<Response<User[]>> {
try { try {
let users: User[] = []; let result: Records;
// Filter by directoryId // Filter by directoryId
if (directoryId) { if (directoryId) {
users = ( result = await this.store('users').getByIndex(
await this.store('users').getByIndex( {
{ name: indexNames.directoryId,
name: indexNames.directoryId, value: directoryId,
value: directoryId, },
}, pageOffset,
pageOffset, pageLimit,
pageLimit pageToken
) );
).data as User[];
} else { } 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) { } catch (err: any) {
return apiError(err); return apiError(err);
} }

View File

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

View File

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

View File

@ -164,10 +164,12 @@ export type UserPatchOperation = {
export type GroupPatchOperation = { export type GroupPatchOperation = {
op: 'add' | 'remove' | 'replace'; op: 'add' | 'remove' | 'replace';
path?: 'members' | 'displayName'; path?: 'members' | 'displayName';
value: { value:
value: string; | string
display?: string; | {
}[]; value: string;
display?: string;
}[];
}; };
export type GroupMembership = { export type GroupMembership = {
@ -176,7 +178,7 @@ export type GroupMembership = {
user_id: string; 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>; 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) => { 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) .setTenantAndProduct(directory1Payload.tenant, directory1Payload.product)
.getAll(); .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) => { 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) .setTenantAndProduct(directory2Payload.tenant, directory2Payload.product)
.getAll(); .getAll();

View File

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

View File

@ -78,7 +78,7 @@ tap.test('Webhook Events /', async (t) => {
// Create a user // Create a user
await directorySync.requests.handle(usersRequest.create(directory, users[0])); 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); t.equal(events.length, 0);
@ -100,7 +100,7 @@ tap.test('Webhook Events /', async (t) => {
// Create a user // Create a user
await directorySync.requests.handle(usersRequest.create(directory, users[0])); 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); t.equal(events.length, 0);
@ -114,7 +114,7 @@ tap.test('Webhook Events /', async (t) => {
// Create a user // Create a user
await directorySync.requests.handle(usersRequest.create(directory, users[0])); 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); const log = await directorySync.webhookLogs.get(logs[0].id);
@ -144,7 +144,7 @@ tap.test('Webhook Events /', async (t) => {
mock.verify(); mock.verify();
mock.restore(); mock.restore();
const logs = await directorySync.webhookLogs.getAll(); const { data: logs } = await directorySync.webhookLogs.getAll();
t.ok(logs); t.ok(logs);
t.equal(logs.length, 3); t.equal(logs.length, 3);
@ -193,7 +193,7 @@ tap.test('Webhook Events /', async (t) => {
mock.verify(); mock.verify();
mock.restore(); mock.restore();
const logs = await directorySync.webhookLogs.getAll(); const { data: logs } = await directorySync.webhookLogs.getAll();
t.ok(logs); t.ok(logs);
t.equal(logs.length, 3); t.equal(logs.length, 3);
@ -251,7 +251,7 @@ tap.test('Webhook Events /', async (t) => {
mock.verify(); mock.verify();
mock.restore(); mock.restore();
const logs = await directorySync.webhookLogs.getAll(); const { data: logs } = await directorySync.webhookLogs.getAll();
t.ok(logs); t.ok(logs);
t.equal(logs.length, 4); 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", "name": "jackson",
"version": "1.22.1", "version": "1.23.1",
"private": true, "private": true,
"description": "SAML 2.0 service", "description": "SAML 2.0 service",
"keywords": [ "keywords": [
@ -79,12 +79,12 @@
"cross-env": "7.0.3", "cross-env": "7.0.3",
"daisyui": "4.10.1", "daisyui": "4.10.1",
"formik": "2.4.5", "formik": "2.4.5",
"i18next": "23.10.1", "i18next": "23.11.2",
"medium-zoom": "1.1.0", "medium-zoom": "1.1.0",
"micromatch": "4.0.5", "micromatch": "4.0.5",
"next": "14.1.4", "next": "14.2.1",
"next-auth": "4.24.7", "next-auth": "4.24.7",
"next-i18next": "15.2.0", "next-i18next": "15.3.0",
"next-mdx-remote": "4.4.1", "next-mdx-remote": "4.4.1",
"nodemailer": "6.9.13", "nodemailer": "6.9.13",
"raw-body": "2.5.2", "raw-body": "2.5.2",
@ -100,9 +100,9 @@
"swr": "2.2.5" "swr": "2.2.5"
}, },
"devDependencies": { "devDependencies": {
"@playwright/test": "1.43.0", "@playwright/test": "1.43.1",
"@types/cors": "2.8.17", "@types/cors": "2.8.17",
"@types/micromatch": "4.0.6", "@types/micromatch": "4.0.7",
"@types/node": "20.11.30", "@types/node": "20.11.30",
"@types/react": "18.2.67", "@types/react": "18.2.67",
"@typescript-eslint/eslint-plugin": "7.3.1", "@typescript-eslint/eslint-plugin": "7.3.1",
@ -110,14 +110,14 @@
"autoprefixer": "10.4.19", "autoprefixer": "10.4.19",
"env-cmd": "10.1.0", "env-cmd": "10.1.0",
"eslint": "8.57.0", "eslint": "8.57.0",
"eslint-config-next": "14.1.4", "eslint-config-next": "14.2.1",
"eslint-config-prettier": "9.1.0", "eslint-config-prettier": "9.1.0",
"eslint-plugin-i18next": "6.0.3", "eslint-plugin-i18next": "6.0.3",
"jose": "5.2.3", "jose": "5.2.3",
"postcss": "8.4.38", "postcss": "8.4.38",
"prettier": "3.2.5", "prettier": "3.2.5",
"prettier-plugin-tailwindcss": "0.5.13", "prettier-plugin-tailwindcss": "0.5.14",
"release-it": "17.1.1", "release-it": "17.2.0",
"swagger-jsdoc": "6.2.8", "swagger-jsdoc": "6.2.8",
"tailwindcss": "3.4.3", "tailwindcss": "3.4.3",
"ts-node": "10.9.2", "ts-node": "10.9.2",

View File

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

View File

@ -2,6 +2,7 @@ import type { NextApiRequest, NextApiResponse } from 'next';
import jackson from '@lib/jackson'; import jackson from '@lib/jackson';
import { defaultHandler } from '@lib/api'; import { defaultHandler } from '@lib/api';
import { ApiError } from '@lib/error'; import { ApiError } from '@lib/error';
import { parsePaginateApiParams } from '@lib/utils';
const handler = async (req: NextApiRequest, res: NextApiResponse) => { const handler = async (req: NextApiRequest, res: NextApiResponse) => {
await defaultHandler(req, res, { await defaultHandler(req, res, {
@ -13,7 +14,9 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => {
const handleGET = async (req: NextApiRequest, res: NextApiResponse) => { const handleGET = async (req: NextApiRequest, res: NextApiResponse) => {
const { directorySyncController } = await jackson(); 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); 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); throw new ApiError(error.message, error.code);
} }
const pageOffset = parseInt(offset); const result = await directorySyncController.groups
const pageLimit = parseInt(limit);
const { data: groups, error: groupsError } = await directorySyncController.groups
.setTenantAndProduct(directory.tenant, directory.product) .setTenantAndProduct(directory.tenant, directory.product)
.getAll({ pageOffset, pageLimit, directoryId }); .getAll({ pageOffset, pageLimit, pageToken, directoryId });
if (groupsError) { if (result.error) {
throw new ApiError(groupsError.message, groupsError.code); 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; export default handler;

View File

@ -2,6 +2,7 @@ import type { NextApiRequest, NextApiResponse } from 'next';
import jackson from '@lib/jackson'; import jackson from '@lib/jackson';
import { defaultHandler } from '@lib/api'; import { defaultHandler } from '@lib/api';
import { ApiError } from '@lib/error'; import { ApiError } from '@lib/error';
import { parsePaginateApiParams } from '@lib/utils';
const handler = async (req: NextApiRequest, res: NextApiResponse) => { const handler = async (req: NextApiRequest, res: NextApiResponse) => {
await defaultHandler(req, res, { await defaultHandler(req, res, {
@ -13,7 +14,11 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => {
const handleGET = async (req: NextApiRequest, res: NextApiResponse) => { const handleGET = async (req: NextApiRequest, res: NextApiResponse) => {
const { directorySyncController } = await jackson(); 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); 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); throw new ApiError(error.message, error.code);
} }
const pageOffset = parseInt(offset); const result = await directorySyncController.users
const pageLimit = parseInt(limit);
const { data: users, error: usersError } = await directorySyncController.users
.setTenantAndProduct(directory.tenant, directory.product) .setTenantAndProduct(directory.tenant, directory.product)
.getAll({ pageOffset, pageLimit, directoryId }); .getAll({ pageOffset, pageLimit, pageToken, directoryId });
if (usersError) { if (result.error) {
throw new ApiError(usersError.message, usersError.code); 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; export default handler;