diff --git a/changelog.md b/changelog.md index 2a30a17..3e09bc0 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,13 @@ # Changelog +## 2025-08-18 - 3.3.10 - fix(helpers) +Normalize and robustly parse S3 endpoint configuration; use normalized descriptor in SmartBucket and update dev tooling + +- Add normalizeS3Descriptor to ts/helpers.ts: robust endpoint parsing, coercion of useSsl/port, sanitization, warnings for dropped URL parts, and canonical endpoint URL output. +- Update SmartBucket (ts/classes.smartbucket.ts) to use the normalized endpoint, region, credentials and forcePathStyle from normalizeS3Descriptor. +- Adjust dev tooling: bump @git.zone/tsbuild -> ^2.6.7, @git.zone/tstest -> ^2.3.4, @push.rocks/qenv -> ^6.1.3 and update test script to run tstest with --verbose --logfile --timeout 60. +- Add .claude/settings.local.json containing local assistant/CI permission settings (local config only). + ## 2025-08-15 - 3.3.9 - fix(docs) Revise README with detailed usage examples and add local Claude settings diff --git a/package.json b/package.json index fdf604e..26f11a2 100644 --- a/package.json +++ b/package.json @@ -8,14 +8,14 @@ "author": "Task Venture Capital GmbH", "license": "MIT", "scripts": { - "test": "(tstest test/)", + "test": "(tstest test/ --verbose --logfile --timeout 60)", "build": "(tsbuild --web --allowimplicitany)" }, "devDependencies": { - "@git.zone/tsbuild": "^2.6.4", + "@git.zone/tsbuild": "^2.6.7", "@git.zone/tsrun": "^1.2.49", - "@git.zone/tstest": "^2.3.2", - "@push.rocks/qenv": "^6.1.2", + "@git.zone/tstest": "^2.3.4", + "@push.rocks/qenv": "^6.1.3", "@push.rocks/tapbundle": "^6.0.3" }, "dependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a7d1cf4..32cd4bc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -37,17 +37,17 @@ importers: version: 9.2.0 devDependencies: '@git.zone/tsbuild': - specifier: ^2.6.4 - version: 2.6.4 + specifier: ^2.6.7 + version: 2.6.7 '@git.zone/tsrun': specifier: ^1.2.49 version: 1.3.3 '@git.zone/tstest': - specifier: ^2.3.2 - version: 2.3.2(@aws-sdk/credential-providers@3.864.0)(socks@2.8.7)(typescript@5.8.3) + specifier: ^2.3.4 + version: 2.3.4(@aws-sdk/credential-providers@3.864.0)(socks@2.8.7)(typescript@5.9.2) '@push.rocks/qenv': - specifier: ^6.1.2 - version: 6.1.2 + specifier: ^6.1.3 + version: 6.1.3 '@push.rocks/tapbundle': specifier: ^6.0.3 version: 6.0.3(@aws-sdk/credential-providers@3.864.0)(socks@2.8.7) @@ -63,8 +63,8 @@ packages: '@api.global/typedrequest@3.1.10': resolution: {integrity: sha512-EiCp44XVcMjBvEs4oM1nMUaeY4ySU0Pzt3+mDwVG5DNP6EV87Nwancbr2jKScvaFNel9eeDgGtgEnFBKjOnApA==} - '@api.global/typedserver@3.0.74': - resolution: {integrity: sha512-lrXaCPaVZLihlF9w39pEqTw2kiHFCheRKTZuK07S7gTGyfdXKPmccVR/EK4ox58E1gjh9A2K8yY8ZWGcjuSJkw==} + '@api.global/typedserver@3.0.77': + resolution: {integrity: sha512-ikFR2dQcH5ErrUCAXxw6YDyfPtMyaB1sALtkA0QBCKVttoidMb8C/quQhCfzfhJxaVFGwBSCvlgQhUDR2N/zUQ==} '@api.global/typedsocket@3.0.1': resolution: {integrity: sha512-xojiAVNXtHoxkpBo8U2HHJG8FrVXXuLvDNndSHXwx4C9VslUwDn5zSCI+PdBl8iAg+ZuBmKjqkpZZ9sL6DC5yQ==} @@ -244,8 +244,11 @@ packages: resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} engines: {node: '>=6.9.0'} - '@cloudflare/workers-types@4.20250813.0': - resolution: {integrity: sha512-RFFjomDndGR+p7ug1HWDlW21qOJyRZbmI99dUtuR9tmwJbSZhUUnSFmzok9lBYVfkMMrO1O5vmB+IlgiecgLEA==} + '@borewit/text-codec@0.1.1': + resolution: {integrity: sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==} + + '@cloudflare/workers-types@4.20250816.0': + resolution: {integrity: sha512-R9ADrrINo1CqTwCddH39Tjlsc3grim6KeO7l8yddNbldH3uTkaAXYCzO0WiyLG7irLzLDrZVc4tLhN6BO3tdFw==} '@colors/colors@1.6.0': resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} @@ -578,24 +581,24 @@ packages: '@esm-bundle/chai@4.3.4-fix.0': resolution: {integrity: sha512-26SKdM4uvDWlY8/OOOxSB1AqQWeBosCX3wRYUZO7enTAj03CtVxIiCimYVG2WpULcyV51qapK4qTovwkUr5Mlw==} - '@git.zone/tsbuild@2.6.4': - resolution: {integrity: sha512-eeNW5hnXHU9lPzTaMbtdYDkb6cpFFC8fF5849BiwLO4N1Ga9Q5Om/6w5SZyJQcct8rHjcTgOOWdlxhjeKCr6NQ==} + '@git.zone/tsbuild@2.6.7': + resolution: {integrity: sha512-nLRYk1V4gxdEAp5mbLYNdr/in9mFA26L4MPKBKqzASID4lXSYya5sDbLRdDTv+mD0ZRBgdn6e+WMylA0SU4hSw==} hasBin: true '@git.zone/tsbundle@2.5.1': resolution: {integrity: sha512-gBskgM3ECy9FEmhCWnQahDyFCAjjw/7emjx/KYM/FOlPqGV+hmYzt368zwSlkzOGgYF8k9OZ+mp6vexDL/+f2w==} hasBin: true - '@git.zone/tspublish@1.10.1': - resolution: {integrity: sha512-6SisDU25m9+FDmrjd/93b7pDRhIU1svmrD42cNLL1IVt29XcD4BudpXlOXd/peuSAJLxFvE2krxOyWMU6WUHKw==} + '@git.zone/tspublish@1.10.3': + resolution: {integrity: sha512-o2/jvNsdLC8SRdH1kQ7JjNOQNu9el0FpJ/QOW3mgiC5C9reuTp18iU4kijsVVLgvw4KZv6Z289SoKPh3HPsS0g==} hasBin: true '@git.zone/tsrun@1.3.3': resolution: {integrity: sha512-DDzWunkxXLtXJTxBf4EioXLwhuqdA2VzdTmOzWrw4Z4Qnms/YM67q36yajwNohAajPYyRz5DayU0ikrceFXyVw==} hasBin: true - '@git.zone/tstest@2.3.2': - resolution: {integrity: sha512-FwWU2yt8UBfua7JZD0Q7mUtzioOE8PQTeA6U6qhhuwjgaQq8bYm8RcwbDZD5wLQAXaniJ5SVfJcDJsyCNDjmUg==} + '@git.zone/tstest@2.3.4': + resolution: {integrity: sha512-14r6Z59Ajy2L/uIR+wgzqF3Ax9o4s+il7j53g6ATgRjjkGhib7rof+tcvdqxwgmxi0yOZ+2AEvJJWaeuf9UGZw==} hasBin: true '@hapi/bourne@3.0.0': @@ -770,11 +773,11 @@ packages: '@push.rocks/mongodump@1.0.8': resolution: {integrity: sha512-oDufyjNBg8I50OaJvbHhc0RnRpJQ544dr9her0G6sA8JmI3hD2/amTdcPLVIX1kzYf5GsTUKeWuRaZgdNqz3ew==} - '@push.rocks/qenv@6.1.2': - resolution: {integrity: sha512-epb5Ey7E3jVCjxvNmQ5bcjPs9+7d1z/5bV/V8+qwrPqZrbgXnslOnsQWOh9usAatO0VJqqZmSvLYSpjnm3NEcA==} + '@push.rocks/qenv@6.1.3': + resolution: {integrity: sha512-+z2hsAU/7CIgpYLFqvda8cn9rUBMHqLdQLjsFfRn5jPoD7dJ5rFlpkbhfM4Ws8mHMniwWaxGKo+q/YBhtzRBLg==} - '@push.rocks/smartarchive@3.0.8': - resolution: {integrity: sha512-1jPmR0b7hXmjYQoRiTlRXrIbZcdcFmSdGOfznufjcDpGPe86Km0d8TBnzqghTx4dTihzKC67IxAaz/DM3lvxpA==} + '@push.rocks/smartarchive@4.2.2': + resolution: {integrity: sha512-6EpqbKU32D6Gcqsc9+Tn1dOCU5HoTlrqqs/7IdUr9Tirp9Ngtptkapca1Fw/D0kVJ7SSw3kG/miAYnuPMZLEoA==} '@push.rocks/smartbrowser@2.0.8': resolution: {integrity: sha512-0KWRZj3TuKo/sNwgPbiSE6WL+TMeR19t1JmXBZWh9n8iA2mpc4HhMrQAndEUdRCkx5ofSaHWojIRVFzGChj0Dg==} @@ -824,15 +827,15 @@ packages: '@push.rocks/smartfile-interfaces@1.0.7': resolution: {integrity: sha512-MeOl/200UOvSO4Pgq/DVFiBVZpL9gjOBQM+4XYNjSxda8c6VBvchHAntaFLQUlO8U1ckNaP9i+nMO4O4/0ymyw==} - '@push.rocks/smartfile@10.0.41': - resolution: {integrity: sha512-xOOy0duI34M2qrJZggpk51EHGXmg9+mBL1Q55tNiQKXzfx89P3coY1EAZG8tvmep3qB712QEKe7T+u04t42Kjg==} - '@push.rocks/smartfile@11.0.21': resolution: {integrity: sha512-ZtF8QPGeR/2MJxtHgJY1+FLrOZ+GTLWqwyDz7Woq1x+K9nb4almA1OpdW5IQPBK3ECHur0ghg5bzzKMuR5ZSzg==} '@push.rocks/smartfile@11.2.5': resolution: {integrity: sha512-Szmv0dFvDZBLsAOC2kJ0r0J0vZM0zqMAXT1G8XH11maU8pNYtYC1vceTpxoZGy4qbJcko7oGpgNUAlY+8LN3HA==} + '@push.rocks/smartfile@11.2.7': + resolution: {integrity: sha512-8Yp7/sAgPpWJBHohV92ogHWKzRomI5MEbSG6b5W2n18tqwfAmjMed0rQvsvGrSBlnEWCKgoOrYIIZbLO61+J0Q==} + '@push.rocks/smartguard@3.1.0': resolution: {integrity: sha512-J23q84f1O+TwFGmd4lrO9XLHUh2DaLXo9PN/9VmTWYzTkQDv5JehmifXVI0esophXcCIfbdIu6hbt7/aHlDF4A==} @@ -866,9 +869,6 @@ packages: '@push.rocks/smartmatch@2.0.0': resolution: {integrity: sha512-MBzP++1yNIBeox71X6VxpIgZ8m4bXnJpZJ4nWVH6IWpmO38MXTu4X0QF8tQnyT4LFcwvc9iiWaD15cstHa7Mmw==} - '@push.rocks/smartmime@1.0.6': - resolution: {integrity: sha512-PHd+I4UcsnOATNg8wjDsSAmmJ4CwQFrQCNzd0HSJMs4ZpiK3Ya91almd6GLpDPU370U4HFh4FaPF4eEAI6vkJQ==} - '@push.rocks/smartmime@2.0.4': resolution: {integrity: sha512-mG6lRBLr5nF+GLZmgCcdjhdDsmTtJWBFZDCa1eJ8Au9TvUzbPW0fY5aqJBb3UwfyZzH6St8Th9cJSXjagOQkYA==} @@ -878,8 +878,8 @@ packages: '@push.rocks/smartnetwork@4.1.2': resolution: {integrity: sha512-TjucG72ooHgzAUpNu2LAv4iFoettmZq2aEWhhzIa7AKcOvt4yxsk3Vl73guhKRohTfhdRauPcH5OHISLUHJbYA==} - '@push.rocks/smartnpm@2.0.4': - resolution: {integrity: sha512-ljRPqnUsXzL5qnuAEt5POy0NnfKs7eYPuuJPJjYiK9VUdP/CyF4h14qTB4H816vNEuF7VU/ASRtz0qDlXmrztg==} + '@push.rocks/smartnpm@2.0.6': + resolution: {integrity: sha512-7anKDOjX6gXWs1IAc+YWz9ZZ8gDsTwaLh+CxRnGHjAawOmK788NrrgVCg2Fb3qojrPnoxecc46F8Ivp1BT7Izw==} '@push.rocks/smartntml@2.0.8': resolution: {integrity: sha512-LIYeOQbmav2m2kZQz4pGS74xvWAm4YAGQnbPkofA2oas4RW9SGR1JTRpFd9pxGCOXd6djYdNGsZZ/xz+k/vRPQ==} @@ -914,8 +914,8 @@ packages: '@push.rocks/smartrequest@2.1.0': resolution: {integrity: sha512-3eHLTRInHA+u+W98TqJwgTES7rRimBAsJC4JxVNQC3UUezmblAhM5/TIQsEBQTsbjAY8SeQKy6NHzW6iTiaD8w==} - '@push.rocks/smartrequest@4.2.1': - resolution: {integrity: sha512-33sxhXMOwDx2tv98LlyxDxI/UTjw16BOSWbnqrdUdNby/sSP3ahW3NF4JMOU5xKNQUz7TjLgREj9dPuumEgQ/g==} + '@push.rocks/smartrequest@4.2.2': + resolution: {integrity: sha512-OMtSyxvuOw04nRR/97yAF3XLe42QDyuwStQMo2bXrVvXgcriNyn0JFavl0IL5hY6Gb+dyCWgOAUwX7cVZ4DzZg==} '@push.rocks/smartrouter@1.3.3': resolution: {integrity: sha512-1+xZEnWlhzqLWAaJ1zFNhQ0zgbfCWQl1DBT72LygLxTs+P0K8AwJKgqo/IX6CT55kGCFnPAZIYSbVJlGsgrB0w==} @@ -926,12 +926,18 @@ packages: '@push.rocks/smarts3@2.2.5': resolution: {integrity: sha512-OZjD0jBCUTJCLnwraxBcyZ3he5buXf2OEM1zipiTBChA2EcKUZWKk/a6KR5WT+NlFCIIuB23UG+U+cxsIWM91Q==} + '@push.rocks/smarts3@2.2.6': + resolution: {integrity: sha512-f2i2keHs+KZr5cyB8nBOnmRGiE2YG42W4pSx+8gmZEsf8yZUT1iUnuD/YZVTKosH2v5dPCKdmtSpMSux8Q/tCw==} + '@push.rocks/smartshell@3.0.6': resolution: {integrity: sha512-j3SgNyq1K3i7NVk5a2+5QkG/9ac30eC3OsOAMXVxOczYceMXRiXIr9yow3t/+na14/zSYd8He2N0vYPtYqKeSQ==} '@push.rocks/smartshell@3.2.3': resolution: {integrity: sha512-BWA/DH1H9lG7Er23d4uYgirfYaya5dX4g/WpWm2la7mOzuL9o2FnPIhel52DQUKIh7ty3Ql305ApV8YaAb4+/w==} + '@push.rocks/smartshell@3.3.0': + resolution: {integrity: sha512-m0w618H6YBs+vXGz1CgS4nPi5CUAnqRtckcS9/koGwfcIx1IpjqmiP47BoCTbdgcv0IPUxQVBG1IXTHPuZ8Z5g==} + '@push.rocks/smartsitemap@2.0.3': resolution: {integrity: sha512-jIcms8V1b2mt3dS4PKNlLR1DRC8pCDWMRVbnyM/2+snZOJZonQRlQzAyX8No0EfLbfdrfnxv2IjPX13X29Re6g==} @@ -941,11 +947,8 @@ packages: '@push.rocks/smartspawn@3.0.3': resolution: {integrity: sha512-DyrGPV69wwOiJgKkyruk5hS3UEGZ99xFAqBE9O2nM8VXCRLbbty3xt1Ug5Z092ZZmJYaaGMSnMw3ijyZJFCT0Q==} - '@push.rocks/smartstate@2.0.25': - resolution: {integrity: sha512-gWmbDCx5esezHDQnD2nOClxeTiWtvU1wEdP0XbheCcXzaGEv0H8apRjQBksRZJd9FC3ezrJU00GLh0eH9rPyMQ==} - - '@push.rocks/smartstream@2.0.8': - resolution: {integrity: sha512-GlF/9cCkvBHwKa3DK4DO5wjfSgqkj6gAS4TrY9uD5NMHu9RQv4WiNrElTYj7iCEpnZgUnLO3tzw1JA3NRIMnnA==} + '@push.rocks/smartstate@2.0.26': + resolution: {integrity: sha512-lMcf0ZWWs9jej9wjapuonuIZiQNiD9NcAcvRDFXq7GtQf/HUyr6zr5K1XxGZaCIGyYrbYnBHBpNU+8DBoarHrA==} '@push.rocks/smartstream@3.2.5': resolution: {integrity: sha512-PLGGIFDy8JLNVUnnntMSIYN4W081YSbNC7Y/sWpvUT8PAXtbEXXUiDFgK5o3gcI0ptpKQxHAwxhzNlPj0sbFVg==} @@ -1467,6 +1470,10 @@ packages: '@tempfix/idb@8.0.3': resolution: {integrity: sha512-hPJQKO7+oAIY+pDNImrZ9QAINbz9KmwT+yO4iRVwdPanok2YKpaUxdJzIvCUwY0YgAawlvYdffbLvRLV5hbs2g==} + '@tokenizer/inflate@0.2.7': + resolution: {integrity: sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==} + engines: {node: '>=18'} + '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} @@ -1479,9 +1486,6 @@ packages: '@tsclass/tsclass@4.4.4': resolution: {integrity: sha512-YZOAF+u+r4u5rCev2uUd1KBTBdfyFdtDmcv4wuN+864lMccbdfRICR3SlJwCfYS1lbeV3QNLYGD30wjRXgvCJA==} - '@tsclass/tsclass@8.2.1': - resolution: {integrity: sha512-bRDCfJTipsTcK6eEokWdsOR1mGCQFeM7zTg6PRHzbxTWQcWQD9AhEr2q3CrPcmAbvIS7fvkO6/pU/mPm1MZxhQ==} - '@tsclass/tsclass@9.2.0': resolution: {integrity: sha512-A6ULEkQfYgOnCKQVQRt26O7PRzFo4PE2EoD25RAtnuFuVrNwGynYC20Vee2c8KAOyI7nQ/LaREki9KAX4AHOHQ==} @@ -1552,9 +1556,6 @@ packages: resolution: {integrity: sha512-vsxcbfLDdjytnCnHXtinE40Xl46Wr7l/VGRGt7ewJwCPMKEHOdEsTxXX8xwgoR7cbc+6dE8SB4jlMrOV2zAg7g==} deprecated: This is a stub types definition. fast-json-stable-stringify provides its own type definitions, so you do not need this installed. - '@types/from2@2.3.5': - resolution: {integrity: sha512-giavnjf3kNlJnE+HpZA1CQ3UKHxgehzsTuIMGda8pGMbOiLYGVNADEskey44OZcADHm/HOoBany8IV+0x28XFw==} - '@types/fs-extra@11.0.4': resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} @@ -1567,9 +1568,6 @@ packages: '@types/glob@8.1.0': resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} - '@types/gunzip-maybe@1.4.2': - resolution: {integrity: sha512-2uqXZg1jTCKE1Pjbab8qb74+f2+i9h/jz8rQ+jRR+zaNJF75zWwrpbX8/TjF4m56m3KFOg9umHdCJ074KwiVxg==} - '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -1688,8 +1686,8 @@ packages: '@types/symbol-tree@3.2.5': resolution: {integrity: sha512-zXnnyENt1TYQcS21MkPaJCVjfcPq7p7yc5mo5JACuumXp6sly5jnlS0IokHd+xmmuCbx6V7JqkMBpswR+nZAcw==} - '@types/tar-stream@2.2.3': - resolution: {integrity: sha512-if3mugZfjVkXOMZdFjIHySxY13r6GXPpyOlsDmLffvyI7tLz9wXE8BFjNivXsvUeyJ1KNlOpfLnag+ISmxgxPw==} + '@types/tar-stream@3.1.4': + resolution: {integrity: sha512-921gW0+g29mCJX0fRvqeHzBlE/XclDaAG0Ousy1LCghsOhvaKacDeRGEVzQP9IPfKn8Vysy7FEXAIxycpc/CMg==} '@types/through2@2.0.41': resolution: {integrity: sha512-ryQ0tidWkb1O1JuYvWKyMLYEtOWDqF5mHerJzKz/gQpoAaJq2l/dsMPBF0B5BNVT34rbARYJ5/tsZwLfUi2kwQ==} @@ -1824,9 +1822,6 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - array-flatten@1.1.1: - resolution: {integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=} - array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -1902,10 +1897,6 @@ packages: resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} - body-parser@1.20.3: - resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - body-parser@2.2.0: resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} engines: {node: '>=18'} @@ -1926,9 +1917,6 @@ packages: broadcast-channel@7.1.0: resolution: {integrity: sha512-InJljddsYWbEL8LBnopnCg+qMQp9KcowvYWOt4YWrjD5HmxzDYKdVbDS1w/ji5rFZdRD58V5UxJPtBdpEbEJYw==} - browserify-zlib@0.1.4: - resolution: {integrity: sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=} - bson@4.7.2: resolution: {integrity: sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==} engines: {node: '>=6.9.0'} @@ -1940,9 +1928,6 @@ packages: buffer-crc32@0.2.13: resolution: {integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=} - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer-json@2.0.0: resolution: {integrity: sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==} @@ -2026,10 +2011,6 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - chromium-bidi@7.3.1: resolution: {integrity: sha512-i+BMGluhZZc4Jic9L1aHJBTfaopxmCqQxGklyMcqFx4fvF3nI4BJ3bCe1ad474nvYRIo/ZN/VrdA4eOaRZua4Q==} peerDependencies: @@ -2135,17 +2116,10 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie-signature@1.0.6: - resolution: {integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw=} - cookie-signature@1.2.2: resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} engines: {node: '>=6.6.0'} - cookie@0.7.1: - resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} - engines: {node: '>= 0.6'} - cookie@0.7.2: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} @@ -2154,9 +2128,6 @@ packages: resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} engines: {node: '>= 0.8'} - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cors@2.8.5: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} @@ -2206,14 +2177,6 @@ packages: debounce@1.2.1: resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -2335,9 +2298,6 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - duplexify@3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} - eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -2489,10 +2449,6 @@ packages: resolution: {integrity: sha1-AbK0mK5v0uQRUrIrV6Phc3c69n4=} engines: {node: '>=0.2.2'} - express@4.21.2: - resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} - engines: {node: '>= 0.10.0'} - express@5.1.0: resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} engines: {node: '>= 18'} @@ -2554,6 +2510,9 @@ packages: resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} engines: {node: '>=0.4.0'} + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + figures@6.1.0: resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} engines: {node: '>=18'} @@ -2562,14 +2521,14 @@ packages: resolution: {integrity: sha512-VZR5I7k5wkD0HgFnMsq5hOsSc710MJMu5Nc5QYsbe38NN5iPV/XTObYLc/cpttRTf6lX538+5uO1ZQRhYibiZQ==} engines: {node: '>=18'} + file-type@21.0.0: + resolution: {integrity: sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg==} + engines: {node: '>=20'} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - finalhandler@1.3.1: - resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} - engines: {node: '>= 0.8'} - finalhandler@2.1.0: resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} engines: {node: '>= 0.8'} @@ -2634,9 +2593,6 @@ packages: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} - from2@2.3.0: - resolution: {integrity: sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=} - fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -2653,10 +2609,6 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - fs.realpath@1.0.0: resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} @@ -2748,10 +2700,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - gunzip-maybe@1.4.2: - resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} - hasBin: true - happy-dom@15.11.7: resolution: {integrity: sha512-KyrFvnl+J9US63TEzwoiJOQzZBJY7KgBushJA8X61DMbNsH+2ONkDuLDnCnwUiPTF42tLoEmrPyoqbenVA5zrg==} engines: {node: '>=18.0.0'} @@ -2913,9 +2861,6 @@ packages: is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-deflate@1.0.0: - resolution: {integrity: sha1-yGKQHDwWH7CdrHzcfnhPgOmPLxQ=} - is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -2937,10 +2882,6 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-gzip@1.0.0: - resolution: {integrity: sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM=} - engines: {node: '>=0.10.0'} - is-ip@3.1.0: resolution: {integrity: sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==} engines: {node: '>=8'} @@ -3000,9 +2941,6 @@ packages: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} - isarray@1.0.0: - resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} - isbinaryfile@5.0.4: resolution: {integrity: sha512-YKBKVkKhty7s8rxddb40oOkuP0NbaeXrQvLin6QMHL7Ypiy2RW9LwOVrVgZRyOrhQlayMd9t+D8yDy8MKFTSDQ==} engines: {node: '>= 18.0.0'} @@ -3312,9 +3250,6 @@ packages: memory-pager@1.5.0: resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} - merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - merge-descriptors@2.0.0: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} @@ -3437,11 +3372,6 @@ packages: resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} engines: {node: '>= 0.6'} - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - mime@4.0.4: resolution: {integrity: sha512-v8yqInVjhXyqP6+Kw4fV3ZzeMRqEW6FotRsKXjRS5VMTNIuXsdRoAvklpoRgSqXm6o9VNH4/C0mgedko9DdLsQ==} engines: {node: '>=16'} @@ -3477,22 +3407,10 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - mitt@3.0.1: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} @@ -3546,9 +3464,6 @@ packages: socks: optional: true - ms@2.0.0: - resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -3691,9 +3606,6 @@ packages: resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} engines: {node: '>=14.16'} - pako@0.2.9: - resolution: {integrity: sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=} - pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} @@ -3750,9 +3662,6 @@ packages: resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} engines: {node: 20 || >=22} - path-to-regexp@0.1.12: - resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} - path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} @@ -3777,9 +3686,6 @@ packages: resolution: {integrity: sha512-GVlENSDW6KHaXcd9zkZltB7tCLosKB/4Hg0fqBJkAoBgYG2Tn1xtMgXtSUuMU9AK/gCm/tTdT8mgAeF4YNeeqw==} engines: {node: '>=14.16'} - peek-stream@1.1.3: - resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} - pend@1.2.0: resolution: {integrity: sha1-elfrVQpng/kRUzH89GY9XI4AelA=} @@ -3818,9 +3724,6 @@ packages: resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} engines: {node: '>=18'} - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -3846,15 +3749,9 @@ packages: resolution: {integrity: sha512-DdNcqcIbI0wEeCBcqX+bmZpUCvrDMJHXE553zgyG1MZ8S1a/iCCxmK9iTjjql+SpHSv4cZkmRv5/zGYW93AlCw==} engines: {node: '>=18'} - pump@2.0.1: - resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} - pump@3.0.3: resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} - pumpify@1.5.1: - resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} - punycode@1.4.1: resolution: {integrity: sha1-wNWmOycYgArY4esPpSachN1BhF4=} @@ -3909,9 +3806,6 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -4010,9 +3904,6 @@ packages: engines: {node: '>=8.3.0'} hasBin: true - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -4039,18 +3930,10 @@ packages: engines: {node: '>=10'} hasBin: true - send@0.19.0: - resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} - engines: {node: '>= 0.8.0'} - send@1.2.0: resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} engines: {node: '>= 18'} - serve-static@1.16.2: - resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} - engines: {node: '>= 0.8.0'} - serve-static@2.2.0: resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} engines: {node: '>= 18'} @@ -4178,9 +4061,6 @@ packages: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} - stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - streamsearch@0.1.2: resolution: {integrity: sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=} engines: {node: '>=0.8.0'} @@ -4196,9 +4076,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -4231,6 +4108,10 @@ packages: strnum@2.1.1: resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} + strtok3@10.3.4: + resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==} + engines: {node: '>=18'} + strtok3@9.0.1: resolution: {integrity: sha512-ERPW+XkvX9W2A+ov07iy+ZFJpVdik04GhDA4eVogiG9hpC97Kem2iucyzhFxbFRvQ5o2UckFtKZdp1hkGvnrEw==} engines: {node: '>=16'} @@ -4265,10 +4146,6 @@ packages: tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} - text-decoder@1.2.3: resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} @@ -4278,12 +4155,12 @@ packages: threads@1.7.0: resolution: {integrity: sha512-Mx5NBSHX3sQYR6iI9VYbgHKBLisyB+xROCBGjjWm1O9wb9vfLxdaGtmT/KCjUqMsSNW6nERzCW3T6H43LqjDZQ==} - through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + through@2.3.8: + resolution: {integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=} + time-span@5.1.0: resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} engines: {node: '>=12'} @@ -4303,6 +4180,10 @@ packages: resolution: {integrity: sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==} engines: {node: '>=14.16'} + token-types@6.1.1: + resolution: {integrity: sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ==} + engines: {node: '>=14.16'} + tr46@3.0.0: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} engines: {node: '>=12'} @@ -4374,6 +4255,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + engines: {node: '>=14.17'} + hasBin: true + uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} @@ -4436,10 +4322,6 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} - utils-merge@1.0.1: - resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=} - engines: {node: '>= 0.4.0'} - uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true @@ -4564,17 +4446,10 @@ packages: resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} engines: {node: '>=0.4.0'} - xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -4618,19 +4493,19 @@ snapshots: '@push.rocks/webrequest': 3.0.37 '@push.rocks/webstream': 1.0.10 - '@api.global/typedserver@3.0.74': + '@api.global/typedserver@3.0.77': dependencies: '@api.global/typedrequest': 3.1.10 '@api.global/typedrequest-interfaces': 3.0.19 '@api.global/typedsocket': 3.0.1 - '@cloudflare/workers-types': 4.20250813.0 + '@cloudflare/workers-types': 4.20250816.0 '@design.estate/dees-comms': 1.0.27 '@push.rocks/lik': 6.2.2 '@push.rocks/smartchok': 1.1.1 '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartenv': 5.0.13 '@push.rocks/smartfeed': 1.0.11 - '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smartfile': 11.2.7 '@push.rocks/smartjson': 5.0.20 '@push.rocks/smartlog': 3.1.8 '@push.rocks/smartlog-destination-devtools': 1.0.12 @@ -4640,9 +4515,9 @@ snapshots: '@push.rocks/smartmime': 2.0.4 '@push.rocks/smartntml': 2.0.8 '@push.rocks/smartopen': 2.0.0 - '@push.rocks/smartpath': 5.1.0 + '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartrequest': 2.1.0 + '@push.rocks/smartrequest': 4.2.2 '@push.rocks/smartrx': 3.0.10 '@push.rocks/smartsitemap': 2.0.3 '@push.rocks/smartstream': 3.2.5 @@ -4650,11 +4525,11 @@ snapshots: '@push.rocks/taskbuffer': 3.1.7 '@push.rocks/webrequest': 3.0.37 '@push.rocks/webstore': 2.0.20 - '@tsclass/tsclass': 8.2.1 + '@tsclass/tsclass': 9.2.0 '@types/express': 5.0.3 - body-parser: 1.20.3 + body-parser: 2.2.0 cors: 2.8.5 - express: 4.21.2 + express: 5.1.0 express-force-ssl: 0.3.2 lit: 3.3.1 transitivePeerDependencies: @@ -5242,7 +5117,9 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 - '@cloudflare/workers-types@4.20250813.0': {} + '@borewit/text-codec@0.1.1': {} + + '@cloudflare/workers-types@4.20250816.0': {} '@colors/colors@1.6.0': {} @@ -5274,7 +5151,7 @@ snapshots: '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrouter': 1.3.3 '@push.rocks/smartrx': 3.0.10 - '@push.rocks/smartstate': 2.0.25 + '@push.rocks/smartstate': 2.0.26 '@push.rocks/smartstring': 4.0.15 '@push.rocks/smarturl': 3.1.0 '@push.rocks/webrequest': 3.0.37 @@ -5471,26 +5348,27 @@ snapshots: dependencies: '@types/chai': 4.3.20 - '@git.zone/tsbuild@2.6.4': + '@git.zone/tsbuild@2.6.7': dependencies: - '@git.zone/tspublish': 1.10.1 + '@git.zone/tspublish': 1.10.3 '@push.rocks/early': 4.0.4 '@push.rocks/smartcli': 4.0.11 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smartfile': 11.2.7 '@push.rocks/smartlog': 3.1.8 - '@push.rocks/smartpath': 5.1.0 + '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - aws-crt + - supports-color '@git.zone/tsbundle@2.5.1': dependencies: '@push.rocks/early': 4.0.4 '@push.rocks/smartcli': 4.0.11 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smartfile': 11.2.7 '@push.rocks/smartlog': 3.1.8 '@push.rocks/smartlog-destination-local': 9.0.2 '@push.rocks/smartpath': 5.1.0 @@ -5506,19 +5384,20 @@ snapshots: - '@swc/helpers' - supports-color - '@git.zone/tspublish@1.10.1': + '@git.zone/tspublish@1.10.3': dependencies: '@push.rocks/consolecolor': 2.0.3 '@push.rocks/smartcli': 4.0.11 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smartfile': 11.2.7 '@push.rocks/smartlog': 3.1.8 - '@push.rocks/smartnpm': 2.0.4 + '@push.rocks/smartnpm': 2.0.6 '@push.rocks/smartpath': 6.0.0 - '@push.rocks/smartrequest': 4.2.1 - '@push.rocks/smartshell': 3.2.3 + '@push.rocks/smartrequest': 4.2.2 + '@push.rocks/smartshell': 3.3.0 transitivePeerDependencies: - aws-crt + - supports-color '@git.zone/tsrun@1.3.3': dependencies: @@ -5526,28 +5405,28 @@ snapshots: '@push.rocks/smartshell': 3.0.6 tsx: 4.19.2 - '@git.zone/tstest@2.3.2(@aws-sdk/credential-providers@3.864.0)(socks@2.8.7)(typescript@5.8.3)': + '@git.zone/tstest@2.3.4(@aws-sdk/credential-providers@3.864.0)(socks@2.8.7)(typescript@5.9.2)': dependencies: - '@api.global/typedserver': 3.0.74 + '@api.global/typedserver': 3.0.77 '@git.zone/tsbundle': 2.5.1 '@git.zone/tsrun': 1.3.3 '@push.rocks/consolecolor': 2.0.3 - '@push.rocks/qenv': 6.1.2 - '@push.rocks/smartbrowser': 2.0.8(typescript@5.8.3) + '@push.rocks/qenv': 6.1.3 + '@push.rocks/smartbrowser': 2.0.8(typescript@5.9.2) '@push.rocks/smartchok': 1.1.1 '@push.rocks/smartcrypto': 2.0.4 '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartenv': 5.0.13 '@push.rocks/smartexpect': 2.5.0 - '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smartfile': 11.2.7 '@push.rocks/smartjson': 5.0.20 '@push.rocks/smartlog': 3.1.8 '@push.rocks/smartmongo': 2.0.12(@aws-sdk/credential-providers@3.864.0)(socks@2.8.7) '@push.rocks/smartpath': 5.1.0 '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrequest': 2.1.0 - '@push.rocks/smarts3': 2.2.5 - '@push.rocks/smartshell': 3.2.3 + '@push.rocks/smarts3': 2.2.6 + '@push.rocks/smartshell': 3.3.0 '@push.rocks/smarttime': 4.1.1 '@types/ws': 8.18.1 figures: 6.1.0 @@ -5792,7 +5671,7 @@ snapshots: '@push.rocks/smartcache': 1.0.16 '@push.rocks/smartenv': 5.0.13 '@push.rocks/smartexit': 1.0.23 - '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smartfile': 11.2.7 '@push.rocks/smartjson': 5.0.20 '@push.rocks/smartpath': 5.1.0 '@push.rocks/smartpromise': 4.2.3 @@ -5837,34 +5716,38 @@ snapshots: transitivePeerDependencies: - aws-crt - '@push.rocks/qenv@6.1.2': + '@push.rocks/qenv@6.1.3': dependencies: '@api.global/typedrequest': 3.1.10 '@configvault.io/interfaces': 1.0.17 - '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smartfile': 11.2.7 '@push.rocks/smartlog': 3.1.8 '@push.rocks/smartpath': 6.0.0 - '@push.rocks/smartarchive@3.0.8': - dependencies: - '@push.rocks/smartfile': 10.0.41 - '@push.rocks/smartpath': 5.1.0 - '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartrequest': 2.1.0 - '@push.rocks/smartrx': 3.0.10 - '@push.rocks/smartstream': 2.0.8 - '@push.rocks/smartunique': 3.0.9 - '@types/gunzip-maybe': 1.4.2 - '@types/tar-stream': 2.2.3 - gunzip-maybe: 1.4.2 - tar: 6.2.1 - tar-stream: 3.1.7 - - '@push.rocks/smartbrowser@2.0.8(typescript@5.8.3)': + '@push.rocks/smartarchive@4.2.2': dependencies: '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartpdf': 3.3.0(typescript@5.8.3) - '@push.rocks/smartpuppeteer': 2.0.5(typescript@5.8.3) + '@push.rocks/smartfile': 11.2.7 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 4.2.2 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartstream': 3.2.5 + '@push.rocks/smartunique': 3.0.9 + '@push.rocks/smarturl': 3.1.0 + '@types/tar-stream': 3.1.4 + fflate: 0.8.2 + file-type: 21.0.0 + tar-stream: 3.1.7 + through: 2.3.8 + transitivePeerDependencies: + - supports-color + + '@push.rocks/smartbrowser@2.0.8(typescript@5.9.2)': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartpdf': 3.3.0(typescript@5.9.2) + '@push.rocks/smartpuppeteer': 2.0.5(typescript@5.9.2) '@push.rocks/smartunique': 3.0.9 transitivePeerDependencies: - bare-buffer @@ -5989,25 +5872,6 @@ snapshots: '@push.rocks/smartfile-interfaces@1.0.7': {} - '@push.rocks/smartfile@10.0.41': - dependencies: - '@push.rocks/lik': 6.2.2 - '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartfile-interfaces': 1.0.7 - '@push.rocks/smarthash': 3.2.3 - '@push.rocks/smartjson': 5.0.20 - '@push.rocks/smartmime': 1.0.6 - '@push.rocks/smartpath': 5.1.0 - '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartrequest': 2.1.0 - '@push.rocks/smartstream': 2.0.8 - '@types/fs-extra': 11.0.4 - '@types/glob': 8.1.0 - '@types/js-yaml': 4.0.9 - fs-extra: 11.3.1 - glob: 10.4.5 - js-yaml: 4.1.0 - '@push.rocks/smartfile@11.0.21': dependencies: '@push.rocks/lik': 6.1.0 @@ -6046,6 +5910,24 @@ snapshots: glob: 11.0.3 js-yaml: 4.1.0 + '@push.rocks/smartfile@11.2.7': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfile-interfaces': 1.0.7 + '@push.rocks/smarthash': 3.2.3 + '@push.rocks/smartjson': 5.0.20 + '@push.rocks/smartmime': 2.0.4 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 4.2.2 + '@push.rocks/smartstream': 3.2.5 + '@types/fs-extra': 11.0.4 + '@types/js-yaml': 4.0.9 + fs-extra: 11.3.1 + glob: 11.0.3 + js-yaml: 4.1.0 + '@push.rocks/smartguard@3.1.0': dependencies: '@push.rocks/smartpromise': 4.2.3 @@ -6122,11 +6004,6 @@ snapshots: dependencies: matcher: 5.0.0 - '@push.rocks/smartmime@1.0.6': - dependencies: - '@types/mime-types': 2.1.4 - mime-types: 2.1.35 - '@push.rocks/smartmime@2.0.4': dependencies: '@types/mime-types': 2.1.4 @@ -6161,20 +6038,21 @@ snapshots: public-ip: 7.0.1 systeminformation: 5.27.7 - '@push.rocks/smartnpm@2.0.4': + '@push.rocks/smartnpm@2.0.6': dependencies: '@push.rocks/consolecolor': 2.0.3 '@push.rocks/levelcache': 3.1.1 - '@push.rocks/smartarchive': 3.0.8 - '@push.rocks/smartfile': 10.0.41 - '@push.rocks/smartpath': 5.1.0 + '@push.rocks/smartarchive': 4.2.2 + '@push.rocks/smartfile': 11.2.7 + '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartrequest': 2.1.0 + '@push.rocks/smartrequest': 4.2.2 '@push.rocks/smarttime': 4.1.1 '@push.rocks/smartversion': 3.0.5 package-json: 8.1.1 transitivePeerDependencies: - aws-crt + - supports-color '@push.rocks/smartntml@2.0.8': dependencies: @@ -6201,15 +6079,15 @@ snapshots: '@push.rocks/smartpath@6.0.0': {} - '@push.rocks/smartpdf@3.3.0(typescript@5.8.3)': + '@push.rocks/smartpdf@3.3.0(typescript@5.9.2)': dependencies: '@push.rocks/smartbuffer': 3.0.5 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartfile': 11.2.5 + '@push.rocks/smartfile': 11.2.7 '@push.rocks/smartnetwork': 4.1.2 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartpuppeteer': 2.0.5(typescript@5.8.3) + '@push.rocks/smartpuppeteer': 2.0.5(typescript@5.9.2) '@push.rocks/smartunique': 3.0.9 '@tsclass/tsclass': 9.2.0 '@types/express': 5.0.3 @@ -6230,11 +6108,11 @@ snapshots: '@push.rocks/smartpromise@4.2.3': {} - '@push.rocks/smartpuppeteer@2.0.5(typescript@5.8.3)': + '@push.rocks/smartpuppeteer@2.0.5(typescript@5.9.2)': dependencies: '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartshell': 3.2.3 - puppeteer: 24.16.2(typescript@5.8.3) + '@push.rocks/smartshell': 3.3.0 + puppeteer: 24.16.2(typescript@5.9.2) tree-kill: 1.2.2 transitivePeerDependencies: - bare-buffer @@ -6257,7 +6135,7 @@ snapshots: agentkeepalive: 4.6.0 form-data: 4.0.4 - '@push.rocks/smartrequest@4.2.1': + '@push.rocks/smartrequest@4.2.2': dependencies: '@push.rocks/smartenv': 5.0.13 '@push.rocks/smartpath': 6.0.0 @@ -6289,6 +6167,18 @@ snapshots: - aws-crt - supports-color + '@push.rocks/smarts3@2.2.6': + dependencies: + '@push.rocks/smartbucket': 3.3.7 + '@push.rocks/smartfile': 11.2.7 + '@push.rocks/smartpath': 6.0.0 + '@tsclass/tsclass': 9.2.0 + '@types/s3rver': 3.7.4 + s3rver: 3.7.1 + transitivePeerDependencies: + - aws-crt + - supports-color + '@push.rocks/smartshell@3.0.6': dependencies: '@push.rocks/smartdelay': 3.0.5 @@ -6307,6 +6197,15 @@ snapshots: tree-kill: 1.2.2 which: 5.0.0 + '@push.rocks/smartshell@3.3.0': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartexit': 1.0.23 + '@push.rocks/smartpromise': 4.2.3 + '@types/which': 3.0.4 + tree-kill: 1.2.2 + which: 5.0.0 + '@push.rocks/smartsitemap@2.0.3': dependencies: '@push.rocks/smartcache': 1.0.16 @@ -6319,7 +6218,7 @@ snapshots: '@push.rocks/smartsocket@2.1.0': dependencies: '@api.global/typedrequest-interfaces': 3.0.19 - '@api.global/typedserver': 3.0.74 + '@api.global/typedserver': 3.0.77 '@push.rocks/isohash': 2.0.1 '@push.rocks/isounique': 1.0.5 '@push.rocks/lik': 6.2.2 @@ -6350,7 +6249,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@push.rocks/smartstate@2.0.25': + '@push.rocks/smartstate@2.0.26': dependencies: '@push.rocks/lik': 6.2.2 '@push.rocks/smarthash': 3.2.3 @@ -6359,15 +6258,6 @@ snapshots: '@push.rocks/smartrx': 3.0.10 '@push.rocks/webstore': 2.0.20 - '@push.rocks/smartstream@2.0.8': - dependencies: - '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartrx': 3.0.10 - '@types/from2': 2.3.5 - '@types/through2': 2.0.41 - from2: 2.3.0 - through2: 4.0.2 - '@push.rocks/smartstream@3.2.5': dependencies: '@push.rocks/lik': 6.1.0 @@ -6424,7 +6314,7 @@ snapshots: dependencies: '@open-wc/testing': 4.0.0 '@push.rocks/consolecolor': 2.0.3 - '@push.rocks/qenv': 6.1.2 + '@push.rocks/qenv': 6.1.3 '@push.rocks/smartcrypto': 2.0.4 '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartenv': 5.0.13 @@ -7103,6 +6993,14 @@ snapshots: '@tempfix/idb@8.0.3': {} + '@tokenizer/inflate@0.2.7': + dependencies: + debug: 4.4.1 + fflate: 0.8.2 + token-types: 6.1.1 + transitivePeerDependencies: + - supports-color + '@tokenizer/token@0.3.0': {} '@tootallnate/quickjs-emscripten@0.23.0': {} @@ -7115,10 +7013,6 @@ snapshots: dependencies: type-fest: 4.41.0 - '@tsclass/tsclass@8.2.1': - dependencies: - type-fest: 4.41.0 - '@tsclass/tsclass@9.2.0': dependencies: type-fest: 4.41.0 @@ -7207,10 +7101,6 @@ snapshots: dependencies: fast-json-stable-stringify: 2.1.0 - '@types/from2@2.3.5': - dependencies: - '@types/node': 24.3.0 - '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 @@ -7230,10 +7120,6 @@ snapshots: '@types/minimatch': 5.1.2 '@types/node': 22.9.0 - '@types/gunzip-maybe@1.4.2': - dependencies: - '@types/node': 24.3.0 - '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 @@ -7359,7 +7245,7 @@ snapshots: '@types/symbol-tree@3.2.5': {} - '@types/tar-stream@2.2.3': + '@types/tar-stream@3.1.4': dependencies: '@types/node': 24.3.0 @@ -7541,8 +7427,6 @@ snapshots: argparse@2.0.1: {} - array-flatten@1.1.1: {} - array-union@2.1.0: {} ast-types@0.13.4: @@ -7598,23 +7482,6 @@ snapshots: basic-ftp@5.0.5: {} - body-parser@1.20.3: - 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.13.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - body-parser@2.2.0: dependencies: bytes: 3.1.2 @@ -7651,10 +7518,6 @@ snapshots: p-queue: 6.6.2 unload: 2.4.1 - browserify-zlib@0.1.4: - dependencies: - pako: 0.2.9 - bson@4.7.2: dependencies: buffer: 5.7.1 @@ -7663,8 +7526,6 @@ snapshots: buffer-crc32@0.2.13: {} - buffer-from@1.1.2: {} - buffer-json@2.0.0: {} buffer@5.7.1: @@ -7761,8 +7622,6 @@ snapshots: dependencies: readdirp: 4.1.2 - chownr@2.0.0: {} - chromium-bidi@7.3.1(devtools-protocol@0.0.1475386): dependencies: devtools-protocol: 0.0.1475386 @@ -7863,12 +7722,8 @@ snapshots: convert-source-map@2.0.0: {} - cookie-signature@1.0.6: {} - cookie-signature@1.2.2: {} - cookie@0.7.1: {} - cookie@0.7.2: {} cookies@0.9.1: @@ -7876,21 +7731,19 @@ snapshots: depd: 2.0.0 keygrip: 1.1.0 - core-util-is@1.0.3: {} - cors@2.8.5: dependencies: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig@9.0.0(typescript@5.8.3): + cosmiconfig@9.0.0(typescript@5.9.2): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 croner@4.4.1: {} @@ -7922,10 +7775,6 @@ snapshots: debounce@1.2.1: {} - debug@2.6.9: - dependencies: - ms: 2.0.0 - debug@3.2.7: dependencies: ms: 2.1.3 @@ -8020,13 +7869,6 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - duplexify@3.7.1: - dependencies: - end-of-stream: 1.4.5 - inherits: 2.0.4 - readable-stream: 2.3.8 - stream-shift: 1.0.3 - eastasianwidth@0.2.0: {} ee-first@1.1.1: {} @@ -8220,42 +8062,6 @@ snapshots: dependencies: lodash.assign: 3.2.0 - express@4.21.2: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.3 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.7.1 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.3.1 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.3 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.12 - proxy-addr: 2.0.7 - qs: 6.13.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.19.0 - serve-static: 1.16.2 - 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 - express@5.1.0: dependencies: accepts: 2.0.0 @@ -8348,6 +8154,8 @@ snapshots: dependencies: xml-js: 1.6.11 + fflate@0.8.2: {} + figures@6.1.0: dependencies: is-unicode-supported: 2.1.0 @@ -8359,22 +8167,19 @@ snapshots: token-types: 6.0.0 uint8array-extras: 1.4.0 + file-type@21.0.0: + dependencies: + '@tokenizer/inflate': 0.2.7 + strtok3: 10.3.4 + token-types: 6.1.1 + uint8array-extras: 1.4.1 + transitivePeerDependencies: + - supports-color + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - finalhandler@1.3.1: - dependencies: - debug: 2.6.9 - encodeurl: 2.0.0 - 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 - finalhandler@2.1.0: dependencies: debug: 4.4.1 @@ -8442,11 +8247,6 @@ snapshots: fresh@2.0.0: {} - from2@2.3.0: - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 @@ -8471,10 +8271,6 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -8613,15 +8409,6 @@ snapshots: graceful-fs@4.2.11: {} - gunzip-maybe@1.4.2: - dependencies: - browserify-zlib: 0.1.4 - is-deflate: 1.0.0 - is-gzip: 1.0.0 - peek-stream: 1.1.3 - pumpify: 1.5.1 - through2: 2.0.5 - happy-dom@15.11.7: dependencies: entities: 4.5.0 @@ -8796,8 +8583,6 @@ snapshots: is-arrayish@0.3.2: {} - is-deflate@1.0.0: {} - is-docker@2.2.1: {} is-extglob@2.1.1: {} @@ -8815,8 +8600,6 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-gzip@1.0.0: {} - is-ip@3.1.0: dependencies: ip-regex: 4.3.0 @@ -8862,8 +8645,6 @@ snapshots: dependencies: is-docker: 2.2.1 - isarray@1.0.0: {} - isbinaryfile@5.0.4: {} isexe@2.0.0: {} @@ -9294,8 +9075,6 @@ snapshots: memory-pager@1.5.0: {} - merge-descriptors@1.0.3: {} - merge-descriptors@2.0.0: {} merge-stream@2.0.0: {} @@ -9519,8 +9298,6 @@ snapshots: dependencies: mime-db: 1.54.0 - mime@1.6.0: {} - mime@4.0.4: {} mimic-fn@2.1.0: {} @@ -9545,19 +9322,8 @@ snapshots: minimist@1.2.8: {} - minipass@3.3.6: - dependencies: - yallist: 4.0.0 - - minipass@5.0.0: {} - minipass@7.1.2: {} - minizlib@2.1.2: - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - mitt@3.0.1: {} mkdirp@1.0.4: {} @@ -9630,8 +9396,6 @@ snapshots: '@aws-sdk/credential-providers': 3.864.0 socks: 2.8.7 - ms@2.0.0: {} - ms@2.1.3: {} nanocolors@0.2.13: {} @@ -9758,8 +9522,6 @@ snapshots: registry-url: 6.0.1 semver: 7.7.2 - pako@0.2.9: {} - pako@1.0.11: {} param-case@2.1.1: @@ -9805,8 +9567,6 @@ snapshots: lru-cache: 11.1.0 minipass: 7.1.2 - path-to-regexp@0.1.12: {} - path-to-regexp@6.3.0: {} path-to-regexp@8.2.0: {} @@ -9824,12 +9584,6 @@ snapshots: peek-readable@5.3.1: {} - peek-stream@1.1.3: - dependencies: - buffer-from: 1.1.2 - duplexify: 3.7.1 - through2: 2.0.5 - pend@1.2.0: {} picocolors@1.1.1: {} @@ -9862,8 +9616,6 @@ snapshots: dependencies: parse-ms: 4.0.0 - process-nextick-args@2.0.1: {} - progress@2.0.3: {} property-information@7.1.0: {} @@ -9896,22 +9648,11 @@ snapshots: got: 13.0.0 is-ip: 5.0.1 - pump@2.0.1: - dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 - pump@3.0.3: dependencies: end-of-stream: 1.4.5 once: 1.4.0 - pumpify@1.5.1: - dependencies: - duplexify: 3.7.1 - inherits: 2.0.4 - pump: 2.0.1 - punycode@1.4.1: {} punycode@2.3.1: {} @@ -9930,11 +9671,11 @@ snapshots: - supports-color - utf-8-validate - puppeteer@24.16.2(typescript@5.8.3): + puppeteer@24.16.2(typescript@5.9.2): dependencies: '@puppeteer/browsers': 2.10.6 chromium-bidi: 7.3.1(devtools-protocol@0.0.1475386) - cosmiconfig: 9.0.0(typescript@5.8.3) + cosmiconfig: 9.0.0(typescript@5.9.2) devtools-protocol: 0.0.1475386 puppeteer-core: 24.16.2 typed-query-selector: 2.12.0 @@ -9988,16 +9729,6 @@ snapshots: react-is@18.3.1: {} - readable-stream@2.3.8: - 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 - readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -10152,8 +9883,6 @@ snapshots: transitivePeerDependencies: - supports-color - safe-buffer@5.1.2: {} - safe-buffer@5.2.1: {} safe-regex-test@1.1.0: @@ -10172,24 +9901,6 @@ snapshots: semver@7.7.2: {} - send@0.19.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 - send@1.2.0: dependencies: debug: 4.4.1 @@ -10206,15 +9917,6 @@ snapshots: transitivePeerDependencies: - supports-color - serve-static@1.16.2: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.19.0 - transitivePeerDependencies: - - supports-color - serve-static@2.2.0: dependencies: encodeurl: 2.0.0 @@ -10383,8 +10085,6 @@ snapshots: statuses@2.0.2: {} - stream-shift@1.0.3: {} - streamsearch@0.1.2: {} streamx@2.22.1: @@ -10406,10 +10106,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -10439,6 +10135,10 @@ snapshots: strnum@2.1.1: {} + strtok3@10.3.4: + dependencies: + '@tokenizer/token': 0.3.0 + strtok3@9.0.1: dependencies: '@tokenizer/token': 0.3.0 @@ -10480,15 +10180,6 @@ snapshots: fast-fifo: 1.3.2 streamx: 2.22.1 - tar@6.2.1: - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - text-decoder@1.2.3: dependencies: b4a: 1.6.7 @@ -10506,15 +10197,12 @@ snapshots: transitivePeerDependencies: - supports-color - through2@2.0.5: - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - through2@4.0.2: dependencies: readable-stream: 3.6.2 + through@2.3.8: {} + time-span@5.1.0: dependencies: convert-hrtime: 5.0.0 @@ -10534,6 +10222,12 @@ snapshots: '@tokenizer/token': 0.3.0 ieee754: 1.2.1 + token-types@6.1.1: + dependencies: + '@borewit/text-codec': 0.1.1 + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + tr46@3.0.0: dependencies: punycode: 2.3.1 @@ -10590,6 +10284,8 @@ snapshots: typescript@5.8.3: {} + typescript@5.9.2: {} + uglify-js@3.19.3: {} uint8array-extras@1.4.0: {} @@ -10650,8 +10346,6 @@ snapshots: util-deprecate@1.0.2: {} - utils-merge@1.0.1: {} - uuid@9.0.1: {} vary@1.1.2: {} @@ -10758,12 +10452,8 @@ snapshots: xmlhttprequest-ssl@2.1.2: {} - xtend@4.0.2: {} - y18n@5.0.8: {} - yallist@4.0.0: {} - yargs-parser@21.1.1: {} yargs@17.7.2: diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts index 8b1ffdb..86de51c 100644 --- a/ts/00_commitinfo_data.ts +++ b/ts/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@push.rocks/smartbucket', - version: '3.3.9', + version: '3.3.10', description: 'A TypeScript library providing a cloud-agnostic interface for managing object storage with functionalities like bucket management, file and directory operations, and advanced features such as metadata handling and file locking.' } diff --git a/ts/classes.smartbucket.ts b/ts/classes.smartbucket.ts index 2b67f24..64cd16e 100644 --- a/ts/classes.smartbucket.ts +++ b/ts/classes.smartbucket.ts @@ -2,6 +2,7 @@ import * as plugins from './plugins.js'; import { Bucket } from './classes.bucket.js'; +import { normalizeS3Descriptor } from './helpers.js'; export class SmartBucket { public config: plugins.tsclass.storage.IS3Descriptor; @@ -17,18 +18,14 @@ export class SmartBucket { constructor(configArg: plugins.tsclass.storage.IS3Descriptor) { this.config = configArg; - const protocol = configArg.useSsl === false ? 'http' : 'https'; - const port = configArg.port ? `:${configArg.port}` : ''; - const endpoint = `${protocol}://${configArg.endpoint}${port}`; + // Use the normalizer to handle various endpoint formats + const { normalized } = normalizeS3Descriptor(configArg); this.s3Client = new plugins.s3.S3Client({ - endpoint, - region: configArg.region || 'us-east-1', - credentials: { - accessKeyId: configArg.accessKey, - secretAccessKey: configArg.accessSecret, - }, - forcePathStyle: true, // Necessary for S3-compatible storage like MinIO or Wasabi + endpoint: normalized.endpointUrl, + region: normalized.region, + credentials: normalized.credentials, + forcePathStyle: normalized.forcePathStyle, // Necessary for S3-compatible storage like MinIO or Wasabi }); } diff --git a/ts/helpers.ts b/ts/helpers.ts index 26d0693..2662d3f 100644 --- a/ts/helpers.ts +++ b/ts/helpers.ts @@ -19,4 +19,236 @@ export const reducePathDescriptorToPath = async (pathDescriptorArg: interfaces.I returnPath = returnPath.substring(1); } return returnPath; +} + +// S3 Descriptor Normalization +export interface IS3Warning { + code: string; + message: string; +} + +export interface INormalizedS3Config { + endpointUrl: string; + host: string; + protocol: 'http' | 'https'; + port?: number; + region: string; + credentials: { + accessKeyId: string; + secretAccessKey: string; + }; + forcePathStyle: boolean; +} + +function coerceBooleanMaybe(value: unknown): { value: boolean | undefined; warning?: IS3Warning } { + if (typeof value === 'boolean') return { value }; + if (typeof value === 'string') { + const v = value.trim().toLowerCase(); + if (v === 'true' || v === '1') { + return { + value: true, + warning: { + code: 'SBK_S3_COERCED_USESSL', + message: `Coerced useSsl='${value}' (string) to boolean true.` + } + }; + } + if (v === 'false' || v === '0') { + return { + value: false, + warning: { + code: 'SBK_S3_COERCED_USESSL', + message: `Coerced useSsl='${value}' (string) to boolean false.` + } + }; + } + } + return { value: undefined }; +} + +function coercePortMaybe(port: unknown): { value: number | undefined; warning?: IS3Warning } { + if (port === undefined || port === null || port === '') return { value: undefined }; + const n = typeof port === 'number' ? port : Number(String(port).trim()); + if (!Number.isFinite(n) || !Number.isInteger(n) || n <= 0 || n > 65535) { + return { + value: undefined, + warning: { + code: 'SBK_S3_INVALID_PORT', + message: `Invalid port '${String(port)}' - expected integer in [1..65535].` + } + }; + } + return { value: n }; +} + +function sanitizeEndpointString(raw: unknown): { value: string; warnings: IS3Warning[] } { + const warnings: IS3Warning[] = []; + let s = String(raw ?? '').trim(); + if (s !== String(raw ?? '')) { + warnings.push({ + code: 'SBK_S3_TRIMMED_ENDPOINT', + message: 'Trimmed surrounding whitespace from endpoint.' + }); + } + return { value: s, warnings }; +} + +function parseEndpointHostPort( + endpoint: string, + provisionalProtocol: 'http' | 'https' +): { + hadScheme: boolean; + host: string; + port?: number; + extras: { + droppedPath?: boolean; + droppedQuery?: boolean; + droppedCreds?: boolean + } +} { + let url: URL | undefined; + const extras: { droppedPath?: boolean; droppedQuery?: boolean; droppedCreds?: boolean } = {}; + + // Check if endpoint already has a scheme + const hasScheme = /^https?:\/\//i.test(endpoint); + + // Try parsing as full URL first + try { + if (hasScheme) { + url = new URL(endpoint); + } else { + // Not a full URL; try host[:port] by attaching provisional scheme + // Remove anything after first '/' for safety + const cleanEndpoint = endpoint.replace(/\/.*/, ''); + url = new URL(`${provisionalProtocol}://${cleanEndpoint}`); + } + } catch (e) { + throw new Error(`Unable to parse endpoint '${endpoint}'.`); + } + + // Check for dropped components + if (url.username || url.password) extras.droppedCreds = true; + if (url.pathname && url.pathname !== '/') extras.droppedPath = true; + if (url.search) extras.droppedQuery = true; + + const hadScheme = hasScheme; + const host = url.hostname; // hostnames lowercased by URL; IPs preserved + const port = url.port ? Number(url.port) : undefined; + + return { hadScheme, host, port, extras }; +} + +export function normalizeS3Descriptor( + input: plugins.tsclass.storage.IS3Descriptor, + logger?: { warn: (msg: string) => void } +): { normalized: INormalizedS3Config; warnings: IS3Warning[] } { + const warnings: IS3Warning[] = []; + const logWarn = (w: IS3Warning) => { + warnings.push(w); + if (logger) { + logger.warn(`[SmartBucket S3] ${w.code}: ${w.message}`); + } else { + console.warn(`[SmartBucket S3] ${w.code}: ${w.message}`); + } + }; + + // Coerce and sanitize inputs + const { value: coercedUseSsl, warning: useSslWarn } = coerceBooleanMaybe((input as any).useSsl); + if (useSslWarn) logWarn(useSslWarn); + + const { value: coercedPort, warning: portWarn } = coercePortMaybe((input as any).port); + if (portWarn) logWarn(portWarn); + + const { value: endpointStr, warnings: endpointSanWarnings } = sanitizeEndpointString((input as any).endpoint); + endpointSanWarnings.forEach(logWarn); + + if (!endpointStr) { + throw new Error('S3 endpoint is required (got empty string). Provide hostname or URL.'); + } + + // Provisional protocol selection for parsing host:port forms + const provisionalProtocol: 'http' | 'https' = coercedUseSsl === false ? 'http' : 'https'; + + const { hadScheme, host, port: epPort, extras } = parseEndpointHostPort(endpointStr, provisionalProtocol); + + if (extras.droppedCreds) { + logWarn({ + code: 'SBK_S3_DROPPED_CREDENTIALS', + message: 'Ignored credentials in endpoint URL.' + }); + } + if (extras.droppedPath) { + logWarn({ + code: 'SBK_S3_DROPPED_PATH', + message: 'Removed path segment from endpoint URL; S3 endpoint should be host[:port] only.' + }); + } + if (extras.droppedQuery) { + logWarn({ + code: 'SBK_S3_DROPPED_QUERY', + message: 'Removed query string from endpoint URL; S3 endpoint should be host[:port] only.' + }); + } + + // Final protocol decision + let finalProtocol: 'http' | 'https'; + if (hadScheme) { + // Scheme from endpoint wins + const schemeFromEndpoint = endpointStr.trim().toLowerCase().startsWith('http://') ? 'http' : 'https'; + finalProtocol = schemeFromEndpoint; + if (typeof coercedUseSsl === 'boolean') { + const expected = coercedUseSsl ? 'https' : 'http'; + if (expected !== finalProtocol) { + logWarn({ + code: 'SBK_S3_SCHEME_CONFLICT', + message: `useSsl=${String(coercedUseSsl)} conflicts with endpoint scheme '${finalProtocol}'; using endpoint scheme.` + }); + } + } + } else { + if (typeof coercedUseSsl === 'boolean') { + finalProtocol = coercedUseSsl ? 'https' : 'http'; + } else { + finalProtocol = 'https'; + logWarn({ + code: 'SBK_S3_GUESSED_PROTOCOL', + message: "No scheme in endpoint and useSsl not provided; defaulting to 'https'." + }); + } + } + + // Final port decision + let finalPort: number | undefined = undefined; + if (coercedPort !== undefined && epPort !== undefined && coercedPort !== epPort) { + logWarn({ + code: 'SBK_S3_PORT_CONFLICT', + message: `Port in config (${coercedPort}) conflicts with endpoint port (${epPort}); using config port.` + }); + finalPort = coercedPort; + } else { + finalPort = (coercedPort !== undefined) ? coercedPort : epPort; + } + + // Build canonical endpoint URL (origin only, no trailing slash) + const url = new URL(`${finalProtocol}://${host}`); + if (finalPort !== undefined) url.port = String(finalPort); + const endpointUrl = url.origin; + + const region = input.region || 'us-east-1'; + + return { + normalized: { + endpointUrl, + host, + protocol: finalProtocol, + port: finalPort, + region, + credentials: { + accessKeyId: input.accessKey, + secretAccessKey: input.accessSecret, + }, + forcePathStyle: true, + }, + warnings, + }; } \ No newline at end of file