diff --git a/package-lock.json b/package-lock.json index a631f37..292425a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,11 +13,11 @@ "@azure/msal-browser": "^3.28.0", "@fluentui/react-components": "^9.61.6", "@fluentui/react-icons": "^2.0.292", - "@fluidframework/azure-client": "^2.40.0", - "@fluidframework/odsp-client": "^2.40.0", - "@fluidframework/presence": "^2.40.0", - "@fluidframework/telemetry-utils": "^2.40.0", - "@fluidframework/test-runtime-utils": "^2.40.0", + "@fluidframework/azure-client": "^2.41.0", + "@fluidframework/odsp-client": "^2.41.0", + "@fluidframework/presence": "^2.41.0", + "@fluidframework/telemetry-utils": "^2.41.0", + "@fluidframework/test-runtime-utils": "^2.41.0", "@microsoft/microsoft-graph-client": "^3.0.7", "@tailwindcss/vite": "^4.0.9", "@tanstack/react-table": "^8.20.6", @@ -25,7 +25,7 @@ "@vitejs/plugin-react": "^4.3.4", "axios": "^1.7.9", "dotenv": "^16.4.7", - "fluid-framework": "^2.40.0", + "fluid-framework": "^2.41.0", "hashids": "^2.2.10", "jsrsasign": "^11.1.0", "react": "^18.3.1", @@ -38,9 +38,9 @@ "devDependencies": { "@eslint/eslintrc": "^3.2.0", "@eslint/js": "^9.18.0", - "@fluidframework/azure-local-service": "^2.40.0", + "@fluidframework/azure-local-service": "^2.41.0", "@fluidframework/build-common": "^2.0.3", - "@fluidframework/devtools": "^2.40.0", + "@fluidframework/devtools": "^2.41.0", "@microsoft/microsoft-graph-types": "^2.40.0", "@playwright/test": "^1.49.1", "@types/debug": "^4.1.7", @@ -2700,13 +2700,12 @@ } }, "node_modules/@fluid-internal/client-utils": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluid-internal/client-utils/-/client-utils-2.40.0.tgz", - "integrity": "sha512-ccV+GXpPncc5Ms62uPODyeGCPT8YZwa/Gp/6kHyNeUXGozuwIajCU7cz4iy/3m/132TOm6o3LR3fHmtOcVjHFA==", - "license": "MIT", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluid-internal/client-utils/-/client-utils-2.41.0.tgz", + "integrity": "sha512-t9G6rdiElTKg1J88IIvF3yeTzMFv2DH7RT3QZQcXtREy+NiDsApcasgdJRBuX7VtRvx/T7knMOlxyptIfUL9pw==", "dependencies": { - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", "@types/events_pkg": "npm:@types/events@^3.0.0", "base64-js": "^1.5.1", "buffer": "^6.0.3", @@ -2715,52 +2714,48 @@ } }, "node_modules/@fluidframework/aqueduct": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/aqueduct/-/aqueduct-2.40.0.tgz", - "integrity": "sha512-Vuc/5j8NdZeStM7txX8/x5JMH2KGd1ARpqu8y3Bnvqi9BLoM8PosbEx8JPZx5QK9II0PGbc9WGYgyDTO/y+zOQ==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.40.0", - "@fluidframework/container-definitions": "~2.40.0", - "@fluidframework/container-runtime": "~2.40.0", - "@fluidframework/container-runtime-definitions": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/datastore": "~2.40.0", - "@fluidframework/datastore-definitions": "~2.40.0", - "@fluidframework/map": "~2.40.0", - "@fluidframework/request-handler": "~2.40.0", - "@fluidframework/runtime-definitions": "~2.40.0", - "@fluidframework/runtime-utils": "~2.40.0", - "@fluidframework/shared-object-base": "~2.40.0", - "@fluidframework/synthesize": "~2.40.0", - "@fluidframework/telemetry-utils": "~2.40.0", - "@fluidframework/tree": "~2.40.0" + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/aqueduct/-/aqueduct-2.41.0.tgz", + "integrity": "sha512-TK1SeTiPiV5HRQjQpeR2fAjI9m0dAyGQoJXDu/bZ4sAd7bYASf2cBttLMpH/rwEKEq63iLiBGx/XvhALdMm8Fg==", + "dependencies": { + "@fluid-internal/client-utils": "~2.41.0", + "@fluidframework/container-definitions": "~2.41.0", + "@fluidframework/container-runtime": "~2.41.0", + "@fluidframework/container-runtime-definitions": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/datastore": "~2.41.0", + "@fluidframework/datastore-definitions": "~2.41.0", + "@fluidframework/map": "~2.41.0", + "@fluidframework/request-handler": "~2.41.0", + "@fluidframework/runtime-definitions": "~2.41.0", + "@fluidframework/runtime-utils": "~2.41.0", + "@fluidframework/shared-object-base": "~2.41.0", + "@fluidframework/synthesize": "~2.41.0", + "@fluidframework/telemetry-utils": "~2.41.0", + "@fluidframework/tree": "~2.41.0" } }, "node_modules/@fluidframework/azure-client": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/azure-client/-/azure-client-2.40.0.tgz", - "integrity": "sha512-aHK7JL4Y788Fa9k+0B6Qphw/Ypy+Dbsgxt77xTFopOPauibXaKgt2v1GcCifnnTKFzTOBE5zjW+8KR/NzvrIgw==", - "license": "MIT", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/azure-client/-/azure-client-2.41.0.tgz", + "integrity": "sha512-GDCzaigLu015piNhrGOHO7AKRmC6aflKrvXcLaz9R0VXjCIj4R3gidwHXFQyjjvfnQFpmmw+qIiFHAGF+nm62g==", "dependencies": { - "@fluidframework/container-definitions": "~2.40.0", - "@fluidframework/container-loader": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/driver-utils": "~2.40.0", - "@fluidframework/fluid-static": "~2.40.0", - "@fluidframework/routerlicious-driver": "~2.40.0", - "@fluidframework/telemetry-utils": "~2.40.0" + "@fluidframework/container-definitions": "~2.41.0", + "@fluidframework/container-loader": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/driver-utils": "~2.41.0", + "@fluidframework/fluid-static": "~2.41.0", + "@fluidframework/routerlicious-driver": "~2.41.0", + "@fluidframework/telemetry-utils": "~2.41.0" } }, "node_modules/@fluidframework/azure-local-service": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/azure-local-service/-/azure-local-service-2.40.0.tgz", - "integrity": "sha512-3LkYPPi50lQWmsDAMGRPxaN02YTGYkogMNqgHr2uM6AcUUp6XMcADohiQqIuhGF4lz7wFF2nqMCMHkayMvGq/w==", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/azure-local-service/-/azure-local-service-2.41.0.tgz", + "integrity": "sha512-bsgwohYLDkZwrp17CaesTKpuTOYBWSFGP0wbFOiwaQpCvovTDq+uGjqrhYjQ6ZERJoULL4CxIBxxRgvHvUQE1A==", "dev": true, - "license": "MIT", "dependencies": { "tinylicious": "^5.0.0" }, @@ -2779,19 +2774,18 @@ } }, "node_modules/@fluidframework/cell": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/cell/-/cell-2.40.0.tgz", - "integrity": "sha512-6ZA1LPrrTFkaBMHf0GdLqwrZqy3kTDkdBsFqQsTa4i5XNoPS05qoZ5Ka5inAVesSiUPtqwxMH5BMjOdCxicA3w==", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/cell/-/cell-2.41.0.tgz", + "integrity": "sha512-wD8YQKFaHAQTLvh6yPbF7ecSc9D6LDPw2goUh/2sofcUebmZHk/y0/7V82Fuch9dUx2Op6N6Hxoy1bXpElQotQ==", "dev": true, - "license": "MIT", "dependencies": { - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/datastore-definitions": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/driver-utils": "~2.40.0", - "@fluidframework/runtime-definitions": "~2.40.0", - "@fluidframework/shared-object-base": "~2.40.0" + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/datastore-definitions": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/driver-utils": "~2.41.0", + "@fluidframework/runtime-definitions": "~2.41.0", + "@fluidframework/shared-object-base": "~2.41.0" } }, "node_modules/@fluidframework/common-definitions": { @@ -2816,28 +2810,26 @@ } }, "node_modules/@fluidframework/container-definitions": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/container-definitions/-/container-definitions-2.40.0.tgz", - "integrity": "sha512-iD46JuBKZqeSeUQcmKzXaJ8GuPnsBOmkXmZNKQFnVk2dzuktjhWGQ1rxu72EZMfFMTJj7QOsuMVc+Z578lALuw==", - "license": "MIT", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/container-definitions/-/container-definitions-2.41.0.tgz", + "integrity": "sha512-kyfInxrGm6Aor6g/+Nw3t+EeJyxjmYCtNq4Kl+KfNQ0wvbtfcHM8BRSd6tEJYPzElBhwQk7UpzfVQDPD2h+Hkg==", "dependencies": { - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0" + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0" } }, "node_modules/@fluidframework/container-loader": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/container-loader/-/container-loader-2.40.0.tgz", - "integrity": "sha512-jygQ6i7s+M5C4QrGH+HAYNo7rZ7FYvtFAwGvJFHyK1GGcfdn1dk2NztbxFXw4W6hWcGeOcFJZwjHS29KUKOV5w==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.40.0", - "@fluidframework/container-definitions": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/driver-utils": "~2.40.0", - "@fluidframework/telemetry-utils": "~2.40.0", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/container-loader/-/container-loader-2.41.0.tgz", + "integrity": "sha512-hjA3SPdWF4TjtJvXejCOSq223syfSptrUlrhXzcZZ+nOPvfVG8/21m6eBzRpqiHiMW2gk/UHi86REY0Ympaijg==", + "dependencies": { + "@fluid-internal/client-utils": "~2.41.0", + "@fluidframework/container-definitions": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/driver-utils": "~2.41.0", + "@fluidframework/telemetry-utils": "~2.41.0", "@types/events_pkg": "npm:@types/events@^3.0.0", "@ungap/structured-clone": "^1.2.0", "debug": "^4.3.4", @@ -2854,29 +2846,27 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], - "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/@fluidframework/container-runtime": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/container-runtime/-/container-runtime-2.40.0.tgz", - "integrity": "sha512-a13g/6NnHjmeiZASen8toBBXULa/OK25kvCP3qVnP1hAf046w85ghbNcDm4HbqLkLeDyyPazgphRx9BTp/fx7A==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.40.0", - "@fluidframework/container-definitions": "~2.40.0", - "@fluidframework/container-runtime-definitions": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/datastore": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/driver-utils": "~2.40.0", - "@fluidframework/id-compressor": "~2.40.0", - "@fluidframework/runtime-definitions": "~2.40.0", - "@fluidframework/runtime-utils": "~2.40.0", - "@fluidframework/telemetry-utils": "~2.40.0", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/container-runtime/-/container-runtime-2.41.0.tgz", + "integrity": "sha512-U+vQbkll59M+rU1JCBAo90JF9yHnIymbRq5M50lqasMmBoePJPPvcEVNV1ONJE/g9N6ose8GhkumlQDHHZHnuA==", + "dependencies": { + "@fluid-internal/client-utils": "~2.41.0", + "@fluidframework/container-definitions": "~2.41.0", + "@fluidframework/container-runtime-definitions": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/datastore": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/driver-utils": "~2.41.0", + "@fluidframework/id-compressor": "~2.41.0", + "@fluidframework/runtime-definitions": "~2.41.0", + "@fluidframework/runtime-utils": "~2.41.0", + "@fluidframework/telemetry-utils": "~2.41.0", "@tylerbu/sorted-btree-es6": "^1.8.0", "double-ended-queue": "^2.1.0-0", "lz4js": "^0.2.0", @@ -2885,15 +2875,14 @@ } }, "node_modules/@fluidframework/container-runtime-definitions": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/container-runtime-definitions/-/container-runtime-definitions-2.40.0.tgz", - "integrity": "sha512-OTyKrUITzBe2ANBBPp0uWvQrrLbfhoIq1Kt22ZIVRgzQAS6D2y5skC9kp7Nvk3d7tGRtFUkc1T3qnuaz19sR7w==", - "license": "MIT", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/container-runtime-definitions/-/container-runtime-definitions-2.41.0.tgz", + "integrity": "sha512-EohcK3kgwMoWqBPf9PEjbh7U866lWR2Q+hdzYhdKyOCcmrJQFndqkNlZy0dgXLASbX46mwsWiVQSpY2T+qvPZg==", "dependencies": { - "@fluidframework/container-definitions": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/runtime-definitions": "~2.40.0" + "@fluidframework/container-definitions": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/runtime-definitions": "~2.41.0" } }, "node_modules/@fluidframework/container-runtime/node_modules/uuid": { @@ -2904,70 +2893,64 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], - "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/@fluidframework/core-interfaces": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/core-interfaces/-/core-interfaces-2.40.0.tgz", - "integrity": "sha512-735WxXYQEVe2ZPvQW1BrgAb60Mf4ufVCMMFTnphToE1YTaYA37KI+RjUqpnv6tTSwB5FDkZmPr4kJzi0Gbog2g==", - "license": "MIT" + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/core-interfaces/-/core-interfaces-2.41.0.tgz", + "integrity": "sha512-DHX+aUJ0wraPZ6N4eTbPAQ7OrfaJFb0zBLnDAJpp+o8kZugS8iCVVp/rNlylE5A1g0usFMCjT6FafMhOoL9yzw==" }, "node_modules/@fluidframework/core-utils": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/core-utils/-/core-utils-2.40.0.tgz", - "integrity": "sha512-JbQ89gtOarR80fOlYlebewsUZ0deGdmelfqsuCOQLSmwvcODlpMPuP3AbvJDKMaFapxrIw8svBpPu0YD4Hs9SA==", - "license": "MIT" + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/core-utils/-/core-utils-2.41.0.tgz", + "integrity": "sha512-olPPOcmMdYClQAYIyeeTUmoUPreryR138JNCRrl8poQ69RhL3PkKJgOavxlLykS1oofvG4y43jrbttKhjJgbIg==" }, "node_modules/@fluidframework/counter": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/counter/-/counter-2.40.0.tgz", - "integrity": "sha512-OF2cuc5uf3YbUCk/B+79rzyZylmTHfSgfyukiZEiIIw3SM474+UGUNzHZ1s8DyY7lQbqGIXGrXtDxwSIFVJB0A==", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/counter/-/counter-2.41.0.tgz", + "integrity": "sha512-PE8VlK5NEYS5moEIsbQ3Fr4ANps3SuSQfZNbRu18+vsZe4ebpAhbagde/Sp4VbOx15x6gvGbuvEmAXi8PN18rw==", "dev": true, - "license": "MIT", "dependencies": { - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/datastore-definitions": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/driver-utils": "~2.40.0", - "@fluidframework/runtime-definitions": "~2.40.0", - "@fluidframework/shared-object-base": "~2.40.0" + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/datastore-definitions": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/driver-utils": "~2.41.0", + "@fluidframework/runtime-definitions": "~2.41.0", + "@fluidframework/shared-object-base": "~2.41.0" } }, "node_modules/@fluidframework/datastore": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/datastore/-/datastore-2.40.0.tgz", - "integrity": "sha512-9T7bYR8VyXYUPj87B0/65aomqWw/wmJeSGAa3z6bNHzKTm9qoZx9/L0JfevDGjfahtR5+2PYXwoMtTMGJnWADw==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.40.0", - "@fluidframework/container-definitions": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/datastore-definitions": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/driver-utils": "~2.40.0", - "@fluidframework/id-compressor": "~2.40.0", - "@fluidframework/runtime-definitions": "~2.40.0", - "@fluidframework/runtime-utils": "~2.40.0", - "@fluidframework/telemetry-utils": "~2.40.0", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/datastore/-/datastore-2.41.0.tgz", + "integrity": "sha512-0P+QeuZGZZWlJxBAPrecB4C4yzeZjXpzUKL1iM0U2GEueOBV6EUowHxQnZEPiL8vIT5LUz7oEWuJqoVl8BIMBA==", + "dependencies": { + "@fluid-internal/client-utils": "~2.41.0", + "@fluidframework/container-definitions": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/datastore-definitions": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/driver-utils": "~2.41.0", + "@fluidframework/id-compressor": "~2.41.0", + "@fluidframework/runtime-definitions": "~2.41.0", + "@fluidframework/runtime-utils": "~2.41.0", + "@fluidframework/telemetry-utils": "~2.41.0", "uuid": "^9.0.0" } }, "node_modules/@fluidframework/datastore-definitions": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/datastore-definitions/-/datastore-definitions-2.40.0.tgz", - "integrity": "sha512-jV/BY2ur2P4h5uPEzSrAgXBownJmCixPDi7/4L1JH/HIFPUYAsXkgB1Sjf/d0EMg4aILCkjrRvwrrC2TJ1I9HA==", - "license": "MIT", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/datastore-definitions/-/datastore-definitions-2.41.0.tgz", + "integrity": "sha512-hI2ciL71Ff2KD3oAvF0zldJppdfuj3uxTtlKGgVY5w+XeAklnuAhGRbJzgImmwe4dn1QqhL8VBUrm0xhSJHuKA==", "dependencies": { - "@fluidframework/container-definitions": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/id-compressor": "~2.40.0", - "@fluidframework/runtime-definitions": "~2.40.0" + "@fluidframework/container-definitions": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/id-compressor": "~2.41.0", + "@fluidframework/runtime-definitions": "~2.41.0" } }, "node_modules/@fluidframework/datastore/node_modules/uuid": { @@ -2978,82 +2961,76 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], - "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/@fluidframework/devtools": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/devtools/-/devtools-2.40.0.tgz", - "integrity": "sha512-n70v7kCe/X9cLjn10xmlDegyH7+HjnUjjE5uj/21I43JcgVdbBz2OgiGLEuxCr+eQSGPkyK4t/vEJrQH5okjnA==", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/devtools/-/devtools-2.41.0.tgz", + "integrity": "sha512-0BNeSA8NPQPwk1LCTbnDu8HkNRGYsHMZ2gPKsYYZw/jwvyLuifHBfmxSQ1iXzo2NXiVpObsG5QfH3MtS0HQq4g==", "dev": true, - "license": "MIT", "dependencies": { - "@fluidframework/container-definitions": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/devtools-core": "~2.40.0", - "@fluidframework/fluid-static": "~2.40.0" + "@fluidframework/container-definitions": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/devtools-core": "~2.41.0", + "@fluidframework/fluid-static": "~2.41.0" } }, "node_modules/@fluidframework/devtools-core": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/devtools-core/-/devtools-core-2.40.0.tgz", - "integrity": "sha512-5PGgha5+YV9IL5APVlO4wg0swnOs0jhiVk3NWoeRAqBjDJY2FTBs69v6xKmPMIbafNZv2wFpHg9y7BZt4XiQpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.40.0", - "@fluidframework/aqueduct": "~2.40.0", - "@fluidframework/cell": "~2.40.0", - "@fluidframework/container-definitions": "~2.40.0", - "@fluidframework/container-loader": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/counter": "~2.40.0", - "@fluidframework/datastore-definitions": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/map": "~2.40.0", - "@fluidframework/matrix": "~2.40.0", - "@fluidframework/sequence": "~2.40.0", - "@fluidframework/shared-object-base": "~2.40.0", - "@fluidframework/telemetry-utils": "~2.40.0", - "@fluidframework/tree": "~2.40.0" + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/devtools-core/-/devtools-core-2.41.0.tgz", + "integrity": "sha512-E52VKRGhqRquSO+j3SpLf54TwhP1ikwNnCXPN1DgLsADtcmhJelGF7p+kycu+r1ZR8EmjJYFiHOvhs0DszdksQ==", + "dev": true, + "dependencies": { + "@fluid-internal/client-utils": "~2.41.0", + "@fluidframework/aqueduct": "~2.41.0", + "@fluidframework/cell": "~2.41.0", + "@fluidframework/container-definitions": "~2.41.0", + "@fluidframework/container-loader": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/counter": "~2.41.0", + "@fluidframework/datastore-definitions": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/map": "~2.41.0", + "@fluidframework/matrix": "~2.41.0", + "@fluidframework/sequence": "~2.41.0", + "@fluidframework/shared-object-base": "~2.41.0", + "@fluidframework/telemetry-utils": "~2.41.0", + "@fluidframework/tree": "~2.41.0" } }, "node_modules/@fluidframework/driver-base": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/driver-base/-/driver-base-2.40.0.tgz", - "integrity": "sha512-6+YKDg8nsxu70WiHQw3AqbIYp/YkauVEmfEc057OHPHxD6anrUbgRzbIEs8Mzi2Sy+mL7A/fyqqZNwaBZUpTfA==", - "license": "MIT", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/driver-base/-/driver-base-2.41.0.tgz", + "integrity": "sha512-rnkytRzS9xs+zniXjtdDxW0nsMB+FwypyadEbW6rrX1m8zx8SK+l+S7Mzvyen+5WcS4frv25tpar9jUhu2z5cw==", "dependencies": { - "@fluid-internal/client-utils": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/driver-utils": "~2.40.0", - "@fluidframework/telemetry-utils": "~2.40.0" + "@fluid-internal/client-utils": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/driver-utils": "~2.41.0", + "@fluidframework/telemetry-utils": "~2.41.0" } }, "node_modules/@fluidframework/driver-definitions": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/driver-definitions/-/driver-definitions-2.40.0.tgz", - "integrity": "sha512-6OKKPEwiTA7+pS2gl81CEhIRRRPj9swkKRXunA5qolEOKiNJNl5boud4naSMu3BDQfndmifKbzFB5yIILhyPBw==", - "license": "MIT", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/driver-definitions/-/driver-definitions-2.41.0.tgz", + "integrity": "sha512-+DvwFRLDrtnDivPLWn1V+mAQyLWtnY0dEklI8USan8TtYtdma9cZ/Vp3yBFWxJ3FvRRgzuNmWraueNL3kkQ50g==", "dependencies": { - "@fluidframework/core-interfaces": "~2.40.0" + "@fluidframework/core-interfaces": "~2.41.0" } }, "node_modules/@fluidframework/driver-utils": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/driver-utils/-/driver-utils-2.40.0.tgz", - "integrity": "sha512-dq+dXBwZcnJdtV1iV24/MqtmT1ng10XSRj/NeEARguWCOxeW7bkIgFCQZhhsiPWp0O8YGdgyjDH9CqGhkPvsbg==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/telemetry-utils": "~2.40.0", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/driver-utils/-/driver-utils-2.41.0.tgz", + "integrity": "sha512-cfLY09fNIVWbeAmPyGNZrLIR2EFGuLT64sLFnOEt8GBeZoGAvHqMvOuenrpiuKIjmqdqdbg0BYZrkdgESnYX8w==", + "dependencies": { + "@fluid-internal/client-utils": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/telemetry-utils": "~2.41.0", "axios": "^1.8.4", "lz4js": "^0.2.0", "uuid": "^9.0.0" @@ -3067,31 +3044,30 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], - "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/@fluidframework/fluid-static": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/fluid-static/-/fluid-static-2.40.0.tgz", - "integrity": "sha512-CmCB/8Xar0/QWe5O9QAKhdkoDX1LHJiTxjoU1ZaRDpJkauRSrwdzLwDtllUFtmPjJ1Y11fcfwo61VB8GfQWTHA==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.40.0", - "@fluidframework/aqueduct": "~2.40.0", - "@fluidframework/container-definitions": "~2.40.0", - "@fluidframework/container-loader": "~2.40.0", - "@fluidframework/container-runtime": "~2.40.0", - "@fluidframework/container-runtime-definitions": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/datastore-definitions": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/request-handler": "~2.40.0", - "@fluidframework/runtime-definitions": "~2.40.0", - "@fluidframework/runtime-utils": "~2.40.0", - "@fluidframework/shared-object-base": "~2.40.0", - "@fluidframework/telemetry-utils": "~2.40.0" + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/fluid-static/-/fluid-static-2.41.0.tgz", + "integrity": "sha512-RbjrHzsnmqUL87n3ogOJXZTEWMn78DIAJWMi8sy8ueWcCFy/bHeKtm43D01R1aMXHElC69pGEWuNyM0GpSHQTg==", + "dependencies": { + "@fluid-internal/client-utils": "~2.41.0", + "@fluidframework/aqueduct": "~2.41.0", + "@fluidframework/container-definitions": "~2.41.0", + "@fluidframework/container-loader": "~2.41.0", + "@fluidframework/container-runtime": "~2.41.0", + "@fluidframework/container-runtime-definitions": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/datastore-definitions": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/request-handler": "~2.41.0", + "@fluidframework/runtime-definitions": "~2.41.0", + "@fluidframework/runtime-utils": "~2.41.0", + "@fluidframework/shared-object-base": "~2.41.0", + "@fluidframework/telemetry-utils": "~2.41.0" } }, "node_modules/@fluidframework/gitresources": { @@ -3101,15 +3077,14 @@ "license": "MIT" }, "node_modules/@fluidframework/id-compressor": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/id-compressor/-/id-compressor-2.40.0.tgz", - "integrity": "sha512-itBXlCRKjHdg/S58Tdmc9IDisncPCe4XT9vBb5Kn/vD9enJGO5NgqiY9gmmxpHrhcpIoCvgltuSi6Ey7YEbCrQ==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/telemetry-utils": "~2.40.0", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/id-compressor/-/id-compressor-2.41.0.tgz", + "integrity": "sha512-31MgNoRPe8Flf5+5uM28MKjVIYKqcVIlVnSGVY54sVby3ePAWEDcUZkzAKAg55frMSSvHC52ZYBsLBu/wk1UIw==", + "dependencies": { + "@fluid-internal/client-utils": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/telemetry-utils": "~2.41.0", "@tylerbu/sorted-btree-es6": "^1.8.0", "uuid": "^9.0.0" } @@ -3122,49 +3097,46 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], - "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/@fluidframework/map": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/map/-/map-2.40.0.tgz", - "integrity": "sha512-hOLpnA6J4LYF2oOjWUP0PCvymJyMQcd4UXjc0y75oN8C0oCxxgjynPZ/LzG4wPhyWzSUARW956d0oDYLglzssQ==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/datastore-definitions": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/driver-utils": "~2.40.0", - "@fluidframework/merge-tree": "~2.40.0", - "@fluidframework/runtime-definitions": "~2.40.0", - "@fluidframework/runtime-utils": "~2.40.0", - "@fluidframework/shared-object-base": "~2.40.0", - "@fluidframework/telemetry-utils": "~2.40.0", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/map/-/map-2.41.0.tgz", + "integrity": "sha512-Pk3jVt/QcblgFaE7EL3eZFfK5tRIipc3j3wN9ssFfR+r4t5WXrhhgo1Dj1km5Isuugevme/2JF3OgMR/lhlAcg==", + "dependencies": { + "@fluid-internal/client-utils": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/datastore-definitions": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/driver-utils": "~2.41.0", + "@fluidframework/merge-tree": "~2.41.0", + "@fluidframework/runtime-definitions": "~2.41.0", + "@fluidframework/runtime-utils": "~2.41.0", + "@fluidframework/shared-object-base": "~2.41.0", + "@fluidframework/telemetry-utils": "~2.41.0", "path-browserify": "^1.0.1" } }, "node_modules/@fluidframework/matrix": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/matrix/-/matrix-2.40.0.tgz", - "integrity": "sha512-F3TPVYK1wNbrQvJtFvM5JuzSz1jYWVNTFM3dNle2O58HQVr1UMhU3goVIlzycfP/nOYGO0nj5UVoKiogQ2lWBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/datastore-definitions": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/driver-utils": "~2.40.0", - "@fluidframework/merge-tree": "~2.40.0", - "@fluidframework/runtime-definitions": "~2.40.0", - "@fluidframework/runtime-utils": "~2.40.0", - "@fluidframework/shared-object-base": "~2.40.0", - "@fluidframework/telemetry-utils": "~2.40.0", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/matrix/-/matrix-2.41.0.tgz", + "integrity": "sha512-nxW404/I+Re1KEY7kWGJoKfrtQkuteubHlbjjpZe+4JsxCb3aPvbaZmH5XedZj8vdCvixge9idtuWmjUwfgj0Q==", + "dev": true, + "dependencies": { + "@fluid-internal/client-utils": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/datastore-definitions": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/driver-utils": "~2.41.0", + "@fluidframework/merge-tree": "~2.41.0", + "@fluidframework/runtime-definitions": "~2.41.0", + "@fluidframework/runtime-utils": "~2.41.0", + "@fluidframework/shared-object-base": "~2.41.0", + "@fluidframework/telemetry-utils": "~2.41.0", "@tiny-calc/nano": "0.0.0-alpha.5", "double-ended-queue": "^2.1.0-0", "tslib": "^1.10.0" @@ -3174,44 +3146,41 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "license": "0BSD" + "dev": true }, "node_modules/@fluidframework/merge-tree": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/merge-tree/-/merge-tree-2.40.0.tgz", - "integrity": "sha512-qGeTpScS3axkrvGlFYxIHY2jS6M0fPjs0pabykFvsqW59Jyyeg2FDG0VT3chxo3m0ETAVjNXr7zC3cfBjmihkw==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.40.0", - "@fluidframework/container-definitions": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/datastore-definitions": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/runtime-definitions": "~2.40.0", - "@fluidframework/runtime-utils": "~2.40.0", - "@fluidframework/shared-object-base": "~2.40.0", - "@fluidframework/telemetry-utils": "~2.40.0" + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/merge-tree/-/merge-tree-2.41.0.tgz", + "integrity": "sha512-ydsMoN6aYawaetB8xxokaVOedpeBI9QJmnOpDQ7+pMMECAQzyCobwlO1X2Y82zVJhXzqZdbx8Fd0YTg1Dw/WUg==", + "dependencies": { + "@fluid-internal/client-utils": "~2.41.0", + "@fluidframework/container-definitions": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/datastore-definitions": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/runtime-definitions": "~2.41.0", + "@fluidframework/runtime-utils": "~2.41.0", + "@fluidframework/shared-object-base": "~2.41.0", + "@fluidframework/telemetry-utils": "~2.41.0" } }, "node_modules/@fluidframework/odsp-client": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/odsp-client/-/odsp-client-2.40.0.tgz", - "integrity": "sha512-3WYg94YYxHIxLYwwjO2+1POK2xH/MJyS5L52gUoos+JdkCqnzV/uTFCTVv5xeF8gKEErKzDg/x3Q/0qpXXAzyA==", - "license": "MIT", - "dependencies": { - "@fluidframework/container-definitions": "~2.40.0", - "@fluidframework/container-loader": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/fluid-static": "~2.40.0", - "@fluidframework/map": "~2.40.0", - "@fluidframework/odsp-doclib-utils": "~2.40.0", - "@fluidframework/odsp-driver": "~2.40.0", - "@fluidframework/odsp-driver-definitions": "~2.40.0", - "@fluidframework/telemetry-utils": "~2.40.0", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/odsp-client/-/odsp-client-2.41.0.tgz", + "integrity": "sha512-YRn1SAxxGdmR1BPKON6SBlzDtPxz36X+M18mD9qXOPc93id/7LIfTrF+r3f5e/po60BBOs8ovkINZqBcMrhYGQ==", + "dependencies": { + "@fluidframework/container-definitions": "~2.41.0", + "@fluidframework/container-loader": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/fluid-static": "~2.41.0", + "@fluidframework/map": "~2.41.0", + "@fluidframework/odsp-doclib-utils": "~2.41.0", + "@fluidframework/odsp-driver": "~2.41.0", + "@fluidframework/odsp-driver-definitions": "~2.41.0", + "@fluidframework/telemetry-utils": "~2.41.0", "uuid": "^9.0.0" } }, @@ -3229,47 +3198,44 @@ } }, "node_modules/@fluidframework/odsp-doclib-utils": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/odsp-doclib-utils/-/odsp-doclib-utils-2.40.0.tgz", - "integrity": "sha512-K59/l80PaVDlsHsDBQycD+k0txBzHnoO21Kq4jcjR/2H5WmPWVMZAnTSZ3XcAA7q1VlQCmhdzhwn1LVFZ+0Ocw==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/driver-utils": "~2.40.0", - "@fluidframework/odsp-driver-definitions": "~2.40.0", - "@fluidframework/telemetry-utils": "~2.40.0", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/odsp-doclib-utils/-/odsp-doclib-utils-2.41.0.tgz", + "integrity": "sha512-beFOFTkvR51sozmze0Ui0YJY/JNjnN/uVeUPu4W9U+bnZaCaxG8HSx1xrjTRER2xmnNI7K+FTecV3chqK2Y87w==", + "dependencies": { + "@fluid-internal/client-utils": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/driver-utils": "~2.41.0", + "@fluidframework/odsp-driver-definitions": "~2.41.0", + "@fluidframework/telemetry-utils": "~2.41.0", "isomorphic-fetch": "^3.0.0" } }, "node_modules/@fluidframework/odsp-driver": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/odsp-driver/-/odsp-driver-2.40.0.tgz", - "integrity": "sha512-2d0wTFodmlB21/vVgy7VGxj3b8h9cJJn471DkDMOKsMvweiosJYRT0DiCdSZNElbIXscfBpxg3dEEM2zBNuTVg==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/driver-base": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/driver-utils": "~2.40.0", - "@fluidframework/odsp-doclib-utils": "~2.40.0", - "@fluidframework/odsp-driver-definitions": "~2.40.0", - "@fluidframework/telemetry-utils": "~2.40.0", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/odsp-driver/-/odsp-driver-2.41.0.tgz", + "integrity": "sha512-/d+DS+6IXMXJik3eX+hFXsqEUH1GumMfDly1rvbVVSls7lbtgEace6j1HwAAuZnpuAeYFkWSG98uVMmuXkMFpQ==", + "dependencies": { + "@fluid-internal/client-utils": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/driver-base": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/driver-utils": "~2.41.0", + "@fluidframework/odsp-doclib-utils": "~2.41.0", + "@fluidframework/odsp-driver-definitions": "~2.41.0", + "@fluidframework/telemetry-utils": "~2.41.0", "socket.io-client": "~4.7.5", "uuid": "^9.0.0" } }, "node_modules/@fluidframework/odsp-driver-definitions": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/odsp-driver-definitions/-/odsp-driver-definitions-2.40.0.tgz", - "integrity": "sha512-9hOcJ7xjt6r+1tl8v8qvYel/j0nZIyVQcE8mkwkTh99Jky/gbRwCAIXIwjuAf0JrXVUHCSDVcSyUczgPNpwPvA==", - "license": "MIT", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/odsp-driver-definitions/-/odsp-driver-definitions-2.41.0.tgz", + "integrity": "sha512-7ErmRiZ8oXmWVtnru8pN/MIUAoLbhJtxeI7KAuTjFINkCjHNGoKzs46GckLZrEX782bXosGI6pyzSeOL/lZkHA==", "dependencies": { - "@fluidframework/driver-definitions": "~2.40.0" + "@fluidframework/driver-definitions": "~2.41.0" } }, "node_modules/@fluidframework/odsp-driver/node_modules/uuid": { @@ -3280,31 +3246,28 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], - "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/@fluidframework/presence": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/presence/-/presence-2.40.0.tgz", - "integrity": "sha512-iJb+7/KfMEZup1946bD6mvBc/helqVlIYcxBu+bkfHRvcS5wrNOigAnId+tUDo6jZLKnsO26aaYpqJNcS0tpBQ==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.40.0", - "@fluidframework/container-definitions": "~2.40.0", - "@fluidframework/container-loader": "~2.40.0", - "@fluidframework/container-runtime-definitions": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/datastore": "~2.40.0", - "@fluidframework/datastore-definitions": "~2.40.0", - "@fluidframework/fluid-static": "~2.40.0", - "@fluidframework/id-compressor": "~2.40.0", - "@fluidframework/runtime-definitions": "~2.40.0", - "@fluidframework/runtime-utils": "~2.40.0", - "@fluidframework/shared-object-base": "~2.40.0", - "@fluidframework/telemetry-utils": "~2.40.0" + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/presence/-/presence-2.41.0.tgz", + "integrity": "sha512-owLczkm6IrOEbSXhmHHRiMB8WaVqOvZAqIksHeFPDQv9bWar/ZwLkLa5I55en7igQUAUnEZbXLx23ggQcSwH4w==", + "dependencies": { + "@fluid-internal/client-utils": "~2.41.0", + "@fluidframework/container-definitions": "~2.41.0", + "@fluidframework/container-runtime-definitions": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/datastore": "~2.41.0", + "@fluidframework/datastore-definitions": "~2.41.0", + "@fluidframework/fluid-static": "~2.41.0", + "@fluidframework/id-compressor": "~2.41.0", + "@fluidframework/runtime-definitions": "~2.41.0", + "@fluidframework/runtime-utils": "~2.41.0", + "@fluidframework/shared-object-base": "~2.41.0", + "@fluidframework/telemetry-utils": "~2.41.0" } }, "node_modules/@fluidframework/protocol-base": { @@ -3326,32 +3289,30 @@ "license": "MIT" }, "node_modules/@fluidframework/request-handler": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/request-handler/-/request-handler-2.40.0.tgz", - "integrity": "sha512-krJEo1VltcFxL9zml39VU3hRzJRzhb6np4SXD8vSWw6UfnnxtRBtpag3q6pCB+lKvGTO0dCAECvWqh4dvfpbwg==", - "license": "MIT", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/request-handler/-/request-handler-2.41.0.tgz", + "integrity": "sha512-dx0b5y+1wCpkIJjYOV2ZxUhUspaqtzMMQeMEp4hkrNcxFJgVuP/EjZUVthJC2Eqadm8XG3RTOUmkKwMVDA7ICw==", "dependencies": { - "@fluidframework/container-runtime-definitions": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/runtime-definitions": "~2.40.0", - "@fluidframework/runtime-utils": "~2.40.0" + "@fluidframework/container-runtime-definitions": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/runtime-definitions": "~2.41.0", + "@fluidframework/runtime-utils": "~2.41.0" } }, "node_modules/@fluidframework/routerlicious-driver": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/routerlicious-driver/-/routerlicious-driver-2.40.0.tgz", - "integrity": "sha512-y+2dzuQDTZUXg5hn/Fw2DRHByoWu32f/K6f6gbMcQSBP9xKZjBuNoEpBrW3s9flPIAMZErguEmbfdv7ByDE6aw==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/driver-base": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/driver-utils": "~2.40.0", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/routerlicious-driver/-/routerlicious-driver-2.41.0.tgz", + "integrity": "sha512-6BU+Q9NtvQJARkux7WmSjWXufPmK873Jm+SdwlAOSE5A/mjgd9R4GISSj+/Vosnq5HHqVJjNOM5Bq2K1k1kH6A==", + "dependencies": { + "@fluid-internal/client-utils": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/driver-base": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/driver-utils": "~2.41.0", "@fluidframework/server-services-client": "^5.0.0", - "@fluidframework/telemetry-utils": "~2.40.0", + "@fluidframework/telemetry-utils": "~2.41.0", "cross-fetch": "^3.1.5", "json-stringify-safe": "5.0.1", "socket.io-client": "~4.7.5", @@ -3366,58 +3327,54 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], - "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/@fluidframework/runtime-definitions": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/runtime-definitions/-/runtime-definitions-2.40.0.tgz", - "integrity": "sha512-LQil7PPNxA/zc0OZQ8Q10HuE6Vczrt5BoYP++38w/k1yYFS5LI+vajr0LDKpaD1R5Yxg52+dyhzMvsdWmDwVig==", - "license": "MIT", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/runtime-definitions/-/runtime-definitions-2.41.0.tgz", + "integrity": "sha512-+XQSF6gRnYNOSiNsuZk0mlj0EYcTSyH5HNFHzMt1LxTlYy6P4mK5pe6fzrVfEoYRRbL/skASrm/aciRqMin1kw==", "dependencies": { - "@fluidframework/container-definitions": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/id-compressor": "~2.40.0", - "@fluidframework/telemetry-utils": "~2.40.0" + "@fluidframework/container-definitions": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/id-compressor": "~2.41.0", + "@fluidframework/telemetry-utils": "~2.41.0" } }, "node_modules/@fluidframework/runtime-utils": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/runtime-utils/-/runtime-utils-2.40.0.tgz", - "integrity": "sha512-njgzS/FUEQx313Drq0VM3NwQLGancHXwv6HPPhDWATRGliuGlToji23k83+ZXnnSrDN1HIO7EhkD7GEVrxWmAg==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.40.0", - "@fluidframework/container-definitions": "~2.40.0", - "@fluidframework/container-runtime-definitions": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/datastore-definitions": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/driver-utils": "~2.40.0", - "@fluidframework/runtime-definitions": "~2.40.0", - "@fluidframework/telemetry-utils": "~2.40.0" + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/runtime-utils/-/runtime-utils-2.41.0.tgz", + "integrity": "sha512-QyNch3BE2Ewg3gRpwYMC4ZTEplIJIEFNZqUMWBve26bE+mxPZDqgHpNE5f7mquXtmi7Noc/gXOTEKAUarzaRiA==", + "dependencies": { + "@fluid-internal/client-utils": "~2.41.0", + "@fluidframework/container-definitions": "~2.41.0", + "@fluidframework/container-runtime-definitions": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/datastore-definitions": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/driver-utils": "~2.41.0", + "@fluidframework/runtime-definitions": "~2.41.0", + "@fluidframework/telemetry-utils": "~2.41.0" } }, "node_modules/@fluidframework/sequence": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/sequence/-/sequence-2.40.0.tgz", - "integrity": "sha512-FI+ImIZsJPLKTFV3qjayvQCS4RPULN+QrqEEZichi3pD8N7Fe+qvj5Q1yK0WUZMHLQARlT0txtw5FuL4K5l7eA==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/datastore-definitions": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/merge-tree": "~2.40.0", - "@fluidframework/runtime-definitions": "~2.40.0", - "@fluidframework/runtime-utils": "~2.40.0", - "@fluidframework/shared-object-base": "~2.40.0", - "@fluidframework/telemetry-utils": "~2.40.0", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/sequence/-/sequence-2.41.0.tgz", + "integrity": "sha512-DFuFDnkAjsSQ4VF9344RbvfcVObg3w5PXFkeQPqcOzdnO8zxTVaIrUu9w43/nT6VOiQVYtU0iM9G65zTTN0ZRg==", + "dependencies": { + "@fluid-internal/client-utils": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/datastore-definitions": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/merge-tree": "~2.41.0", + "@fluidframework/runtime-definitions": "~2.41.0", + "@fluidframework/runtime-utils": "~2.41.0", + "@fluidframework/shared-object-base": "~2.41.0", + "@fluidframework/telemetry-utils": "~2.41.0", "double-ended-queue": "^2.1.0-0", "uuid": "^9.0.0" } @@ -3430,7 +3387,6 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], - "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -3839,22 +3795,21 @@ } }, "node_modules/@fluidframework/shared-object-base": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/shared-object-base/-/shared-object-base-2.40.0.tgz", - "integrity": "sha512-GnwUyLOQcx3HbkY/ddrzdg0vtMqscCMk/ejZQhCioMW431P/+626gblnLU6a3sKtu8Qp6OJJqp0aZzaqqjuyRQ==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.40.0", - "@fluidframework/container-definitions": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/datastore": "~2.40.0", - "@fluidframework/datastore-definitions": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/id-compressor": "~2.40.0", - "@fluidframework/runtime-definitions": "~2.40.0", - "@fluidframework/runtime-utils": "~2.40.0", - "@fluidframework/telemetry-utils": "~2.40.0", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/shared-object-base/-/shared-object-base-2.41.0.tgz", + "integrity": "sha512-4fknvISYkBdm8iONfdveOZoX5NrcXAWlReTdmlHiY2ovOmPuYMNZslOYBZ5XdfcdJQEBCjE6loX9OEiNJrm+Xg==", + "dependencies": { + "@fluid-internal/client-utils": "~2.41.0", + "@fluidframework/container-definitions": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/datastore": "~2.41.0", + "@fluidframework/datastore-definitions": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/id-compressor": "~2.41.0", + "@fluidframework/runtime-definitions": "~2.41.0", + "@fluidframework/runtime-utils": "~2.41.0", + "@fluidframework/telemetry-utils": "~2.41.0", "uuid": "^9.0.0" } }, @@ -3866,30 +3821,27 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], - "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/@fluidframework/synthesize": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/synthesize/-/synthesize-2.40.0.tgz", - "integrity": "sha512-n04sjV9SaLxVgf5GDdoIAKeUanEQLKvwui+TTn6Wk0icvyikA3/2r92IxIjNeAur7umbiN7bCTnf3Ep9Qt6tGg==", - "license": "MIT", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/synthesize/-/synthesize-2.41.0.tgz", + "integrity": "sha512-L+ndTSG3vW2e7IBY5QSkYChr0JO/484iZjq24dC9aer5kIlhMtHSxNORYkzgPH0cLJXj9Y/xUIHvpKE6TR+v0w==", "dependencies": { - "@fluidframework/core-utils": "~2.40.0" + "@fluidframework/core-utils": "~2.41.0" } }, "node_modules/@fluidframework/telemetry-utils": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/telemetry-utils/-/telemetry-utils-2.40.0.tgz", - "integrity": "sha512-/FIxn47ZCT7SE71h/UdHIFbhs4LtHZULnHIAncQhwtsnZtVxZf04SIvVEelcTlwNgjAA4WYch8HDExPNttxPoQ==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/telemetry-utils/-/telemetry-utils-2.41.0.tgz", + "integrity": "sha512-k+XYr2EI3zeBt/N3GqrYpqxCG5x48BEpN/K4s11HHeJ5xtEdZjwT82dBOdZzJ15/q1eADeQI1kpe4aPRR2jMNQ==", + "dependencies": { + "@fluid-internal/client-utils": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", "debug": "^4.3.4", "uuid": "^9.0.0" } @@ -3908,23 +3860,22 @@ } }, "node_modules/@fluidframework/test-runtime-utils": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/test-runtime-utils/-/test-runtime-utils-2.40.0.tgz", - "integrity": "sha512-Xf6OxXlEVtzVWYTPcrjPkSCXkN863IVfhyD1awpO4cT5Jukyo+uxr3xCR9JiPt3nhqayzMyHSX1DPXXtBjXq6g==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.40.0", - "@fluidframework/container-definitions": "~2.40.0", - "@fluidframework/container-runtime-definitions": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/datastore-definitions": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/id-compressor": "~2.40.0", - "@fluidframework/routerlicious-driver": "~2.40.0", - "@fluidframework/runtime-definitions": "~2.40.0", - "@fluidframework/runtime-utils": "~2.40.0", - "@fluidframework/telemetry-utils": "~2.40.0", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/test-runtime-utils/-/test-runtime-utils-2.41.0.tgz", + "integrity": "sha512-AjkumOP/FhJyLgmQCiUwVn6tEi6trfeKIIedoWo2DP4VczyRADkaSLQaWBAg1f0kZ3NYm/pkXBqrCYvVHHrBUg==", + "dependencies": { + "@fluid-internal/client-utils": "~2.41.0", + "@fluidframework/container-definitions": "~2.41.0", + "@fluidframework/container-runtime-definitions": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/datastore-definitions": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/id-compressor": "~2.41.0", + "@fluidframework/routerlicious-driver": "~2.41.0", + "@fluidframework/runtime-definitions": "~2.41.0", + "@fluidframework/runtime-utils": "~2.41.0", + "@fluidframework/telemetry-utils": "~2.41.0", "jsrsasign": "^11.0.0", "uuid": "^9.0.0" } @@ -3943,22 +3894,21 @@ } }, "node_modules/@fluidframework/tree": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/@fluidframework/tree/-/tree-2.40.0.tgz", - "integrity": "sha512-K2CujqH2BzlTRIZdAS7W2LdkBXhH+FRhl/AFlAwPXRhQOghmzOh/yoGoAw8krVz5tnQKfwULDPrgRr/T4wlZAg==", - "license": "MIT", - "dependencies": { - "@fluid-internal/client-utils": "~2.40.0", - "@fluidframework/container-runtime": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/datastore-definitions": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/id-compressor": "~2.40.0", - "@fluidframework/runtime-definitions": "~2.40.0", - "@fluidframework/runtime-utils": "~2.40.0", - "@fluidframework/shared-object-base": "~2.40.0", - "@fluidframework/telemetry-utils": "~2.40.0", + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@fluidframework/tree/-/tree-2.41.0.tgz", + "integrity": "sha512-qR3qC8OVahBD2cJg9ftNXyauJz5/jilSQjdeyMCHVZPRKduJhstIx3aektyEr8HChA/wYr+K3J8OBvdrCKKwLw==", + "dependencies": { + "@fluid-internal/client-utils": "~2.41.0", + "@fluidframework/container-runtime": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/datastore-definitions": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/id-compressor": "~2.41.0", + "@fluidframework/runtime-definitions": "~2.41.0", + "@fluidframework/runtime-utils": "~2.41.0", + "@fluidframework/shared-object-base": "~2.41.0", + "@fluidframework/telemetry-utils": "~2.41.0", "@sinclair/typebox": "^0.34.13", "@tylerbu/sorted-btree-es6": "^1.8.0", "@types/ungap__structured-clone": "^1.2.0", @@ -3974,7 +3924,6 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], - "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -4506,8 +4455,7 @@ "node_modules/@sinclair/typebox": { "version": "0.34.33", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.33.tgz", - "integrity": "sha512-5HAV9exOMcXRUxo+9iYB5n09XxzCXnfy4VTNW4xnDv+FgjzAGY989C28BIdljKqmF+ZltUwujE3aossvcVtq6g==", - "license": "MIT" + "integrity": "sha512-5HAV9exOMcXRUxo+9iYB5n09XxzCXnfy4VTNW4xnDv+FgjzAGY989C28BIdljKqmF+ZltUwujE3aossvcVtq6g==" }, "node_modules/@socket.io/component-emitter": { "version": "3.1.2", @@ -4862,14 +4810,12 @@ "version": "0.0.0-alpha.5", "resolved": "https://registry.npmjs.org/@tiny-calc/nano/-/nano-0.0.0-alpha.5.tgz", "integrity": "sha512-Hs37tz9ZtvK21/5s4tjt5RBa/PFHKYS0AzvdxiXuSd3+AKQN2ygxw7uwD9j0DIG9qONddg1vIASO77JIGyZzyw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@tylerbu/sorted-btree-es6": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/@tylerbu/sorted-btree-es6/-/sorted-btree-es6-1.8.0.tgz", - "integrity": "sha512-qkwgE0G5OGn7F+1fMkFZLwyjc99xCy4kmQ8p7N0Jj540HD6xU0jTPjcqELogH4f5YGMPXLqd8sQ7uOYC0QRBeg==", - "license": "MIT" + "integrity": "sha512-qkwgE0G5OGn7F+1fMkFZLwyjc99xCy4kmQ8p7N0Jj540HD6xU0jTPjcqELogH4f5YGMPXLqd8sQ7uOYC0QRBeg==" }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -4989,8 +4935,7 @@ "name": "@types/events", "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.3.tgz", - "integrity": "sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==", - "license": "MIT" + "integrity": "sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==" }, "node_modules/@types/ioredis-mock": { "version": "8.2.5", @@ -5090,8 +5035,7 @@ "node_modules/@types/ungap__structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@types/ungap__structured-clone/-/ungap__structured-clone-1.2.0.tgz", - "integrity": "sha512-ZoaihZNLeZSxESbk9PUAPZOlSpcKx81I1+4emtULDVmBLkYutTcMlCj2K9VNlf9EWODxdO6gkAqEaLorXwZQVA==", - "license": "MIT" + "integrity": "sha512-ZoaihZNLeZSxESbk9PUAPZOlSpcKx81I1+4emtULDVmBLkYutTcMlCj2K9VNlf9EWODxdO6gkAqEaLorXwZQVA==" }, "node_modules/@types/ws": { "version": "6.0.4", @@ -5325,8 +5269,7 @@ "node_modules/@ungap/structured-clone": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "license": "ISC" + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==" }, "node_modules/@vitejs/plugin-react": { "version": "4.3.4", @@ -6635,7 +6578,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", - "license": "MIT", "dependencies": { "node-fetch": "^2.7.0" } @@ -7055,7 +6997,6 @@ "version": "6.5.4", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.4.tgz", "integrity": "sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==", - "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", @@ -7068,7 +7009,6 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -7936,22 +7876,21 @@ "license": "ISC" }, "node_modules/fluid-framework": { - "version": "2.40.0", - "resolved": "https://registry.npmjs.org/fluid-framework/-/fluid-framework-2.40.0.tgz", - "integrity": "sha512-bmGJKJQv++XO0A0UNT7li4bnq22/foZEvhd8SsLN8VcmzOB5jQ6lR0RJUUijhMAGjW/pgJ9mKVCCV8zZ8BKuJQ==", - "license": "MIT", - "dependencies": { - "@fluidframework/container-definitions": "~2.40.0", - "@fluidframework/container-loader": "~2.40.0", - "@fluidframework/core-interfaces": "~2.40.0", - "@fluidframework/core-utils": "~2.40.0", - "@fluidframework/driver-definitions": "~2.40.0", - "@fluidframework/fluid-static": "~2.40.0", - "@fluidframework/map": "~2.40.0", - "@fluidframework/runtime-utils": "~2.40.0", - "@fluidframework/sequence": "~2.40.0", - "@fluidframework/shared-object-base": "~2.40.0", - "@fluidframework/tree": "~2.40.0" + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/fluid-framework/-/fluid-framework-2.41.0.tgz", + "integrity": "sha512-z5R9+Gw8qnRUduF5UWRQv1gJ4ACGi6W46ouotuuKdUMYt7NXrKQX5sE6CxJmHvTYfkhCOCpVyVrLkj0y7LrgBA==", + "dependencies": { + "@fluidframework/container-definitions": "~2.41.0", + "@fluidframework/container-loader": "~2.41.0", + "@fluidframework/core-interfaces": "~2.41.0", + "@fluidframework/core-utils": "~2.41.0", + "@fluidframework/driver-definitions": "~2.41.0", + "@fluidframework/fluid-static": "~2.41.0", + "@fluidframework/map": "~2.41.0", + "@fluidframework/runtime-utils": "~2.41.0", + "@fluidframework/sequence": "~2.41.0", + "@fluidframework/shared-object-base": "~2.41.0", + "@fluidframework/tree": "~2.41.0" } }, "node_modules/fn.name": { @@ -9075,7 +9014,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", - "license": "MIT", "dependencies": { "node-fetch": "^2.6.1", "whatwg-fetch": "^3.4.1" @@ -9941,8 +9879,7 @@ "node_modules/lz4js": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/lz4js/-/lz4js-0.2.0.tgz", - "integrity": "sha512-gY2Ia9Lm7Ep8qMiuGRhvUq0Q7qUereeldZPP1PMEJxPtEWHJLqw9pgX68oHajBH0nzJK4MaZEA/YNV3jT8u8Bg==", - "license": "ISC" + "integrity": "sha512-gY2Ia9Lm7Ep8qMiuGRhvUq0Q7qUereeldZPP1PMEJxPtEWHJLqw9pgX68oHajBH0nzJK4MaZEA/YNV3jT8u8Bg==" }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -10228,7 +10165,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -11466,7 +11402,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/semver-ts/-/semver-ts-1.0.3.tgz", "integrity": "sha512-RMf2+Nbd0Hiq5u8LADzqnSRb09Vu1UKOLFw9P9nm8XY3JPeFjv3DLVYBZjPWFHUxBVz7ktIVGR3xFjYilHlXng==", - "license": "ISC", "engines": { "node": ">=0.10.0" } @@ -11849,7 +11784,6 @@ "version": "4.7.5", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz", "integrity": "sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==", - "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", @@ -11864,7 +11798,6 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -12468,8 +12401,7 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/triple-beam": { "version": "1.4.1", @@ -12979,8 +12911,7 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { "version": "5.98.0", @@ -13070,14 +13001,12 @@ "node_modules/whatwg-fetch": { "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "license": "MIT" + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" diff --git a/package.json b/package.json index 80c7bd6..a4097ad 100644 --- a/package.json +++ b/package.json @@ -28,11 +28,11 @@ "@azure/msal-browser": "^3.28.0", "@fluentui/react-components": "^9.61.6", "@fluentui/react-icons": "^2.0.292", - "@fluidframework/azure-client": "^2.40.0", - "@fluidframework/odsp-client": "^2.40.0", - "@fluidframework/presence": "^2.40.0", - "@fluidframework/telemetry-utils": "^2.40.0", - "@fluidframework/test-runtime-utils": "^2.40.0", + "@fluidframework/azure-client": "^2.41.0", + "@fluidframework/odsp-client": "^2.41.0", + "@fluidframework/presence": "^2.41.0", + "@fluidframework/telemetry-utils": "^2.41.0", + "@fluidframework/test-runtime-utils": "^2.41.0", "@microsoft/microsoft-graph-client": "^3.0.7", "@tailwindcss/vite": "^4.0.9", "@tanstack/react-table": "^8.20.6", @@ -40,7 +40,7 @@ "@vitejs/plugin-react": "^4.3.4", "axios": "^1.7.9", "dotenv": "^16.4.7", - "fluid-framework": "^2.40.0", + "fluid-framework": "^2.41.0", "hashids": "^2.2.10", "jsrsasign": "^11.1.0", "react": "^18.3.1", @@ -53,9 +53,9 @@ "devDependencies": { "@eslint/eslintrc": "^3.2.0", "@eslint/js": "^9.18.0", - "@fluidframework/azure-local-service": "^2.40.0", + "@fluidframework/azure-local-service": "^2.41.0", "@fluidframework/build-common": "^2.0.3", - "@fluidframework/devtools": "^2.40.0", + "@fluidframework/devtools": "^2.41.0", "@microsoft/microsoft-graph-types": "^2.40.0", "@playwright/test": "^1.49.1", "@types/debug": "^4.1.7", diff --git a/src/app_load.tsx b/src/app_load.tsx index 1c55b1b..e8e5220 100644 --- a/src/app_load.tsx +++ b/src/app_load.tsx @@ -3,7 +3,7 @@ import { AzureClient } from "@fluidframework/azure-client"; import React from "react"; import { createRoot } from "react-dom/client"; import { ReactApp } from "./react/ux.js"; -import { appTreeConfiguration, FluidTable, hintValues } from "./schema/app_schema.js"; +import { appTreeConfiguration, Table as FluidTable, hintValues } from "./schema/app_schema.js"; import { createUndoRedoStacks } from "./utils/undo.js"; import { containerSchema } from "./schema/container_schema.js"; import { loadFluidData } from "./infra/fluid.js"; @@ -29,7 +29,7 @@ export async function loadApp(props: { // Create an array of rows to be used in the table const rows = new Array(10).fill(null).map(() => { - return { _cells: [], props: null }; + return { cells: {} }; }); // Initialize the SharedTree DDSes @@ -40,29 +40,34 @@ export async function loadApp(props: { rows: rows, columns: [ { - name: "String", - hint: hintValues.string, - props: null, + props: { + label: "String", + hint: hintValues.string, + }, }, { - name: "Number", - hint: hintValues.number, - props: null, + props: { + label: "Number", + hint: hintValues.number, + }, }, { - name: "Boolean", - hint: hintValues.boolean, - props: null, + props: { + label: "Boolean", + hint: hintValues.boolean, + }, }, { - name: "Date", - hint: hintValues.date, - props: null, + props: { + label: "Date", + hint: hintValues.date, + }, }, { - name: "Vote", - hint: hintValues.vote, - props: null, + props: { + label: "Vote", + hint: hintValues.vote, + }, }, ], }), diff --git a/src/react/buttonux.tsx b/src/react/buttonux.tsx index 2052ab1..b248cc4 100644 --- a/src/react/buttonux.tsx +++ b/src/react/buttonux.tsx @@ -6,9 +6,9 @@ import React, { JSX, useEffect } from "react"; import { DateTime, - FluidColumn, - FluidRow, - FluidTable, + TableColumn as FluidColumn, + TableRow as FluidRow, + Table as FluidTable, HintValues, hintValues, } from "../schema/app_schema.js"; @@ -71,11 +71,12 @@ export function NewEmptyRowButton(props: { const handleClick = (e: React.MouseEvent) => { e.stopPropagation(); const lastSelectedRow = getLastSelectedRow(table, selection); - const row = table.createDetachedRow(); + const row = new FluidRow({ cells: {} }); if (lastSelectedRow !== undefined) { - table.insertRows({ rows: [row], index: lastSelectedRow.index + 1 }); + const lastSelectedRowIndex = props.table.rows.indexOf(lastSelectedRow); + table.insertRow({ row, index: lastSelectedRowIndex + 1 }); } else { - table.insertRows({ rows: [row], index: table.rows.length }); + table.insertRow({ row }); } }; return ( @@ -101,9 +102,10 @@ export function NewRowButton(props: { const row = getRowWithValues(props.table); if (lastSelectedRow !== undefined) { - props.table.insertRows({ index: lastSelectedRow.index + 1, rows: [row] }); + const lastSelectedRowIndex = props.table.rows.indexOf(lastSelectedRow); + props.table.insertRow({ row, index: lastSelectedRowIndex + 1 }); } else { - props.table.insertRows({ index: props.table.rows.length, rows: [row] }); + props.table.insertRow({ row }); } }); }; @@ -142,23 +144,20 @@ export function NewManysRowsButton(props: { table: FluidTable }): JSX.Element { } const getRowWithValues = (table: FluidTable): FluidRow => { - const row = table.createDetachedRow(); + const row = new FluidRow({ cells: {} }); // Iterate through all the columns and add a random value for the new row // If the column is a number, we will add a random number, otherwise we will add a random string // If the column is a boolean, we will add a random boolean for (const column of table.columns) { - const fluidColumn = table.getColumn(column.id); - const hint = fluidColumn.hint; - - switch (hint) { + switch (column.props.hint) { case hintValues.string: - row.setCell(fluidColumn, Math.random().toString(36).substring(7)); + row.setCell(column, Math.random().toString(36).substring(7)); break; case hintValues.number: - row.setCell(fluidColumn, Math.floor(Math.random() * 1000)); + row.setCell(column, Math.floor(Math.random() * 1000)); break; case hintValues.boolean: - row.setCell(fluidColumn, Math.random() > 0.5); + row.setCell(column, Math.random() > 0.5); break; case hintValues.date: { // Add a random date @@ -169,13 +168,13 @@ const getRowWithValues = (table: FluidTable): FluidRow => { const dateTime = new DateTime({ raw: date.getTime() }); return dateTime; }; - row.setCell(fluidColumn, getDate()); + row.setCell(column, getDate()); break; } case hintValues.vote: break; default: // Add a random string - row.setCell(fluidColumn, Math.random().toString(36).substring(7)); + row.setCell(column, Math.random().toString(36).substring(7)); break; } } @@ -194,43 +193,53 @@ export function NewColumnButton(props: { table: FluidTable }): JSX.Element { e.stopPropagation(); const index = props.table.columns.length + 1; - const name = `Column ${index.toString()}`; + const label = `Column ${index.toString()}`; // Add a new column to the table if (index % 5 === 1) { table.insertColumn({ - name, - hint: hintValues.string, - index: table.columns.length, - props: null, + column: { + props: { + label, + hint: hintValues.string, + }, + }, }); } else if (index % 5 === 2) { table.insertColumn({ - name, - hint: hintValues.number, - index: table.columns.length, - props: null, + column: { + props: { + label, + hint: hintValues.number, + }, + }, }); } else if (index % 5 === 3) { table.insertColumn({ - name, - hint: hintValues.boolean, - index: table.columns.length, - props: null, + column: { + props: { + label, + hint: hintValues.boolean, + }, + }, }); } else if (index % 5 === 4) { table.insertColumn({ - name, - hint: hintValues.vote, - index: table.columns.length, - props: null, + column: { + props: { + label, + hint: hintValues.vote, + }, + }, }); } else { table.insertColumn({ - name, - hint: hintValues.date, - index: table.columns.length, - props: null, + column: { + props: { + label, + hint: hintValues.date, + }, + }, }); } }; @@ -277,10 +286,11 @@ export function MoveSelectedRowsButton(props: { for (const rowId of selectedRows) { const row = table.getRow(rowId); if (row !== undefined && Tree.status(row) === TreeStatus.InDocument) { + const rowIndex = table.rows.indexOf(row); if (up) { - row.moveTo(row.index - 1); + table.rows.moveToIndex(rowIndex - 1, rowIndex); } else { - row.moveTo(row.index + 1); + table.rows.moveToIndex(rowIndex + 1, rowIndex); } } } @@ -335,9 +345,7 @@ export function MoveSelectedColumnsButton(props: { if (selectedColumns.length === 0) { const selectedCells = getSelected(selection, "cell"); if (selectedCells.length > 0) { - const column = table.getColumnByCellId( - selectedCells[0].id as `${string}_${string}`, - ); + const column = table.getColumn(selectedCells[0].id); if (column !== undefined && Tree.status(column) === TreeStatus.InDocument) { selectedColumns.push({ id: column.id, type: "column" }); } @@ -348,10 +356,11 @@ export function MoveSelectedColumnsButton(props: { for (const c of selectedColumns) { const column = table.getColumn(c.id); if (column !== undefined && Tree.status(column) === TreeStatus.InDocument) { + const currentIndex = table.columns.indexOf(column); if (left) { - column.moveTo(column.index - 1); + table.columns.moveToIndex(currentIndex - 1, currentIndex); } else { - column.moveTo(column.index + 1); + table.columns.moveToIndex(currentIndex + 1, currentIndex); } } } @@ -403,7 +412,7 @@ export function DeleteSelectedRowsButton(props: { const rowsToDelete = selectedRows .map((rowId) => table.getRow(rowId)) .filter((row): row is FluidRow => row !== undefined); - table.deleteRows(rowsToDelete); + table.removeRows(rowsToDelete); // Clear the selection selection.clearSelection(); }; @@ -424,7 +433,7 @@ export function ColumnTypeDropdown(props: { column: FluidColumn }): JSX.Element const { column } = props; const [checkedValues, setCheckedValues] = React.useState>({ - type: [column.hint ?? ""], + type: [column.props.hint ?? ""], }); const onChange: MenuProps["onCheckedValueChange"] = ( e: React.MouseEvent, @@ -433,7 +442,10 @@ export function ColumnTypeDropdown(props: { column: FluidColumn }): JSX.Element setCheckedValues((s) => ({ ...s, [name]: checkedItems })); }; - if (column.cells.size !== 0) return <>; + const cells = [...column.getCells()]; + if (cells.length > 0) { + return <>; + } return ( { e.stopPropagation(); - props.table.deleteAllRows(); + props.table.removeAllRows(); }; return ( { - column.name = e.target.value; + column.props.label = e.target.value; }} > ); @@ -118,7 +123,7 @@ export function CellInputDate(props: { if (isNaN(Date.parse(e.target.value))) { if (fluidCell !== undefined) { if (Tree.is(fluidCell, DateTime)) { - row.setCell(column, undefined); + row.removeCell(column); return; } } diff --git a/src/react/tableux.tsx b/src/react/tableux.tsx index b969c2b..620f47a 100644 --- a/src/react/tableux.tsx +++ b/src/react/tableux.tsx @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ import { ColumnDef, createColumnHelper, @@ -15,24 +14,25 @@ import { SortingFn, } from "@tanstack/react-table"; import React, { JSX, useState, useEffect, useContext } from "react"; -import { - DateTime, - Vote, - FluidTable, - FluidRow, - FluidColumn, - typeDefinition, -} from "../schema/app_schema.js"; import { Tree } from "fluid-framework"; import { useVirtualizer, VirtualItem, Virtualizer } from "@tanstack/react-virtual"; -import { ColumnTypeDropdown, DeleteButton, IconButton } from "./buttonux.js"; import { ArrowSortDownFilled, ArrowSortFilled, ArrowSortUpFilled, ReOrderDotsVertical16Filled, } from "@fluentui/react-icons"; + +import { + DateTime, + Vote, + Table as FluidTable, + TableRow as FluidRow, + TableColumn as FluidColumn, + CellValueType as FluidCell, +} from "../schema/app_schema.js"; import { SelectionType } from "../utils/selection.js"; +import { ColumnTypeDropdown, DeleteButton, IconButton } from "./buttonux.js"; import { CellInputBoolean, CellInputNumber, @@ -53,7 +53,7 @@ export function TableView(props: { fluidTable: FluidTable }): JSX.Element { return row; }), ); - const [columns, setColumns] = useState[]>( + const [columns, setColumns] = useState[]>( updateColumnData(fluidTable.columns.map((column) => column)), ); @@ -152,7 +152,12 @@ export function TableHeaderView(props: { fluidTable: FluidTable; }): JSX.Element { const { header, fluidTable } = props; + const fluidColumn = fluidTable.getColumn(header.column.id); + if (fluidColumn === undefined) { + throw new Error("Column not found"); + } + const [, setInval] = useState(0); // used to force a re-render of the header const selection = useContext(PresenceContext).selection; // Get the selection manager from context @@ -240,9 +245,10 @@ export function SortIndicator(props: { sorted: false | SortDirection }): JSX.Ele export function TableBodyView(props: { table: Table; + fluidTable: FluidTable; tableContainerRef: React.RefObject; }): JSX.Element { - const { table, tableContainerRef } = props; + const { fluidTable, table, tableContainerRef } = props; const { rows } = table.getRowModel(); const rowVirtualizer = useVirtualizer({ @@ -274,6 +280,13 @@ export function TableBodyView(props: { row={row} virtualRow={virtualRow} rowVirtualizer={rowVirtualizer} + getFluidColumn={(id) => { + const column = fluidTable.getColumn(id); + if (column === undefined) { + throw new Error(`Column "${id}" not found`); + } + return column; + }} {...props} // Pass the user prop to the TableRowView /> ); @@ -286,6 +299,7 @@ export function TableRowView(props: { row: Row; virtualRow: VirtualItem; rowVirtualizer: Virtualizer; + getFluidColumn: (columnId: string) => FluidColumn; }): JSX.Element { const { row, virtualRow, rowVirtualizer } = props; const [, setInval] = useState(0); // used to force a re-render of the row @@ -330,7 +344,7 @@ export function TableRowView(props: { ) : ( } + cell={cell as Cell} {...props} // Pass the user prop to the TableCellView /> ), @@ -379,8 +393,11 @@ export function IndexCellView(props: { rowId: string }): JSX.Element { ); } -export function TableCellView(props: { cell: Cell }): JSX.Element { - const { cell } = props; +export function TableCellView(props: { + cell: Cell; + getFluidColumn: (columnId: string) => FluidColumn; +}): JSX.Element { + const { cell, getFluidColumn } = props; const selection = useContext(PresenceContext).selection; // Get the selection manager from context @@ -402,16 +419,19 @@ export function TableCellView(props: { cell: Cell }): JSX.E className={`flex p-1 border-collapse border-r-2`} > - + ); } -export function TableCellViewContent(props: { cell: Cell }): JSX.Element { - const { cell } = props; +export function TableCellViewContent(props: { + cell: Cell; + getFluidColumn: (columnId: string) => FluidColumn; +}): JSX.Element { + const { cell, getFluidColumn } = props; const fluidRow = cell.row.original; - const fluidColumn = fluidRow.table.getColumn(cell.column.id); - const value = fluidRow.getCell(fluidColumn); + const fluidColumn = getFluidColumn(cell.column.id); + const value = fluidRow.getCell(cell.column.id); const [, setInval] = useState(0); // used to force a re-render of the cell const users = useContext(PresenceContext).users; @@ -427,7 +447,7 @@ export function TableCellViewContent(props: { cell: Cell }) }, []); // Only run this effect once when the component mounts // Switch on the hint of the column to determine the type of input to display - switch (fluidColumn.hint) { + switch (fluidColumn.props.hint) { case "boolean": return ( }) } export function PresenceIndicator(props: { - item: Cell | Header | Row; + item: Cell | Header | Row; type: SelectionType; }): JSX.Element { const { item, type } = props; @@ -546,15 +566,13 @@ function PresenceBox(props: { color: string; hidden: boolean; isRow: boolean }): } } -export type cellValue = typeDefinition; // Define the allowed cell value types - const updateColumnData = (columnsArray: FluidColumn[]) => { // Create a column helper based on the columns in the table const columnHelper = createColumnHelper(); // Create an array of ColumnDefs based on the columns in the table using // the column helper - const headerArray: ColumnDef[] = []; + const headerArray: ColumnDef[] = []; // Add the index column const d = columnHelper.display({ id: "index", @@ -565,13 +583,22 @@ const updateColumnData = (columnsArray: FluidColumn[]) => { columnsArray.forEach((column) => { const sortingConfig = getSortingConfig(column); headerArray.push( - columnHelper.accessor((row) => row.cells[column.id], { - id: column.id, - header: column.name, - sortingFn: sortingConfig.fn, - sortDescFirst: sortingConfig.desc, - sortUndefined: "last", - }), + columnHelper.accessor( + (row) => { + const cell: FluidCell | undefined = row.getCell(column.id); + if (cell === undefined) { + throw new Error("Cell not found"); + } + return cell; + }, + { + id: column.id, + header: column.props.label, + sortingFn: sortingConfig.fn, + sortDescFirst: sortingConfig.desc, + sortUndefined: "last", + }, + ), ); }); @@ -642,18 +669,18 @@ const voteSortingFn: SortingFn = ( const getSortingConfig = ( column: FluidColumn, ): { fn: SortingFnOption | undefined; desc: boolean } => { - if (column.hint === "boolean") { + if (column.props.hint === "boolean") { return { fn: "basic", desc: false }; - } else if (column.hint === "number") { + } else if (column.props.hint === "number") { return { fn: "alphanumeric", desc: true }; - } else if (column.hint === "string") { + } else if (column.props.hint === "string") { return { fn: "alphanumeric", desc: false }; - } else if (column.hint === "date") { + } else if (column.props.hint === "date") { return { fn: dateSortingFn, desc: false }; - } else if (column.hint === "vote") { + } else if (column.props.hint === "vote") { return { fn: voteSortingFn, desc: true }; } else { - console.error("Unknown column type", "Hint:", column.hint); + console.error("Unknown column type", "Hint:", column.props.hint); return { fn: "basic", desc: false }; } }; diff --git a/src/react/ux.tsx b/src/react/ux.tsx index cfb2474..d9d9526 100644 --- a/src/react/ux.tsx +++ b/src/react/ux.tsx @@ -4,7 +4,7 @@ */ import React, { JSX, useContext, useEffect, useState } from "react"; -import { FluidTable } from "../schema/app_schema.js"; +import { Table as FluidTable } from "../schema/app_schema.js"; import "../output.css"; import { IFluidContainer, Tree, TreeView } from "fluid-framework"; import { Canvas } from "./canvasux.js"; diff --git a/src/schema/app_schema.ts b/src/schema/app_schema.ts index f3f4907..2c26766 100644 --- a/src/schema/app_schema.ts +++ b/src/schema/app_schema.ts @@ -3,22 +3,21 @@ * Licensed under the MIT License. */ +import { TreeViewConfiguration, Tree } from "fluid-framework"; +import { SchemaFactoryAlpha } from "fluid-framework/alpha"; import { - TreeViewConfiguration, - SchemaFactory, + InsertableTreeNodeFromImplicitAllowedTypes, + TableSchema, TreeNodeFromImplicitAllowedTypes, - NodeFromSchema, - Tree, TreeStatus, -} from "fluid-framework"; -import { Table } from "./table_schema.js"; +} from "@fluidframework/tree/internal"; // Schema is defined using a factory object that generates classes for objects as well // as list and map nodes. // Include a UUID to guarantee that this schema will be uniquely identifiable. // As this schema uses a recursive type, the beta SchemaFactoryRecursive is used instead of just SchemaFactory. -const sf = new SchemaFactory("fc1db2e8-0a00-11ee-be56-0242ac120002"); +const sf = new SchemaFactoryAlpha("fc1db2e8-0a00-11ee-be56-0242ac120002"); /** * A SharedTree object date-time @@ -103,52 +102,45 @@ export class Vote extends sf.object("Vote", { } } -export type typeDefinition = TreeNodeFromImplicitAllowedTypes; -const schemaTypes = [sf.string, sf.number, sf.boolean, DateTime, Vote] as const; - -const tableFactory = new SchemaFactory(sf.scope + "/table1"); -export class FluidTable extends Table({ - sf: tableFactory, - schemaTypes, +const Cell = [sf.string, sf.number, sf.boolean, DateTime, Vote] as const; +export type CellValueType = TreeNodeFromImplicitAllowedTypes; +export type CellInsertableType = InsertableTreeNodeFromImplicitAllowedTypes; + +export class TableColumn extends TableSchema.column({ + schemaFactory: sf, + cell: Cell, + props: sf.object("ColumnProps", { + label: sf.string, + hint: sf.string, + }), +}) {} + +export class TableRow extends TableSchema.row({ + schemaFactory: sf, + cell: Cell, +}) {} + +export class Table extends TableSchema.table({ + schemaFactory: sf, + row: TableRow, + column: TableColumn, + cell: Cell, }) { - /** - * Get a cell by the synthetic id - * @param id The synthetic id of the cell - */ - getColumnByCellId(id: `${string}_${string}`) { - const [, columnId] = id.split("_"); - const column = this.getColumn(columnId); - if (column === undefined) { - return undefined; - } - return column; - } - - /** - * Create a Row before inserting it into the table - * */ - createDetachedRow(): FluidRow { - return new FluidTable.Row({ _cells: {}, props: null }); - } - /** * Delete a column and all of its cells * @param column The column to delete */ - deleteColumn(column: FluidColumn): void { + deleteColumn(column: TableColumn): void { if (Tree.status(column) !== TreeStatus.InDocument) return; Tree.runTransaction(this, () => { for (const row of this.rows) { - row.deleteCell(column); + row.removeCell(column); } this.removeColumn(column); }); } } -export type FluidRow = NodeFromSchema; -export type FluidColumn = NodeFromSchema; - export type HintValues = (typeof hintValues)[keyof typeof hintValues]; export const hintValues = { string: "string", @@ -164,5 +156,5 @@ export const hintValues = { * */ export const appTreeConfiguration = new TreeViewConfiguration( // Schema for the root - { schema: FluidTable }, + { schema: Table }, ); diff --git a/src/schema/table_schema.ts b/src/schema/table_schema.ts deleted file mode 100644 index ffe1222..0000000 --- a/src/schema/table_schema.ts +++ /dev/null @@ -1,374 +0,0 @@ -import { - TreeNodeFromImplicitAllowedTypes, - Tree, - SchemaFactory, - InsertableTreeNodeFromImplicitAllowedTypes, - TreeNodeSchema, - TreeArrayNode, -} from "fluid-framework"; - -// Schema is defined using a factory object that generates classes for objects as well -// as list and map nodes. - -export function Table< - TCell extends readonly TreeNodeSchema[], - TColumnProps extends readonly TreeNodeSchema[], - TRowProps extends readonly TreeNodeSchema[], - Scope extends string | undefined, ->(props: { - sf: SchemaFactory; - schemaTypes: TCell; - columnProps?: TColumnProps; - rowProps?: TRowProps; -}) { - // Create a new table based on the SharedTree schema in this file - // The table will be empty and will have no columns - // The types allowed in the table are defined in the schemaTypes array - // The table will be initialized with the types allowed in the table - - const { sf, schemaTypes, columnProps, rowProps } = props; - - type CellValueType = TreeNodeFromImplicitAllowedTypes; - type CellInsertableType = InsertableTreeNodeFromImplicitAllowedTypes; - - /** - * The Row schema - this is a map of Cells where the key is the column id - */ - class Row extends sf.object("Row", { - id: sf.identifier, - _cells: sf.map(schemaTypes), // The keys of this map are the column ids - this would ideally be private - props: rowProps ?? sf.null, - }) { - /** - * Property getter to get the cells in the row - * @returns The cells in the row as an object where the keys are the column ids - * and the values are the cell values - includes the default value of the column if the cell is undefined - * This is used to get the cells in the row for the table view - */ - get cells(): Record { - const cells: Record = {}; - // Iterate over the columns in the table and get the cell values - for (const column of this.table.columns) { - // Get the cell value from the row - const cellValue = this.getCell(column); - // If the cell value is undefined, set it to the default value of the column - if (cellValue === undefined) { - cells[column.id] = undefined; - } else { - cells[column.id] = cellValue; - } - } - // Return the cells - return cells; - } - - /** Get a cell by the column - * @param column The column - * @returns The cell if it exists, otherwise undefined - */ - getCell(column: Column): CellValueType | undefined { - return this._cells.get(column.id) as CellValueType | undefined; - } - - /** - * Set the value of a cell in the row - * @param column The column - * @param value The value to set - */ - setCell(column: Column, value: CellInsertableType | undefined): void { - this._cells.set(column.id, value); - } - - /** - * Delete a cell from the row - * @param column The column - */ - deleteCell(column: Column): void { - if (!this._cells.has(column.id)) return; - this._cells.delete(column.id); - } - - /** - * Move a row to a new location - * @param index The index to move the row to - */ - moveTo(index: number): void { - const rows = this.table.rows; - if (index > this.index) { - index += 1; // If the index is greater than the current index, move it to the right - } - - // Make sure the index is within the bounds of the table - if (index < 0 && this.index > 0) { - rows.moveToStart(this.index); - return; - } - if (index > rows.length - 1 && this.index < rows.length - 1) { - rows.moveToEnd(this.index); - return; - } - if (index < 0 || index >= rows.length) { - return; // If the index is out of bounds, do nothing - } - rows.moveToIndex(index, this.index); - } - - /** - * Get the parent Table - */ - get table(): Table { - const parent = Tree.parent(this); - if (parent) { - const grandparent = Tree.parent(parent); - if (grandparent instanceof Table) { - return grandparent; - } - } - throw new Error("Row is not in a table"); - } - - /** - * Get the index of the row in the table - * @returns The index of the row in the table - */ - get index(): number { - const rows = this.table?.rows; - if (rows) { - return rows.indexOf(this); - } - throw new Error("Row is not in a table"); - } - - /** - * Get the synthetic id of a cell in the row by the column. - * This is the id of the column that the cell is in combined - * with the id of the row that the cell is in in the format of rowId_columnId - * This is used to identify the cell in the table - * @param column The column - */ - getCellId(column: Column): `${string}_${string}` { - const columnId = column.id; - const rowId = this.id; - return `${rowId}_${columnId}`; - } - } - /** - * The Column schema - this can include more properties as needed * - */ - - class Column extends sf.object("Column", { - id: sf.identifier, - name: sf.string, - hint: sf.optional(sf.string), - props: columnProps ?? sf.null, - }) { - /** - * Get the parent Table - */ - get table(): Table { - const parent = Tree.parent(this); - if (parent) { - const grandparent = Tree.parent(parent); - if (grandparent instanceof Table) { - return grandparent; - } - } - throw new Error("Column is not in a table"); - } - - /** - * Get all the hydrated cells in this column and return them as a map of rowId to cell value - * @returns The cells in the column as a map of rowId to cell value - */ - get cells(): Map { - const cells: Map = new Map(); - // If the column is not in a table, return an empty map - if (!this.table) { - return cells; - } - // If the table has no rows, return an empty map - if (this.table.rows.length === 0) { - return cells; - } - // Get the rows that contain data for this column - const rows = this.table.rows.filter((row) => row.getCell(this) !== undefined); - // If there are rows with data for this column, put them in the map - for (const row of rows) { - // Get the cell value from the row - const cellValue = row.getCell(this); - if (cellValue !== undefined) { - cells.set(row.id, cellValue); - } - } - // Return the cells - return cells; - } - - /** - * Get the index of the column in the table - * @returns The index of the column in the table - */ - get index(): number { - const columns = this.table?.columns; - if (columns) { - return columns.indexOf(this); - } - throw new Error("Column is not in a table"); - } - - /** - * Move a column to a new location - * @param index The index to move the column to - */ - moveTo(index: number): void { - const columns = this.table.columns; - if (index > this.index) { - index += 1; // If the index is greater than the current index, move it to the right - } - - // Make sure the index is within the bounds of the table - if (index < 0 && this.index > 0) { - columns.moveToStart(this.index); - return; - } - if (index > columns.length - 1 && this.index < columns.length - 1) { - columns.moveToEnd(this.index); - return; - } - if (index < 0 || index >= columns.length) { - return; // If the index is out of bounds, do nothing - } - columns.moveToIndex(index, this.index); - } - } - - /** - * The Table schema - */ - class Table extends sf.object("Table", { - rows: sf.array(Row), - columns: sf.array(Column), - }) { - public static readonly Row = Row; - public static readonly Column = Column; - - /** - * Get a row by the id - * @param id The id of the row - */ - getRow(id: string): Row | undefined { - const row = this.rows.find((row) => row.id === id); - if (row) return row; - } - - /** - * Get a cell by the synthetic id - * @param id The synthetic id of the cell - */ - getCellById(id: `${string}_${string}`): CellValueType | undefined { - const [rowId, columnId] = id.split("_"); - const row = this.getRow(rowId); - if (row) { - const column = this.getColumn(columnId); - if (column) { - return row.getCell(column); - } - } - // If the cell does not exist return undefined - return undefined; - } - - /** - * Insert a row at a specific location - * @param index The index to insert the row at - * @param rows The rows to insert - * If no rows are provided, a new row will be created. - */ - insertRows(props: { - index?: number; - rows: InsertableTreeNodeFromImplicitAllowedTypes[]; - }): Row[] { - const { index, rows } = props; - if (index === undefined) { - this.rows.insertAtEnd(TreeArrayNode.spread(rows)); - } else { - this.rows.insertAt(index, TreeArrayNode.spread(rows)); - } - return rows as Row[]; - } - - /** - * Delete a row from the table - * @param rows The rows to delete - */ - deleteRows(rows: Row[]): void { - // If there are no rows to delete, do nothing - if (rows.length === 0) return; - // If there is only one row to delete, delete it - if (rows.length === 1) { - const index = this.rows.indexOf(rows[0]); - this.rows.removeAt(index); - return; - } - // If there are multiple rows to delete, delete them in a transaction - // This is to avoid the performance issues of deleting multiple rows at once - Tree.runTransaction(this, () => { - // Iterate over the rows and delete them - for (const row of rows) { - const index = this.rows.indexOf(row); - this.rows.removeAt(index); - } - }); - } - - /** - * Delete all rows from the table - */ - deleteAllRows(): void { - this.rows.removeRange(); - } - - /** - * Insert a new column at a specific location - * @param index The index to insert the column at - * @param name The name of the column - */ - insertColumn(props: { - index: number; - name: string; - hint?: string; - props: TColumnProps | null; - }): Column { - const { index, name, hint, props: columnProps } = props; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const column = new Column({ name, hint, props: columnProps } as any); - this.columns.insertAt(index, column); - return column; - } - - /** - * Get a column by the id - * @param id The id of the column - */ - getColumn(id: string): Column { - const column = this.columns.find((column) => column.id === id); - if (column) return column; - throw new Error("Column not found"); - } - - /** - * Delete a column header/object from the table - * DOES NOT DELETE THE CELLS IN THE ROWS - * @param column The column to delete - */ - removeColumn(column: Column): void { - const index = this.columns.indexOf(column); - // If the column is not in the table, do nothing - if (index === -1) return; - this.columns.removeAt(index); - } - } - - // Return the table schema - return Table; -}