From eba635c027c01dc72a9366b155e92b27d637845f Mon Sep 17 00:00:00 2001 From: Jan-Henrik Damaschke Date: Tue, 7 Feb 2023 01:38:02 +0100 Subject: [PATCH 01/18] feat(driver): Added azure-storage-table driver --- .gitignore | 1 + package.json | 8 +- pnpm-lock.yaml | 1379 +++++++++++++++++++++- src/drivers/azure-storage-table.ts | 131 ++ test/drivers/azure-storage-table.test.ts | 17 + 5 files changed, 1515 insertions(+), 21 deletions(-) create mode 100644 src/drivers/azure-storage-table.ts create mode 100644 test/drivers/azure-storage-table.test.ts diff --git a/.gitignore b/.gitignore index c7703289..cba863f0 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ tmp /drivers /server* /test.* +__* diff --git a/package.json b/package.json index 1098b826..781ff5da 100644 --- a/package.json +++ b/package.json @@ -36,10 +36,14 @@ "lint": "eslint --ext .ts . && prettier -c src test demo", "prepack": "pnpm build", "release": "pnpm test && changelogen --release && git push --follow-tags && pnpm publish", - "test": "pnpm lint && vitest run --coverage", + "test": "pnpm lint && run-p -r azurite-table-storage vitest", + "vitest": "vitest run --coverage test/drivers/azure-storage-table.test.ts", + "azurite-table-storage": "azurite-table --silent", "unstorage": "pnpm jiti src/cli" }, "dependencies": { + "@azure/data-tables": "^13.2.1", + "@azure/identity": "^3.1.3", "anymatch": "^3.1.3", "chokidar": "^3.5.3", "destr": "^1.2.2", @@ -67,6 +71,7 @@ "@vitejs/plugin-vue": "^4.0.0", "@vitest/coverage-c8": "^0.28.4", "@vue/compiler-sfc": "^3.2.47", + "azurite": "^3.21.0", "c8": "^7.12.0", "changelogen": "^0.4.1", "eslint": "^8.33.0", @@ -75,6 +80,7 @@ "jsdom": "^21.1.0", "monaco-editor": "^0.34.1", "msw": "^1.0.0", + "npm-run-all": "^4.1.5", "prettier": "^2.8.3", "types-cloudflare-worker": "^1.2.0", "typescript": "^4.9.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e6c2ac18..82fa30ea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,6 +1,8 @@ lockfileVersion: 5.4 specifiers: + '@azure/data-tables': ^13.2.1 + '@azure/identity': ^3.1.3 '@cloudflare/workers-types': ^4.20230115.0 '@planetscale/database': ^1.5.0 '@types/jsdom': ^21.1.0 @@ -11,6 +13,7 @@ specifiers: '@vitest/coverage-c8': ^0.28.4 '@vue/compiler-sfc': ^3.2.47 anymatch: ^3.1.3 + azurite: ^3.21.0 c8: ^7.12.0 changelogen: ^0.4.1 chokidar: ^3.5.3 @@ -28,6 +31,7 @@ specifiers: mri: ^1.2.0 msw: ^1.0.0 node-fetch-native: ^1.0.1 + npm-run-all: ^4.1.5 ofetch: ^1.0.0 prettier: ^2.8.3 types-cloudflare-worker: ^1.2.0 @@ -40,6 +44,8 @@ specifiers: ws: ^8.12.0 dependencies: + '@azure/data-tables': 13.2.1 + '@azure/identity': 3.1.3 anymatch: 3.1.3 chokidar: 3.5.3 destr: 1.2.2 @@ -66,6 +72,7 @@ devDependencies: '@vitejs/plugin-vue': 4.0.0_vite@4.1.1+vue@3.2.47 '@vitest/coverage-c8': 0.28.4_jsdom@21.1.0 '@vue/compiler-sfc': 3.2.47 + azurite: 3.21.0 c8: 7.12.0 changelogen: 0.4.1 eslint: 8.33.0 @@ -74,6 +81,7 @@ devDependencies: jsdom: 21.1.0 monaco-editor: 0.34.1 msw: 1.0.0_typescript@4.9.5 + npm-run-all: 4.1.5 prettier: 2.8.3 types-cloudflare-worker: 1.2.0 typescript: 4.9.5 @@ -92,6 +100,230 @@ packages: '@jridgewell/trace-mapping': 0.3.17 dev: true + /@azure/abort-controller/1.1.0: + resolution: {integrity: sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==} + engines: {node: '>=12.0.0'} + dependencies: + tslib: 2.5.0 + + /@azure/core-auth/1.4.0: + resolution: {integrity: sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==} + engines: {node: '>=12.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + tslib: 2.5.0 + + /@azure/core-client/1.7.1: + resolution: {integrity: sha512-85igXpc5V7ns6rvMEpLmIcBDftjUgTWD+0tmYPyQEfPfkAwpPTs1X5rhCDsfqvUZGA8Ksid1hdZGu62r6XXeHg==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-auth': 1.4.0 + '@azure/core-rest-pipeline': 1.10.1 + '@azure/core-tracing': 1.0.1 + '@azure/core-util': 1.1.1 + '@azure/logger': 1.0.3 + tslib: 2.5.0 + transitivePeerDependencies: + - supports-color + + /@azure/core-http-compat/1.3.0: + resolution: {integrity: sha512-ZN9avruqbQ5TxopzG3ih3KRy52n8OAbitX3fnZT5go4hzu0J+KVPSzkL+Wt3hpJpdG8WIfg1sBD1tWkgUdEpBA==} + engines: {node: '>=12.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-client': 1.7.1 + '@azure/core-rest-pipeline': 1.10.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@azure/core-lro/2.5.1: + resolution: {integrity: sha512-JHQy/bA3NOz2WuzOi5zEk6n/TJdAropupxUT521JIJvW7EXV2YN2SFYZrf/2RHeD28QAClGdynYadZsbmP+nyQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/logger': 1.0.3 + tslib: 2.5.0 + dev: true + + /@azure/core-paging/1.5.0: + resolution: {integrity: sha512-zqWdVIt+2Z+3wqxEOGzR5hXFZ8MGKK52x4vFLw8n58pR6ZfKRx3EXYTxTaYxYHc/PexPUTyimcTWFJbji9Z6Iw==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.5.0 + + /@azure/core-rest-pipeline/1.10.1: + resolution: {integrity: sha512-Kji9k6TOFRDB5ZMTw8qUf2IJ+CeJtsuMdAHox9eqpTf1cefiNMpzrfnF6sINEBZJsaVaWgQ0o48B6kcUH68niA==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-auth': 1.4.0 + '@azure/core-tracing': 1.0.1 + '@azure/core-util': 1.1.1 + '@azure/logger': 1.0.3 + form-data: 4.0.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + tslib: 2.5.0 + uuid: 8.3.2 + transitivePeerDependencies: + - supports-color + + /@azure/core-tracing/1.0.1: + resolution: {integrity: sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==} + engines: {node: '>=12.0.0'} + dependencies: + tslib: 2.5.0 + + /@azure/core-util/1.1.1: + resolution: {integrity: sha512-A4TBYVQCtHOigFb2ETiiKFDocBoI1Zk2Ui1KpI42aJSIDexF7DHQFpnjonltXAIU/ceH+1fsZAWWgvX6/AKzog==} + engines: {node: '>=12.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + tslib: 2.5.0 + + /@azure/core-xml/1.3.2: + resolution: {integrity: sha512-0YROtnH4dCq3NZwPsPsaTfeH/7PZLMuhCaeb/HkFcaaERQ0OFR0DOMgpP698yeDTXnKAl3kZdw72tgVtTqD2xQ==} + engines: {node: '>=14.0.0'} + dependencies: + fast-xml-parser: 4.1.1 + tslib: 2.5.0 + dev: false + + /@azure/data-tables/13.2.1: + resolution: {integrity: sha512-5pboUpSpxjTgZ499MxkLLR0i+lyUUwN6M5pTLZ2D4mUfKVz+vqiCijvxij0V0OfknMxVpQ+NrZcUdarw6a1Few==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/core-auth': 1.4.0 + '@azure/core-client': 1.7.1 + '@azure/core-paging': 1.5.0 + '@azure/core-rest-pipeline': 1.10.1 + '@azure/core-tracing': 1.0.1 + '@azure/core-xml': 1.3.2 + '@azure/logger': 1.0.3 + tslib: 2.5.0 + uuid: 8.3.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@azure/identity/2.1.0: + resolution: {integrity: sha512-BPDz1sK7Ul9t0l9YKLEa8PHqWU4iCfhGJ+ELJl6c8CP3TpJt2urNCbm0ZHsthmxRsYoMPbz2Dvzj30zXZVmAFw==} + engines: {node: '>=12.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-auth': 1.4.0 + '@azure/core-client': 1.7.1 + '@azure/core-rest-pipeline': 1.10.1 + '@azure/core-tracing': 1.0.1 + '@azure/core-util': 1.1.1 + '@azure/logger': 1.0.3 + '@azure/msal-browser': 2.33.0 + '@azure/msal-common': 7.6.0 + '@azure/msal-node': 1.15.0 + events: 3.3.0 + jws: 4.0.0 + open: 8.4.0 + stoppable: 1.1.0 + tslib: 2.5.0 + uuid: 8.3.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@azure/identity/3.1.3: + resolution: {integrity: sha512-y0jFjSfHsVPwXSwi3KaSPtOZtJZqhiqAhWUXfFYBUd/+twUBovZRXspBwLrF5rJe0r5NyvmScpQjL+TYDTQVvw==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-auth': 1.4.0 + '@azure/core-client': 1.7.1 + '@azure/core-rest-pipeline': 1.10.1 + '@azure/core-tracing': 1.0.1 + '@azure/core-util': 1.1.1 + '@azure/logger': 1.0.3 + '@azure/msal-browser': 2.33.0 + '@azure/msal-common': 9.1.1 + '@azure/msal-node': 1.15.0 + events: 3.3.0 + jws: 4.0.0 + open: 8.4.0 + stoppable: 1.1.0 + tslib: 2.5.0 + uuid: 8.3.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@azure/keyvault-keys/4.6.0: + resolution: {integrity: sha512-0112LegxeR03L8J4k+q6HwBVvrpd9y+oInG0FG3NaHXN7YUubVBon/eb5jFI6edGrvNigpxSR0XIsprFXdkzCQ==} + engines: {node: '>=12.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-auth': 1.4.0 + '@azure/core-client': 1.7.1 + '@azure/core-http-compat': 1.3.0 + '@azure/core-lro': 2.5.1 + '@azure/core-paging': 1.5.0 + '@azure/core-rest-pipeline': 1.10.1 + '@azure/core-tracing': 1.0.1 + '@azure/core-util': 1.1.1 + '@azure/logger': 1.0.3 + tslib: 2.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@azure/logger/1.0.3: + resolution: {integrity: sha512-aK4s3Xxjrx3daZr3VylxejK3vG5ExXck5WOHDJ8in/k9AqlfIyFMMT1uG7u8mNjX+QRILTIn0/Xgschfh/dQ9g==} + engines: {node: '>=12.0.0'} + dependencies: + tslib: 2.5.0 + + /@azure/ms-rest-js/1.11.2: + resolution: {integrity: sha512-2AyQ1IKmLGKW7DU3/x3TsTBzZLcbC9YRI+yuDPuXAQrv3zar340K9wsxU413kHFIDjkWNCo9T0w5VtwcyWxhbQ==} + dependencies: + '@azure/core-auth': 1.4.0 + axios: 0.21.4 + form-data: 2.5.1 + tough-cookie: 2.5.0 + tslib: 1.14.1 + tunnel: 0.0.6 + uuid: 3.4.0 + xml2js: 0.4.23 + transitivePeerDependencies: + - debug + dev: true + + /@azure/msal-browser/2.33.0: + resolution: {integrity: sha512-c7CVh1tfUfxiWkEIhoIb11hL4PGo4hz0M+gMy34ATagAKdLK7qyEu/5AXJWAf5lz5eE+vQhm7+LKiuETrcXXGw==} + engines: {node: '>=0.8.0'} + dependencies: + '@azure/msal-common': 10.0.0 + + /@azure/msal-common/10.0.0: + resolution: {integrity: sha512-/LghpT93jsZLy55QzTsRZWMx6R1Mjc1Aktwps8sKSGE3WbrGwbSsh2uhDlpl6FMcKChYjJ0ochThWwwOodrQNg==} + engines: {node: '>=0.8.0'} + + /@azure/msal-common/7.6.0: + resolution: {integrity: sha512-XqfbglUTVLdkHQ8F9UQJtKseRr3sSnr9ysboxtoswvaMVaEfvyLtMoHv9XdKUfOc0qKGzNgRFd9yRjIWVepl6Q==} + engines: {node: '>=0.8.0'} + dev: true + + /@azure/msal-common/9.1.1: + resolution: {integrity: sha512-we9xR8lvu47fF0h+J8KyXoRy9+G/fPzm3QEa2TrdR3jaVS3LKAyE2qyMuUkNdbVkvzl8Zr9f7l+IUSP22HeqXw==} + engines: {node: '>=0.8.0'} + dev: false + + /@azure/msal-node/1.15.0: + resolution: {integrity: sha512-fwC5M0c8pxOAzmScPbpx7j28YVTDebUaizlVF7bR0xvlU0r3VWW5OobCcr9ybqKS6wGyO7u4EhXJS9rjRWAuwA==} + engines: {node: 10 || 12 || 14 || 16 || 18} + dependencies: + '@azure/msal-common': 10.0.0 + jsonwebtoken: 9.0.0 + uuid: 8.3.2 + /@babel/code-frame/7.18.6: resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} @@ -299,6 +531,19 @@ packages: resolution: {integrity: sha512-GPJEiO8AFN+jUpA+DHJ1qdVmk4s/hq8JYKjOV/+U7avGquQbVnj905+Kg6uAEfrq16muwmRKl+XJGqsvlBlDNg==} dev: true + /@colors/colors/1.5.0: + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + dev: true + + /@dabh/diagnostics/2.0.3: + resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + dependencies: + colorspace: 1.1.4 + enabled: 2.0.0 + kuler: 2.0.0 + dev: true + /@esbuild/android-arm/0.16.17: resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} engines: {node: '>=12'} @@ -779,6 +1024,10 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true + /@js-joda/core/5.5.2: + resolution: {integrity: sha512-retLUN4TwCJ0QJDi9OCJwYVaXAz93NeOkEtEQL98M2bykBOxmURlP0YlfsuE46kItOOVZIWRYC3KsSLhQ1R2Qw==} + dev: true + /@mswjs/cookies/0.2.2: resolution: {integrity: sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g==} engines: {node: '>=14'} @@ -941,7 +1190,6 @@ packages: /@tootallnate/once/2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} - dev: true /@types/chai-subset/1.3.3: resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} @@ -1025,6 +1273,10 @@ packages: resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==} dev: true + /@types/validator/13.7.12: + resolution: {integrity: sha512-YVtyAPqpefU+Mm/qqnOANW6IkqKpCSrarcyV269C8MA8Ux0dbkEuQwM/4CjL47kVEM2LgBef/ETfkH+c6+moFA==} + dev: true + /@types/ws/8.5.4: resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} dependencies: @@ -1323,6 +1575,14 @@ packages: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} dev: true + /accepts/1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: true + /acorn-globals/7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: @@ -1356,7 +1616,6 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true /ajv/6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -1423,6 +1682,20 @@ packages: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true + /args/5.0.3: + resolution: {integrity: sha512-h6k/zfFgusnv3i5TU08KQkVKuCPBtL/PWQbWkHUxvJrZ2nAyeaUupneemcrgn1xmqxPQsPIzwkUhOpoqPDRZuA==} + engines: {node: '>= 6.0.0'} + dependencies: + camelcase: 5.0.0 + chalk: 2.4.2 + leven: 2.1.0 + mri: 1.1.4 + dev: true + + /array-flatten/1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: true + /array-includes/3.1.6: resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} engines: {node: '>= 0.4'} @@ -1463,15 +1736,74 @@ packages: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} dev: true + /async/3.2.4: + resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} + dev: true + /asynckit/0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true /available-typed-arrays/1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} dev: true + /axios/0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + dependencies: + follow-redirects: 1.15.2 + transitivePeerDependencies: + - debug + dev: true + + /axios/0.27.2: + resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + transitivePeerDependencies: + - debug + dev: true + + /azurite/3.21.0: + resolution: {integrity: sha512-FswGZJhuYrs82XViNqOG7Z8RcVW1+0mawWk5kU6L6eQH477YInCIHuPlOwHe1SXCGHhSDb+8KH0BJhoFn6ZG7Q==} + engines: {node: '>=10.0.0', vscode: ^1.39.0} + hasBin: true + dependencies: + '@azure/ms-rest-js': 1.11.2 + args: 5.0.3 + axios: 0.27.2 + etag: 1.8.1 + express: 4.18.2 + fs-extra: 10.1.0 + glob-to-regexp: 0.4.1 + jsonwebtoken: 8.5.1 + lokijs: 1.5.12 + morgan: 1.10.0 + multistream: 2.1.1 + mysql2: 2.3.3 + rimraf: 3.0.2 + sequelize: 6.28.0_5n5p2qdadprnazvanp42s3u2lm + stoppable: 1.1.0 + tedious: 15.1.2 + to-readable-stream: 2.1.0 + tslib: 2.5.0 + uri-templates: 0.2.0 + uuid: 3.4.0 + winston: 3.8.2 + xml2js: 0.4.23 + transitivePeerDependencies: + - debug + - ibm_db + - mariadb + - oracledb + - pg + - pg-hstore + - snowflake-sdk + - sqlite3 + - supports-color + dev: true + /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true @@ -1480,6 +1812,13 @@ packages: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} dev: true + /basic-auth/2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} + dependencies: + safe-buffer: 5.1.2 + dev: true + /binary-extensions/2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} @@ -1492,6 +1831,34 @@ packages: readable-stream: 3.6.0 dev: true + /bl/5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + dependencies: + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: true + + /body-parser/1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /brace-expansion/1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -1522,6 +1889,9 @@ packages: update-browserslist-db: 1.0.10_browserslist@4.21.5 dev: true + /buffer-equal-constant-time/1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + /buffer-from/1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true @@ -1533,6 +1903,13 @@ packages: ieee754: 1.2.1 dev: true + /buffer/6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + /builtin-modules/3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -1544,6 +1921,11 @@ packages: semver: 7.3.8 dev: true + /bytes/3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: true + /c12/1.1.0: resolution: {integrity: sha512-9KRFWEng+TH8sGST4NNdiKzZGw1Z1CHnPGAmNqAyVP7suluROmBjD8hsiR34f94DdlrvtGvvmiGDsoFXlCBWIw==} dependencies: @@ -1595,6 +1977,11 @@ packages: engines: {node: '>=6'} dev: true + /camelcase/5.0.0: + resolution: {integrity: sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==} + engines: {node: '>=6'} + dev: true + /caniuse-lite/1.0.30001450: resolution: {integrity: sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew==} dev: true @@ -1780,15 +2167,35 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true + /color-string/1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: true + + /color/3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + dependencies: + color-convert: 1.9.3 + color-string: 1.9.1 + dev: true + /colorette/2.0.19: resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} + /colorspace/1.1.4: + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + dependencies: + color: 3.2.1 + text-hex: 1.0.0 + dev: true + /combined-stream/1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 - dev: true /commondir/1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -1802,6 +2209,18 @@ packages: resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} dev: true + /content-disposition/0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /content-type/1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: true + /convert-gitmoji/0.1.3: resolution: {integrity: sha512-t5yxPyI8h8KPvRwrS/sRrfIpT2gJbmBAY0TFokyUBy3PM44RuFRpZwHdACz+GTSPLRLo3s4qsscOMLjHiXBwzw==} dev: true @@ -1814,11 +2233,35 @@ packages: resolution: {integrity: sha512-RyZrFi6PNpBFbIaQjXDlFIhFVqV42QeKSZX1yQIl6ihImq6vcHNGMtqQ/QzY3RMPuYSkvsRwtnt5M9NeYxKt0g==} dev: false + /cookie-signature/1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: true + /cookie/0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} dev: true + /cookie/0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: true + + /core-util-is/1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /cross-spawn/6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.1 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + /cross-spawn/7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -1855,6 +2298,17 @@ packages: whatwg-url: 11.0.0 dev: true + /debug/2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + /debug/3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -1906,7 +2360,6 @@ packages: /define-lazy-prop/2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} - dev: true /define-properties/1.1.4: resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} @@ -1922,16 +2375,24 @@ packages: /delayed-stream/1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - dev: true /denque/2.1.0: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} engines: {node: '>=0.10'} - dev: false + + /depd/2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: true /destr/1.2.2: resolution: {integrity: sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA==} + /destroy/1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: true + /diff/5.1.0: resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} engines: {node: '>=0.3.1'} @@ -1970,10 +2431,23 @@ packages: engines: {node: '>=12'} dev: true + /dottie/2.0.2: + resolution: {integrity: sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==} + dev: true + /eastasianwidth/0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true + /ecdsa-sig-formatter/1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + dependencies: + safe-buffer: 5.2.1 + + /ee-first/1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: true + /electron-to-chromium/1.4.286: resolution: {integrity: sha512-Vp3CVhmYpgf4iXNKAucoQUDcCrBQX3XLBtwgFqP9BUXuucgvAV9zWp1kYU7LL9j4++s9O+12cb3wMtN4SJy6UQ==} dev: true @@ -1986,6 +2460,15 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true + /enabled/2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + dev: true + + /encodeurl/1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: true + /enhanced-resolve/5.12.0: resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==} engines: {node: '>=10.13.0'} @@ -2044,6 +2527,19 @@ packages: which-typed-array: 1.1.9 dev: true + /es-aggregate-error/1.0.9: + resolution: {integrity: sha512-fvnX40sb538wdU6r4s35cq4EY6Lr09Upj40BEVem4LEsuW8XgQep9yD5Q1U2KftokNp1rWODFJ2qwZSsAjFpbg==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.1.4 + es-abstract: 1.21.1 + function-bind: 1.1.1 + functions-have-names: 1.2.3 + get-intrinsic: 1.2.0 + globalthis: 1.0.3 + has-property-descriptors: 1.0.0 + dev: true + /es-set-tostringtag/2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} @@ -2133,6 +2629,10 @@ packages: engines: {node: '>=6'} dev: true + /escape-html/1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: true + /escape-string-regexp/1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -2525,10 +3025,14 @@ packages: engines: {node: '>=0.10.0'} dev: true + /etag/1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: true + /events/3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - dev: true /execa/5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} @@ -2560,6 +3064,45 @@ packages: strip-final-newline: 3.0.0 dev: true + /express/4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + /external-editor/3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} @@ -2592,12 +3135,23 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true + /fast-xml-parser/4.1.1: + resolution: {integrity: sha512-4gAP5PvNyrqePBOIIcpaEeE+nKBry1n6qTQiJsE59sLP0OC+YwhU7/XVmLLEMexbiluFQX1yEYm82Pk9B7xEiw==} + hasBin: true + dependencies: + strnum: 1.0.5 + dev: false + /fastq/1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 dev: true + /fecha/4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + dev: true + /figures/3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -2618,6 +3172,21 @@ packages: dependencies: to-regex-range: 5.0.1 + /finalhandler/1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /find-up/4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -2651,6 +3220,20 @@ packages: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true + /fn.name/1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + dev: true + + /follow-redirects/1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: true + /for-each/0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: @@ -2665,6 +3248,15 @@ packages: signal-exit: 3.0.7 dev: true + /form-data/2.5.1: + resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + /form-data/4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} @@ -2672,6 +3264,24 @@ packages: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 + + /forwarded/0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: true + + /fresh/0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: true + + /fs-extra/10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.10 + jsonfile: 6.1.0 + universalify: 2.0.0 dev: true /fs-extra/11.1.0: @@ -2719,6 +3329,12 @@ packages: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true + /generate-function/2.3.1: + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + dependencies: + is-property: 1.0.2 + dev: true + /gensync/1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -2789,6 +3405,10 @@ packages: is-glob: 4.0.3 dev: true + /glob-to-regexp/0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: true + /glob/7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: @@ -2956,6 +3576,17 @@ packages: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true + /http-errors/2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: true + /http-proxy-agent/5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} @@ -2965,7 +3596,6 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true /http-shutdown/1.2.2: resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} @@ -2980,7 +3610,6 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true /human-signals/2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} @@ -3033,6 +3662,11 @@ packages: engines: {node: '>=8'} dev: true + /inflection/1.13.4: + resolution: {integrity: sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==} + engines: {'0': node >= 0.4.0} + dev: true + /inflight/1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: @@ -3096,6 +3730,11 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: false + /ipaddr.js/1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: true + /is-arguments/1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} @@ -3116,6 +3755,10 @@ packages: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true + /is-arrayish/0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: true + /is-bigint/1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: @@ -3231,6 +3874,10 @@ packages: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true + /is-property/1.0.2: + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + dev: true + /is-reference/1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} dependencies: @@ -3254,7 +3901,6 @@ packages: /is-stream/2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - dev: false /is-stream/3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} @@ -3303,6 +3949,10 @@ packages: dependencies: is-docker: 2.2.1 + /isarray/1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + /isexe/2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -3338,6 +3988,10 @@ packages: engines: {node: '>=0.10.0'} dev: true + /js-md4/0.3.2: + resolution: {integrity: sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==} + dev: true + /js-sdsl/4.3.0: resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==} dev: true @@ -3353,6 +4007,10 @@ packages: argparse: 2.0.1 dev: true + /jsbi/4.3.0: + resolution: {integrity: sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==} + dev: true + /jsdom/21.1.0: resolution: {integrity: sha512-m0lzlP7qOtthD918nenK3hdItSd2I+V3W9IrBcB36sqDwG+KnUs66IF5GY7laGWUnlM9vTsD0W1QwSEBYWWcJg==} engines: {node: '>=14'} @@ -3400,6 +4058,10 @@ packages: hasBin: true dev: true + /json-parse-better-errors/1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + dev: true + /json-parse-even-better-errors/2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true @@ -3437,6 +4099,66 @@ packages: graceful-fs: 4.2.10 dev: true + /jsonwebtoken/8.5.1: + resolution: {integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==} + engines: {node: '>=4', npm: '>=1.4.28'} + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 5.7.1 + dev: true + + /jsonwebtoken/9.0.0: + resolution: {integrity: sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==} + engines: {node: '>=12', npm: '>=6'} + dependencies: + jws: 3.2.2 + lodash: 4.17.21 + ms: 2.1.3 + semver: 7.3.8 + + /jwa/1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + /jwa/2.0.0: + resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==} + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + /jws/3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + + /jws/4.0.0: + resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} + dependencies: + jwa: 2.0.0 + safe-buffer: 5.2.1 + + /kuler/2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + dev: true + + /leven/2.1.0: + resolution: {integrity: sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==} + engines: {node: '>=0.10.0'} + dev: true + /levn/0.3.0: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} engines: {node: '>= 0.8.0'} @@ -3470,6 +4192,16 @@ packages: ufo: 1.0.1 dev: false + /load-json-file/4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.10 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + /local-pkg/0.4.3: resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} engines: {node: '>=14'} @@ -3493,17 +4225,44 @@ packages: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} dev: false + /lodash.includes/4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + dev: true + /lodash.isarguments/3.1.0: resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} dev: false + /lodash.isboolean/3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + dev: true + + /lodash.isinteger/4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + dev: true + + /lodash.isnumber/3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + dev: true + + /lodash.isplainobject/4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: true + + /lodash.isstring/4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + dev: true + /lodash.merge/4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true + /lodash.once/4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + dev: true + /lodash/4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true /log-symbols/4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} @@ -3513,6 +4272,24 @@ packages: is-unicode-supported: 0.1.0 dev: true + /logform/2.5.0: + resolution: {integrity: sha512-fsFiH2yjSCTmzotZ5JmEo0brQyJ7iHrc8pQ5pnHg6e1e5WfkqdNMDvgRWSfz+aCr3Y2YxYzHA4UKj+6QoctKrg==} + dependencies: + '@colors/colors': 1.5.0 + fecha: 4.2.3 + ms: 2.1.3 + safe-stable-stringify: 2.4.2 + triple-beam: 1.3.0 + dev: true + + /lokijs/1.5.12: + resolution: {integrity: sha512-Q5ALD6JiS6xAUWCwX3taQmgwxyveCtIIuL08+ml0nHwT3k0S/GIFJN+Hd38b1qYIMaE5X++iqsqWVksz7SYW+Q==} + dev: true + + /long/4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: true + /loupe/2.3.6: resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} dependencies: @@ -3530,12 +4307,10 @@ packages: engines: {node: '>=10'} dependencies: yallist: 4.0.0 - dev: true /lru-cache/7.14.1: resolution: {integrity: sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==} engines: {node: '>=12'} - dev: false /magic-string/0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} @@ -3557,6 +4332,20 @@ packages: semver: 6.3.0 dev: true + /media-typer/0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: true + + /memorystream/0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + dev: true + + /merge-descriptors/1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: true + /merge-stream/2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -3565,6 +4354,11 @@ packages: engines: {node: '>= 8'} dev: true + /methods/1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: true + /micromatch/4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -3576,13 +4370,17 @@ packages: /mime-db/1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - dev: true /mime-types/2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 + + /mime/1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true dev: true /mimic-fn/2.1.0: @@ -3678,20 +4476,51 @@ packages: ufo: 1.0.1 dev: true + /moment-timezone/0.5.40: + resolution: {integrity: sha512-tWfmNkRYmBkPJz5mr9GVDn9vRlVZOTe6yqY92rFxiOdWXbjaR0+9LwQnZGGuNR63X456NqmEkbskte8tWL5ePg==} + dependencies: + moment: 2.29.4 + dev: true + + /moment/2.29.4: + resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} + dev: true + /monaco-editor/0.34.1: resolution: {integrity: sha512-FKc80TyiMaruhJKKPz5SpJPIjL+dflGvz4CpuThaPMc94AyN7SeC9HQ8hrvaxX7EyHdJcUY5i4D0gNyJj1vSZQ==} dev: true + /morgan/1.10.0: + resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} + engines: {node: '>= 0.8.0'} + dependencies: + basic-auth: 2.0.1 + debug: 2.6.9 + depd: 2.0.0 + on-finished: 2.3.0 + on-headers: 1.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /mri/1.1.4: + resolution: {integrity: sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==} + engines: {node: '>=4'} + dev: true + /mri/1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} + /ms/2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + /ms/2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} /ms/2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true /msw/1.0.0_typescript@4.9.5: resolution: {integrity: sha512-8QVa1RAN/Nzbn/tKmtimJ+b2M1QZOMdETQW7/1TmBOZ4w+wJojfxuh1Hj5J4FYdBgZWW/TK4CABUOlOM4OjTOA==} @@ -3729,16 +4558,48 @@ packages: - supports-color dev: true + /multistream/2.1.1: + resolution: {integrity: sha512-xasv76hl6nr1dEy3lPvy7Ej7K/Lx3O/FCvwge8PeVJpciPPoNCbaANcNiBug3IpdvTveZUcAV0DJzdnUDMesNQ==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.7 + dev: true + /mute-stream/0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} dev: true + /mysql2/2.3.3: + resolution: {integrity: sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA==} + engines: {node: '>= 8.0'} + dependencies: + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.6.3 + long: 4.0.0 + lru-cache: 6.0.0 + named-placeholders: 1.1.3 + seq-queue: 0.0.5 + sqlstring: 2.3.3 + dev: true + + /named-placeholders/1.1.3: + resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} + engines: {node: '>=12.0.0'} + dependencies: + lru-cache: 7.14.1 + dev: true + /nanoid/3.3.4: resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: true + /native-duplexpair/1.0.0: + resolution: {integrity: sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA==} + dev: true + /natural-compare-lite/1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true @@ -3747,6 +4608,19 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true + /negotiator/0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: true + + /nice-try/1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + dev: true + + /node-abort-controller/3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + dev: true + /node-fetch-native/1.0.1: resolution: {integrity: sha512-VzW+TAk2wE4X9maiKMlT+GsPU4OMmR1U9CrHSmd3DFLn2IcZ9VJ6M6BBugGfYUnPCLSYxXdZy17M0BEJyhUTwg==} @@ -3784,6 +4658,22 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + /npm-run-all/4.1.5: + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} + engines: {node: '>= 4'} + hasBin: true + dependencies: + ansi-styles: 3.2.1 + chalk: 2.4.2 + cross-spawn: 6.0.5 + memorystream: 0.3.1 + minimatch: 3.1.2 + pidtree: 0.3.1 + read-pkg: 3.0.0 + shell-quote: 1.8.0 + string.prototype.padend: 3.1.4 + dev: true + /npm-run-path/4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -3838,12 +4728,37 @@ packages: ufo: 1.0.1 dev: false + /on-finished/2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: true + + /on-finished/2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: true + + /on-headers/1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + dev: true + /once/1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: true + /one-time/1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + dependencies: + fn.name: 1.1.0 + dev: true + /onetime/5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} @@ -3864,7 +4779,6 @@ packages: define-lazy-prop: 2.0.0 is-docker: 2.2.1 is-wsl: 2.2.0 - dev: true /optionator/0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} @@ -3961,6 +4875,14 @@ packages: callsites: 3.1.0 dev: true + /parse-json/4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: true + /parse-json/5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -3977,6 +4899,11 @@ packages: entities: 4.4.0 dev: true + /parseurl/1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: true + /path-exists/4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -3987,6 +4914,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /path-key/2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: true + /path-key/3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -4000,10 +4932,21 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true + /path-to-regexp/0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: true + /path-to-regexp/6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} dev: true + /path-type/3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: true + /path-type/4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -4017,6 +4960,10 @@ packages: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} dev: true + /pg-connection-string/2.5.0: + resolution: {integrity: sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==} + dev: true + /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true @@ -4025,6 +4972,17 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + /pidtree/0.3.1: + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /pify/3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: true + /pkg-types/1.0.1: resolution: {integrity: sha512-jHv9HB+Ho7dj6ItwppRDDl0iZRYBD0jsakHXtFgoLr+cHSF6xC+QL54sJmWxyGxOLYSHm0afhXhXcQDQqH9z8g==} dependencies: @@ -4077,6 +5035,18 @@ packages: react-is: 17.0.2 dev: true + /process-nextick-args/2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /proxy-addr/2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: true + /psl/1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} dev: true @@ -4086,6 +5056,13 @@ packages: engines: {node: '>=6'} dev: true + /qs/6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + /querystringify/2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} dev: true @@ -4098,6 +5075,21 @@ packages: resolution: {integrity: sha512-6n3AEXth91ASapMVKiEh2wrbFJmI+NBilrWE0AbiGgfm0xet0QXC8+a3K19r1UVYjUjctUgB053c3V/J6V0kCQ==} dev: false + /range-parser/1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: true + + /raw-body/2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + /rc9/2.0.1: resolution: {integrity: sha512-9EfjLgNmzP9255YX8bGnILQcmdtOXKtUlFTu8bOZPJVtaUDZ2imswcUdpK51tMjTRQyB7r5RebNijrzuyGXcVA==} dependencies: @@ -4119,6 +5111,15 @@ packages: type-fest: 0.8.1 dev: true + /read-pkg/3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: true + /read-pkg/5.2.0: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} @@ -4129,6 +5130,18 @@ packages: type-fest: 0.6.0 dev: true + /readable-stream/2.3.7: + resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + /readable-stream/3.6.0: resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} engines: {node: '>= 6'} @@ -4206,6 +5219,10 @@ packages: signal-exit: 3.0.7 dev: true + /retry-as-promised/7.0.3: + resolution: {integrity: sha512-SEvMa4khHvpU/o6zgh7sK24qm6rxVgKnrSyzb5POeDvZx5N9Bf0s5sQsQ4Fl+HjRp0X+w2UzACGfUnXtx6cJ9Q==} + dev: true + /reusify/1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -4257,9 +5274,12 @@ packages: tslib: 2.5.0 dev: true + /safe-buffer/5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + /safe-buffer/5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true /safe-regex-test/1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} @@ -4275,10 +5295,19 @@ packages: regexp-tree: 0.1.24 dev: true + /safe-stable-stringify/2.4.2: + resolution: {integrity: sha512-gMxvPJYhP0O9n2pvcfYfIuYgbledAOJFcqRThtPRmjscaipiwcwPPKLytpVzMkG2HAN87Qmo2d4PtGiri1dSLA==} + engines: {node: '>=10'} + dev: true + /safer-buffer/2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: true + /sax/1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + dev: true + /saxes/6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} @@ -4306,22 +5335,138 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 + + /send/0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /seq-queue/0.0.5: + resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} + dev: true + + /sequelize-pool/7.1.0: + resolution: {integrity: sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==} + engines: {node: '>= 10.0.0'} + dev: true + + /sequelize/6.28.0_5n5p2qdadprnazvanp42s3u2lm: + resolution: {integrity: sha512-+WHqvUQgTp19GLkt+gyQ+F6qg+FIEO2O5F9C0TOYV/PjZ2a/XwWvVkL1NCkS4VSIjVVvAUutiW6Wv9ofveGaVw==} + engines: {node: '>=10.0.0'} + peerDependencies: + ibm_db: '*' + mariadb: '*' + mysql2: '*' + oracledb: '*' + pg: '*' + pg-hstore: '*' + snowflake-sdk: '*' + sqlite3: '*' + tedious: '*' + peerDependenciesMeta: + ibm_db: + optional: true + mariadb: + optional: true + mysql2: + optional: true + oracledb: + optional: true + pg: + optional: true + pg-hstore: + optional: true + snowflake-sdk: + optional: true + sqlite3: + optional: true + tedious: + optional: true + dependencies: + '@types/debug': 4.1.7 + '@types/validator': 13.7.12 + debug: 4.3.4 + dottie: 2.0.2 + inflection: 1.13.4 + lodash: 4.17.21 + moment: 2.29.4 + moment-timezone: 0.5.40 + mysql2: 2.3.3 + pg-connection-string: 2.5.0 + retry-as-promised: 7.0.3 + semver: 7.3.8 + sequelize-pool: 7.1.0 + tedious: 15.1.2 + toposort-class: 1.0.1 + uuid: 8.3.2 + validator: 13.9.0 + wkx: 0.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /serve-static/1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color dev: true /set-cookie-parser/2.5.1: resolution: {integrity: sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==} dev: true + /setprototypeof/1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: true + + /shebang-command/1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + dev: true + /shebang-command/2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 + /shebang-regex/1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: true + /shebang-regex/3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + /shell-quote/1.8.0: + resolution: {integrity: sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==} + dev: true + /side-channel/1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: @@ -4337,6 +5482,12 @@ packages: /signal-exit/3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + /simple-swizzle/0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: true + /slash/3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -4399,6 +5550,19 @@ packages: resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==} dev: true + /sprintf-js/1.1.2: + resolution: {integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==} + dev: true + + /sqlstring/2.3.3: + resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} + engines: {node: '>= 0.6'} + dev: true + + /stack-trace/0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + dev: true + /stackback/0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} dev: true @@ -4407,10 +5571,19 @@ packages: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} dev: false + /statuses/2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: true + /std-env/3.3.2: resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} dev: true + /stoppable/1.1.0: + resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} + engines: {node: '>=4', npm: '>=6'} + /strict-event-emitter/0.2.8: resolution: {integrity: sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A==} dependencies: @@ -4439,6 +5612,15 @@ packages: strip-ansi: 7.0.1 dev: true + /string.prototype.padend/3.1.4: + resolution: {integrity: sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.21.1 + dev: true + /string.prototype.trimend/1.0.6: resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: @@ -4455,6 +5637,12 @@ packages: es-abstract: 1.21.1 dev: true + /string_decoder/1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + /string_decoder/1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: @@ -4508,6 +5696,10 @@ packages: acorn: 8.8.2 dev: true + /strnum/1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + dev: false + /supports-color/5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -4556,6 +5748,26 @@ packages: yallist: 4.0.0 dev: true + /tedious/15.1.2: + resolution: {integrity: sha512-94slmnggCX8zG6iLNnM3k6PplTguP0p7R2RWOKTXdPmK1VmTpWk4+e0J4koIMXm1jjG7sGlZ1/JlaGVAdF1OOg==} + engines: {node: '>=14'} + dependencies: + '@azure/identity': 2.1.0 + '@azure/keyvault-keys': 4.6.0 + '@js-joda/core': 5.5.2 + bl: 5.1.0 + es-aggregate-error: 1.0.9 + iconv-lite: 0.6.3 + js-md4: 0.3.2 + jsbi: 4.3.0 + native-duplexpair: 1.0.0 + node-abort-controller: 3.1.1 + punycode: 2.3.0 + sprintf-js: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + /test-exclude/6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -4565,6 +5777,10 @@ packages: minimatch: 3.1.2 dev: true + /text-hex/1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + dev: true + /text-table/0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true @@ -4606,12 +5822,34 @@ packages: engines: {node: '>=4'} dev: true + /to-readable-stream/2.1.0: + resolution: {integrity: sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==} + engines: {node: '>=8'} + dev: true + /to-regex-range/5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 + /toidentifier/1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: true + + /toposort-class/1.0.1: + resolution: {integrity: sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==} + dev: true + + /tough-cookie/2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + dev: true + /tough-cookie/4.1.2: resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==} engines: {node: '>=6'} @@ -4633,6 +5871,10 @@ packages: punycode: 2.3.0 dev: true + /triple-beam/1.3.0: + resolution: {integrity: sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==} + dev: true + /tsconfig-paths/3.14.1: resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} dependencies: @@ -4648,7 +5890,6 @@ packages: /tslib/2.5.0: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} - dev: true /tsutils/3.21.0_typescript@4.9.5: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} @@ -4660,6 +5901,11 @@ packages: typescript: 4.9.5 dev: true + /tunnel/0.0.6: + resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} + engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} + dev: true + /type-check/0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} @@ -4704,6 +5950,14 @@ packages: engines: {node: '>=12.20'} dev: true + /type-is/1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: true + /typed-array-length/1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: @@ -4779,6 +6033,11 @@ packages: engines: {node: '>= 10.0.0'} dev: true + /unpipe/1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: true + /untyped/1.2.2: resolution: {integrity: sha512-EANYd5L6AdpgfldlgMcmvOOnj092nWhy0ybhc7uhEH12ipytDYz89EOegBQKj8qWL3u1wgYnmFjADhsuCJs5Aw==} dependencies: @@ -4807,6 +6066,10 @@ packages: punycode: 2.3.0 dev: true + /uri-templates/0.2.0: + resolution: {integrity: sha512-EWkjYEN0L6KOfEoOH6Wj4ghQqU7eBZMJqRHQnxQAq+dSEzRPClkWjf8557HkWQXF6BrAUoLSAyy9i3RVTliaNg==} + dev: true + /url-parse/1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} dependencies: @@ -4828,6 +6091,21 @@ packages: which-typed-array: 1.1.9 dev: true + /utils-merge/1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: true + + /uuid/3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: true + + /uuid/8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + /v8-to-istanbul/9.0.1: resolution: {integrity: sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==} engines: {node: '>=10.12.0'} @@ -4844,6 +6122,16 @@ packages: spdx-expression-parse: 3.0.1 dev: true + /validator/13.9.0: + resolution: {integrity: sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==} + engines: {node: '>= 0.10'} + dev: true + + /vary/1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: true + /vite-node/0.28.4_@types+node@18.11.19: resolution: {integrity: sha512-KM0Q0uSG/xHHKOJvVHc5xDBabgt0l70y7/lWTR7Q0pR5/MrYxadT+y32cJOE65FfjGmJgxpVEEY+69btJgcXOQ==} engines: {node: '>=v14.16.0'} @@ -5046,6 +6334,13 @@ packages: is-typed-array: 1.1.10 dev: true + /which/1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + /which/2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -5062,6 +6357,38 @@ packages: stackback: 0.0.2 dev: true + /winston-transport/4.5.0: + resolution: {integrity: sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==} + engines: {node: '>= 6.4.0'} + dependencies: + logform: 2.5.0 + readable-stream: 3.6.0 + triple-beam: 1.3.0 + dev: true + + /winston/3.8.2: + resolution: {integrity: sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew==} + engines: {node: '>= 12.0.0'} + dependencies: + '@colors/colors': 1.5.0 + '@dabh/diagnostics': 2.0.3 + async: 3.2.4 + is-stream: 2.0.1 + logform: 2.5.0 + one-time: 1.0.0 + readable-stream: 3.6.0 + safe-stable-stringify: 2.4.2 + stack-trace: 0.0.10 + triple-beam: 1.3.0 + winston-transport: 4.5.0 + dev: true + + /wkx/0.5.0: + resolution: {integrity: sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==} + dependencies: + '@types/node': 18.11.19 + dev: true + /word-wrap/1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} @@ -5097,6 +6424,19 @@ packages: engines: {node: '>=12'} dev: true + /xml2js/0.4.23: + resolution: {integrity: sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==} + engines: {node: '>=4.0.0'} + dependencies: + sax: 1.2.4 + xmlbuilder: 11.0.1 + dev: true + + /xmlbuilder/11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + dev: true + /xmlchars/2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true @@ -5112,7 +6452,6 @@ packages: /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true /yargs-parser/20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} diff --git a/src/drivers/azure-storage-table.ts b/src/drivers/azure-storage-table.ts new file mode 100644 index 00000000..f8db513c --- /dev/null +++ b/src/drivers/azure-storage-table.ts @@ -0,0 +1,131 @@ +import { defineDriver } from "./utils"; +import { + TableClient, + AzureNamedKeyCredential, + AzureSASCredential, + TableEntity, +} from "@azure/data-tables"; +import { DefaultAzureCredential } from "@azure/identity"; + +export interface AzureStorageTableOptions { + /** + * The name of the Azure Storage account. + * @default null + */ + accountName?: string; + /** + * The name of the table. All entities will be stored in the same table. + * @default 'unstorage' + */ + tableName?: string; + /** + * The partition key. All entities will be stored in the same partition. + * @default 'unstorage' + */ + partitionKey?: string; + /** + * The account key. If provided, the SAS key will be ignored. Only available in Node.js runtime. + * @default null + */ + accountKey?: string; + /** + * The SAS key. If provided, the account key will be ignored. + * @default null + */ + sasKey?: string; + /** + * The connection string. If provided, the account key and SAS key will be ignored. Only available in Node.js runtime. + * @default null + */ + connectionString?: string; +} + +export default defineDriver((opts: AzureStorageTableOptions = {}) => { + const { + accountName = null, + tableName = "unstorage", + partitionKey = "unstorage", + accountKey = null, + sasKey = null, + connectionString = null, + } = opts; + let client: TableClient; + if (accountKey) { + // AzureNamedKeyCredential is only available in Node.js runtime, not in browsers + const credential = new AzureNamedKeyCredential(accountName, accountKey); + client = new TableClient( + `https://${accountName}.table.core.windows.net`, + tableName, + credential + ); + } else if (sasKey) { + const credential = new AzureSASCredential(sasKey); + client = new TableClient( + `https://${accountName}.table.core.windows.net`, + tableName, + credential + ); + } else if (connectionString) { + // fromConnectionString is only available in Node.js runtime, not in browsers + client = TableClient.fromConnectionString(connectionString, tableName); + } else { + const credential = new DefaultAzureCredential(); + client = new TableClient( + `https://${accountName}.table.core.windows.net`, + tableName, + credential + ); + } + + return { + async hasItem(key) { + try { + await client.getEntity(partitionKey, key); + return true; + } catch { + return false; + } + }, + async getItem(key) { + try { + const result = await client.getEntity(partitionKey, key); + return result.unstorageValue; + } catch { + return null; + } + }, + async setItem(key, value) { + const entity: TableEntity = { + partitionKey, + rowKey: key, + unstorageValue: value, + }; + await client.upsertEntity(entity, "Replace"); + return; + }, + async removeItem(key) { + await client.deleteEntity(partitionKey, key); + return; + }, + async getKeys() { + const iterator = client.listEntities().byPage({ maxPageSize: 1000 }); + const keys = []; + for await (const page of iterator) { + const pageKeys = page.map((entity) => entity.rowKey); + keys.push(...pageKeys); + } + return keys; + }, + async clear() { + const iterator = client.listEntities().byPage({ maxPageSize: 1000 }); + for await (const page of iterator) { + await Promise.all( + page.map( + async (entity) => + await client.deleteEntity(entity.partitionKey, entity.rowKey) + ) + ); + } + }, + }; +}); diff --git a/test/drivers/azure-storage-table.test.ts b/test/drivers/azure-storage-table.test.ts new file mode 100644 index 00000000..36f8c49f --- /dev/null +++ b/test/drivers/azure-storage-table.test.ts @@ -0,0 +1,17 @@ +import { describe, it, expect, beforeAll, afterAll } from "vitest"; +import driver from "../../src/drivers/azure-storage-table"; +import { testDriver } from "./utils"; +import { TableClient } from "@azure/data-tables"; + +describe("drivers: azure-storage-table", () => { + beforeAll(async () => { + const client = TableClient.fromConnectionString( + "UseDevelopmentStorage=true", + "unstorage" + ); + await client.createTable(); + }); + testDriver({ + driver: driver({ connectionString: "UseDevelopmentStorage=true" }), + }); +}); From 7e75754c9a4c5f87cd9b1bea8dcdbd35c3f82007 Mon Sep 17 00:00:00 2001 From: Jan-Henrik Damaschke Date: Tue, 7 Feb 2023 02:18:32 +0100 Subject: [PATCH 02/18] fix(test): Updated test and error handling --- src/drivers/azure-storage-table.ts | 16 ++++++++++++++-- test/drivers/azure-storage-table.test.ts | 2 +- test/drivers/utils.ts | 2 +- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/drivers/azure-storage-table.ts b/src/drivers/azure-storage-table.ts index f8db513c..3d1691fd 100644 --- a/src/drivers/azure-storage-table.ts +++ b/src/drivers/azure-storage-table.ts @@ -49,6 +49,11 @@ export default defineDriver((opts: AzureStorageTableOptions = {}) => { sasKey = null, connectionString = null, } = opts; + if (!accountName) + throw new Error( + "Account name is required to use the Azure Storage Table driver." + ); + let client: TableClient; if (accountKey) { // AzureNamedKeyCredential is only available in Node.js runtime, not in browsers @@ -88,8 +93,8 @@ export default defineDriver((opts: AzureStorageTableOptions = {}) => { }, async getItem(key) { try { - const result = await client.getEntity(partitionKey, key); - return result.unstorageValue; + const entity = await client.getEntity(partitionKey, key); + return entity.unstorageValue; } catch { return null; } @@ -116,6 +121,13 @@ export default defineDriver((opts: AzureStorageTableOptions = {}) => { } return keys; }, + async getMeta(key) { + const entity = await client.getEntity(partitionKey, key); + return { + mtime: entity.timestamp, + etag: entity.etag, + }; + }, async clear() { const iterator = client.listEntities().byPage({ maxPageSize: 1000 }); for await (const page of iterator) { diff --git a/test/drivers/azure-storage-table.test.ts b/test/drivers/azure-storage-table.test.ts index 36f8c49f..dae08562 100644 --- a/test/drivers/azure-storage-table.test.ts +++ b/test/drivers/azure-storage-table.test.ts @@ -12,6 +12,6 @@ describe("drivers: azure-storage-table", () => { await client.createTable(); }); testDriver({ - driver: driver({ connectionString: "UseDevelopmentStorage=true" }), + driver: driver({ connectionString: "UseDevelopmentStorage=true", accountName: "local" }), }); }); diff --git a/test/drivers/utils.ts b/test/drivers/utils.ts index cb14c00f..a4e116f8 100644 --- a/test/drivers/utils.ts +++ b/test/drivers/utils.ts @@ -104,7 +104,7 @@ export function testDriver(opts: TestOptions) { } it("removeItem", async () => { - await ctx.storage.removeItem("s1:a"); + await ctx.storage.removeItem("s1:a", false); expect(await ctx.storage.hasItem("s1:a")).toBe(false); expect(await ctx.storage.getItem("s1:a")).toBe(null); }); From 5194370974016289662d2521a9f9c12d8e04685e Mon Sep 17 00:00:00 2001 From: Jan-Henrik Damaschke Date: Tue, 7 Feb 2023 03:10:09 +0100 Subject: [PATCH 03/18] feat(driver): Added azure-storage-blob driver --- package.json | 7 +- pnpm-lock.yaml | 98 ++++++++++++--- src/drivers/azure-storage-blob.ts | 151 +++++++++++++++++++++++ src/drivers/azure-storage-table.ts | 2 +- test/drivers/azure-storage-blob.test.ts | 19 +++ test/drivers/azure-storage-table.test.ts | 5 +- 6 files changed, 260 insertions(+), 22 deletions(-) create mode 100644 src/drivers/azure-storage-blob.ts create mode 100644 test/drivers/azure-storage-blob.test.ts diff --git a/package.json b/package.json index 781ff5da..573fa464 100644 --- a/package.json +++ b/package.json @@ -36,14 +36,15 @@ "lint": "eslint --ext .ts . && prettier -c src test demo", "prepack": "pnpm build", "release": "pnpm test && changelogen --release && git push --follow-tags && pnpm publish", - "test": "pnpm lint && run-p -r azurite-table-storage vitest", - "vitest": "vitest run --coverage test/drivers/azure-storage-table.test.ts", - "azurite-table-storage": "azurite-table --silent", + "test": "pnpm lint && run-p -r azurite vitest", + "vitest": "vitest run --coverage", + "azurite": "azurite --silent", "unstorage": "pnpm jiti src/cli" }, "dependencies": { "@azure/data-tables": "^13.2.1", "@azure/identity": "^3.1.3", + "@azure/storage-blob": "^12.12.0", "anymatch": "^3.1.3", "chokidar": "^3.5.3", "destr": "^1.2.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 82fa30ea..e66b601c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3,6 +3,7 @@ lockfileVersion: 5.4 specifiers: '@azure/data-tables': ^13.2.1 '@azure/identity': ^3.1.3 + '@azure/storage-blob': ^12.12.0 '@cloudflare/workers-types': ^4.20230115.0 '@planetscale/database': ^1.5.0 '@types/jsdom': ^21.1.0 @@ -46,6 +47,7 @@ specifiers: dependencies: '@azure/data-tables': 13.2.1 '@azure/identity': 3.1.3 + '@azure/storage-blob': 12.12.0 anymatch: 3.1.3 chokidar: 3.5.3 destr: 1.2.2 @@ -138,6 +140,29 @@ packages: - supports-color dev: true + /@azure/core-http/2.3.1: + resolution: {integrity: sha512-cur03BUwV0Tbv81bQBOLafFB02B6G++K6F2O3IMl8pSE2QlXm3cu11bfyBNlDUKi5U+xnB3GC63ae3athhkx6Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-auth': 1.4.0 + '@azure/core-tracing': 1.0.0-preview.13 + '@azure/core-util': 1.1.1 + '@azure/logger': 1.0.3 + '@types/node-fetch': 2.6.2 + '@types/tunnel': 0.0.3 + form-data: 4.0.0 + node-fetch: 2.6.9 + process: 0.11.10 + tough-cookie: 4.1.2 + tslib: 2.5.0 + tunnel: 0.0.6 + uuid: 8.3.2 + xml2js: 0.4.23 + transitivePeerDependencies: + - encoding + dev: false + /@azure/core-lro/2.5.1: resolution: {integrity: sha512-JHQy/bA3NOz2WuzOi5zEk6n/TJdAropupxUT521JIJvW7EXV2YN2SFYZrf/2RHeD28QAClGdynYadZsbmP+nyQ==} engines: {node: '>=14.0.0'} @@ -145,7 +170,6 @@ packages: '@azure/abort-controller': 1.1.0 '@azure/logger': 1.0.3 tslib: 2.5.0 - dev: true /@azure/core-paging/1.5.0: resolution: {integrity: sha512-zqWdVIt+2Z+3wqxEOGzR5hXFZ8MGKK52x4vFLw8n58pR6ZfKRx3EXYTxTaYxYHc/PexPUTyimcTWFJbji9Z6Iw==} @@ -170,6 +194,14 @@ packages: transitivePeerDependencies: - supports-color + /@azure/core-tracing/1.0.0-preview.13: + resolution: {integrity: sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==} + engines: {node: '>=12.0.0'} + dependencies: + '@opentelemetry/api': 1.4.0 + tslib: 2.5.0 + dev: false + /@azure/core-tracing/1.0.1: resolution: {integrity: sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==} engines: {node: '>=12.0.0'} @@ -324,6 +356,22 @@ packages: jsonwebtoken: 9.0.0 uuid: 8.3.2 + /@azure/storage-blob/12.12.0: + resolution: {integrity: sha512-o/Mf6lkyYG/eBW4/hXB9864RxVNmAkcKHjsGR6Inlp5hupa3exjSyH2KjO3tLO//YGA+tS+17hM2bxRl9Sn16g==} + engines: {node: '>=12.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-http': 2.3.1 + '@azure/core-lro': 2.5.1 + '@azure/core-paging': 1.5.0 + '@azure/core-tracing': 1.0.0-preview.13 + '@azure/logger': 1.0.3 + events: 3.3.0 + tslib: 2.5.0 + transitivePeerDependencies: + - encoding + dev: false + /@babel/code-frame/7.18.6: resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} @@ -1077,6 +1125,11 @@ packages: resolution: {integrity: sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==} dev: true + /@opentelemetry/api/1.4.0: + resolution: {integrity: sha512-IgMK9i3sFGNUqPMbjABm0G26g0QCKCUBfglhQ7rQq6WcxbKfEHRcmwsoER4hZcuYqJgkYn2OeuoJIv7Jsftp7g==} + engines: {node: '>=8.0.0'} + dev: false + /@pkgr/utils/2.3.1: resolution: {integrity: sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -1247,9 +1300,15 @@ packages: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} dev: true + /@types/node-fetch/2.6.2: + resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} + dependencies: + '@types/node': 18.11.19 + form-data: 3.0.1 + dev: false + /@types/node/18.11.19: resolution: {integrity: sha512-YUgMWAQBWLObABqrvx8qKO1enAvBUdjZOAWQ5grBAkp5LQv45jBvYKZ3oFS9iKRCQyFjqw6iuEa1vmFqtxYLZw==} - dev: true /@types/normalize-package-data/2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -1273,6 +1332,12 @@ packages: resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==} dev: true + /@types/tunnel/0.0.3: + resolution: {integrity: sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==} + dependencies: + '@types/node': 18.11.19 + dev: false + /@types/validator/13.7.12: resolution: {integrity: sha512-YVtyAPqpefU+Mm/qqnOANW6IkqKpCSrarcyV269C8MA8Ux0dbkEuQwM/4CjL47kVEM2LgBef/ETfkH+c6+moFA==} dev: true @@ -3257,6 +3322,15 @@ packages: mime-types: 2.1.35 dev: true + /form-data/3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + /form-data/4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} @@ -4634,7 +4708,6 @@ packages: optional: true dependencies: whatwg-url: 5.0.0 - dev: true /node-forge/1.3.1: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} @@ -5039,6 +5112,11 @@ packages: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: true + /process/0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: false + /proxy-addr/2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -5049,12 +5127,10 @@ packages: /psl/1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: true /punycode/2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} - dev: true /qs/6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} @@ -5065,7 +5141,6 @@ packages: /querystringify/2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: true /queue-microtask/1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -5195,7 +5270,6 @@ packages: /requires-port/1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: true /resolve-from/4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} @@ -5306,7 +5380,6 @@ packages: /sax/1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} - dev: true /saxes/6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} @@ -5858,11 +5931,9 @@ packages: punycode: 2.3.0 universalify: 0.2.0 url-parse: 1.5.10 - dev: true /tr46/0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: true /tr46/3.0.0: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} @@ -5904,7 +5975,6 @@ packages: /tunnel/0.0.6: resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} - dev: true /type-check/0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} @@ -6026,7 +6096,6 @@ packages: /universalify/0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} - dev: true /universalify/2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} @@ -6075,7 +6144,6 @@ packages: dependencies: querystringify: 2.2.0 requires-port: 1.0.0 - dev: true /util-deprecate/1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -6278,7 +6346,6 @@ packages: /webidl-conversions/3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: true /webidl-conversions/7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} @@ -6310,7 +6377,6 @@ packages: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - dev: true /which-boxed-primitive/1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} @@ -6430,12 +6496,10 @@ packages: dependencies: sax: 1.2.4 xmlbuilder: 11.0.1 - dev: true /xmlbuilder/11.0.1: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} - dev: true /xmlchars/2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} diff --git a/src/drivers/azure-storage-blob.ts b/src/drivers/azure-storage-blob.ts new file mode 100644 index 00000000..18a7b335 --- /dev/null +++ b/src/drivers/azure-storage-blob.ts @@ -0,0 +1,151 @@ +import { defineDriver } from "./utils"; +import { + BlobServiceClient, + StorageSharedKeyCredential, +} from "@azure/storage-blob"; +import { DefaultAzureCredential } from "@azure/identity"; + +export interface AzureStorageBlobOptions { + /** + * The name of the Azure Storage account. + * @default null + */ + accountName?: string; + /** + * The name of the storage container. All entities will be stored in the same container. + * @default 'unstorage' + */ + containerName?: string; + /** + * The account key. If provided, the SAS key will be ignored. Only available in Node.js runtime. + * @default null + */ + accountKey?: string; + /** + * The SAS key. If provided, the account key will be ignored. + * @default null + */ + sasKey?: string; + /** + * The connection string. If provided, the account key and SAS key will be ignored. Only available in Node.js runtime. + * @default null + */ + connectionString?: string; +} + +export default defineDriver((opts: AzureStorageBlobOptions = {}) => { + const { + accountName = null, + containerName = "unstorage", + accountKey = null, + sasKey = null, + connectionString = null, + } = opts; + if (!accountName) + throw new Error( + "Account name is required to use the Azure Storage Blob driver." + ); + + let serviceClient: BlobServiceClient; + if (accountKey) { + // StorageSharedKeyCredential is only available in Node.js runtime, not in browsers + const credential = new StorageSharedKeyCredential(accountName, accountKey); + serviceClient = new BlobServiceClient( + `https://${accountName}.blob.core.windows.net`, + credential + ); + } else if (sasKey) { + serviceClient = new BlobServiceClient( + `https://${accountName}.blob.core.windows.net${sasKey}` + ); + } else if (connectionString) { + // fromConnectionString is only available in Node.js runtime, not in browsers + serviceClient = BlobServiceClient.fromConnectionString(connectionString); + } else { + const credential = new DefaultAzureCredential(); + serviceClient = new BlobServiceClient( + `https://${accountName}.blob.core.windows.net`, + credential + ); + } + + const containerClient = serviceClient.getContainerClient(containerName); + + return { + async hasItem(key) { + return await containerClient.getBlockBlobClient(key).exists(); + }, + async getItem(key) { + try { + const blob = await containerClient.getBlockBlobClient(key).download(); + return (await streamToBuffer(blob.readableStreamBody)).toString(); + } catch { + return null; + } + }, + async setItem(key, value) { + await containerClient + .getBlockBlobClient(key) + .upload(value, Buffer.byteLength(value)); + return; + }, + async removeItem(key) { + await containerClient.getBlockBlobClient(key).delete(); + return; + }, + async getKeys() { + const iterator = containerClient + .listBlobsFlat() + .byPage({ maxPageSize: 1000 }); + const keys: string[] = []; + for await (const page of iterator) { + const pageKeys = page.segment.blobItems.map((blob) => blob.name); + keys.push(...pageKeys); + } + return keys; + }, + async getMeta(key) { + const blobProperties = await containerClient + .getBlockBlobClient(key) + .getProperties(); + return { + mtime: blobProperties.lastModified, + atime: blobProperties.lastAccessed, + cr: blobProperties.createdOn, + ...blobProperties.metadata, + }; + }, + async clear() { + const iterator = containerClient + .listBlobsFlat() + .byPage({ maxPageSize: 1000 }); + for await (const page of iterator) { + await Promise.all( + page.segment.blobItems.map( + async (blob) => + await containerClient.deleteBlob(blob.name, { + deleteSnapshots: "include", + }) + ) + ); + } + return; + }, + }; +}); + +// Helper function to read a Node.js readable stream into a Buffer (https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/storage/storage-blob/samples/typescript/src/basic.ts) +async function streamToBuffer( + readableStream: NodeJS.ReadableStream +): Promise { + return new Promise((resolve, reject) => { + const chunks: Buffer[] = []; + readableStream.on("data", (data: Buffer | string) => { + chunks.push(data instanceof Buffer ? data : Buffer.from(data)); + }); + readableStream.on("end", () => { + resolve(Buffer.concat(chunks)); + }); + readableStream.on("error", reject); + }); +} diff --git a/src/drivers/azure-storage-table.ts b/src/drivers/azure-storage-table.ts index 3d1691fd..50e97985 100644 --- a/src/drivers/azure-storage-table.ts +++ b/src/drivers/azure-storage-table.ts @@ -124,7 +124,7 @@ export default defineDriver((opts: AzureStorageTableOptions = {}) => { async getMeta(key) { const entity = await client.getEntity(partitionKey, key); return { - mtime: entity.timestamp, + mtime: new Date(entity.timestamp), etag: entity.etag, }; }, diff --git a/test/drivers/azure-storage-blob.test.ts b/test/drivers/azure-storage-blob.test.ts new file mode 100644 index 00000000..222d71eb --- /dev/null +++ b/test/drivers/azure-storage-blob.test.ts @@ -0,0 +1,19 @@ +import { describe, it, expect, beforeAll, afterAll } from "vitest"; +import driver from "../../src/drivers/azure-storage-blob"; +import { testDriver } from "./utils"; +import { BlobServiceClient } from "@azure/storage-blob"; + +describe("drivers: azure-storage-blob", () => { + beforeAll(async () => { + const client = BlobServiceClient.fromConnectionString( + "UseDevelopmentStorage=true" + ); + await client.createContainer("unstorage"); + }); + testDriver({ + driver: driver({ + connectionString: "UseDevelopmentStorage=true", + accountName: "local", + }), + }); +}); diff --git a/test/drivers/azure-storage-table.test.ts b/test/drivers/azure-storage-table.test.ts index dae08562..eb202f8d 100644 --- a/test/drivers/azure-storage-table.test.ts +++ b/test/drivers/azure-storage-table.test.ts @@ -12,6 +12,9 @@ describe("drivers: azure-storage-table", () => { await client.createTable(); }); testDriver({ - driver: driver({ connectionString: "UseDevelopmentStorage=true", accountName: "local" }), + driver: driver({ + connectionString: "UseDevelopmentStorage=true", + accountName: "local", + }), }); }); From 2834cae8a8728a1cd363b0de7b264bdf1929f180 Mon Sep 17 00:00:00 2001 From: Jan-Henrik Damaschke Date: Thu, 9 Feb 2023 02:43:06 +0100 Subject: [PATCH 04/18] feat(azure-storage-blob): Changed containerClient to be lazy loaded --- package.json | 10 ++-- pnpm-lock.yaml | 23 +++++++- src/drivers/azure-storage-blob.ts | 95 ++++++++++++++++++++----------- 3 files changed, 87 insertions(+), 41 deletions(-) diff --git a/package.json b/package.json index 573fa464..2a89f898 100644 --- a/package.json +++ b/package.json @@ -37,14 +37,11 @@ "prepack": "pnpm build", "release": "pnpm test && changelogen --release && git push --follow-tags && pnpm publish", "test": "pnpm lint && run-p -r azurite vitest", - "vitest": "vitest run --coverage", + "vitest": "vitest run --coverage test/drivers/azure-storage-blob.test.ts", "azurite": "azurite --silent", "unstorage": "pnpm jiti src/cli" }, "dependencies": { - "@azure/data-tables": "^13.2.1", - "@azure/identity": "^3.1.3", - "@azure/storage-blob": "^12.12.0", "anymatch": "^3.1.3", "chokidar": "^3.5.3", "destr": "^1.2.2", @@ -60,7 +57,10 @@ "ws": "^8.12.0" }, "optionalDependencies": { - "@planetscale/database": "^1.5.0" + "@planetscale/database": "^1.5.0", + "@azure/data-tables": "^13.2.1", + "@azure/identity": "^3.1.3", + "@azure/storage-blob": "^12.12.0" }, "devDependencies": { "@cloudflare/workers-types": "^4.20230115.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e66b601c..79e405e7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -45,9 +45,6 @@ specifiers: ws: ^8.12.0 dependencies: - '@azure/data-tables': 13.2.1 - '@azure/identity': 3.1.3 - '@azure/storage-blob': 12.12.0 anymatch: 3.1.3 chokidar: 3.5.3 destr: 1.2.2 @@ -63,6 +60,9 @@ dependencies: ws: 8.12.0 optionalDependencies: + '@azure/data-tables': 13.2.1 + '@azure/identity': 3.1.3 + '@azure/storage-blob': 12.12.0 '@planetscale/database': 1.5.0 devDependencies: @@ -162,6 +162,7 @@ packages: transitivePeerDependencies: - encoding dev: false + optional: true /@azure/core-lro/2.5.1: resolution: {integrity: sha512-JHQy/bA3NOz2WuzOi5zEk6n/TJdAropupxUT521JIJvW7EXV2YN2SFYZrf/2RHeD28QAClGdynYadZsbmP+nyQ==} @@ -201,6 +202,7 @@ packages: '@opentelemetry/api': 1.4.0 tslib: 2.5.0 dev: false + optional: true /@azure/core-tracing/1.0.1: resolution: {integrity: sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==} @@ -222,10 +224,12 @@ packages: fast-xml-parser: 4.1.1 tslib: 2.5.0 dev: false + optional: true /@azure/data-tables/13.2.1: resolution: {integrity: sha512-5pboUpSpxjTgZ499MxkLLR0i+lyUUwN6M5pTLZ2D4mUfKVz+vqiCijvxij0V0OfknMxVpQ+NrZcUdarw6a1Few==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: '@azure/core-auth': 1.4.0 '@azure/core-client': 1.7.1 @@ -239,6 +243,7 @@ packages: transitivePeerDependencies: - supports-color dev: false + optional: true /@azure/identity/2.1.0: resolution: {integrity: sha512-BPDz1sK7Ul9t0l9YKLEa8PHqWU4iCfhGJ+ELJl6c8CP3TpJt2urNCbm0ZHsthmxRsYoMPbz2Dvzj30zXZVmAFw==} @@ -267,6 +272,7 @@ packages: /@azure/identity/3.1.3: resolution: {integrity: sha512-y0jFjSfHsVPwXSwi3KaSPtOZtJZqhiqAhWUXfFYBUd/+twUBovZRXspBwLrF5rJe0r5NyvmScpQjL+TYDTQVvw==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: '@azure/abort-controller': 1.1.0 '@azure/core-auth': 1.4.0 @@ -287,6 +293,7 @@ packages: transitivePeerDependencies: - supports-color dev: false + optional: true /@azure/keyvault-keys/4.6.0: resolution: {integrity: sha512-0112LegxeR03L8J4k+q6HwBVvrpd9y+oInG0FG3NaHXN7YUubVBon/eb5jFI6edGrvNigpxSR0XIsprFXdkzCQ==} @@ -347,6 +354,7 @@ packages: resolution: {integrity: sha512-we9xR8lvu47fF0h+J8KyXoRy9+G/fPzm3QEa2TrdR3jaVS3LKAyE2qyMuUkNdbVkvzl8Zr9f7l+IUSP22HeqXw==} engines: {node: '>=0.8.0'} dev: false + optional: true /@azure/msal-node/1.15.0: resolution: {integrity: sha512-fwC5M0c8pxOAzmScPbpx7j28YVTDebUaizlVF7bR0xvlU0r3VWW5OobCcr9ybqKS6wGyO7u4EhXJS9rjRWAuwA==} @@ -359,6 +367,7 @@ packages: /@azure/storage-blob/12.12.0: resolution: {integrity: sha512-o/Mf6lkyYG/eBW4/hXB9864RxVNmAkcKHjsGR6Inlp5hupa3exjSyH2KjO3tLO//YGA+tS+17hM2bxRl9Sn16g==} engines: {node: '>=12.0.0'} + requiresBuild: true dependencies: '@azure/abort-controller': 1.1.0 '@azure/core-http': 2.3.1 @@ -371,6 +380,7 @@ packages: transitivePeerDependencies: - encoding dev: false + optional: true /@babel/code-frame/7.18.6: resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} @@ -1129,6 +1139,7 @@ packages: resolution: {integrity: sha512-IgMK9i3sFGNUqPMbjABm0G26g0QCKCUBfglhQ7rQq6WcxbKfEHRcmwsoER4hZcuYqJgkYn2OeuoJIv7Jsftp7g==} engines: {node: '>=8.0.0'} dev: false + optional: true /@pkgr/utils/2.3.1: resolution: {integrity: sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==} @@ -1306,6 +1317,7 @@ packages: '@types/node': 18.11.19 form-data: 3.0.1 dev: false + optional: true /@types/node/18.11.19: resolution: {integrity: sha512-YUgMWAQBWLObABqrvx8qKO1enAvBUdjZOAWQ5grBAkp5LQv45jBvYKZ3oFS9iKRCQyFjqw6iuEa1vmFqtxYLZw==} @@ -1337,6 +1349,7 @@ packages: dependencies: '@types/node': 18.11.19 dev: false + optional: true /@types/validator/13.7.12: resolution: {integrity: sha512-YVtyAPqpefU+Mm/qqnOANW6IkqKpCSrarcyV269C8MA8Ux0dbkEuQwM/4CjL47kVEM2LgBef/ETfkH+c6+moFA==} @@ -3206,6 +3219,7 @@ packages: dependencies: strnum: 1.0.5 dev: false + optional: true /fastq/1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} @@ -3330,6 +3344,7 @@ packages: combined-stream: 1.0.8 mime-types: 2.1.35 dev: false + optional: true /form-data/4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} @@ -5116,6 +5131,7 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} dev: false + optional: true /proxy-addr/2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} @@ -5772,6 +5788,7 @@ packages: /strnum/1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} dev: false + optional: true /supports-color/5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} diff --git a/src/drivers/azure-storage-blob.ts b/src/drivers/azure-storage-blob.ts index 18a7b335..05b4b3e2 100644 --- a/src/drivers/azure-storage-blob.ts +++ b/src/drivers/azure-storage-blob.ts @@ -1,6 +1,7 @@ import { defineDriver } from "./utils"; import { BlobServiceClient, + ContainerClient, StorageSharedKeyCredential, } from "@azure/storage-blob"; import { DefaultAzureCredential } from "@azure/identity"; @@ -46,55 +47,69 @@ export default defineDriver((opts: AzureStorageBlobOptions = {}) => { "Account name is required to use the Azure Storage Blob driver." ); - let serviceClient: BlobServiceClient; - if (accountKey) { - // StorageSharedKeyCredential is only available in Node.js runtime, not in browsers - const credential = new StorageSharedKeyCredential(accountName, accountKey); - serviceClient = new BlobServiceClient( - `https://${accountName}.blob.core.windows.net`, - credential - ); - } else if (sasKey) { - serviceClient = new BlobServiceClient( - `https://${accountName}.blob.core.windows.net${sasKey}` - ); - } else if (connectionString) { - // fromConnectionString is only available in Node.js runtime, not in browsers - serviceClient = BlobServiceClient.fromConnectionString(connectionString); - } else { - const credential = new DefaultAzureCredential(); - serviceClient = new BlobServiceClient( - `https://${accountName}.blob.core.windows.net`, - credential - ); - } - - const containerClient = serviceClient.getContainerClient(containerName); + let containerClient: ContainerClient; + const getContainerClient = () => { + if (!containerClient) { + let serviceClient: BlobServiceClient; + if (accountKey) { + // StorageSharedKeyCredential is only available in Node.js runtime, not in browsers + const credential = new StorageSharedKeyCredential( + accountName, + accountKey + ); + serviceClient = new BlobServiceClient( + `https://${accountName}.blob.core.windows.net`, + credential + ); + } else if (sasKey) { + serviceClient = new BlobServiceClient( + `https://${accountName}.blob.core.windows.net${sasKey}` + ); + } else if (connectionString) { + // fromConnectionString is only available in Node.js runtime, not in browsers + serviceClient = + BlobServiceClient.fromConnectionString(connectionString); + } else { + const credential = new DefaultAzureCredential(); + serviceClient = new BlobServiceClient( + `https://${accountName}.blob.core.windows.net`, + credential + ); + } + containerClient = serviceClient.getContainerClient(containerName); + } + return containerClient; + }; return { async hasItem(key) { - return await containerClient.getBlockBlobClient(key).exists(); + return await getContainerClient().getBlockBlobClient(key).exists(); }, async getItem(key) { try { - const blob = await containerClient.getBlockBlobClient(key).download(); + const blob = await getContainerClient() + .getBlockBlobClient(key) + .download(); + if (isBrowser) { + return await blobToString(await blob.blobBody); + } return (await streamToBuffer(blob.readableStreamBody)).toString(); } catch { return null; } }, async setItem(key, value) { - await containerClient + await getContainerClient() .getBlockBlobClient(key) .upload(value, Buffer.byteLength(value)); return; }, async removeItem(key) { - await containerClient.getBlockBlobClient(key).delete(); + await getContainerClient().getBlockBlobClient(key).delete(); return; }, async getKeys() { - const iterator = containerClient + const iterator = getContainerClient() .listBlobsFlat() .byPage({ maxPageSize: 1000 }); const keys: string[] = []; @@ -105,7 +120,7 @@ export default defineDriver((opts: AzureStorageBlobOptions = {}) => { return keys; }, async getMeta(key) { - const blobProperties = await containerClient + const blobProperties = await getContainerClient() .getBlockBlobClient(key) .getProperties(); return { @@ -116,14 +131,14 @@ export default defineDriver((opts: AzureStorageBlobOptions = {}) => { }; }, async clear() { - const iterator = containerClient + const iterator = getContainerClient() .listBlobsFlat() .byPage({ maxPageSize: 1000 }); for await (const page of iterator) { await Promise.all( page.segment.blobItems.map( async (blob) => - await containerClient.deleteBlob(blob.name, { + await getContainerClient().deleteBlob(blob.name, { deleteSnapshots: "include", }) ) @@ -134,7 +149,9 @@ export default defineDriver((opts: AzureStorageBlobOptions = {}) => { }; }); -// Helper function to read a Node.js readable stream into a Buffer (https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/storage/storage-blob/samples/typescript/src/basic.ts) +const isBrowser = typeof window !== "undefined"; + +// Helper function to read a Node.js readable stream into a Buffer. (https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/storage/storage-blob) async function streamToBuffer( readableStream: NodeJS.ReadableStream ): Promise { @@ -149,3 +166,15 @@ async function streamToBuffer( readableStream.on("error", reject); }); } + +// Helepr function used to convert a browser Blob into string. (https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/storage/storage-blob) +async function blobToString(blob: Blob) { + const fileReader = new FileReader(); + return new Promise((resolve, reject) => { + fileReader.onloadend = (ev) => { + resolve(ev.target.result); + }; + fileReader.onerror = reject; + fileReader.readAsText(blob); + }); +} From 55b8915c45fd67dd07d7f14e37fcaccc68faf727 Mon Sep 17 00:00:00 2001 From: Jan-Henrik Damaschke Date: Tue, 7 Feb 2023 20:24:48 +0100 Subject: [PATCH 05/18] fix(azure-storage-table): Minor bug fixes --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 2a89f898..128470d6 100644 --- a/package.json +++ b/package.json @@ -36,9 +36,9 @@ "lint": "eslint --ext .ts . && prettier -c src test demo", "prepack": "pnpm build", "release": "pnpm test && changelogen --release && git push --follow-tags && pnpm publish", - "test": "pnpm lint && run-p -r azurite vitest", - "vitest": "vitest run --coverage test/drivers/azure-storage-blob.test.ts", - "azurite": "azurite --silent", + "test": "pnpm lint && run-p -r azurite-table-storage vitest", + "vitest": "vitest run --coverage", + "azurite-table-storage": "azurite --silent", "unstorage": "pnpm jiti src/cli" }, "dependencies": { From 2772ab9f088aebebafa46422e4dbd0026a386ab0 Mon Sep 17 00:00:00 2001 From: Jan-Henrik Damaschke Date: Tue, 7 Feb 2023 20:48:49 +0100 Subject: [PATCH 06/18] docs(azure-storage-table): Updated README with documentation --- README.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/README.md b/README.md index 4c87537c..94046977 100644 --- a/README.md +++ b/README.md @@ -622,6 +622,54 @@ const storage = createStorage({ - `storage`: The name of the table to read from. It defaults to `storage`. - `boostCache`: Whether to enable cached queries: see [docs](https://planetscale.com/docs/concepts/query-caching-with-planetscale-boost#using-cached-queries-in-your-application). +### `azure-storage-table` + +Store data in a Azure table storage [data-tables](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/tables/data-tables). + +This driver stores KV information in a Azure table storage. The same partition key is used for all keys and the field `unstorageValue` is used to store the value. + +To use it, you will need to install `@azure/data-table` and `@azure/identity` in your project: + +```json +{ + "dependencies": { + "@azure/data-tables": "^13.2.1", + "@azure/identity": "^3.1.3" + } +} +``` + +Please make sure that the table you want to use exists in your storage account. + +```js +import { createStorage } from "unstorage"; +import azureStorageTableDriver from "unstorage/drivers/azure-storage-table"; + +const storage = createStorage({ + driver: azureStorageTableDriver({ + accountName: "myazurestorageaccount", + }), +}); +``` + +**Authentication:** + +The driver supports the following authentication methods: + +- **`DefaultAzureCredential`**: This is the recommended way to authenticate. It will use managed identity or environment variables to authenticate the request. It will also work in a local environment by trying to use Azure CLI or Azure PowerShell to authenticate.
+⚠️ Make sure that your Managed Identity or personal account has the `Storage Table Data Contributor` role assigned to it, even if you already are `Contributor` or `Owner` on the storage account. +- **`AzureNamedKeyCredential`** (only available in Node.js runtime): This will use the `accountName` and `accountKey` to authenticate the request. +- **`AzureSASCredential`**: This will use the `accountName` and `sasToken` to authenticate the request. +- **connection string** (only available in Node.js runtime): This will use the `connectionString` to authenticate the request. This is not recommended as it will expose your account key in plain text. + +**Options:** + +- **`accountName`** (required): The name of your storage account. +- `tableName`: The name of the table to use. Defaults to `unstorage`. +- `partitionKey`: The partition key to use. Defaults to `unstorage`. +- `accountKey`: The account key to use for authentication. This is only required if you are using `AzureNamedKeyCredential`. +- `sasKey`: The SAS token to use for authentication. This is only required if you are using `AzureSASCredential`. + ## Making custom drivers It is possible to extend unstorage by creating custom drives. From 83d786d890a6c097a771a468508528746a2269e0 Mon Sep 17 00:00:00 2001 From: Jan-Henrik Damaschke Date: Tue, 7 Feb 2023 20:55:32 +0100 Subject: [PATCH 07/18] chore(deps): Updated lockfile --- pnpm-lock.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 79e405e7..69c0e843 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -62,7 +62,6 @@ dependencies: optionalDependencies: '@azure/data-tables': 13.2.1 '@azure/identity': 3.1.3 - '@azure/storage-blob': 12.12.0 '@planetscale/database': 1.5.0 devDependencies: From 0fafae8b57a954b0d0f7a76126240250e834e93a Mon Sep 17 00:00:00 2001 From: Jan-Henrik Damaschke Date: Tue, 7 Feb 2023 20:57:16 +0100 Subject: [PATCH 08/18] chore(deps): Fixed dev deps --- package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package.json b/package.json index 128470d6..e87da1f3 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,8 @@ "devDependencies": { "@cloudflare/workers-types": "^4.20230115.0", "@planetscale/database": "^1.5.0", + "@azure/data-tables": "^13.2.1", + "@azure/identity": "^3.1.3", "@types/jsdom": "^21.1.0", "@types/mri": "^1.1.1", "@types/node": "^18.11.19", From 12044824758f636b8f8f32d1b9653165a5894ced Mon Sep 17 00:00:00 2001 From: Jan-Henrik Damaschke Date: Thu, 9 Feb 2023 01:44:29 +0100 Subject: [PATCH 09/18] feat(azure-storage-table): Implemented lazy client; Added pageSize option --- src/drivers/azure-storage-table.ts | 86 ++++++++++++++++++------------ 1 file changed, 52 insertions(+), 34 deletions(-) diff --git a/src/drivers/azure-storage-table.ts b/src/drivers/azure-storage-table.ts index 50e97985..dee8f703 100644 --- a/src/drivers/azure-storage-table.ts +++ b/src/drivers/azure-storage-table.ts @@ -38,6 +38,11 @@ export interface AzureStorageTableOptions { * @default null */ connectionString?: string; + /** + * The number of entries to retrive per request. Impacts getKeys() and clear() performance. Maximum value is 1000. + * @default 1000 + */ + pageSize?: number; } export default defineDriver((opts: AzureStorageTableOptions = {}) => { @@ -48,44 +53,53 @@ export default defineDriver((opts: AzureStorageTableOptions = {}) => { accountKey = null, sasKey = null, connectionString = null, + pageSize = 1000, } = opts; if (!accountName) throw new Error( "Account name is required to use the Azure Storage Table driver." ); + if (pageSize > 1000) { + throw new Error("pageSize exceeds the maximum allowed value of 1000"); + } let client: TableClient; - if (accountKey) { - // AzureNamedKeyCredential is only available in Node.js runtime, not in browsers - const credential = new AzureNamedKeyCredential(accountName, accountKey); - client = new TableClient( - `https://${accountName}.table.core.windows.net`, - tableName, - credential - ); - } else if (sasKey) { - const credential = new AzureSASCredential(sasKey); - client = new TableClient( - `https://${accountName}.table.core.windows.net`, - tableName, - credential - ); - } else if (connectionString) { - // fromConnectionString is only available in Node.js runtime, not in browsers - client = TableClient.fromConnectionString(connectionString, tableName); - } else { - const credential = new DefaultAzureCredential(); - client = new TableClient( - `https://${accountName}.table.core.windows.net`, - tableName, - credential - ); - } + const getClient = () => { + if (!client) { + if (accountKey) { + // AzureNamedKeyCredential is only available in Node.js runtime, not in browsers + const credential = new AzureNamedKeyCredential(accountName, accountKey); + client = new TableClient( + `https://${accountName}.table.core.windows.net`, + tableName, + credential + ); + } else if (sasKey) { + const credential = new AzureSASCredential(sasKey); + client = new TableClient( + `https://${accountName}.table.core.windows.net`, + tableName, + credential + ); + } else if (connectionString) { + // fromConnectionString is only available in Node.js runtime, not in browsers + client = TableClient.fromConnectionString(connectionString, tableName); + } else { + const credential = new DefaultAzureCredential(); + client = new TableClient( + `https://${accountName}.table.core.windows.net`, + tableName, + credential + ); + } + } + return client; + }; return { async hasItem(key) { try { - await client.getEntity(partitionKey, key); + await getClient().getEntity(partitionKey, key); return true; } catch { return false; @@ -93,7 +107,7 @@ export default defineDriver((opts: AzureStorageTableOptions = {}) => { }, async getItem(key) { try { - const entity = await client.getEntity(partitionKey, key); + const entity = await getClient().getEntity(partitionKey, key); return entity.unstorageValue; } catch { return null; @@ -105,15 +119,17 @@ export default defineDriver((opts: AzureStorageTableOptions = {}) => { rowKey: key, unstorageValue: value, }; - await client.upsertEntity(entity, "Replace"); + await getClient().upsertEntity(entity, "Replace"); return; }, async removeItem(key) { - await client.deleteEntity(partitionKey, key); + await getClient().deleteEntity(partitionKey, key); return; }, async getKeys() { - const iterator = client.listEntities().byPage({ maxPageSize: 1000 }); + const iterator = getClient() + .listEntities() + .byPage({ maxPageSize: pageSize }); const keys = []; for await (const page of iterator) { const pageKeys = page.map((entity) => entity.rowKey); @@ -122,19 +138,21 @@ export default defineDriver((opts: AzureStorageTableOptions = {}) => { return keys; }, async getMeta(key) { - const entity = await client.getEntity(partitionKey, key); + const entity = await getClient().getEntity(partitionKey, key); return { mtime: new Date(entity.timestamp), etag: entity.etag, }; }, async clear() { - const iterator = client.listEntities().byPage({ maxPageSize: 1000 }); + const iterator = getClient() + .listEntities() + .byPage({ maxPageSize: pageSize }); for await (const page of iterator) { await Promise.all( page.map( async (entity) => - await client.deleteEntity(entity.partitionKey, entity.rowKey) + await getClient().deleteEntity(entity.partitionKey, entity.rowKey) ) ); } From 9b3dc10fa6c97432d29e455b10f855917d0b8be9 Mon Sep 17 00:00:00 2001 From: Jan-Henrik Damaschke Date: Thu, 9 Feb 2023 03:25:56 +0100 Subject: [PATCH 10/18] test(azure-storage-blob): Updated tests to run azurite only if needed --- package.json | 8 +- pnpm-lock.yaml | 125 +----------------------- test/drivers/azure-storage-blob.test.ts | 9 +- 3 files changed, 13 insertions(+), 129 deletions(-) diff --git a/package.json b/package.json index e87da1f3..c4b3c555 100644 --- a/package.json +++ b/package.json @@ -36,9 +36,9 @@ "lint": "eslint --ext .ts . && prettier -c src test demo", "prepack": "pnpm build", "release": "pnpm test && changelogen --release && git push --follow-tags && pnpm publish", - "test": "pnpm lint && run-p -r azurite-table-storage vitest", - "vitest": "vitest run --coverage", - "azurite-table-storage": "azurite --silent", + "test": "pnpm lint && vitest run --coverage", + "azurite-table-storage": "azurite-table --silent", + "azurite-blob-storage": "azurite-blob --silent", "unstorage": "pnpm jiti src/cli" }, "dependencies": { @@ -67,6 +67,7 @@ "@planetscale/database": "^1.5.0", "@azure/data-tables": "^13.2.1", "@azure/identity": "^3.1.3", + "@azure/storage-blob": "^12.12.0", "@types/jsdom": "^21.1.0", "@types/mri": "^1.1.1", "@types/node": "^18.11.19", @@ -83,7 +84,6 @@ "jsdom": "^21.1.0", "monaco-editor": "^0.34.1", "msw": "^1.0.0", - "npm-run-all": "^4.1.5", "prettier": "^2.8.3", "types-cloudflare-worker": "^1.2.0", "typescript": "^4.9.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 69c0e843..15951780 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,7 +32,6 @@ specifiers: mri: ^1.2.0 msw: ^1.0.0 node-fetch-native: ^1.0.1 - npm-run-all: ^4.1.5 ofetch: ^1.0.0 prettier: ^2.8.3 types-cloudflare-worker: ^1.2.0 @@ -62,6 +61,7 @@ dependencies: optionalDependencies: '@azure/data-tables': 13.2.1 '@azure/identity': 3.1.3 + '@azure/storage-blob': 12.12.0 '@planetscale/database': 1.5.0 devDependencies: @@ -82,7 +82,6 @@ devDependencies: jsdom: 21.1.0 monaco-editor: 0.34.1 msw: 1.0.0_typescript@4.9.5 - npm-run-all: 4.1.5 prettier: 2.8.3 types-cloudflare-worker: 1.2.0 typescript: 4.9.5 @@ -2328,17 +2327,6 @@ packages: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true - /cross-spawn/6.0.5: - resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} - engines: {node: '>=4.8'} - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.1 - shebang-command: 1.2.0 - which: 1.3.1 - dev: true - /cross-spawn/7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -4146,10 +4134,6 @@ packages: hasBin: true dev: true - /json-parse-better-errors/1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: true - /json-parse-even-better-errors/2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true @@ -4280,16 +4264,6 @@ packages: ufo: 1.0.1 dev: false - /load-json-file/4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} - dependencies: - graceful-fs: 4.2.10 - parse-json: 4.0.0 - pify: 3.0.0 - strip-bom: 3.0.0 - dev: true - /local-pkg/0.4.3: resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} engines: {node: '>=14'} @@ -4425,11 +4399,6 @@ packages: engines: {node: '>= 0.6'} dev: true - /memorystream/0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} - dev: true - /merge-descriptors/1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} dev: true @@ -4701,10 +4670,6 @@ packages: engines: {node: '>= 0.6'} dev: true - /nice-try/1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - dev: true - /node-abort-controller/3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} dev: true @@ -4745,22 +4710,6 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - /npm-run-all/4.1.5: - resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} - engines: {node: '>= 4'} - hasBin: true - dependencies: - ansi-styles: 3.2.1 - chalk: 2.4.2 - cross-spawn: 6.0.5 - memorystream: 0.3.1 - minimatch: 3.1.2 - pidtree: 0.3.1 - read-pkg: 3.0.0 - shell-quote: 1.8.0 - string.prototype.padend: 3.1.4 - dev: true - /npm-run-path/4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -4962,14 +4911,6 @@ packages: callsites: 3.1.0 dev: true - /parse-json/4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} - dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 - dev: true - /parse-json/5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -5001,11 +4942,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /path-key/2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - dev: true - /path-key/3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -5027,13 +4963,6 @@ packages: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} dev: true - /path-type/3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} - dependencies: - pify: 3.0.0 - dev: true - /path-type/4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -5059,17 +4988,6 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - /pidtree/0.3.1: - resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} - engines: {node: '>=0.10'} - hasBin: true - dev: true - - /pify/3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: true - /pkg-types/1.0.1: resolution: {integrity: sha512-jHv9HB+Ho7dj6ItwppRDDl0iZRYBD0jsakHXtFgoLr+cHSF6xC+QL54sJmWxyGxOLYSHm0afhXhXcQDQqH9z8g==} dependencies: @@ -5201,15 +5119,6 @@ packages: type-fest: 0.8.1 dev: true - /read-pkg/3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} - dependencies: - load-json-file: 4.0.0 - normalize-package-data: 2.5.0 - path-type: 3.0.0 - dev: true - /read-pkg/5.2.0: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} @@ -5529,32 +5438,16 @@ packages: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: true - /shebang-command/1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - dependencies: - shebang-regex: 1.0.0 - dev: true - /shebang-command/2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 - /shebang-regex/1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - dev: true - /shebang-regex/3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - /shell-quote/1.8.0: - resolution: {integrity: sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==} - dev: true - /side-channel/1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: @@ -5700,15 +5593,6 @@ packages: strip-ansi: 7.0.1 dev: true - /string.prototype.padend/3.1.4: - resolution: {integrity: sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 - dev: true - /string.prototype.trimend/1.0.6: resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: @@ -6416,13 +6300,6 @@ packages: is-typed-array: 1.1.10 dev: true - /which/1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - /which/2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} diff --git a/test/drivers/azure-storage-blob.test.ts b/test/drivers/azure-storage-blob.test.ts index 222d71eb..f5cb6d60 100644 --- a/test/drivers/azure-storage-blob.test.ts +++ b/test/drivers/azure-storage-blob.test.ts @@ -2,13 +2,17 @@ import { describe, it, expect, beforeAll, afterAll } from "vitest"; import driver from "../../src/drivers/azure-storage-blob"; import { testDriver } from "./utils"; import { BlobServiceClient } from "@azure/storage-blob"; +import { ChildProcess, exec } from "child_process"; describe("drivers: azure-storage-blob", () => { + let azuriteProcess: ChildProcess; beforeAll(async () => { + azuriteProcess = exec("npm run azurite-blob-storage"); const client = BlobServiceClient.fromConnectionString( "UseDevelopmentStorage=true" ); - await client.createContainer("unstorage"); + const containerClient = client.getContainerClient("unstorage"); + await containerClient.createIfNotExists(); }); testDriver({ driver: driver({ @@ -16,4 +20,7 @@ describe("drivers: azure-storage-blob", () => { accountName: "local", }), }); + afterAll(() => { + azuriteProcess.kill(9); + }); }); From 22fe09fb2024f5f3322e00168beb8b0c6ee0bc0c Mon Sep 17 00:00:00 2001 From: Jan-Henrik Damaschke Date: Fri, 10 Feb 2023 01:26:47 +0100 Subject: [PATCH 11/18] chore(typo): Fixed typo in comment --- src/drivers/azure-storage-blob.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/drivers/azure-storage-blob.ts b/src/drivers/azure-storage-blob.ts index 05b4b3e2..989b94f1 100644 --- a/src/drivers/azure-storage-blob.ts +++ b/src/drivers/azure-storage-blob.ts @@ -167,7 +167,7 @@ async function streamToBuffer( }); } -// Helepr function used to convert a browser Blob into string. (https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/storage/storage-blob) +// Helper function used to convert a browser Blob into string. (https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/storage/storage-blob) async function blobToString(blob: Blob) { const fileReader = new FileReader(); return new Promise((resolve, reject) => { From 0c233d343b73e239adc25e48a0e09df0f947d66f Mon Sep 17 00:00:00 2001 From: Jan-Henrik Damaschke Date: Sun, 19 Feb 2023 19:16:22 +0100 Subject: [PATCH 12/18] docs(driver): Added docs for azure-storage-blob --- README.md | 24 ++-- package.json | 46 +++---- src/drivers/azure-storage-table.ts | 161 ----------------------- src/index.ts | 1 + test/drivers/azure-storage-table.test.ts | 20 --- 5 files changed, 34 insertions(+), 218 deletions(-) delete mode 100644 src/drivers/azure-storage-table.ts delete mode 100644 test/drivers/azure-storage-table.test.ts diff --git a/README.md b/README.md index 94046977..49a36562 100644 --- a/README.md +++ b/README.md @@ -622,31 +622,33 @@ const storage = createStorage({ - `storage`: The name of the table to read from. It defaults to `storage`. - `boostCache`: Whether to enable cached queries: see [docs](https://planetscale.com/docs/concepts/query-caching-with-planetscale-boost#using-cached-queries-in-your-application). -### `azure-storage-table` +### `azure-storage-blob` -Store data in a Azure table storage [data-tables](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/tables/data-tables). +⚠️ This driver is currently not compatible with edge workers like Cloudflare Workers or Vercel Edge Functions. There may be a http based driver in the future. -This driver stores KV information in a Azure table storage. The same partition key is used for all keys and the field `unstorageValue` is used to store the value. +Store data in a Azure blob storage [storage-blob](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/storage/storage-blob). -To use it, you will need to install `@azure/data-table` and `@azure/identity` in your project: +This driver stores KV information in a Azure blob storage blob. The same container is used for all entries. Each entry is stored in a separate blob with the key as the blob name and the value as the blob content. + +To use it, you will need to install `@azure/storage-blob` and `@azure/identity` in your project: ```json { "dependencies": { - "@azure/data-tables": "^13.2.1", + "@azure/storage-blob": "^12.12.0", "@azure/identity": "^3.1.3" } } ``` -Please make sure that the table you want to use exists in your storage account. +Please make sure that the container you want to use exists in your storage account. ```js import { createStorage } from "unstorage"; -import azureStorageTableDriver from "unstorage/drivers/azure-storage-table"; +import azureStorageBlobDriver from "unstorage/drivers/azure-storage-blob"; const storage = createStorage({ - driver: azureStorageTableDriver({ + driver: azureStorageBlobDriver({ accountName: "myazurestorageaccount", }), }); @@ -657,7 +659,7 @@ const storage = createStorage({ The driver supports the following authentication methods: - **`DefaultAzureCredential`**: This is the recommended way to authenticate. It will use managed identity or environment variables to authenticate the request. It will also work in a local environment by trying to use Azure CLI or Azure PowerShell to authenticate.
-⚠️ Make sure that your Managed Identity or personal account has the `Storage Table Data Contributor` role assigned to it, even if you already are `Contributor` or `Owner` on the storage account. +⚠️ Make sure that your Managed Identity or personal account has the `Storage Blob Data Contributor` role assigned to it, even if you already are `Contributor` or `Owner` on the storage account. - **`AzureNamedKeyCredential`** (only available in Node.js runtime): This will use the `accountName` and `accountKey` to authenticate the request. - **`AzureSASCredential`**: This will use the `accountName` and `sasToken` to authenticate the request. - **connection string** (only available in Node.js runtime): This will use the `connectionString` to authenticate the request. This is not recommended as it will expose your account key in plain text. @@ -665,10 +667,10 @@ The driver supports the following authentication methods: **Options:** - **`accountName`** (required): The name of your storage account. -- `tableName`: The name of the table to use. Defaults to `unstorage`. -- `partitionKey`: The partition key to use. Defaults to `unstorage`. +- `containerName`: The name of the blob container to use. Defaults to `unstorage`. - `accountKey`: The account key to use for authentication. This is only required if you are using `AzureNamedKeyCredential`. - `sasKey`: The SAS token to use for authentication. This is only required if you are using `AzureSASCredential`. +- `connectionString`: The storage accounts' connection string. `accountKey` and `sasKey` take precedence. ## Making custom drivers diff --git a/package.json b/package.json index c4b3c555..275a9c87 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "unstorage", - "version": "1.1.3", + "version": "1.1.5", "description": "Universal Storage Layer", "repository": "unjs/unstorage", "license": "MIT", @@ -37,7 +37,6 @@ "prepack": "pnpm build", "release": "pnpm test && changelogen --release && git push --follow-tags && pnpm publish", "test": "pnpm lint && vitest run --coverage", - "azurite-table-storage": "azurite-table --silent", "azurite-blob-storage": "azurite-blob --silent", "unstorage": "pnpm jiti src/cli" }, @@ -45,52 +44,47 @@ "anymatch": "^3.1.3", "chokidar": "^3.5.3", "destr": "^1.2.2", - "h3": "^1.1.0", - "ioredis": "^5.3.0", + "h3": "^1.5.0", + "ioredis": "^5.3.1", "listhen": "^1.0.2", - "lru-cache": "^7.14.1", - "mkdir": "^0.0.2", + "lru-cache": "^7.16.0", "mri": "^1.2.0", - "node-fetch-native": "^1.0.1", - "ofetch": "^1.0.0", - "ufo": "^1.0.1", - "ws": "^8.12.0" + "node-fetch-native": "^1.0.2", + "ofetch": "^1.0.1", + "ufo": "^1.1.0" }, "optionalDependencies": { "@planetscale/database": "^1.5.0", - "@azure/data-tables": "^13.2.1", "@azure/identity": "^3.1.3", "@azure/storage-blob": "^12.12.0" }, "devDependencies": { - "@cloudflare/workers-types": "^4.20230115.0", - "@planetscale/database": "^1.5.0", - "@azure/data-tables": "^13.2.1", "@azure/identity": "^3.1.3", "@azure/storage-blob": "^12.12.0", + "azurite": "^3.21.0", + "@cloudflare/workers-types": "^4.20230214.0", + "@planetscale/database": "^1.5.0", "@types/jsdom": "^21.1.0", "@types/mri": "^1.1.1", - "@types/node": "^18.11.19", - "@types/ws": "^8.5.4", + "@types/node": "^18.13.0", "@vitejs/plugin-vue": "^4.0.0", - "@vitest/coverage-c8": "^0.28.4", + "@vitest/coverage-c8": "^0.28.5", "@vue/compiler-sfc": "^3.2.47", - "azurite": "^3.21.0", - "c8": "^7.12.0", + "c8": "^7.13.0", "changelogen": "^0.4.1", - "eslint": "^8.33.0", + "eslint": "^8.34.0", "eslint-config-unjs": "^0.1.0", - "jiti": "^1.16.2", + "jiti": "^1.17.0", "jsdom": "^21.1.0", - "monaco-editor": "^0.34.1", - "msw": "^1.0.0", - "prettier": "^2.8.3", + "monaco-editor": "^0.35.0", + "msw": "^1.0.1", + "prettier": "^2.8.4", "types-cloudflare-worker": "^1.2.0", "typescript": "^4.9.5", "unbuild": "^1.1.1", "vite": "^4.1.1", - "vitest": "^0.28.4", + "vitest": "^0.28.5", "vue": "^3.2.47" }, - "packageManager": "pnpm@7.26.3" + "packageManager": "pnpm@7.27.0" } diff --git a/src/drivers/azure-storage-table.ts b/src/drivers/azure-storage-table.ts deleted file mode 100644 index dee8f703..00000000 --- a/src/drivers/azure-storage-table.ts +++ /dev/null @@ -1,161 +0,0 @@ -import { defineDriver } from "./utils"; -import { - TableClient, - AzureNamedKeyCredential, - AzureSASCredential, - TableEntity, -} from "@azure/data-tables"; -import { DefaultAzureCredential } from "@azure/identity"; - -export interface AzureStorageTableOptions { - /** - * The name of the Azure Storage account. - * @default null - */ - accountName?: string; - /** - * The name of the table. All entities will be stored in the same table. - * @default 'unstorage' - */ - tableName?: string; - /** - * The partition key. All entities will be stored in the same partition. - * @default 'unstorage' - */ - partitionKey?: string; - /** - * The account key. If provided, the SAS key will be ignored. Only available in Node.js runtime. - * @default null - */ - accountKey?: string; - /** - * The SAS key. If provided, the account key will be ignored. - * @default null - */ - sasKey?: string; - /** - * The connection string. If provided, the account key and SAS key will be ignored. Only available in Node.js runtime. - * @default null - */ - connectionString?: string; - /** - * The number of entries to retrive per request. Impacts getKeys() and clear() performance. Maximum value is 1000. - * @default 1000 - */ - pageSize?: number; -} - -export default defineDriver((opts: AzureStorageTableOptions = {}) => { - const { - accountName = null, - tableName = "unstorage", - partitionKey = "unstorage", - accountKey = null, - sasKey = null, - connectionString = null, - pageSize = 1000, - } = opts; - if (!accountName) - throw new Error( - "Account name is required to use the Azure Storage Table driver." - ); - if (pageSize > 1000) { - throw new Error("pageSize exceeds the maximum allowed value of 1000"); - } - - let client: TableClient; - const getClient = () => { - if (!client) { - if (accountKey) { - // AzureNamedKeyCredential is only available in Node.js runtime, not in browsers - const credential = new AzureNamedKeyCredential(accountName, accountKey); - client = new TableClient( - `https://${accountName}.table.core.windows.net`, - tableName, - credential - ); - } else if (sasKey) { - const credential = new AzureSASCredential(sasKey); - client = new TableClient( - `https://${accountName}.table.core.windows.net`, - tableName, - credential - ); - } else if (connectionString) { - // fromConnectionString is only available in Node.js runtime, not in browsers - client = TableClient.fromConnectionString(connectionString, tableName); - } else { - const credential = new DefaultAzureCredential(); - client = new TableClient( - `https://${accountName}.table.core.windows.net`, - tableName, - credential - ); - } - } - return client; - }; - - return { - async hasItem(key) { - try { - await getClient().getEntity(partitionKey, key); - return true; - } catch { - return false; - } - }, - async getItem(key) { - try { - const entity = await getClient().getEntity(partitionKey, key); - return entity.unstorageValue; - } catch { - return null; - } - }, - async setItem(key, value) { - const entity: TableEntity = { - partitionKey, - rowKey: key, - unstorageValue: value, - }; - await getClient().upsertEntity(entity, "Replace"); - return; - }, - async removeItem(key) { - await getClient().deleteEntity(partitionKey, key); - return; - }, - async getKeys() { - const iterator = getClient() - .listEntities() - .byPage({ maxPageSize: pageSize }); - const keys = []; - for await (const page of iterator) { - const pageKeys = page.map((entity) => entity.rowKey); - keys.push(...pageKeys); - } - return keys; - }, - async getMeta(key) { - const entity = await getClient().getEntity(partitionKey, key); - return { - mtime: new Date(entity.timestamp), - etag: entity.etag, - }; - }, - async clear() { - const iterator = getClient() - .listEntities() - .byPage({ maxPageSize: pageSize }); - for await (const page of iterator) { - await Promise.all( - page.map( - async (entity) => - await getClient().deleteEntity(entity.partitionKey, entity.rowKey) - ) - ); - } - }, - }; -}); diff --git a/src/index.ts b/src/index.ts index 0c533fcd..43e15ff5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,6 +4,7 @@ export * from "./utils"; export { defineDriver } from "./drivers/utils"; export const builtinDrivers = { + azureStorageBlob: "unstorage/drivers/azure-storage-blob", cloudflareKVHTTP: "unstorage/drivers/cloudflare-kv-http", cloudflareKVBinding: "unstorage/drivers/cloudflare-kv-binding", "cloudflare-kv-http": "unstorage/drivers/cloudflare-kv-http", diff --git a/test/drivers/azure-storage-table.test.ts b/test/drivers/azure-storage-table.test.ts deleted file mode 100644 index eb202f8d..00000000 --- a/test/drivers/azure-storage-table.test.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { describe, it, expect, beforeAll, afterAll } from "vitest"; -import driver from "../../src/drivers/azure-storage-table"; -import { testDriver } from "./utils"; -import { TableClient } from "@azure/data-tables"; - -describe("drivers: azure-storage-table", () => { - beforeAll(async () => { - const client = TableClient.fromConnectionString( - "UseDevelopmentStorage=true", - "unstorage" - ); - await client.createTable(); - }); - testDriver({ - driver: driver({ - connectionString: "UseDevelopmentStorage=true", - accountName: "local", - }), - }); -}); From 04429a77d1bf0d46c28683a639087fed36c669cf Mon Sep 17 00:00:00 2001 From: Jan-Henrik Damaschke Date: Sun, 19 Feb 2023 19:19:01 +0100 Subject: [PATCH 13/18] chore(deps): Updated lock file --- pnpm-lock.yaml | 418 ++++++++++++++++++++++--------------------------- 1 file changed, 185 insertions(+), 233 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 15951780..9b68f95c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,93 +1,85 @@ lockfileVersion: 5.4 specifiers: - '@azure/data-tables': ^13.2.1 '@azure/identity': ^3.1.3 '@azure/storage-blob': ^12.12.0 - '@cloudflare/workers-types': ^4.20230115.0 + '@cloudflare/workers-types': ^4.20230214.0 '@planetscale/database': ^1.5.0 '@types/jsdom': ^21.1.0 '@types/mri': ^1.1.1 - '@types/node': ^18.11.19 - '@types/ws': ^8.5.4 + '@types/node': ^18.13.0 '@vitejs/plugin-vue': ^4.0.0 - '@vitest/coverage-c8': ^0.28.4 + '@vitest/coverage-c8': ^0.28.5 '@vue/compiler-sfc': ^3.2.47 anymatch: ^3.1.3 azurite: ^3.21.0 - c8: ^7.12.0 + c8: ^7.13.0 changelogen: ^0.4.1 chokidar: ^3.5.3 destr: ^1.2.2 - eslint: ^8.33.0 + eslint: ^8.34.0 eslint-config-unjs: ^0.1.0 - h3: ^1.1.0 - ioredis: ^5.3.0 - jiti: ^1.16.2 + h3: ^1.5.0 + ioredis: ^5.3.1 + jiti: ^1.17.0 jsdom: ^21.1.0 listhen: ^1.0.2 - lru-cache: ^7.14.1 - mkdir: ^0.0.2 - monaco-editor: ^0.34.1 + lru-cache: ^7.16.0 + monaco-editor: ^0.35.0 mri: ^1.2.0 - msw: ^1.0.0 - node-fetch-native: ^1.0.1 - ofetch: ^1.0.0 - prettier: ^2.8.3 + msw: ^1.0.1 + node-fetch-native: ^1.0.2 + ofetch: ^1.0.1 + prettier: ^2.8.4 types-cloudflare-worker: ^1.2.0 typescript: ^4.9.5 - ufo: ^1.0.1 + ufo: ^1.1.0 unbuild: ^1.1.1 vite: ^4.1.1 - vitest: ^0.28.4 + vitest: ^0.28.5 vue: ^3.2.47 - ws: ^8.12.0 dependencies: anymatch: 3.1.3 chokidar: 3.5.3 destr: 1.2.2 - h3: 1.1.0 - ioredis: 5.3.0 + h3: 1.5.0 + ioredis: 5.3.1 listhen: 1.0.2 - lru-cache: 7.14.1 - mkdir: 0.0.2 + lru-cache: 7.16.1 mri: 1.2.0 - node-fetch-native: 1.0.1 - ofetch: 1.0.0 - ufo: 1.0.1 - ws: 8.12.0 + node-fetch-native: 1.0.2 + ofetch: 1.0.1 + ufo: 1.1.0 optionalDependencies: - '@azure/data-tables': 13.2.1 '@azure/identity': 3.1.3 '@azure/storage-blob': 12.12.0 '@planetscale/database': 1.5.0 devDependencies: - '@cloudflare/workers-types': 4.20230115.0 + '@cloudflare/workers-types': 4.20230215.0 '@types/jsdom': 21.1.0 '@types/mri': 1.1.1 - '@types/node': 18.11.19 - '@types/ws': 8.5.4 + '@types/node': 18.14.0 '@vitejs/plugin-vue': 4.0.0_vite@4.1.1+vue@3.2.47 - '@vitest/coverage-c8': 0.28.4_jsdom@21.1.0 + '@vitest/coverage-c8': 0.28.5_jsdom@21.1.0 '@vue/compiler-sfc': 3.2.47 azurite: 3.21.0 - c8: 7.12.0 + c8: 7.13.0 changelogen: 0.4.1 - eslint: 8.33.0 - eslint-config-unjs: 0.1.0_4vsywjlpuriuw3tl5oq6zy5a64 - jiti: 1.16.2 + eslint: 8.34.0 + eslint-config-unjs: 0.1.0_7kw3g6rralp5ps6mg3uyzz6azm + jiti: 1.17.1 jsdom: 21.1.0 - monaco-editor: 0.34.1 - msw: 1.0.0_typescript@4.9.5 - prettier: 2.8.3 + monaco-editor: 0.35.0 + msw: 1.0.1_typescript@4.9.5 + prettier: 2.8.4 types-cloudflare-worker: 1.2.0 typescript: 4.9.5 unbuild: 1.1.1 - vite: 4.1.1_@types+node@18.11.19 - vitest: 0.28.4_jsdom@21.1.0 + vite: 4.1.1_@types+node@18.14.0 + vitest: 0.28.5_jsdom@21.1.0 vue: 3.2.47 packages: @@ -215,34 +207,6 @@ packages: '@azure/abort-controller': 1.1.0 tslib: 2.5.0 - /@azure/core-xml/1.3.2: - resolution: {integrity: sha512-0YROtnH4dCq3NZwPsPsaTfeH/7PZLMuhCaeb/HkFcaaERQ0OFR0DOMgpP698yeDTXnKAl3kZdw72tgVtTqD2xQ==} - engines: {node: '>=14.0.0'} - dependencies: - fast-xml-parser: 4.1.1 - tslib: 2.5.0 - dev: false - optional: true - - /@azure/data-tables/13.2.1: - resolution: {integrity: sha512-5pboUpSpxjTgZ499MxkLLR0i+lyUUwN6M5pTLZ2D4mUfKVz+vqiCijvxij0V0OfknMxVpQ+NrZcUdarw6a1Few==} - engines: {node: '>=14.0.0'} - requiresBuild: true - dependencies: - '@azure/core-auth': 1.4.0 - '@azure/core-client': 1.7.1 - '@azure/core-paging': 1.5.0 - '@azure/core-rest-pipeline': 1.10.1 - '@azure/core-tracing': 1.0.1 - '@azure/core-xml': 1.3.2 - '@azure/logger': 1.0.3 - tslib: 2.5.0 - uuid: 8.3.2 - transitivePeerDependencies: - - supports-color - dev: false - optional: true - /@azure/identity/2.1.0: resolution: {integrity: sha512-BPDz1sK7Ul9t0l9YKLEa8PHqWU4iCfhGJ+ELJl6c8CP3TpJt2urNCbm0ZHsthmxRsYoMPbz2Dvzj30zXZVmAFw==} engines: {node: '>=12.0.0'} @@ -583,8 +547,8 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@cloudflare/workers-types/4.20230115.0: - resolution: {integrity: sha512-GPJEiO8AFN+jUpA+DHJ1qdVmk4s/hq8JYKjOV/+U7avGquQbVnj905+Kg6uAEfrq16muwmRKl+XJGqsvlBlDNg==} + /@cloudflare/workers-types/4.20230215.0: + resolution: {integrity: sha512-s71gaGwtEIxjSu6l0cekbXm9AwjrmrFVcHPNx9tHidG2dnqamYf5Nms/KgMYZf7gnjdKOp/ZChYFeJJkNv3QfA==} dev: true /@colors/colors/1.5.0: @@ -1288,7 +1252,7 @@ packages: /@types/jsdom/21.1.0: resolution: {integrity: sha512-leWreJOdnuIxq9Y70tBVm/bvTuh31DSlF/r4l7Cfi4uhVQqLHD0Q4v301GMisEMwwbMgF7ZKxuZ+Jbd4NcdmRw==} dependencies: - '@types/node': 18.11.19 + '@types/node': 18.14.0 '@types/tough-cookie': 4.0.2 parse5: 7.1.2 dev: true @@ -1312,13 +1276,13 @@ packages: /@types/node-fetch/2.6.2: resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} dependencies: - '@types/node': 18.11.19 + '@types/node': 18.14.0 form-data: 3.0.1 dev: false optional: true - /@types/node/18.11.19: - resolution: {integrity: sha512-YUgMWAQBWLObABqrvx8qKO1enAvBUdjZOAWQ5grBAkp5LQv45jBvYKZ3oFS9iKRCQyFjqw6iuEa1vmFqtxYLZw==} + /@types/node/18.14.0: + resolution: {integrity: sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==} /@types/normalize-package-data/2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -1335,7 +1299,7 @@ packages: /@types/set-cookie-parser/2.4.2: resolution: {integrity: sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w==} dependencies: - '@types/node': 18.11.19 + '@types/node': 18.14.0 dev: true /@types/tough-cookie/4.0.2: @@ -1345,7 +1309,7 @@ packages: /@types/tunnel/0.0.3: resolution: {integrity: sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==} dependencies: - '@types/node': 18.11.19 + '@types/node': 18.14.0 dev: false optional: true @@ -1353,13 +1317,7 @@ packages: resolution: {integrity: sha512-YVtyAPqpefU+Mm/qqnOANW6IkqKpCSrarcyV269C8MA8Ux0dbkEuQwM/4CjL47kVEM2LgBef/ETfkH+c6+moFA==} dev: true - /@types/ws/8.5.4: - resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} - dependencies: - '@types/node': 18.11.19 - dev: true - - /@typescript-eslint/eslint-plugin/5.50.0_go4drrxstycfikanvu45pi4vgq: + /@typescript-eslint/eslint-plugin/5.50.0_z4w6sgucxc7wjocw543h5gv5dy: resolution: {integrity: sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1370,12 +1328,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.50.0_4vsywjlpuriuw3tl5oq6zy5a64 + '@typescript-eslint/parser': 5.50.0_7kw3g6rralp5ps6mg3uyzz6azm '@typescript-eslint/scope-manager': 5.50.0 - '@typescript-eslint/type-utils': 5.50.0_4vsywjlpuriuw3tl5oq6zy5a64 - '@typescript-eslint/utils': 5.50.0_4vsywjlpuriuw3tl5oq6zy5a64 + '@typescript-eslint/type-utils': 5.50.0_7kw3g6rralp5ps6mg3uyzz6azm + '@typescript-eslint/utils': 5.50.0_7kw3g6rralp5ps6mg3uyzz6azm debug: 4.3.4 - eslint: 8.33.0 + eslint: 8.34.0 grapheme-splitter: 1.0.4 ignore: 5.2.4 natural-compare-lite: 1.4.0 @@ -1387,7 +1345,7 @@ packages: - supports-color dev: true - /@typescript-eslint/parser/5.50.0_4vsywjlpuriuw3tl5oq6zy5a64: + /@typescript-eslint/parser/5.50.0_7kw3g6rralp5ps6mg3uyzz6azm: resolution: {integrity: sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1401,7 +1359,7 @@ packages: '@typescript-eslint/types': 5.50.0 '@typescript-eslint/typescript-estree': 5.50.0_typescript@4.9.5 debug: 4.3.4 - eslint: 8.33.0 + eslint: 8.34.0 typescript: 4.9.5 transitivePeerDependencies: - supports-color @@ -1415,7 +1373,7 @@ packages: '@typescript-eslint/visitor-keys': 5.50.0 dev: true - /@typescript-eslint/type-utils/5.50.0_4vsywjlpuriuw3tl5oq6zy5a64: + /@typescript-eslint/type-utils/5.50.0_7kw3g6rralp5ps6mg3uyzz6azm: resolution: {integrity: sha512-dcnXfZ6OGrNCO7E5UY/i0ktHb7Yx1fV6fnQGGrlnfDhilcs6n19eIRcvLBqx6OQkrPaFlDPk3OJ0WlzQfrV0bQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1426,9 +1384,9 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 5.50.0_typescript@4.9.5 - '@typescript-eslint/utils': 5.50.0_4vsywjlpuriuw3tl5oq6zy5a64 + '@typescript-eslint/utils': 5.50.0_7kw3g6rralp5ps6mg3uyzz6azm debug: 4.3.4 - eslint: 8.33.0 + eslint: 8.34.0 tsutils: 3.21.0_typescript@4.9.5 typescript: 4.9.5 transitivePeerDependencies: @@ -1461,7 +1419,7 @@ packages: - supports-color dev: true - /@typescript-eslint/utils/5.50.0_4vsywjlpuriuw3tl5oq6zy5a64: + /@typescript-eslint/utils/5.50.0_7kw3g6rralp5ps6mg3uyzz6azm: resolution: {integrity: sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1472,9 +1430,9 @@ packages: '@typescript-eslint/scope-manager': 5.50.0 '@typescript-eslint/types': 5.50.0 '@typescript-eslint/typescript-estree': 5.50.0_typescript@4.9.5 - eslint: 8.33.0 + eslint: 8.34.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.33.0 + eslint-utils: 3.0.0_eslint@8.34.0 semver: 7.3.8 transitivePeerDependencies: - supports-color @@ -1496,17 +1454,17 @@ packages: vite: ^4.0.0 vue: ^3.2.25 dependencies: - vite: 4.1.1_@types+node@18.11.19 + vite: 4.1.1_@types+node@18.14.0 vue: 3.2.47 dev: true - /@vitest/coverage-c8/0.28.4_jsdom@21.1.0: - resolution: {integrity: sha512-btelLBxaWhHnywXRQxDlrvPhGdnuIaD3XulsxcZRIcnpLPbFu39dNTT0IYu2QWP2ZZrV0AmNtdLIfD4c77zMAg==} + /@vitest/coverage-c8/0.28.5_jsdom@21.1.0: + resolution: {integrity: sha512-zCNyurjudoG0BAqAgknvlBhkV2V9ZwyYLWOAGtHSDhL/St49MJT+V2p1G0yPaoqBbKOTATVnP5H2p1XL15H75g==} dependencies: - c8: 7.12.0 + c8: 7.13.0 picocolors: 1.0.0 std-env: 3.3.2 - vitest: 0.28.4_jsdom@21.1.0 + vitest: 0.28.5_jsdom@21.1.0 transitivePeerDependencies: - '@edge-runtime/vm' - '@vitest/browser' @@ -1521,30 +1479,30 @@ packages: - terser dev: true - /@vitest/expect/0.28.4: - resolution: {integrity: sha512-JqK0NZ4brjvOSL8hXAnIsfi+jxDF7rH/ZWCGCt0FAqRnVFc1hXsfwXksQvEnKqD84avRt3gmeXoK4tNbmkoVsQ==} + /@vitest/expect/0.28.5: + resolution: {integrity: sha512-gqTZwoUTwepwGIatnw4UKpQfnoyV0Z9Czn9+Lo2/jLIt4/AXLTn+oVZxlQ7Ng8bzcNkR+3DqLJ08kNr8jRmdNQ==} dependencies: - '@vitest/spy': 0.28.4 - '@vitest/utils': 0.28.4 + '@vitest/spy': 0.28.5 + '@vitest/utils': 0.28.5 chai: 4.3.7 dev: true - /@vitest/runner/0.28.4: - resolution: {integrity: sha512-Q8UV6GjDvBSTfUoq0QXVCNpNOUrWu4P2qvRq7ssJWzn0+S0ojbVOxEjMt+8a32X6SdkhF8ak+2nkppsqV0JyNQ==} + /@vitest/runner/0.28.5: + resolution: {integrity: sha512-NKkHtLB+FGjpp5KmneQjTcPLWPTDfB7ie+MmF1PnUBf/tGe2OjGxWyB62ySYZ25EYp9krR5Bw0YPLS/VWh1QiA==} dependencies: - '@vitest/utils': 0.28.4 + '@vitest/utils': 0.28.5 p-limit: 4.0.0 pathe: 1.1.0 dev: true - /@vitest/spy/0.28.4: - resolution: {integrity: sha512-8WuhfXLlvCXpNXEGJW6Gc+IKWI32435fQJLh43u70HnZ1otJOa2Cmg2Wy2Aym47ZnNCP4NolF+8cUPwd0MigKQ==} + /@vitest/spy/0.28.5: + resolution: {integrity: sha512-7if6rsHQr9zbmvxN7h+gGh2L9eIIErgf8nSKYDlg07HHimCxp4H6I/X/DPXktVPPLQfiZ1Cw2cbDIx9fSqDjGw==} dependencies: tinyspy: 1.0.2 dev: true - /@vitest/utils/0.28.4: - resolution: {integrity: sha512-l2QztOLdc2LkR+w/lP52RGh8hW+Ul4KESmCAgVE8q737I7e7bQoAfkARKpkPJ4JQtGpwW4deqlj1732VZD7TFw==} + /@vitest/utils/0.28.5: + resolution: {integrity: sha512-UyZdYwdULlOa4LTUSwZ+Paz7nBHGTT72jKwdFSV4IjHF1xsokp+CabMdhjvVhYwkLfO88ylJT46YMilnkSARZA==} dependencies: cli-truncate: 3.1.0 diff: 5.1.0 @@ -2008,7 +1966,7 @@ packages: defu: 6.1.2 dotenv: 16.0.3 giget: 1.0.0 - jiti: 1.16.2 + jiti: 1.17.1 mlly: 1.1.0 pathe: 1.1.0 pkg-types: 1.0.1 @@ -2017,8 +1975,8 @@ packages: - supports-color dev: true - /c8/7.12.0: - resolution: {integrity: sha512-CtgQrHOkyxr5koX1wEUmN/5cfDa2ckbHRA4Gy5LAL0zaCFtVWJS5++n+w4/sr2GWGerBxgTjpKeDclk/Qk6W/A==} + /c8/7.13.0: + resolution: {integrity: sha512-/NL4hQTv1gBL6J6ei80zu3IiTrmePDKXKXOTLpHvcIWZTVYQlDhVWjjWvkhICylE8EwwnMVzDZugCvdx0/DIIA==} engines: {node: '>=10.12.0'} hasBin: true dependencies: @@ -2114,7 +2072,7 @@ packages: convert-gitmoji: 0.1.3 execa: 6.1.0 mri: 1.2.0 - node-fetch-native: 1.0.1 + node-fetch-native: 1.0.2 pkg-types: 1.0.1 scule: 1.0.0 semver: 7.3.8 @@ -2721,16 +2679,16 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier/8.6.0_eslint@8.33.0: + /eslint-config-prettier/8.6.0_eslint@8.34.0: resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.33.0 + eslint: 8.34.0 dev: true - /eslint-config-standard/17.0.0_xh3wrndcszbt2l7hdksdjqnjcq: + /eslint-config-standard/17.0.0_rwq7hzy2vtlwiajbw6pmw3rkzy: resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==} peerDependencies: eslint: ^8.0.1 @@ -2738,29 +2696,29 @@ packages: eslint-plugin-n: ^15.0.0 eslint-plugin-promise: ^6.0.0 dependencies: - eslint: 8.33.0 - eslint-plugin-import: 2.27.5_nowqz4jutkd4a233czbfk7jsgu - eslint-plugin-n: 15.6.1_eslint@8.33.0 - eslint-plugin-promise: 6.1.1_eslint@8.33.0 + eslint: 8.34.0 + eslint-plugin-import: 2.27.5_thoov6gpsgaugeikrxsdld6vdq + eslint-plugin-n: 15.6.1_eslint@8.34.0 + eslint-plugin-promise: 6.1.1_eslint@8.34.0 dev: true - /eslint-config-unjs/0.1.0_4vsywjlpuriuw3tl5oq6zy5a64: + /eslint-config-unjs/0.1.0_7kw3g6rralp5ps6mg3uyzz6azm: resolution: {integrity: sha512-P51/jQg3RoLKqDTR6/x5637iOBYIEka/Ec6TwaNKiLhSOeYBKRVPsg/FdbV8MBExC9q4j/wRoTYBKj7sEVNUgQ==} peerDependencies: eslint: '*' typescript: '*' dependencies: - '@typescript-eslint/eslint-plugin': 5.50.0_go4drrxstycfikanvu45pi4vgq - '@typescript-eslint/parser': 5.50.0_4vsywjlpuriuw3tl5oq6zy5a64 - eslint: 8.33.0 - eslint-config-prettier: 8.6.0_eslint@8.33.0 - eslint-config-standard: 17.0.0_xh3wrndcszbt2l7hdksdjqnjcq - eslint-import-resolver-typescript: 3.5.3_ohdts44xlqyeyrlje4qnefqeay - eslint-plugin-import: 2.27.5_nowqz4jutkd4a233czbfk7jsgu - eslint-plugin-n: 15.6.1_eslint@8.33.0 - eslint-plugin-node: 11.1.0_eslint@8.33.0 - eslint-plugin-promise: 6.1.1_eslint@8.33.0 - eslint-plugin-unicorn: 43.0.2_eslint@8.33.0 + '@typescript-eslint/eslint-plugin': 5.50.0_z4w6sgucxc7wjocw543h5gv5dy + '@typescript-eslint/parser': 5.50.0_7kw3g6rralp5ps6mg3uyzz6azm + eslint: 8.34.0 + eslint-config-prettier: 8.6.0_eslint@8.34.0 + eslint-config-standard: 17.0.0_rwq7hzy2vtlwiajbw6pmw3rkzy + eslint-import-resolver-typescript: 3.5.3_mvgyw3chnqkp6sgfmmtihyjpnm + eslint-plugin-import: 2.27.5_thoov6gpsgaugeikrxsdld6vdq + eslint-plugin-n: 15.6.1_eslint@8.34.0 + eslint-plugin-node: 11.1.0_eslint@8.34.0 + eslint-plugin-promise: 6.1.1_eslint@8.34.0 + eslint-plugin-unicorn: 43.0.2_eslint@8.34.0 typescript: 4.9.5 transitivePeerDependencies: - eslint-import-resolver-webpack @@ -2777,7 +2735,7 @@ packages: - supports-color dev: true - /eslint-import-resolver-typescript/3.5.3_ohdts44xlqyeyrlje4qnefqeay: + /eslint-import-resolver-typescript/3.5.3_mvgyw3chnqkp6sgfmmtihyjpnm: resolution: {integrity: sha512-njRcKYBc3isE42LaTcJNVANR3R99H9bAxBDMNDr2W7yq5gYPxbU3MkdhsQukxZ/Xg9C2vcyLlDsbKfRDg0QvCQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -2786,8 +2744,8 @@ packages: dependencies: debug: 4.3.4 enhanced-resolve: 5.12.0 - eslint: 8.33.0 - eslint-plugin-import: 2.27.5_nowqz4jutkd4a233czbfk7jsgu + eslint: 8.34.0 + eslint-plugin-import: 2.27.5_thoov6gpsgaugeikrxsdld6vdq get-tsconfig: 4.4.0 globby: 13.1.3 is-core-module: 2.11.0 @@ -2797,7 +2755,7 @@ packages: - supports-color dev: true - /eslint-module-utils/2.7.4_4lq3tljpmtdh3elqaianviuctu: + /eslint-module-utils/2.7.4_o2idtmtcztp76e4hucuvrnepoy: resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} engines: {node: '>=4'} peerDependencies: @@ -2818,38 +2776,38 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.50.0_4vsywjlpuriuw3tl5oq6zy5a64 + '@typescript-eslint/parser': 5.50.0_7kw3g6rralp5ps6mg3uyzz6azm debug: 3.2.7 - eslint: 8.33.0 + eslint: 8.34.0 eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.5.3_ohdts44xlqyeyrlje4qnefqeay + eslint-import-resolver-typescript: 3.5.3_mvgyw3chnqkp6sgfmmtihyjpnm transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-es/3.0.1_eslint@8.33.0: + /eslint-plugin-es/3.0.1_eslint@8.34.0: resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} engines: {node: '>=8.10.0'} peerDependencies: eslint: '>=4.19.1' dependencies: - eslint: 8.33.0 + eslint: 8.34.0 eslint-utils: 2.1.0 regexpp: 3.2.0 dev: true - /eslint-plugin-es/4.1.0_eslint@8.33.0: + /eslint-plugin-es/4.1.0_eslint@8.34.0: resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} engines: {node: '>=8.10.0'} peerDependencies: eslint: '>=4.19.1' dependencies: - eslint: 8.33.0 + eslint: 8.34.0 eslint-utils: 2.1.0 regexpp: 3.2.0 dev: true - /eslint-plugin-import/2.27.5_nowqz4jutkd4a233czbfk7jsgu: + /eslint-plugin-import/2.27.5_thoov6gpsgaugeikrxsdld6vdq: resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} engines: {node: '>=4'} peerDependencies: @@ -2859,15 +2817,15 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.50.0_4vsywjlpuriuw3tl5oq6zy5a64 + '@typescript-eslint/parser': 5.50.0_7kw3g6rralp5ps6mg3uyzz6azm array-includes: 3.1.6 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.33.0 + eslint: 8.34.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.7.4_4lq3tljpmtdh3elqaianviuctu + eslint-module-utils: 2.7.4_o2idtmtcztp76e4hucuvrnepoy has: 1.0.3 is-core-module: 2.11.0 is-glob: 4.0.3 @@ -2882,16 +2840,16 @@ packages: - supports-color dev: true - /eslint-plugin-n/15.6.1_eslint@8.33.0: + /eslint-plugin-n/15.6.1_eslint@8.34.0: resolution: {integrity: sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA==} engines: {node: '>=12.22.0'} peerDependencies: eslint: '>=7.0.0' dependencies: builtins: 5.0.1 - eslint: 8.33.0 - eslint-plugin-es: 4.1.0_eslint@8.33.0 - eslint-utils: 3.0.0_eslint@8.33.0 + eslint: 8.34.0 + eslint-plugin-es: 4.1.0_eslint@8.34.0 + eslint-utils: 3.0.0_eslint@8.34.0 ignore: 5.2.4 is-core-module: 2.11.0 minimatch: 3.1.2 @@ -2899,14 +2857,14 @@ packages: semver: 7.3.8 dev: true - /eslint-plugin-node/11.1.0_eslint@8.33.0: + /eslint-plugin-node/11.1.0_eslint@8.34.0: resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} engines: {node: '>=8.10.0'} peerDependencies: eslint: '>=5.16.0' dependencies: - eslint: 8.33.0 - eslint-plugin-es: 3.0.1_eslint@8.33.0 + eslint: 8.34.0 + eslint-plugin-es: 3.0.1_eslint@8.34.0 eslint-utils: 2.1.0 ignore: 5.2.4 minimatch: 3.1.2 @@ -2914,16 +2872,16 @@ packages: semver: 6.3.0 dev: true - /eslint-plugin-promise/6.1.1_eslint@8.33.0: + /eslint-plugin-promise/6.1.1_eslint@8.34.0: resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.33.0 + eslint: 8.34.0 dev: true - /eslint-plugin-unicorn/43.0.2_eslint@8.33.0: + /eslint-plugin-unicorn/43.0.2_eslint@8.34.0: resolution: {integrity: sha512-DtqZ5mf/GMlfWoz1abIjq5jZfaFuHzGBZYIeuJfEoKKGWRHr2JiJR+ea+BF7Wx2N1PPRoT/2fwgiK1NnmNE3Hg==} engines: {node: '>=14.18'} peerDependencies: @@ -2932,8 +2890,8 @@ packages: '@babel/helper-validator-identifier': 7.19.1 ci-info: 3.7.1 clean-regexp: 1.0.0 - eslint: 8.33.0 - eslint-utils: 3.0.0_eslint@8.33.0 + eslint: 8.34.0 + eslint-utils: 3.0.0_eslint@8.34.0 esquery: 1.4.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 @@ -2969,13 +2927,13 @@ packages: eslint-visitor-keys: 1.3.0 dev: true - /eslint-utils/3.0.0_eslint@8.33.0: + /eslint-utils/3.0.0_eslint@8.34.0: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' dependencies: - eslint: 8.33.0 + eslint: 8.34.0 eslint-visitor-keys: 2.1.0 dev: true @@ -2994,8 +2952,8 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint/8.33.0: - resolution: {integrity: sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==} + /eslint/8.34.0: + resolution: {integrity: sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: @@ -3010,7 +2968,7 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 - eslint-utils: 3.0.0_eslint@8.33.0 + eslint-utils: 3.0.0_eslint@8.34.0 eslint-visitor-keys: 3.3.0 espree: 9.4.1 esquery: 1.4.0 @@ -3200,14 +3158,6 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fast-xml-parser/4.1.1: - resolution: {integrity: sha512-4gAP5PvNyrqePBOIIcpaEeE+nKBry1n6qTQiJsE59sLP0OC+YwhU7/XVmLLEMexbiluFQX1yEYm82Pk9B7xEiw==} - hasBin: true - dependencies: - strnum: 1.0.5 - dev: false - optional: true - /fastq/1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: @@ -3461,7 +3411,7 @@ packages: defu: 6.1.2 https-proxy-agent: 5.0.1 mri: 1.2.0 - node-fetch-native: 1.0.1 + node-fetch-native: 1.0.2 pathe: 1.1.0 tar: 6.1.13 transitivePeerDependencies: @@ -3576,13 +3526,16 @@ packages: engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} dev: true - /h3/1.1.0: - resolution: {integrity: sha512-kx3u+RMzY963fU8NNT2ePWgsryAn9DNztPqbHia/M7HgA+rtXKjHjED9/uidcYPmImNwAfJsCachCzh2T3QH2A==} + /h3/1.5.0: + resolution: {integrity: sha512-M+T6P4iOB0ipkC/ZCdw2w8iTF7yY6phmkILOwlrtcPuVv+KW9BilOspYlvnblpKx1nnNl+3iBsZIvZ8pvKM8Nw==} dependencies: cookie-es: 0.5.0 + defu: 6.1.2 destr: 1.2.2 + iron-webcrypto: 0.5.0 radix3: 1.0.0 - ufo: 1.0.1 + ufo: 1.1.0 + uncrypto: 0.1.2 dev: false /has-bigints/1.0.2: @@ -3759,7 +3712,7 @@ packages: engines: {node: '>=12.0.0'} dependencies: ansi-escapes: 4.3.2 - chalk: 4.1.1 + chalk: 4.1.2 cli-cursor: 3.1.0 cli-width: 3.0.0 external-editor: 3.1.0 @@ -3784,8 +3737,8 @@ packages: side-channel: 1.0.4 dev: true - /ioredis/5.3.0: - resolution: {integrity: sha512-Id9jKHhsILuIZpHc61QkagfVdUj2Rag5GzG1TGEvRNeM7dtTOjICgjC+tvqYxi//PuX2wjQ+Xjva2ONBuf92Pw==} + /ioredis/5.3.1: + resolution: {integrity: sha512-C+IBcMysM6v52pTLItYMeV4Hz7uriGtoJdz7SSBDX6u+zwSYGirLdQh3L7t/OItWITcw3gTFMjJReYUwS4zihg==} engines: {node: '>=12.22.0'} dependencies: '@ioredis/commands': 1.2.0 @@ -3811,6 +3764,10 @@ packages: engines: {node: '>= 0.10'} dev: true + /iron-webcrypto/0.5.0: + resolution: {integrity: sha512-9m0tDUIo+GPwDYi1CNlAW3ToIFTS9y88lf41KsEwbBsL4PKNjhrNDGoA0WlB6WWaJ6pgp+FOP1+6ls0YftivyA==} + dev: false + /is-arguments/1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} @@ -4054,8 +4011,8 @@ packages: istanbul-lib-report: 3.0.0 dev: true - /jiti/1.16.2: - resolution: {integrity: sha512-OKBOVWmU3FxDt/UH4zSwiKPuc1nihFZiOD722FuJlngvLz2glX1v2/TJIgoA4+mrpnXxHV6dSAoCvPcYQtoG5A==} + /jiti/1.17.1: + resolution: {integrity: sha512-NZIITw8uZQFuzQimqjUxIrIcEdxYDFIe/0xYfIlVXTkiBjjyBEvgasj5bb0/cHtPRD/NziPbT312sFrkI5ALpw==} hasBin: true dev: true @@ -4261,7 +4218,7 @@ packages: http-shutdown: 1.2.2 ip-regex: 5.0.0 node-forge: 1.3.1 - ufo: 1.0.1 + ufo: 1.1.0 dev: false /local-pkg/0.4.3: @@ -4330,7 +4287,7 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} dependencies: - chalk: 4.1.1 + chalk: 4.1.2 is-unicode-supported: 0.1.0 dev: true @@ -4370,8 +4327,8 @@ packages: dependencies: yallist: 4.0.0 - /lru-cache/7.14.1: - resolution: {integrity: sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==} + /lru-cache/7.16.1: + resolution: {integrity: sha512-9kkuMZHnLH/8qXARvYSjNvq8S1GYFFzynQTAfKeaJ0sIrR3PUPuu37Z+EiIANiZBvpfTf2B5y8ecDLSMWlLv+w==} engines: {node: '>=12'} /magic-string/0.25.9: @@ -4491,11 +4448,6 @@ packages: yallist: 4.0.0 dev: true - /mkdir/0.0.2: - resolution: {integrity: sha512-98OnjcWaNEIRUJJe9rFoWlbkQ5n9z8F86wIPCrI961YEViiVybTuJln919WuuSHSnlrqXy0ELKCntoPy8C7lqg==} - engines: {node: '>=0.4.0'} - dev: false - /mkdirp/1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} @@ -4518,7 +4470,7 @@ packages: esbuild: 0.17.5 fs-extra: 11.1.0 globby: 13.1.3 - jiti: 1.16.2 + jiti: 1.17.1 mri: 1.2.0 pathe: 1.1.0 typescript: 4.9.5 @@ -4530,7 +4482,7 @@ packages: acorn: 8.8.2 pathe: 1.1.0 pkg-types: 1.0.1 - ufo: 1.0.1 + ufo: 1.1.0 dev: true /moment-timezone/0.5.40: @@ -4543,8 +4495,8 @@ packages: resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} dev: true - /monaco-editor/0.34.1: - resolution: {integrity: sha512-FKc80TyiMaruhJKKPz5SpJPIjL+dflGvz4CpuThaPMc94AyN7SeC9HQ8hrvaxX7EyHdJcUY5i4D0gNyJj1vSZQ==} + /monaco-editor/0.35.0: + resolution: {integrity: sha512-BJfkAZ0EJ7JgrgWzqjfBNP9hPSS8NlfECEDMEIIiozV2UaPq22yeuOjgbd3TwMh3anH0krWZirXZfn8KUSxiOA==} dev: true /morgan/1.10.0: @@ -4579,8 +4531,8 @@ packages: /ms/2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - /msw/1.0.0_typescript@4.9.5: - resolution: {integrity: sha512-8QVa1RAN/Nzbn/tKmtimJ+b2M1QZOMdETQW7/1TmBOZ4w+wJojfxuh1Hj5J4FYdBgZWW/TK4CABUOlOM4OjTOA==} + /msw/1.0.1_typescript@4.9.5: + resolution: {integrity: sha512-fBwQRCmf+jh0zlGlasBfpCaxLqb4QLMsY1Q+nkXkO0nnUYopl50NcNRvP4V+TAiqOwJSd0LrQ5NcJqwbrnTBqw==} engines: {node: '>=14'} hasBin: true requiresBuild: true @@ -4644,7 +4596,7 @@ packages: resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} engines: {node: '>=12.0.0'} dependencies: - lru-cache: 7.14.1 + lru-cache: 7.16.1 dev: true /nanoid/3.3.4: @@ -4674,8 +4626,8 @@ packages: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} dev: true - /node-fetch-native/1.0.1: - resolution: {integrity: sha512-VzW+TAk2wE4X9maiKMlT+GsPU4OMmR1U9CrHSmd3DFLn2IcZ9VJ6M6BBugGfYUnPCLSYxXdZy17M0BEJyhUTwg==} + /node-fetch-native/1.0.2: + resolution: {integrity: sha512-KIkvH1jl6b3O7es/0ShyCgWLcfXxlBrLBbP3rOr23WArC66IMcU4DeZEeYEOwnopYhawLTn7/y+YtmASe8DFVQ==} /node-fetch/2.6.9: resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} @@ -4756,12 +4708,12 @@ packages: es-abstract: 1.21.1 dev: true - /ofetch/1.0.0: - resolution: {integrity: sha512-d40aof8czZFSQKJa4+F7Ch3UC5D631cK1TTUoK+iNEut9NoiCL+u0vykl/puYVUS2df4tIQl5upQcolIcEzQjQ==} + /ofetch/1.0.1: + resolution: {integrity: sha512-icBz2JYfEpt+wZz1FRoGcrMigjNKjzvufE26m9+yUiacRQRHwnNlGRPiDnW4op7WX/MR6aniwS8xw8jyVelF2g==} dependencies: destr: 1.2.2 - node-fetch-native: 1.0.1 - ufo: 1.0.1 + node-fetch-native: 1.0.2 + ufo: 1.1.0 dev: false /on-finished/2.3.0: @@ -4845,7 +4797,7 @@ packages: engines: {node: '>=10'} dependencies: bl: 4.1.0 - chalk: 4.1.1 + chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.7.0 is-interactive: 1.0.0 @@ -5020,8 +4972,8 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier/2.8.3: - resolution: {integrity: sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==} + /prettier/2.8.4: + resolution: {integrity: sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==} engines: {node: '>=10.13.0'} hasBin: true dev: true @@ -5668,11 +5620,6 @@ packages: acorn: 8.8.2 dev: true - /strnum/1.0.5: - resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} - dev: false - optional: true - /supports-color/5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -5946,8 +5893,8 @@ packages: hasBin: true dev: true - /ufo/1.0.1: - resolution: {integrity: sha512-boAm74ubXHY7KJQZLlXrtMz52qFvpsbOxDcZOnw/Wf+LS4Mmyu7JxmzD4tDLtUQtmZECypJ0FrCz4QIe6dvKRA==} + /ufo/1.1.0: + resolution: {integrity: sha512-LQc2s/ZDMaCN3QLpa+uzHUOQ7SdV0qgv3VBXOolQGXTaaZpIur6PwUclF5nN2hNkiTRcUugXd1zFOW3FLJ135Q==} /unbox-primitive/1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} @@ -5974,7 +5921,7 @@ packages: esbuild: 0.16.17 globby: 13.1.3 hookable: 5.4.2 - jiti: 1.16.2 + jiti: 1.17.1 magic-string: 0.27.0 mkdirp: 1.0.4 mkdist: 1.1.1_typescript@4.9.5 @@ -5993,6 +5940,10 @@ packages: - supports-color dev: true + /uncrypto/0.1.2: + resolution: {integrity: sha512-kuZwRKV615lEw/Xx3Iz56FKk3nOeOVGaVmw0eg+x4Mne28lCotNFbBhDW7dEBCBKyKbRQiCadEZeNAFPVC5cgw==} + dev: false + /universalify/0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} @@ -6100,8 +6051,8 @@ packages: engines: {node: '>= 0.8'} dev: true - /vite-node/0.28.4_@types+node@18.11.19: - resolution: {integrity: sha512-KM0Q0uSG/xHHKOJvVHc5xDBabgt0l70y7/lWTR7Q0pR5/MrYxadT+y32cJOE65FfjGmJgxpVEEY+69btJgcXOQ==} + /vite-node/0.28.5_@types+node@18.14.0: + resolution: {integrity: sha512-LmXb9saMGlrMZbXTvOveJKwMTBTNUH66c8rJnQ0ZPNX+myPEol64+szRzXtV5ORb0Hb/91yq+/D3oERoyAt6LA==} engines: {node: '>=v14.16.0'} hasBin: true dependencies: @@ -6112,7 +6063,7 @@ packages: picocolors: 1.0.0 source-map: 0.6.1 source-map-support: 0.5.21 - vite: 4.1.1_@types+node@18.11.19 + vite: 4.1.1_@types+node@18.14.0 transitivePeerDependencies: - '@types/node' - less @@ -6123,7 +6074,7 @@ packages: - terser dev: true - /vite/4.1.1_@types+node@18.11.19: + /vite/4.1.1_@types+node@18.14.0: resolution: {integrity: sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -6148,7 +6099,7 @@ packages: terser: optional: true dependencies: - '@types/node': 18.11.19 + '@types/node': 18.14.0 esbuild: 0.16.17 postcss: 8.4.21 resolve: 1.22.1 @@ -6157,8 +6108,8 @@ packages: fsevents: 2.3.2 dev: true - /vitest/0.28.4_jsdom@21.1.0: - resolution: {integrity: sha512-sfWIy0AdlbyGRhunm+TLQEJrFH9XuRPdApfubsyLcDbCRrUX717BRQKInTgzEfyl2Ipi1HWoHB84Nqtcwxogcg==} + /vitest/0.28.5_jsdom@21.1.0: + resolution: {integrity: sha512-pyCQ+wcAOX7mKMcBNkzDwEHRGqQvHUl0XnoHR+3Pb1hytAHISgSxv9h0gUiSiYtISXUU3rMrKiKzFYDrI6ZIHA==} engines: {node: '>=v14.16.0'} hasBin: true peerDependencies: @@ -6181,11 +6132,11 @@ packages: dependencies: '@types/chai': 4.3.4 '@types/chai-subset': 1.3.3 - '@types/node': 18.11.19 - '@vitest/expect': 0.28.4 - '@vitest/runner': 0.28.4 - '@vitest/spy': 0.28.4 - '@vitest/utils': 0.28.4 + '@types/node': 18.14.0 + '@vitest/expect': 0.28.5 + '@vitest/runner': 0.28.5 + '@vitest/spy': 0.28.5 + '@vitest/utils': 0.28.5 acorn: 8.8.2 acorn-walk: 8.2.0 cac: 6.7.14 @@ -6201,8 +6152,8 @@ packages: tinybench: 2.3.1 tinypool: 0.3.1 tinyspy: 1.0.2 - vite: 4.1.1_@types+node@18.11.19 - vite-node: 0.28.4_@types+node@18.11.19 + vite: 4.1.1_@types+node@18.14.0 + vite-node: 0.28.5_@types+node@18.14.0 why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -6345,7 +6296,7 @@ packages: /wkx/0.5.0: resolution: {integrity: sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==} dependencies: - '@types/node': 18.11.19 + '@types/node': 18.14.0 dev: true /word-wrap/1.2.3: @@ -6377,6 +6328,7 @@ packages: optional: true utf-8-validate: optional: true + dev: true /xml-name-validator/4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} From 8472349b331ae302217ed0bf4b4b0967fa3aa427 Mon Sep 17 00:00:00 2001 From: Jan-Henrik Damaschke Date: Mon, 20 Feb 2023 22:28:05 +0100 Subject: [PATCH 14/18] Update src/drivers/azure-storage-blob.ts Co-authored-by: Daniel Roe --- src/drivers/azure-storage-blob.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/drivers/azure-storage-blob.ts b/src/drivers/azure-storage-blob.ts index 989b94f1..d1bbf818 100644 --- a/src/drivers/azure-storage-blob.ts +++ b/src/drivers/azure-storage-blob.ts @@ -106,7 +106,6 @@ export default defineDriver((opts: AzureStorageBlobOptions = {}) => { }, async removeItem(key) { await getContainerClient().getBlockBlobClient(key).delete(); - return; }, async getKeys() { const iterator = getContainerClient() From 3840e58ce88261f7c1db4fbadfd04dfcd3734ea0 Mon Sep 17 00:00:00 2001 From: Jan-Henrik Damaschke Date: Mon, 20 Feb 2023 22:28:12 +0100 Subject: [PATCH 15/18] Update src/drivers/azure-storage-blob.ts Co-authored-by: Daniel Roe --- src/drivers/azure-storage-blob.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/drivers/azure-storage-blob.ts b/src/drivers/azure-storage-blob.ts index d1bbf818..ff19bf8f 100644 --- a/src/drivers/azure-storage-blob.ts +++ b/src/drivers/azure-storage-blob.ts @@ -102,7 +102,6 @@ export default defineDriver((opts: AzureStorageBlobOptions = {}) => { await getContainerClient() .getBlockBlobClient(key) .upload(value, Buffer.byteLength(value)); - return; }, async removeItem(key) { await getContainerClient().getBlockBlobClient(key).delete(); From e944590464052cb39210356f586150c66da299d2 Mon Sep 17 00:00:00 2001 From: Jan-Henrik Damaschke Date: Mon, 20 Feb 2023 22:28:19 +0100 Subject: [PATCH 16/18] Update src/drivers/azure-storage-blob.ts Co-authored-by: Daniel Roe --- src/drivers/azure-storage-blob.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/drivers/azure-storage-blob.ts b/src/drivers/azure-storage-blob.ts index ff19bf8f..ac6b59d9 100644 --- a/src/drivers/azure-storage-blob.ts +++ b/src/drivers/azure-storage-blob.ts @@ -142,7 +142,6 @@ export default defineDriver((opts: AzureStorageBlobOptions = {}) => { ) ); } - return; }, }; }); From 25b37381bd268688bc160b8af02c5db53c2a15d1 Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Mon, 27 Feb 2023 17:26:13 +0100 Subject: [PATCH 17/18] updates --- package.json | 1 - src/drivers/azure-storage-blob.ts | 91 ++++++++++++------------- test/drivers/azure-storage-blob.test.ts | 6 +- 3 files changed, 47 insertions(+), 51 deletions(-) diff --git a/package.json b/package.json index 4529de1d..5d9b6f44 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,6 @@ "drivers" ], "scripts": { - "azurite-blob-storage": "azurite-blob --silent", "build": "unbuild", "demo": "vite demo", "dev": "vitest", diff --git a/src/drivers/azure-storage-blob.ts b/src/drivers/azure-storage-blob.ts index ac6b59d9..bbcc201e 100644 --- a/src/drivers/azure-storage-blob.ts +++ b/src/drivers/azure-storage-blob.ts @@ -9,75 +9,72 @@ import { DefaultAzureCredential } from "@azure/identity"; export interface AzureStorageBlobOptions { /** * The name of the Azure Storage account. - * @default null */ - accountName?: string; + accountName: string; + /** * The name of the storage container. All entities will be stored in the same container. - * @default 'unstorage' + * @default "unstorage" */ containerName?: string; + /** * The account key. If provided, the SAS key will be ignored. Only available in Node.js runtime. - * @default null */ accountKey?: string; + /** * The SAS key. If provided, the account key will be ignored. - * @default null */ sasKey?: string; + /** * The connection string. If provided, the account key and SAS key will be ignored. Only available in Node.js runtime. - * @default null */ connectionString?: string; } -export default defineDriver((opts: AzureStorageBlobOptions = {}) => { - const { - accountName = null, - containerName = "unstorage", - accountKey = null, - sasKey = null, - connectionString = null, - } = opts; - if (!accountName) - throw new Error( - "Account name is required to use the Azure Storage Blob driver." - ); - +export default defineDriver((opts: AzureStorageBlobOptions) => { let containerClient: ContainerClient; const getContainerClient = () => { - if (!containerClient) { - let serviceClient: BlobServiceClient; - if (accountKey) { - // StorageSharedKeyCredential is only available in Node.js runtime, not in browsers - const credential = new StorageSharedKeyCredential( - accountName, - accountKey - ); - serviceClient = new BlobServiceClient( - `https://${accountName}.blob.core.windows.net`, - credential - ); - } else if (sasKey) { - serviceClient = new BlobServiceClient( - `https://${accountName}.blob.core.windows.net${sasKey}` - ); - } else if (connectionString) { - // fromConnectionString is only available in Node.js runtime, not in browsers - serviceClient = - BlobServiceClient.fromConnectionString(connectionString); - } else { - const credential = new DefaultAzureCredential(); - serviceClient = new BlobServiceClient( - `https://${accountName}.blob.core.windows.net`, - credential - ); - } - containerClient = serviceClient.getContainerClient(containerName); + if (containerClient) { + return containerClient; } + if (!opts.accountName) { + throw new Error( + "Account name is required to use the Azure Storage Blob driver." + ); + } + let serviceClient: BlobServiceClient; + if (opts.accountKey) { + // StorageSharedKeyCredential is only available in Node.js runtime, not in browsers + const credential = new StorageSharedKeyCredential( + opts.accountName, + opts.accountKey + ); + serviceClient = new BlobServiceClient( + `https://${opts.accountName}.blob.core.windows.net`, + credential + ); + } else if (opts.sasKey) { + serviceClient = new BlobServiceClient( + `https://${opts.accountName}.blob.core.windows.net${opts.sasKey}` + ); + } else if (opts.connectionString) { + // fromConnectionString is only available in Node.js runtime, not in browsers + serviceClient = BlobServiceClient.fromConnectionString( + opts.connectionString + ); + } else { + const credential = new DefaultAzureCredential(); + serviceClient = new BlobServiceClient( + `https://${opts.accountName}.blob.core.windows.net`, + credential + ); + } + containerClient = serviceClient.getContainerClient( + opts.containerName || "unstorage" + ); return containerClient; }; diff --git a/test/drivers/azure-storage-blob.test.ts b/test/drivers/azure-storage-blob.test.ts index f5cb6d60..dc920792 100644 --- a/test/drivers/azure-storage-blob.test.ts +++ b/test/drivers/azure-storage-blob.test.ts @@ -5,9 +5,9 @@ import { BlobServiceClient } from "@azure/storage-blob"; import { ChildProcess, exec } from "child_process"; describe("drivers: azure-storage-blob", () => { - let azuriteProcess: ChildProcess; + // let azuriteProcess: ChildProcess; beforeAll(async () => { - azuriteProcess = exec("npm run azurite-blob-storage"); + // azuriteProcess = exec("npm run azurite-blob-storage"); const client = BlobServiceClient.fromConnectionString( "UseDevelopmentStorage=true" ); @@ -21,6 +21,6 @@ describe("drivers: azure-storage-blob", () => { }), }); afterAll(() => { - azuriteProcess.kill(9); + // azuriteProcess.kill(9); }); }); From 3f153ed98ea0d3d41039e76c3cfa23465eb52caa Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Mon, 27 Feb 2023 17:28:34 +0100 Subject: [PATCH 18/18] enable back process --- test/drivers/azure-storage-blob.test.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/drivers/azure-storage-blob.test.ts b/test/drivers/azure-storage-blob.test.ts index dc920792..c04fce52 100644 --- a/test/drivers/azure-storage-blob.test.ts +++ b/test/drivers/azure-storage-blob.test.ts @@ -5,22 +5,22 @@ import { BlobServiceClient } from "@azure/storage-blob"; import { ChildProcess, exec } from "child_process"; describe("drivers: azure-storage-blob", () => { - // let azuriteProcess: ChildProcess; + let azuriteProcess: ChildProcess; beforeAll(async () => { - // azuriteProcess = exec("npm run azurite-blob-storage"); + azuriteProcess = exec("npx azurite-blob --silent"); const client = BlobServiceClient.fromConnectionString( "UseDevelopmentStorage=true" ); const containerClient = client.getContainerClient("unstorage"); await containerClient.createIfNotExists(); }); + afterAll(() => { + azuriteProcess.kill(9); + }); testDriver({ driver: driver({ connectionString: "UseDevelopmentStorage=true", accountName: "local", }), }); - afterAll(() => { - // azuriteProcess.kill(9); - }); });