From 5809e6862fa525644da43de6736a6f9c94421b1e Mon Sep 17 00:00:00 2001 From: Artem Savchenko Date: Sun, 22 Feb 2026 14:20:35 +0700 Subject: [PATCH 1/3] Sync with foundations Signed-off-by: Artem Savchenko --- common/config/rush/pnpm-lock.yaml | 367 +++++++++++++----- common/scripts/package-lock.json | 6 +- packages/client/package.json | 10 +- packages/client/src/blob.ts | 24 +- packages/collaboration/package.json | 6 +- packages/core/package.json | 6 +- .../core/src/__tests__/shared-integration.ts | 2 +- packages/core/src/types.ts | 1 + packages/datalake/package.json | 8 +- packages/elastic/package.json | 6 +- packages/hulylake/package.json | 8 +- packages/kafka/package.json | 6 +- packages/middleware/package.json | 7 +- packages/middleware/src/applyTx.ts | 14 +- packages/middleware/src/guestPermissions.ts | 32 +- packages/middleware/src/index.ts | 1 + packages/middleware/src/spacePermissions.ts | 112 +++++- packages/middleware/src/spaceSecurity.ts | 69 +++- packages/middleware/src/versioning.ts | 154 ++++++++ packages/minio/package.json | 6 +- packages/mongo/package.json | 6 +- packages/mongo/src/__tests__/storage.test.ts | 73 +++- packages/mongo/src/storage.ts | 64 ++- packages/postgres/package.json | 6 +- .../postgres/src/__tests__/storage.test.ts | 53 ++- packages/postgres/src/storage.ts | 335 ++++++++-------- packages/postgres/src/utils.ts | 12 + packages/s3/package.json | 6 +- packages/server-storage/package.json | 8 +- packages/server/package.json | 8 +- 30 files changed, 1066 insertions(+), 350 deletions(-) create mode 100644 packages/middleware/src/versioning.ts diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 782c754..258810b 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -13,8 +13,8 @@ importers: ../../packages/client: dependencies: '@hcengineering/account-client': - specifier: ^0.7.20 - version: 0.7.20 + specifier: ^0.7.21 + version: 0.7.25 '@hcengineering/client': specifier: ^0.7.18 version: 0.7.18 @@ -22,8 +22,8 @@ importers: specifier: ^0.7.18 version: 0.7.18 '@hcengineering/core': - specifier: ^0.7.23 - version: 0.7.23 + specifier: ^0.7.24 + version: 0.7.26 '@hcengineering/platform': specifier: ^0.7.19 version: 0.7.19 @@ -44,13 +44,13 @@ importers: specifier: ^29.5.5 version: 29.5.14 '@types/node': - specifier: ^22.15.29 + specifier: ^22.18.1 version: 22.19.0 '@types/uuid': specifier: ^8.3.1 version: 8.3.4 '@types/ws': - specifier: ^8.5.11 + specifier: ^8.5.12 version: 8.18.1 '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 @@ -80,7 +80,7 @@ importers: specifier: ^29.7.0 version: 29.7.0(@types/node@22.19.0)(ts-node@10.9.2(@types/node@22.19.0)(typescript@5.9.3)) prettier: - specifier: ^3.1.0 + specifier: ^3.6.2 version: 3.6.2 ts-jest: specifier: ^29.1.1 @@ -92,8 +92,8 @@ importers: ../../packages/collaboration: dependencies: '@hcengineering/core': - specifier: ^0.7.23 - version: 0.7.23 + specifier: ^0.7.24 + version: 0.7.26 '@hcengineering/server-core': specifier: workspace:^0.7.18 version: link:../core @@ -117,7 +117,7 @@ importers: specifier: ^29.5.5 version: 29.5.14 '@types/node': - specifier: ^22.15.29 + specifier: ^22.18.1 version: 22.19.0 '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 @@ -147,7 +147,7 @@ importers: specifier: ^29.7.0 version: 29.7.0(@types/node@22.19.0)(ts-node@10.9.2(@types/node@22.19.0)(typescript@5.9.3)) prettier: - specifier: ^3.1.0 + specifier: ^3.6.2 version: 3.6.2 ts-jest: specifier: ^29.1.1 @@ -162,8 +162,8 @@ importers: specifier: ^0.7.17 version: 0.7.17 '@hcengineering/core': - specifier: ^0.7.23 - version: 0.7.23 + specifier: ^0.7.24 + version: 0.7.26 '@hcengineering/platform': specifier: ^0.7.19 version: 0.7.19 @@ -193,7 +193,7 @@ importers: specifier: ^29.5.5 version: 29.5.14 '@types/node': - specifier: ^22.15.29 + specifier: ^22.18.1 version: 22.19.0 '@types/uuid': specifier: ^8.3.1 @@ -226,7 +226,7 @@ importers: specifier: ^29.7.0 version: 29.7.0(@types/node@22.19.0)(ts-node@10.9.2(@types/node@22.19.0)(typescript@5.9.3)) prettier: - specifier: ^3.1.0 + specifier: ^3.6.2 version: 3.6.2 ts-jest: specifier: ^29.1.1 @@ -238,8 +238,8 @@ importers: ../../packages/datalake: dependencies: '@hcengineering/core': - specifier: ^0.7.23 - version: 0.7.23 + specifier: ^0.7.24 + version: 0.7.26 '@hcengineering/platform': specifier: ^0.7.19 version: 0.7.19 @@ -257,7 +257,7 @@ importers: specifier: ^29.5.5 version: 29.5.14 '@types/node': - specifier: ^22.15.29 + specifier: ^22.18.1 version: 22.19.0 '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 @@ -287,13 +287,13 @@ importers: specifier: ^29.7.0 version: 29.7.0(@types/node@22.19.0)(ts-node@10.9.2(@types/node@22.19.0)(typescript@5.9.3)) prettier: - specifier: ^3.1.0 + specifier: ^3.6.2 version: 3.6.2 ts-jest: specifier: ^29.1.1 version: 29.4.5(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.19.0)(ts-node@10.9.2(@types/node@22.19.0)(typescript@5.9.3)))(typescript@5.9.3) ts-node: - specifier: ^10.8.0 + specifier: ^10.9.2 version: 10.9.2(@types/node@22.19.0)(typescript@5.9.3) typescript: specifier: ^5.9.3 @@ -308,8 +308,8 @@ importers: specifier: ^0.7.17 version: 0.7.17 '@hcengineering/core': - specifier: ^0.7.23 - version: 0.7.23 + specifier: ^0.7.24 + version: 0.7.26 '@hcengineering/platform': specifier: ^0.7.19 version: 0.7.19 @@ -351,13 +351,13 @@ importers: specifier: ^29.7.0 version: 29.7.0(@types/node@22.19.0)(ts-node@10.9.2(@types/node@22.19.0)(typescript@5.9.3)) prettier: - specifier: ^3.1.0 + specifier: ^3.6.2 version: 3.6.2 ts-jest: specifier: ^29.1.1 version: 29.4.5(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.19.0)(ts-node@10.9.2(@types/node@22.19.0)(typescript@5.9.3)))(typescript@5.9.3) ts-node: - specifier: ^10.8.0 + specifier: ^10.9.2 version: 10.9.2(@types/node@22.19.0)(typescript@5.9.3) typescript: specifier: ^5.9.3 @@ -366,8 +366,8 @@ importers: ../../packages/hulylake: dependencies: '@hcengineering/core': - specifier: ^0.7.23 - version: 0.7.23 + specifier: ^0.7.24 + version: 0.7.26 '@hcengineering/hulylake-client': specifier: ^0.7.17 version: 0.7.17 @@ -388,7 +388,7 @@ importers: specifier: ^29.5.5 version: 29.5.14 '@types/node': - specifier: ^22.15.29 + specifier: ^22.18.1 version: 22.19.0 '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 @@ -418,13 +418,13 @@ importers: specifier: ^29.7.0 version: 29.7.0(@types/node@22.19.0)(ts-node@10.9.2(@types/node@22.19.0)(typescript@5.9.3)) prettier: - specifier: ^3.1.0 + specifier: ^3.6.2 version: 3.6.2 ts-jest: specifier: ^29.1.1 version: 29.4.5(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.19.0)(ts-node@10.9.2(@types/node@22.19.0)(typescript@5.9.3)))(typescript@5.9.3) ts-node: - specifier: ^10.8.0 + specifier: ^10.9.2 version: 10.9.2(@types/node@22.19.0)(typescript@5.9.3) typescript: specifier: ^5.9.3 @@ -433,8 +433,8 @@ importers: ../../packages/kafka: dependencies: '@hcengineering/core': - specifier: ^0.7.23 - version: 0.7.23 + specifier: ^0.7.24 + version: 0.7.26 '@hcengineering/platform': specifier: ^0.7.19 version: 0.7.19 @@ -455,7 +455,7 @@ importers: specifier: ^29.5.5 version: 29.5.14 '@types/node': - specifier: ^22.15.29 + specifier: ^22.18.1 version: 22.19.0 '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 @@ -485,7 +485,7 @@ importers: specifier: ^29.7.0 version: 29.7.0(@types/node@22.19.0)(ts-node@10.9.2(@types/node@22.19.0)(typescript@5.9.3)) prettier: - specifier: ^3.1.0 + specifier: ^3.6.2 version: 3.6.2 ts-jest: specifier: ^29.1.1 @@ -499,9 +499,12 @@ importers: '@hcengineering/analytics': specifier: ^0.7.17 version: 0.7.17 + '@hcengineering/contact': + specifier: ^0.7.0 + version: 0.7.0 '@hcengineering/core': - specifier: ^0.7.23 - version: 0.7.23 + specifier: ^0.7.24 + version: 0.7.26 '@hcengineering/platform': specifier: ^0.7.19 version: 0.7.19 @@ -522,7 +525,7 @@ importers: specifier: ^29.5.5 version: 29.5.14 '@types/node': - specifier: ^22.15.29 + specifier: ^22.18.1 version: 22.19.0 '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 @@ -552,7 +555,7 @@ importers: specifier: ^29.7.0 version: 29.7.0(@types/node@22.19.0)(ts-node@10.9.2(@types/node@22.19.0)(typescript@5.9.3)) prettier: - specifier: ^3.1.0 + specifier: ^3.6.2 version: 3.6.2 ts-jest: specifier: ^29.1.1 @@ -564,8 +567,8 @@ importers: ../../packages/minio: dependencies: '@hcengineering/core': - specifier: ^0.7.23 - version: 0.7.23 + specifier: ^0.7.24 + version: 0.7.26 '@hcengineering/platform': specifier: ^0.7.19 version: 0.7.19 @@ -583,7 +586,7 @@ importers: specifier: ^29.5.5 version: 29.5.14 '@types/node': - specifier: ^22.15.29 + specifier: ^22.18.1 version: 22.19.0 '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 @@ -613,7 +616,7 @@ importers: specifier: ^29.7.0 version: 29.7.0(@types/node@22.19.0)(ts-node@10.9.2(@types/node@22.19.0)(typescript@5.9.3)) prettier: - specifier: ^3.1.0 + specifier: ^3.6.2 version: 3.6.2 ts-jest: specifier: ^29.1.1 @@ -625,8 +628,8 @@ importers: ../../packages/mongo: dependencies: '@hcengineering/core': - specifier: ^0.7.23 - version: 0.7.23 + specifier: ^0.7.24 + version: 0.7.26 '@hcengineering/platform': specifier: ^0.7.19 version: 0.7.19 @@ -647,7 +650,7 @@ importers: specifier: ^29.5.5 version: 29.5.14 '@types/node': - specifier: ^22.15.29 + specifier: ^22.18.1 version: 22.19.0 '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 @@ -677,7 +680,7 @@ importers: specifier: ^29.7.0 version: 29.7.0(@types/node@22.19.0)(ts-node@10.9.2(@types/node@22.19.0)(typescript@5.9.3)) prettier: - specifier: ^3.1.0 + specifier: ^3.6.2 version: 3.6.2 ts-jest: specifier: ^29.1.1 @@ -689,8 +692,8 @@ importers: ../../packages/postgres: dependencies: '@hcengineering/core': - specifier: ^0.7.23 - version: 0.7.23 + specifier: ^0.7.24 + version: 0.7.26 '@hcengineering/platform': specifier: ^0.7.19 version: 0.7.19 @@ -711,7 +714,7 @@ importers: specifier: ^29.5.5 version: 29.5.14 '@types/node': - specifier: ^22.15.29 + specifier: ^22.18.1 version: 22.19.0 '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 @@ -741,7 +744,7 @@ importers: specifier: ^29.7.0 version: 29.7.0(@types/node@22.19.0)(ts-node@10.9.2(@types/node@22.19.0)(typescript@5.9.3)) prettier: - specifier: ^3.1.0 + specifier: ^3.6.2 version: 3.6.2 ts-jest: specifier: ^29.1.1 @@ -762,8 +765,8 @@ importers: specifier: ^3.738.0 version: 3.925.0 '@hcengineering/core': - specifier: ^0.7.23 - version: 0.7.23 + specifier: ^0.7.24 + version: 0.7.26 '@hcengineering/platform': specifier: ^0.7.19 version: 0.7.19 @@ -784,7 +787,7 @@ importers: specifier: ^29.5.5 version: 29.5.14 '@types/node': - specifier: ^22.15.29 + specifier: ^22.18.1 version: 22.19.0 '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 @@ -814,7 +817,7 @@ importers: specifier: ^29.7.0 version: 29.7.0(@types/node@22.19.0)(ts-node@10.9.2(@types/node@22.19.0)(typescript@5.9.3)) prettier: - specifier: ^3.1.0 + specifier: ^3.6.2 version: 3.6.2 ts-jest: specifier: ^29.1.1 @@ -826,14 +829,14 @@ importers: ../../packages/server: dependencies: '@hcengineering/account-client': - specifier: ^0.7.20 - version: 0.7.20 + specifier: ^0.7.21 + version: 0.7.25 '@hcengineering/analytics': specifier: ^0.7.17 version: 0.7.17 '@hcengineering/core': - specifier: ^0.7.23 - version: 0.7.23 + specifier: ^0.7.24 + version: 0.7.26 '@hcengineering/platform': specifier: ^0.7.19 version: 0.7.19 @@ -857,7 +860,7 @@ importers: specifier: ^29.5.5 version: 29.5.14 '@types/node': - specifier: ^22.15.29 + specifier: ^22.18.1 version: 22.19.0 '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 @@ -890,7 +893,7 @@ importers: specifier: ^29.7.0 version: 29.7.0(@types/node@22.19.0)(ts-node@10.9.2(@types/node@22.19.0)(typescript@5.9.3)) prettier: - specifier: ^3.1.0 + specifier: ^3.6.2 version: 3.6.2 ts-jest: specifier: ^29.1.1 @@ -905,8 +908,8 @@ importers: specifier: ^0.7.17 version: 0.7.17 '@hcengineering/core': - specifier: ^0.7.23 - version: 0.7.23 + specifier: ^0.7.24 + version: 0.7.26 '@hcengineering/datalake': specifier: workspace:^0.7.17 version: link:../datalake @@ -939,7 +942,7 @@ importers: specifier: ^29.5.5 version: 29.5.14 '@types/node': - specifier: ^22.15.29 + specifier: ^22.18.1 version: 22.19.0 '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 @@ -972,13 +975,13 @@ importers: specifier: ^29.7.0 version: 29.7.0(@types/node@22.19.0)(ts-node@10.9.2(@types/node@22.19.0)(typescript@5.9.3)) prettier: - specifier: ^3.1.0 + specifier: ^3.6.2 version: 3.6.2 ts-jest: specifier: ^29.1.1 version: 29.4.5(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.19.0)(ts-node@10.9.2(@types/node@22.19.0)(typescript@5.9.3)))(typescript@5.9.3) ts-node: - specifier: ^10.8.0 + specifier: ^10.9.2 version: 10.9.2(@types/node@22.19.0)(typescript@5.9.3) typescript: specifier: ^5.9.3 @@ -1351,6 +1354,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + engines: {node: '>=6.9.0'} + '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} @@ -1563,26 +1570,35 @@ packages: '@formatjs/intl-localematcher@0.6.2': resolution: {integrity: sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==} - '@hcengineering/account-client@0.7.20': - resolution: {integrity: sha512-Qj5FzV5ywImEU/hHwI9rdKgpI2+Hh1+DZkogiu5S43mY3qprVqENoyp+iS9jJUvUQNzdpMtM3gFjFvyK03pZdQ==} + '@hcengineering/account-client@0.7.25': + resolution: {integrity: sha512-GHGitAfJjljj201TxmeFZSN6qw/FSblDs0ljpl230eBd4EB7jDpAbUyCNdvUt1CK0uBbJECtPrfbmiuBVPvI8w==} '@hcengineering/analytics@0.7.17': resolution: {integrity: sha512-AzB2DvmDctEJge8VeAHS3YyRYij/QQlARxa2OCNiY+Vv+2+OsQk0NZsw1yqZqsMkVJ40FTUrzOkI7UdM6RPO1Q==} + '@hcengineering/analytics@0.7.19': + resolution: {integrity: sha512-fdsNGs/OlFqBrE/byUXWWZoTwfKXLR8sg07JHgZAEumuI19W1BnJM3tb0Eih4lFQl16DEjT7zxtXaWcU797u3Q==} + + '@hcengineering/card@0.7.0': + resolution: {integrity: sha512-8tviVI1Hf8IE1EIMLd+VmWIE3T5wQz1CYIW7Dwd4Vc+1uZllGTYTM3cGT1jDbHWeQCgLcyG/OlGEKlpHl30Tew==} + '@hcengineering/client-resources@0.7.18': resolution: {integrity: sha512-nnskuWP6D5QN4Yjf/P/QLzJOi0kfntEos9R75nWrN0L08PvGfVASehgB/8J/Uwmm/LrdWcJVnw2+9bK11jGn4g==} '@hcengineering/client@0.7.18': resolution: {integrity: sha512-r42fZwfz/bizU4INMG39elQOkAW8E+uRLDZHp3DnLEXgnl/B2mfu1Q0xWkey1pj2//myuMAOocyT8a83ms2J/A==} - '@hcengineering/core@0.7.23': - resolution: {integrity: sha512-2FmzSMUreuQPBrhTjMI72SY2C4dtw5HwxJlOHuvm8A3hthwU5IS9Kmk1H/8y2ZfiC7x1a7gqeCnRsm02BjcZfw==} + '@hcengineering/contact@0.7.0': + resolution: {integrity: sha512-vrgkI/bZ74Mv/yCIXbv6pVCU/vHYEY8XJ+b2Xl79K4qrKP/+iArHTUtpquU0tqpC8eV5lTRbdrxSbFr6JXzNpw==} + + '@hcengineering/core@0.7.26': + resolution: {integrity: sha512-VUKnNnsl44VJCs/HWFP1KUVUti4/eS4YgLCVWaGjPUzwOiC0cHRGwW+7ukqAlb4b6jTD12Qwa9qdFF3qAPEz9A==} '@hcengineering/hulylake-client@0.7.17': resolution: {integrity: sha512-TPqdc5nd7xV73Y1B2EJ7GxpWazp9ACV1AqHlm6ebYwU1CzXQvbuJxF68itbHmPiNiCmmuiDruJmjnyLGwL18Kw==} - '@hcengineering/measurements@0.7.18': - resolution: {integrity: sha512-4MxYthJhNWPfR389lN5cIFtrhzgmhi39Fx/dqIOOYF+6g0WWA6GtWXi+ORRM8l/AWKSastZqsWxMdBbT+0htdg==} + '@hcengineering/measurements@0.7.19': + resolution: {integrity: sha512-hw/fhqoJfchSBdGbjx+UbuOqf6omp/pjPsaabixcgw1BYO5F4X4G+b07yfZxMNf1PnLfwntCleisuNqLvjD+gw==} '@hcengineering/platform-rig@0.7.19': resolution: {integrity: sha512-3Fi5nU+nEPjzzcm3FIfEZU+ZgdkiSfL46ojbj42jdXnWMkxew2aZZVtfmIpPnMUP9AMZlj2/EA+yOcMzfY/VmA==} @@ -1591,9 +1607,15 @@ packages: '@hcengineering/platform@0.7.19': resolution: {integrity: sha512-HdRJ81A1p/0P9qmHUsBeyWgIkkz00a9fNdxJWjftD0zG2g1UK0212cGy1nfY3PbCefaf3PW/RqHs/oEVInl4iA==} + '@hcengineering/platform@0.7.20': + resolution: {integrity: sha512-T84Obdt408ZBmYCzK+WaQcehHO1g59NbynQk0F9Y+DnB819OfCcgTzoIhTh4aXNY39X2sJ9qhgacZ3D23nenuQ==} + '@hcengineering/postgres-base@0.7.17': resolution: {integrity: sha512-ex5Xtsce/wa4xdY6dDlKyWaFsNQlgHVVcD0R9BF7hOLDkTDbtkzpT+syYpCJSXCfT4MoA9x3xDcGAD5geDYhrg==} + '@hcengineering/preference@0.7.0': + resolution: {integrity: sha512-VdmWaR20xu4KhFhRAr86IZ4lB8sPD8DieN0qacIB/EXkqgdYpDov0zCR4SYI1HLSk7YR7bhnEWZXTvGc1N8a6Q==} + '@hcengineering/query@0.7.17': resolution: {integrity: sha512-dOQbLwEHIp5D4J73I96LKeCIb5Am12jXAmrqpoMMmnA8u6UZylJVT8Vn9HwfPTUTVXmYnv9QxUNPKEn/MpaOAw==} @@ -1609,6 +1631,9 @@ packages: '@hcengineering/storage@0.7.17': resolution: {integrity: sha512-1njEkieVWcJgZHvHBB7d656x1EgkwpFeYI9PGJPAiIMnONRfP4KsGLEgfT9Hb5QTM451RCjctbDF+ibBpsCBdQ==} + '@hcengineering/templates@0.7.0': + resolution: {integrity: sha512-1tmbv2Aw2/p5T0RPUunc/2s4c8bSdhOYN5NZTKl7KVA1W4RDjpg6rqcgls6IV+BuoIg3FFEWuVHVGin5fJClqg==} + '@hcengineering/text-core@0.7.18': resolution: {integrity: sha512-UZ/ZMwVcf60WpnYYcsA7RqYE4JlHnAGVdmUDHX2SYzXXvDIK7deGWD9AKyK4yqI1mb19ccyCr5fGyGoLxx9k/g==} @@ -1618,6 +1643,15 @@ packages: '@hcengineering/text@0.7.18': resolution: {integrity: sha512-0se5IwEF/7LoHcFqqxtx7WUEc0sfzaytsQeqs15gRfjLx0vJ/XMc/ZAj1lkpeLKMPXRQ0mCwdzMjxVzo3W9XDQ==} + '@hcengineering/theme@0.7.0': + resolution: {integrity: sha512-n1sgpfNZuC+e9fO+en77DNgOE4quh0+IAy+r+/g65U+ENSD9nmUVFoym9IdwFnrUrTLPa4jyxncGrZ16fJtdsA==} + + '@hcengineering/ui@0.7.0': + resolution: {integrity: sha512-sm2T3TIVQtHBMLw94VsRksHyJQ2Xva6p5vEUkVn5CvFrimALohx72iFzBsd7Oz9MYsX0RPZJIe49IONb2GmLBQ==} + + '@hcengineering/view@0.7.0': + resolution: {integrity: sha512-qeqBD4mSHSRUqrLPFHWZ0FUDDeJH4S0DDkosVjfZuHYQ7xjlfWCRMlDpVyKhtmNvkTMnb1GLvHzxKxe1gTkl/w==} + '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -2262,6 +2296,9 @@ packages: '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@types/uuid@8.3.4': resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} @@ -2429,6 +2466,9 @@ packages: async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + autolinker@4.0.0: + resolution: {integrity: sha512-fl5Kh6BmEEZx+IWBfEirnRUU5+cOiV0OK7PEt0RBKvJMJ8GaRseIOeDU3FKf4j3CE5HVefcjHmhYPOcaVt0bZw==} + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -2479,6 +2519,9 @@ packages: block-stream2@2.1.0: resolution: {integrity: sha512-suhjmLI57Ewpmq00qaygS8UgEq2ly2PCItenIyhMqVjo4t4pGzqMvfgJuX8iWTeSDdfSSqS6j38fL4ToNL7Pfg==} + blurhash@2.0.5: + resolution: {integrity: sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==} + bowser@2.12.1: resolution: {integrity: sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==} @@ -2597,6 +2640,9 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + core-js@3.48.0: + resolution: {integrity: sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==} + create-jest@29.7.0: resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2630,6 +2676,9 @@ packages: engines: {node: '>=4'} hasBin: true + custom-event-polyfill@1.0.7: + resolution: {integrity: sha512-TDDkd5DkaZxZFM8p+1I3yAlvM3rSr1wbrOliG4yJiwinMZN8z/iGL7BTlDkrJcYTmgUSb4ywVCc3ZaUtOtC76w==} + data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -2642,6 +2691,15 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} + date-fns-tz@2.0.1: + resolution: {integrity: sha512-fJCG3Pwx8HUoLhkepdsP7Z5RsucUi+ZBOxyM5d0ZZ6c4SdYustq0VMmOu6Wf7bli+yS/Jwp91TOCqn9jMcVrUA==} + peerDependencies: + date-fns: 2.x + + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} @@ -2719,6 +2777,9 @@ packages: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} + dompurify@3.3.1: + resolution: {integrity: sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -2733,6 +2794,13 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emojibase-regex@16.0.0: + resolution: {integrity: sha512-ZMp31BkzBWNW+T73of6NURL6nXQa5GkfKneOkr3cEwBDVllbW/2nuva7NO0J3RjaQ07+SZQNgPTGZ4JlIhmM2Q==} + + emojibase@16.0.0: + resolution: {integrity: sha512-Nw2m7JLIO4Ou2X/yZPRNscHQXVbbr6SErjkJ7EooG7MbR3yDZszCv9KTizsXFc7yZl0n3WF+qUKIC/Lw6H9xaQ==} + engines: {node: '>=18.12.0'} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -3568,6 +3636,9 @@ packages: linkifyjs@4.3.2: resolution: {integrity: sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==} + loadjs@4.3.0: + resolution: {integrity: sha512-vNX4ZZLJBeDEOBvdr2v/F+0aN5oMuPu7JTqrMwp+DtgK+AryOlpy6Xtm2/HpNr+azEa828oQjOtWsB6iDtSfSQ==} + locate-character@3.0.0: resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} @@ -3846,6 +3917,9 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + plyr@3.8.4: + resolution: {integrity: sha512-DrzLbK9Wol3zeiuZCleD9aUOl0KAaBHR9H6WVVVYPZ4Ya+LYxUFTgSF1jooHcMQCv96Ws96wCaZzIoP3bES8pQ==} + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -3993,6 +4067,9 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + rangetouch@2.0.1: + resolution: {integrity: sha512-sln+pNSc8NGaHoLzwNBssFSf/rSYkqeBXzX1AtJlkJiUaVSJSbRAWJk+4omsXkN+EJalzkZhWQ3th1m0FpR5xA==} + react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} @@ -4465,6 +4542,9 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + url-polyfill@1.1.14: + resolution: {integrity: sha512-p4f3TTAG6ADVF3mwbXw7hGw+QJyw5CnNGvYh5fCuQQZIiuKUswqcznyV3pGDP9j0TSmC4UvRKm8kl1QsX1diiQ==} + utf-8-validate@6.0.5: resolution: {integrity: sha512-EYZR+OpIXp9Y1eG1iueg8KRsY8TuT8VNgnanZ0uA3STqhHQTLwbl+WX76/9X5OY12yQubymBpaBSmMPkSTQcKA==} engines: {node: '>=6.14.2'} @@ -5270,6 +5350,8 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 + '@babel/runtime@7.28.6': {} + '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 @@ -5435,42 +5517,64 @@ snapshots: dependencies: tslib: 2.8.1 - '@hcengineering/account-client@0.7.20': + '@hcengineering/account-client@0.7.25': dependencies: - '@hcengineering/core': 0.7.23 - '@hcengineering/platform': 0.7.19 + '@hcengineering/core': 0.7.26 + '@hcengineering/platform': 0.7.20 '@hcengineering/analytics@0.7.17': dependencies: '@hcengineering/platform': 0.7.19 + '@hcengineering/analytics@0.7.19': + dependencies: + '@hcengineering/platform': 0.7.20 + + '@hcengineering/card@0.7.0': + dependencies: + '@hcengineering/core': 0.7.26 + '@hcengineering/platform': 0.7.19 + '@hcengineering/preference': 0.7.0 + '@hcengineering/ui': 0.7.0 + '@hcengineering/view': 0.7.0 + '@hcengineering/client-resources@0.7.18': dependencies: '@hcengineering/analytics': 0.7.17 '@hcengineering/client': 0.7.18 - '@hcengineering/core': 0.7.23 + '@hcengineering/core': 0.7.26 '@hcengineering/platform': 0.7.19 '@hcengineering/rpc': 0.7.17 snappyjs: 0.7.0 '@hcengineering/client@0.7.18': dependencies: - '@hcengineering/core': 0.7.23 + '@hcengineering/core': 0.7.26 '@hcengineering/platform': 0.7.19 - '@hcengineering/core@0.7.23': + '@hcengineering/contact@0.7.0': dependencies: - '@hcengineering/analytics': 0.7.17 - '@hcengineering/measurements': 0.7.18 + '@hcengineering/card': 0.7.0 + '@hcengineering/core': 0.7.26 '@hcengineering/platform': 0.7.19 + '@hcengineering/preference': 0.7.0 + '@hcengineering/templates': 0.7.0 + '@hcengineering/ui': 0.7.0 + '@hcengineering/view': 0.7.0 + + '@hcengineering/core@0.7.26': + dependencies: + '@hcengineering/analytics': 0.7.19 + '@hcengineering/measurements': 0.7.19 + '@hcengineering/platform': 0.7.20 fast-equals: 5.3.2 '@hcengineering/hulylake-client@0.7.17': dependencies: - '@hcengineering/core': 0.7.23 + '@hcengineering/core': 0.7.26 '@hcengineering/retry': 0.7.17 - '@hcengineering/measurements@0.7.18': {} + '@hcengineering/measurements@0.7.19': {} '@hcengineering/platform-rig@0.7.19(@babel/core@7.28.5)(postcss-load-config@3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@22.19.0)(typescript@5.9.3)))(postcss@8.5.6)(ts-node@10.9.2(@types/node@22.19.0)(typescript@5.9.3))': dependencies: @@ -5509,14 +5613,24 @@ snapshots: dependencies: intl-messageformat: 10.7.18 + '@hcengineering/platform@0.7.20': + dependencies: + intl-messageformat: 10.7.18 + '@hcengineering/postgres-base@0.7.17': dependencies: postgres: 3.4.7 + '@hcengineering/preference@0.7.0': + dependencies: + '@hcengineering/core': 0.7.26 + '@hcengineering/platform': 0.7.19 + '@hcengineering/ui': 0.7.0 + '@hcengineering/query@0.7.17': dependencies: '@hcengineering/analytics': 0.7.17 - '@hcengineering/core': 0.7.23 + '@hcengineering/core': 0.7.26 '@hcengineering/platform': 0.7.19 fast-equals: 5.3.2 @@ -5524,32 +5638,38 @@ snapshots: '@hcengineering/rpc@0.7.17': dependencies: - '@hcengineering/core': 0.7.23 + '@hcengineering/core': 0.7.26 '@hcengineering/platform': 0.7.19 msgpackr: 1.11.5 '@hcengineering/server-token@0.7.17': dependencies: - '@hcengineering/core': 0.7.23 + '@hcengineering/core': 0.7.26 '@hcengineering/platform': 0.7.19 jwt-simple: 0.5.6 uuid: 8.3.2 '@hcengineering/storage@0.7.17': dependencies: - '@hcengineering/core': 0.7.23 + '@hcengineering/core': 0.7.26 '@hcengineering/platform': 0.7.19 fast-equals: 5.3.2 + '@hcengineering/templates@0.7.0': + dependencies: + '@hcengineering/core': 0.7.26 + '@hcengineering/platform': 0.7.19 + '@hcengineering/ui': 0.7.0 + '@hcengineering/text-core@0.7.18': dependencies: - '@hcengineering/core': 0.7.23 + '@hcengineering/core': 0.7.26 fast-equals: 5.3.2 hash-it: 6.0.0 '@hcengineering/text-ydoc@0.7.18(prosemirror-inputrules@1.5.1)(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3)': dependencies: - '@hcengineering/core': 0.7.23 + '@hcengineering/core': 0.7.26 '@hcengineering/text': 0.7.18(prosemirror-inputrules@1.5.1)(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3) '@hcengineering/text-core': 0.7.18 y-protocols: 1.0.6(yjs@13.6.27) @@ -5562,7 +5682,7 @@ snapshots: '@hcengineering/text@0.7.18(prosemirror-inputrules@1.5.1)(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3)': dependencies: - '@hcengineering/core': 0.7.23 + '@hcengineering/core': 0.7.26 '@hcengineering/text-core': 0.7.18 '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) '@tiptap/extension-blockquote': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) @@ -5608,6 +5728,36 @@ snapshots: - prosemirror-state - prosemirror-view + '@hcengineering/theme@0.7.0': + dependencies: + '@hcengineering/analytics': 0.7.17 + '@hcengineering/platform': 0.7.19 + svelte: 4.2.20 + + '@hcengineering/ui@0.7.0': + dependencies: + '@hcengineering/analytics': 0.7.17 + '@hcengineering/core': 0.7.26 + '@hcengineering/platform': 0.7.19 + '@hcengineering/theme': 0.7.0 + autolinker: 4.0.0 + blurhash: 2.0.5 + date-fns: 2.30.0 + date-fns-tz: 2.0.1(date-fns@2.30.0) + dompurify: 3.3.1 + emojibase: 16.0.0 + emojibase-regex: 16.0.0 + fast-equals: 5.3.2 + plyr: 3.8.4 + svelte: 4.2.20 + + '@hcengineering/view@0.7.0': + dependencies: + '@hcengineering/core': 0.7.26 + '@hcengineering/platform': 0.7.19 + '@hcengineering/preference': 0.7.0 + '@hcengineering/ui': 0.7.0 + '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -6474,6 +6624,9 @@ snapshots: '@types/stack-utils@2.0.3': {} + '@types/trusted-types@2.0.7': + optional: true + '@types/uuid@8.3.4': {} '@types/webidl-conversions@7.0.3': {} @@ -6683,6 +6836,10 @@ snapshots: async@3.2.6: {} + autolinker@4.0.0: + dependencies: + tslib: 2.8.1 + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 @@ -6756,6 +6913,8 @@ snapshots: dependencies: readable-stream: 3.6.2 + blurhash@2.0.5: {} + bowser@2.12.1: {} brace-expansion@1.1.12: @@ -6880,6 +7039,8 @@ snapshots: convert-source-map@2.0.0: {} + core-js@3.48.0: {} + create-jest@29.7.0(@types/node@22.19.0)(ts-node@10.9.2(@types/node@22.19.0)(typescript@5.9.3)): dependencies: '@jest/types': 29.6.3 @@ -6918,6 +7079,8 @@ snapshots: cssesc@3.0.0: {} + custom-event-polyfill@1.0.7: {} + data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 @@ -6936,6 +7099,14 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 + date-fns-tz@2.0.1(date-fns@2.30.0): + dependencies: + date-fns: 2.30.0 + + date-fns@2.30.0: + dependencies: + '@babel/runtime': 7.28.6 + debug@3.2.7: dependencies: ms: 2.1.3 @@ -6991,6 +7162,10 @@ snapshots: dependencies: esutils: 2.0.3 + dompurify@3.3.1: + optionalDependencies: + '@types/trusted-types': 2.0.7 + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -7003,6 +7178,10 @@ snapshots: emoji-regex@8.0.0: {} + emojibase-regex@16.0.0: {} + + emojibase@16.0.0: {} + entities@4.5.0: {} entities@5.0.0: {} @@ -8153,6 +8332,8 @@ snapshots: linkifyjs@4.3.2: {} + loadjs@4.3.0: {} + locate-character@3.0.0: {} locate-path@5.0.0: @@ -8419,6 +8600,14 @@ snapshots: dependencies: find-up: 4.1.0 + plyr@3.8.4: + dependencies: + core-js: 3.48.0 + custom-event-polyfill: 1.0.7 + loadjs: 4.3.0 + rangetouch: 2.0.1 + url-polyfill: 1.1.14 + possible-typed-array-names@1.1.0: {} postcss-load-config@3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@22.19.0)(typescript@5.9.3)): @@ -8595,6 +8784,8 @@ snapshots: queue-microtask@1.2.3: {} + rangetouch@2.0.1: {} + react-is@18.3.1: {} readable-stream@3.6.2: @@ -9083,6 +9274,8 @@ snapshots: dependencies: punycode: 2.3.1 + url-polyfill@1.1.14: {} + utf-8-validate@6.0.5: dependencies: node-gyp-build: 4.8.4 diff --git a/common/scripts/package-lock.json b/common/scripts/package-lock.json index 09f0f01..e0a0ba0 100644 --- a/common/scripts/package-lock.json +++ b/common/scripts/package-lock.json @@ -21,14 +21,14 @@ "dependencies": { "@typescript-eslint/eslint-plugin": "^6.11.0", "@typescript-eslint/parser": "^6.11.0", - "esbuild": "^0.25.9", - "esbuild-plugin-copy": "^2.1.1", + "esbuild": "^0.25.10", + "esbuild-plugin-copy": "~2.1.1", "eslint": "^8.54.0", "eslint-config-standard-with-typescript": "^40.0.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-n": "^15.4.0", "eslint-plugin-promise": "^6.1.1", - "prettier": "^3.1.0", + "prettier": "^3.6.2", "typescript": "^5.9.3" }, "bin": { diff --git a/packages/client/package.json b/packages/client/package.json index acc107d..4d5bb5f 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -26,22 +26,22 @@ "eslint": "^8.54.0", "@typescript-eslint/parser": "^6.21.0", "eslint-config-standard-with-typescript": "^40.0.0", - "prettier": "^3.1.0", + "prettier": "^3.6.2", "typescript": "^5.9.3", "@types/uuid": "^8.3.1", - "@types/ws": "^8.5.11", + "@types/ws": "^8.5.12", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", - "@types/node": "^22.15.29", + "@types/node": "^22.18.1", "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { "@hcengineering/platform": "^0.7.19", - "@hcengineering/core": "^0.7.23", + "@hcengineering/core": "^0.7.24", "@hcengineering/client-resources": "^0.7.18", "@hcengineering/client": "^0.7.18", - "@hcengineering/account-client": "^0.7.20", + "@hcengineering/account-client": "^0.7.21", "@hcengineering/server-core": "workspace:^0.7.18", "@hcengineering/server-token": "^0.7.17", "ws": "^8.18.2" diff --git a/packages/client/src/blob.ts b/packages/client/src/blob.ts index 65171c8..30b3032 100644 --- a/packages/client/src/blob.ts +++ b/packages/client/src/blob.ts @@ -46,6 +46,8 @@ export class BlobClient { ): Promise { let written = 0 const chunkSize = 50 * 1024 * 1024 + let emptyChunkRetries = 0 + const maxEmptyChunkRetries = 3 // Use ranges to iterave through file with retry if required. while (written < size) { @@ -65,6 +67,24 @@ export class BlobClient { }) const chunk = Buffer.concat(chunks) + // Check for empty chunk to prevent infinite loop + if (chunk.length === 0) { + emptyChunkRetries++ + if (emptyChunkRetries >= maxEmptyChunkRetries) { + ctx.error('Empty chunk received multiple times, aborting', { name, written, size, emptyChunkRetries }) + await new Promise((resolve) => { + writable.end(resolve) + }) + throw new Error( + `Empty chunk received ${emptyChunkRetries} times for blob ${name} at offset ${written}/${size}` + ) + } + ctx.warn('Empty chunk received, retrying', { name, written, size, retry: emptyChunkRetries }) + await new Promise((resolve) => setTimeout(resolve, 100 * emptyChunkRetries)) + continue + } + emptyChunkRetries = 0 // Reset on successful non-empty chunk + await new Promise((resolve, reject) => { writable.write(chunk, (err) => { if (err != null) { @@ -86,13 +106,13 @@ export class BlobClient { ctx.info('No such key', { name }) return } - if (i > 4) { + if (i >= 4) { await new Promise((resolve) => { writable.end(resolve) }) throw err } - await new Promise((resolve) => setTimeout(resolve, 10)) + await new Promise((resolve) => setTimeout(resolve, 100 * (i + 1))) // retry } } diff --git a/packages/collaboration/package.json b/packages/collaboration/package.json index d615fa2..d386750 100644 --- a/packages/collaboration/package.json +++ b/packages/collaboration/package.json @@ -19,7 +19,7 @@ }, "devDependencies": { "@hcengineering/platform-rig": "^0.7.19", - "@types/node": "^22.15.29", + "@types/node": "^22.18.1", "@typescript-eslint/eslint-plugin": "^6.21.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", @@ -27,7 +27,7 @@ "eslint": "^8.54.0", "@typescript-eslint/parser": "^6.21.0", "eslint-config-standard-with-typescript": "^40.0.0", - "prettier": "^3.1.0", + "prettier": "^3.6.2", "typescript": "^5.9.3", "jest": "^29.7.0", "ts-jest": "^29.1.1", @@ -35,7 +35,7 @@ "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { - "@hcengineering/core": "^0.7.23", + "@hcengineering/core": "^0.7.24", "@hcengineering/server-core": "workspace:^0.7.18", "@hcengineering/text": "^0.7.18", "@hcengineering/text-ydoc": "^0.7.18", diff --git a/packages/core/package.json b/packages/core/package.json index 1412498..44a2a7d 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -19,7 +19,7 @@ }, "devDependencies": { "@hcengineering/platform-rig": "^0.7.19", - "@types/node": "^22.15.29", + "@types/node": "^22.18.1", "@typescript-eslint/eslint-plugin": "^6.21.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", @@ -27,7 +27,7 @@ "eslint": "^8.54.0", "@typescript-eslint/parser": "^6.21.0", "eslint-config-standard-with-typescript": "^40.0.0", - "prettier": "^3.1.0", + "prettier": "^3.6.2", "typescript": "^5.9.3", "jest": "^29.7.0", "ts-jest": "^29.1.1", @@ -37,7 +37,7 @@ }, "dependencies": { "@hcengineering/analytics": "^0.7.17", - "@hcengineering/core": "^0.7.23", + "@hcengineering/core": "^0.7.24", "@hcengineering/platform": "^0.7.19", "@hcengineering/query": "^0.7.17", "@hcengineering/rpc": "^0.7.17", diff --git a/packages/core/src/__tests__/shared-integration.ts b/packages/core/src/__tests__/shared-integration.ts index 322676d..7779274 100644 --- a/packages/core/src/__tests__/shared-integration.ts +++ b/packages/core/src/__tests__/shared-integration.ts @@ -448,7 +448,7 @@ export function runSharedIntegrationTests (adapterName: string, getContext: () = } ) expect(r.length).toEqual(1) - expect(r[0].$associations?.[association._id][0]?._id).toEqual(secondTask) + expect(r[0].$associations?.[`${association._id}_b`][0]?._id).toEqual(secondTask) }) }) diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 73d6f3d..09d7053 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -349,6 +349,7 @@ export interface IndexedDoc { searchShortTitle_fields?: any[] searchIcon_fields?: any[] fulltextSummary?: string + baseId?: Ref [key: string]: any } diff --git a/packages/datalake/package.json b/packages/datalake/package.json index 17feb34..00028a9 100644 --- a/packages/datalake/package.json +++ b/packages/datalake/package.json @@ -26,17 +26,17 @@ "eslint": "^8.54.0", "@typescript-eslint/parser": "^6.21.0", "eslint-config-standard-with-typescript": "^40.0.0", - "prettier": "^3.1.0", + "prettier": "^3.6.2", "typescript": "^5.9.3", - "@types/node": "^22.15.29", + "@types/node": "^22.18.1", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", - "ts-node": "^10.8.0", + "ts-node": "^10.9.2", "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { - "@hcengineering/core": "^0.7.23", + "@hcengineering/core": "^0.7.24", "@hcengineering/platform": "^0.7.19", "@hcengineering/server-core": "workspace:^0.7.18", "@hcengineering/server-token": "^0.7.17" diff --git a/packages/elastic/package.json b/packages/elastic/package.json index 72879d2..70b741b 100644 --- a/packages/elastic/package.json +++ b/packages/elastic/package.json @@ -44,10 +44,10 @@ "eslint-plugin-promise": "^6.1.1", "eslint-plugin-n": "^15.4.0", "eslint": "^8.54.0", - "ts-node": "^10.8.0", + "ts-node": "^10.9.2", "@typescript-eslint/parser": "^6.21.0", "eslint-config-standard-with-typescript": "^40.0.0", - "prettier": "^3.1.0", + "prettier": "^3.6.2", "typescript": "^5.9.3", "jest": "^29.7.0", "ts-jest": "^29.1.1", @@ -55,7 +55,7 @@ "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { - "@hcengineering/core": "^0.7.23", + "@hcengineering/core": "^0.7.24", "@hcengineering/platform": "^0.7.19", "@hcengineering/server-core": "workspace:^0.7.18", "@elastic/elasticsearch": "^7.17.14", diff --git a/packages/hulylake/package.json b/packages/hulylake/package.json index 6c43d70..6005df3 100644 --- a/packages/hulylake/package.json +++ b/packages/hulylake/package.json @@ -26,17 +26,17 @@ "eslint": "^8.54.0", "@typescript-eslint/parser": "^6.21.0", "eslint-config-standard-with-typescript": "^40.0.0", - "prettier": "^3.1.0", + "prettier": "^3.6.2", "typescript": "^5.9.3", - "@types/node": "^22.15.29", + "@types/node": "^22.18.1", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", - "ts-node": "^10.8.0", + "ts-node": "^10.9.2", "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { - "@hcengineering/core": "^0.7.23", + "@hcengineering/core": "^0.7.24", "@hcengineering/platform": "^0.7.19", "@hcengineering/server-core": "workspace:^0.7.18", "@hcengineering/server-token": "^0.7.17", diff --git a/packages/kafka/package.json b/packages/kafka/package.json index 75754ec..0205d34 100644 --- a/packages/kafka/package.json +++ b/packages/kafka/package.json @@ -26,16 +26,16 @@ "eslint": "^8.54.0", "@typescript-eslint/parser": "^6.21.0", "eslint-config-standard-with-typescript": "^40.0.0", - "prettier": "^3.1.0", + "prettier": "^3.6.2", "typescript": "^5.9.3", - "@types/node": "^22.15.29", + "@types/node": "^22.18.1", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { - "@hcengineering/core": "^0.7.23", + "@hcengineering/core": "^0.7.24", "@hcengineering/platform": "^0.7.19", "@hcengineering/server-core": "workspace:^0.7.18", "@hcengineering/storage": "^0.7.17", diff --git a/packages/middleware/package.json b/packages/middleware/package.json index f3d71c8..24c740c 100644 --- a/packages/middleware/package.json +++ b/packages/middleware/package.json @@ -26,16 +26,17 @@ "eslint": "^8.54.0", "@typescript-eslint/parser": "^6.21.0", "eslint-config-standard-with-typescript": "^40.0.0", - "prettier": "^3.1.0", + "prettier": "^3.6.2", "typescript": "^5.9.3", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", - "@types/node": "^22.15.29", + "@types/node": "^22.18.1", "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { - "@hcengineering/core": "^0.7.23", + "@hcengineering/core": "^0.7.24", + "@hcengineering/contact": "^0.7.0", "@hcengineering/platform": "^0.7.19", "@hcengineering/server-core": "workspace:^0.7.18", "@hcengineering/query": "^0.7.17", diff --git a/packages/middleware/src/applyTx.ts b/packages/middleware/src/applyTx.ts index e1275ef..a6e9407 100644 --- a/packages/middleware/src/applyTx.ts +++ b/packages/middleware/src/applyTx.ts @@ -63,6 +63,14 @@ export class ApplyTxMiddleware extends BaseMiddleware implements Middleware { } applyResult.serverTime = Date.now() - st } else { + ctx.warn('TxApplyIf failed', { + scope: applyIf.scope, + reason: passed.reason, + measureName: applyIf.measureName, + matchCount: applyIf.match?.length ?? 0, + notMatchCount: applyIf.notMatch?.length ?? 0, + txCount: applyIf.txes.length + }) result.push({ success: false }) @@ -92,6 +100,7 @@ export class ApplyTxMiddleware extends BaseMiddleware implements Middleware { ): Promise<{ onEnd: () => void passed: boolean + reason?: string }> { if (applyIf.scope == null) { return { passed: true, onEnd: () => {} } @@ -115,11 +124,13 @@ export class ApplyTxMiddleware extends BaseMiddleware implements Middleware { }) ) let passed = true + let reason: string | undefined if (applyIf.match != null) { for (const { _class, query } of applyIf.match) { const res = await this.provideFindAll(ctx, _class, query, { limit: 1 }) if (res.length === 0) { passed = false + reason = `match query failed: class=${_class}, query=${JSON.stringify(query)}` break } } @@ -129,10 +140,11 @@ export class ApplyTxMiddleware extends BaseMiddleware implements Middleware { const res = await this.provideFindAll(ctx, _class, query, { limit: 1 }) if (res.length > 0) { passed = false + reason = `notMatch query failed: class=${_class}, query=${JSON.stringify(query)} (found ${res.length} matching document(s))` break } } } - return { passed, onEnd } + return { passed, onEnd, reason } } } diff --git a/packages/middleware/src/guestPermissions.ts b/packages/middleware/src/guestPermissions.ts index 55fb936..13a2498 100644 --- a/packages/middleware/src/guestPermissions.ts +++ b/packages/middleware/src/guestPermissions.ts @@ -5,6 +5,7 @@ import { type TxMiddlewareResult } from '@hcengineering/server-core' import core, { + type Account, AccountRole, type Doc, hasAccountRole, @@ -19,6 +20,7 @@ import core, { type TxUpdateDoc } from '@hcengineering/core' import platform, { PlatformError, Severity, Status } from '@hcengineering/platform' +import contact, { type Person } from '@hcengineering/contact' export class GuestPermissionsMiddleware extends BaseMiddleware implements Middleware { static async create ( @@ -40,44 +42,44 @@ export class GuestPermissionsMiddleware extends BaseMiddleware implements Middle } for (const tx of txes) { - this.processTx(ctx, tx) + await this.processTx(ctx, tx) } return await this.provideTx(ctx, txes) } - private processTx (ctx: MeasureContext, tx: Tx): void { + private async processTx (ctx: MeasureContext, tx: Tx): Promise { const h = this.context.hierarchy if (tx._class === core.class.TxApplyIf) { const applyTx = tx as TxApplyIf for (const t of applyTx.txes) { - this.processTx(ctx, t) + await this.processTx(ctx, t) } return } if (TxProcessor.isExtendsCUD(tx._class)) { - const socialIds = ctx.contextData.account.socialIds + const { account } = ctx.contextData const cudTx = tx as TxCUD const isSpace = h.isDerived(cudTx.objectClass, core.class.Space) if (isSpace) { - if (this.isForbiddenSpaceTx(cudTx as TxCUD, socialIds)) { + if (await this.isForbiddenSpaceTx(ctx, cudTx as TxCUD, account)) { throw new PlatformError(new Status(Severity.ERROR, platform.status.Forbidden, {})) } - } else if (cudTx.space !== core.space.DerivedTx && this.isForbiddenTx(cudTx, socialIds)) { + } else if (cudTx.space !== core.space.DerivedTx && (await this.isForbiddenTx(ctx, cudTx, account))) { throw new PlatformError(new Status(Severity.ERROR, platform.status.Forbidden, {})) } } } - private isForbiddenTx (tx: TxCUD, socialIds: PersonId[]): boolean { + private async isForbiddenTx (ctx: MeasureContext, tx: TxCUD, account: Account): Promise { if (tx._class === core.class.TxMixin) return false - return !this.hasMixinAccessLevel(tx, socialIds) + return !(await this.hasMixinAccessLevel(ctx, tx, account)) } - private isForbiddenSpaceTx (tx: TxCUD, socialIds: PersonId[]): boolean { + private async isForbiddenSpaceTx (ctx: MeasureContext, tx: TxCUD, account: Account): Promise { if (tx._class === core.class.TxRemoveDoc) return true if (tx._class === core.class.TxCreateDoc) { - return !this.hasMixinAccessLevel(tx, socialIds) + return !(await this.hasMixinAccessLevel(ctx, tx, account)) } if (tx._class === core.class.TxUpdateDoc) { const updateTx = tx as TxUpdateDoc @@ -93,7 +95,7 @@ export class GuestPermissionsMiddleware extends BaseMiddleware implements Middle return false } - private hasMixinAccessLevel (tx: TxCUD, socialIds: PersonId[]): boolean { + private async hasMixinAccessLevel (ctx: MeasureContext, tx: TxCUD, account: Account): Promise { const h = this.context.hierarchy const accessLevelMixin = h.classHierarchyMixin(tx.objectClass, core.mixin.TxAccessLevel) if (accessLevelMixin === undefined) return false @@ -104,9 +106,15 @@ export class GuestPermissionsMiddleware extends BaseMiddleware implements Middle return accessLevelMixin.removeAccessLevel === AccountRole.Guest } if (tx._class === core.class.TxUpdateDoc) { - if (accessLevelMixin.isIdentity === true && socialIds.includes(tx.objectId as unknown as PersonId)) { + if (accessLevelMixin.isIdentity === true && account.socialIds.includes(tx.objectId as unknown as PersonId)) { return true } + if (accessLevelMixin.isIdentity === true && h.isDerived(tx.objectClass, contact.class.Person)) { + const person = (await this.findAll(ctx, tx.objectClass, { _id: tx.objectId }, { limit: 1 }))[0] as + | Person + | undefined + return person?.personUuid === account.uuid + } return accessLevelMixin.updateAccessLevel === AccountRole.Guest } return false diff --git a/packages/middleware/src/index.ts b/packages/middleware/src/index.ts index c939f95..5e67306 100644 --- a/packages/middleware/src/index.ts +++ b/packages/middleware/src/index.ts @@ -43,3 +43,4 @@ export * from './pluginConfig' export * from './userStatus' export * from './findSecurity' export * from './normalizeTx' +export * from './versioning' diff --git a/packages/middleware/src/spacePermissions.ts b/packages/middleware/src/spacePermissions.ts index 1a0b1c5..6acd7f1 100644 --- a/packages/middleware/src/spacePermissions.ts +++ b/packages/middleware/src/spacePermissions.ts @@ -37,7 +37,7 @@ import core, { } from '@hcengineering/core' import platform, { PlatformError, Severity, Status } from '@hcengineering/platform' import { type Middleware, type TxMiddlewareResult, type PipelineContext } from '@hcengineering/server-core' - +import contact from '@hcengineering/contact' import { BaseMiddleware } from '@hcengineering/server-core' /** @@ -45,6 +45,7 @@ import { BaseMiddleware } from '@hcengineering/server-core' */ export class SpacePermissionsMiddleware extends BaseMiddleware implements Middleware { private whitelistSpaces = new Set>() + private readonly restrictedSpaces = new Set>() private assignmentBySpace: Record, RolesAssignment> = {} private permissionsBySpace: Record, Record>> = {} private typeBySpace: Record, Ref> = {} @@ -121,6 +122,12 @@ export class SpacePermissionsMiddleware extends BaseMiddleware implements Middle return } + if (space.restricted === true) { + this.restrictedSpaces.add(space._id) + } else { + this.restrictedSpaces.delete(space._id) + } + this.typeBySpace[space._id] = space.type const asMixin: RolesAssignment = this.context.hierarchy.as( @@ -157,15 +164,21 @@ export class SpacePermissionsMiddleware extends BaseMiddleware implements Middle * * Checks if the required permission is present in the space for the given context */ - private checkPermission (ctx: MeasureContext, space: Ref, tx: TxCUD): boolean { + private checkPermission ( + ctx: MeasureContext, + space: Ref, + tx: TxCUD, + isSpace: boolean + ): boolean { const account = ctx.contextData.account + if (account.primarySocialId === core.account.System) return true const permissions = this.permissionsBySpace[space]?.[account.uuid] ?? [] let withoutMatch: Permission | undefined for (const permission of permissions) { - if (permission.txClass === undefined || permission.txClass !== tx._class) continue + if (!isTxClassMatched(tx, permission)) continue if ( permission.objectClass !== undefined && - !this.context.hierarchy.isDerived(tx.objectClass, permission.objectClass) + !this.context.hierarchy.isDerived(getTxObjectClass(tx), permission.objectClass) ) { continue } @@ -185,6 +198,36 @@ export class SpacePermissionsMiddleware extends BaseMiddleware implements Middle return withoutMatch.forbid !== undefined ? !withoutMatch.forbid : true } + if (isSpace || !this.restrictedSpaces.has(space)) { + return true + } + + const attachedDocAncestors = this.context.hierarchy.getAncestors(core.class.AttachedDoc) + const ancestors = this.context.hierarchy.getAncestors(getTxObjectClass(tx)) + const targetAncestors = ancestors.filter((a) => !attachedDocAncestors.includes(a)) + + const allPermissions = this.context.modelDb.findAllSync(core.class.Permission, { + objectClass: { $in: targetAncestors } + }) + for (const permission of allPermissions) { + if (!isTxClassMatched(tx, permission)) continue + if ( + permission.objectClass !== undefined && + !this.context.hierarchy.isDerived(getTxObjectClass(tx), permission.objectClass) + ) { + continue + } + if (permission.txMatch === undefined) { + return false + } else { + const checkMatch = matchQuery([tx], permission.txMatch, tx._class, this.context.hierarchy, true) + if (checkMatch.length === 0) { + continue + } + return false + } + } + return true } @@ -273,6 +316,7 @@ export class SpacePermissionsMiddleware extends BaseMiddleware implements Middle delete this.typeBySpace[tx.objectId] this.whitelistSpaces.delete(tx.objectId) + this.restrictedSpaces.delete(tx.objectId) } private isSpaceTxCUD (tx: TxCUD): tx is TxCUD { @@ -337,9 +381,8 @@ export class SpacePermissionsMiddleware extends BaseMiddleware implements Middle if (this.isSpaceTxCUD(tx)) { if (tx._class === core.class.TxCreateDoc) { this.handleCreate(tx) - // } else if (tx._class === core.class.TxUpdateDoc) { - // Roles assignment in spaces are managed through the space type mixin - // so nothing to handle here + } else if (tx._class === core.class.TxUpdateDoc) { + this.handleSpaceUpdate(tx) } else if (tx._class === core.class.TxMixin) { this.handleMixin(tx) } else if (tx._class === core.class.TxRemoveDoc) { @@ -350,6 +393,21 @@ export class SpacePermissionsMiddleware extends BaseMiddleware implements Middle this.handlePermissionsUpdatesFromRoleTx(ctx, tx) } + private handleSpaceUpdate (tx: TxCUD): void { + if (!this.isTypedSpaceClass(tx.objectClass)) { + return + } + + const updateTx = tx as TxUpdateDoc + if (updateTx.operations.restricted !== undefined) { + if (updateTx.operations.restricted) { + this.restrictedSpaces.add(tx.objectId) + } else { + this.restrictedSpaces.delete(tx.objectId) + } + } + } + private processPermissionsUpdatesFromTx (ctx: MeasureContext, tx: Tx): void { if (!TxProcessor.isExtendsCUD(tx._class)) { return @@ -362,8 +420,8 @@ export class SpacePermissionsMiddleware extends BaseMiddleware implements Middle async tx (ctx: MeasureContext, txes: Tx[]): Promise { await this.init(ctx) for (const tx of txes) { - this.processPermissionsUpdatesFromTx(ctx, tx) this.checkPermissions(ctx, tx) + this.processPermissionsUpdatesFromTx(ctx, tx) } const res = await this.provideTx(ctx, txes) for (const txd of ctx.contextData.broadcast.txes) { @@ -388,18 +446,50 @@ export class SpacePermissionsMiddleware extends BaseMiddleware implements Middle this.checkSpacePermissions(ctx, cudTx, cudTx.objectSpace) if (isSpace) { - this.checkSpacePermissions(ctx, cudTx, cudTx.objectId as Ref) + this.checkSpaceTypePermissions(ctx, cudTx as TxCUD) + this.checkSpacePermissions(ctx, cudTx, cudTx.objectId as Ref, true) + } + } + + private checkSpaceTypePermissions (ctx: MeasureContext, cudTx: TxCUD): void { + const account = ctx.contextData.account + const h = this.context.hierarchy + if (account.primarySocialId === core.account.System) return + + if (h.isDerived(cudTx.objectClass, contact.class.PersonSpace)) { + this.throwForbidden() } } - private checkSpacePermissions (ctx: MeasureContext, cudTx: TxCUD, targetSpaceId: Ref): void { + private checkSpacePermissions ( + ctx: MeasureContext, + cudTx: TxCUD, + targetSpaceId: Ref, + isSpace: boolean = false + ): void { if (this.whitelistSpaces.has(targetSpaceId)) { return } // NOTE: move this checking logic later to be defined in some server plugins? // so they can contribute checks into the middleware for their custom permissions? - if (!this.checkPermission(ctx, targetSpaceId as Ref, cudTx)) { + if (!this.checkPermission(ctx, targetSpaceId as Ref, cudTx, isSpace)) { this.throwForbidden() } } } + +function isMixinUpdateTx (tx: Tx): boolean { + return tx._class === core.class.TxMixin && Object.keys((tx as TxMixin).attributes).length > 0 +} + +function isTxClassMatched (tx: Tx, permission: Permission): boolean { + if (permission.txClass === tx._class) return true + if (permission.txMatch === undefined && isMixinUpdateTx(tx)) { + return permission.txClass === core.class.TxUpdateDoc + } + return false +} + +function getTxObjectClass (tx: TxCUD): Ref> { + return tx._class === core.class.TxMixin ? (tx as TxMixin).mixin : tx.objectClass +} diff --git a/packages/middleware/src/spaceSecurity.ts b/packages/middleware/src/spaceSecurity.ts index d0022d4..4c8bd42 100644 --- a/packages/middleware/src/spaceSecurity.ts +++ b/packages/middleware/src/spaceSecurity.ts @@ -484,10 +484,7 @@ export class SpaceSecurityMiddleware extends BaseMiddleware implements Middlewar const space = this.spacesMap.get(tx.objectSpace) if (space === undefined) return undefined - // For all other spaces broadcast to space members + guests that are collaborators for objects with collab security enabled - let collabTargets: AccountUuid[] = [] - const collabSec = getClassCollaborators(this.context.modelDb, this.context.hierarchy, cud.objectClass) - if (collabSec?.provideSecurity === true) { + const getCollabTargets = async (_id: Ref): Promise => { const guests = new Set() for (const val of ctx.contextData.socialStringsToUsers.values()) { if ([AccountRole.Guest, AccountRole.ReadOnlyGuest].includes(val.role)) { @@ -495,11 +492,30 @@ export class SpaceSecurityMiddleware extends BaseMiddleware implements Middlewar } } const collaboratorObjs = (await this.next?.findAll(ctx, core.class.Collaborator, { - attachedTo: cud.objectId + attachedTo: _id })) as Collaborator[] - collabTargets = collaboratorObjs.map((it) => it.collaborator).filter((it) => guests.has(it)) + return collaboratorObjs.map((it) => it.collaborator).filter((it) => guests.has(it)) + } + + // For all other spaces broadcast to space members + // + guests that are collaborators for objects with collab security enabled + // + guests that are collaborators for attached objects with collab security enabled + let collabTargets: AccountUuid[] = [] + const collabSec = getClassCollaborators(this.context.modelDb, this.context.hierarchy, cud.objectClass) + if (collabSec?.provideSecurity === true) { + collabTargets = await getCollabTargets(cud.objectId) + } else if (cud.attachedTo != null && cud.attachedToClass != null) { + const attachedCollabSec = getClassCollaborators( + this.context.modelDb, + this.context.hierarchy, + cud.attachedToClass + ) + if (attachedCollabSec?.provideSecurity === true) { + collabTargets = await getCollabTargets(cud.attachedTo) + } } + const spaceTargets = space.members.length === 0 ? [] : this.getTargets(space?.members) const target = [...collabTargets, ...spaceTargets] @@ -672,7 +688,7 @@ export class SpaceSecurityMiddleware extends BaseMiddleware implements Middlewar findResult.lookupMap ) } - if (!isOwner(account, ctx) && account.role !== AccountRole.DocGuest) { + if (account.role !== AccountRole.DocGuest) { if (options?.lookup !== undefined) { for (const object of findResult) { if (object.$lookup !== undefined) { @@ -721,20 +737,53 @@ export class SpaceSecurityMiddleware extends BaseMiddleware implements Middlewar if (Object.keys(lookup).length === 0) return const account = ctx.contextData.account if (isSystem(account, ctx)) return + const owner = isOwner(account, ctx) + const h = this.context.hierarchy const allowedSpaces = new Set(this.getAllAllowedSpaces(account, true, showArchived)) for (const key in lookup) { const val = lookup[key] if (Array.isArray(val)) { const arr: AttachedDoc[] = [] for (const value of val) { - if (allowedSpaces.has(value.space)) { + const isSpace = '_class' in value && h.isDerived(value._class, core.class.Space) + const availableForOwner = owner && isSpace + const availableSpace = isSpace && allowedSpaces.has(value._id) + const availableDoc = !isSpace && allowedSpaces.has(value.space) + if (availableForOwner || availableSpace || availableDoc) { arr.push(value) } } lookup[key] = arr as any } else if (val !== undefined) { - if (!allowedSpaces.has(val.space)) { - lookup[key] = undefined + const isSpace = '_class' in val && h.isDerived(val._class, core.class.Space) + const availableForOwner = owner && isSpace + const availableSpace = isSpace && allowedSpaces.has(val._id as Ref) + const availableDoc = !isSpace && allowedSpaces.has(val.space) + if (!availableForOwner && !availableSpace && !availableDoc) { + // allow attached lookups for guests when collaborator security is enabled + // do not check if collaborator of the doc because it's being checked on the storage (DB) level + // as otherwise there will be no doc here at all + if (key === 'attachedTo' && ctx.contextData.modelDb?.hierarchy != null) { + const attachedVal = val as AttachedDoc + if (attachedVal.attachedToClass == null) { + lookup[key] = undefined + continue + } + + const collabSec = getClassCollaborators( + ctx.contextData.modelDb, + ctx.contextData.modelDb.hierarchy, + attachedVal.attachedToClass + ) + const collabSecEnabled = + collabSec?.provideSecurity === true && + [AccountRole.Guest, AccountRole.ReadOnlyGuest].includes(account.role) + if (!collabSecEnabled) { + lookup[key] = undefined + } + } else { + lookup[key] = undefined + } } } } diff --git a/packages/middleware/src/versioning.ts b/packages/middleware/src/versioning.ts new file mode 100644 index 0000000..48b45bf --- /dev/null +++ b/packages/middleware/src/versioning.ts @@ -0,0 +1,154 @@ +// +// 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 core, { + type Class, + clone, + type Doc, + type DocumentQuery, + type FindResult, + type MeasureContext, + type Ref, + type SessionData, + SortingOrder, + type Tx, + type TxApplyIf, + type TxCreateDoc, + TxFactory, + TxProcessor, + type VersionableDoc +} from '@hcengineering/core' +import { + BaseMiddleware, + type ServerFindOptions, + type Middleware, + type PipelineContext, + type TxMiddlewareResult +} from '@hcengineering/server-core' + +/** + * @public + */ +export class VersioningMiddleware extends BaseMiddleware implements Middleware { + private constructor (context: PipelineContext, next?: Middleware) { + super(context, next) + } + + static async create ( + ctx: MeasureContext, + context: PipelineContext, + next: Middleware | undefined + ): Promise { + return new VersioningMiddleware(context, next) + } + + override async findAll( + ctx: MeasureContext, + _class: Ref>, + query: DocumentQuery, + options?: ServerFindOptions + ): Promise> { + if ( + this.isVerionableClass(_class) && + query.isLatest === undefined && + query._id === undefined && + query.baseId === undefined + ) { + const newQuery = clone(query) + newQuery.isLatest = true + + const findResult = await this.provideFindAll(ctx, _class, newQuery, options) + + return findResult + } else { + return await this.provideFindAll(ctx, _class, query, options) + } + } + + async tx (ctx: MeasureContext, txes: Tx[]): Promise { + let nestedTxes: Tx[] = [] + for (const tx of txes) { + if (tx._class === core.class.TxCreateDoc) { + const childTxes = await this.setVersionData(ctx, tx as TxCreateDoc) + if (childTxes !== undefined && childTxes.length > 0) { + nestedTxes = nestedTxes.concat(childTxes) + } + } + if (tx._class === core.class.TxApplyIf) { + for (const _tx of (tx as TxApplyIf).txes) { + if (_tx._class === core.class.TxCreateDoc) { + const childTxes = await this.setVersionData(ctx, _tx as TxCreateDoc) + if (childTxes !== undefined && childTxes.length > 0) { + nestedTxes = nestedTxes.concat(childTxes) + } + } + } + } + } + const res = await this.provideTx(ctx, txes) + if (nestedTxes.length > 0) { + await this.provideTx(ctx, nestedTxes) + } + return res + } + + private async setVersionData ( + ctx: MeasureContext, + tx: TxCreateDoc + ): Promise { + const isVersionedClass = this.isVerionableClass(tx.objectClass) + if (!isVersionedClass) return [] + const doc = TxProcessor.createDoc2Doc(tx) + const isNew = doc.baseId === doc._id || doc.baseId === undefined + tx.attributes.isLatest = true + if (isNew) { + tx.attributes.version = 1 + tx.attributes.baseId = tx.objectId + tx.attributes.docCreatedBy = tx.createdBy ?? tx.modifiedBy + } else { + const base = await this.provideFindAll( + ctx, + tx.objectClass, + { baseId: doc.baseId }, + { sort: { version: SortingOrder.Descending } } + ) + const latest = base.find((p) => p.isLatest === true) ?? base[0] + if (latest === undefined) throw new Error('No base object found for the new version') + tx.attributes.version = (latest.version ?? 1) + 1 + tx.attributes.docCreatedBy = latest.docCreatedBy + const txes: Tx[] = [] + const factory = new TxFactory(core.account.System, true) + for (const prev of base) { + if (prev.isLatest === true) { + txes.push( + factory.createTxUpdateDoc(prev._class, prev.space, prev._id, { + isLatest: false, + readonly: true + }) + ) + } + } + return txes + } + } + + private isVerionableClass (_class: Ref>): boolean { + try { + return this.context.hierarchy.classHierarchyMixin(_class, core.mixin.VersionableClass) !== undefined + } catch { + return false + } + } +} diff --git a/packages/minio/package.json b/packages/minio/package.json index 3149fc8..21c7944 100644 --- a/packages/minio/package.json +++ b/packages/minio/package.json @@ -26,16 +26,16 @@ "eslint": "^8.54.0", "@typescript-eslint/parser": "^6.21.0", "eslint-config-standard-with-typescript": "^40.0.0", - "prettier": "^3.1.0", + "prettier": "^3.6.2", "typescript": "^5.9.3", - "@types/node": "^22.15.29", + "@types/node": "^22.18.1", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { - "@hcengineering/core": "^0.7.23", + "@hcengineering/core": "^0.7.24", "@hcengineering/platform": "^0.7.19", "@hcengineering/server-core": "workspace:^0.7.18", "minio": "^8.0.5" diff --git a/packages/mongo/package.json b/packages/mongo/package.json index bf94a1a..416d51f 100644 --- a/packages/mongo/package.json +++ b/packages/mongo/package.json @@ -26,16 +26,16 @@ "eslint": "^8.54.0", "@typescript-eslint/parser": "^6.21.0", "eslint-config-standard-with-typescript": "^40.0.0", - "prettier": "^3.1.0", + "prettier": "^3.6.2", "typescript": "^5.9.3", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", - "@types/node": "^22.15.29", + "@types/node": "^22.18.1", "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { - "@hcengineering/core": "^0.7.23", + "@hcengineering/core": "^0.7.24", "@hcengineering/platform": "^0.7.19", "@hcengineering/server-core": "workspace:^0.7.18", "mongodb": "^6.16.0", diff --git a/packages/mongo/src/__tests__/storage.test.ts b/packages/mongo/src/__tests__/storage.test.ts index 4164ee1..659aa0e 100644 --- a/packages/mongo/src/__tests__/storage.test.ts +++ b/packages/mongo/src/__tests__/storage.test.ts @@ -323,7 +323,78 @@ describe('mongo operations', () => { } ) expect(r.length).toEqual(1) - expect((r[0].$associations?.[association._id][0] as unknown as Task)?._id).toEqual(secondTask) + expect((r[0].$associations?.[association._id + '_b'][0] as unknown as Task)?._id).toEqual(secondTask) + }) + + it('check deep associations', async () => { + const association = await operations.findOne(core.class.Association, {}) + if (association == null) { + throw new Error('Association not found') + } + + const zeroTask = await operations.createDoc(taskPlugin.class.Task, '' as Ref, { + name: 'my-task', + description: 'Descr', + rate: 20 + }) + + const firstTask = await operations.createDoc(taskPlugin.class.Task, '' as Ref, { + name: 'my-task', + description: 'Descr', + rate: 20 + }) + + const secondTask = await operations.createDoc(taskPlugin.class.Task, '' as Ref, { + name: 'my-task2', + description: 'Descr', + rate: 20 + }) + + const secondATask = await operations.createDoc(taskPlugin.class.Task, '' as Ref, { + name: 'my-task22', + description: 'Descr', + rate: 20 + }) + + const thirdTask = await operations.createDoc(taskPlugin.class.Task, '' as Ref, { + name: 'my-task3', + description: 'Descr', + rate: 20 + }) + + await operations.createDoc(core.class.Relation, '' as Ref, { + docA: firstTask, + docB: secondTask, + association: association._id + }) + + await operations.createDoc(core.class.Relation, '' as Ref, { + docA: firstTask, + docB: secondATask, + association: association._id + }) + + await operations.createDoc(core.class.Relation, '' as Ref, { + docA: secondTask, + docB: thirdTask, + association: association._id + }) + + const r = await client.findAll( + taskPlugin.class.Task, + { _id: { $in: [zeroTask, firstTask] } }, + { + associations: [[association._id, 1, [[association._id, 1]]]] + } + ) + expect(r.length).toEqual(2) + expect(r[1].$associations?.[`${association._id}_b`]).toHaveLength(2) + expect((r[1].$associations?.[`${association._id}_b`][0] as unknown as Task)?._id).toEqual(secondTask) + expect(r[1].$associations?.[`${association._id}_b`][1]?.$associations?.[`${association._id}_b`]).toHaveLength(0) + expect( + (r[1].$associations?.[`${association._id}_b`][0]?.$associations?.[`${association._id}_b`][0] as unknown as Task) + ?._id + ).toEqual(thirdTask) }) // Run shared integration tests diff --git a/packages/mongo/src/storage.ts b/packages/mongo/src/storage.ts index 5e67a68..4c8b851 100644 --- a/packages/mongo/src/storage.ts +++ b/packages/mongo/src/storage.ts @@ -467,19 +467,21 @@ abstract class MongoAdapterBase implements DbAdapter { return result } - private getAssociations (associations: AssociationQuery[]): LookupStep[] { + private getAssociations (associations: AssociationQuery[], parentId: string = ''): LookupStep[] { const res: LookupStep[] = [] for (const association of associations) { - const assoc = this.modelDb.findObject(association[0]) + const _id = association[0] + const assoc = this.modelDb.findObject(_id) if (assoc === undefined) continue const isReverse = association[1] === -1 const _class = !isReverse ? assoc.classB : assoc.classA + const fullId = _id + (isReverse ? '_a' : '_b') const targetDomain = this.hierarchy.getDomain(_class) if (targetDomain === DOMAIN_MODEL) continue - const as = association[0] + '_hidden_association' + const as = parentId + fullId + '_hidden_association' res.push({ from: DOMAIN_RELATION, - localField: '_id', + localField: `${parentId !== '' ? parentId + '.' : ''}_id`, foreignField: isReverse ? 'docB' : 'docA', as }) @@ -487,8 +489,11 @@ abstract class MongoAdapterBase implements DbAdapter { from: targetDomain, localField: as + '.' + (isReverse ? 'docA' : 'docB'), foreignField: '_id', - as: association[0] + '_association' + as: parentId + fullId + '_association' }) + if (association[2] !== undefined) { + res.push(...this.getAssociations(association[2], parentId + fullId + '_association')) + } } return res } @@ -518,19 +523,36 @@ abstract class MongoAdapterBase implements DbAdapter { } } - private fillAssociationsValue (associations: AssociationQuery[], object: any): Record { + private fillAssociationsValue ( + source: any, + associations: AssociationQuery[], + parentKey: string, + targetId: Ref + ): Record { const res: Record = {} for (const association of associations) { - const assocKey = association[0] + '_hidden_association' - const data = object[assocKey] + const _id = association[0] + const isReverse = association[1] === -1 + // const key = _id + (isReverse ? '.a' : '.b') + const fullId = _id + (isReverse ? '_a' : '_b') + const assocKey = parentKey + fullId + '_hidden_association' + const data = source[assocKey] if (data !== undefined && Array.isArray(data)) { const filtered = new Set( - data.filter((it) => it.association === association[0]).map((it) => (association[1] === 1 ? it.docB : it.docA)) + data + .filter((it) => it.association === _id && (isReverse ? it.docB : it.docA) === targetId) + .map((it) => (!isReverse ? it.docB : it.docA)) ) - const fullKey = association[0] + '_association' - const arr = object[fullKey] + const fullKey = parentKey + fullId + '_association' + const arr = source[fullKey] as WithLookup[] if (arr !== undefined && Array.isArray(arr)) { - res[association[0]] = arr.filter((it) => filtered.has(it._id)) + const objects = arr.filter((it) => filtered.has(it._id)) + if (association[2] !== undefined) { + for (const obj of objects) { + this.fillAssociations(obj, association[2], fullKey, source) + } + } + res[fullId] = objects } } } @@ -718,10 +740,7 @@ abstract class MongoAdapterBase implements DbAdapter { } } if (options.associations !== undefined && options.associations.length > 0) { - row.$associations = this.fillAssociationsValue(options.associations, row) - for (const [, v] of Object.entries(row.$associations)) { - this.stripHash(v) - } + this.fillAssociations(row, options.associations) } this.clearExtraLookups(row) } @@ -756,6 +775,19 @@ abstract class MongoAdapterBase implements DbAdapter { return toFindResult(this.stripHash(result) as T[], total) } + private fillAssociations( + obj: WithLookup, + associations: AssociationQuery[], + parentId: string = '', + source?: Doc + ): WithLookup { + obj.$associations = this.fillAssociationsValue(source ?? obj, associations, parentId, obj._id) + for (const [, v] of Object.entries(obj.$associations)) { + this.stripHash(v) + } + return obj + } + private translateKey( key: string, clazz: Ref>, diff --git a/packages/postgres/package.json b/packages/postgres/package.json index 90e7348..30d22e4 100644 --- a/packages/postgres/package.json +++ b/packages/postgres/package.json @@ -26,17 +26,17 @@ "eslint": "^8.54.0", "@typescript-eslint/parser": "^6.21.0", "eslint-config-standard-with-typescript": "^40.0.0", - "prettier": "^3.1.0", + "prettier": "^3.6.2", "typescript": "^5.9.3", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", - "@types/node": "^22.15.29", + "@types/node": "^22.18.1", "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { "postgres": "^3.4.7", - "@hcengineering/core": "^0.7.23", + "@hcengineering/core": "^0.7.24", "@hcengineering/platform": "^0.7.19", "@hcengineering/server-core": "workspace:^0.7.18", "@hcengineering/postgres-base": "^0.7.17" diff --git a/packages/postgres/src/__tests__/storage.test.ts b/packages/postgres/src/__tests__/storage.test.ts index c41e056..3d0287c 100644 --- a/packages/postgres/src/__tests__/storage.test.ts +++ b/packages/postgres/src/__tests__/storage.test.ts @@ -385,6 +385,57 @@ describe('postgres operations', () => { } ) expect(r.length).toEqual(1) - expect((r[0].$associations?.[association._id][0] as unknown as Task)?._id).toEqual(secondTask) + expect((r[0].$associations?.[association._id + '_b'][0] as unknown as Task)?._id).toEqual(secondTask) + }) + + it('check deep associations', async () => { + const association = await operations.findOne(core.class.Association, {}) + if (association == null) { + throw new Error('Association not found') + } + + const firstTask = await operations.createDoc(taskPlugin.class.Task, '' as Ref, { + name: 'my-task', + description: 'Descr', + rate: 20 + }) + + const secondTask = await operations.createDoc(taskPlugin.class.Task, '' as Ref, { + name: 'my-task2', + description: 'Descr', + rate: 20 + }) + + const thirdTask = await operations.createDoc(taskPlugin.class.Task, '' as Ref, { + name: 'my-task2', + description: 'Descr', + rate: 20 + }) + + await operations.createDoc(core.class.Relation, '' as Ref, { + docA: firstTask, + docB: secondTask, + association: association._id + }) + + await operations.createDoc(core.class.Relation, '' as Ref, { + docA: secondTask, + docB: thirdTask, + association: association._id + }) + + const r = await client.findAll( + taskPlugin.class.Task, + { _id: firstTask }, + { + associations: [[association._id, 1, [[association._id, 1]]]] + } + ) + expect(r.length).toEqual(1) + expect((r[0].$associations?.[`${association._id}_b`][0] as unknown as Task)?._id).toEqual(secondTask) + expect( + (r[0].$associations?.[`${association._id}_b`][0]?.$associations?.[`${association._id}_b`][0] as unknown as Task) + ?._id + ).toEqual(thirdTask) }) }) diff --git a/packages/postgres/src/storage.ts b/packages/postgres/src/storage.ts index 6d18ae6..c2fec29 100644 --- a/packages/postgres/src/storage.ts +++ b/packages/postgres/src/storage.ts @@ -100,7 +100,6 @@ import { DBCollectionHelper, type DBDoc, escape, - filterProjection, inferType, isDataField, isOwner, @@ -109,7 +108,8 @@ import { parseDoc, parseDocWithProjection, parseUpdate, - simpleEscape + simpleEscape, + toWithLookup } from './utils' async function * createCursorGenerator ( client: postgres.Sql, @@ -296,7 +296,7 @@ abstract class PostgresAdapterBase implements DbAdapter { async rawFindAll(_domain: Domain, query: DocumentQuery, options?: FindOptions): Promise { const domain = translateDomain(_domain) const vars = new ValuesVariables() - const select = `SELECT ${this.getProjection(vars, domain, options?.projection, [], options?.associations)} FROM ${domain}` + const select = `SELECT ${this.getProjection(vars, domain, options?.projection, [])} FROM ${domain}` const sqlChunks: string[] = [] sqlChunks.push(`WHERE ${this.buildRawQuery(vars, domain, query, options)}`) if (options?.sort !== undefined) { @@ -472,7 +472,7 @@ abstract class PostgresAdapterBase implements DbAdapter { const projection = this.localizeProjection(_class, options?.projection ?? undefined) - const select = `SELECT ${this.getProjection(vars, domain, projection, joins, options?.associations)} FROM ${domain}` + const select = `SELECT ${this.getProjection(vars, domain, projection, joins)} FROM ${domain}` if (joins.length > 0) { sqlChunks.push(this.buildJoinString(vars, joins)) @@ -554,7 +554,7 @@ abstract class PostgresAdapterBase implements DbAdapter { total ) } else { - const res = this.parseLookup(result, joins, projection, domain) + const res = await this.parseLookup(ctx, result, joins, projection, options.associations, domain) return toFindResult(res, total) } })) as FindResult @@ -638,153 +638,208 @@ abstract class PostgresAdapterBase implements DbAdapter { const res = `EXISTS (SELECT 1 FROM ${translateDomain(DOMAIN_SPACE)} sec WHERE sec._id = ${domain}.${key} AND sec."workspaceId" = ${vars.add(this.workspaceId, '::uuid')} AND ${q})` const collabSec = getClassCollaborators(this.modelDb, this.hierarchy, _class) - if (collabSec?.provideSecurity === true && [AccountRole.Guest, AccountRole.ReadOnlyGuest].includes(acc.role)) { - const collab = `OR EXISTS (SELECT 1 FROM ${translateDomain(DOMAIN_COLLABORATOR)} collab_sec WHERE collab_sec."workspaceId" = ${vars.add(this.workspaceId, '::uuid')} AND collab_sec."attachedTo" = ${domain}._id AND collab_sec.collaborator = '${acc.uuid}')` - return `AND (${res} ${collab})` + let collabRes = '' + if ([AccountRole.Guest, AccountRole.ReadOnlyGuest].includes(acc.role)) { + if (collabSec?.provideSecurity === true) { + collabRes += ` OR EXISTS (SELECT 1 FROM ${translateDomain(DOMAIN_COLLABORATOR)} collab_sec WHERE collab_sec."workspaceId" = ${vars.add(this.workspaceId, '::uuid')} AND collab_sec."attachedTo" = ${domain}._id AND collab_sec.collaborator = '${acc.uuid}')` + } + if (collabSec?.provideAttachedSecurity === true) { + collabRes += ` OR EXISTS (SELECT 1 FROM ${translateDomain(DOMAIN_COLLABORATOR)} collab_sec WHERE collab_sec."workspaceId" = ${vars.add(this.workspaceId, '::uuid')} AND collab_sec."attachedTo" = ${domain}."attachedTo" AND collab_sec.collaborator = '${acc.uuid}')` + } } - return `AND (${res})` + return `AND (${res}${collabRes})` } } } - private parseLookup( + private async parseLookup( + ctx: MeasureContext, rows: any[], joins: JoinProps[], projection: Projection | undefined, + associations: AssociationQuery[] | undefined, domain: string - ): WithLookup[] { + ): Promise[]> { const map = new Map, WithLookup>() + const modelJoins: JoinProps[] = [] const reverseJoins: JoinProps[] = [] const simpleJoins: JoinProps[] = [] + for (const join of joins) { - if (join.table === DOMAIN_MODEL) { - modelJoins.push(join) - } else if (join.isReverse) { - reverseJoins.push(join) - } else if (join.path !== '') { - simpleJoins.push(join) - } + if (join.table === DOMAIN_MODEL) modelJoins.push(join) + else if (join.isReverse) reverseJoins.push(join) + else if (join.path !== '') simpleJoins.push(join) } - for (const row of rows) { - /* eslint-disable @typescript-eslint/consistent-type-assertions */ - let doc: WithLookup = map.get(row._id) ?? ({ _id: row._id, $lookup: {}, $associations: {} } as WithLookup) - const associations: Record = doc.$associations as Record - const lookup: Record = doc.$lookup as Record - let joinIndex: number | undefined - let skip = false - try { - const schema = getSchema(domain) - for (const column in row) { - if (column.startsWith('reverse_lookup_')) { - if (row[column] != null) { - const join = reverseJoins.find((j) => j.toAlias.toLowerCase() === column) - if (join === undefined) { - continue - } - const res = this.getLookupValue(join.path, lookup, false) - if (res === undefined) continue - const { obj, key } = res - - const parsed = row[column].map((p: any) => parseDoc(p, schema)) - obj[key] = parsed - } - } else if (column.startsWith('lookup_')) { - const keys = column.split('_') - let key = keys[keys.length - 1] - if (keys[keys.length - 2] === '') { - key = '_' + key - } - - if (key === 'workspaceId') { - continue - } - if (key === '_id') { - joinIndex = joinIndex === undefined ? 0 : ++joinIndex - if (row[column] === null) { - skip = true - continue - } - skip = false - } + for (const row of rows) { + const doc = toWithLookup(parseDoc(row, getSchema(row._class))) - if (skip) { - continue - } + const lookup = doc.$lookup as Record - const join = simpleJoins[joinIndex ?? 0] - if (join === undefined) { - continue - } - const res = this.getLookupValue(join.path, lookup) - if (res === undefined) continue - const { obj, key: p } = res + this.parseLookupColumns(row, simpleJoins, reverseJoins, lookup, domain) - if (key === 'data') { - obj[p] = { ...obj[p], ...row[column] } - } else { - if (key === 'createdOn' || key === 'modifiedOn') { - const val = Number.parseInt(row[column]) - obj[p][key] = Number.isNaN(val) ? null : val - } else if (key === '%hash%') { - continue - } else if (key === 'attachedTo' && row[column] === 'NULL') { - continue - } else { - obj[p][key] = row[column] === 'NULL' ? null : row[column] - } - } - } else if (column.startsWith('assoc_')) { - if (row[column] == null) continue - const keys = column.split('_') - const key = keys[keys.length - 1] - const associationDomain = keys[1] - const associationSchema = getSchema(associationDomain) - const parsed = row[column].map((p: any) => parseDoc(p, associationSchema)) - associations[key] = parsed - } else { - joinIndex = undefined - if (!map.has(row._id)) { - if (column === 'workspaceId') { - continue - } - if (column === 'data') { - let data = row[column] - data = filterProjection(data, projection) - doc = { ...doc, ...data } - } else { - if (column === 'createdOn' || column === 'modifiedOn') { - const val = Number.parseInt(row[column]) - ;(doc as any)[column] = Number.isNaN(val) ? null : val - } else if (column === '%hash%') { - // Ignore - } else { - ;(doc as any)[column] = row[column] === 'NULL' ? null : row[column] - } - } - } - } - } - } catch (err) { - console.log(err) - throw err - } for (const modelJoin of modelJoins) { const res = this.getLookupValue(modelJoin.path, lookup) if (res === undefined) continue + const { obj, key } = res const val = this.getModelLookupValue(doc, modelJoin, [...simpleJoins, ...modelJoins]) + if (val !== undefined && modelJoin.toClass !== undefined) { - const res = this.modelDb.findAllSync(modelJoin.toClass, { + const res2 = this.modelDb.findAllSync(modelJoin.toClass, { [modelJoin.toField]: val }) - obj[key] = modelJoin.isReverse ? res : res[0] + obj[key] = modelJoin.isReverse ? res2 : res2[0] } } + map.set(row._id, doc) } - return Array.from(map.values()) + + if (associations !== undefined && map.size > 0) { + await this.fetchAssociations(ctx, map, associations) + } + + return [...map.values()] + } + + async fetchAssociations ( + ctx: MeasureContext, + parentMap: Map>, + associations: AssociationQuery[] + ): Promise { + for (const association of associations) { + const [assocId, dir, nested] = association + const isReverse = dir === -1 + const keyA = isReverse ? 'docB' : 'docA' + const keyB = isReverse ? 'docA' : 'docB' + + const assoc = this.modelDb.findObject(assocId) + if (assoc === undefined) { + continue + } + const _class = isReverse ? assoc.classA : assoc.classB + const domain = this.hierarchy.findDomain(_class) + if (domain === undefined) continue + const tagetDomain = translateDomain(domain) + + const vars = new ValuesVariables() + + const wsId = vars.add(this.workspaceId, '::uuid') + const parentIds = vars.add(Array.from(parentMap.keys()), '::text[]') + const assocIdVar = vars.add(assocId) + + const rows = await this.mgr.retry(ctx.id, this.mgrId, async (connection) => { + return await connection.execute( + ` + SELECT assoc.*, r."${keyA}" as parent_id + FROM ${tagetDomain} AS assoc + JOIN ${translateDomain(DOMAIN_RELATION)} AS r + ON r."${keyB}" = assoc."_id" + WHERE r."${keyA}" = ANY(${parentIds}) + AND r.association = ${assocIdVar} + AND r."workspaceId" = ${wsId} + AND assoc."workspaceId" = ${wsId} + `, + vars.getValues() + ) + }) + + const key = `${assocId}_${!isReverse ? 'b' : 'a'}` + + const nextParentMap = new Map>() + for (const row of rows) { + const parentId = row.parent_id + const parsed = nextParentMap.get(row._id) ?? parseDoc(row, getSchema(row._class)) + + const parent = parentMap.get(parentId) + if (parent === undefined) continue + + if (parent.$associations === undefined) { + parent.$associations = {} + } + + if (parent.$associations[key] === undefined) parent.$associations[key] = [] + parent.$associations[key].push(parsed) + if (!nextParentMap.has(parsed._id)) { + nextParentMap.set(parsed._id, parsed) + } + } + + if (nested !== undefined && nested.length > 0 && nextParentMap.size > 0) { + await this.fetchAssociations(ctx, nextParentMap, nested) + } + } + } + + private parseLookupColumns ( + row: any, + simpleJoins: JoinProps[], + reverseJoins: JoinProps[], + lookup: Record, + domain: string + ): void { + const schema = getSchema(domain) + let joinIndex: number | undefined + let skip = false + + for (const column in row) { + if (column.startsWith('reverse_lookup_')) { + const join = reverseJoins.find((j) => j.toAlias.toLowerCase() === column) + if (join === undefined || row[column] == null) continue + + const parsed = row[column].map((p: any) => parseDoc(p, schema)) + + const res = this.getLookupValue(join.path, lookup, false) + if (res === undefined) continue + const { obj, key } = res + obj[key] = parsed + + continue + } + + if (column.startsWith('lookup_')) { + const keys = column.split('_') + let key = keys[keys.length - 1] + if (keys[keys.length - 2] === '') { + key = '_' + key + } + + if (key === 'workspaceId') continue + + if (key === '_id') { + joinIndex = joinIndex === undefined ? 0 : joinIndex + 1 + if (row[column] == null) { + skip = true + continue + } + skip = false + } + + if (skip) continue + + const join = simpleJoins[joinIndex ?? 0] + if (join === undefined) continue + + const res = this.getLookupValue(join.path, lookup) + if (res === undefined) continue + const { obj, key: p } = res + + if (key === 'data') { + obj[p] = { ...obj[p], ...row[column] } + } else if (key === 'createdOn' || key === 'modifiedOn') { + const val = parseInt(row[column]) + obj[p][key] = Number.isNaN(val) ? null : val + } else if (key === '%hash%') { + // ignore + } else if (key === 'attachedTo' && row[column] === 'NULL') { + // ignore + } else { + obj[p][key] = row[column] === 'NULL' ? null : row[column] + } + } + } } private getLookupValue ( @@ -1399,36 +1454,6 @@ abstract class PostgresAdapterBase implements DbAdapter { return res } - getAssociationsProjections (vars: ValuesVariables, baseDomain: string, associations: AssociationQuery[]): string[] { - const res: string[] = [] - for (const association of associations) { - const _id = escape(association[0]) - const assoc = this.modelDb.findObject(_id) - if (assoc === undefined) { - continue - } - const isReverse = association[1] === -1 - const _class = isReverse ? assoc.classA : assoc.classB - const domain = this.hierarchy.findDomain(_class) - if (domain === undefined) continue - const tagetDomain = translateDomain(domain) - const keyA = isReverse ? 'docB' : 'docA' - const keyB = isReverse ? 'docA' : 'docB' - const wsId = vars.add(this.workspaceId, '::uuid') - res.push( - `(SELECT jsonb_agg(assoc.*) - FROM ${tagetDomain} AS assoc - JOIN ${translateDomain(DOMAIN_RELATION)} as relation - ON relation."${keyB}" = assoc."_id" - AND relation."workspaceId" = ${wsId} - WHERE relation."${keyA}" = ${translateDomain(baseDomain)}."_id" - AND relation.association = '${_id}' - AND assoc."workspaceId" = ${wsId}) AS assoc_${tagetDomain}_${_id}` - ) - } - return res - } - @withContext('get-domain-hash') async getDomainHash (ctx: MeasureContext, domain: Domain): Promise { return await calcHashHash(ctx, domain, this) @@ -1442,10 +1467,9 @@ abstract class PostgresAdapterBase implements DbAdapter { vars: ValuesVariables, baseDomain: string, projection: Projection | undefined, - joins: JoinProps[], - associations: AssociationQuery[] | undefined + joins: JoinProps[] ): string | '*' { - if (projection === undefined && joins.length === 0 && associations === undefined) return `${baseDomain}.*` + if (projection === undefined && joins.length === 0) return `${baseDomain}.*` const res: string[] = [] let dataAdded = false if (projection === undefined) { @@ -1472,9 +1496,6 @@ abstract class PostgresAdapterBase implements DbAdapter { for (const join of joins) { res.push(...this.getProjectionsAliases(vars, join)) } - if (associations !== undefined) { - res.push(...this.getAssociationsProjections(vars, baseDomain, associations)) - } return res.join(', ') } diff --git a/packages/postgres/src/utils.ts b/packages/postgres/src/utils.ts index 91073f3..469904e 100644 --- a/packages/postgres/src/utils.ts +++ b/packages/postgres/src/utils.ts @@ -28,6 +28,7 @@ import core, { type Projection, type Ref, systemAccountUuid, + type WithLookup, type WorkspaceUuid } from '@hcengineering/core' import { type DomainHelperOperations } from '@hcengineering/server-core' @@ -473,6 +474,17 @@ export function parseDocWithProjection ( return res } +export function toWithLookup (doc: T): WithLookup { + const res = doc as WithLookup + if (res.$associations === undefined) { + res.$associations = {} + } + if (res.$lookup === undefined) { + res.$lookup = {} + } + return res +} + export function parseDoc (doc: DBDoc, schema: Schema): T { const { workspaceId, data, ...rest } = doc for (const key in rest) { diff --git a/packages/s3/package.json b/packages/s3/package.json index c5c5ebb..111c055 100644 --- a/packages/s3/package.json +++ b/packages/s3/package.json @@ -26,16 +26,16 @@ "eslint": "^8.54.0", "@typescript-eslint/parser": "^6.21.0", "eslint-config-standard-with-typescript": "^40.0.0", - "prettier": "^3.1.0", + "prettier": "^3.6.2", "typescript": "^5.9.3", - "@types/node": "^22.15.29", + "@types/node": "^22.18.1", "jest": "^29.7.0", "ts-jest": "^29.1.1", "@types/jest": "^29.5.5", "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { - "@hcengineering/core": "^0.7.23", + "@hcengineering/core": "^0.7.24", "@hcengineering/platform": "^0.7.19", "@hcengineering/server-core": "workspace:^0.7.18", "@hcengineering/storage": "^0.7.17", diff --git a/packages/server-storage/package.json b/packages/server-storage/package.json index 20d5d6e..5c56c01 100644 --- a/packages/server-storage/package.json +++ b/packages/server-storage/package.json @@ -39,16 +39,16 @@ "devDependencies": { "cross-env": "~7.0.3", "@hcengineering/platform-rig": "^0.7.19", - "@types/node": "^22.15.29", + "@types/node": "^22.18.1", "@typescript-eslint/eslint-plugin": "^6.21.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", "eslint-plugin-n": "^15.4.0", "eslint": "^8.54.0", - "ts-node": "^10.8.0", + "ts-node": "^10.9.2", "@typescript-eslint/parser": "^6.21.0", "eslint-config-standard-with-typescript": "^40.0.0", - "prettier": "^3.1.0", + "prettier": "^3.6.2", "typescript": "^5.9.3", "jest": "^29.7.0", "ts-jest": "^29.1.1", @@ -56,7 +56,7 @@ "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { - "@hcengineering/core": "^0.7.23", + "@hcengineering/core": "^0.7.24", "@hcengineering/platform": "^0.7.19", "@hcengineering/server-core": "workspace:^0.7.18", "@hcengineering/minio": "workspace:^0.7.17", diff --git a/packages/server/package.json b/packages/server/package.json index 21eeca3..205eaac 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -20,7 +20,7 @@ "devDependencies": { "cross-env": "~7.0.3", "@hcengineering/platform-rig": "^0.7.19", - "@types/node": "^22.15.29", + "@types/node": "^22.18.1", "@typescript-eslint/eslint-plugin": "^6.21.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-promise": "^6.1.1", @@ -28,7 +28,7 @@ "eslint": "^8.54.0", "@typescript-eslint/parser": "^6.21.0", "eslint-config-standard-with-typescript": "^40.0.0", - "prettier": "^3.1.0", + "prettier": "^3.6.2", "typescript": "^5.9.3", "jest": "^29.7.0", "ts-jest": "^29.1.1", @@ -36,9 +36,9 @@ "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { - "@hcengineering/account-client": "^0.7.20", + "@hcengineering/account-client": "^0.7.21", "@hcengineering/analytics": "^0.7.17", - "@hcengineering/core": "^0.7.23", + "@hcengineering/core": "^0.7.24", "@hcengineering/platform": "^0.7.19", "@hcengineering/rpc": "^0.7.17", "@hcengineering/server-core": "workspace:^0.7.18", From 61f66b5117df3efa7569a0f534ead898dd1bc9f2 Mon Sep 17 00:00:00 2001 From: Artem Savchenko Date: Sun, 22 Feb 2026 14:32:30 +0700 Subject: [PATCH 2/3] Update and increment versions Signed-off-by: Artem Savchenko --- common/config/rush/pnpm-lock.yaml | 350 +++++++++++++-------------- common/scripts/package.json | 2 +- packages/client/package.json | 16 +- packages/collaboration/package.json | 10 +- packages/core/package.json | 16 +- packages/datalake/package.json | 10 +- packages/elastic/package.json | 10 +- packages/hulylake/package.json | 12 +- packages/kafka/package.json | 10 +- packages/middleware/package.json | 12 +- packages/minio/package.json | 8 +- packages/mongo/package.json | 8 +- packages/postgres/package.json | 10 +- packages/s3/package.json | 10 +- packages/server-storage/package.json | 22 +- packages/server/package.json | 16 +- 16 files changed, 254 insertions(+), 268 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 258810b..6aa4c2b 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -13,26 +13,26 @@ importers: ../../packages/client: dependencies: '@hcengineering/account-client': - specifier: ^0.7.21 + specifier: ^0.7.25 version: 0.7.25 '@hcengineering/client': - specifier: ^0.7.18 - version: 0.7.18 + specifier: ^0.7.19 + version: 0.7.19 '@hcengineering/client-resources': - specifier: ^0.7.18 - version: 0.7.18 + specifier: ^0.7.19 + version: 0.7.19 '@hcengineering/core': - specifier: ^0.7.24 + specifier: ^0.7.26 version: 0.7.26 '@hcengineering/platform': - specifier: ^0.7.19 - version: 0.7.19 + specifier: ^0.7.20 + version: 0.7.20 '@hcengineering/server-core': - specifier: workspace:^0.7.18 + specifier: workspace:^0.7.19 version: link:../core '@hcengineering/server-token': - specifier: ^0.7.17 - version: 0.7.17 + specifier: ^0.7.18 + version: 0.7.18 ws: specifier: ^8.18.2 version: 8.18.3(utf-8-validate@6.0.5) @@ -92,17 +92,17 @@ importers: ../../packages/collaboration: dependencies: '@hcengineering/core': - specifier: ^0.7.24 + specifier: ^0.7.26 version: 0.7.26 '@hcengineering/server-core': - specifier: workspace:^0.7.18 + specifier: workspace:^0.7.19 version: link:../core '@hcengineering/text': - specifier: ^0.7.18 - version: 0.7.18(prosemirror-inputrules@1.5.1)(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3) + specifier: ^0.7.19 + version: 0.7.19(prosemirror-inputrules@1.5.1)(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3) '@hcengineering/text-ydoc': - specifier: ^0.7.18 - version: 0.7.18(prosemirror-inputrules@1.5.1)(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3) + specifier: ^0.7.19 + version: 0.7.19(prosemirror-inputrules@1.5.1)(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3) base64-js: specifier: ^1.5.1 version: 1.5.1 @@ -159,26 +159,26 @@ importers: ../../packages/core: dependencies: '@hcengineering/analytics': - specifier: ^0.7.17 - version: 0.7.17 + specifier: ^0.7.19 + version: 0.7.19 '@hcengineering/core': - specifier: ^0.7.24 + specifier: ^0.7.26 version: 0.7.26 '@hcengineering/platform': - specifier: ^0.7.19 - version: 0.7.19 + specifier: ^0.7.20 + version: 0.7.20 '@hcengineering/query': - specifier: ^0.7.17 - version: 0.7.17 + specifier: ^0.7.18 + version: 0.7.18 '@hcengineering/rpc': - specifier: ^0.7.17 - version: 0.7.17 + specifier: ^0.7.18 + version: 0.7.18 '@hcengineering/server-token': - specifier: ^0.7.17 - version: 0.7.17 + specifier: ^0.7.18 + version: 0.7.18 '@hcengineering/storage': - specifier: ^0.7.17 - version: 0.7.17 + specifier: ^0.7.18 + version: 0.7.18 fast-equals: specifier: ^5.2.2 version: 5.3.2 @@ -238,17 +238,17 @@ importers: ../../packages/datalake: dependencies: '@hcengineering/core': - specifier: ^0.7.24 + specifier: ^0.7.26 version: 0.7.26 '@hcengineering/platform': - specifier: ^0.7.19 - version: 0.7.19 + specifier: ^0.7.20 + version: 0.7.20 '@hcengineering/server-core': - specifier: workspace:^0.7.18 + specifier: workspace:^0.7.19 version: link:../core '@hcengineering/server-token': - specifier: ^0.7.17 - version: 0.7.17 + specifier: ^0.7.18 + version: 0.7.18 devDependencies: '@hcengineering/platform-rig': specifier: ^0.7.19 @@ -305,16 +305,16 @@ importers: specifier: ^7.17.14 version: 7.17.14 '@hcengineering/analytics': - specifier: ^0.7.17 - version: 0.7.17 + specifier: ^0.7.19 + version: 0.7.19 '@hcengineering/core': - specifier: ^0.7.24 + specifier: ^0.7.26 version: 0.7.26 '@hcengineering/platform': - specifier: ^0.7.19 - version: 0.7.19 + specifier: ^0.7.20 + version: 0.7.20 '@hcengineering/server-core': - specifier: workspace:^0.7.18 + specifier: workspace:^0.7.19 version: link:../core devDependencies: '@hcengineering/platform-rig': @@ -366,20 +366,20 @@ importers: ../../packages/hulylake: dependencies: '@hcengineering/core': - specifier: ^0.7.24 + specifier: ^0.7.26 version: 0.7.26 '@hcengineering/hulylake-client': - specifier: ^0.7.17 - version: 0.7.17 + specifier: ^0.7.18 + version: 0.7.18 '@hcengineering/platform': - specifier: ^0.7.19 - version: 0.7.19 + specifier: ^0.7.20 + version: 0.7.20 '@hcengineering/server-core': - specifier: workspace:^0.7.18 + specifier: workspace:^0.7.19 version: link:../core '@hcengineering/server-token': - specifier: ^0.7.17 - version: 0.7.17 + specifier: ^0.7.18 + version: 0.7.18 devDependencies: '@hcengineering/platform-rig': specifier: ^0.7.19 @@ -433,17 +433,17 @@ importers: ../../packages/kafka: dependencies: '@hcengineering/core': - specifier: ^0.7.24 + specifier: ^0.7.26 version: 0.7.26 '@hcengineering/platform': - specifier: ^0.7.19 - version: 0.7.19 + specifier: ^0.7.20 + version: 0.7.20 '@hcengineering/server-core': - specifier: workspace:^0.7.18 + specifier: workspace:^0.7.19 version: link:../core '@hcengineering/storage': - specifier: ^0.7.17 - version: 0.7.17 + specifier: ^0.7.18 + version: 0.7.18 kafkajs: specifier: ^2.2.4 version: 2.2.4 @@ -497,22 +497,22 @@ importers: ../../packages/middleware: dependencies: '@hcengineering/analytics': - specifier: ^0.7.17 - version: 0.7.17 + specifier: ^0.7.19 + version: 0.7.19 '@hcengineering/contact': specifier: ^0.7.0 version: 0.7.0 '@hcengineering/core': - specifier: ^0.7.24 + specifier: ^0.7.26 version: 0.7.26 '@hcengineering/platform': - specifier: ^0.7.19 - version: 0.7.19 + specifier: ^0.7.20 + version: 0.7.20 '@hcengineering/query': - specifier: ^0.7.17 - version: 0.7.17 + specifier: ^0.7.18 + version: 0.7.18 '@hcengineering/server-core': - specifier: workspace:^0.7.18 + specifier: workspace:^0.7.19 version: link:../core fast-equals: specifier: ^5.2.2 @@ -567,13 +567,13 @@ importers: ../../packages/minio: dependencies: '@hcengineering/core': - specifier: ^0.7.24 + specifier: ^0.7.26 version: 0.7.26 '@hcengineering/platform': - specifier: ^0.7.19 - version: 0.7.19 + specifier: ^0.7.20 + version: 0.7.20 '@hcengineering/server-core': - specifier: workspace:^0.7.18 + specifier: workspace:^0.7.19 version: link:../core minio: specifier: ^8.0.5 @@ -628,13 +628,13 @@ importers: ../../packages/mongo: dependencies: '@hcengineering/core': - specifier: ^0.7.24 + specifier: ^0.7.26 version: 0.7.26 '@hcengineering/platform': - specifier: ^0.7.19 - version: 0.7.19 + specifier: ^0.7.20 + version: 0.7.20 '@hcengineering/server-core': - specifier: workspace:^0.7.18 + specifier: workspace:^0.7.19 version: link:../core bson: specifier: ^6.10.3 @@ -692,16 +692,16 @@ importers: ../../packages/postgres: dependencies: '@hcengineering/core': - specifier: ^0.7.24 + specifier: ^0.7.26 version: 0.7.26 '@hcengineering/platform': - specifier: ^0.7.19 - version: 0.7.19 + specifier: ^0.7.20 + version: 0.7.20 '@hcengineering/postgres-base': - specifier: ^0.7.17 - version: 0.7.17 + specifier: ^0.7.18 + version: 0.7.18 '@hcengineering/server-core': - specifier: workspace:^0.7.18 + specifier: workspace:^0.7.19 version: link:../core postgres: specifier: ^3.4.7 @@ -765,17 +765,17 @@ importers: specifier: ^3.738.0 version: 3.925.0 '@hcengineering/core': - specifier: ^0.7.24 + specifier: ^0.7.26 version: 0.7.26 '@hcengineering/platform': - specifier: ^0.7.19 - version: 0.7.19 + specifier: ^0.7.20 + version: 0.7.20 '@hcengineering/server-core': - specifier: workspace:^0.7.18 + specifier: workspace:^0.7.19 version: link:../core '@hcengineering/storage': - specifier: ^0.7.17 - version: 0.7.17 + specifier: ^0.7.18 + version: 0.7.18 '@smithy/node-http-handler': specifier: ^4.0.2 version: 4.4.4 @@ -829,26 +829,26 @@ importers: ../../packages/server: dependencies: '@hcengineering/account-client': - specifier: ^0.7.21 + specifier: ^0.7.25 version: 0.7.25 '@hcengineering/analytics': - specifier: ^0.7.17 - version: 0.7.17 + specifier: ^0.7.19 + version: 0.7.19 '@hcengineering/core': - specifier: ^0.7.24 + specifier: ^0.7.26 version: 0.7.26 '@hcengineering/platform': - specifier: ^0.7.19 - version: 0.7.19 + specifier: ^0.7.20 + version: 0.7.20 '@hcengineering/rpc': - specifier: ^0.7.17 - version: 0.7.17 + specifier: ^0.7.18 + version: 0.7.18 '@hcengineering/server-core': - specifier: workspace:^0.7.18 + specifier: workspace:^0.7.19 version: link:../core '@hcengineering/server-token': - specifier: ^0.7.17 - version: 0.7.17 + specifier: ^0.7.18 + version: 0.7.18 utf-8-validate: specifier: ^6.0.4 version: 6.0.5 @@ -905,35 +905,35 @@ importers: ../../packages/server-storage: dependencies: '@hcengineering/analytics': - specifier: ^0.7.17 - version: 0.7.17 + specifier: ^0.7.19 + version: 0.7.19 '@hcengineering/core': - specifier: ^0.7.24 + specifier: ^0.7.26 version: 0.7.26 '@hcengineering/datalake': - specifier: workspace:^0.7.17 + specifier: workspace:^0.7.18 version: link:../datalake '@hcengineering/hulylake': - specifier: workspace:^0.7.17 + specifier: workspace:^0.7.18 version: link:../hulylake '@hcengineering/minio': - specifier: workspace:^0.7.17 + specifier: workspace:^0.7.18 version: link:../minio '@hcengineering/platform': - specifier: ^0.7.19 - version: 0.7.19 + specifier: ^0.7.20 + version: 0.7.20 '@hcengineering/s3': - specifier: workspace:^0.7.17 + specifier: workspace:^0.7.18 version: link:../s3 '@hcengineering/server-core': - specifier: workspace:^0.7.18 + specifier: workspace:^0.7.19 version: link:../core '@hcengineering/server-token': - specifier: ^0.7.17 - version: 0.7.17 + specifier: ^0.7.18 + version: 0.7.18 '@hcengineering/storage': - specifier: ^0.7.17 - version: 0.7.17 + specifier: ^0.7.18 + version: 0.7.18 devDependencies: '@hcengineering/platform-rig': specifier: ^0.7.19 @@ -1573,20 +1573,17 @@ packages: '@hcengineering/account-client@0.7.25': resolution: {integrity: sha512-GHGitAfJjljj201TxmeFZSN6qw/FSblDs0ljpl230eBd4EB7jDpAbUyCNdvUt1CK0uBbJECtPrfbmiuBVPvI8w==} - '@hcengineering/analytics@0.7.17': - resolution: {integrity: sha512-AzB2DvmDctEJge8VeAHS3YyRYij/QQlARxa2OCNiY+Vv+2+OsQk0NZsw1yqZqsMkVJ40FTUrzOkI7UdM6RPO1Q==} - '@hcengineering/analytics@0.7.19': resolution: {integrity: sha512-fdsNGs/OlFqBrE/byUXWWZoTwfKXLR8sg07JHgZAEumuI19W1BnJM3tb0Eih4lFQl16DEjT7zxtXaWcU797u3Q==} '@hcengineering/card@0.7.0': resolution: {integrity: sha512-8tviVI1Hf8IE1EIMLd+VmWIE3T5wQz1CYIW7Dwd4Vc+1uZllGTYTM3cGT1jDbHWeQCgLcyG/OlGEKlpHl30Tew==} - '@hcengineering/client-resources@0.7.18': - resolution: {integrity: sha512-nnskuWP6D5QN4Yjf/P/QLzJOi0kfntEos9R75nWrN0L08PvGfVASehgB/8J/Uwmm/LrdWcJVnw2+9bK11jGn4g==} + '@hcengineering/client-resources@0.7.19': + resolution: {integrity: sha512-+B3S36smtUyRMTErcOyBoFFwmU+xOgkKxUVIBzVG7V6zosrjB+imUumi3aeObaUdFfDX/52ONUypPCt8ZIOlNA==} - '@hcengineering/client@0.7.18': - resolution: {integrity: sha512-r42fZwfz/bizU4INMG39elQOkAW8E+uRLDZHp3DnLEXgnl/B2mfu1Q0xWkey1pj2//myuMAOocyT8a83ms2J/A==} + '@hcengineering/client@0.7.19': + resolution: {integrity: sha512-fFvTRLi2kx7IGlybB2u42rmenZFn/tow4jjvyprSfwEvNPBjEOC3l7JpEI2DhmiEfze+k59IJQWBHFV6uU998A==} '@hcengineering/contact@0.7.0': resolution: {integrity: sha512-vrgkI/bZ74Mv/yCIXbv6pVCU/vHYEY8XJ+b2Xl79K4qrKP/+iArHTUtpquU0tqpC8eV5lTRbdrxSbFr6JXzNpw==} @@ -1594,8 +1591,8 @@ packages: '@hcengineering/core@0.7.26': resolution: {integrity: sha512-VUKnNnsl44VJCs/HWFP1KUVUti4/eS4YgLCVWaGjPUzwOiC0cHRGwW+7ukqAlb4b6jTD12Qwa9qdFF3qAPEz9A==} - '@hcengineering/hulylake-client@0.7.17': - resolution: {integrity: sha512-TPqdc5nd7xV73Y1B2EJ7GxpWazp9ACV1AqHlm6ebYwU1CzXQvbuJxF68itbHmPiNiCmmuiDruJmjnyLGwL18Kw==} + '@hcengineering/hulylake-client@0.7.18': + resolution: {integrity: sha512-i9xYd/Ooi/thJxj3hU1WrM26duuY0vfdbyMtoSf+Uxnmbs/Ugc3a64LiSMZTZJAf9FZP5bVtKq55fkKJ4h9/oQ==} '@hcengineering/measurements@0.7.19': resolution: {integrity: sha512-hw/fhqoJfchSBdGbjx+UbuOqf6omp/pjPsaabixcgw1BYO5F4X4G+b07yfZxMNf1PnLfwntCleisuNqLvjD+gw==} @@ -1604,44 +1601,41 @@ packages: resolution: {integrity: sha512-3Fi5nU+nEPjzzcm3FIfEZU+ZgdkiSfL46ojbj42jdXnWMkxew2aZZVtfmIpPnMUP9AMZlj2/EA+yOcMzfY/VmA==} hasBin: true - '@hcengineering/platform@0.7.19': - resolution: {integrity: sha512-HdRJ81A1p/0P9qmHUsBeyWgIkkz00a9fNdxJWjftD0zG2g1UK0212cGy1nfY3PbCefaf3PW/RqHs/oEVInl4iA==} - '@hcengineering/platform@0.7.20': resolution: {integrity: sha512-T84Obdt408ZBmYCzK+WaQcehHO1g59NbynQk0F9Y+DnB819OfCcgTzoIhTh4aXNY39X2sJ9qhgacZ3D23nenuQ==} - '@hcengineering/postgres-base@0.7.17': - resolution: {integrity: sha512-ex5Xtsce/wa4xdY6dDlKyWaFsNQlgHVVcD0R9BF7hOLDkTDbtkzpT+syYpCJSXCfT4MoA9x3xDcGAD5geDYhrg==} + '@hcengineering/postgres-base@0.7.18': + resolution: {integrity: sha512-pJGUicOMc/AGzxW3UTo3/Ck05W4Z21r6jbRNsBqnW6+0AgGwUgbwvLEm4jFH8eNJzIM3uFk+sffibKE3HEHVdw==} '@hcengineering/preference@0.7.0': resolution: {integrity: sha512-VdmWaR20xu4KhFhRAr86IZ4lB8sPD8DieN0qacIB/EXkqgdYpDov0zCR4SYI1HLSk7YR7bhnEWZXTvGc1N8a6Q==} - '@hcengineering/query@0.7.17': - resolution: {integrity: sha512-dOQbLwEHIp5D4J73I96LKeCIb5Am12jXAmrqpoMMmnA8u6UZylJVT8Vn9HwfPTUTVXmYnv9QxUNPKEn/MpaOAw==} + '@hcengineering/query@0.7.18': + resolution: {integrity: sha512-fYQYmjdvNkBg/QXId1++eB9GsTm0iZ/tbO80Ti/T6vzaxQHEjX+1u0NerP+5OTc3NhEq5sXsA9VA8R0XhXdfaA==} - '@hcengineering/retry@0.7.17': - resolution: {integrity: sha512-JPIGoWP3RHTET0laQV4rqlNxjn3tT9O54XNxCxsxhTFF5xeC02XxmW/xV4Gh6QWE5/QCXY5DD3Sz3ild3Cr7Uw==} + '@hcengineering/retry@0.7.18': + resolution: {integrity: sha512-aSQd5PK3Nywie+4kxtJeOYKbiyIXPy+7O6aJah7HpWY6Ez1Ei4SmBnYWoLpVHuMcNLK8r5hF0k5eQGaT91WBPg==} - '@hcengineering/rpc@0.7.17': - resolution: {integrity: sha512-DEd8EMc+Zxgnnk7v9ELj8bk0GpwcKG8rgaMDd2ZXk/JUx9l99RJoJ9/5rlSUHGv8SRxTq8DYJR85nU3aasVd9Q==} + '@hcengineering/rpc@0.7.18': + resolution: {integrity: sha512-L393qKhpjttoYl+3fa92BQ6FQswwoLRG9QRzdJ03zJ6r3kIdM4N7+bLkaWEpFaRI31fLGwx0Ao/9jbO2MmB9aQ==} - '@hcengineering/server-token@0.7.17': - resolution: {integrity: sha512-MDoGzVOTScJXnx2jHL63szclhiqPOKEXk7bmUj6i/HLUQoU6UAl9TTq1Zx/TomyzFQUx8Vkuj0j0bJMUcmLXmQ==} + '@hcengineering/server-token@0.7.18': + resolution: {integrity: sha512-/p5rOrnYb+qe9aez3qZpVS0iUG4edUDcWiyjr8qSsYSSNmlmLX5R6c+RW9NFuBXu64ZAFSf04+XEx+tr2flI2A==} - '@hcengineering/storage@0.7.17': - resolution: {integrity: sha512-1njEkieVWcJgZHvHBB7d656x1EgkwpFeYI9PGJPAiIMnONRfP4KsGLEgfT9Hb5QTM451RCjctbDF+ibBpsCBdQ==} + '@hcengineering/storage@0.7.18': + resolution: {integrity: sha512-aGP1wR+bgKWKdi4QVuxQmpsGX8+pA8kcCLqIuK5aBu2/EJf8Zje5WBY0NeZdWwCL3B0FCoYtrWfWdyYhTuuweA==} '@hcengineering/templates@0.7.0': resolution: {integrity: sha512-1tmbv2Aw2/p5T0RPUunc/2s4c8bSdhOYN5NZTKl7KVA1W4RDjpg6rqcgls6IV+BuoIg3FFEWuVHVGin5fJClqg==} - '@hcengineering/text-core@0.7.18': - resolution: {integrity: sha512-UZ/ZMwVcf60WpnYYcsA7RqYE4JlHnAGVdmUDHX2SYzXXvDIK7deGWD9AKyK4yqI1mb19ccyCr5fGyGoLxx9k/g==} + '@hcengineering/text-core@0.7.19': + resolution: {integrity: sha512-wm1oQ0bPqDgTjuug3XorScsfy+0U3VEguDiPE8qBTB5XtgwwlUx+9ecvg0+LsahWBs6gy06CVukvC8M5eDLkCg==} - '@hcengineering/text-ydoc@0.7.18': - resolution: {integrity: sha512-uww/VyEBGz8HTj9ESG8gIfti4kyWU2aRBGDm2dyljCPTUrgxY348IKP85ZmmxhW8jCGQ7kqTeoXw4xdlRWyCsA==} + '@hcengineering/text-ydoc@0.7.19': + resolution: {integrity: sha512-TXXqDLnPdpfgjjRxq0OJ9NTFI2MKDS5soV08ROo8+Vh55r2exbnPNuCdZhkYg4qmIqLQ3l0yerespIH0PWyoZg==} - '@hcengineering/text@0.7.18': - resolution: {integrity: sha512-0se5IwEF/7LoHcFqqxtx7WUEc0sfzaytsQeqs15gRfjLx0vJ/XMc/ZAj1lkpeLKMPXRQ0mCwdzMjxVzo3W9XDQ==} + '@hcengineering/text@0.7.19': + resolution: {integrity: sha512-/9La2z8wCoUPvt/xigDo9KFJ7AOrx7B2/TGaokZ5bjRLxHWD32AQznGGvHNRlXoFWB0sppTyzKa09l7TXmpN+w==} '@hcengineering/theme@0.7.0': resolution: {integrity: sha512-n1sgpfNZuC+e9fO+en77DNgOE4quh0+IAy+r+/g65U+ENSD9nmUVFoym9IdwFnrUrTLPa4jyxncGrZ16fJtdsA==} @@ -5522,10 +5516,6 @@ snapshots: '@hcengineering/core': 0.7.26 '@hcengineering/platform': 0.7.20 - '@hcengineering/analytics@0.7.17': - dependencies: - '@hcengineering/platform': 0.7.19 - '@hcengineering/analytics@0.7.19': dependencies: '@hcengineering/platform': 0.7.20 @@ -5533,30 +5523,30 @@ snapshots: '@hcengineering/card@0.7.0': dependencies: '@hcengineering/core': 0.7.26 - '@hcengineering/platform': 0.7.19 + '@hcengineering/platform': 0.7.20 '@hcengineering/preference': 0.7.0 '@hcengineering/ui': 0.7.0 '@hcengineering/view': 0.7.0 - '@hcengineering/client-resources@0.7.18': + '@hcengineering/client-resources@0.7.19': dependencies: - '@hcengineering/analytics': 0.7.17 - '@hcengineering/client': 0.7.18 + '@hcengineering/analytics': 0.7.19 + '@hcengineering/client': 0.7.19 '@hcengineering/core': 0.7.26 - '@hcengineering/platform': 0.7.19 - '@hcengineering/rpc': 0.7.17 + '@hcengineering/platform': 0.7.20 + '@hcengineering/rpc': 0.7.18 snappyjs: 0.7.0 - '@hcengineering/client@0.7.18': + '@hcengineering/client@0.7.19': dependencies: '@hcengineering/core': 0.7.26 - '@hcengineering/platform': 0.7.19 + '@hcengineering/platform': 0.7.20 '@hcengineering/contact@0.7.0': dependencies: '@hcengineering/card': 0.7.0 '@hcengineering/core': 0.7.26 - '@hcengineering/platform': 0.7.19 + '@hcengineering/platform': 0.7.20 '@hcengineering/preference': 0.7.0 '@hcengineering/templates': 0.7.0 '@hcengineering/ui': 0.7.0 @@ -5569,10 +5559,10 @@ snapshots: '@hcengineering/platform': 0.7.20 fast-equals: 5.3.2 - '@hcengineering/hulylake-client@0.7.17': + '@hcengineering/hulylake-client@0.7.18': dependencies: '@hcengineering/core': 0.7.26 - '@hcengineering/retry': 0.7.17 + '@hcengineering/retry': 0.7.18 '@hcengineering/measurements@0.7.19': {} @@ -5609,69 +5599,65 @@ snapshots: - supports-color - ts-node - '@hcengineering/platform@0.7.19': - dependencies: - intl-messageformat: 10.7.18 - '@hcengineering/platform@0.7.20': dependencies: intl-messageformat: 10.7.18 - '@hcengineering/postgres-base@0.7.17': + '@hcengineering/postgres-base@0.7.18': dependencies: postgres: 3.4.7 '@hcengineering/preference@0.7.0': dependencies: '@hcengineering/core': 0.7.26 - '@hcengineering/platform': 0.7.19 + '@hcengineering/platform': 0.7.20 '@hcengineering/ui': 0.7.0 - '@hcengineering/query@0.7.17': + '@hcengineering/query@0.7.18': dependencies: - '@hcengineering/analytics': 0.7.17 + '@hcengineering/analytics': 0.7.19 '@hcengineering/core': 0.7.26 - '@hcengineering/platform': 0.7.19 + '@hcengineering/platform': 0.7.20 fast-equals: 5.3.2 - '@hcengineering/retry@0.7.17': {} + '@hcengineering/retry@0.7.18': {} - '@hcengineering/rpc@0.7.17': + '@hcengineering/rpc@0.7.18': dependencies: '@hcengineering/core': 0.7.26 - '@hcengineering/platform': 0.7.19 + '@hcengineering/platform': 0.7.20 msgpackr: 1.11.5 - '@hcengineering/server-token@0.7.17': + '@hcengineering/server-token@0.7.18': dependencies: '@hcengineering/core': 0.7.26 - '@hcengineering/platform': 0.7.19 + '@hcengineering/platform': 0.7.20 jwt-simple: 0.5.6 uuid: 8.3.2 - '@hcengineering/storage@0.7.17': + '@hcengineering/storage@0.7.18': dependencies: '@hcengineering/core': 0.7.26 - '@hcengineering/platform': 0.7.19 + '@hcengineering/platform': 0.7.20 fast-equals: 5.3.2 '@hcengineering/templates@0.7.0': dependencies: '@hcengineering/core': 0.7.26 - '@hcengineering/platform': 0.7.19 + '@hcengineering/platform': 0.7.20 '@hcengineering/ui': 0.7.0 - '@hcengineering/text-core@0.7.18': + '@hcengineering/text-core@0.7.19': dependencies: '@hcengineering/core': 0.7.26 fast-equals: 5.3.2 hash-it: 6.0.0 - '@hcengineering/text-ydoc@0.7.18(prosemirror-inputrules@1.5.1)(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3)': + '@hcengineering/text-ydoc@0.7.19(prosemirror-inputrules@1.5.1)(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3)': dependencies: '@hcengineering/core': 0.7.26 - '@hcengineering/text': 0.7.18(prosemirror-inputrules@1.5.1)(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3) - '@hcengineering/text-core': 0.7.18 + '@hcengineering/text': 0.7.19(prosemirror-inputrules@1.5.1)(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3) + '@hcengineering/text-core': 0.7.19 y-protocols: 1.0.6(yjs@13.6.27) yjs: 13.6.27 transitivePeerDependencies: @@ -5680,10 +5666,10 @@ snapshots: - prosemirror-state - prosemirror-view - '@hcengineering/text@0.7.18(prosemirror-inputrules@1.5.1)(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3)': + '@hcengineering/text@0.7.19(prosemirror-inputrules@1.5.1)(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3)': dependencies: '@hcengineering/core': 0.7.26 - '@hcengineering/text-core': 0.7.18 + '@hcengineering/text-core': 0.7.19 '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) '@tiptap/extension-blockquote': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) '@tiptap/extension-bold': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) @@ -5730,15 +5716,15 @@ snapshots: '@hcengineering/theme@0.7.0': dependencies: - '@hcengineering/analytics': 0.7.17 - '@hcengineering/platform': 0.7.19 + '@hcengineering/analytics': 0.7.19 + '@hcengineering/platform': 0.7.20 svelte: 4.2.20 '@hcengineering/ui@0.7.0': dependencies: - '@hcengineering/analytics': 0.7.17 + '@hcengineering/analytics': 0.7.19 '@hcengineering/core': 0.7.26 - '@hcengineering/platform': 0.7.19 + '@hcengineering/platform': 0.7.20 '@hcengineering/theme': 0.7.0 autolinker: 4.0.0 blurhash: 2.0.5 @@ -5754,7 +5740,7 @@ snapshots: '@hcengineering/view@0.7.0': dependencies: '@hcengineering/core': 0.7.26 - '@hcengineering/platform': 0.7.19 + '@hcengineering/platform': 0.7.20 '@hcengineering/preference': 0.7.0 '@hcengineering/ui': 0.7.0 diff --git a/common/scripts/package.json b/common/scripts/package.json index 5dd46b9..6094bb7 100644 --- a/common/scripts/package.json +++ b/common/scripts/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/scripts", - "version": "0.7.14", + "version": "0.7.15", "scripts": { "format": "echo \"No format specified\"", "coverage:merge": "node merge-coverage.js", diff --git a/packages/client/package.json b/packages/client/package.json index 4d5bb5f..368ca21 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/server-client", - "version": "0.7.17", + "version": "0.7.18", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -37,13 +37,13 @@ "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { - "@hcengineering/platform": "^0.7.19", - "@hcengineering/core": "^0.7.24", - "@hcengineering/client-resources": "^0.7.18", - "@hcengineering/client": "^0.7.18", - "@hcengineering/account-client": "^0.7.21", - "@hcengineering/server-core": "workspace:^0.7.18", - "@hcengineering/server-token": "^0.7.17", + "@hcengineering/platform": "^0.7.20", + "@hcengineering/core": "^0.7.26", + "@hcengineering/client-resources": "^0.7.19", + "@hcengineering/client": "^0.7.19", + "@hcengineering/account-client": "^0.7.25", + "@hcengineering/server-core": "workspace:^0.7.19", + "@hcengineering/server-token": "^0.7.18", "ws": "^8.18.2" }, "repository": "https://github.com/hcengineering/huly.server", diff --git a/packages/collaboration/package.json b/packages/collaboration/package.json index d386750..a47c6ca 100644 --- a/packages/collaboration/package.json +++ b/packages/collaboration/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/collaboration", - "version": "0.7.17", + "version": "0.7.18", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -35,10 +35,10 @@ "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { - "@hcengineering/core": "^0.7.24", - "@hcengineering/server-core": "workspace:^0.7.18", - "@hcengineering/text": "^0.7.18", - "@hcengineering/text-ydoc": "^0.7.18", + "@hcengineering/core": "^0.7.26", + "@hcengineering/server-core": "workspace:^0.7.19", + "@hcengineering/text": "^0.7.19", + "@hcengineering/text-ydoc": "^0.7.19", "base64-js": "^1.5.1", "yjs": "^13.6.27" }, diff --git a/packages/core/package.json b/packages/core/package.json index 44a2a7d..3800b56 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/server-core", - "version": "0.7.18", + "version": "0.7.19", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -36,13 +36,13 @@ "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { - "@hcengineering/analytics": "^0.7.17", - "@hcengineering/core": "^0.7.24", - "@hcengineering/platform": "^0.7.19", - "@hcengineering/query": "^0.7.17", - "@hcengineering/rpc": "^0.7.17", - "@hcengineering/server-token": "^0.7.17", - "@hcengineering/storage": "^0.7.17", + "@hcengineering/analytics": "^0.7.19", + "@hcengineering/core": "^0.7.26", + "@hcengineering/platform": "^0.7.20", + "@hcengineering/query": "^0.7.18", + "@hcengineering/rpc": "^0.7.18", + "@hcengineering/server-token": "^0.7.18", + "@hcengineering/storage": "^0.7.18", "fast-equals": "^5.2.2", "uuid": "^8.3.2" }, diff --git a/packages/datalake/package.json b/packages/datalake/package.json index 00028a9..e6089c1 100644 --- a/packages/datalake/package.json +++ b/packages/datalake/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/datalake", - "version": "0.7.17", + "version": "0.7.18", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -36,10 +36,10 @@ "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { - "@hcengineering/core": "^0.7.24", - "@hcengineering/platform": "^0.7.19", - "@hcengineering/server-core": "workspace:^0.7.18", - "@hcengineering/server-token": "^0.7.17" + "@hcengineering/core": "^0.7.26", + "@hcengineering/platform": "^0.7.20", + "@hcengineering/server-core": "workspace:^0.7.19", + "@hcengineering/server-token": "^0.7.18" }, "repository": "https://github.com/hcengineering/huly.server", "publishConfig": { diff --git a/packages/elastic/package.json b/packages/elastic/package.json index 70b741b..4f52d46 100644 --- a/packages/elastic/package.json +++ b/packages/elastic/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/elastic", - "version": "0.7.17", + "version": "0.7.18", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -55,11 +55,11 @@ "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { - "@hcengineering/core": "^0.7.24", - "@hcengineering/platform": "^0.7.19", - "@hcengineering/server-core": "workspace:^0.7.18", + "@hcengineering/core": "^0.7.26", + "@hcengineering/platform": "^0.7.20", + "@hcengineering/server-core": "workspace:^0.7.19", "@elastic/elasticsearch": "^7.17.14", - "@hcengineering/analytics": "^0.7.17" + "@hcengineering/analytics": "^0.7.19" }, "repository": "https://github.com/hcengineering/huly.server", "publishConfig": { diff --git a/packages/hulylake/package.json b/packages/hulylake/package.json index 6005df3..b096c01 100644 --- a/packages/hulylake/package.json +++ b/packages/hulylake/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/hulylake", - "version": "0.7.17", + "version": "0.7.18", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -36,11 +36,11 @@ "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { - "@hcengineering/core": "^0.7.24", - "@hcengineering/platform": "^0.7.19", - "@hcengineering/server-core": "workspace:^0.7.18", - "@hcengineering/server-token": "^0.7.17", - "@hcengineering/hulylake-client": "^0.7.17" + "@hcengineering/core": "^0.7.26", + "@hcengineering/platform": "^0.7.20", + "@hcengineering/server-core": "workspace:^0.7.19", + "@hcengineering/server-token": "^0.7.18", + "@hcengineering/hulylake-client": "^0.7.18" }, "repository": "https://github.com/hcengineering/huly.server", "publishConfig": { diff --git a/packages/kafka/package.json b/packages/kafka/package.json index 0205d34..f479607 100644 --- a/packages/kafka/package.json +++ b/packages/kafka/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/kafka", - "version": "0.7.19", + "version": "0.7.20", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -35,10 +35,10 @@ "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { - "@hcengineering/core": "^0.7.24", - "@hcengineering/platform": "^0.7.19", - "@hcengineering/server-core": "workspace:^0.7.18", - "@hcengineering/storage": "^0.7.17", + "@hcengineering/core": "^0.7.26", + "@hcengineering/platform": "^0.7.20", + "@hcengineering/server-core": "workspace:^0.7.19", + "@hcengineering/storage": "^0.7.18", "kafkajs": "^2.2.4" }, "repository": "https://github.com/hcengineering/huly.server", diff --git a/packages/middleware/package.json b/packages/middleware/package.json index 24c740c..aa8e9a9 100644 --- a/packages/middleware/package.json +++ b/packages/middleware/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/middleware", - "version": "0.7.22", + "version": "0.7.23", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -35,12 +35,12 @@ "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { - "@hcengineering/core": "^0.7.24", + "@hcengineering/core": "^0.7.26", "@hcengineering/contact": "^0.7.0", - "@hcengineering/platform": "^0.7.19", - "@hcengineering/server-core": "workspace:^0.7.18", - "@hcengineering/query": "^0.7.17", - "@hcengineering/analytics": "^0.7.17", + "@hcengineering/platform": "^0.7.20", + "@hcengineering/server-core": "workspace:^0.7.19", + "@hcengineering/query": "^0.7.18", + "@hcengineering/analytics": "^0.7.19", "fast-equals": "^5.2.2" }, "repository": "https://github.com/hcengineering/huly.server", diff --git a/packages/minio/package.json b/packages/minio/package.json index 21c7944..c63ca5a 100644 --- a/packages/minio/package.json +++ b/packages/minio/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/minio", - "version": "0.7.17", + "version": "0.7.18", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -35,9 +35,9 @@ "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { - "@hcengineering/core": "^0.7.24", - "@hcengineering/platform": "^0.7.19", - "@hcengineering/server-core": "workspace:^0.7.18", + "@hcengineering/core": "^0.7.26", + "@hcengineering/platform": "^0.7.20", + "@hcengineering/server-core": "workspace:^0.7.19", "minio": "^8.0.5" }, "repository": "https://github.com/hcengineering/huly.server", diff --git a/packages/mongo/package.json b/packages/mongo/package.json index 416d51f..352e6e4 100644 --- a/packages/mongo/package.json +++ b/packages/mongo/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/mongo", - "version": "0.7.17", + "version": "0.7.18", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -35,9 +35,9 @@ "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { - "@hcengineering/core": "^0.7.24", - "@hcengineering/platform": "^0.7.19", - "@hcengineering/server-core": "workspace:^0.7.18", + "@hcengineering/core": "^0.7.26", + "@hcengineering/platform": "^0.7.20", + "@hcengineering/server-core": "workspace:^0.7.19", "mongodb": "^6.16.0", "bson": "^6.10.3" }, diff --git a/packages/postgres/package.json b/packages/postgres/package.json index 30d22e4..8611a7c 100644 --- a/packages/postgres/package.json +++ b/packages/postgres/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/postgres", - "version": "0.7.22", + "version": "0.7.23", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -36,10 +36,10 @@ }, "dependencies": { "postgres": "^3.4.7", - "@hcengineering/core": "^0.7.24", - "@hcengineering/platform": "^0.7.19", - "@hcengineering/server-core": "workspace:^0.7.18", - "@hcengineering/postgres-base": "^0.7.17" + "@hcengineering/core": "^0.7.26", + "@hcengineering/platform": "^0.7.20", + "@hcengineering/server-core": "workspace:^0.7.19", + "@hcengineering/postgres-base": "^0.7.18" }, "repository": "https://github.com/hcengineering/huly.server", "publishConfig": { diff --git a/packages/s3/package.json b/packages/s3/package.json index 111c055..caa505f 100644 --- a/packages/s3/package.json +++ b/packages/s3/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/s3", - "version": "0.7.17", + "version": "0.7.18", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -35,10 +35,10 @@ "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { - "@hcengineering/core": "^0.7.24", - "@hcengineering/platform": "^0.7.19", - "@hcengineering/server-core": "workspace:^0.7.18", - "@hcengineering/storage": "^0.7.17", + "@hcengineering/core": "^0.7.26", + "@hcengineering/platform": "^0.7.20", + "@hcengineering/server-core": "workspace:^0.7.19", + "@hcengineering/storage": "^0.7.18", "@aws-sdk/client-s3": "^3.738.0", "@aws-sdk/s3-request-presigner": "^3.738.0", "@aws-sdk/lib-storage": "^3.738.0", diff --git a/packages/server-storage/package.json b/packages/server-storage/package.json index 5c56c01..9292747 100644 --- a/packages/server-storage/package.json +++ b/packages/server-storage/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/server-storage", - "version": "0.7.17", + "version": "0.7.18", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -56,16 +56,16 @@ "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { - "@hcengineering/core": "^0.7.24", - "@hcengineering/platform": "^0.7.19", - "@hcengineering/server-core": "workspace:^0.7.18", - "@hcengineering/minio": "workspace:^0.7.17", - "@hcengineering/s3": "workspace:^0.7.17", - "@hcengineering/datalake": "workspace:^0.7.17", - "@hcengineering/hulylake": "workspace:^0.7.17", - "@hcengineering/storage": "^0.7.17", - "@hcengineering/analytics": "^0.7.17", - "@hcengineering/server-token": "^0.7.17" + "@hcengineering/core": "^0.7.26", + "@hcengineering/platform": "^0.7.20", + "@hcengineering/server-core": "workspace:^0.7.19", + "@hcengineering/minio": "workspace:^0.7.18", + "@hcengineering/s3": "workspace:^0.7.18", + "@hcengineering/datalake": "workspace:^0.7.18", + "@hcengineering/hulylake": "workspace:^0.7.18", + "@hcengineering/storage": "^0.7.18", + "@hcengineering/analytics": "^0.7.19", + "@hcengineering/server-token": "^0.7.18" }, "repository": "https://github.com/hcengineering/huly.server", "publishConfig": { diff --git a/packages/server/package.json b/packages/server/package.json index 205eaac..49b4ed4 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@hcengineering/server", - "version": "0.7.18", + "version": "0.7.19", "main": "lib/index.js", "svelte": "src/index.ts", "types": "types/index.d.ts", @@ -36,13 +36,13 @@ "eslint-plugin-svelte": "^2.35.1" }, "dependencies": { - "@hcengineering/account-client": "^0.7.21", - "@hcengineering/analytics": "^0.7.17", - "@hcengineering/core": "^0.7.24", - "@hcengineering/platform": "^0.7.19", - "@hcengineering/rpc": "^0.7.17", - "@hcengineering/server-core": "workspace:^0.7.18", - "@hcengineering/server-token": "^0.7.17", + "@hcengineering/account-client": "^0.7.25", + "@hcengineering/analytics": "^0.7.19", + "@hcengineering/core": "^0.7.26", + "@hcengineering/platform": "^0.7.20", + "@hcengineering/rpc": "^0.7.18", + "@hcengineering/server-core": "workspace:^0.7.19", + "@hcengineering/server-token": "^0.7.18", "utf-8-validate": "^6.0.4" }, "repository": "https://github.com/hcengineering/huly.server", From eaadb01b8f5add2c9eaf6fb1fc6ef05e7f45c269 Mon Sep 17 00:00:00 2001 From: Artem Savchenko Date: Sun, 22 Feb 2026 14:35:30 +0700 Subject: [PATCH 3/3] Skip change log verification Signed-off-by: Artem Savchenko --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1f88535..8f0e9bc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,8 +19,8 @@ jobs: - uses: actions/setup-node@v3 with: node-version: 22 - - name: Verify Change Logs - run: node common/scripts/install-run-rush.js change --verify + # - name: Verify Change Logs + # run: node common/scripts/install-run-rush.js change --verify - name: Rush Install run: node common/scripts/install-run-rush.js install - name: Rush validate