diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index e95b91172a..e344898855 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -61,10 +61,10 @@ dependencies: version: 1.49.1 '@rush-temp/account': specifier: file:./projects/account.tgz - version: file:projects/account.tgz(@types/node@20.11.19)(esbuild@0.24.2)(ts-node@10.9.2) + version: file:projects/account.tgz(@types/node@20.11.19)(esbuild@0.24.2)(snappy@7.2.2)(ts-node@10.9.2) '@rush-temp/account-service': specifier: file:./projects/account-service.tgz - version: file:projects/account-service.tgz + version: file:projects/account-service.tgz(snappy@7.2.2) '@rush-temp/activity': specifier: file:./projects/activity.tgz version: file:projects/activity.tgz(@types/node@20.11.19)(esbuild@0.24.2)(ts-node@10.9.2) @@ -109,7 +109,7 @@ dependencies: version: file:projects/attachment-resources.tgz(@types/node@20.11.19)(esbuild@0.24.2)(postcss-load-config@4.0.2)(postcss@8.4.35)(ts-node@10.9.2) '@rush-temp/auth-providers': specifier: file:./projects/auth-providers.tgz - version: file:projects/auth-providers.tgz(@types/node@20.11.19)(esbuild@0.24.2)(ts-node@10.9.2) + version: file:projects/auth-providers.tgz(@types/node@20.11.19)(esbuild@0.24.2)(snappy@7.2.2)(ts-node@10.9.2) '@rush-temp/backup-service': specifier: file:./projects/backup-service.tgz version: file:projects/backup-service.tgz(esbuild@0.24.2)(ts-node@10.9.2) @@ -158,9 +158,6 @@ dependencies: '@rush-temp/cloud-branding': specifier: file:./projects/cloud-branding.tgz version: file:projects/cloud-branding.tgz(@types/node@20.11.19)(bufferutil@4.0.8)(esbuild@0.24.2)(ts-node@10.9.2)(utf-8-validate@6.0.4) - '@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.24.2)(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) @@ -169,7 +166,7 @@ dependencies: version: file:projects/collaboration.tgz(esbuild@0.24.2)(ts-node@10.9.2) '@rush-temp/collaborator': specifier: file:./projects/collaborator.tgz - version: file:projects/collaborator.tgz(@tiptap/pm@2.6.6)(bufferutil@4.0.8)(utf-8-validate@6.0.4)(y-protocols@1.0.6) + version: file:projects/collaborator.tgz(@tiptap/pm@2.6.6)(bufferutil@4.0.8)(snappy@7.2.2)(utf-8-validate@6.0.4)(y-protocols@1.0.6) '@rush-temp/collaborator-client': specifier: file:./projects/collaborator-client.tgz version: file:projects/collaborator-client.tgz(ts-node@10.9.2) @@ -583,7 +580,7 @@ dependencies: version: file:projects/model-workbench.tgz '@rush-temp/mongo': specifier: file:./projects/mongo.tgz - version: file:projects/mongo.tgz(esbuild@0.24.2)(ts-node@10.9.2) + version: file:projects/mongo.tgz(esbuild@0.24.2)(snappy@7.2.2)(ts-node@10.9.2) '@rush-temp/notification': specifier: file:./projects/notification.tgz version: file:projects/notification.tgz(@types/node@20.11.19)(esbuild@0.24.2)(ts-node@10.9.2) @@ -616,19 +613,19 @@ dependencies: version: file:projects/platform-rig.tgz(@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)(svelte@4.2.19) '@rush-temp/pod-account': specifier: file:./projects/pod-account.tgz - version: file:projects/pod-account.tgz + version: file:projects/pod-account.tgz(snappy@7.2.2) '@rush-temp/pod-ai-bot': specifier: file:./projects/pod-ai-bot.tgz - version: file:projects/pod-ai-bot.tgz(bufferutil@4.0.8)(utf-8-validate@6.0.4)(zod@3.23.8) + version: file:projects/pod-ai-bot.tgz(bufferutil@4.0.8)(snappy@7.2.2)(utf-8-validate@6.0.4)(zod@3.23.8) '@rush-temp/pod-analytics-collector': specifier: file:./projects/pod-analytics-collector.tgz - version: file:projects/pod-analytics-collector.tgz(bufferutil@4.0.8)(utf-8-validate@6.0.4) + version: file:projects/pod-analytics-collector.tgz(bufferutil@4.0.8)(snappy@7.2.2)(utf-8-validate@6.0.4) '@rush-temp/pod-backup': specifier: file:./projects/pod-backup.tgz version: file:projects/pod-backup.tgz '@rush-temp/pod-calendar': specifier: file:./projects/pod-calendar.tgz - version: file:projects/pod-calendar.tgz(bufferutil@4.0.8)(ts-node@10.9.2)(utf-8-validate@6.0.4) + version: file:projects/pod-calendar.tgz(bufferutil@4.0.8)(snappy@7.2.2)(ts-node@10.9.2)(utf-8-validate@6.0.4) '@rush-temp/pod-collaborator': specifier: file:./projects/pod-collaborator.tgz version: file:projects/pod-collaborator.tgz @@ -640,10 +637,10 @@ dependencies: version: file:projects/pod-fulltext.tgz '@rush-temp/pod-github': specifier: file:./projects/pod-github.tgz - version: file:projects/pod-github.tgz(bufferutil@4.0.8)(utf-8-validate@6.0.4)(y-prosemirror@1.2.12) + version: file:projects/pod-github.tgz(bufferutil@4.0.8)(snappy@7.2.2)(utf-8-validate@6.0.4)(y-prosemirror@1.2.12) '@rush-temp/pod-gmail': specifier: file:./projects/pod-gmail.tgz - version: file:projects/pod-gmail.tgz(ts-node@10.9.2) + version: file:projects/pod-gmail.tgz(snappy@7.2.2)(ts-node@10.9.2) '@rush-temp/pod-love': specifier: file:./projects/pod-love.tgz version: file:projects/pod-love.tgz(bufferutil@4.0.8)(utf-8-validate@6.0.4) @@ -658,19 +655,19 @@ dependencies: version: file:projects/pod-ses.tgz '@rush-temp/pod-sign': specifier: file:./projects/pod-sign.tgz - version: file:projects/pod-sign.tgz + version: file:projects/pod-sign.tgz(snappy@7.2.2) '@rush-temp/pod-stats': specifier: file:./projects/pod-stats.tgz version: file:projects/pod-stats.tgz '@rush-temp/pod-telegram': specifier: file:./projects/pod-telegram.tgz - version: file:projects/pod-telegram.tgz(bufferutil@4.0.8)(ts-node@10.9.2)(utf-8-validate@6.0.4) + version: file:projects/pod-telegram.tgz(bufferutil@4.0.8)(snappy@7.2.2)(ts-node@10.9.2)(utf-8-validate@6.0.4) '@rush-temp/pod-telegram-bot': specifier: file:./projects/pod-telegram-bot.tgz - version: file:projects/pod-telegram-bot.tgz(bufferutil@4.0.8)(utf-8-validate@6.0.4) + version: file:projects/pod-telegram-bot.tgz(bufferutil@4.0.8)(snappy@7.2.2)(utf-8-validate@6.0.4) '@rush-temp/pod-workspace': specifier: file:./projects/pod-workspace.tgz - version: file:projects/pod-workspace.tgz + version: file:projects/pod-workspace.tgz(snappy@7.2.2) '@rush-temp/postgres': specifier: file:./projects/postgres.tgz version: file:projects/postgres.tgz(esbuild@0.24.2)(ts-node@10.9.2) @@ -961,7 +958,7 @@ dependencies: version: file:projects/server-token.tgz(esbuild@0.24.2)(ts-node@10.9.2) '@rush-temp/server-tool': specifier: file:./projects/server-tool.tgz - version: file:projects/server-tool.tgz(@types/node@20.11.19)(esbuild@0.24.2)(ts-node@10.9.2) + version: file:projects/server-tool.tgz(@types/node@20.11.19)(esbuild@0.24.2)(snappy@7.2.2)(ts-node@10.9.2) '@rush-temp/server-tracker': specifier: file:./projects/server-tracker.tgz version: file:projects/server-tracker.tgz(esbuild@0.24.2)(ts-node@10.9.2) @@ -1093,7 +1090,7 @@ dependencies: version: file:projects/time-resources.tgz(@tiptap/core@2.6.6)(@tiptap/pm@2.6.6)(@types/node@20.11.19)(esbuild@0.24.2)(postcss-load-config@4.0.2)(postcss@8.4.35)(ts-node@10.9.2) '@rush-temp/tool': specifier: file:./projects/tool.tgz - version: file:projects/tool.tgz + version: file:projects/tool.tgz(snappy@7.2.2) '@rush-temp/tracker': specifier: file:./projects/tracker.tgz version: file:projects/tracker.tgz(@types/node@20.11.19)(esbuild@0.24.2)(ts-node@10.9.2) @@ -1238,6 +1235,9 @@ dependencies: '@tiptap/extension-text-align': specifier: ~2.11.0 version: 2.11.0(@tiptap/core@2.6.6) + '@tiptap/extension-text-style': + specifier: ~2.11.0 + version: 2.11.0(@tiptap/core@2.6.6) '@tiptap/extension-typography': specifier: ^2.6.6 version: 2.6.6(@tiptap/core@2.6.6) @@ -1376,6 +1376,9 @@ dependencies: '@types/sharp': specifier: ~0.32.0 version: 0.32.0 + '@types/snappyjs': + specifier: ^0.7.1 + version: 0.7.1 '@types/tar-stream': specifier: ^3.1.3 version: 3.1.3 @@ -1442,9 +1445,6 @@ dependencies: aws-sdk: specifier: ^2.1423.0 version: 2.1664.0 - aws4fetch: - specifier: ^1.0.20 - version: 1.0.20 base64-js: specifier: ^1.5.1 version: 1.5.1 @@ -1741,7 +1741,7 @@ dependencies: version: 8.0.0 mongodb: specifier: ^6.12.0 - version: 6.12.0 + version: 6.12.0(snappy@7.2.2) morgan: specifier: ^1.10.0 version: 1.10.0 @@ -1850,6 +1850,12 @@ dependencies: smee-client: specifier: ^1.2.3 version: 1.2.5 + snappy: + specifier: ^7.2.2 + version: 7.2.2 + snappyjs: + specifier: ^0.7.0 + version: 0.7.0 style-loader: specifier: ^3.3.1 version: 3.3.4(webpack@5.97.1) @@ -4927,6 +4933,123 @@ packages: dev: false optional: true + /@napi-rs/snappy-android-arm-eabi@7.2.2: + resolution: {integrity: sha512-H7DuVkPCK5BlAr1NfSU8bDEN7gYs+R78pSHhDng83QxRnCLmVIZk33ymmIwurmoA1HrdTxbkbuNl+lMvNqnytw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/snappy-android-arm64@7.2.2: + resolution: {integrity: sha512-2R/A3qok+nGtpVK8oUMcrIi5OMDckGYNoBLFyli3zp8w6IArPRfg1yOfVUcHvpUDTo9T7LOS1fXgMOoC796eQw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/snappy-darwin-arm64@7.2.2: + resolution: {integrity: sha512-USgArHbfrmdbuq33bD5ssbkPIoT7YCXCRLmZpDS6dMDrx+iM7eD2BecNbOOo7/v1eu6TRmQ0xOzeQ6I/9FIi5g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/snappy-darwin-x64@7.2.2: + resolution: {integrity: sha512-0APDu8iO5iT0IJKblk2lH0VpWSl9zOZndZKnBYIc+ei1npw2L5QvuErFOTeTdHBtzvUHASB+9bvgaWnQo4PvTQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/snappy-freebsd-x64@7.2.2: + resolution: {integrity: sha512-mRTCJsuzy0o/B0Hnp9CwNB5V6cOJ4wedDTWEthsdKHSsQlO7WU9W1yP7H3Qv3Ccp/ZfMyrmG98Ad7u7lG58WXA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/snappy-linux-arm-gnueabihf@7.2.2: + resolution: {integrity: sha512-v1uzm8+6uYjasBPcFkv90VLZ+WhLzr/tnfkZ/iD9mHYiULqkqpRuC8zvc3FZaJy5wLQE9zTDkTJN1IvUcZ+Vcg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/snappy-linux-arm64-gnu@7.2.2: + resolution: {integrity: sha512-LrEMa5pBScs4GXWOn6ZYXfQ72IzoolZw5txqUHVGs8eK4g1HR9HTHhb2oY5ySNaKakG5sOgMsb1rwaEnjhChmQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/snappy-linux-arm64-musl@7.2.2: + resolution: {integrity: sha512-3orWZo9hUpGQcB+3aTLW7UFDqNCQfbr0+MvV67x8nMNYj5eAeUtMmUE/HxLznHO4eZ1qSqiTwLbVx05/Socdlw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/snappy-linux-x64-gnu@7.2.2: + resolution: {integrity: sha512-jZt8Jit/HHDcavt80zxEkDpH+R1Ic0ssiVCoueASzMXa7vwPJeF4ZxZyqUw4qeSy7n8UUExomu8G8ZbP6VKhgw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/snappy-linux-x64-musl@7.2.2: + resolution: {integrity: sha512-Dh96IXgcZrV39a+Tej/owcd9vr5ihiZ3KRix11rr1v0MWtVb61+H1GXXlz6+Zcx9y8jM1NmOuiIuJwkV4vZ4WA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/snappy-win32-arm64-msvc@7.2.2: + resolution: {integrity: sha512-9No0b3xGbHSWv2wtLEn3MO76Yopn1U2TdemZpCaEgOGccz1V+a/1d16Piz3ofSmnA13HGFz3h9NwZH9EOaIgYA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/snappy-win32-ia32-msvc@7.2.2: + resolution: {integrity: sha512-QiGe+0G86J74Qz1JcHtBwM3OYdTni1hX1PFyLRo3HhQUSpmi13Bzc1En7APn+6Pvo7gkrcy81dObGLDSxFAkQQ==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@napi-rs/snappy-win32-x64-msvc@7.2.2: + resolution: {integrity: sha512-a43cyx1nK0daw6BZxVcvDEXxKMFLSBSDTAhsFD0VqSKcC7MGUBMaqyoWUcMiI7LBSz4bxUmxDWKfCYzpEmeb3w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -6260,6 +6383,14 @@ packages: '@tiptap/core': 2.6.6(@tiptap/pm@2.6.6) dev: false + /@tiptap/extension-text-style@2.11.0(@tiptap/core@2.6.6): + resolution: {integrity: sha512-vuA16wMZ6J3fboL7FObwV2f5uN9Vg0WYmqU7971vxzJyaRj9VE1eeH8Kh5fq4RgwDzc13MZGvZZV4HcE1R8o8A==} + peerDependencies: + '@tiptap/core': ^2.7.0 + dependencies: + '@tiptap/core': 2.6.6(@tiptap/pm@2.6.6) + dev: false + /@tiptap/extension-text@2.6.6(@tiptap/core@2.6.6): resolution: {integrity: sha512-e84uILnRzNzcwK1DVQNpXVmBG1Cq3BJipTOIDl1LHifOok7MBjhI/X+/NR0bd3N2t6gmDTWi63+4GuJ5EeDmsg==} peerDependencies: @@ -6918,13 +7049,6 @@ packages: '@types/koa': 2.15.0 dev: false - /@types/koa-morgan@1.0.8: - resolution: {integrity: sha512-2GredUi+iA3V0XrbzdsOAYgwj4F6+FnN+f5YjoKjessIE2lrMkqnc06YQQnzbMG75hRsXjyD+p6d5vlI70s1vg==} - dependencies: - '@types/koa': 2.14.0 - '@types/morgan': 1.9.9 - dev: false - /@types/koa-passport@6.0.3: resolution: {integrity: sha512-9iV8aiSICfBZpqkkzUshqxN2wTuoj4HGRRH0Idv3lHhXV9rZRCOyDdJSg+vZ6RHSQg0ZeBeAdIL4r/l8bR4SPA==} dependencies: @@ -6945,19 +7069,6 @@ packages: '@types/koa': 2.15.0 dev: false - /@types/koa@2.14.0: - resolution: {integrity: sha512-DTDUyznHGNHAl+wd1n0z1jxNajduyTh8R53xoewuerdBzGo6Ogj6F2299BFtrexJw4NtgjsI5SMPCmV9gZwGXA==} - dependencies: - '@types/accepts': 1.3.7 - '@types/content-disposition': 0.5.8 - '@types/cookies': 0.9.0 - '@types/http-assert': 1.5.5 - '@types/http-errors': 2.0.4 - '@types/keygrip': 1.0.6 - '@types/koa-compose': 3.2.8 - '@types/node': 20.11.19 - dev: false - /@types/koa@2.15.0: resolution: {integrity: sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==} dependencies: @@ -7192,6 +7303,10 @@ packages: sharp: 0.32.6 dev: false + /@types/snappyjs@0.7.1: + resolution: {integrity: sha512-OxjzJ6cQZstysMh6PEwZWmK9qlKZyezHJKOkcUkZDooSFuog2votUEKkxMaTq51UQF3cJkXKQ+XGlj4FSl8JQQ==} + dev: false + /@types/sockjs@0.3.36: resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} dependencies: @@ -8652,10 +8767,6 @@ packages: xml2js: 0.6.2 dev: false - /aws4fetch@1.0.20: - resolution: {integrity: sha512-/djoAN709iY65ETD6LKCtyyEI04XIBP5xVvfmNxsEP0uJB5tyaGBztSryRr4HqMStr9R06PisQE7m9zDTXKu6g==} - dev: false - /axobject-query@4.0.0: resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} dependencies: @@ -15097,12 +15208,6 @@ packages: koa-compose: 4.1.0 dev: false - /koa-morgan@1.0.1: - resolution: {integrity: sha512-JOUdCNlc21G50afBXfErUrr1RKymbgzlrO5KURY+wmDG1Uvd2jmxUJcHgylb/mYXy2SjiNZyYim/ptUBGsIi3A==} - dependencies: - morgan: 1.10.0 - dev: false - /koa-passport@6.0.0: resolution: {integrity: sha512-bgcrQN7Ylfgi1PVr5l6hHYkr38RHUzx+ty3m7e/xoTte8MR0zbDt6+pvP3/nuF/yXL6Ba7IzX1rSqmCy6OrrIw==} engines: {node: '>= 4'} @@ -16209,7 +16314,7 @@ packages: whatwg-url: 13.0.0 dev: false - /mongodb@6.12.0: + /mongodb@6.12.0(snappy@7.2.2): resolution: {integrity: sha512-RM7AHlvYfS7jv7+BXund/kR64DryVI+cHbVAy9P61fnb1RcWZqOW1/Wj2YhqMCx+MuYhqTRGv7AwHBzmsCKBfA==} engines: {node: '>=16.20.1'} peerDependencies: @@ -16239,6 +16344,7 @@ packages: '@mongodb-js/saslprep': 1.1.9 bson: 6.10.1 mongodb-connection-string-url: 3.0.0 + snappy: 7.2.2 dev: false /mongodb@6.3.0: @@ -19011,6 +19117,29 @@ packages: - supports-color dev: false + /snappy@7.2.2: + resolution: {integrity: sha512-iADMq1kY0v3vJmGTuKcFWSXt15qYUz7wFkArOrsSg0IFfI3nJqIJvK2/ZbEIndg7erIJLtAVX2nSOqPz7DcwbA==} + engines: {node: '>= 10'} + optionalDependencies: + '@napi-rs/snappy-android-arm-eabi': 7.2.2 + '@napi-rs/snappy-android-arm64': 7.2.2 + '@napi-rs/snappy-darwin-arm64': 7.2.2 + '@napi-rs/snappy-darwin-x64': 7.2.2 + '@napi-rs/snappy-freebsd-x64': 7.2.2 + '@napi-rs/snappy-linux-arm-gnueabihf': 7.2.2 + '@napi-rs/snappy-linux-arm64-gnu': 7.2.2 + '@napi-rs/snappy-linux-arm64-musl': 7.2.2 + '@napi-rs/snappy-linux-x64-gnu': 7.2.2 + '@napi-rs/snappy-linux-x64-musl': 7.2.2 + '@napi-rs/snappy-win32-arm64-msvc': 7.2.2 + '@napi-rs/snappy-win32-ia32-msvc': 7.2.2 + '@napi-rs/snappy-win32-x64-msvc': 7.2.2 + dev: false + + /snappyjs@0.7.0: + resolution: {integrity: sha512-u5iEEXkMe2EInQio6Wv9LWHOQYRDbD2O9hzS27GpT/lwfIQhTCnHCTqedqHIHe9ZcvQo+9au6vngQayipz1NYw==} + dev: false + /sockjs@0.3.24: resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} dependencies: @@ -21795,8 +21924,9 @@ packages: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} dev: false - file:projects/account-service.tgz: + file:projects/account-service.tgz(snappy@7.2.2): resolution: {integrity: sha512-oAW0UD+ThGbtuXdyaoWJoe93XY7bLO0K2uZneePiHsI3KZM3z9st9fjxSbJE4wmC9iE2wmzNYTN6AHrcFxvRrQ==, tarball: file:projects/account-service.tgz} + id: file:projects/account-service.tgz name: '@rush-temp/account-service' version: 0.0.0 dependencies: @@ -21804,7 +21934,6 @@ packages: '@types/jest': 29.5.12 '@types/koa': 2.15.0 '@types/koa-bodyparser': 4.3.12 - '@types/koa-morgan': 1.0.8 '@types/koa-router': 7.4.8 '@types/koa__cors': 5.0.0 '@types/node': 20.11.19 @@ -21820,9 +21949,8 @@ packages: jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) koa: 2.15.3 koa-bodyparser: 4.4.1 - koa-morgan: 1.0.1 koa-router: 12.0.1 - mongodb: 6.12.0 + mongodb: 6.12.0(snappy@7.2.2) prettier: 3.2.5 ts-jest: 29.1.2(esbuild@0.24.2)(jest@29.7.0)(typescript@5.3.3) ts-node: 10.9.2(@types/node@20.11.19)(typescript@5.3.3) @@ -21845,7 +21973,7 @@ packages: - supports-color dev: false - file:projects/account.tgz(@types/node@20.11.19)(esbuild@0.24.2)(ts-node@10.9.2): + file:projects/account.tgz(@types/node@20.11.19)(esbuild@0.24.2)(snappy@7.2.2)(ts-node@10.9.2): resolution: {integrity: sha512-aFUxA1twR0m+7sDVFXyKoeVQtVLMrr973LpLK6LHrRa+PD010X6+AyoOkkyVJKFN0Q6zu2Oqz88PsEt50Z2Mjg==, tarball: file:projects/account.tgz} id: file:projects/account.tgz name: '@rush-temp/account' @@ -21861,7 +21989,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.12.0 + mongodb: 6.12.0(snappy@7.2.2) otp-generator: 4.0.1 postgres: 3.4.5 prettier: 3.2.5 @@ -22385,7 +22513,7 @@ packages: - ts-node dev: false - file:projects/auth-providers.tgz(@types/node@20.11.19)(esbuild@0.24.2)(ts-node@10.9.2): + file:projects/auth-providers.tgz(@types/node@20.11.19)(esbuild@0.24.2)(snappy@7.2.2)(ts-node@10.9.2): resolution: {integrity: sha512-jUJhz8FiPT3x0ybVjdPysK9HBA/E1UzU+QraBxLurUXjwKzqnob4Jw112MUJzyHjAiAmYQGYq7jEePiav6nnMQ==, tarball: file:projects/auth-providers.tgz} id: file:projects/auth-providers.tgz name: '@rush-temp/auth-providers' @@ -22412,7 +22540,7 @@ packages: koa-passport: 6.0.0 koa-router: 12.0.1 koa-session: 6.4.0 - mongodb: 6.12.0 + mongodb: 6.12.0(snappy@7.2.2) openid-client: 5.7.0 passport-custom: 1.1.1 passport-github2: 0.1.12 @@ -22906,12 +23034,13 @@ packages: dev: false file:projects/client-resources.tgz(@types/node@20.11.19)(esbuild@0.24.2)(ts-node@10.9.2): - resolution: {integrity: sha512-zqTNrWtf8+kFkWdM9yok0EgXP9QsxCFomNW1HWyBp0arKXDQMjgA6UJ5qviDhYPjFzQzJil5DRax82wZfvVSkw==, tarball: file:projects/client-resources.tgz} + resolution: {integrity: sha512-s2VP7YDaXR6VMITb2/kgWe69RxM1XaTdNHQJfliJfFaV88egZSK6JNmB40FoA/QY0Vvf7SmJH/Ld+bvjZqGpWA==, tarball: file:projects/client-resources.tgz} id: file:projects/client-resources.tgz name: '@rush-temp/client-resources' version: 0.0.0 dependencies: '@types/jest': 29.5.12 + '@types/snappyjs': 0.7.1 '@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 @@ -22921,6 +23050,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 + snappyjs: 0.7.0 ts-jest: 29.1.2(esbuild@0.24.2)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: @@ -23000,51 +23130,15 @@ packages: - utf-8-validate dev: false - file:projects/cloud-datalake.tgz(@types/node@20.11.19)(bufferutil@4.0.8)(esbuild@0.24.2)(ts-node@10.9.2)(utf-8-validate@6.0.4): - 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.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 - 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) - postgres: 3.4.5 - prettier: 3.2.5 - ts-jest: 29.1.2(esbuild@0.24.2)(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 - - esbuild - - node-notifier - - supports-color - - ts-node - - 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-6kBv/3KfTsOvsDrfVXQvQwtLM72ltx4oPHc3cJ9xtG82XLeQLLpeJmCy6CNDVOtXaqnagwF5TKm/zCw4sc/dFQ==, tarball: file:projects/cloud-transactor.tgz} + resolution: {integrity: sha512-sLn0+hzDxI1PlNcx3XiLzwU9xU+mui2QodGtjpn7oS5NWnGWM42fbnwfVP35akfki8kKOZ3pE5CcMKQ6ffjUzg==, 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 + '@types/snappyjs': 0.7.1 '@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.24.2 @@ -23056,6 +23150,7 @@ packages: itty-router: 5.0.18 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + snappyjs: 0.7.0 ts-jest: 29.1.2(esbuild@0.24.2)(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) @@ -23136,7 +23231,7 @@ packages: - ts-node dev: false - file:projects/collaborator.tgz(@tiptap/pm@2.6.6)(bufferutil@4.0.8)(utf-8-validate@6.0.4)(y-protocols@1.0.6): + file:projects/collaborator.tgz(@tiptap/pm@2.6.6)(bufferutil@4.0.8)(snappy@7.2.2)(utf-8-validate@6.0.4)(y-protocols@1.0.6): resolution: {integrity: sha512-5wz+fFNfftwF7QP2u/dvfT2DYB7xFgplfhalPFYz8sLmXJ0NPVsXcr7qve637Vw8tjwjf4zzk3MJpfeJRcWLXQ==, tarball: file:projects/collaborator.tgz} id: file:projects/collaborator.tgz name: '@rush-temp/collaborator' @@ -23166,7 +23261,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) express: 4.21.2 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) - mongodb: 6.12.0 + mongodb: 6.12.0(snappy@7.2.2) prettier: 3.2.5 ts-jest: 29.1.2(esbuild@0.24.2)(jest@29.7.0)(typescript@5.3.3) ts-node: 10.9.2(@types/node@20.11.19)(typescript@5.3.3) @@ -26860,7 +26955,7 @@ packages: - ts-node dev: false - file:projects/mongo.tgz(esbuild@0.24.2)(ts-node@10.9.2): + file:projects/mongo.tgz(esbuild@0.24.2)(snappy@7.2.2)(ts-node@10.9.2): resolution: {integrity: sha512-aqU57iG6awiTX9qWSrzXMKyHSbt0V8mKAutQjE3uCx9FdPpnGiZjJflWsMS5PaZ4MdNazv2vUg4XPDHKCc4A/A==, tarball: file:projects/mongo.tgz} id: file:projects/mongo.tgz name: '@rush-temp/mongo' @@ -26877,7 +26972,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.12.0 + mongodb: 6.12.0(snappy@7.2.2) prettier: 3.2.5 ts-jest: 29.1.2(esbuild@0.24.2)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 @@ -27248,8 +27343,9 @@ packages: - ts-node dev: false - file:projects/pod-account.tgz: + file:projects/pod-account.tgz(snappy@7.2.2): resolution: {integrity: sha512-DCZlxY22Z2TNo08v2hcwz+2yg0HfoH2psDkdlVGlzX5KwZt6knEzAUZeb+MiOb7KpGSQoKp4jJDcydUcC+QsVQ==, tarball: file:projects/pod-account.tgz} + id: file:projects/pod-account.tgz name: '@rush-temp/pod-account' version: 0.0.0 dependencies: @@ -27273,9 +27369,8 @@ packages: koa: 2.15.3 koa-bodyparser: 4.4.1 koa-router: 12.0.1 - mongodb: 6.12.0 + mongodb: 6.12.0(snappy@7.2.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.24.2)(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 @@ -27297,8 +27392,8 @@ packages: - supports-color dev: false - file:projects/pod-ai-bot.tgz(bufferutil@4.0.8)(utf-8-validate@6.0.4)(zod@3.23.8): - resolution: {integrity: sha512-OPo+KhRKsPQhO1eqOIgL30ef9s/TAnEf21bAwzxLLcB70AIwMyjfPRzzJHDOIbVjCzA8t4YFQ5MWWoLUveylFg==, tarball: file:projects/pod-ai-bot.tgz} + file:projects/pod-ai-bot.tgz(bufferutil@4.0.8)(snappy@7.2.2)(utf-8-validate@6.0.4)(zod@3.23.8): + resolution: {integrity: sha512-R2ByQWsnvxxBGk/Ql7z8CK8NRb4XXREC0rndthdpfqw1dhwofuHiHpU2sb7L+OTHiz0do16L5gOLb7R1CbMecw==, tarball: file:projects/pod-ai-bot.tgz} id: file:projects/pod-ai-bot.tgz name: '@rush-temp/pod-ai-bot' version: 0.0.0 @@ -27308,7 +27403,6 @@ packages: '@types/express': 4.17.21 '@types/jest': 29.5.12 '@types/node': 20.11.19 - '@types/node-fetch': 2.6.11 '@types/uuid': 8.3.4 '@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) @@ -27327,8 +27421,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.12.0 - node-fetch: 2.7.0 + mongodb: 6.12.0(snappy@7.2.2) openai: 4.56.0(zod@3.23.8) prettier: 3.2.5 ts-jest: 29.1.2(esbuild@0.24.2)(jest@29.7.0)(typescript@5.3.3) @@ -27358,7 +27451,7 @@ packages: - zod dev: false - file:projects/pod-analytics-collector.tgz(bufferutil@4.0.8)(utf-8-validate@6.0.4): + file:projects/pod-analytics-collector.tgz(bufferutil@4.0.8)(snappy@7.2.2)(utf-8-validate@6.0.4): resolution: {integrity: sha512-KuE4/ZuLMoEOqY2QyXv7AD0uPt5J7Uwt6jP70iWXcR2oET1+BhD2QTm/9MNsgOsnfiqp0Tdv06pfu7fb2A2Gcw==, tarball: file:projects/pod-analytics-collector.tgz} id: file:projects/pod-analytics-collector.tgz name: '@rush-temp/pod-analytics-collector' @@ -27369,7 +27462,6 @@ packages: '@types/express': 4.17.21 '@types/jest': 29.5.12 '@types/node': 20.11.19 - '@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) cors: 2.8.5 @@ -27383,13 +27475,12 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) express: 4.21.2 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) - mongodb: 6.12.0 + mongodb: 6.12.0(snappy@7.2.2) 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.24.2)(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 - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@babel/core' @@ -27446,7 +27537,7 @@ packages: - supports-color dev: false - file:projects/pod-calendar.tgz(bufferutil@4.0.8)(ts-node@10.9.2)(utf-8-validate@6.0.4): + file:projects/pod-calendar.tgz(bufferutil@4.0.8)(snappy@7.2.2)(ts-node@10.9.2)(utf-8-validate@6.0.4): resolution: {integrity: sha512-THWVQC4htKDjD5lYArV/wgfiwaIoY+a82QlSzT2zRDoJwCzs0ivWxnl+eeCGMgTwb3YA5sbhu9afg3P1MWjNpQ==, tarball: file:projects/pod-calendar.tgz} id: file:projects/pod-calendar.tgz name: '@rush-temp/pod-calendar' @@ -27476,7 +27567,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.12.0 + mongodb: 6.12.0(snappy@7.2.2) prettier: 3.2.5 ts-jest: 29.1.2(esbuild@0.24.2)(jest@29.7.0)(typescript@5.3.3) ts-node-dev: 2.0.0(@types/node@20.11.19)(typescript@5.3.3) @@ -27625,7 +27716,7 @@ packages: - supports-color dev: false - file:projects/pod-github.tgz(bufferutil@4.0.8)(utf-8-validate@6.0.4)(y-prosemirror@1.2.12): + file:projects/pod-github.tgz(bufferutil@4.0.8)(snappy@7.2.2)(utf-8-validate@6.0.4)(y-prosemirror@1.2.12): resolution: {integrity: sha512-VO1ipLvo8rWOvJVHMLOW5Xl6JkxWOw7wKEpGWweoJDdrYUIK+od4eVqaGDy2YgyXfQOxmJFTGOZ0l84+PcS3hw==, tarball: file:projects/pod-github.tgz} id: file:projects/pod-github.tgz name: '@rush-temp/pod-github' @@ -27685,7 +27776,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.12.0 + mongodb: 6.12.0(snappy@7.2.2) octokit: 3.2.1 prettier: 3.2.5 smee-client: 1.2.5 @@ -27714,7 +27805,7 @@ packages: - y-prosemirror dev: false - file:projects/pod-gmail.tgz(ts-node@10.9.2): + file:projects/pod-gmail.tgz(snappy@7.2.2)(ts-node@10.9.2): resolution: {integrity: sha512-/NcwrUow5fptRQxcxnzc5ZT/wtBBdlWQRT+IglOudqZbVoN/aSwAXaKd4BoPTyGOPW0D0M2SLYFXZlPvhV4BjQ==, tarball: file:projects/pod-gmail.tgz} id: file:projects/pod-gmail.tgz name: '@rush-temp/pod-gmail' @@ -27726,7 +27817,6 @@ packages: '@types/jest': 29.5.12 '@types/node': 20.11.19 '@types/uuid': 8.3.4 - '@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) cors: 2.8.5 @@ -27746,7 +27836,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.12.0 + mongodb: 6.12.0(snappy@7.2.2) prettier: 3.2.5 ts-jest: 29.1.2(esbuild@0.24.2)(jest@29.7.0)(typescript@5.3.3) ts-node-dev: 2.0.0(@types/node@20.11.19)(typescript@5.3.3) @@ -27773,7 +27863,7 @@ packages: dev: false file:projects/pod-love.tgz(bufferutil@4.0.8)(utf-8-validate@6.0.4): - resolution: {integrity: sha512-Ibi2id+aFeeH3lGo2z5GW3Wg3ZWha/5VTWYxXxC0IQr/ivvk+LFlWShEuCyG8XYvIoy6OVAmafgpfOKeUrQjsg==, tarball: file:projects/pod-love.tgz} + resolution: {integrity: sha512-G70rzmJHk/en1EdQHEs2HEK9/D2IY0i/iF0WZtU2FWLtSzlJb5UC0hrpVfxD/aWcnfmmqcLQu+b2siYrnUFSmQ==, tarball: file:projects/pod-love.tgz} id: file:projects/pod-love.tgz name: '@rush-temp/pod-love' version: 0.0.0 @@ -27865,7 +27955,7 @@ packages: dev: false file:projects/pod-server.tgz(utf-8-validate@6.0.4): - resolution: {integrity: sha512-4gQfkwfde44+kJ+YPimPEoDHtgdMRy0+J2xk/Uum9wWjKHCe8tQsQZUJxp6S5BU3DPBMaVsC0h9N0jxHpWK49A==, tarball: file:projects/pod-server.tgz} + resolution: {integrity: sha512-U7wNYw+h8a6hEV6fwXYJFStTk5noW4LAsL1G4JCJjyQ7PVzlmXZqGncFe+bq5EqgYgbOewZ2tR+T8rB8HWi9Cw==, tarball: file:projects/pod-server.tgz} id: file:projects/pod-server.tgz name: '@rush-temp/pod-server' version: 0.0.0 @@ -27888,6 +27978,8 @@ packages: msgpackr: 1.11.2 msgpackr-extract: 3.0.3 prettier: 3.2.5 + snappy: 7.2.2 + snappyjs: 0.7.0 ts-jest: 29.1.2(esbuild@0.24.2)(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 @@ -27946,8 +28038,9 @@ packages: - supports-color dev: false - file:projects/pod-sign.tgz: + file:projects/pod-sign.tgz(snappy@7.2.2): resolution: {integrity: sha512-2CvZ6MihYZ/0DXWllTffUrvNyRjLJvvUkcT36EpVmgydo2F4guxAhrnsyaivxNPNwP8NuSy7JJ4uXXOYNeXCQg==, tarball: file:projects/pod-sign.tgz} + id: file:projects/pod-sign.tgz name: '@rush-temp/pod-sign' version: 0.0.0 dependencies: @@ -27960,7 +28053,6 @@ packages: '@types/express': 4.17.21 '@types/jest': 29.5.12 '@types/node': 20.11.19 - '@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) cors: 2.8.5 @@ -27974,7 +28066,7 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) express: 4.21.2 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) - mongodb: 6.12.0 + mongodb: 6.12.0(snappy@7.2.2) node-forge: 1.3.1 pdf-lib: 1.17.1 prettier: 3.2.5 @@ -28039,7 +28131,7 @@ packages: - supports-color dev: false - file:projects/pod-telegram-bot.tgz(bufferutil@4.0.8)(utf-8-validate@6.0.4): + file:projects/pod-telegram-bot.tgz(bufferutil@4.0.8)(snappy@7.2.2)(utf-8-validate@6.0.4): resolution: {integrity: sha512-QcNX6QCVKgZ6cV4ZkPBzdPH0Nu1F1sQ7yIMYQ4ikoR/BWWBB2U4E/YWd10I3c34QV3DUbKo3CID8EtkzrXadYQ==, tarball: file:projects/pod-telegram-bot.tgz} id: file:projects/pod-telegram-bot.tgz name: '@rush-temp/pod-telegram-bot' @@ -28051,7 +28143,6 @@ packages: '@types/express': 4.17.21 '@types/jest': 29.5.12 '@types/node': 20.11.19 - '@types/node-fetch': 2.6.11 '@types/otp-generator': 4.0.2 '@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) @@ -28068,8 +28159,7 @@ packages: express: 4.21.2 htmlparser2: 9.1.0 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) - mongodb: 6.12.0 - node-fetch: 2.7.0 + mongodb: 6.12.0(snappy@7.2.2) otp-generator: 4.0.1 prettier: 3.2.5 telegraf: 4.16.3 @@ -28098,7 +28188,7 @@ packages: - utf-8-validate dev: false - file:projects/pod-telegram.tgz(bufferutil@4.0.8)(ts-node@10.9.2)(utf-8-validate@6.0.4): + file:projects/pod-telegram.tgz(bufferutil@4.0.8)(snappy@7.2.2)(ts-node@10.9.2)(utf-8-validate@6.0.4): resolution: {integrity: sha512-FAYbl5GmRCS3fOR5eUXKNS8KmwnwB+7ZZ68vDi5lfeH4hkJky/VdR5yq4dX5SzOB35e7hz9JWriDGxfjUcx6Wg==, tarball: file:projects/pod-telegram.tgz} id: file:projects/pod-telegram.tgz name: '@rush-temp/pod-telegram' @@ -28129,7 +28219,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.12.0 + mongodb: 6.12.0(snappy@7.2.2) prettier: 3.2.5 telegram: 2.22.2 ts-jest: 29.1.2(esbuild@0.24.2)(jest@29.7.0)(typescript@5.3.3) @@ -28159,8 +28249,9 @@ packages: - utf-8-validate dev: false - file:projects/pod-workspace.tgz: + file:projects/pod-workspace.tgz(snappy@7.2.2): resolution: {integrity: sha512-6wRqrWl0oZUzQ2CZBpPK09doQpYepraNAwCO3OcPDaRnDfQo0WBwLvfWOdDVW3REunCCh/DHMxGpuiLnaQX4KQ==, tarball: file:projects/pod-workspace.tgz} + id: file:projects/pod-workspace.tgz name: '@rush-temp/pod-workspace' version: 0.0.0 dependencies: @@ -28176,7 +28267,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.12.0 + mongodb: 6.12.0(snappy@7.2.2) prettier: 3.2.5 ts-jest: 29.1.2(esbuild@0.24.2)(jest@29.7.0)(typescript@5.3.3) ts-node: 10.9.2(@types/node@20.11.19)(typescript@5.3.3) @@ -31256,7 +31347,7 @@ packages: - ts-node dev: false - file:projects/server-tool.tgz(@types/node@20.11.19)(esbuild@0.24.2)(ts-node@10.9.2): + file:projects/server-tool.tgz(@types/node@20.11.19)(esbuild@0.24.2)(snappy@7.2.2)(ts-node@10.9.2): resolution: {integrity: sha512-G/gF05AF5jsncB4bMGt9HXus2GLzKjAwYPYPlanY7M4tavCE8gOstoBPgW8I/ETxaRI3oztLV7G5UoCHEGON3g==, tarball: file:projects/server-tool.tgz} id: file:projects/server-tool.tgz name: '@rush-temp/server-tool' @@ -31276,7 +31367,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.12.0 + mongodb: 6.12.0(snappy@7.2.2) prettier: 3.2.5 ts-jest: 29.1.2(esbuild@0.24.2)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 @@ -31483,7 +31574,7 @@ packages: dev: false file:projects/server-ws.tgz(esbuild@0.24.2)(ts-node@10.9.2): - resolution: {integrity: sha512-Uw0sIkrmlc+pFs1pavpPYPTUS/SvzBIzXygFUw9PGViypnUo54AYq9QLGEXs1dg2HU8TNcPbgtdRx+4S8fTUMA==, tarball: file:projects/server-ws.tgz} + resolution: {integrity: sha512-9PP7kE8LXoZ+7r6OwLp26KT+JFAQtSwg5QP/awwXjcsV2t3yphDYKbdAJuVG5xlLfHW52Xn4NRbr0wFhfwS0sg==, tarball: file:projects/server-ws.tgz} id: file:projects/server-ws.tgz name: '@rush-temp/server-ws' version: 0.0.0 @@ -31508,6 +31599,7 @@ packages: express: 4.21.2 jest: 29.7.0(@types/node@20.11.19)(ts-node@10.9.2) prettier: 3.2.5 + snappy: 7.2.2 ts-jest: 29.1.2(esbuild@0.24.2)(jest@29.7.0)(typescript@5.3.3) typescript: 5.3.3 utf-8-validate: 6.0.4 @@ -32686,7 +32778,7 @@ packages: dev: false file:projects/text.tgz(@types/node@20.11.19)(bufferutil@4.0.8)(esbuild@0.24.2)(ts-node@10.9.2)(utf-8-validate@6.0.4): - resolution: {integrity: sha512-zmM6GDzeNuMbMA7iWwhg8hBc43fylNW7cEmk0fSWw9+G9NqD2MLv2dVb5dnAcPAioj9WBdDakWcrLAAHUBJyMw==, tarball: file:projects/text.tgz} + resolution: {integrity: sha512-p2TRL6FgtqVBooDf+E5A4HB+45VS03IvNxudhC9gCotewS726ZLOxl2XdfeuYB2rHYbzdmmiG2zb8GbPwqTkOw==, tarball: file:projects/text.tgz} id: file:projects/text.tgz name: '@rush-temp/text' version: 0.0.0 @@ -32707,6 +32799,7 @@ packages: '@tiptap/extension-task-item': 2.6.6(@tiptap/core@2.6.6)(@tiptap/pm@2.6.6) '@tiptap/extension-task-list': 2.6.6(@tiptap/core@2.6.6) '@tiptap/extension-text-align': 2.11.0(@tiptap/core@2.6.6) + '@tiptap/extension-text-style': 2.11.0(@tiptap/core@2.6.6) '@tiptap/extension-typography': 2.6.6(@tiptap/core@2.6.6) '@tiptap/extension-underline': 2.6.6(@tiptap/core@2.6.6) '@tiptap/html': 2.6.6(@tiptap/core@2.6.6)(@tiptap/pm@2.6.6) @@ -32904,8 +32997,9 @@ packages: - ts-node dev: false - file:projects/tool.tgz: + file:projects/tool.tgz(snappy@7.2.2): resolution: {integrity: sha512-Cw36G6uROkPkNIJDl7WeHjhHKmbQth6wmjMu4vBQGz+DfuPf9Eg63SFKq29rOssZ4LlJB1d22Y7XnxilCuXK5g==, tarball: file:projects/tool.tgz} + id: file:projects/tool.tgz name: '@rush-temp/tool' version: 0.0.0 dependencies: @@ -32930,11 +33024,10 @@ packages: eslint-plugin-n: 15.7.0(eslint@8.56.0) eslint-plugin-promise: 6.1.1(eslint@8.56.0) fast-equals: 5.0.1 - got: 11.8.6 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.12.0 + mongodb: 6.12.0(snappy@7.2.2) msgpackr: 1.11.2 msgpackr-extract: 3.0.3 postgres: 3.4.5 diff --git a/common/scripts/esbuild.js b/common/scripts/esbuild.js index 440df6c532..26cba9a4c7 100644 --- a/common/scripts/esbuild.js +++ b/common/scripts/esbuild.js @@ -13,7 +13,7 @@ const defaultConfig = { keepNames: false, sourcemap: false, logLevel: 'error', - external: [], + external: ['snappy'], define: {}, }; diff --git a/dev/tool/package.json b/dev/tool/package.json index 75a12ab505..59a89b845e 100644 --- a/dev/tool/package.json +++ b/dev/tool/package.json @@ -14,7 +14,7 @@ "_phase:bundle": "rushx bundle", "_phase:docker-build": "rushx docker:build", "_phase:docker-staging": "rushx docker:staging", - "bundle": "node ../../common/scripts/esbuild.js --entry=src/__start.ts --keep-names=true --sourcemap=external --define:MODEL_VERSION --define:GIT_REVISION", + "bundle": "node ../../common/scripts/esbuild.js --entry=src/__start.ts --keep-names=true --external=snappy --sourcemap=external --define:MODEL_VERSION --define:GIT_REVISION", "docker:build": "../../common/scripts/docker_build.sh hardcoreeng/tool", "docker:tbuild": "docker build -t hardcoreeng/tool . --platform=linux/amd64 && ../../common/scripts/docker_tag_push.sh hardcoreeng/tool", "docker:abuild": "docker build -t hardcoreeng/tool . --platform=linux/arm64 && ../../common/scripts/docker_tag_push.sh hardcoreeng/tool", diff --git a/models/text-editor/src/index.ts b/models/text-editor/src/index.ts index 028616d9c3..82557e4dfb 100644 --- a/models/text-editor/src/index.ts +++ b/models/text-editor/src/index.ts @@ -247,6 +247,18 @@ export function createModel (builder: Builder): void { index: 20 }) + builder.createDoc(textEditor.class.TextEditorAction, core.space.Model, { + action: textEditor.function.SetTextColor, + icon: textEditor.icon.TextStyle, + visibilityTester: textEditor.function.IsTextStylingEnabled, + isActive: { + name: 'textStyle' + }, + label: textEditor.string.SetTextColor, + category: 20, + index: 25 + }) + // Link category builder.createDoc(textEditor.class.TextEditorAction, core.space.Model, { action: textEditor.function.FormatLink, @@ -338,23 +350,36 @@ export function createModel (builder: Builder): void { index: 10 }) + // Table cell category + builder.createDoc(textEditor.class.TextEditorAction, core.space.Model, { + kind: 'table', + action: textEditor.function.SetBackgroundColor, + icon: textEditor.icon.Brush, + visibilityTester: textEditor.function.IsTableToolbarContext, + label: textEditor.string.SetCellHighlightColor, + category: 65, + index: 5 + }) + // Table category builder.createDoc(textEditor.class.TextEditorAction, core.space.Model, { + kind: 'table', action: textEditor.function.SelectTable, icon: textEditor.icon.SelectTable, visibilityTester: textEditor.function.IsTableToolbarContext, label: textEditor.string.SelectTable, category: 70, - index: 5 + index: 15 }) builder.createDoc(textEditor.class.TextEditorAction, core.space.Model, { + kind: 'table', action: textEditor.function.OpenTableOptions, icon: textEditor.icon.TableProps, visibilityTester: textEditor.function.IsTableToolbarContext, label: textEditor.string.TableOptions, category: 70, - index: 10 + index: 20 }) // Image align category diff --git a/models/text-editor/src/plugin.ts b/models/text-editor/src/plugin.ts index 5540a9240a..2039564663 100644 --- a/models/text-editor/src/plugin.ts +++ b/models/text-editor/src/plugin.ts @@ -36,9 +36,13 @@ export default mergeIds(textEditorId, textEditor, { IsTableToolbarContext: '' as Resource, IsEditableNote: '' as Resource, IsEditable: '' as Resource, + IsTextStylingEnabled: '' as Resource, IsHeadingVisible: '' as Resource, CreateInlineComment: '' as Resource, - ShouldShowCreateInlineCommentAction: '' as Resource + ShouldShowCreateInlineCommentAction: '' as Resource, + + SetBackgroundColor: '' as Resource, + SetTextColor: '' as Resource } }) diff --git a/models/tracker/src/plugin.ts b/models/tracker/src/plugin.ts index 3f62f5a3c9..080bbd0113 100644 --- a/models/tracker/src/plugin.ts +++ b/models/tracker/src/plugin.ts @@ -98,8 +98,7 @@ export default mergeIds(trackerId, tracker, { EditProject: '' as ViewAction, DeleteProject: '' as ViewAction, DeleteIssue: '' as ViewAction, - DeleteMilestone: '' as ViewAction, - ImportIssues: '' as ViewAction + DeleteMilestone: '' as ViewAction }, action: { NewRelatedIssue: '' as Ref>, diff --git a/packages/core/src/__tests__/limits.test.ts b/packages/core/src/__tests__/limits.test.ts new file mode 100644 index 0000000000..5a7c15d63e --- /dev/null +++ b/packages/core/src/__tests__/limits.test.ts @@ -0,0 +1,118 @@ +// +// Copyright © 2023 Hardcore Engineering Inc. +// +// Licensed under the Eclipse Public License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. You may +// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import { TimeRateLimiter } from '../utils' + +describe('TimeRateLimiter', () => { + it('should limit rate of executions', async () => { + jest.useFakeTimers() + const limiter = new TimeRateLimiter(2, 1000) // 2 executions per second + const mockFn = jest.fn().mockResolvedValue('result') + const operations: Promise[] = [] + + // Try to execute 4 operations + for (let i = 0; i < 4; i++) { + operations.push(limiter.exec(mockFn)) + } + + // First 2 should execute immediately + expect(mockFn).toHaveBeenCalledTimes(2) + + // Advance time by 1 second + jest.advanceTimersByTime(1001) + await Promise.resolve() + + // Next 2 should execute after time advance + expect(mockFn).toHaveBeenCalledTimes(4) + + await Promise.all(operations) + }) + + it('should cleanup old executions', async () => { + jest.useFakeTimers() + const limiter = new TimeRateLimiter(2, 1000) + const mockFn = jest.fn().mockResolvedValue('result') + + // Execute first operation + await limiter.exec(mockFn) + expect(mockFn).toHaveBeenCalledTimes(1) + expect(limiter.executions.length).toBe(1) + + // Advance time past period + jest.advanceTimersByTime(1001) + + // Execute another operation + await limiter.exec(mockFn) + expect(mockFn).toHaveBeenCalledTimes(2) + expect(limiter.executions.length).toBe(1) // Old execution should be cleaned up + }) + + it('should handle concurrent operations', async () => { + jest.useFakeTimers() + const limiter = new TimeRateLimiter(2, 1000) + const mockFn = jest.fn().mockImplementation(async () => { + console.log('start#') + await new Promise((resolve) => setTimeout(resolve, 450)) + console.log('finished#') + return 'result' + }) + + const operations = Promise.all([limiter.exec(mockFn), limiter.exec(mockFn), limiter.exec(mockFn)]) + + expect(mockFn).toHaveBeenCalledTimes(2) + expect(limiter.processingQueue.size).toBe(2) + + jest.advanceTimersByTime(500) + await Promise.resolve() + await Promise.resolve() + jest.advanceTimersByTime(1000) + await Promise.resolve() + + jest.advanceTimersByTime(2001) + await Promise.resolve() + await Promise.resolve() + + expect(limiter.processingQueue.size).toBe(0) + + expect(mockFn).toHaveBeenCalledTimes(3) + + await operations + }) + + it('should wait for processing to complete', async () => { + jest.useFakeTimers() + const limiter = new TimeRateLimiter(2, 1000) + const mockFn = jest.fn().mockImplementation(async () => { + await new Promise((resolve) => setTimeout(resolve, 500)) + return 'result' + }) + + const operation = limiter.exec(mockFn) + const waitPromise = limiter.waitProcessing().then(() => { + console.log('wait complete') + }) + + expect(limiter.processingQueue.size).toBe(1) + + jest.advanceTimersByTime(1001) + await Promise.resolve() + await Promise.resolve() + await Promise.resolve() + + await waitPromise + await operation + expect(limiter.processingQueue.size).toBe(0) + }) +}) diff --git a/packages/core/src/utils.ts b/packages/core/src/utils.ts index 3d634653af..61289073fc 100644 --- a/packages/core/src/utils.ts +++ b/packages/core/src/utils.ts @@ -839,3 +839,68 @@ export function pluginFilterTx ( systemTx = systemTx.filter((t) => !totalExcluded.has(t._id)) return systemTx } + +/** + * @public + */ + +export class TimeRateLimiter { + idCounter: number = 0 + processingQueue = new Map>() + last: number = 0 + rate: number + period: number + executions: { time: number, running: boolean }[] = [] + + queue: (() => Promise)[] = [] + notify: (() => void)[] = [] + + constructor (rate: number, period: number = 1000) { + this.rate = rate + this.period = period + } + + private cleanupExecutions (): void { + const now = Date.now() + this.executions = this.executions.filter((time) => time.running || now - time.time < this.period) + } + + async exec = any>(op: (args?: B) => Promise, args?: B): Promise { + const processingId = this.idCounter++ + + while (this.processingQueue.size >= this.rate || this.executions.length >= this.rate) { + this.cleanupExecutions() + if (this.executions.length < this.rate) { + break + } + await new Promise((resolve) => { + setTimeout(resolve, this.period / this.rate) + }) + } + + const v = { time: Date.now(), running: true } + try { + this.executions.push(v) + const p = op(args) + this.processingQueue.set(processingId, p as Promise) + return await p + } finally { + v.running = false + this.processingQueue.delete(processingId) + this.cleanupExecutions() + const n = this.notify.shift() + if (n !== undefined) { + n() + } + } + } + + async waitProcessing (): Promise { + while (this.processingQueue.size > 0) { + console.log('wait', this.processingQueue.size) + await new Promise((resolve) => { + this.notify.push(resolve) + }) + } + } +} diff --git a/workers/datalake/config/rig.json b/packages/importer/config/rig.json similarity index 56% rename from workers/datalake/config/rig.json rename to packages/importer/config/rig.json index 78cc5a1733..0110930f55 100644 --- a/workers/datalake/config/rig.json +++ b/packages/importer/config/rig.json @@ -1,5 +1,4 @@ { "$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json", - "rigPackageName": "@hcengineering/platform-rig", - "rigProfile": "node" + "rigPackageName": "@hcengineering/platform-rig" } diff --git a/packages/text/package.json b/packages/text/package.json index 0bf657add2..0147c859eb 100644 --- a/packages/text/package.json +++ b/packages/text/package.json @@ -64,7 +64,8 @@ "prosemirror-codemark": "^0.4.2", "markdown-it": "^14.0.0", "fast-equals": "^5.0.1", - "@tiptap/extension-text-align": "~2.11.0" + "@tiptap/extension-text-align": "~2.11.0", + "@tiptap/extension-text-style": "~2.11.0" }, "repository": "https://github.com/hcengineering/platform", "publishConfig": { diff --git a/packages/text/src/index.ts b/packages/text/src/index.ts index 87456d522c..d543c4f264 100644 --- a/packages/text/src/index.ts +++ b/packages/text/src/index.ts @@ -22,6 +22,7 @@ export * from './markup/utils' export * from './nodes' // export * from './ydoc' export * from './marks/code' +export * from './marks/colors' export * from './marks/noteBase' export * from './markdown' export * from './markdown/serializer' @@ -31,3 +32,5 @@ export * from './markdown/node' export * from './kits/default-kit' export * from './kits/server-kit' + +export { TextStyle, type TextStyleOptions } from '@tiptap/extension-text-style' diff --git a/packages/text/src/kits/server-kit.ts b/packages/text/src/kits/server-kit.ts index b6a7345bec..0226c673d5 100644 --- a/packages/text/src/kits/server-kit.ts +++ b/packages/text/src/kits/server-kit.ts @@ -34,6 +34,8 @@ import { CodeExtension, codeOptions } from '../marks/code' import { NoteBaseExtension } from '../marks/noteBase' import { CommentNode } from '../nodes/comment' import TextAlign from '@tiptap/extension-text-align' +import TextStyle from '@tiptap/extension-text-style' +import { BackgroundColor, TextColor } from '../marks/colors' const headingLevels: Level[] = [1, 2, 3, 4, 5, 6] @@ -97,7 +99,10 @@ export const ServerKit = Extension.create({ ReferenceNode, CommentNode, NodeUuid, - NoteBaseExtension + NoteBaseExtension, + TextStyle.configure({}), + TextColor.configure({}), + BackgroundColor.configure({ types: ['tableCell'] }) ] } }) diff --git a/packages/text/src/marks/colors.ts b/packages/text/src/marks/colors.ts new file mode 100644 index 0000000000..d228507a2d --- /dev/null +++ b/packages/text/src/marks/colors.ts @@ -0,0 +1,142 @@ +// +// Copyright © 2025 Hardcore Engineering Inc. +// +// Licensed under the Eclipse Public License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. You may +// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import { Extension } from '@tiptap/core' +import '@tiptap/extension-text-style' + +export interface BackgroundColorOptions { + types: string[] +} + +declare module '@tiptap/core' { + interface Commands { + colors: { + setTextColor: (color: string) => ReturnType + unsetTextColor: () => ReturnType + setBackgroundColor: (color: string) => ReturnType + unsetBackgroundColor: () => ReturnType + } + } +} + +export const BackgroundColor = Extension.create({ + name: 'backgroundColor', + + addOptions () { + return { + types: [] + } + }, + + addGlobalAttributes () { + return [ + { + types: this.options.types, + attributes: { + backgroundColor: { + parseHTML: (element) => { + return element.getAttribute('data-background-color') ?? undefined + }, + renderHTML: (attributes) => { + if (typeof attributes.backgroundColor !== 'string') { + return {} + } + + return { + 'data-background-color': attributes.backgroundColor, + style: `background-color: ${attributes.backgroundColor}` + } + } + } + } + } + ] + }, + + addCommands () { + return { + setBackgroundColor: + (backgroundColor: string) => + ({ commands }) => { + return this.options.types + .map((type) => commands.updateAttributes(type, { backgroundColor })) + .every((response) => response) + }, + + unsetBackgroundColor: + () => + ({ commands }) => { + return this.options.types + .map((type) => commands.resetAttributes(type, 'backgroundColor')) + .every((response) => response) + } + } + } +}) + +export interface TextColorOptions { + types: string[] +} + +export const TextColor = Extension.create({ + name: 'textColor', + + addOptions () { + return { + types: ['textStyle'] + } + }, + + addGlobalAttributes () { + return [ + { + types: this.options.types, + attributes: { + color: { + parseHTML: (element) => { + return element.getAttribute('data-color') ?? undefined + }, + renderHTML: (attributes) => { + if (typeof attributes.color !== 'string') { + return {} + } + + return { + 'data-color': attributes.color, + style: `color: ${attributes.color}` + } + } + } + } + } + ] + }, + + addCommands () { + return { + setTextColor: + (color: string) => + ({ chain }) => { + return chain().setMark('textStyle', { color }).run() + }, + + unsetTextColor: + () => + ({ chain }) => { + return chain().setMark('textStyle', { color: null }).removeEmptyTextStyle().run() + } + } + } +}) diff --git a/packages/theme/styles/_colors.scss b/packages/theme/styles/_colors.scss index bd095464bd..d4881a9ee9 100644 --- a/packages/theme/styles/_colors.scss +++ b/packages/theme/styles/_colors.scss @@ -65,6 +65,7 @@ --highlight-red-hover: #ff967e; --highlight-red-press: #f96f50bd; + --text-editor-selected-node-background: rgba(43, 81, 144, 0.1); --text-editor-selected-node-color: #93CAF3; --text-editor-highlighted-node-warning-active-background-color: #F2D7AE; @@ -248,6 +249,28 @@ --theme-text-editor-note-anchor-bg-primary: #688797; --theme-text-editor-note-anchor-bg-primary-light: #747C81; + --text-editor-table-border-color: hsl(220, 6%, 40%); + + --theme-text-editor-palette-text-gray: rgba(155, 155, 155, 1); + --theme-text-editor-palette-text-brown: rgba(186, 133, 111, 1); + --theme-text-editor-palette-text-orange: rgba(199, 125, 72, 1); + --theme-text-editor-palette-text-yellow: rgba(202, 152, 73, 1); + --theme-text-editor-palette-text-green: rgba(82, 158, 114, 1); + --theme-text-editor-palette-text-blue: rgba(94, 135, 201, 1); + --theme-text-editor-palette-text-purple: rgba(157, 104, 211, 1); + --theme-text-editor-palette-text-pink: rgba(209, 87, 150, 1); + --theme-text-editor-palette-text-red: rgba(223, 84, 82, 1); + + --theme-text-editor-palette-bg-gray: rgba(47, 47, 47, 1); + --theme-text-editor-palette-bg-brown: rgba(74, 50, 40, 1); + --theme-text-editor-palette-bg-orange: rgba(92, 59, 35, 1); + --theme-text-editor-palette-bg-yellow: rgba(86, 67, 40, 1); + --theme-text-editor-palette-bg-green: rgba(36, 61, 48, 1); + --theme-text-editor-palette-bg-blue: rgba(20, 58, 78, 1); + --theme-text-editor-palette-bg-purple: rgba(60, 45, 73, 1); + --theme-text-editor-palette-bg-pink: rgba(78, 44, 60, 1); + --theme-text-editor-palette-bg-red:rgba(82, 46, 42, 1); + --accent-bg-color: #27282b; --accent-shadow: rgb(0 0 0 / 10%) 0px 2px 4px; @@ -507,6 +530,28 @@ --theme-text-editor-note-anchor-bg-primary: #AAC5E9; --theme-text-editor-note-anchor-bg-primary-light: #D5E5F5; + --text-editor-table-border-color: #c9cbcd; + + --theme-text-editor-palette-text-gray: rgba(120, 119, 116, 1); + --theme-text-editor-palette-text-brown: rgba(159, 107, 83, 1); + --theme-text-editor-palette-text-orange: rgba(217, 115, 13, 1); + --theme-text-editor-palette-text-yellow: rgba(203, 145, 47, 1); + --theme-text-editor-palette-text-green: rgba(68, 131, 97, 1); + --theme-text-editor-palette-text-blue: rgba(51, 126, 169, 1); + --theme-text-editor-palette-text-purple: rgba(144, 101, 176, 1); + --theme-text-editor-palette-text-pink: rgba(193, 76, 138, 1); + --theme-text-editor-palette-text-red: rgba(212, 76, 71, 1); + + --theme-text-editor-palette-bg-gray: rgba(241, 241, 239, 1); + --theme-text-editor-palette-bg-brown: rgba(244, 238, 238, 1); + --theme-text-editor-palette-bg-orange: rgba(251, 236, 221, 1); + --theme-text-editor-palette-bg-yellow: rgba(251, 243, 219, 1); + --theme-text-editor-palette-bg-green: rgba(237, 243, 236, 1); + --theme-text-editor-palette-bg-blue: rgba(231, 243, 248, 1); + --theme-text-editor-palette-bg-purple: rgba(244, 240, 247, 0.8); + --theme-text-editor-palette-bg-pink: rgba(249, 238, 243, 0.8); + --theme-text-editor-palette-bg-red: rgba(253, 235, 236, 1); + --accent-bg-color: #eff0f2; // HZ --accent-shadow: rgb(0 0 0 / 10%) 0px 2px 4px; // Dark diff --git a/packages/theme/styles/button.scss b/packages/theme/styles/button.scss index 71810660f2..5c5b8c2734 100644 --- a/packages/theme/styles/button.scss +++ b/packages/theme/styles/button.scss @@ -196,8 +196,7 @@ text-overflow: ellipsis; overflow: hidden; min-width: 0; - font-weight: 700; - color: var(--theme-caption-color); + font-weight: 500; } &-icons { gap: var(--spacing-0_25); } &:hover { diff --git a/packages/theme/styles/prose.scss b/packages/theme/styles/prose.scss index 927528fa0e..9973340cf0 100644 --- a/packages/theme/styles/prose.scss +++ b/packages/theme/styles/prose.scss @@ -38,7 +38,7 @@ table.proseTable { th { min-width: 1rem; height: 2rem; - border: 1px solid var(--button-border-hover); + border: 1px solid var(--text-editor-table-border-color); padding: .25rem .5rem; vertical-align: top; box-sizing: border-box; @@ -390,6 +390,12 @@ table.proseTable { } } +.table-node-selected { + .proseTable { + background-color: var(--text-editor-selected-node-background); + } +} + .proseBlockQuote { margin-inline: 1px 0; padding-left: 1.5em; diff --git a/plugins/client-resources/package.json b/plugins/client-resources/package.json index 33627c63d8..02669b5767 100644 --- a/plugins/client-resources/package.json +++ b/plugins/client-resources/package.json @@ -34,14 +34,16 @@ "typescript": "^5.3.3", "jest": "^29.7.0", "ts-jest": "^29.1.1", - "@types/jest": "^29.5.5" + "@types/jest": "^29.5.5", + "@types/snappyjs": "^0.7.1" }, "dependencies": { "@hcengineering/analytics": "^0.6.0", "@hcengineering/platform": "^0.6.11", "@hcengineering/core": "^0.6.32", "@hcengineering/client": "^0.6.18", - "@hcengineering/rpc": "^0.6.5" + "@hcengineering/rpc": "^0.6.5", + "snappyjs": "^0.7.0" }, "repository": "https://github.com/hcengineering/platform", "publishConfig": { diff --git a/plugins/client-resources/src/connection.ts b/plugins/client-resources/src/connection.ts index d55a8ec0db..9f9f5ae960 100644 --- a/plugins/client-resources/src/connection.ts +++ b/plugins/client-resources/src/connection.ts @@ -57,6 +57,7 @@ import platform, { broadcastEvent, getMetadata } from '@hcengineering/platform' +import { uncompress } from 'snappyjs' import { HelloRequest, HelloResponse, RPCHandler, ReqId, type Response } from '@hcengineering/rpc' @@ -89,6 +90,7 @@ class RequestPromise { class Connection implements ClientConnection { private websocket: ClientSocket | null = null binaryMode = false + compressionMode = false private readonly requests = new Map() private lastId = 0 private interval: number | undefined @@ -107,7 +109,7 @@ class Connection implements ClientConnection { private pingResponse: number = Date.now() - private helloRecieved: boolean = false + private helloReceived: boolean = false private account: Account | undefined @@ -205,7 +207,7 @@ class Connection implements ClientConnection { } isConnected (): boolean { - return this.websocket != null && this.websocket.readyState === ClientSocketReadyState.OPEN && this.helloRecieved + return this.websocket != null && this.websocket.readyState === ClientSocketReadyState.OPEN && this.helloReceived } delay = 0 @@ -289,9 +291,8 @@ class Connection implements ClientConnection { } if (resp.result === 'hello') { const helloResp = resp as HelloResponse - if (helloResp.binary) { - this.binaryMode = true - } + this.binaryMode = helloResp.binary + this.compressionMode = helloResp.useCompression ?? false // We need to clear dial timer, since we recieve hello response. clearTimeout(this.dialTimer) @@ -307,7 +308,7 @@ class Connection implements ClientConnection { return } this.account = helloResp.account - this.helloRecieved = true + this.helloReceived = true if (this.upgrading) { // We need to call upgrade since connection is upgraded this.opt?.onUpgrade?.() @@ -439,6 +440,7 @@ class Connection implements ClientConnection { private openConnection (ctx: MeasureContext, socketId: number): void { this.binaryMode = false + this.helloReceived = false // Use defined factory or browser default one. const clientSocketFactory = this.opt?.socketFactory ?? @@ -503,11 +505,28 @@ class Connection implements ClientConnection { } if (event.data instanceof Blob) { void event.data.arrayBuffer().then((data) => { + if (this.compressionMode && this.helloReceived) { + try { + data = uncompress(data) + } catch (err: any) { + // Ignore + console.error(err) + } + } const resp = this.rpcHandler.readResponse(data, this.binaryMode) this.handleMsg(socketId, resp) }) } else { - const resp = this.rpcHandler.readResponse(event.data, this.binaryMode) + let data = event.data + if (this.compressionMode && this.helloReceived) { + try { + data = uncompress(data) + } catch (err: any) { + // Ignore + console.error(err) + } + } + const resp = this.rpcHandler.readResponse(data, this.binaryMode) this.handleMsg(socketId, resp) } } @@ -525,15 +544,14 @@ class Connection implements ClientConnection { return } const useBinary = this.opt?.useBinaryProtocol ?? getMetadata(client.metadata.UseBinaryProtocol) ?? true - const useCompression = + this.compressionMode = this.opt?.useProtocolCompression ?? getMetadata(client.metadata.UseProtocolCompression) ?? false - this.helloRecieved = false const helloRequest: HelloRequest = { method: 'hello', params: [], id: -1, binary: useBinary, - compression: useCompression + compression: this.compressionMode } ctx.withSync('send-hello', {}, () => this.websocket?.send(this.rpcHandler.serialize(helloRequest, false))) } diff --git a/plugins/text-editor-assets/assets/icons.svg b/plugins/text-editor-assets/assets/icons.svg index 56514789e4..4546048f49 100644 --- a/plugins/text-editor-assets/assets/icons.svg +++ b/plugins/text-editor-assets/assets/icons.svg @@ -214,4 +214,11 @@ + + + + + + + \ No newline at end of file diff --git a/plugins/text-editor-assets/lang/en.json b/plugins/text-editor-assets/lang/en.json index 8677c3e156..805f0b3eba 100644 --- a/plugins/text-editor-assets/lang/en.json +++ b/plugins/text-editor-assets/lang/en.json @@ -66,6 +66,8 @@ "MermaidDiargram": "Diagram", "Comment": "Comment", "AddComment": "Add a comment", - "AddCommentPlaceholder": "Add a comment..." + "AddCommentPlaceholder": "Add a comment...", + "SetCellHighlightColor": "Set cell color", + "SetTextColor": "Set text color" } } \ No newline at end of file diff --git a/plugins/text-editor-assets/lang/ru.json b/plugins/text-editor-assets/lang/ru.json index 704ab81366..a39503cef8 100644 --- a/plugins/text-editor-assets/lang/ru.json +++ b/plugins/text-editor-assets/lang/ru.json @@ -66,6 +66,8 @@ "MermaidDiargram": "Диаграмма", "Comment": "Комментарий", "AddComment": "Добавить комментарий", - "AddCommentPlaceholder": "Добавьте комментарий..." + "AddCommentPlaceholder": "Добавьте комментарий...", + "SetCellHighlightColor": "Изменить цвет ячеек", + "SetTextColor": "Изменить цвет текста" } } \ No newline at end of file diff --git a/plugins/text-editor-assets/src/index.ts b/plugins/text-editor-assets/src/index.ts index 0a4173dbd5..c1e7e3cb18 100644 --- a/plugins/text-editor-assets/src/index.ts +++ b/plugins/text-editor-assets/src/index.ts @@ -43,5 +43,7 @@ loadMetadata(textEditor.icon, { Comment: `${icons}#comment`, SelectTable: `${icons}#move`, MergeCells: `${icons}#union`, - SplitCells: `${icons}#divide` + SplitCells: `${icons}#divide`, + Brush: `${icons}#brush`, + TextStyle: `${icons}#textStyle` }) diff --git a/plugins/text-editor-resources/src/components/extension/colors.ts b/plugins/text-editor-resources/src/components/extension/colors.ts new file mode 100644 index 0000000000..aa162e140a --- /dev/null +++ b/plugins/text-editor-resources/src/components/extension/colors.ts @@ -0,0 +1,100 @@ +// +// Copyright © 2025 Hardcore Engineering Inc. +// +// Licensed under the Eclipse Public License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. You may +// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import { getEventPositionElement, showPopup } from '@hcengineering/ui' +import { type Editor } from '@tiptap/core' +import ColorPicker from './popups/ColorPicker.svelte' +import { type ActionContext } from '@hcengineering/text-editor' + +export interface BackgroundColorOptions { + types: string[] +} + +interface ColorSpec { + color: string + preview?: string +} + +function colorVar (tag: string, prefix = 'text'): string { + return `var(--theme-text-editor-palette-${prefix}-${tag})` +} + +function colorSpec (tag: string, prefix = 'text'): ColorSpec { + const color = colorVar(tag, prefix) + return { color, preview: colorVar(tag) } +} + +const palette = { + background: [ + { color: 'transparent' }, + colorSpec('gray', 'bg'), + colorSpec('brown', 'bg'), + colorSpec('orange', 'bg'), + colorSpec('yellow', 'bg'), + colorSpec('green', 'bg'), + colorSpec('blue', 'bg'), + colorSpec('purple', 'bg'), + colorSpec('pink', 'bg'), + colorSpec('red', 'bg') + ], + text: [ + { color: 'var(--theme-text-color-primary)' }, + colorSpec('gray'), + colorSpec('brown'), + colorSpec('orange'), + colorSpec('yellow'), + colorSpec('green'), + colorSpec('blue'), + colorSpec('purple'), + colorSpec('pink'), + colorSpec('red') + ] +} + +export async function openBackgroundColorOptions (editor: Editor, event: MouseEvent): Promise { + await new Promise((resolve) => { + showPopup(ColorPicker, { palette: palette.background }, getEventPositionElement(event), (val) => { + const color: string | undefined = val?.color + if (color === undefined) return + + if (color === 'transparent') { + editor.commands.unsetBackgroundColor() + } else { + editor.commands.setBackgroundColor(color) + } + resolve() + }) + }) +} + +export async function openTextColorOptions (editor: Editor, event: MouseEvent): Promise { + await new Promise((resolve) => { + showPopup(ColorPicker, { palette: palette.text }, getEventPositionElement(event), (val) => { + const color: string | undefined = val?.color + if (color === undefined) return + + if (color === 'var(--theme-text-color-primary)') { + editor.commands.unsetTextColor() + } else { + editor.commands.setTextColor(color) + } + resolve() + }) + }) +} + +export async function isTextStylingEnabled (editor: Editor, context: ActionContext): Promise { + return editor.isEditable && editor.commands.setTextColor !== undefined +} diff --git a/plugins/text-editor-resources/src/components/extension/popups/ColorPicker.svelte b/plugins/text-editor-resources/src/components/extension/popups/ColorPicker.svelte new file mode 100644 index 0000000000..83cf73cd92 --- /dev/null +++ b/plugins/text-editor-resources/src/components/extension/popups/ColorPicker.svelte @@ -0,0 +1,65 @@ + + + +
+
+ {#each palette as k} + + +
{ + handleSubmit(k) + }} + /> + {/each} +
+
+ + diff --git a/plugins/text-editor-resources/src/components/extension/table/TableNodeView.svelte b/plugins/text-editor-resources/src/components/extension/table/TableNodeView.svelte index fb164977d2..b4da3b4912 100644 --- a/plugins/text-editor-resources/src/components/extension/table/TableNodeView.svelte +++ b/plugins/text-editor-resources/src/components/extension/table/TableNodeView.svelte @@ -200,7 +200,7 @@ .table-toolbar-container { position: absolute; top: -1.5rem; - right: 0; + right: var(--table-offscreen-spacing); z-index: 200; } diff --git a/plugins/text-editor-resources/src/components/extension/table/TableToolbar.svelte b/plugins/text-editor-resources/src/components/extension/table/TableToolbar.svelte index b2fc07a074..406f778eda 100644 --- a/plugins/text-editor-resources/src/components/extension/table/TableToolbar.svelte +++ b/plugins/text-editor-resources/src/components/extension/table/TableToolbar.svelte @@ -50,15 +50,34 @@ actions = out } - $: actionsQuery.query(textEditor.class.TextEditorAction, { category: 70 }, (result) => { + $: actionsQuery.query(textEditor.class.TextEditorAction, { kind: 'table' }, (result) => { void updateActions([...result], actionCtx) }) + + $: categories = actions.reduce<[number, TextEditorAction][][]>((acc, action) => { + const { category, index } = action + if (acc[category] === undefined) acc[category] = [] + acc[category].push([index, action]) + return acc + }, []) + + $: categories.forEach((category) => { + category.sort((a, b) => a[0] - b[0]) + })
- {#each actions as action} - - {/each} +
+ {#each Object.values(categories) as category, index} + {#if index > 0} +
+ {/if} + + {#each category as [_, action]} + + {/each} + {/each} +