diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 9010d19c4b..cc700ee01b 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -18,8 +18,8 @@ dependencies: specifier: ^3.582.0 version: 3.582.0 '@cloudflare/workers-types': - specifier: ^4.20240729.0 - version: 4.20241004.0 + specifier: ^4.20241022.0 + version: 4.20241022.0 '@elastic/elasticsearch': specifier: ^7.17.14 version: 7.17.14 @@ -58,7 +58,7 @@ dependencies: version: 7.5.1 '@playwright/test': specifier: ^1.48.2 - version: 1.48.2 + version: 1.49.1 '@rush-temp/account': specifier: file:./projects/account.tgz version: file:projects/account.tgz(@types/node@20.11.19)(esbuild@0.20.1)(ts-node@10.9.2) @@ -161,6 +161,9 @@ dependencies: '@rush-temp/cloud-datalake': specifier: file:./projects/cloud-datalake.tgz version: file:projects/cloud-datalake.tgz(@types/node@20.11.19)(bufferutil@4.0.8)(esbuild@0.20.1)(ts-node@10.9.2)(utf-8-validate@6.0.4) + '@rush-temp/cloud-transactor': + specifier: file:./projects/cloud-transactor.tgz + version: file:projects/cloud-transactor.tgz(@types/node@20.11.19)(bufferutil@4.0.8)(ts-node@10.9.2)(utf-8-validate@6.0.4) '@rush-temp/collaboration': specifier: file:./projects/collaboration.tgz version: file:projects/collaboration.tgz(esbuild@0.20.1)(ts-node@10.9.2) @@ -1255,7 +1258,7 @@ dependencies: version: 4.2.2 '@types/csvtojson': specifier: ^2.0.0 - version: 2.0.0 + version: 2.0.3 '@types/diff': specifier: ~5.0.2 version: 5.0.9 @@ -1411,10 +1414,10 @@ dependencies: version: 1.7.4 allure-js-commons: specifier: ^3.0.6 - version: 3.0.6(allure-playwright@3.0.6) + version: 3.0.7(allure-playwright@3.0.7) allure-playwright: specifier: ^3.0.6 - version: 3.0.6(@playwright/test@1.48.2) + version: 3.0.7(@playwright/test@1.49.1) autolinker: specifier: 4.0.0 version: 4.0.0 @@ -1441,7 +1444,7 @@ dependencies: version: 4.23.3 bson: specifier: ^6.10.0 - version: 6.10.0 + version: 6.10.1 bufferutil: specifier: ^4.0.8 version: 4.0.8 @@ -1726,7 +1729,7 @@ dependencies: version: 8.0.0 mongodb: specifier: ^6.10.0 - version: 6.10.0 + version: 6.12.0 morgan: specifier: ^1.10.0 version: 1.10.0 @@ -1923,8 +1926,8 @@ dependencies: specifier: ^5.0.0 version: 5.0.0(winston@3.13.1) wrangler: - specifier: ^3.80.1 - version: 3.80.2(@cloudflare/workers-types@4.20241004.0)(bufferutil@4.0.8)(utf-8-validate@6.0.4) + specifier: ^3.97.0 + version: 3.97.0(@cloudflare/workers-types@4.20241022.0)(bufferutil@4.0.8)(utf-8-validate@6.0.4) ws: specifier: ^8.18.0 version: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) @@ -1969,7 +1972,7 @@ packages: /@antfu/install-pkg@0.4.1: resolution: {integrity: sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==} dependencies: - package-manager-detector: 0.2.6 + package-manager-detector: 0.2.7 tinyexec: 0.3.1 dev: false @@ -3055,8 +3058,8 @@ packages: mime: 3.0.0 dev: false - /@cloudflare/workerd-darwin-64@1.20240925.0: - resolution: {integrity: sha512-KdLnSXuzB65CbqZPm+qYzk+zkQ1tUNPaaRGYVd/jPYAxwwtfTUQdQ+ahDPwVVs2tmQELKy7ZjQjf2apqSWUfjw==} + /@cloudflare/workerd-darwin-64@1.20241205.0: + resolution: {integrity: sha512-TArEZkSZkHJyEwnlWWkSpCI99cF6lJ14OVeEoI9Um/+cD9CKZLM9vCmsLeKglKheJ0KcdCnkA+DbeD15t3VaWg==} engines: {node: '>=16'} cpu: [x64] os: [darwin] @@ -3064,8 +3067,8 @@ packages: dev: false optional: true - /@cloudflare/workerd-darwin-arm64@1.20240925.0: - resolution: {integrity: sha512-MiQ6uUmCXjsXgWNV+Ock2tp2/tYqNJGzjuaH6jFioeRF+//mz7Tv7J7EczOL4zq+TH8QFOh0/PUsLyazIWVGng==} + /@cloudflare/workerd-darwin-arm64@1.20241205.0: + resolution: {integrity: sha512-u5eqKa9QRdA8MugfgCoD+ADDjY6EpKbv3hSYJETmmUh17l7WXjWBzv4pUvOKIX67C0UzMUy4jZYwC53MymhX3w==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] @@ -3073,8 +3076,8 @@ packages: dev: false optional: true - /@cloudflare/workerd-linux-64@1.20240925.0: - resolution: {integrity: sha512-Rjix8jsJMfsInmq3Hm3fmiRQ+rwzuWRPV1pg/OWhMSfNP7Qp2RCU+RGkhgeR9Z5eNAje0Sn2BMrFq4RvF9/yRA==} + /@cloudflare/workerd-linux-64@1.20241205.0: + resolution: {integrity: sha512-OYA7S5zpumMamWEW+IhhBU6YojIEocyE5X/YFPiTOCrDE3dsfr9t6oqNE7hxGm1VAAu+Irtl+a/5LwmBOU681w==} engines: {node: '>=16'} cpu: [x64] os: [linux] @@ -3082,8 +3085,8 @@ packages: dev: false optional: true - /@cloudflare/workerd-linux-arm64@1.20240925.0: - resolution: {integrity: sha512-VYIPeMHQRtbwQoIjUwS/zULlywPxyDvo46XkTpIW5MScEChfqHvAYviQ7TzYGx6Q+gmZmN+DUB2KOMx+MEpCxA==} + /@cloudflare/workerd-linux-arm64@1.20241205.0: + resolution: {integrity: sha512-qAzecONjFJGIAVJZKExQ5dlbic0f3d4A+GdKa+H6SoUJtPaWiE3K6WuePo4JOT7W3/Zfh25McmX+MmpMUUcM5Q==} engines: {node: '>=16'} cpu: [arm64] os: [linux] @@ -3091,8 +3094,8 @@ packages: dev: false optional: true - /@cloudflare/workerd-windows-64@1.20240925.0: - resolution: {integrity: sha512-C8peGvaU5R51bIySi1VbyfRgwNSSRknqoFSnSbSBI3uTN3THTB3UnmRKy7GXJDmyjgXuT9Pcs1IgaWNubLtNtw==} + /@cloudflare/workerd-windows-64@1.20241205.0: + resolution: {integrity: sha512-BEab+HiUgCdl6GXAT7EI2yaRtDPiRJlB94XLvRvXi1ZcmQqsrq6awGo6apctFo4WUL29V7c09LxmN4HQ3X2Tvg==} engines: {node: '>=16'} cpu: [x64] os: [win32] @@ -3100,16 +3103,8 @@ packages: dev: false optional: true - /@cloudflare/workers-shared@0.5.4: - resolution: {integrity: sha512-PNL/0TjKRdUHa1kwgVdqUNJVZ9ez4kacsi8omz+gv859EvJmsVuGiMAClY2YfJnC9LVKhKCcjqmFgKNXG9/IXA==} - engines: {node: '>=16.7.0'} - dependencies: - mime: 3.0.0 - zod: 3.23.8 - dev: false - - /@cloudflare/workers-types@4.20241004.0: - resolution: {integrity: sha512-3LrPvtecs4umknOF1bTPNLHUG/ZjeSE6PYBQ/tbO7lwaVhjZTaTugiaCny2byrZupBlVNuubQVktcAgMfw0C1A==} + /@cloudflare/workers-types@4.20241022.0: + resolution: {integrity: sha512-1zOAw5QIDKItzGatzCrEpfLOB1AuMTwVqKmbw9B9eBfCUGRFNfJYMrJxIwcse9EmKahsQt2GruqU00pY/GyXgg==} dev: false /@colors/colors@1.6.0: @@ -3187,7 +3182,7 @@ packages: resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} engines: {node: '>=12'} dependencies: - debug: 4.3.7 + debug: 4.4.0 env-paths: 2.2.1 fs-extra: 8.1.0 got: 11.8.6 @@ -4076,13 +4071,14 @@ packages: resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} dev: false - /@iconify/utils@2.1.33: - resolution: {integrity: sha512-jP9h6v/g0BIZx0p7XGJJVtkVnydtbgTgt9mVNcGDYwaa7UhdHdI9dvoq+gKj9sijMSJKxUPEG2JyjsgXjxL7Kw==} + /@iconify/utils@2.2.1: + resolution: {integrity: sha512-0/7J7hk4PqXmxo5PDBDxmnecw5PxklZJfNjIVG9FM0mEfVrvfudS22rYWsqVk6gR3UJ/mSYS90X4R3znXnqfNA==} dependencies: '@antfu/install-pkg': 0.4.1 '@antfu/utils': 0.7.10 '@iconify/types': 2.0.0 - debug: 4.3.7 + debug: 4.4.0 + globals: 15.13.0 kolorist: 1.8.0 local-pkg: 0.5.1 mlly: 1.7.3 @@ -4849,6 +4845,12 @@ packages: sparse-bitfield: 3.0.3 dev: false + /@mongodb-js/saslprep@1.1.9: + resolution: {integrity: sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==} + dependencies: + sparse-bitfield: 3.0.3 + dev: false + /@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3: resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} cpu: [arm64] @@ -5214,12 +5216,12 @@ packages: dev: false optional: true - /@playwright/test@1.48.2: - resolution: {integrity: sha512-54w1xCWfXuax7dz4W2M9uw0gDyh+ti/0K/MxcCUxChFh37kkdxPdfZDw5QBbuPUJHr1CiHJ1hXgSs+GgeQc5Zw==} + /@playwright/test@1.49.1: + resolution: {integrity: sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==} engines: {node: '>=18'} hasBin: true dependencies: - playwright: 1.48.2 + playwright: 1.49.1 dev: false /@polka/url@1.0.0-next.24: @@ -5251,10 +5253,6 @@ packages: resolution: {integrity: sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==} dev: false - /@sec-ant/readable-stream@0.4.1: - resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - dev: false - /@selderee/plugin-htmlparser2@0.11.0: resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} dependencies: @@ -6481,8 +6479,8 @@ packages: resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==} dev: false - /@types/csvtojson@2.0.0: - resolution: {integrity: sha512-F7jFwbbA/V2OKM1VhZccjC+/eeZISvWyqGmhFS9A44jQp3RimDleNYngG+DvCgHjM2EjHwgQe0qqpgDhTqsa7Q==} + /@types/csvtojson@2.0.3: + resolution: {integrity: sha512-qutD4v9ydwjTp2XLK4w7FO9SK5QFpbGkCmGRu7+oJPrguUqT82X7ufxmsmx1TpkMdxhftGKdHmPr4DFkx1b0yA==} deprecated: This is a stub types definition. csvtojson provides its own type definitions, so you do not need this installed. dependencies: csvtojson: 2.0.10 @@ -6516,7 +6514,7 @@ packages: resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} dependencies: '@types/d3-array': 3.2.1 - '@types/geojson': 7946.0.14 + '@types/geojson': 7946.0.15 dev: false /@types/d3-delaunay@6.0.4: @@ -6558,7 +6556,7 @@ packages: /@types/d3-geo@3.1.0: resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} dependencies: - '@types/geojson': 7946.0.14 + '@types/geojson': 7946.0.15 dev: false /@types/d3-hierarchy@3.1.7: @@ -6760,8 +6758,8 @@ packages: '@types/node': 20.11.19 dev: false - /@types/geojson@7946.0.14: - resolution: {integrity: sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==} + /@types/geojson@7946.0.15: + resolution: {integrity: sha512-9oSxFzDCT2Rj6DfcHF8G++jxBKS7mBqXl5xrRW+Kbvjry6Uduya2iiwqHPhVXpasAVMBYKkEPGgKhd3+/HZ6xA==} dev: false /@types/graceful-fs@4.1.9: @@ -8168,25 +8166,25 @@ packages: require-from-string: 2.0.2 dev: false - /allure-js-commons@3.0.6(allure-playwright@3.0.6): - resolution: {integrity: sha512-q3r3Cj3sG6hR7jH8SGkfNleLJK+yFAGwzyFDGzIfu+WLZ4yeFcBZHkWuq7QreRpxvsZWNby/38jhrj5yYFwQ2g==} + /allure-js-commons@3.0.7(allure-playwright@3.0.7): + resolution: {integrity: sha512-keHlPAtmzdtEK8FT5W0mOMYh9ZrdlhbrDyaaAKMNHipF/EsFak18XdbLiAKhnHbHiicE+n3BrmBU4rfQEoFHzA==} peerDependencies: - allure-playwright: 3.0.6 + allure-playwright: 3.0.7 peerDependenciesMeta: allure-playwright: optional: true dependencies: - allure-playwright: 3.0.6(@playwright/test@1.48.2) + allure-playwright: 3.0.7(@playwright/test@1.49.1) md5: 2.3.0 dev: false - /allure-playwright@3.0.6(@playwright/test@1.48.2): - resolution: {integrity: sha512-CYhIopRjtb1LoTHD0WhH1njd6cEz0J9B+YSSAzLmI/6FP1RPZJFqAyPg/RY8c2BObxM+98T9yZzwSdZ4l3YxjQ==} + /allure-playwright@3.0.7(@playwright/test@1.49.1): + resolution: {integrity: sha512-kFiPBCeAGOMcJmbFOw1ANjcfH+NuXMm5NIx8QEqb1XTqzMBTOA6xeci7DVgPlrKqJtgYm3AQ4YdxzBnJZzGrog==} peerDependencies: '@playwright/test': '>=1.36.0' dependencies: - '@playwright/test': 1.48.2 - allure-js-commons: 3.0.6(allure-playwright@3.0.6) + '@playwright/test': 1.49.1 + allure-js-commons: 3.0.7(allure-playwright@3.0.7) dev: false /ansi-escapes@4.3.2: @@ -8765,6 +8763,13 @@ packages: dev: false optional: true + /base32-encode@2.0.0: + resolution: {integrity: sha512-mlmkfc2WqdDtMl/id4qm3A7RjW6jxcbAoMjdRmsPiwQP0ufD4oXItYMnPgVHe80lnAIy+1xwzhHE1s4FoIceSw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + to-data-view: 2.0.0 + dev: false + /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} dev: false @@ -8941,15 +8946,15 @@ packages: update-browserslist-db: 1.1.0(browserslist@4.23.3) dev: false - /browserslist@4.24.2: - resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} + /browserslist@4.24.3: + resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001687 - electron-to-chromium: 1.5.71 - node-releases: 2.0.18 - update-browserslist-db: 1.1.1(browserslist@4.24.2) + caniuse-lite: 1.0.30001689 + electron-to-chromium: 1.5.74 + node-releases: 2.0.19 + update-browserslist-db: 1.1.1(browserslist@4.24.3) dev: false /bs-logger@0.2.6: @@ -8965,8 +8970,8 @@ packages: node-int64: 0.4.0 dev: false - /bson@6.10.0: - resolution: {integrity: sha512-ROchNosXMJD2cbQGm84KoP7vOGPO6/bOAW0veMMbzhXLqoZptcaYRVLitwvuhwhjjpU1qP4YZRWLhgETdgqUQw==} + /bson@6.10.1: + resolution: {integrity: sha512-P92xmHDQjSKPLHqFxefqMxASNq/aWJMEZugpCjf+AF/pgcUpMMQCg7t7+ewko0/u8AapvF3luf/FoehddEK+sA==} engines: {node: '>=16.20.1'} dev: false @@ -9240,14 +9245,14 @@ packages: resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} dev: false - /caniuse-lite@1.0.30001687: - resolution: {integrity: sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==} + /caniuse-lite@1.0.30001689: + resolution: {integrity: sha512-CmeR2VBycfa+5/jOfnp/NpWPGd06nf1XYiefUvhXFfZE4GkRc9jv+eGPS4nT558WS/8lYCzV8SlANCIPvbWP1g==} dev: false /capnp-ts@0.7.0: resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} dependencies: - debug: 4.3.5 + debug: 4.4.0 tslib: 2.6.2 transitivePeerDependencies: - supports-color @@ -9353,6 +9358,13 @@ packages: fsevents: 2.3.3 dev: false + /chokidar@4.0.2: + resolution: {integrity: sha512-/b57FK+bblSU+dfewfFe0rT1YjVDfOmeLQwCAuC+vwvgLkXboATqqmy+Ipux6JrF6L5joe5CBnFOw+gLWH6yKg==} + engines: {node: '>= 14.16.0'} + dependencies: + readdirp: 4.0.2 + dev: false + /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} dev: false @@ -10393,6 +10405,10 @@ packages: '@babel/runtime': 7.23.9 dev: false + /date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + dev: false + /dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} dev: false @@ -10444,8 +10460,8 @@ packages: ms: 2.1.2 dev: false - /debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + /debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -10845,8 +10861,8 @@ packages: resolution: {integrity: sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==} dev: false - /dompurify@3.2.2: - resolution: {integrity: sha512-YMM+erhdZ2nkZ4fTNRTSI94mb7VG7uVF5vj5Zde7tImgnhZE3R6YW/IACGIHb2ux+QkEXMhe591N+5jWOmL4Zw==} + /dompurify@3.2.3: + resolution: {integrity: sha512-U1U5Hzc2MO0oW3DF+G9qYN0aT7atAou4AgI0XjWz061nyBPbdxkfdhfy5uMgGn6+oLFCfn44ZGbdDqCzVmlOWA==} optionalDependencies: '@types/trusted-types': 2.0.7 dev: false @@ -11111,8 +11127,8 @@ packages: resolution: {integrity: sha512-R1CccCDYqndR25CaXFd6hp/u9RaaMcftMkphmvuepXr5b1vfLkRml6aWVeBhXJ7rbevHkKEMJtz8XqPf7ffmew==} dev: false - /electron-to-chromium@1.5.71: - resolution: {integrity: sha512-dB68l59BI75W1BUGVTAEJy45CEVuEGy9qPVVQ8pnHyHMn36PLPPoE1mjLH+lo9rKulO3HC2OhbACI/8tCqJBcA==} + /electron-to-chromium@1.5.74: + resolution: {integrity: sha512-ck3//9RC+6oss/1Bh9tiAVFy5vfSKbRHAFh7Z3/eTRkEqJeWgymloShB17Vg3Z4nmDNp35vAd1BZ6CMW4Wt6Iw==} dev: false /electron-updater@6.3.4: @@ -12308,7 +12324,7 @@ packages: engines: {node: '>= 10.17.0'} hasBin: true dependencies: - debug: 4.3.7 + debug: 4.4.0 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -12489,16 +12505,6 @@ packages: token-types: 4.2.1 dev: false - /file-type@19.6.0: - resolution: {integrity: sha512-VZR5I7k5wkD0HgFnMsq5hOsSc710MJMu5Nc5QYsbe38NN5iPV/XTObYLc/cpttRTf6lX538+5uO1ZQRhYibiZQ==} - engines: {node: '>=18'} - dependencies: - get-stream: 9.0.1 - strtok3: 9.1.1 - token-types: 6.0.0 - uint8array-extras: 1.4.0 - dev: false - /filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} dependencies: @@ -12920,14 +12926,6 @@ packages: engines: {node: '>=10'} dev: false - /get-stream@9.0.1: - resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} - engines: {node: '>=18'} - dependencies: - '@sec-ant/readable-stream': 0.4.1 - is-stream: 4.0.1 - dev: false - /get-symbol-description@1.0.2: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} @@ -13052,6 +13050,11 @@ packages: type-fest: 0.20.2 dev: false + /globals@15.13.0: + resolution: {integrity: sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==} + engines: {node: '>=18'} + dev: false + /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} @@ -14109,11 +14112,6 @@ packages: engines: {node: '>=8'} dev: false - /is-stream@4.0.1: - resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} - engines: {node: '>=18'} - dev: false - /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} @@ -14297,6 +14295,10 @@ packages: resolution: {integrity: sha512-mK3ReOt4ARAGy0V0J7uHmArG2USN2x0zprZ+u+YgmeRjXTDbaowDy3kPcsmQY6tH+uHhDgpWit9Vqmv/4rTXwA==} dev: false + /itty-time@1.0.6: + resolution: {integrity: sha512-+P8IZaLLBtFv8hCkIjcymZOp4UJ+xW6bSlQsXGqrkmJh7vSiMFSlNne0mCYagEE0N7HDNR5jJBRxwN0oYv61Rw==} + dev: false + /jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} dependencies: @@ -14977,6 +14979,10 @@ packages: setimmediate: 1.0.5 dev: false + /just-clone@6.2.0: + resolution: {integrity: sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA==} + dev: false + /jwa@1.4.1: resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} dependencies: @@ -15012,8 +15018,8 @@ packages: engines: {node: '>= 0.4.0'} dev: false - /katex@0.16.11: - resolution: {integrity: sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ==} + /katex@0.16.15: + resolution: {integrity: sha512-yE9YJIEAk2aZ+FL/G8r+UGw0CTUzEA8ZFy6E+8tc3spHUKq3qBnzCkI1CQwGoI9atJhVyFPEypQsTY7mJ1Pi9w==} hasBin: true dependencies: commander: 8.3.0 @@ -15874,7 +15880,7 @@ packages: resolution: {integrity: sha512-Mb01JT/x6CKDWaxigwfZYuYmDZ6xtrNwNlidKZwkSrDaY9n90tdrJTV5Umk+wP1fZscGptmKFXHsXMDEVZ+Q6A==} dependencies: '@braintree/sanitize-url': 7.1.0 - '@iconify/utils': 2.1.33 + '@iconify/utils': 2.2.1 '@mermaid-js/parser': 0.3.0 '@types/d3': 7.4.3 cytoscape: 3.30.4 @@ -15884,8 +15890,8 @@ packages: d3-sankey: 0.12.3 dagre-d3-es: 7.0.11 dayjs: 1.11.13 - dompurify: 3.2.2 - katex: 0.16.11 + dompurify: 3.2.3 + katex: 0.16.15 khroma: 2.1.0 lodash-es: 4.17.21 marked: 13.0.3 @@ -15988,8 +15994,8 @@ packages: webpack: 5.97.1(esbuild@0.20.1)(webpack-cli@5.1.4) dev: false - /miniflare@3.20240925.1(bufferutil@4.0.8)(utf-8-validate@6.0.4): - resolution: {integrity: sha512-odavnAwWLevMWOi/efIdAI9AVlg8C8NfXe2YLoAeG+Fj5BDHPDxCoY7AjZvBj3CJ7bszkoYyhoPEH60X+Vk+7g==} + /miniflare@3.20241205.0(bufferutil@4.0.8)(utf-8-validate@6.0.4): + resolution: {integrity: sha512-Z0cTtIf6ZrcAJ3SrOI9EUM3s4dkGhNeU6Ubl8sroYhsPVD+rtz3m5+p6McHFWCkcMff1o60X5XEKVTmkz0gbpA==} engines: {node: '>=16.13'} hasBin: true dependencies: @@ -16001,7 +16007,7 @@ packages: glob-to-regexp: 0.4.1 stoppable: 1.1.0 undici: 5.28.4 - workerd: 1.20240925.0 + workerd: 1.20241205.0 ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) youch: 3.3.4 zod: 3.23.8 @@ -16187,12 +16193,12 @@ packages: whatwg-url: 13.0.0 dev: false - /mongodb@6.10.0: - resolution: {integrity: sha512-gP9vduuYWb9ZkDM546M+MP2qKVk5ZG2wPF63OvSRuUbqCR+11ZCAE1mOfllhlAG0wcoJY5yDL/rV3OmYEwXIzg==} + /mongodb@6.12.0: + resolution: {integrity: sha512-RM7AHlvYfS7jv7+BXund/kR64DryVI+cHbVAy9P61fnb1RcWZqOW1/Wj2YhqMCx+MuYhqTRGv7AwHBzmsCKBfA==} engines: {node: '>=16.20.1'} peerDependencies: '@aws-sdk/credential-providers': ^3.188.0 - '@mongodb-js/zstd': ^1.1.0 + '@mongodb-js/zstd': ^1.1.0 || ^2.0.0 gcp-metadata: ^5.2.0 kerberos: ^2.0.1 mongodb-client-encryption: '>=6.0.0 <7' @@ -16214,8 +16220,8 @@ packages: socks: optional: true dependencies: - '@mongodb-js/saslprep': 1.1.7 - bson: 6.10.0 + '@mongodb-js/saslprep': 1.1.9 + bson: 6.10.1 mongodb-connection-string-url: 3.0.0 dev: false @@ -16251,6 +16257,70 @@ packages: mongodb-connection-string-url: 3.0.0 dev: false + /mongodb@6.8.0: + resolution: {integrity: sha512-HGQ9NWDle5WvwMnrvUxsFYPd3JEbqD3RgABHBQRuoCEND0qzhsd0iH5ypHsf1eJ+sXmvmyKpP+FLOKY8Il7jMw==} + engines: {node: '>=16.20.1'} + peerDependencies: + '@aws-sdk/credential-providers': ^3.188.0 + '@mongodb-js/zstd': ^1.1.0 + gcp-metadata: ^5.2.0 + kerberos: ^2.0.1 + mongodb-client-encryption: '>=6.0.0 <7' + snappy: ^7.2.2 + socks: ^2.7.1 + peerDependenciesMeta: + '@aws-sdk/credential-providers': + optional: true + '@mongodb-js/zstd': + optional: true + gcp-metadata: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + socks: + optional: true + dependencies: + '@mongodb-js/saslprep': 1.1.7 + bson: 6.8.0 + mongodb-connection-string-url: 3.0.0 + dev: false + + /mongodb@6.9.0-dev.20241016.sha.3d5bd513: + resolution: {integrity: sha512-O1rrjh8BZuPXJOwistKE1OqA9Ou34P7+xO22uL26H7SOYSetezSKBt+IJeXTc5gelHPM25GI6Y3ydLG3ERfpLw==} + engines: {node: '>=16.20.1'} + peerDependencies: + '@aws-sdk/credential-providers': ^3.188.0 + '@mongodb-js/zstd': ^1.1.0 + gcp-metadata: ^5.2.0 + kerberos: ^2.0.1 + mongodb-client-encryption: '>=6.0.0 <7' + snappy: ^7.2.2 + socks: ^2.7.1 + peerDependenciesMeta: + '@aws-sdk/credential-providers': + optional: true + '@mongodb-js/zstd': + optional: true + gcp-metadata: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + socks: + optional: true + dependencies: + '@mongodb-js/saslprep': 1.1.7 + bson: 6.8.0 + mongodb-connection-string-url: 3.0.0 + dev: false + /monitor-event-loop-delay@1.0.0: resolution: {integrity: sha512-YRIr1exCIfBDLZle8WHOfSo7Xg3M+phcZfq9Fx1L6Abo+atGp7cge5pM7PjyBn4s1oZI/BRD4EMrzQBbPpVb5Q==} dev: false @@ -16511,6 +16581,10 @@ packages: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} dev: false + /node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + dev: false + /nopt@1.0.10: resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} hasBin: true @@ -17038,8 +17112,8 @@ packages: resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} dev: false - /package-manager-detector@0.2.6: - resolution: {integrity: sha512-9vPH3qooBlYRJdmdYP00nvjZOulm40r5dhtal8st18ctf+6S1k7pi5yIHLvI4w5D70x0Y+xdVD9qITH0QO/A8A==} + /package-manager-detector@0.2.7: + resolution: {integrity: sha512-g4+387DXDKlZzHkP+9FLt8yKj8+/3tOkPv7DVTJGGRm00RkEWgqbFstX1mXJ4M0VDYhUqsTOiISqNOJnhAu3PQ==} dev: false /pako@1.0.11: @@ -17279,11 +17353,6 @@ packages: engines: {node: '>=8'} dev: false - /peek-readable@5.3.1: - resolution: {integrity: sha512-GVlENSDW6KHaXcd9zkZltB7tCLosKB/4Hg0fqBJkAoBgYG2Tn1xtMgXtSUuMU9AK/gCm/tTdT8mgAeF4YNeeqw==} - engines: {node: '>=14.16'} - dev: false - /pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} dev: false @@ -17479,18 +17548,18 @@ packages: find-up: 3.0.0 dev: false - /playwright-core@1.48.2: - resolution: {integrity: sha512-sjjw+qrLFlriJo64du+EK0kJgZzoQPsabGF4lBvsid+3CNIZIYLgnMj9V6JY5VhM2Peh20DJWIVpVljLLnlawA==} + /playwright-core@1.49.1: + resolution: {integrity: sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==} engines: {node: '>=18'} hasBin: true dev: false - /playwright@1.48.2: - resolution: {integrity: sha512-NjYvYgp4BPmiwfe31j4gHLa3J7bD2WiBz8Lk2RoSsmX38SVIARZ18VYjxLjAcDsAhA+F4iSEXTSGgjua0rrlgQ==} + /playwright@1.49.1: + resolution: {integrity: sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==} engines: {node: '>=18'} hasBin: true dependencies: - playwright-core: 1.48.2 + playwright-core: 1.49.1 optionalDependencies: fsevents: 2.3.2 dev: false @@ -17762,6 +17831,16 @@ packages: svelte: 4.2.11 dev: false + /prettier-plugin-svelte@3.2.2(prettier@3.2.5)(svelte@4.2.12): + resolution: {integrity: sha512-ZzzE/wMuf48/1+Lf2Ffko0uDa6pyCfgHV6+uAhtg2U0AAXGrhCSW88vEJNAkAxW5qyrFY1y1zZ4J8TgHrjW++Q==} + peerDependencies: + prettier: ^3.0.0 + svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + dependencies: + prettier: 3.2.5 + svelte: 4.2.12 + dev: false + /prettier-plugin-svelte@3.2.2(prettier@3.2.5)(svelte@4.2.19): resolution: {integrity: sha512-ZzzE/wMuf48/1+Lf2Ffko0uDa6pyCfgHV6+uAhtg2U0AAXGrhCSW88vEJNAkAxW5qyrFY1y1zZ4J8TgHrjW++Q==} peerDependencies: @@ -18286,6 +18365,11 @@ packages: picomatch: 2.3.1 dev: false + /readdirp@4.0.2: + resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} + engines: {node: '>= 14.16.0'} + dev: false + /real-cancellable-promise@1.2.0: resolution: {integrity: sha512-FYhmx1FVSgoPRjneoTjh+EKZcNb8ijl/dyatTzase5eujYhVrLNDOiIY6AgQq7GU1kOoLgEd9jLVbhFg8k8dOQ==} dev: false @@ -19595,14 +19679,6 @@ packages: peek-readable: 4.1.0 dev: false - /strtok3@9.1.1: - resolution: {integrity: sha512-FhwotcEqjr241ZbjFzjlIYg6c5/L/s4yBGWSMvJ9UoExiSqL+FnFA/CaeZx17WGaZMS/4SOZp8wH18jSS4R4lw==} - engines: {node: '>=16'} - dependencies: - '@tokenizer/token': 0.3.0 - peek-readable: 5.3.1 - dev: false - /style-loader@3.3.4(webpack@5.97.1): resolution: {integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==} engines: {node: '>= 12.13.0'} @@ -19620,7 +19696,7 @@ packages: resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} engines: {node: '>= 8.0'} dependencies: - debug: 4.3.7 + debug: 4.4.0 transitivePeerDependencies: - supports-color dev: false @@ -19858,6 +19934,26 @@ packages: periscopic: 3.1.0 dev: false + /svelte@4.2.12: + resolution: {integrity: sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug==} + engines: {node: '>=16'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.22 + '@types/estree': 1.0.5 + acorn: 8.11.3 + aria-query: 5.3.0 + axobject-query: 4.0.0 + code-red: 1.0.4 + css-tree: 2.3.1 + estree-walker: 3.0.3 + is-reference: 3.0.2 + locate-character: 3.0.0 + magic-string: 0.30.7 + periscopic: 3.1.0 + dev: false + /svelte@4.2.19: resolution: {integrity: sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==} engines: {node: '>=16'} @@ -20119,6 +20215,11 @@ packages: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} dev: false + /to-data-view@2.0.0: + resolution: {integrity: sha512-RGEM5KqlPHr+WVTPmGNAXNeFEmsBnlkxXaIfEpUYV0AST2Z5W1EGq9L/MENFrMMmL2WQr1wjkmZy/M92eKhjYA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -20155,14 +20256,6 @@ packages: ieee754: 1.2.1 dev: false - /token-types@6.0.0: - resolution: {integrity: sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==} - engines: {node: '>=14.16'} - dependencies: - '@tokenizer/token': 0.3.0 - ieee754: 1.2.1 - dev: false - /toposort@2.0.2: resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} dev: false @@ -20690,11 +20783,6 @@ packages: resolution: {integrity: sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==} dev: false - /uint8array-extras@1.4.0: - resolution: {integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==} - engines: {node: '>=18'} - dev: false - /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -20726,10 +20814,11 @@ packages: '@fastify/busboy': 2.1.1 dev: false - /unenv-nightly@2.0.0-20240919-125358-9a64854: - resolution: {integrity: sha512-XjsgUTrTHR7iw+k/SRTNjh6EQgwpC9voygnoCJo5kh4hKqsSDHUW84MhL9EsHTNfLctvVBHaSw8e2k3R2fKXsQ==} + /unenv-nightly@2.0.0-20241212-153011-af71c96: + resolution: {integrity: sha512-Yugb9yPs/EZsPOY+IHloqVVEcZeJ0uwwViTedsZjOtVeYO8I29B1rzU/p84FMT0R1Ht3bHsKkNV/rzrjSd07QA==} dependencies: defu: 6.1.4 + mlly: 1.7.3 ohash: 1.1.4 pathe: 1.1.2 ufo: 1.5.4 @@ -20810,13 +20899,13 @@ packages: picocolors: 1.0.1 dev: false - /update-browserslist-db@1.1.1(browserslist@4.24.2): + /update-browserslist-db@1.1.1(browserslist@4.24.3): resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.24.2 + browserslist: 4.24.3 escalade: 3.2.0 picocolors: 1.1.1 dev: false @@ -21092,7 +21181,7 @@ packages: hasBin: true dependencies: '@discoveryjs/json-ext': 0.5.7 - acorn: 8.14.0 + acorn: 8.11.3 acorn-walk: 8.3.2 commander: 7.2.0 debounce: 1.2.1 @@ -21100,7 +21189,7 @@ packages: gzip-size: 6.0.0 html-escaper: 2.0.2 opener: 1.5.2 - picocolors: 1.1.1 + picocolors: 1.0.1 sirv: 2.0.4 ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@6.0.4) transitivePeerDependencies: @@ -21246,7 +21335,7 @@ packages: '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.14.0 - browserslist: 4.24.2 + browserslist: 4.24.3 chrome-trace-event: 1.0.3 enhanced-resolve: 5.17.1 es-module-lexer: 1.4.1 @@ -21469,46 +21558,46 @@ packages: winston-transport: 4.7.1 dev: false - /workerd@1.20240925.0: - resolution: {integrity: sha512-/Jj6+yLwfieZGEt3Kx4+5MoufuC3g/8iFaIh4MPBNGJOGYmdSKXvgCqz09m2+tVCYnysRfbq2zcbVxJRBfOCqQ==} + /workerd@1.20241205.0: + resolution: {integrity: sha512-vso/2n0c5SdBDWiD+Sx5gM7unA6SiZXRVUHDqH1euoP/9mFVHZF8icoYsNLB87b/TX8zNgpae+I5N/xFpd9v0g==} engines: {node: '>=16'} hasBin: true requiresBuild: true optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20240925.0 - '@cloudflare/workerd-darwin-arm64': 1.20240925.0 - '@cloudflare/workerd-linux-64': 1.20240925.0 - '@cloudflare/workerd-linux-arm64': 1.20240925.0 - '@cloudflare/workerd-windows-64': 1.20240925.0 + '@cloudflare/workerd-darwin-64': 1.20241205.0 + '@cloudflare/workerd-darwin-arm64': 1.20241205.0 + '@cloudflare/workerd-linux-64': 1.20241205.0 + '@cloudflare/workerd-linux-arm64': 1.20241205.0 + '@cloudflare/workerd-windows-64': 1.20241205.0 dev: false - /wrangler@3.80.2(@cloudflare/workers-types@4.20241004.0)(bufferutil@4.0.8)(utf-8-validate@6.0.4): - resolution: {integrity: sha512-WSMDXoNcg+DjZ4i0RMJpz2TKrCbTtsxNsQAwyYg7LRZlfmTZQZOPbHWhATVa4fCsNL6eElN050fMHOW9MptM9g==} + /wrangler@3.97.0(@cloudflare/workers-types@4.20241022.0)(bufferutil@4.0.8)(utf-8-validate@6.0.4): + resolution: {integrity: sha512-NkFAigqZWe4NOK0gYROcpvdugaYJE/JRFrIZ+c5Q5/uie+25WH8OVbRvvmiXhWVhso56cZs2W2TPmAxT/sgHkw==} engines: {node: '>=16.17.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20240925.0 + '@cloudflare/workers-types': ^4.20241205.0 peerDependenciesMeta: '@cloudflare/workers-types': optional: true dependencies: '@cloudflare/kv-asset-handler': 0.3.4 - '@cloudflare/workers-shared': 0.5.4 - '@cloudflare/workers-types': 4.20241004.0 + '@cloudflare/workers-types': 4.20241022.0 '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) '@esbuild-plugins/node-modules-polyfill': 0.2.2(esbuild@0.17.19) blake3-wasm: 2.1.5 - chokidar: 3.6.0 + chokidar: 4.0.2 + date-fns: 4.1.0 esbuild: 0.17.19 - miniflare: 3.20240925.1(bufferutil@4.0.8)(utf-8-validate@6.0.4) + itty-time: 1.0.6 + miniflare: 3.20241205.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) nanoid: 3.3.7 path-to-regexp: 6.3.0 resolve: 1.22.8 - resolve.exports: 2.0.2 selfsigned: 2.4.1 source-map: 0.6.1 - unenv: /unenv-nightly@2.0.0-20240919-125358-9a64854 - workerd: 1.20240925.0 + unenv: /unenv-nightly@2.0.0-20241212-153011-af71c96 + workerd: 1.20241205.0 xxhash-wasm: 1.0.2 optionalDependencies: fsevents: 2.3.3 @@ -21909,7 +21998,7 @@ packages: koa-bodyparser: 4.4.1 koa-morgan: 1.0.1 koa-router: 12.0.1 - mongodb: 6.10.0 + mongodb: 6.12.0 prettier: 3.2.5 ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) ts-node: 10.9.2(@types/node@20.11.19)(typescript@5.3.3) @@ -21939,7 +22028,10 @@ packages: version: 0.0.0 dependencies: '@types/jest': 29.5.12 + '@types/node-fetch': 2.6.11 '@types/otp-generator': 4.0.2 + '@types/pg': 8.11.6 + '@types/ws': 8.5.11 '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) eslint: 8.56.0 @@ -21948,8 +22040,10 @@ packages: eslint-plugin-n: 15.7.0(eslint@8.56.0) eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) - mongodb: 6.10.0 + mongodb: 6.12.0 + node-fetch: 2.7.0 otp-generator: 4.0.1 + pg: 8.12.0 postgres: 3.4.5 prettier: 3.2.5 ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) @@ -22065,6 +22159,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -22304,6 +22399,7 @@ packages: name: '@rush-temp/analytics' version: 0.0.0 dependencies: + '@sentry/node': 7.118.0 '@types/jest': 29.5.12 '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) @@ -22314,9 +22410,12 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) simplytyped: 3.3.0(typescript@5.3.3) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 + winston: 3.13.1 + winston-daily-rotate-file: 5.0.0(winston@3.13.1) transitivePeerDependencies: - '@babel/core' - '@jest/types' @@ -22351,7 +22450,6 @@ packages: ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.6.2) ts-node: 10.9.2(@types/node@20.11.19)(typescript@5.6.2) typescript: 5.6.2 - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) optionalDependencies: ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) transitivePeerDependencies: @@ -22461,6 +22559,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -22486,6 +22585,7 @@ packages: '@types/koa-passport': 6.0.3 '@types/koa-router': 7.4.8 '@types/koa-session': 6.4.5 + '@types/node-fetch': 2.6.11 '@types/passport-github2': 1.2.9 '@types/passport-google-oauth20': 2.0.14 '@types/querystringify': 2.0.2 @@ -22502,12 +22602,13 @@ packages: koa-passport: 6.0.0 koa-router: 12.0.1 koa-session: 6.4.0 - mongodb: 6.10.0 + mongodb: 6.12.0 openid-client: 5.7.0 passport-custom: 1.1.1 passport-github2: 0.1.12 passport-google-oauth20: 2.0.0 prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) querystringify: 2.2.0 ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 @@ -22660,6 +22761,7 @@ packages: fast-equals: 5.0.1 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) qs: 6.11.2 ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 @@ -22767,6 +22869,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -22876,6 +22979,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -22938,6 +23042,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) eslint-plugin-svelte: 2.35.1(eslint@8.56.0)(svelte@4.2.19)(ts-node@10.9.2) fast-equals: 5.0.1 + html-to-text: 9.0.5 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 prettier-plugin-svelte: 3.2.2(prettier@3.2.5)(svelte@4.2.19) @@ -22985,6 +23090,7 @@ packages: fast-equals: 5.0.1 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -23015,6 +23121,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -23045,6 +23152,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -23060,12 +23168,12 @@ packages: dev: false file:projects/cloud-branding.tgz(@types/node@20.11.19)(bufferutil@4.0.8)(esbuild@0.20.1)(ts-node@10.9.2)(utf-8-validate@6.0.4): - resolution: {integrity: sha512-f1NgjqZw48X0+O4cblNzjU8SeW4RYnvaMvYNFyN+eKbqTDHI1N97+q5f2OoDgRonvaZa+CXMETNFXMSkniWwyA==, tarball: file:projects/cloud-branding.tgz} + resolution: {integrity: sha512-Hpflh3O2Q4Tcw/Z0MsvUaqaXxYSSf2ATsXr25NLz+p0wSuqEAjruzZ+7Qvqa0lV/qPEdOvsWxQv/ASyQUSOvSg==, tarball: file:projects/cloud-branding.tgz} id: file:projects/cloud-branding.tgz name: '@rush-temp/cloud-branding' version: 0.0.0 dependencies: - '@cloudflare/workers-types': 4.20241004.0 + '@cloudflare/workers-types': 4.20241022.0 '@types/jest': 29.5.12 '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.6.2) '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.6.2) @@ -23079,7 +23187,7 @@ packages: prettier: 3.2.5 ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.6.2) typescript: 5.6.2 - wrangler: 3.80.2(@cloudflare/workers-types@4.20241004.0)(bufferutil@4.0.8)(utf-8-validate@6.0.4) + wrangler: 3.97.0(@cloudflare/workers-types@4.20241022.0)(bufferutil@4.0.8)(utf-8-validate@6.0.4) transitivePeerDependencies: - '@babel/core' - '@jest/types' @@ -23095,16 +23203,17 @@ packages: dev: false file:projects/cloud-datalake.tgz(@types/node@20.11.19)(bufferutil@4.0.8)(esbuild@0.20.1)(ts-node@10.9.2)(utf-8-validate@6.0.4): - resolution: {integrity: sha512-4xq66fA2IsBhSePKZhWWfD1oCMF7eavO8dkefUDupGqhNUr/gv+4zPrsvoJZ2x5ZozqNvBHzbDQQeIuxg1uxNQ==, tarball: file:projects/cloud-datalake.tgz} + resolution: {integrity: sha512-pOjup2gTfDH4Qq9r4LTeVnf+nDQvlTSUOxLtT+bKnrHM0jQQ705v6wYtmkpWD7CtEwwCvS9CH+iPZwB5ZNpzqQ==, tarball: file:projects/cloud-datalake.tgz} id: file:projects/cloud-datalake.tgz name: '@rush-temp/cloud-datalake' version: 0.0.0 dependencies: - '@cloudflare/workers-types': 4.20241004.0 + '@cloudflare/workers-types': 4.20241022.0 '@types/jest': 29.5.12 '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.6.2) '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.6.2) aws4fetch: 1.0.20 + base32-encode: 2.0.0 eslint: 8.56.0 eslint-config-standard-with-typescript: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0)(eslint-plugin-import@2.29.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.56.0)(typescript@5.6.2) eslint-plugin-import: 2.29.1(eslint@8.56.0) @@ -23116,7 +23225,7 @@ packages: prettier: 3.2.5 ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.6.2) typescript: 5.6.2 - wrangler: 3.80.2(@cloudflare/workers-types@4.20241004.0)(bufferutil@4.0.8)(utf-8-validate@6.0.4) + wrangler: 3.97.0(@cloudflare/workers-types@4.20241022.0)(bufferutil@4.0.8)(utf-8-validate@6.0.4) transitivePeerDependencies: - '@babel/core' - '@jest/types' @@ -23131,6 +23240,41 @@ packages: - utf-8-validate dev: false + file:projects/cloud-transactor.tgz(@types/node@20.11.19)(bufferutil@4.0.8)(ts-node@10.9.2)(utf-8-validate@6.0.4): + resolution: {integrity: sha512-dYN7I4ei32v5+ZpPJJ9SW/6jeYqG/EWXo4rJbiDoeeVsFEXwErxNhNV/XWvCMplrpT/1H18WX9euR/Y6Z8DmUw==, tarball: file:projects/cloud-transactor.tgz} + id: file:projects/cloud-transactor.tgz + name: '@rush-temp/cloud-transactor' + version: 0.0.0 + dependencies: + '@cloudflare/workers-types': 4.20241022.0 + '@types/jest': 29.5.12 + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.6.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.6.2) + esbuild: 0.20.1 + eslint: 8.56.0 + eslint-config-standard-with-typescript: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0)(eslint-plugin-import@2.29.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.56.0)(typescript@5.6.2) + eslint-plugin-import: 2.29.1(eslint@8.56.0) + eslint-plugin-n: 15.7.0(eslint@8.56.0) + eslint-plugin-promise: 6.1.1(eslint@8.56.0) + itty-router: 5.0.18 + jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) + prettier: 3.2.5 + ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.6.2) + typescript: 5.6.2 + wrangler: 3.97.0(@cloudflare/workers-types@4.20241022.0)(bufferutil@4.0.8)(utf-8-validate@6.0.4) + transitivePeerDependencies: + - '@babel/core' + - '@jest/types' + - '@types/node' + - babel-jest + - babel-plugin-macros + - bufferutil + - node-notifier + - supports-color + - ts-node + - utf-8-validate + dev: false + file:projects/collaboration.tgz(esbuild@0.20.1)(ts-node@10.9.2): resolution: {integrity: sha512-aJ4uMSpM7IB3wgrjVKYm4jR3IeBYSaFvYZZFjxkriMD1fAxvjr/WpKUWxQy0q2x3gZb4SoGLoiX2d2qj2/hdhA==, tarball: file:projects/collaboration.tgz} id: file:projects/collaboration.tgz @@ -23226,7 +23370,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) express: 4.19.2 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) - mongodb: 6.10.0 + mongodb: 6.12.0 prettier: 3.2.5 ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) ts-node: 10.9.2(@types/node@20.11.19)(typescript@5.3.3) @@ -23353,6 +23497,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -23497,7 +23642,9 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) fast-equals: 5.0.1 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) + just-clone: 6.2.0 prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) simplytyped: 3.3.0(typescript@5.3.3) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 @@ -23820,6 +23967,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -23881,6 +24029,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) eslint-plugin-svelte: 2.35.1(eslint@8.56.0)(svelte@4.2.19)(ts-node@10.9.2) fast-equals: 5.0.1 + highlight.js: 11.8.0 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 prettier-plugin-svelte: 3.2.2(prettier@3.2.5)(svelte@4.2.19) @@ -24037,6 +24186,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -24174,6 +24324,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) ts-node: 10.9.2(@types/node@20.11.19)(typescript@5.3.3) typescript: 5.3.3 @@ -24442,6 +24593,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -24549,6 +24701,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -24702,6 +24855,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -24779,6 +24933,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -24798,11 +24953,9 @@ packages: name: '@rush-temp/import-tool' version: 0.0.0 dependencies: - '@types/csvtojson': 2.0.0 '@types/domhandler': 2.4.5 '@types/htmlparser2': 3.10.7 '@types/jest': 29.5.12 - '@types/js-yaml': 4.0.9 '@types/mime-types': 2.1.4 '@types/minio': 7.0.18 '@types/node': 20.11.19 @@ -24810,7 +24963,6 @@ packages: '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.6.2) commander: 8.3.0 cross-env: 7.0.3 - csvtojson: 2.0.10 docx4js: 3.2.20 domhandler: 5.0.3 domutils: 3.1.0 @@ -24822,7 +24974,6 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) htmlparser2: 9.1.0 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) - js-yaml: 4.1.0 mammoth: 1.8.0 mime-types: 2.1.35 prettier: 3.2.5 @@ -24847,7 +24998,7 @@ packages: name: '@rush-temp/importer' version: 0.0.0 dependencies: - '@types/csvtojson': 2.0.0 + '@types/csvtojson': 2.0.3 '@types/jest': 29.5.12 '@types/js-yaml': 4.0.9 '@types/mime-types': 2.1.4 @@ -24861,7 +25012,6 @@ packages: eslint-plugin-import: 2.29.1(eslint@8.56.0) eslint-plugin-n: 15.7.0(eslint@8.56.0) eslint-plugin-promise: 6.1.1(eslint@8.56.0) - file-type: 19.6.0 image-size: 1.1.1 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) js-yaml: 4.1.0 @@ -24972,6 +25122,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -25125,6 +25276,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -25234,6 +25386,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -25377,6 +25530,7 @@ packages: fast-equals: 5.0.1 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -26906,6 +27060,7 @@ packages: fast-equals: 5.0.1 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) toposort: 2.0.2 ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 @@ -26931,14 +27086,14 @@ packages: '@types/node': 20.11.19 '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) - bson: 6.10.0 + bson: 6.10.1 eslint: 8.56.0 eslint-config-standard-with-typescript: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0)(eslint-plugin-import@2.29.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.56.0)(typescript@5.3.3) eslint-plugin-import: 2.29.1(eslint@8.56.0) eslint-plugin-n: 15.7.0(eslint@8.56.0) eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) - mongodb: 6.10.0 + mongodb: 6.12.0 prettier: 3.2.5 prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) @@ -27053,6 +27208,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) sass: 1.71.1 ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 @@ -27297,6 +27453,7 @@ packages: intl-messageformat: 9.13.0 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -27336,7 +27493,7 @@ packages: koa: 2.15.3 koa-bodyparser: 4.4.1 koa-router: 12.0.1 - mongodb: 6.10.0 + mongodb: 6.12.0 prettier: 3.2.5 prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) @@ -27389,7 +27546,7 @@ packages: form-data: 4.0.0 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) js-tiktoken: 1.0.14 - mongodb: 6.10.0 + mongodb: 6.12.0 node-fetch: 2.7.0 openai: 4.56.0(zod@3.23.8) prettier: 3.2.5 @@ -27444,7 +27601,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) express: 4.19.2 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) - mongodb: 6.10.0 + mongodb: 6.12.0 prettier: 3.2.5 puppeteer: 22.14.0(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@6.0.4) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) @@ -27537,7 +27694,7 @@ packages: googleapis: 122.0.0 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) jwt-simple: 0.5.6 - mongodb: 6.10.0 + mongodb: 6.12.0 prettier: 3.2.5 ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) ts-node-dev: 2.0.0(@types/node@20.11.19)(typescript@5.3.3) @@ -27646,7 +27803,7 @@ packages: dev: false file:projects/pod-fulltext.tgz: - resolution: {integrity: sha512-TNpmIc39Ot7eD4avFPov9XJHNfcOjSAVFKtWlkkeWSBLte8BdQ2zYC2JZ3+Tb8Dzu1nX01UQm5WvRVWJY78R3A==, tarball: file:projects/pod-fulltext.tgz} + resolution: {integrity: sha512-Z7uFkqt9Xu+vYj2O1Tfv+Iq5tAZF+766ssyXMX7AFpI7PckuU83U/oNzjHobuncGGOm8JBmg8rqusFNeySoWnw==, tarball: file:projects/pod-fulltext.tgz} name: '@rush-temp/pod-fulltext' version: 0.0.0 dependencies: @@ -27746,7 +27903,7 @@ packages: graphql-binding: 2.5.2 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) markdown-it: 14.0.0 - mongodb: 6.10.0 + mongodb: 6.12.0 octokit: 3.2.1 prettier: 3.2.5 smee-client: 1.2.5 @@ -27807,7 +27964,7 @@ packages: googleapis: 122.0.0 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) jwt-simple: 0.5.6 - mongodb: 6.10.0 + mongodb: 6.12.0 prettier: 3.2.5 ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) ts-node-dev: 2.0.0(@types/node@20.11.19)(typescript@5.3.3) @@ -27926,7 +28083,7 @@ packages: dev: false file:projects/pod-server.tgz(utf-8-validate@6.0.4): - resolution: {integrity: sha512-BV8NwL5NYGZtthvNwCy8vAMyZNBjbT8FmzRMaKq40wTer+rQ7T0xDrl96WBsIVsyv60knHY31oXjYkjE4P3M6A==, tarball: file:projects/pod-server.tgz} + resolution: {integrity: sha512-SBX/FJrlhICgnc9p2QmRZAOu0HaFRLgGQ9guLb/N+wQtppZ07B5jaelGU4EDgpNVNLDXhapz7S4F/Cm03KGh0A==, tarball: file:projects/pod-server.tgz} id: file:projects/pod-server.tgz name: '@rush-temp/pod-server' version: 0.0.0 @@ -28035,7 +28192,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) express: 4.19.2 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) - mongodb: 6.10.0 + mongodb: 6.12.0 node-forge: 1.3.1 pdf-lib: 1.17.1 prettier: 3.2.5 @@ -28129,7 +28286,7 @@ packages: express: 4.19.2 htmlparser2: 9.1.0 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) - mongodb: 6.10.0 + mongodb: 6.12.0 node-fetch: 2.7.0 otp-generator: 4.0.1 prettier: 3.2.5 @@ -28176,7 +28333,7 @@ packages: '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) big-integer: 1.6.52 - bson: 6.10.0 + bson: 6.10.1 cors: 2.8.5 dotenv: 16.0.3 esbuild: 0.20.1 @@ -28190,7 +28347,7 @@ packages: jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) jwt-simple: 0.5.6 mime: 3.0.0 - mongodb: 6.10.0 + mongodb: 6.12.0 prettier: 3.2.5 telegram: 2.22.2 ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) @@ -28237,7 +28394,7 @@ packages: eslint-plugin-n: 15.7.0(eslint@8.56.0) eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) - mongodb: 6.10.0 + mongodb: 6.12.0 prettier: 3.2.5 ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) ts-node: 10.9.2(@types/node@20.11.19)(typescript@5.3.3) @@ -28340,6 +28497,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -28372,6 +28530,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) eslint-plugin-svelte: 2.35.1(eslint@8.56.0)(svelte@4.2.19)(ts-node@10.9.2) fast-equals: 5.0.1 + hls.js: 1.5.15 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) png-chunks-extract: 1.0.0 prettier: 3.2.5 @@ -28734,13 +28893,13 @@ packages: version: 0.0.0 dependencies: '@faker-js/faker': 8.4.1 - '@playwright/test': 1.48.2 + '@playwright/test': 1.49.1 '@types/jest': 29.5.12 '@types/node': 20.11.19 '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) - allure-js-commons: 3.0.6(allure-playwright@3.0.6) - allure-playwright: 3.0.6(@playwright/test@1.48.2) + allure-js-commons: 3.0.7(allure-playwright@3.0.7) + allure-playwright: 3.0.7(@playwright/test@1.49.1) cross-env: 7.0.3 dotenv: 16.0.3 eslint: 8.56.0 @@ -28771,6 +28930,7 @@ packages: fast-equals: 5.0.1 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) simplytyped: 3.3.0(typescript@5.3.3) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 @@ -28910,6 +29070,7 @@ packages: jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) lexorank: 1.0.5 prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -29016,6 +29177,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -29111,6 +29273,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -29217,6 +29380,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -29324,6 +29488,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -29384,6 +29549,7 @@ packages: eslint-plugin-n: 15.7.0(eslint@8.56.0) eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) + mongodb: 6.9.0-dev.20241016.sha.3d5bd513 prettier: 3.2.5 ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 @@ -29506,6 +29672,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -29601,6 +29768,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -29662,6 +29830,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -29758,6 +29927,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -29819,6 +29989,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -30241,6 +30412,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -30302,6 +30474,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -30363,6 +30536,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -30456,6 +30630,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -30517,6 +30692,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -30643,6 +30819,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 web-push: 3.6.7 @@ -30690,7 +30867,7 @@ packages: dev: false file:projects/server-pipeline.tgz: - resolution: {integrity: sha512-50gf9y8jte1kaA7D9vna0KaEhb2uiIpr+OtISS/rOwhfFVOBjawnh0nV+AhxJZFm0od20Y6xcU4rPeiHqgM0/Q==, tarball: file:projects/server-pipeline.tgz} + resolution: {integrity: sha512-RoaltZjKRFs7Db3hC8MclyWwIBSHD1lnIK88Cy/tRSj2F3eYUMq3NJCeg3FWz9kPVvCL+F5noOIAmOTaVvwbGQ==, tarball: file:projects/server-pipeline.tgz} name: '@rush-temp/server-pipeline' version: 0.0.0 dependencies: @@ -30770,6 +30947,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -30831,6 +31009,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -30892,6 +31071,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -30989,6 +31169,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -31050,6 +31231,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -31110,7 +31292,9 @@ packages: eslint-plugin-n: 15.7.0(eslint@8.56.0) eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) + mongodb: 6.8.0 prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -31203,6 +31387,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -31300,7 +31485,7 @@ packages: fast-equals: 5.0.1 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) js-yaml: 4.1.0 - mongodb: 6.10.0 + mongodb: 6.12.0 prettier: 3.2.5 ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 @@ -31340,6 +31525,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -31463,6 +31649,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -31675,6 +31862,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -31845,6 +32033,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -32056,6 +32245,8 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) + svelte: 4.2.11 ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -32162,6 +32353,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -32268,6 +32460,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -32374,6 +32567,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -32501,13 +32695,13 @@ packages: version: 0.0.0 dependencies: '@faker-js/faker': 8.4.1 - '@playwright/test': 1.48.2 + '@playwright/test': 1.49.1 '@types/jest': 29.5.12 '@types/node': 20.11.19 '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) - allure-js-commons: 3.0.6(allure-playwright@3.0.6) - allure-playwright: 3.0.6(@playwright/test@1.48.2) + allure-js-commons: 3.0.7(allure-playwright@3.0.7) + allure-playwright: 3.0.7(@playwright/test@1.49.1) cross-env: 7.0.3 dotenv: 16.0.3 eslint: 8.56.0 @@ -32884,6 +33078,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -32928,7 +33123,7 @@ packages: jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) libphonenumber-js: 1.10.56 mime-types: 2.1.35 - mongodb: 6.10.0 + mongodb: 6.12.0 msgpackr: 1.11.0 msgpackr-extract: 3.0.3 postgres: 3.4.5 @@ -33050,6 +33245,7 @@ packages: jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) lexorank: 1.0.5 prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -33194,6 +33390,7 @@ packages: eslint-plugin-svelte: 2.35.1(eslint@8.56.0)(svelte@4.2.19)(ts-node@10.9.2) fast-equals: 5.0.1 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) + just-clone: 6.2.0 prettier: 3.2.5 prettier-plugin-svelte: 3.2.2(prettier@3.2.5)(svelte@4.2.19) sass: 1.71.1 @@ -33316,6 +33513,14 @@ packages: '@types/jest': 29.5.12 '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) + '@uppy/core': 3.13.1 + '@uppy/dashboard': 3.9.1(@uppy/core@3.13.1) + '@uppy/drag-drop': 3.1.1(@uppy/core@3.13.1) + '@uppy/progress-bar': 3.1.1(@uppy/core@3.13.1) + '@uppy/screen-capture': 3.2.0(@uppy/core@3.13.1) + '@uppy/status-bar': 3.3.3(@uppy/core@3.13.1) + '@uppy/webcam': 3.4.2(@uppy/core@3.13.1) + '@uppy/xhr-upload': 3.6.8(@uppy/core@3.13.1) eslint: 8.56.0 eslint-config-standard-with-typescript: 40.0.0(@typescript-eslint/eslint-plugin@6.21.0)(eslint-plugin-import@2.29.1)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.56.0)(typescript@5.3.3) eslint-plugin-import: 2.29.1(eslint@8.56.0) @@ -33323,6 +33528,8 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.2(prettier@3.2.5)(svelte@4.2.12) + svelte: 4.2.12 ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -33431,6 +33638,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -33538,6 +33746,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + prettier-plugin-svelte: 3.2.1(prettier@3.2.5)(svelte@4.2.11) ts-jest: 29.1.2(esbuild@0.20.1)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -33553,7 +33762,7 @@ packages: dev: false file:projects/workspace-service.tgz: - resolution: {integrity: sha512-7P19Ne6kBgSWVRGT7HdgeWYJRR9HzkvyZXajJtEoHG+1OmWJPjBWV1w92EPQ3j1VDh90GFQK8ru89Kof58Oxag==, tarball: file:projects/workspace-service.tgz} + resolution: {integrity: sha512-IR3/iTBvQghKkF9qL3ZBgdRhW+64Za+lK4MInjR3mNXC5ausFY9KpqhnS2lcFbguSQv1oiXOPX3wQEEEcIcuQg==, tarball: file:projects/workspace-service.tgz} name: '@rush-temp/workspace-service' version: 0.0.0 dependencies: diff --git a/dev/docker-compose.yaml b/dev/docker-compose.yaml index 46a6de2915..d3f260117c 100644 --- a/dev/docker-compose.yaml +++ b/dev/docker-compose.yaml @@ -22,6 +22,8 @@ services: postgres: image: postgres container_name: postgres + extra_hosts: + - "host.docker.internal:host-gateway" environment: - POSTGRES_PASSWORD=example volumes: diff --git a/dev/prod/package.json b/dev/prod/package.json index 224bc389b3..667eb80511 100644 --- a/dev/prod/package.json +++ b/dev/prod/package.json @@ -10,6 +10,7 @@ "analyze": "rm -rf ./dist && cross-env NODE_ENV=production webpack --profile --json > stats.json", "show": "webpack-bundle-analyzer stats.json dist", "dev-server": "cross-env USE_CACHE=false CLIENT_TYPE=dev-server webpack serve", + "dev-worker": "cross-env USE_CACHE=false CLIENT_TYPE=dev-worker webpack serve", "dev-server-cache": "cross-env USE_CACHE=true CLIENT_TYPE=dev-server webpack serve", "tunnel-qms": "socat tcp-listen:8081,reuseaddr,fork,bind=localhost tcp:localhost:8080", "dev-production": "cross-env CLIENT_TYPE=dev-production webpack serve", diff --git a/dev/prod/public/config-worker.json b/dev/prod/public/config-worker.json new file mode 100644 index 0000000000..a40ff62ca1 --- /dev/null +++ b/dev/prod/public/config-worker.json @@ -0,0 +1,53 @@ +{ + "ACCOUNTS_URL": "https://account.hc.engineering/", + + "AI_URL": "https://ai.hc.engineering", + + "ANALYTICS_COLLECTOR_URL": "https://collector.hc.engineering", + + "BRANDING_URL": "https://front.hc.engineering/stage-branding_v2.json", + + "CALENDAR_URL": "https://calendar.hc.engineering/", + + "COLLABORATOR_URL": "wss://collaborator.hc.engineering", + + "DESKTOP_UPDATES_CHANNEL": "front", + + "FILES_URL": "https://dl.hc.engineering/blob/:workspace/:blobId", + + "GITHUB_APP": "huly-github-staging", + + "GITHUB_CLIENTID": "Iv1.cd9d3f7987474b5e" , + + "GITHUB_URL": "https://github.hc.engineering", + + "GMAIL_URL": "https://gmail.hc.engineering/" , + + "INTERCOM_API_URL": "", + + "INTERCOM_APP_ID": "", + + "LOVE_ENDPOINT": "https://love.hc.engineering/", + + "MODEL_VERSION": "", + + "PREVIEW_CONFIG": "https://dl.hc.engineering/image/fit=scale-down,width=:size/:workspace/:blobId", + + "PRINT_URL": "https://print.hc.engineering", + + "REKONI_URL": "https://rekoni.hc.engineering", + + "SIGN_URL": "https://sign.hc.engineering", + + "STATS_URL": "https://stats.hc.engineering", + + "TELEGRAM_BOT_URL": "https://telegram-bot.hc.engineering", + + "TELEGRAM_URL": "https://telegram.hc.engineering", + + "UPLOAD_CONFIG": "", + + "UPLOAD_URL": "https://dl.hc.engineering/upload/form-data/:workspace", + "USE_BINARY_PROTOCOL": false, + "TRANSACTOR_OVERRIDE": "wss://cloud-transactor.andrey-47f.workers.dev" +} \ No newline at end of file diff --git a/dev/prod/src/platform.ts b/dev/prod/src/platform.ts index e4d7992db2..638bd37f9f 100644 --- a/dev/prod/src/platform.ts +++ b/dev/prod/src/platform.ts @@ -16,12 +16,17 @@ import platform, { type Plugin, addLocation, addStringsLoader, platformId } from '@hcengineering/platform' import { activityId } from '@hcengineering/activity' +import aiBot, { aiBotId } from '@hcengineering/ai-bot' +import analyticsCollector, { analyticsCollectorId } from '@hcengineering/analytics-collector' import { attachmentId } from '@hcengineering/attachment' import { boardId } from '@hcengineering/board' import calendar, { calendarId } from '@hcengineering/calendar' import { chunterId } from '@hcengineering/chunter' import client, { clientId } from '@hcengineering/client' import contactPlugin, { contactId } from '@hcengineering/contact' +import { documentsId } from '@hcengineering/controlled-documents' +import { desktopPreferencesId } from '@hcengineering/desktop-preferences' +import { diffviewId } from '@hcengineering/diffview' import { documentId } from '@hcengineering/document' import { driveId } from '@hcengineering/drive' import gmail, { gmailId } from '@hcengineering/gmail' @@ -31,47 +36,46 @@ import { imageCropperId } from '@hcengineering/image-cropper' import { inventoryId } from '@hcengineering/inventory' import { leadId } from '@hcengineering/lead' import login, { loginId } from '@hcengineering/login' +import love, { loveId } from '@hcengineering/love' import notification, { notificationId } from '@hcengineering/notification' import onboard, { onboardId } from '@hcengineering/onboard' +import print, { printId } from '@hcengineering/print' +import { productsId } from '@hcengineering/products' +import { questionsId } from '@hcengineering/questions' import { recruitId } from '@hcengineering/recruit' import rekoni from '@hcengineering/rekoni' import { requestId } from '@hcengineering/request' import { settingId } from '@hcengineering/setting' +import sign from '@hcengineering/sign' import { supportId } from '@hcengineering/support' import { tagsId } from '@hcengineering/tags' import { taskId } from '@hcengineering/task' import telegram, { telegramId } from '@hcengineering/telegram' import { templatesId } from '@hcengineering/templates' +import textEditor, { textEditorId } from '@hcengineering/text-editor' import { timeId } from '@hcengineering/time' import tracker, { trackerId } from '@hcengineering/tracker' +import { trainingId } from '@hcengineering/training' import uiPlugin from '@hcengineering/ui' +import { uploaderId } from '@hcengineering/uploader' import { viewId } from '@hcengineering/view' import workbench, { workbenchId } from '@hcengineering/workbench' -import love, { loveId } from '@hcengineering/love' -import print, { printId } from '@hcengineering/print' -import sign from '@hcengineering/sign' -import { desktopPreferencesId } from '@hcengineering/desktop-preferences' -import { diffviewId } from '@hcengineering/diffview' -import { productsId } from '@hcengineering/products' -import { questionsId } from '@hcengineering/questions' -import { trainingId } from '@hcengineering/training' -import { documentsId } from '@hcengineering/controlled-documents' -import textEditor, { textEditorId } from '@hcengineering/text-editor' -import analyticsCollector, {analyticsCollectorId} from '@hcengineering/analytics-collector' -import { uploaderId } from '@hcengineering/uploader' -import aiBot, { aiBotId } from '@hcengineering/ai-bot' import { testManagementId } from '@hcengineering/test-management' import { surveyId } from '@hcengineering/survey' import { bitrixId } from '@hcengineering/bitrix' import '@hcengineering/activity-assets' +import '@hcengineering/analytics-collector-assets' import '@hcengineering/attachment-assets' import '@hcengineering/bitrix-assets' import '@hcengineering/board-assets' import '@hcengineering/calendar-assets' import '@hcengineering/chunter-assets' import '@hcengineering/contact-assets' +import '@hcengineering/controlled-documents-assets' +import '@hcengineering/desktop-preferences-assets' +import '@hcengineering/diffview-assets' import '@hcengineering/document-assets' import '@hcengineering/drive-assets' import '@hcengineering/gmail-assets' @@ -80,8 +84,12 @@ import '@hcengineering/hr-assets' import '@hcengineering/inventory-assets' import '@hcengineering/lead-assets' import '@hcengineering/login-assets' +import '@hcengineering/love-assets' import '@hcengineering/notification-assets' import '@hcengineering/preference-assets' +import '@hcengineering/print-assets' +import '@hcengineering/products-assets' +import '@hcengineering/questions-assets' import '@hcengineering/recruit-assets' import '@hcengineering/request-assets' import '@hcengineering/setting-assets' @@ -90,21 +98,13 @@ import '@hcengineering/tags-assets' import '@hcengineering/task-assets' import '@hcengineering/telegram-assets' import '@hcengineering/templates-assets' +import '@hcengineering/text-editor-assets' import '@hcengineering/time-assets' import '@hcengineering/tracker-assets' +import '@hcengineering/training-assets' +import '@hcengineering/uploader-assets' import '@hcengineering/view-assets' import '@hcengineering/workbench-assets' -import '@hcengineering/love-assets' -import '@hcengineering/print-assets' -import '@hcengineering/desktop-preferences-assets' -import '@hcengineering/diffview-assets' -import '@hcengineering/questions-assets' -import '@hcengineering/training-assets' -import '@hcengineering/products-assets' -import '@hcengineering/controlled-documents-assets' -import '@hcengineering/analytics-collector-assets' -import '@hcengineering/text-editor-assets' -import '@hcengineering/uploader-assets' import '@hcengineering/test-management-assets' import '@hcengineering/survey-assets' @@ -120,12 +120,12 @@ import presentation, { } from '@hcengineering/presentation' import { setMetadata } from '@hcengineering/platform' -import { setDefaultLanguage, initThemeStore } from '@hcengineering/theme' +import { initThemeStore, setDefaultLanguage } from '@hcengineering/theme' +import { Analytics } from '@hcengineering/analytics' import { preferenceId } from '@hcengineering/preference' import { uiId } from '@hcengineering/ui/src/plugin' import { configureAnalytics } from './analytics' -import { Analytics } from '@hcengineering/analytics' export interface Config { ACCOUNTS_URL: string @@ -161,6 +161,8 @@ export interface Config { PREVIEW_CONFIG?: string UPLOAD_CONFIG?: string STATS_URL?: string + USE_BINARY_PROTOCOL?: boolean, + TRANSACTOR_OVERRIDE?: string } export interface Branding { @@ -182,9 +184,14 @@ export interface Branding { export type BrandingMap = Record -const devConfig = process.env.CLIENT_TYPE === 'dev-production' -const devConfigHuly = process.env.CLIENT_TYPE === 'dev-huly' -const devConfigBold = process.env.CLIENT_TYPE === 'dev-bold' +const clientType = process.env.CLIENT_TYPE +const configs: Record = { + 'dev-production': '/config-dev.json', + 'dev-huly': '/config-huly.json', + 'dev-bold': '/config.json', + 'dev-server': '/config.json', + 'dev-worker': '/config-worker.json', +} function configureI18n(): void { //Add localization @@ -255,12 +262,7 @@ export async function configurePlatform() { }) configureI18n() - const config: Config = await loadServerConfig( - devConfigHuly - ? '/config-huly.json' : ( - devConfigBold ? '/config-bold.json' : ( - devConfig ? '/config-dev.json' : '/config.json')) - ) + const config: Config = await loadServerConfig( configs[clientType] ?? '/config.json') const branding: BrandingMap = config.BRANDING_URL !== undefined ? await (await fetch(config.BRANDING_URL)).json() : {} const myBranding = branding[window.location.host] ?? {} @@ -300,6 +302,7 @@ export async function configurePlatform() { setMetadata(login.metadata.AccountsUrl, config.ACCOUNTS_URL) setMetadata(login.metadata.DisableSignUp, config.DISABLE_SIGNUP === 'true') + setMetadata(presentation.metadata.FilesURL, config.FILES_URL) setMetadata(presentation.metadata.UploadURL, config.UPLOAD_URL) setMetadata(presentation.metadata.CollaboratorUrl, config.COLLABORATOR_URL) @@ -410,9 +413,10 @@ export async function configurePlatform() { setMetadata(client.metadata.FilterModel, 'ui') setMetadata(client.metadata.ExtraPlugins, ['preference' as Plugin]) + setMetadata(login.metadata.TransactorOverride, config.TRANSACTOR_OVERRIDE) // Use binary response transfer for faster performance and small transfer sizes. - setMetadata(client.metadata.UseBinaryProtocol, true) + setMetadata(client.metadata.UseBinaryProtocol, config.USE_BINARY_PROTOCOL ?? true) // Disable for now, since it causes performance issues on linux/docker/kubernetes boxes for now. setMetadata(client.metadata.UseProtocolCompression, true) diff --git a/dev/prod/webpack.config.js b/dev/prod/webpack.config.js index 4216def643..af7d0cb9eb 100644 --- a/dev/prod/webpack.config.js +++ b/dev/prod/webpack.config.js @@ -22,10 +22,12 @@ const { Configuration } = require('webpack') const mode = process.env.NODE_ENV || 'development' const prod = mode === 'production' -const devServer = (process.env.CLIENT_TYPE ?? '') === 'dev-server' -const devProduction = (process.env.CLIENT_TYPE ?? '') === 'dev-production' -const devProductionHuly = (process.env.CLIENT_TYPE ?? '') === 'dev-huly' -const devProductionBold = (process.env.CLIENT_TYPE ?? '') === 'dev-bold' +const clientType = process.env.CLIENT_TYPE ?? '' +const devServer = clientType === 'dev-server' +const devServerWorker = clientType === 'dev-worker' +const devProduction = clientType === 'dev-production' +const devProductionHuly = clientType === 'dev-huly' +const devProductionBold = clientType === 'dev-bold' const dev = (process.env.CLIENT_TYPE ?? '') === 'dev' || devServer || devProduction || devProductionHuly || devProductionBold const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin') @@ -38,6 +40,117 @@ const useCache = process.env.USE_CACHE === 'true' const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin +const devProxy = { + '/account': { + target: 'http://localhost:3000', + changeOrigin: true, + pathRewrite: { '^/account': '' }, + logLevel: 'debug' + }, + '/files': { + target: 'http://localhost:8087', + changeOrigin: true, + logLevel: 'debug' + }, + '/api/v1': { + target: 'http://localhost:8087', + changeOrigin: true, + logLevel: 'debug' + }, + '/import': { + target: 'http://localhost:8087', + changeOrigin: true, + logLevel: 'debug' + }, + '/rekoni/recognize': { + target: 'http://localhost:4004', + changeOrigin: true, + pathRewrite: { '^/rekoni/recognize': '/recognize' }, + logLevel: 'debug' + } +} + +const devHulyProxy = { + '/account': { + target: 'https://account.huly.app/', + changeOrigin: true, + pathRewrite: { '^/account': '' }, + logLevel: 'debug' + }, + '/api/v1': { + target: 'http://huly.app', + changeOrigin: true, + logLevel: 'debug' + }, + '/files': { + target: 'https://huly.app/files', + changeOrigin: true, + pathRewrite: { '^/files': '' }, + logLevel: 'debug' + }, + '/rekoni/recognize': { + target: 'https://rekoni.huly.app', + changeOrigin: true, + pathRewrite: { '^/rekoni/recognize': '/recognize' }, + logLevel: 'debug' + } +} + +const devBoldProxy = { + '/account': { + target: 'https://account.bold.ru/', + changeOrigin: true, + pathRewrite: { '^/account': '' }, + logLevel: 'debug' + }, + '/files': { + target: 'https://app.bold.ru/files', + changeOrigin: true, + pathRewrite: { '^/files': '' }, + logLevel: 'debug' + }, + '/api/v1': { + target: 'http://app.bold.ru', + changeOrigin: true, + logLevel: 'debug' + }, + '/rekoni/recognize': { + target: 'https://rekoni.bold.ru', + changeOrigin: true, + pathRewrite: { '^/rekoni/recognize': '/recognize' }, + logLevel: 'debug' + } +} + +const devFrontProxy = { + '/account': { + target: 'https://account.hc.engineering/', + changeOrigin: true, + pathRewrite: { '^/account': '' }, + logLevel: 'debug' + }, + '/files': { + target: 'https://front.hc.engineering/files', + changeOrigin: true, + pathRewrite: { '^/files': '' }, + logLevel: 'debug' + }, + '/rekoni/recognize': { + target: 'https://rekoni.hc.enigneering', + changeOrigin: true, + pathRewrite: { '^/rekoni/recognize': '/recognize' }, + logLevel: 'debug' + } +} + +const proxy = { + 'dev-worker': devProxy, + 'dev-server': devProxy, + 'dev-production': devFrontProxy, + 'dev-bold': devBoldProxy, + 'dev-huly': devHulyProxy +} + /** * @type {Configuration} */ @@ -343,109 +456,7 @@ module.exports = [ }, progress: false }, - proxy: - devServer && !devProduction && !devProductionHuly && !devProductionBold - ? { - '/account': { - target: 'http://localhost:3000', - changeOrigin: true, - pathRewrite: { '^/account': '' }, - logLevel: 'debug' - }, - '/files': { - target: 'http://localhost:8087', - changeOrigin: true, - logLevel: 'debug' - }, - '/api/v1': { - target: 'http://localhost:8087', - changeOrigin: true, - logLevel: 'debug' - }, - '/import': { - target: 'http://localhost:8087', - changeOrigin: true, - logLevel: 'debug' - }, - '/rekoni/recognize': { - target: 'http://localhost:4004', - changeOrigin: true, - pathRewrite: { '^/rekoni/recognize': '/recognize' }, - logLevel: 'debug' - } - } - : !devProductionHuly && !devProductionBold - ? { - '/account': { - target: 'https://account.hc.engineering/', - changeOrigin: true, - pathRewrite: { '^/account': '' }, - logLevel: 'debug' - }, - '/files': { - target: 'https://front.hc.engineering/files', - changeOrigin: true, - pathRewrite: { '^/files': '' }, - logLevel: 'debug' - }, - '/rekoni/recognize': { - target: 'https://rekoni.hc.enigneering', - changeOrigin: true, - pathRewrite: { '^/rekoni/recognize': '/recognize' }, - logLevel: 'debug' - } - } - : !devProductionBold - ? { - '/account': { - target: 'https://account.huly.app/', - changeOrigin: true, - pathRewrite: { '^/account': '' }, - logLevel: 'debug' - }, - '/api/v1': { - target: 'http://huly.app', - changeOrigin: true, - logLevel: 'debug' - }, - '/files': { - target: 'https://huly.app/files', - changeOrigin: true, - pathRewrite: { '^/files': '' }, - logLevel: 'debug' - }, - '/rekoni/recognize': { - target: 'https://rekoni.huly.app', - changeOrigin: true, - pathRewrite: { '^/rekoni/recognize': '/recognize' }, - logLevel: 'debug' - } - } - : { - '/account': { - target: 'https://account.bold.ru/', - changeOrigin: true, - pathRewrite: { '^/account': '' }, - logLevel: 'debug' - }, - '/files': { - target: 'https://app.bold.ru/files', - changeOrigin: true, - pathRewrite: { '^/files': '' }, - logLevel: 'debug' - }, - '/api/v1': { - target: 'http://app.bold.ru', - changeOrigin: true, - logLevel: 'debug' - }, - '/rekoni/recognize': { - target: 'https://rekoni.bold.ru', - changeOrigin: true, - pathRewrite: { '^/rekoni/recognize': '/recognize' }, - logLevel: 'debug' - } - } + proxy: proxy[clientType] } } ] diff --git a/dev/tool/src/index.ts b/dev/tool/src/index.ts index 47ea18eb54..7eec91d643 100644 --- a/dev/tool/src/index.ts +++ b/dev/tool/src/index.ts @@ -58,7 +58,14 @@ import serverClientPlugin, { listAccountWorkspaces, updateBackupInfo } from '@hcengineering/server-client' -import { createBackupPipeline, getConfig, getWorkspaceDestroyAdapter } from '@hcengineering/server-pipeline' +import { + createBackupPipeline, + getConfig, + getWorkspaceDestroyAdapter, + registerAdapterFactry, + registerDestroyFactry, + registerTxAdapterFactry +} from '@hcengineering/server-pipeline' import serverToken, { decodeToken, generateToken } from '@hcengineering/server-token' import { FileModelLogger } from '@hcengineering/server-tool' import { createWorkspace, upgradeWorkspace } from '@hcengineering/workspace-service' @@ -89,12 +96,19 @@ import core, { } from '@hcengineering/core' import { consoleModelLogger, type MigrateOperation } from '@hcengineering/model' import contact from '@hcengineering/model-contact' -import { getMongoClient, getWorkspaceMongoDB, shutdown } from '@hcengineering/mongo' +import { + createMongoAdapter, + createMongoDestroyAdapter, + createMongoTxAdapter, + getMongoClient, + getWorkspaceMongoDB, + shutdown +} from '@hcengineering/mongo' import { backupDownload } from '@hcengineering/server-backup/src/backup' -import { createDatalakeClient, DatalakeService, type DatalakeConfig } from '@hcengineering/datalake' +import { createDatalakeClient, CONFIG_KIND as DATALAKE_CONFIG_KIND, type DatalakeConfig } from '@hcengineering/datalake' import { getModelVersion } from '@hcengineering/model-all' -import { S3Service, type S3Config } from '@hcengineering/s3' +import { CONFIG_KIND as S3_CONFIG_KIND, S3Service, type S3Config } from '@hcengineering/s3' import type { PipelineFactory, StorageAdapter, StorageAdapterEx } from '@hcengineering/server-core' import { deepEqual } from 'fast-equals' import { createWriteStream, readFileSync } from 'fs' @@ -125,6 +139,7 @@ import { restoreControlledDocContentMongo, restoreWikiContentMongo } from './mar import { fixMixinForeignAttributes, showMixinForeignAttributes } from './mixin' import { fixAccountEmails, renameAccount } from './renameAccount' import { copyToDatalake, moveFiles, showLostFiles } from './storage' +import { createPostgresTxAdapter, createPostgresAdapter, createPostgreeDestroyAdapter } from '@hcengineering/postgres' const colorConstants = { colorRed: '\u001b[31m', @@ -152,6 +167,14 @@ export function devTool ( ): void { const toolCtx = new MeasureMetricsContext('tool', {}) + registerTxAdapterFactry('mongodb', createMongoTxAdapter) + registerAdapterFactry('mongodb', createMongoAdapter) + registerDestroyFactry('mongodb', createMongoDestroyAdapter) + + registerTxAdapterFactry('postgresql', createPostgresTxAdapter, true) + registerAdapterFactry('postgresql', createPostgresAdapter, true) + registerDestroyFactry('postgresql', createPostgreeDestroyAdapter, true) + const serverSecret = process.env.SERVER_SECRET if (serverSecret === undefined) { console.error('please provide server secret') @@ -1170,12 +1193,12 @@ export function devTool ( const storageConfig = storageConfigFromEnv(process.env.STORAGE) - const storages = storageConfig.storages.filter((p) => p.kind === S3Service.config) as S3Config[] + const storages = storageConfig.storages.filter((p) => p.kind === S3_CONFIG_KIND) as S3Config[] if (storages.length === 0) { throw new Error('S3 storage config is required') } - const datalakeConfig = storageConfig.storages.find((p) => p.kind === DatalakeService.config) + const datalakeConfig = storageConfig.storages.find((p) => p.kind === DATALAKE_CONFIG_KIND) if (datalakeConfig === undefined) { throw new Error('Datalake storage config is required') } diff --git a/plugins/login/src/index.ts b/plugins/login/src/index.ts index 4c12d4adce..db302f2523 100644 --- a/plugins/login/src/index.ts +++ b/plugins/login/src/index.ts @@ -71,7 +71,8 @@ export default plugin(loginId, { LastToken: '' as Metadata, LoginEndpoint: '' as Metadata, LoginEmail: '' as Metadata, - DisableSignUp: '' as Metadata + DisableSignUp: '' as Metadata, + TransactorOverride: '' as Metadata }, component: { LoginApp: '' as AnyComponent, diff --git a/plugins/workbench-resources/src/connect.ts b/plugins/workbench-resources/src/connect.ts index 4710d87e16..57874d332e 100644 --- a/plugins/workbench-resources/src/connect.ts +++ b/plugins/workbench-resources/src/connect.ts @@ -121,7 +121,7 @@ export async function connect (title: string): Promise { setMetadataLocalStorage(login.metadata.LoginEndpoint, workspaceLoginInfo?.endpoint) - const endpoint = workspaceLoginInfo?.endpoint // fetchMetadataLocalStorage(login.metadata.LoginEndpoint) + const endpoint = getMetadata(login.metadata.TransactorOverride) ?? workspaceLoginInfo?.endpoint // fetchMetadataLocalStorage(login.metadata.LoginEndpoint) const email = workspaceLoginInfo?.email // fetchMetadataLocalStorage(login.metadata.LoginEmail) if (token == null || endpoint == null || email == null) { const navigateUrl = encodeURIComponent(JSON.stringify(loc)) diff --git a/pods/fulltext/package.json b/pods/fulltext/package.json index d886671cdf..3dae91b786 100644 --- a/pods/fulltext/package.json +++ b/pods/fulltext/package.json @@ -73,6 +73,8 @@ "@hcengineering/server-collaboration": "^0.6.0", "@hcengineering/middleware": "^0.6.0", "@hcengineering/server-client": "^0.6.0", - "@hcengineering/server-storage": "^0.6.0" + "@hcengineering/server-storage": "^0.6.0", + "@hcengineering/postgres": "^0.6.0", + "@hcengineering/mongo": "^0.6.1" } } diff --git a/pods/fulltext/src/server.ts b/pods/fulltext/src/server.ts index e3b4dbe6d9..8d6e19406c 100644 --- a/pods/fulltext/src/server.ts +++ b/pods/fulltext/src/server.ts @@ -30,7 +30,9 @@ import { LowLevelMiddleware, ModelMiddleware } from '@hcengineering/middleware' +import { createMongoAdapter, createMongoDestroyAdapter, createMongoTxAdapter } from '@hcengineering/mongo' import { PlatformError, setMetadata, unknownError } from '@hcengineering/platform' +import { createPostgreeDestroyAdapter, createPostgresAdapter, createPostgresTxAdapter } from '@hcengineering/postgres' import serverClientPlugin, { getTransactorEndpoint, getWorkspaceInfo } from '@hcengineering/server-client' import serverCore, { createContentAdapter, @@ -43,7 +45,14 @@ import serverCore, { type StorageAdapter } from '@hcengineering/server-core' import { FullTextIndexPipeline, searchFulltext, type FulltextDBConfiguration } from '@hcengineering/server-indexer' -import { getConfig, registerServerPlugins, registerStringLoaders } from '@hcengineering/server-pipeline' +import { + getConfig, + registerAdapterFactry, + registerDestroyFactry, + registerServerPlugins, + registerStringLoaders, + registerTxAdapterFactry +} from '@hcengineering/server-pipeline' import serverToken, { decodeToken, generateToken, type Token } from '@hcengineering/server-token' import cors from '@koa/cors' import Koa from 'koa' @@ -198,6 +207,14 @@ export async function startIndexer ( setMetadata(serverCore.metadata.ElasticIndexName, opt.elasticIndexName) setMetadata(serverClientPlugin.metadata.Endpoint, opt.accountsUrl) + registerTxAdapterFactry('mongodb', createMongoTxAdapter) + registerAdapterFactry('mongodb', createMongoAdapter) + registerDestroyFactry('mongodb', createMongoDestroyAdapter) + + registerTxAdapterFactry('postgresql', createPostgresTxAdapter, true) + registerAdapterFactry('postgresql', createPostgresAdapter, true) + registerDestroyFactry('postgresql', createPostgreeDestroyAdapter, true) + registerServerPlugins() registerStringLoaders() diff --git a/pods/server/package.json b/pods/server/package.json index 844441300e..089adafd5c 100644 --- a/pods/server/package.json +++ b/pods/server/package.json @@ -75,6 +75,7 @@ "ws": "^8.18.0", "bufferutil": "^4.0.8", "msgpackr": "^1.11.0", - "msgpackr-extract": "^3.0.3" + "msgpackr-extract": "^3.0.3", + "@hcengineering/postgres": "^0.6.0" } } diff --git a/pods/server/src/__tests__/backup.spec.ts b/pods/server/src/__tests__/backup.spec.ts index 8c89dc5398..87cbd53fd6 100644 --- a/pods/server/src/__tests__/backup.spec.ts +++ b/pods/server/src/__tests__/backup.spec.ts @@ -10,6 +10,7 @@ import core, { import builder from '@hcengineering/model-all' import { wrapPipeline } from '@hcengineering/server-core' import { getServerPipeline } from '@hcengineering/server-pipeline' +import { buildStorageFromConfig, storageConfigFromEnv } from '@hcengineering/server-storage' const model = builder().getTxes() // const dbURL = 'postgresql://root@localhost:26257/defaultdb?sslmode=disable' @@ -22,8 +23,10 @@ describe.skip('test-backup-find', () => { const toolCtx = new MeasureMetricsContext('-', {}) // We should setup a DB with docuemnts and try to backup them. const wsUrl = { name: 'testdb-backup-test', workspaceName: 'test', workspaceUrl: 'test' } - const { pipeline, storageAdapter } = await getServerPipeline(toolCtx, model, dbURL, wsUrl, { - storageConfig: STORAGE_CONFIG, + const storageConfig = storageConfigFromEnv(STORAGE_CONFIG) + const storageAdapter = buildStorageFromConfig(storageConfig) + + const pipeline = await getServerPipeline(toolCtx, model, dbURL, wsUrl, storageAdapter, { disableTriggers: true }) try { @@ -65,8 +68,9 @@ describe.skip('test-backup-find', () => { const toolCtx = new MeasureMetricsContext('-', {}) // We should setup a DB with docuemnts and try to backup them. const wsUrl = { name: 'testdb-backup-test', workspaceName: 'test', workspaceUrl: 'test' } - const { pipeline, storageAdapter } = await getServerPipeline(toolCtx, model, dbURL, wsUrl, { - storageConfig: STORAGE_CONFIG, + const storageConfig = storageConfigFromEnv(STORAGE_CONFIG) + const storageAdapter = buildStorageFromConfig(storageConfig) + const pipeline = await getServerPipeline(toolCtx, model, dbURL, wsUrl, storageAdapter, { disableTriggers: true }) try { diff --git a/pods/server/src/server.ts b/pods/server/src/server.ts index 4266c65a3e..ce746ade17 100644 --- a/pods/server/src/server.ts +++ b/pods/server/src/server.ts @@ -33,9 +33,18 @@ import { } from '@hcengineering/server-core' import { type Token } from '@hcengineering/server-token' -import { createServerPipeline, registerServerPlugins, registerStringLoaders } from '@hcengineering/server-pipeline' +import { + createServerPipeline, + registerAdapterFactry, + registerDestroyFactry, + registerServerPlugins, + registerStringLoaders, + registerTxAdapterFactry +} from '@hcengineering/server-pipeline' import { readFileSync } from 'node:fs' +import { createMongoAdapter, createMongoDestroyAdapter, createMongoTxAdapter } from '@hcengineering/mongo' +import { createPostgreeDestroyAdapter, createPostgresAdapter, createPostgresTxAdapter } from '@hcengineering/postgres' const model = JSON.parse(readFileSync(process.env.MODEL_JSON ?? 'model.json').toString()) as Tx[] registerStringLoaders() @@ -65,6 +74,14 @@ export function start ( mongoUrl?: string } ): { shutdown: () => Promise, sessionManager: SessionManager } { + registerTxAdapterFactry('mongodb', createMongoTxAdapter) + registerAdapterFactry('mongodb', createMongoAdapter) + registerDestroyFactry('mongodb', createMongoDestroyAdapter) + + registerTxAdapterFactry('postgresql', createPostgresTxAdapter, true) + registerAdapterFactry('postgresql', createPostgresAdapter, true) + registerDestroyFactry('postgresql', createPostgreeDestroyAdapter, true) + registerServerPlugins() const externalStorage = buildStorageFromConfig(opt.storageConfig) diff --git a/rush.json b/rush.json index fb79acc469..1693c6a377 100644 --- a/rush.json +++ b/rush.json @@ -2205,6 +2205,11 @@ "packageName": "@hcengineering/survey-resources", "projectFolder": "plugins/survey-resources", "shouldPublish": false + }, + { + "packageName": "@hcengineering/cloud-transactor", + "projectFolder": "workers/transactor", + "shouldPublish": false } ] } diff --git a/server/account/src/operations.ts b/server/account/src/operations.ts index 9ca8bef3b8..5f08e7ed57 100644 --- a/server/account/src/operations.ts +++ b/server/account/src/operations.ts @@ -63,7 +63,6 @@ import { connect } from '@hcengineering/server-tool' import { randomBytes } from 'crypto' import otpGenerator from 'otp-generator' -import { getWorkspaceDestroyAdapter } from '@hcengineering/server-pipeline' import { accountPlugin } from './plugin' import type { Account, @@ -93,6 +92,7 @@ import { toAccountInfo, verifyPassword } from './utils' +import { getWorkspaceDestroyAdapter } from '@hcengineering/server-pipeline' /** * @public diff --git a/server/core/src/adapter.ts b/server/core/src/adapter.ts index 515e360313..c6b1c93d98 100644 --- a/server/core/src/adapter.ts +++ b/server/core/src/adapter.ts @@ -115,5 +115,5 @@ export type DbAdapterFactory = ( url: string, workspaceId: WorkspaceId, modelDb: ModelDb, - storage: StorageAdapter + storage?: StorageAdapter ) => Promise diff --git a/server/datalake/src/index.ts b/server/datalake/src/index.ts index 3f36b45a90..38b1a7df0c 100644 --- a/server/datalake/src/index.ts +++ b/server/datalake/src/index.ts @@ -44,11 +44,12 @@ export function createDatalakeClient (opt: DatalakeConfig): DatalakeClient { return new DatalakeClient(endpoint) } +export const CONFIG_KIND = 'datalake' + /** * @public */ export class DatalakeService implements StorageAdapter { - static config = 'datalake' private readonly client: DatalakeClient constructor (readonly opt: DatalakeConfig) { diff --git a/server/middleware/src/dbAdapter.ts b/server/middleware/src/dbAdapter.ts index 8ffe917d75..c9af49c3c4 100644 --- a/server/middleware/src/dbAdapter.ts +++ b/server/middleware/src/dbAdapter.ts @@ -14,7 +14,6 @@ // import { DOMAIN_TX, type MeasureContext } from '@hcengineering/core' -import { PlatformError, unknownStatus } from '@hcengineering/platform' import type { DbAdapter, DbConfiguration, @@ -49,9 +48,6 @@ export class DBAdapterMiddleware extends BaseMiddleware implements Middleware { const adapters = new Map() await ctx.with('create-adapters', {}, async (ctx) => { - if (this.context.storageAdapter == null) { - throw new PlatformError(unknownStatus('StorageSdapter is not specified')) - } for (const key in this.conf.adapters) { const adapterConf = this.conf.adapters[key] adapters.set( diff --git a/server/minio/src/index.ts b/server/minio/src/index.ts index 094519b5ef..62b2b5449a 100644 --- a/server/minio/src/index.ts +++ b/server/minio/src/index.ts @@ -50,11 +50,12 @@ export interface MinioConfig extends StorageConfig { bucketPrefix?: string } +export const CONFIG_KIND = 'minio' + /** * @public */ export class MinioService implements StorageAdapter { - static config = 'minio' client: Client constructor (readonly opt: MinioConfig) { this.client = new Client({ diff --git a/server/s3/src/index.ts b/server/s3/src/index.ts index f3ab7cd956..0c022505e2 100644 --- a/server/s3/src/index.ts +++ b/server/s3/src/index.ts @@ -60,11 +60,12 @@ export interface S3Config extends StorageConfig { expireTime?: string } +export const CONFIG_KIND = 's3' + /** * @public */ export class S3Service implements StorageAdapter { - static config = 's3' expireTime: number client: S3 constructor (readonly opt: S3Config) { diff --git a/server/server-pipeline/package.json b/server/server-pipeline/package.json index 43250604b7..5e33a80ac6 100644 --- a/server/server-pipeline/package.json +++ b/server/server-pipeline/package.json @@ -45,9 +45,6 @@ "@hcengineering/server-collaboration": "^0.6.0", "@hcengineering/server-collaboration-resources": "^0.6.0", "@hcengineering/server": "^0.6.4", - "@hcengineering/server-storage": "^0.6.0", - "@hcengineering/postgres": "^0.6.0", - "@hcengineering/mongo": "^0.6.1", "@hcengineering/server-contact": "^0.6.1", "@hcengineering/server-contact-resources": "^0.6.0", "@hcengineering/server-notification": "^0.6.1", @@ -97,7 +94,6 @@ "@hcengineering/server-training": "^0.1.0", "@hcengineering/server-training-resources": "^0.1.0", "@hcengineering/middleware": "^0.6.0", - "@hcengineering/minio": "^0.6.0", "@hcengineering/login-assets": "^0.6.0", "@hcengineering/onboard-assets": "^0.6.0", "@hcengineering/view-assets": "^0.6.11", diff --git a/server/server-storage/src/blobStorage.ts b/server/server-pipeline/src/blobStorage.ts similarity index 87% rename from server/server-storage/src/blobStorage.ts rename to server/server-pipeline/src/blobStorage.ts index 2307befaec..595c33243d 100644 --- a/server/server-storage/src/blobStorage.ts +++ b/server/server-pipeline/src/blobStorage.ts @@ -14,28 +14,33 @@ // import { - Class, - Doc, - DocumentQuery, - DocumentUpdate, - Domain, - FindOptions, - FindResult, - Hierarchy, - IndexingConfiguration, - Iterator, - MeasureContext, - ModelDb, - Ref, - StorageIterator, + type Class, + type Doc, + type DocumentQuery, + type DocumentUpdate, + type Domain, + type FindOptions, + type FindResult, + type Hierarchy, + type IndexingConfiguration, + type Iterator, + type MeasureContext, + type ModelDb, + type Ref, + type StorageIterator, toFindResult, - Tx, - TxResult, - WorkspaceId, + type Tx, + type TxResult, + type WorkspaceId, type Blob } from '@hcengineering/core' import { PlatformError, unknownError } from '@hcengineering/platform' -import { DbAdapter, DbAdapterHandler, StorageAdapter, type StorageAdapterEx } from '@hcengineering/server-core' +import { + type DbAdapter, + type DbAdapterHandler, + type StorageAdapter, + type StorageAdapterEx +} from '@hcengineering/server-core' class StorageBlobAdapter implements DbAdapter { constructor ( @@ -129,10 +134,10 @@ export async function createStorageDataAdapter ( url: string, workspaceId: WorkspaceId, modelDb: ModelDb, - storage: StorageAdapter + storage?: StorageAdapter ): Promise { if (storage === undefined) { - throw new Error('minio storage adapter require minio') + throw new Error('Storage adapter required') } // We need to create bucket if it doesn't exist if (!(await storage.exists(ctx, workspaceId))) { diff --git a/server/server-pipeline/src/pipeline.ts b/server/server-pipeline/src/pipeline.ts index 1e197f0fe2..3a6dc35d01 100644 --- a/server/server-pipeline/src/pipeline.ts +++ b/server/server-pipeline/src/pipeline.ts @@ -37,8 +37,6 @@ import { TriggersMiddleware, TxMiddleware } from '@hcengineering/middleware' -import { createMongoAdapter, createMongoDestroyAdapter, createMongoTxAdapter } from '@hcengineering/mongo' -import { createPostgreeDestroyAdapter, createPostgresAdapter, createPostgresTxAdapter } from '@hcengineering/postgres' import { createBenchmarkAdapter, createInMemoryAdapter, @@ -52,12 +50,10 @@ import { type PipelineContext, type PipelineFactory, type StorageAdapter, - type StorageConfiguration, type WorkspaceDestroyAdapter } from '@hcengineering/server-core' -import { buildStorageFromConfig, createStorageDataAdapter, storageConfigFromEnv } from '@hcengineering/server-storage' import { generateToken } from '@hcengineering/server-token' - +import { createStorageDataAdapter } from './blobStorage' /** * @public */ @@ -171,6 +167,7 @@ export function createBackupPipeline ( const middlewares: MiddlewareCreator[] = [ LowLevelMiddleware.create, ContextNameMiddleware.create, + // ConnectionMgrMiddleware.create, DomainFindMiddleware.create, DBAdapterInitMiddleware.create, ModelMiddleware.create(systemTx), @@ -195,37 +192,74 @@ export async function getServerPipeline ( model: Tx[], dbUrl: string, wsUrl: WorkspaceIdWithUrl, + storageAdapter: StorageAdapter, opt?: { - storageConfig: string disableTriggers?: boolean } -): Promise<{ - pipeline: Pipeline - storageAdapter: StorageAdapter - }> { - const storageConfig: StorageConfiguration = storageConfigFromEnv(opt?.storageConfig) - - const storageAdapter = buildStorageFromConfig(storageConfig) - +): Promise { const pipelineFactory = createServerPipeline(ctx, dbUrl, model, { externalStorage: storageAdapter, usePassedCtx: true, disableTriggers: opt?.disableTriggers ?? false }) - try { - return { - pipeline: await pipelineFactory(ctx, wsUrl, true, () => {}, null), - storageAdapter - } - } catch (err: any) { - await storageAdapter.close() - throw err + return await pipelineFactory(ctx, wsUrl, true, () => {}, null) +} + +const txAdapterFactories: Record = {} +const adapterFactories: Record = {} +const destroyFactories: Record WorkspaceDestroyAdapter> = {} + +export function registerTxAdapterFactry (name: string, factory: DbAdapterFactory, useAsDefault: boolean = true): void { + txAdapterFactories[name] = factory + if (useAsDefault) { + txAdapterFactories[''] = factory } } +export function registerAdapterFactry (name: string, factory: DbAdapterFactory, useAsDefault: boolean = true): void { + adapterFactories[name] = factory + if (useAsDefault) { + adapterFactories[''] = factory + } +} + +export function registerDestroyFactry ( + name: string, + factory: (url: string) => WorkspaceDestroyAdapter, + useAsDefault: boolean = true +): void { + destroyFactories[name] = factory + if (useAsDefault) { + destroyFactories[''] = factory + } +} + +function matchTxAdapterFactory (dbUrl: string): DbAdapterFactory { + for (const [k, v] of Object.entries(txAdapterFactories)) { + if (dbUrl.startsWith(k)) { + return v + } + } + return txAdapterFactories[''] +} + +function matchAdapterFactory (dbUrl: string): DbAdapterFactory { + for (const [k, v] of Object.entries(adapterFactories)) { + if (dbUrl.startsWith(k)) { + return v + } + } + return adapterFactories[''] +} + export function getWorkspaceDestroyAdapter (dbUrl: string): WorkspaceDestroyAdapter { - return dbUrl.startsWith('mongodb') ? createMongoDestroyAdapter(dbUrl) : createPostgreeDestroyAdapter(dbUrl) + for (const [k, v] of Object.entries(destroyFactories)) { + if (dbUrl.startsWith(k)) { + return v(dbUrl) + } + } + return destroyFactories[''](dbUrl) } export function getConfig ( @@ -255,11 +289,11 @@ export function getConfig ( defaultAdapter: extensions?.defaultAdapter ?? 'Main', adapters: { Tx: { - factory: dbUrl.startsWith('mongodb') ? createMongoTxAdapter : createPostgresTxAdapter, + factory: matchTxAdapterFactory(dbUrl), url: dbUrl }, Main: { - factory: dbUrl.startsWith('mongodb') ? createMongoAdapter : createPostgresAdapter, + factory: matchAdapterFactory(dbUrl), url: dbUrl }, Null: { diff --git a/server/server-storage/src/index.ts b/server/server-storage/src/index.ts index c255d9c854..092ed85687 100644 --- a/server/server-storage/src/index.ts +++ b/server/server-storage/src/index.ts @@ -15,5 +15,4 @@ // export * from './fallback' -export * from './blobStorage' export * from './starter' diff --git a/server/server-storage/src/starter.ts b/server/server-storage/src/starter.ts index 079ede7af4..ca83c895ab 100644 --- a/server/server-storage/src/starter.ts +++ b/server/server-storage/src/starter.ts @@ -1,6 +1,6 @@ -import { DatalakeService, type DatalakeConfig } from '@hcengineering/datalake' -import { MinioConfig, MinioService, addMinioFallback } from '@hcengineering/minio' -import { S3Service, type S3Config } from '@hcengineering/s3' +import { CONFIG_KIND as DATALAKE_CONFIG_KIND, DatalakeService, type DatalakeConfig } from '@hcengineering/datalake' +import { CONFIG_KIND as MINIO_CONFIG_KIND, MinioConfig, MinioService, addMinioFallback } from '@hcengineering/minio' +import { CONFIG_KIND as S3_CONFIG_KIND, S3Service, type S3Config } from '@hcengineering/s3' import { StorageAdapter, StorageConfiguration, type StorageConfig } from '@hcengineering/server-core' import { FallbackStorageAdapter, buildStorage } from './fallback' @@ -77,19 +77,19 @@ export function parseStorageEnv (storageEnv: string, storageConfig: StorageConfi export function createStorageFromConfig (config: StorageConfig): StorageAdapter { const kind = config.kind - if (kind === MinioService.config) { + if (kind === MINIO_CONFIG_KIND) { const c = config as MinioConfig if (c.endpoint == null || c.accessKey == null || c.secretKey == null) { throw new Error('One of endpoint/accessKey/secretKey values are not specified') } return new MinioService(c) - } else if (kind === S3Service.config) { + } else if (kind === S3_CONFIG_KIND) { const c = config as S3Config if (c.endpoint == null || c.accessKey == null || c.secretKey == null) { throw new Error('One of endpoint/accessKey/secretKey values are not specified') } return new S3Service(c) - } else if (kind === DatalakeService.config) { + } else if (kind === DATALAKE_CONFIG_KIND) { const c = config as DatalakeConfig if (c.endpoint == null) { throw new Error('Endpoint value is not specified') diff --git a/server/server/src/sessionManager.ts b/server/server/src/sessionManager.ts index 1142acf76d..c172087047 100644 --- a/server/server/src/sessionManager.ts +++ b/server/server/src/sessionManager.ts @@ -415,7 +415,7 @@ class TSessionManager implements SessionManager { : null) ?? null if (workspace === undefined) { - ctx.warn('open workspace', { + ctx.info('open workspace', { email: token.email, workspace: workspaceInfo.workspaceId, wsUrl: workspaceInfo.workspaceUrl, @@ -469,7 +469,14 @@ class TSessionManager implements SessionManager { }) return { upgrade: true } } - pipeline = await ctx.with('💤 wait', { workspaceName }, () => (workspace as Workspace).pipeline) + try { + pipeline = await ctx.with('💤 wait', { workspaceName }, () => (workspace as Workspace).pipeline) + } catch (err: any) { + // Failed to create pipeline, etc + Analytics.handleError(err) + this.workspaces.delete(wsString) + throw err + } } const session = this.createSession( @@ -794,7 +801,7 @@ class TSessionManager implements SessionManager { ignoreSocket?: ConnectionSocket ): Promise { if (LOGGING_ENABLED) { - this.ctx.warn('closing workspace', { + this.ctx.info('closing workspace', { workspace: workspace.id, wsName: workspace.workspaceName, code, diff --git a/server/workspace-service/package.json b/server/workspace-service/package.json index 8e444fffc7..05399c166c 100644 --- a/server/workspace-service/package.json +++ b/server/workspace-service/package.json @@ -56,6 +56,8 @@ "@hcengineering/server-token": "^0.6.11", "@hcengineering/server-notification": "^0.6.1", "@hcengineering/analytics": "^0.6.0", - "@hcengineering/server-backup": "^0.6.0" + "@hcengineering/server-backup": "^0.6.0", + "@hcengineering/postgres": "^0.6.0", + "@hcengineering/mongo": "^0.6.1" } } diff --git a/server/workspace-service/src/ws-operations.ts b/server/workspace-service/src/ws-operations.ts index 9ad515d53f..fb72684afe 100644 --- a/server/workspace-service/src/ws-operations.ts +++ b/server/workspace-service/src/ws-operations.ts @@ -15,14 +15,20 @@ import core, { type WorkspaceIdWithUrl } from '@hcengineering/core' import { consoleModelLogger, type MigrateOperation, type ModelLogger } from '@hcengineering/model' +import { createMongoTxAdapter, createMongoAdapter, createMongoDestroyAdapter } from '@hcengineering/mongo' +import { createPostgresTxAdapter, createPostgresAdapter, createPostgreeDestroyAdapter } from '@hcengineering/postgres' import { getTransactorEndpoint } from '@hcengineering/server-client' import { SessionDataImpl, wrapPipeline, type Pipeline, type StorageAdapter } from '@hcengineering/server-core' import { getServerPipeline, getTxAdapterFactory, + registerAdapterFactry, + registerDestroyFactry, registerServerPlugins, - registerStringLoaders + registerStringLoaders, + registerTxAdapterFactry } from '@hcengineering/server-pipeline' +import { buildStorageFromConfig, storageConfigFromEnv } from '@hcengineering/server-storage' import { generateToken } from '@hcengineering/server-token' import { initializeWorkspace, initModel, prepareTools, updateModel, upgradeModel } from '@hcengineering/server-tool' @@ -72,10 +78,21 @@ export async function createWorkspace ( const { dbUrl } = prepareTools([]) const hierarchy = new Hierarchy() const modelDb = new ModelDb(hierarchy) + + registerTxAdapterFactry('mongodb', createMongoTxAdapter) + registerAdapterFactry('mongodb', createMongoAdapter) + registerDestroyFactry('mongodb', createMongoDestroyAdapter) + + registerTxAdapterFactry('postgresql', createPostgresTxAdapter, true) + registerAdapterFactry('postgresql', createPostgresAdapter, true) + registerDestroyFactry('postgresql', createPostgreeDestroyAdapter, true) registerServerPlugins() registerStringLoaders() - const { pipeline, storageAdapter } = await getServerPipeline(ctx, txes, dbUrl, wsUrl) + const storageConfig = storageConfigFromEnv() + const storageAdapter = buildStorageFromConfig(storageConfig) + + const pipeline = await getServerPipeline(ctx, txes, dbUrl, wsUrl, storageAdapter) try { const txFactory = getTxAdapterFactory(ctx, dbUrl, wsUrl, null, { @@ -153,16 +170,31 @@ export async function upgradeWorkspace ( ): Promise { const { dbUrl } = prepareTools([]) let pipeline: Pipeline | undefined - let storageAdapter: StorageAdapter | undefined + registerTxAdapterFactry('mongodb', createMongoTxAdapter) + registerAdapterFactry('mongodb', createMongoAdapter) + registerDestroyFactry('mongodb', createMongoDestroyAdapter) + + registerTxAdapterFactry('postgresql', createPostgresTxAdapter, true) + registerAdapterFactry('postgresql', createPostgresAdapter, true) + registerDestroyFactry('postgresql', createPostgreeDestroyAdapter, true) registerServerPlugins() registerStringLoaders() + + const storageConfig = storageConfigFromEnv() + const storageAdapter = buildStorageFromConfig(storageConfig) try { - ;({ pipeline, storageAdapter } = await getServerPipeline(ctx, txes, dbUrl, { - name: ws.workspace, - workspaceName: ws.workspaceName ?? '', - workspaceUrl: ws.workspaceUrl ?? '' - })) + pipeline = await getServerPipeline( + ctx, + txes, + dbUrl, + { + name: ws.workspace, + workspaceName: ws.workspaceName ?? '', + workspaceUrl: ws.workspaceUrl ?? '' + }, + storageAdapter + ) if (pipeline === undefined || storageAdapter === undefined) { return } diff --git a/templates/cloud/package.json b/templates/cloud/package.json index 4ea6bdecee..7c0aab8389 100644 --- a/templates/cloud/package.json +++ b/templates/cloud/package.json @@ -22,7 +22,7 @@ "@hcengineering/platform-rig": "*" }, "devDependencies": { - "wrangler": "^3.80.1", + "wrangler": "^3.97.0", "@typescript-eslint/eslint-plugin": "^6.11.0", "@typescript-eslint/parser": "^6.11.0", "eslint-config-standard-with-typescript": "^40.0.0", diff --git a/workers/branding/package.json b/workers/branding/package.json index 473cac180d..c6baf051f1 100644 --- a/workers/branding/package.json +++ b/workers/branding/package.json @@ -20,9 +20,9 @@ }, "devDependencies": { "@hcengineering/platform-rig": "^0.6.0", - "@cloudflare/workers-types": "^4.20240729.0", + "@cloudflare/workers-types": "^4.20241022.0", "typescript": "^5.3.3", - "wrangler": "^3.80.1", + "wrangler": "^3.97.0", "jest": "^29.7.0", "prettier": "^3.1.0", "ts-jest": "^29.1.1", diff --git a/workers/datalake/package.json b/workers/datalake/package.json index d4debace53..bdcea6e74d 100644 --- a/workers/datalake/package.json +++ b/workers/datalake/package.json @@ -20,9 +20,9 @@ }, "devDependencies": { "@hcengineering/platform-rig": "^0.6.0", - "@cloudflare/workers-types": "^4.20240729.0", + "@cloudflare/workers-types": "^4.20241022.0", "typescript": "^5.3.3", - "wrangler": "^3.80.1", + "wrangler": "^3.97.0", "jest": "^29.7.0", "prettier": "^3.1.0", "ts-jest": "^29.1.1", diff --git a/workers/transactor/.editorconfig b/workers/transactor/.editorconfig new file mode 100644 index 0000000000..a727df347a --- /dev/null +++ b/workers/transactor/.editorconfig @@ -0,0 +1,12 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = tab +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.yml] +indent_style = space diff --git a/workers/transactor/.eslintrc.js b/workers/transactor/.eslintrc.js new file mode 100644 index 0000000000..72235dc283 --- /dev/null +++ b/workers/transactor/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: ['./node_modules/@hcengineering/platform-rig/profiles/default/eslint.config.json'], + parserOptions: { + tsconfigRootDir: __dirname, + project: './tsconfig.json' + } +} diff --git a/workers/transactor/.gitignore b/workers/transactor/.gitignore new file mode 100644 index 0000000000..0148aabfad --- /dev/null +++ b/workers/transactor/.gitignore @@ -0,0 +1,173 @@ +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +\*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +\*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +\*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +\*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.cache +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +.cache/ + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp +.cache + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.\* + +# wrangler project + +.dev.vars +.wrangler/ +src/model.json \ No newline at end of file diff --git a/workers/transactor/config/rig.json b/workers/transactor/config/rig.json new file mode 100644 index 0000000000..0110930f55 --- /dev/null +++ b/workers/transactor/config/rig.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json", + "rigPackageName": "@hcengineering/platform-rig" +} diff --git a/workers/transactor/package.json b/workers/transactor/package.json new file mode 100644 index 0000000000..61557e9255 --- /dev/null +++ b/workers/transactor/package.json @@ -0,0 +1,59 @@ +{ + "name": "@hcengineering/cloud-transactor", + "version": "0.0.0", + "private": true, + "template": "cloud", + "scripts": { + "deploy": "wrangler deploy", + "dev": "wrangler dev --port 3335", + "dev-local": "wrangler dev --port 3335 --local-upstream --host localhost", + "start": "wrangler dev --port 3335", + "logs": "npx wrangler tail --format pretty", + "cf-typegen": "wrangler types", + "get-model": "mkdir -p bundle && esbuild src/get-model.ts --bundle --keep-names --platform=node --define:process.env.MODEL_VERSION=$(node ../../common/scripts/show_version.js) --define:process.env.VERSION=$(node ../../common/scripts/show_tag.js) --define:process.env.GIT_REVISION=$(../../common/scripts/git_version.sh) --outfile=bundle/bundle.js --log-level=error && node ./bundle/bundle.js > ./src/model.json", + "bundle": "rushx get-model && wrangler deploy --dry-run --outdir dist", + "build": "compile", + "build:watch": "compile", + "test": "jest --passWithNoTests --silent --forceExit", + "format": "format src", + "_phase:bundle": "rushx get-model", + "_phase:build": "compile transpile src", + "_phase:test": "jest --passWithNoTests --silent --forceExit", + "_phase:format": "format src", + "_phase:validate": "compile validate" + }, + "devDependencies": { + "@cloudflare/workers-types": "^4.20241022.0", + "@hcengineering/model-all": "^0.6.0", + "@hcengineering/platform-rig": "^0.6.0", + "@types/jest": "^29.5.5", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", + "eslint-config-standard-with-typescript": "^40.0.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-n": "^15.4.0", + "eslint": "^8.54.0", + "jest": "^29.7.0", + "prettier": "^3.1.0", + "ts-jest": "^29.1.1", + "typescript": "^5.3.3", + "wrangler": "^3.97.0", + "esbuild": "^0.20.0" + }, + "dependencies": { + "@hcengineering/core": "^0.6.32", + "@hcengineering/middleware": "^0.6.0", + "@hcengineering/platform-rig": "^0.6.0", + "@hcengineering/rpc": "^0.6.5", + "@hcengineering/platform": "^0.6.11", + "@hcengineering/postgres": "^0.6.0", + "@hcengineering/server": "^0.6.4", + "@hcengineering/server-core": "^0.6.1", + "@hcengineering/server-client": "^0.6.0", + "@hcengineering/server-pipeline": "^0.6.0", + "@hcengineering/server-token": "^0.6.11", + "@hcengineering/storage": "^0.6.0", + "itty-router": "^5.0.18" + } +} diff --git a/workers/transactor/src/get-model.ts b/workers/transactor/src/get-model.ts new file mode 100644 index 0000000000..9f9b31b293 --- /dev/null +++ b/workers/transactor/src/get-model.ts @@ -0,0 +1 @@ +import '@hcengineering/model-all/src/show' diff --git a/workers/transactor/src/index.ts b/workers/transactor/src/index.ts new file mode 100644 index 0000000000..4b78fc56d6 --- /dev/null +++ b/workers/transactor/src/index.ts @@ -0,0 +1,50 @@ +// Copyright © 2024 Huly Labs. + +import { Router, error, html } from 'itty-router' + +import { decodeToken } from '@hcengineering/server-token' +import type { Transactor } from './transactor' + +export { Transactor } from './transactor' + +export interface Env { + TRANSACTOR: DurableObjectNamespace + + HYPERDRIVE: Hyperdrive + + SERVER_SECRET: string + ACCOUNTS_URL: string +} + +export default { + async fetch (request: Request, env: Env, ctx: ExecutionContext): Promise { + const router = Router() + + router + .get('/:token', ({ params, headers }) => { + if (headers.get('Upgrade') !== 'websocket') { + return new Response('Expected header Upgrade: websocket', { status: 426 }) + } + try { + const decodedToken = decodeToken(params.token, true, env.SERVER_SECRET) + console.log('connecting', decodedToken.email) + + const id = env.TRANSACTOR.idFromName(decodedToken.workspace.name) + const stub = env.TRANSACTOR.get(id) + + return stub.fetch(request) + } catch (err: any) { + return new Response('Expected header Upgrade: websocket', { status: 426 }) + } + }) + // TODO: Add statistics using storage + .all('/', () => + html( + `Huly® Transactor™ https://huly.io + © 2024 Huly Labs` + ) + ) + + return await router.fetch(request).catch(error) + } +} satisfies ExportedHandler diff --git a/workers/transactor/src/transactor.ts b/workers/transactor/src/transactor.ts new file mode 100644 index 0000000000..6ef836f161 --- /dev/null +++ b/workers/transactor/src/transactor.ts @@ -0,0 +1,287 @@ +// Copyright © 2024 Huly Labs. + +import { + Branding, + generateId, + MeasureMetricsContext, + type MeasureContext, + type WorkspaceIdWithUrl +} from '@hcengineering/core' +import { setMetadata } from '@hcengineering/platform' +import { RPCHandler } from '@hcengineering/rpc' +import { ClientSession, createSessionManager, doSessionOp, type WebsocketData } from '@hcengineering/server' +import serverClient from '@hcengineering/server-client' +import { + createDummyStorageAdapter, + loadBrandingMap, + Pipeline, + type ConnectionSocket, + type PipelineFactory, + type SessionManager +} from '@hcengineering/server-core' +// import { registerStringLoaders } from '@hcengineering/server-pipeline' +import serverPlugin, { decodeToken, type Token } from '@hcengineering/server-token' +import { DurableObject } from 'cloudflare:workers' + +// Approach usefull only for separate build, after model-all bundle phase is executed. +import { createPostgreeDestroyAdapter, createPostgresAdapter, createPostgresTxAdapter } from '@hcengineering/postgres' +import { + createServerPipeline, + registerAdapterFactry, + registerDestroyFactry, + registerServerPlugins, + registerTxAdapterFactry +} from '@hcengineering/server-pipeline' +import model from './model.json' + +export const PREFERRED_SAVE_SIZE = 500 +export const PREFERRED_SAVE_INTERVAL = 30 * 1000 + +export class Transactor extends DurableObject { + rpcHandler = new RPCHandler() + private workspace: string = '' + + private sessionManager!: SessionManager + + private readonly measureCtx: MeasureContext + + private readonly pipelineFactory: PipelineFactory + + private readonly accountsUrl: string + + private readonly sessions = new Map() + + constructor (ctx: DurableObjectState, env: Env) { + super(ctx, env) + + registerTxAdapterFactry('postgresql', createPostgresTxAdapter, true) + registerAdapterFactry('postgresql', createPostgresAdapter, true) + registerDestroyFactry('postgresql', createPostgreeDestroyAdapter, true) + + registerServerPlugins() + this.accountsUrl = env.ACCOUNTS_URL ?? 'http://127.0.0.1:3000' + + this.measureCtx = new MeasureMetricsContext('transactor-' + this.workspace, {}) + + setMetadata(serverPlugin.metadata.Secret, env.SERVER_SECRET ?? 'secret') + + console.log('Connecting DB to', env.DB_URL !== '' ? 'Direct ' : 'Hyperdrive') + + // TODO: + const storage = createDummyStorageAdapter() + + this.pipelineFactory = async (ctx, ws, upgrade, broadcast, branding) => { + const pipeline = createServerPipeline( + this.measureCtx, + env.DB_URL !== '' ? env.DB_URL : env.HYPERDRIVE.connectionString, + model, + { + externalStorage: storage, + adapterSecurity: false, + disableTriggers: false, + fulltextUrl: undefined // TODO: Pass fulltext service URI. + } + ) + return await pipeline(ctx, ws, upgrade, broadcast, branding) + } + + void this.ctx.blockConcurrencyWhile(async () => { + setMetadata(serverClient.metadata.Endpoint, env.ACCOUNTS_URL) + + this.sessionManager = createSessionManager( + this.measureCtx, + (token: Token, pipeline: Pipeline, workspaceId: WorkspaceIdWithUrl, branding: Branding | null) => + new ClientSession(token, pipeline, workspaceId, branding, false), + loadBrandingMap(), // TODO: Support branding map + { + pingTimeout: 10000, + reconnectTimeout: 3000 + }, + undefined, + this.accountsUrl + ) + }) + } + + async fetch (request: Request): Promise { + const { 0: client, 1: server } = new WebSocketPair() + + const url = new URL(request.url ?? '') + const token = url.pathname.substring(1) + + try { + const payload = decodeToken(token ?? '') + const sessionId = url.searchParams.get('sessionId') + + // By design, all fetches to this durable object will be for the same workspace + if (this.workspace === '') { + this.workspace = payload.workspace.name + } + + if (!(await this.handleSession(server, request, payload, token, sessionId))) { + return new Response(null, { status: 404 }) + } + return new Response(null, { status: 101, webSocket: client }) + } catch (err: any) { + console.error(err) + return new Response(null, { status: 404 }) + } + } + + async webSocketMessage (ws: WebSocket, message: ArrayBuffer | string): Promise { + const session = this.sessions.get(ws) + if (session === undefined) { + return + } + const cs = session.connectionSocket + if (cs === undefined) { + return + } + doSessionOp( + session, + (s, buff) => { + s.context.measure('receive-data', buff?.length ?? 0) + // processRequest(s.session, cs, s.context, s.workspaceId, buff, handleRequest) + const request = cs.readRequest(buff, s.session.binaryMode) + this.sessionManager.handleRequest(this.measureCtx, s.session, cs, request, this.workspace) + }, + typeof message === 'string' ? Buffer.from(message) : Buffer.from(message) + ) + } + + async webSocketError (ws: WebSocket, error: unknown): Promise { + console.error('WebSocket error:', error) + await this.handleClose(ws, 1011, 'error') + } + + async alarm (): Promise {} + + async handleSession ( + ws: WebSocket, + request: Request, + token: Token, + rawToken: string, + sessionId: string | null + ): Promise { + const data = { + remoteAddress: request.headers.get('CF-Connecting-IP') ?? '', + userAgent: request.headers.get('user-agent') ?? '', + language: request.headers.get('accept-language') ?? '', + email: token.email, + mode: token.extra?.mode, + model: token.extra?.model + } + const cs = this.createWebsocketClientSocket(ws, data) + + const session = await this.sessionManager.addSession( + this.measureCtx, + cs, + token, + rawToken, + this.pipelineFactory, + sessionId ?? undefined + ) + + const webSocketData: WebsocketData = { + connectionSocket: cs, + payload: token, + token: rawToken, + session, + url: '' + } + + if ('error' in session) { + if (session.terminate === true) { + ws.close() + } + throw session.error + } + if ('upgrade' in session) { + cs.send( + this.measureCtx, + { id: -1, result: { state: 'upgrading', stats: (session as any).upgradeInfo } }, + false, + false + ) + cs.close() + return true + } + + this.sessions.set(ws, webSocketData) + this.ctx.acceptWebSocket(ws) + + return true + } + + createWebsocketClientSocket ( + ws: WebSocket, + data: { + remoteAddress: string + userAgent: string + language: string + email: string + mode: any + model: any + } + ): ConnectionSocket { + const cs: ConnectionSocket = { + id: generateId(), + isClosed: false, + close: () => { + cs.isClosed = true + ws.close() + }, + checkState: () => { + if (ws.readyState === WebSocket.CLOSED || ws.readyState === WebSocket.CLOSING) { + ws.close() + return false + } + return true + }, + readRequest: (buffer: Buffer, binary: boolean) => { + return this.rpcHandler.readRequest(buffer, binary) + }, + data: () => data, + send: (ctx: MeasureContext, msg, binary, compression) => { + const smsg = this.rpcHandler.serialize(msg, binary) + + ctx.measure('send-data', smsg.length) + if (ws.readyState !== WebSocket.OPEN || cs.isClosed) { + return + } + ws.send(smsg) + } + } + return cs + } + + async broadcastMessage (message: Uint8Array, origin?: any): Promise { + const wss = this.ctx.getWebSockets().filter((ws) => ws.readyState === WebSocket.OPEN) + await Promise.all( + wss.map(async (ws) => { + await this.sendMessage(ws, message) + }) + ) + } + + async sendMessage (ws: WebSocket, message: Uint8Array): Promise { + try { + ws.send(message) + } catch (error) { + console.error('Failed to send message:', error) + await this.handleClose(ws, 1011, 'error') + } + } + + async handleClose (ws: WebSocket, code: number, reason?: string): Promise { + try { + ws.close(code, reason) + } catch (err) { + console.error('Failed to close WebSocket:', err) + } + const session = this.sessions.get(ws) + if (session !== undefined) { + await this.sessionManager.close(this.measureCtx, session.connectionSocket as ConnectionSocket, this.workspace) + } + } +} diff --git a/workers/transactor/tsconfig.json b/workers/transactor/tsconfig.json new file mode 100644 index 0000000000..6b38a447d2 --- /dev/null +++ b/workers/transactor/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "./node_modules/@hcengineering/platform-rig/profiles/default/tsconfig.json", + + "compilerOptions": { + "rootDir": "./src", + "outDir": "./lib", + "declarationDir": "./types", + "tsBuildInfoFile": ".build/build.tsbuildinfo", + "types": ["@cloudflare/workers-types", "jest"] + } +} diff --git a/workers/transactor/worker-configuration.d.ts b/workers/transactor/worker-configuration.d.ts new file mode 100644 index 0000000000..98c4262e9d --- /dev/null +++ b/workers/transactor/worker-configuration.d.ts @@ -0,0 +1,13 @@ +// Generated by Wrangler +// After adding bindings to `wrangler.toml`, regenerate this interface via `npm run cf-typegen` +interface Env { + TRANSACTOR: DurableObjectNamespace + + SERVER_SECRET: string + + HYPERDRIVE: Hyperdrive + + ACCOUNTS_URL: string + + DB_URL: string +} diff --git a/workers/transactor/wrangler.toml b/workers/transactor/wrangler.toml new file mode 100644 index 0000000000..4e0c8b19d4 --- /dev/null +++ b/workers/transactor/wrangler.toml @@ -0,0 +1,114 @@ +#:schema node_modules/wrangler/config-schema.json +name = "cloud-transactor" +main = "src/index.ts" +compatibility_date = "2024-09-23" +compatibility_flags = ["nodejs_compat_v2"] +keep_vars = true + +[observability.logs] +enabled = true + +# Automatically place your workloads in an optimal location to minimize latency. +# If you are running back-end logic in a Worker, running it closer to your back-end infrastructure +# rather than the end user may result in better performance. +# Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement +# [placement] +# mode = "smart" + +# Variable bindings. These are arbitrary, plaintext strings (similar to environment variables) +# Docs: +# - https://developers.cloudflare.com/workers/wrangler/configuration/#environment-variables +# Note: Use secrets to store sensitive data. +# - https://developers.cloudflare.com/workers/configuration/secrets/ +[vars] +# ACCOUNTS_URL = "http://127.0.0.1:3000" +# SERVER_SECRET = "secret" + +# Bind the Workers AI model catalog. Run machine learning models, powered by serverless GPUs, on Cloudflare’s global network +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#workers-ai +# [ai] +# binding = "AI" + +# Bind an Analytics Engine dataset. Use Analytics Engine to write analytics within your Pages Function. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#analytics-engine-datasets +# [[analytics_engine_datasets]] +# binding = "MY_DATASET" + +# Bind a headless browser instance running on Cloudflare's global network. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#browser-rendering +# [browser] +# binding = "MY_BROWSER" + +# Bind a D1 database. D1 is Cloudflare’s native serverless SQL database. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#d1-databases +# [[d1_databases]] +# binding = "MY_DB" +# database_name = "my-database" +# database_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" + +# Bind a dispatch namespace. Use Workers for Platforms to deploy serverless functions programmatically on behalf of your customers. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#dispatch-namespace-bindings-workers-for-platforms +# [[dispatch_namespaces]] +# binding = "MY_DISPATCHER" +# namespace = "my-namespace" + +# Bind a Durable Object. Durable objects are a scale-to-zero compute primitive based on the actor model. +# Durable Objects can live for as long as needed. Use these when you need a long-running "server", such as in realtime apps. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#durable-objects +[[durable_objects.bindings]] +name = "TRANSACTOR" +class_name = "Transactor" + +# Durable Object migrations. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#migrations +[[migrations]] +tag = "v1" +new_classes = ["Transactor"] + +# Bind a Hyperdrive configuration. Use to accelerate access to your existing databases from Cloudflare Workers. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#hyperdrive +[[hyperdrive]] +binding = "HYPERDRIVE" +id = "1f713bb2ec1b464cb663983feca4c89e" +localConnectionString = "postgresql://postgree:example@host.docker.internal:26257/defaultdb?sslmode=disable" + +# Bind a KV Namespace. Use KV as persistent storage for small key-value pairs. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#kv-namespaces +#[[kv_namespaces]] +#binding = "transactor_model" +#id = "" + +# Bind an mTLS certificate. Use to present a client certificate when communicating with another service. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#mtls-certificates +# [[mtls_certificates]] +# binding = "MY_CERTIFICATE" +# certificate_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" + +# Bind a Queue producer. Use this binding to schedule an arbitrary task that may be processed later by a Queue consumer. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#queues +# [[queues.producers]] +# binding = "MY_QUEUE" +# queue = "my-queue" + +# Bind a Queue consumer. Queue Consumers can retrieve tasks scheduled by Producers to act on them. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#queues +# [[queues.consumers]] +# queue = "my-queue" + +# Bind an R2 Bucket. Use R2 to store arbitrarily large blobs of data, such as files. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#r2-buckets +# [[r2_buckets]] +# binding = "MY_BUCKET" +# bucket_name = "my-bucket" + +# Bind another Worker service. Use this binding to call another Worker without network overhead. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#service-bindings +# [[services]] +# binding = "MY_SERVICE" +# service = "my-service" + +# Bind a Vectorize index. Use to store and query vector embeddings for semantic search, classification and other vector search use-cases. +# Docs: https://developers.cloudflare.com/workers/wrangler/configuration/#vectorize-indexes +# [[vectorize]] +# binding = "MY_INDEX" +# index_name = "my-index"