From 644474dfc9feddf153cfaefcdd6df25eaf3dae9f Mon Sep 17 00:00:00 2001 From: Prinstar Date: Mon, 8 Jun 2026 15:13:57 -0700 Subject: [PATCH 01/12] add files --- .storybook/preview.ts | 3 + package-lock.json | 2633 +++++++++---------------- public/mockServiceWorker.js | 145 +- src/api/ophyd/useOphydDeviceSocket.ts | 229 +-- src/api/ophyd/useOphydPVSocket.tsx | 237 +-- src/app/pages/TestPage.tsx | 25 +- 6 files changed, 1199 insertions(+), 2073 deletions(-) diff --git a/.storybook/preview.ts b/.storybook/preview.ts index 94ac7f4a..775969a7 100644 --- a/.storybook/preview.ts +++ b/.storybook/preview.ts @@ -1,8 +1,11 @@ import type { Preview } from "@storybook/react"; import "../tailwind.css"; +import { withOphydSim, defaultBeamline } from "../src/lib/ophyd-sim"; + const version = import.meta.env.STORYBOOK_FINCH_VERSION; console.log(`Finch UI version ${version}`); const preview: Preview = { + decorators: [withOphydSim(defaultBeamline)], parameters: { controls: { matchers: { diff --git a/package-lock.json b/package-lock.json index 79647460..3ada9b0d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,15 @@ { "name": "@blueskyproject/finch", - "version": "0.1.9", + "version": "0.1.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@blueskyproject/finch", - "version": "0.1.9", + "version": "0.1.8", "license": "BSD-3-Clause", "dependencies": { - "@blueskyproject/tiled": "^0.0.30", + "@blueskyproject/tiled": "^0.0.28", "@phosphor-icons/react": "^2.1.7", "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-popover": "^1.1.14", @@ -47,7 +47,7 @@ "@types/three": "^0.178.0", "@vitejs/plugin-react": "^4.3.4", "autoprefixer": "^10.4.20", - "axios": "^1.16.0", + "axios": "^1.7.9", "eslint": "^9.17.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-react-hooks": "^5.0.0", @@ -56,7 +56,6 @@ "gh-pages": "^6.3.0", "globals": "^15.13.0", "happy-dom": "^20.8.3", - "husky": "^9.1.7", "jsdom": "^28.1.0", "msw": "^2.8.4", "msw-storybook-addon": "^2.0.4", @@ -199,6 +198,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", "dev": true, + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.0", @@ -447,12 +447,12 @@ } }, "node_modules/@blueskyproject/tiled": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@blueskyproject/tiled/-/tiled-0.0.30.tgz", - "integrity": "sha512-WpmNbXNQN/XyKkNYhbISb925lVkDBUYjnayQl8Gj8x9UK71Q6jYsWwrjRF8PnmZk2pZAZgep9QNuFpEm+FyQIQ==", + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/@blueskyproject/tiled/-/tiled-0.0.28.tgz", + "integrity": "sha512-VTajcGtdBca4pjfLqy1Q9qmNOS4J2q5BAqRYqlDwKJLJVrxU8jaejLPmOrMicXhpW3mhSjD4ZOUIUpvWuOSD/Q==", "license": "BSD-3-Clause", "dependencies": { - "@phosphor-icons/react": "^2.1.10", + "@phosphor-icons/react": "^2.1.7", "@storybook/addons": "^7.6.17", "@storybook/theming": "^8.6.14", "@visx/curve": "^3.12.0", @@ -522,7 +522,6 @@ "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", "dev": true, - "peer": true, "dependencies": { "commander": "^2.15.1" }, @@ -534,8 +533,7 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@chromatic-com/storybook": { "version": "3.2.3", @@ -664,6 +662,7 @@ "url": "https://opencollective.com/csstools" } ], + "peer": true, "engines": { "node": ">=20.19.0" }, @@ -702,6 +701,7 @@ "url": "https://opencollective.com/csstools" } ], + "peer": true, "engines": { "node": ">=20.19.0" } @@ -1122,11 +1122,10 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -1162,52 +1161,24 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", - "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", + "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.7", + "@eslint/object-schema": "^2.1.5", "debug": "^4.3.1", - "minimatch": "^3.1.5" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0" + "minimatch": "^3.1.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz", + "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -1216,20 +1187,19 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", - "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", "dev": true, - "license": "MIT", "dependencies": { - "ajv": "^6.14.0", + "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", - "minimatch": "^3.1.5", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { @@ -1244,7 +1214,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -1252,50 +1221,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@eslint/js": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", - "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz", + "integrity": "sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==", "dev": true, - "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" } }, "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", + "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz", + "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.17.0", "levn": "^0.4.1" }, "engines": { @@ -1406,11 +1355,10 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=18.18" }, @@ -1629,7 +1577,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, - "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -1654,7 +1601,6 @@ "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", "dev": true, - "peer": true, "dependencies": { "get-stream": "^6.0.1", "minimist": "^1.2.6" @@ -1667,15 +1613,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz", "integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@mapbox/jsonlint-lines-primitives": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", "dev": true, - "peer": true, "engines": { "node": ">= 0.6" } @@ -1685,7 +1629,6 @@ "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz", "integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==", "dev": true, - "peer": true, "peerDependencies": { "mapbox-gl": ">=0.32.1 <2.0.0" } @@ -1694,29 +1637,25 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@mapbox/tiny-sdf": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz", "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@mapbox/unitbezier": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@mapbox/vector-tile": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", "dev": true, - "peer": true, "dependencies": { "@mapbox/point-geometry": "~0.1.0" } @@ -1726,7 +1665,6 @@ "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==", "dev": true, - "peer": true, "engines": { "node": ">=6.0.0" } @@ -1736,7 +1674,6 @@ "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-20.4.0.tgz", "integrity": "sha512-AzBy3095fTFPjDjmWpR2w6HVRAZJ6hQZUCwk5Plz6EyfnfuQW1odeW5i2Ai47Y6TBA2hQnC+azscjBSALpaWgw==", "dev": true, - "peer": true, "dependencies": { "@mapbox/jsonlint-lines-primitives": "~2.0.2", "@mapbox/unitbezier": "^0.0.1", @@ -1756,22 +1693,19 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/tinyqueue": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@mdx-js/react": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", - "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz", + "integrity": "sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/mdx": "^2.0.0" }, @@ -1785,48 +1719,72 @@ } }, "node_modules/@microsoft/api-extractor": { - "version": "7.58.8", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.58.8.tgz", - "integrity": "sha512-Y45rdEvZodD1WBAK9w8Wvqj7k/6z21YOEP8aVNWv1vemEzanjThvCowc3Eyt/bmJJyqI4gj0BQr9nLC51fsDiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@microsoft/api-extractor-model": "7.33.8", - "@microsoft/tsdoc": "~0.16.0", - "@microsoft/tsdoc-config": "~0.18.1", - "@rushstack/node-core-library": "5.23.1", - "@rushstack/rig-package": "0.7.3", - "@rushstack/terminal": "0.24.0", - "@rushstack/ts-command-line": "5.3.9", - "diff": "~8.0.2", - "minimatch": "10.2.3", + "version": "7.50.0", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.50.0.tgz", + "integrity": "sha512-Ds/PHTiVzuENQsmXrJKkSdfgNkr/SDG/2rDef0AWl3BchAnXdO7gXaYsAkNx4gWiC4OngNA3fQfd3+BcQxP1DQ==", + "dev": true, + "dependencies": { + "@microsoft/api-extractor-model": "7.30.3", + "@microsoft/tsdoc": "~0.15.1", + "@microsoft/tsdoc-config": "~0.17.1", + "@rushstack/node-core-library": "5.11.0", + "@rushstack/rig-package": "0.5.3", + "@rushstack/terminal": "0.15.0", + "@rushstack/ts-command-line": "4.23.5", + "lodash": "~4.17.15", + "minimatch": "~3.0.3", "resolve": "~1.22.1", - "semver": "~7.7.4", + "semver": "~7.5.4", "source-map": "~0.6.1", - "typescript": "5.9.3" + "typescript": "5.7.2" }, "bin": { "api-extractor": "bin/api-extractor" } }, "node_modules/@microsoft/api-extractor-model": { - "version": "7.33.8", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.33.8.tgz", - "integrity": "sha512-aIcoQggPyer3B6Ze3usz0YWC/oBwUHfRH5ETUsr+oT2BRA6SfTJl7IKPcPZkX4UR+PohowzW4uMxsvjrn8vm+w==", + "version": "7.30.3", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.30.3.tgz", + "integrity": "sha512-yEAvq0F78MmStXdqz9TTT4PZ05Xu5R8nqgwI5xmUmQjWBQ9E6R2n8HB/iZMRciG4rf9iwI2mtuQwIzDXBvHn1w==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "~0.15.1", + "@microsoft/tsdoc-config": "~0.17.1", + "@rushstack/node-core-library": "5.11.0" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", "dev": true, - "license": "MIT", "dependencies": { - "@microsoft/tsdoc": "~0.16.0", - "@microsoft/tsdoc-config": "~0.18.1", - "@rushstack/node-core-library": "5.23.1" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, "node_modules/@microsoft/api-extractor/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" }, @@ -1835,11 +1793,10 @@ } }, "node_modules/@microsoft/api-extractor/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", "dev": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -1848,37 +1805,40 @@ "node": ">=14.17" } }, + "node_modules/@microsoft/api-extractor/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@microsoft/tsdoc": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz", - "integrity": "sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==", - "dev": true, - "license": "MIT" + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", + "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", + "dev": true }, "node_modules/@microsoft/tsdoc-config": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.18.1.tgz", - "integrity": "sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz", + "integrity": "sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==", "dev": true, - "license": "MIT", "dependencies": { - "@microsoft/tsdoc": "0.16.0", - "ajv": "~8.18.0", + "@microsoft/tsdoc": "0.15.1", + "ajv": "~8.12.0", "jju": "~1.4.0", "resolve": "~1.22.2" } }, "node_modules/@microsoft/tsdoc-config/node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, - "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", + "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, "funding": { "type": "github", @@ -1889,8 +1849,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@mswjs/interceptors": { "version": "0.37.6", @@ -1964,10 +1923,9 @@ "dev": true }, "node_modules/@phosphor-icons/react": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/@phosphor-icons/react/-/react-2.1.10.tgz", - "integrity": "sha512-vt8Tvq8GLjheAZZYa+YG/pW7HDbov8El/MANW8pOAz4eGxrwhnbfrQZq0Cp4q8zBEu8NIhHdnr+r8thnfRSNYA==", - "license": "MIT", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@phosphor-icons/react/-/react-2.1.7.tgz", + "integrity": "sha512-g2e2eVAn1XG2a+LI09QU3IORLhnFNAFkNbo2iwbX6NOKSLOwvEMmTa7CgOzEbgNWR47z8i8kwjdvYZ5fkGx1mQ==", "engines": { "node": ">=10" }, @@ -1989,15 +1947,13 @@ "version": "3.8.2", "resolved": "https://registry.npmjs.org/@plotly/d3/-/d3-3.8.2.tgz", "integrity": "sha512-wvsNmh1GYjyJfyEBPKJLTMzgf2c2bEbSIL50lmqVUi+o1NHaLPi1Lb4v7VxXXJn043BhNyrxUrWI85Q+zmjOVA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@plotly/d3-sankey": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/@plotly/d3-sankey/-/d3-sankey-0.7.2.tgz", "integrity": "sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw==", "dev": true, - "peer": true, "dependencies": { "d3-array": "1", "d3-collection": "1", @@ -2009,7 +1965,6 @@ "resolved": "https://registry.npmjs.org/@plotly/d3-sankey-circular/-/d3-sankey-circular-0.33.1.tgz", "integrity": "sha512-FgBV1HEvCr3DV7RHhDsPXyryknucxtfnLwPtCKKxdolKyTFYoLX/ibEfX39iFYIL7DYbVeRtP43dbFcrHNE+KQ==", "dev": true, - "peer": true, "dependencies": { "d3-array": "^1.2.1", "d3-collection": "^1.0.4", @@ -2022,8 +1977,7 @@ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", "dev": true, - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/@plotly/d3-sankey-circular/node_modules/d3-shape": { "version": "1.3.7", @@ -2031,7 +1985,6 @@ "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "d3-path": "1" } @@ -2041,8 +1994,7 @@ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", "dev": true, - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/@plotly/d3-sankey/node_modules/d3-shape": { "version": "1.3.7", @@ -2050,7 +2002,6 @@ "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "d3-path": "1" } @@ -2060,7 +2011,6 @@ "resolved": "https://registry.npmjs.org/@plotly/mapbox-gl/-/mapbox-gl-1.13.4.tgz", "integrity": "sha512-sR3/Pe5LqT/fhYgp4rT4aSFf1rTsxMbGiH6Hojc7PH36ny5Bn17iVFUjpzycafETURuFbLZUfjODO8LvSI+5zQ==", "dev": true, - "peer": true, "dependencies": { "@mapbox/geojson-rewind": "^0.5.2", "@mapbox/geojson-types": "^1.0.2", @@ -2094,7 +2044,6 @@ "resolved": "https://registry.npmjs.org/@plotly/point-cluster/-/point-cluster-3.1.9.tgz", "integrity": "sha512-MwaI6g9scKf68Orpr1pHZ597pYx9uP8UEFXLPbsCmuw3a84obwz6pnMXGc90VhgDNeNiLEdlmuK7CPo+5PIxXw==", "dev": true, - "peer": true, "dependencies": { "array-bounds": "^1.0.1", "binary-search-bounds": "^2.0.4", @@ -2946,7 +2895,6 @@ "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==", "license": "MIT", - "peer": true, "dependencies": { "@react-spring/shared": "~9.7.5", "@react-spring/types": "~9.7.5" @@ -2960,7 +2908,6 @@ "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz", "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==", "license": "MIT", - "peer": true, "dependencies": { "@react-spring/animated": "~9.7.5", "@react-spring/shared": "~9.7.5", @@ -2978,15 +2925,13 @@ "version": "9.7.5", "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz", "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@react-spring/shared": { "version": "9.7.5", "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz", "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==", "license": "MIT", - "peer": true, "dependencies": { "@react-spring/rafz": "~9.7.5", "@react-spring/types": "~9.7.5" @@ -2999,8 +2944,7 @@ "version": "9.7.5", "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz", "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@react-spring/web": { "version": "9.7.5", @@ -3020,10 +2964,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.3.tgz", - "integrity": "sha512-4An71tdz9X8+3sI4Qqqd2LWd9vS39J7sqd9EU4Scw7TJE/qB10Flv/UuqbPVgfQV9XoK8Np6jNquZitnZq5i+Q==", - "license": "MIT", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz", + "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==", "engines": { "node": ">=14.0.0" } @@ -3051,11 +2994,10 @@ } }, "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -3064,9 +3006,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.61.1.tgz", - "integrity": "sha512-JnBB8MdXj45cajvTuO5FmPlvFVJRQgvrz1uSEl3NwqFnReAPGwb8EanbGi4z2nRaqLzjJSv5/JmycoTKlRZxHA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.1.tgz", + "integrity": "sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==", "cpu": [ "arm" ], @@ -3078,9 +3020,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.61.1.tgz", - "integrity": "sha512-Jx2g7iSjw4AOT0HDPHM9RV3GNjRXwybWtSFZiZAYUTjUwjVrYIwq3kBf+LnhqJlzXFAqTAh2F7IGI+O568exPw==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.1.tgz", + "integrity": "sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==", "cpu": [ "arm64" ], @@ -3092,9 +3034,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.61.1.tgz", - "integrity": "sha512-0F1L/Z3Eqv8mT2n3dCpeO8GcTvHvVqkP5/t6DMsn0KzhYVcg+s7Ncl5DS8qjKYEeio6Az0Gt6nyBORay5qIlCA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.1.tgz", + "integrity": "sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==", "cpu": [ "arm64" ], @@ -3106,9 +3048,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.61.1.tgz", - "integrity": "sha512-qLttcH871ujY4YcVfUSShhOw+CsoTatYz8gRbHO7Bb92QH059/P0y5do1KMs41fY0BpD2x4AJH/gID0zFiqVKQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.1.tgz", + "integrity": "sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==", "cpu": [ "x64" ], @@ -3120,9 +3062,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.61.1.tgz", - "integrity": "sha512-fUI4RapGE0Oh3mb8mgfvC1O2nU1RpDZUKnDQm3xB1Ipg7C2wTs5Kstz7G2uWK99a8S2yTMq8/P4uycwNa0nJyw==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.1.tgz", + "integrity": "sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==", "cpu": [ "arm64" ], @@ -3134,9 +3076,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.61.1.tgz", - "integrity": "sha512-H5YrdvJaDtI/U9/emrD4b++xkvp3y/JvOe4rizHbxvkyMfRS/CiRYdji+Pl8D0brEaNFWUh1drQxgAGIl6Xudw==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.1.tgz", + "integrity": "sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==", "cpu": [ "x64" ], @@ -3148,9 +3090,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.61.1.tgz", - "integrity": "sha512-Q8CBCCQtDFrYtXoeUXSrnFXKOnyUhx6bz+SkL6A0E7V8kAiCJ5pamq1WtbfpVGhR5TSpXY6ak3avmDc5fHTyJA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.1.tgz", + "integrity": "sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==", "cpu": [ "arm" ], @@ -3162,9 +3104,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.61.1.tgz", - "integrity": "sha512-nwnhk1581l0FBVellGcVCAT0Oi06onEA3WB53sf01VO3I0UPBkMH9sXONYME2K0ovXcNayJfNtHfm6mpJElatQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.1.tgz", + "integrity": "sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==", "cpu": [ "arm" ], @@ -3176,9 +3118,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.61.1.tgz", - "integrity": "sha512-x5Xr49hwt3hdW75UOZm3395YwwzPyauktslv29KpWL/T+vVAzoT3azLcTWv0eMciBNrx+DYjH4paehHoLpPvpg==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.1.tgz", + "integrity": "sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==", "cpu": [ "arm64" ], @@ -3190,9 +3132,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.61.1.tgz", - "integrity": "sha512-unMS3H73DpaoPyyEVPjGKleM/s0mkmsauTENpw4INQY8y4+IuLNjkueQ5QCtC0D3N38Y38yhAU8OoZ20S2Tm6w==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.1.tgz", + "integrity": "sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==", "cpu": [ "arm64" ], @@ -3203,24 +3145,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.61.1.tgz", - "integrity": "sha512-zNZzGRnAhwjFEYmvphJRV5XaQGjs62cCmeYYHUT//NbvEnHauw+I85nGG+SiVg5ld4GX8D1IbKIX+ozITQnhMQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.61.1.tgz", - "integrity": "sha512-LdpWGL8X209B2SIvWjqlc8VZgM6PKfontSerGepuldQmHYrAOtnMCXeJkxXGbC+PPZVOuu5czJo7fNV6aeW8rQ==", + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.1.tgz", + "integrity": "sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==", "cpu": [ "loong64" ], @@ -3231,24 +3159,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.61.1.tgz", - "integrity": "sha512-EC5kTtNaNGOmbMGqar8dvJy6y/hg99GAwjfBz++pxZhQATXGcRjd6c5en5wcbru0vkRmiMGsQKdMJOOf6sza4g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.61.1.tgz", - "integrity": "sha512-8hiwp6D4acEcNK78I4rP0/XtS1sknWIAMJBPdR4l6zUtyTm5KiTDr5bXmWt4foY7nAN7AThDHgkLIEZOWKbzWw==", + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.1.tgz", + "integrity": "sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==", "cpu": [ "ppc64" ], @@ -3260,9 +3174,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.61.1.tgz", - "integrity": "sha512-10dh/h/BqA7DuMPWSxkR8uks18FRwnwOEqr5zOTEl+NOwP/OMzKX8OFR/Of9xxDA7D5qef1Nzar5WDD2kCCr1g==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.1.tgz", + "integrity": "sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==", "cpu": [ "riscv64" ], @@ -3274,9 +3188,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.61.1.tgz", - "integrity": "sha512-YKJ5lg35DP17gcAOggnihe+APw9HLyj1Xn7gsmGumBJAUDa6NGXNixJzmkWLhcK9TOuuyQjdamzvJefkO7qHZQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.1.tgz", + "integrity": "sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==", "cpu": [ "riscv64" ], @@ -3288,9 +3202,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.61.1.tgz", - "integrity": "sha512-Mlil5G2Jj6a7B3LWGctg+XPL9vdXYuzCtNXfxOQ0nPjc2m6ueUktocPGH9bnAM0bNRKb/bAWTujUU7IJQdQA+g==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.1.tgz", + "integrity": "sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==", "cpu": [ "s390x" ], @@ -3302,9 +3216,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.61.1.tgz", - "integrity": "sha512-bVWIOIk6pV01p4CdUbPP7CJ/434z+OooYjDuFcR+44N35YvKUC66G8MGnvcWx5mWKW3g61J+t74l3Kj15Kwn2Q==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.1.tgz", + "integrity": "sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==", "cpu": [ "x64" ], @@ -3316,9 +3230,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.61.1.tgz", - "integrity": "sha512-qy5pBvZbqNFheBz61R1rzsezjm0J7O2oNGoWtGoY89SZYLUfxAJTBAqDChqAIdB4rCiIbi9nF7yZ83GnNiLwSw==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.1.tgz", + "integrity": "sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==", "cpu": [ "x64" ], @@ -3329,38 +3243,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.61.1.tgz", - "integrity": "sha512-E83TXjI4zm0+5f2qO+UOudaCYIhYwpJ5jq6YCZNIZ+6CbfhKrkAGezeiASBL9ElxAxFsRS9ZhESv8mfnj6TKeg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.61.1.tgz", - "integrity": "sha512-fbWnKqVkjrJN38vNe3ahkbk6iejS/3b0Nt7EEtPpE6RBacZcGXNKbzfHN3GUUlXOPghUg0j6XUGrtjX9z1sIvA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.61.1.tgz", - "integrity": "sha512-ArMl38iVAbk0New1ogihQNY6iphLi4ZaRsa037gUzv5yeKPY8TD3Dmy4x2RNC1VztU/uqm+G+/RwFrSka3Oy2g==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.1.tgz", + "integrity": "sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==", "cpu": [ "arm64" ], @@ -3372,9 +3258,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.61.1.tgz", - "integrity": "sha512-0mYtjHS9ucAbcATycCNK9IGBk/cCe/ma7EmSLGZdsxnOA8cjRIyU04wDpVAD9NiOfLUR9KTxdiO53uOkherqjQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.1.tgz", + "integrity": "sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==", "cpu": [ "ia32" ], @@ -3385,24 +3271,10 @@ "win32" ] }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.61.1.tgz", - "integrity": "sha512-gK1iCEPfpoSG9wfBihXxvBMi8ZfcWffYkEsC/Eih+iFENTaewvNcrEQ69lIOWYO5pePHKLHHO7nq5AILGO/HQQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.61.1.tgz", - "integrity": "sha512-X+zaP2x+j4RXGfbp/seSoRHWnPxzApilDszisZxbYH5C/jTxFhCtDNdPGZb9lJyYPs24wGxruPF7Y+sIXt9Gzw==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.1.tgz", + "integrity": "sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==", "cpu": [ "x64" ], @@ -3414,20 +3286,19 @@ ] }, "node_modules/@rushstack/node-core-library": { - "version": "5.23.1", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.23.1.tgz", - "integrity": "sha512-wlKmIKIYCKuCASbITvOxLZXepPbwXvrv7S6ig6XNWFchSyhL/E2txmVXspHY49Wu2dzf7nI27a2k/yV5BA3EiA==", + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.11.0.tgz", + "integrity": "sha512-I8+VzG9A0F3nH2rLpPd7hF8F7l5Xb7D+ldrWVZYegXM6CsKkvWc670RlgK3WX8/AseZfXA/vVrh0bpXe2Y2UDQ==", "dev": true, - "license": "MIT", "dependencies": { - "ajv": "~8.18.0", + "ajv": "~8.13.0", "ajv-draft-04": "~1.0.0", "ajv-formats": "~3.0.1", "fs-extra": "~11.3.0", "import-lazy": "~4.0.0", "jju": "~1.4.0", "resolve": "~1.22.1", - "semver": "~7.7.4" + "semver": "~7.5.4" }, "peerDependencies": { "@types/node": "*" @@ -3439,16 +3310,16 @@ } }, "node_modules/@rushstack/node-core-library/node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -3460,7 +3331,6 @@ "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", "dev": true, - "license": "MIT", "peerDependencies": { "ajv": "^8.5.0" }, @@ -3470,19 +3340,49 @@ } } }, + "node_modules/@rushstack/node-core-library/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/@rushstack/node-core-library/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@rushstack/node-core-library/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "MIT" + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } }, "node_modules/@rushstack/node-core-library/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" }, @@ -3490,41 +3390,29 @@ "node": ">=10" } }, - "node_modules/@rushstack/problem-matcher": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@rushstack/problem-matcher/-/problem-matcher-0.2.1.tgz", - "integrity": "sha512-gulfhBs6n+I5b7DvjKRfhMGyUejtSgOHTclF/eONr8hcgF1APEDjhxIsfdUYYMzC3rvLwGluqLjbwCFZ8nxrog==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } + "node_modules/@rushstack/node-core-library/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/@rushstack/rig-package": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.7.3.tgz", - "integrity": "sha512-aAA518n6wxxjCfnTAOjQnm7ngNE0FVHxHAw2pxKlIhxrMn0XQjGcXKF0oKWpjBgJOmsaJpVob/v+zr3zxgPWuA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.5.3.tgz", + "integrity": "sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==", "dev": true, - "license": "MIT", "dependencies": { - "jju": "~1.4.0", - "resolve": "~1.22.1" + "resolve": "~1.22.1", + "strip-json-comments": "~3.1.1" } }, "node_modules/@rushstack/terminal": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.24.0.tgz", - "integrity": "sha512-8ZQS4MMaGsv27EXCBiH7WMPkRZrffeDoIevs6z9TM5dzqiY6+Hn4evfK/G+gvgBTjfvfkHIZPQQmalmI2sM4TQ==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.15.0.tgz", + "integrity": "sha512-vXQPRQ+vJJn4GVqxkwRe+UGgzNxdV8xuJZY2zem46Y0p3tlahucH9/hPmLGj2i9dQnUBFiRnoM9/KW7PYw8F4Q==", "dev": true, - "license": "MIT", "dependencies": { - "@rushstack/node-core-library": "5.23.1", - "@rushstack/problem-matcher": "0.2.1", + "@rushstack/node-core-library": "5.11.0", "supports-color": "~8.1.1" }, "peerDependencies": { @@ -3541,7 +3429,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -3553,13 +3440,12 @@ } }, "node_modules/@rushstack/ts-command-line": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.3.9.tgz", - "integrity": "sha512-GIHqU+sRGQ3LGWAZu1O+9Yh++qwtyNIIGuNbcWHJjBTm2qRez0cwINUHZ+pQLR8UuzZDcMajrDaNbUYoaL/XtQ==", + "version": "4.23.5", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.23.5.tgz", + "integrity": "sha512-jg70HfoK44KfSP3MTiL5rxsZH7X1ktX3cZs9Sl8eDu1/LxJSbPsh0MOFRC710lIuYYSgxWjI5AjbCBAl7u3RxA==", "dev": true, - "license": "MIT", "dependencies": { - "@rushstack/terminal": "0.24.0", + "@rushstack/terminal": "0.15.0", "@types/argparse": "1.0.38", "argparse": "~1.0.9", "string-argv": "~0.3.1" @@ -3570,7 +3456,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -3579,15 +3464,13 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@storybook/addon-actions": { - "version": "8.6.18", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.6.18.tgz", - "integrity": "sha512-GcYhtE91GjIQTuZlwpTJ8jfMp6NC79nkpe1DGe0eetTpyQqLq1WUt+ACkk0Z5lqq2u8HBc09zCCGw+D8iCLpYQ==", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.4.7.tgz", + "integrity": "sha512-mjtD5JxcPuW74T6h7nqMxWTvDneFtokg88p6kQ5OnC1M259iAXb//yiSZgu/quunMHPCXSiqn4FNOSgASTSbsA==", "dev": true, - "license": "MIT", "dependencies": { "@storybook/global": "^5.0.0", "@types/uuid": "^9.0.1", @@ -3600,15 +3483,14 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.18" + "storybook": "^8.4.7" } }, "node_modules/@storybook/addon-backgrounds": { - "version": "8.6.18", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.6.18.tgz", - "integrity": "sha512-froND3WwvSCYzjEBO8QODStaWNL+aGXqxBEbrMnGYejDFST4qEFkvM2IYWMnLBkRgrgJ0yIqTeDQoyH9b9/8uQ==", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.4.7.tgz", + "integrity": "sha512-I4/aErqtFiazcoWyKafOAm3bLpxTj6eQuH/woSbk1Yx+EzN+Dbrgx1Updy8//bsNtKkcrXETITreqHC+a57DHQ==", "dev": true, - "license": "MIT", "dependencies": { "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3", @@ -3619,15 +3501,14 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.18" + "storybook": "^8.4.7" } }, "node_modules/@storybook/addon-controls": { - "version": "8.6.18", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.6.18.tgz", - "integrity": "sha512-K09dHDCfGW3cudsfuyfu0Yi49aZ2h7VYK4IXDGo1sfmtzVh4xd3HrZQQMVUeKLcfDP/NnJowT+fLVwg04CLrxQ==", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.4.7.tgz", + "integrity": "sha512-377uo5IsJgXLnQLJixa47+11V+7Wn9KcDEw+96aGCBCfLbWNH8S08tJHHnSu+jXg9zoqCAC23MetntVp6LetHA==", "dev": true, - "license": "MIT", "dependencies": { "@storybook/global": "^5.0.0", "dequal": "^2.0.2", @@ -3638,22 +3519,21 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.18" + "storybook": "^8.4.7" } }, "node_modules/@storybook/addon-docs": { - "version": "8.6.18", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.6.18.tgz", - "integrity": "sha512-55ADer0yNmmeR928Y3UAv3r4i7bJSd9LwywsQ+lRol/FNe0ZcwLEz31xL+jVsqQFNnDh/imsDIp8aYapGMtfEQ==", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.4.7.tgz", + "integrity": "sha512-NwWaiTDT5puCBSUOVuf6ME7Zsbwz7Y79WF5tMZBx/sLQ60vpmJVQsap6NSjvK1Ravhc21EsIXqemAcBjAWu80w==", "dev": true, - "license": "MIT", "dependencies": { "@mdx-js/react": "^3.0.0", - "@storybook/blocks": "8.6.18", - "@storybook/csf-plugin": "8.6.18", - "@storybook/react-dom-shim": "8.6.18", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "@storybook/blocks": "8.4.7", + "@storybook/csf-plugin": "8.4.7", + "@storybook/react-dom-shim": "8.4.7", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", "ts-dedent": "^2.0.0" }, "funding": { @@ -3661,58 +3541,24 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.18" - } - }, - "node_modules/@storybook/addon-docs/node_modules/@storybook/csf-plugin": { - "version": "8.6.18", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.6.18.tgz", - "integrity": "sha512-x1ioz/L0CwaelCkHci3P31YtvwayN3FBftvwQOPbvRh9qeb4Cpz5IdVDmyvSxxYwXN66uAORNoqgjTi7B4/y5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "unplugin": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.6.18" - } - }, - "node_modules/@storybook/addon-docs/node_modules/@storybook/react-dom-shim": { - "version": "8.6.18", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.6.18.tgz", - "integrity": "sha512-N4xULcAWZQTUv4jy1/d346Tyb4gufuC3UaLCuU/iVSZ1brYF4OW3ANr+096btbMxY8pR/65lmtoqr5CTGwnBvA==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.6.18" + "storybook": "^8.4.7" } }, "node_modules/@storybook/addon-essentials": { - "version": "8.6.18", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.6.18.tgz", - "integrity": "sha512-MmH7gFb8pyfRoAth0w2RW8j7mBaEJbEWGP3juIoH03ZqTGmbMUbJXElCuRgxQhve7pyz39zLsgtE78D7G+76ew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/addon-actions": "8.6.18", - "@storybook/addon-backgrounds": "8.6.18", - "@storybook/addon-controls": "8.6.18", - "@storybook/addon-docs": "8.6.18", - "@storybook/addon-highlight": "8.6.18", - "@storybook/addon-measure": "8.6.18", - "@storybook/addon-outline": "8.6.18", - "@storybook/addon-toolbars": "8.6.18", - "@storybook/addon-viewport": "8.6.18", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.4.7.tgz", + "integrity": "sha512-+BtZHCBrYtQKILtejKxh0CDRGIgTl9PumfBOKRaihYb4FX1IjSAxoV/oo/IfEjlkF5f87vouShWsRa8EUauFDw==", + "dev": true, + "dependencies": { + "@storybook/addon-actions": "8.4.7", + "@storybook/addon-backgrounds": "8.4.7", + "@storybook/addon-controls": "8.4.7", + "@storybook/addon-docs": "8.4.7", + "@storybook/addon-highlight": "8.4.7", + "@storybook/addon-measure": "8.4.7", + "@storybook/addon-outline": "8.4.7", + "@storybook/addon-toolbars": "8.4.7", + "@storybook/addon-viewport": "8.4.7", "ts-dedent": "^2.0.0" }, "funding": { @@ -3720,15 +3566,14 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.18" + "storybook": "^8.4.7" } }, "node_modules/@storybook/addon-highlight": { - "version": "8.6.18", - "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.6.18.tgz", - "integrity": "sha512-wTFJ1DPM0C8gK6nGTJxH75byayQj7BPAz02fME4AOmT6clrBpVl1zSTFTkXaSr+k4xOfeMR/xNUfVskaXz6T9w==", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.4.7.tgz", + "integrity": "sha512-whQIDBd3PfVwcUCrRXvCUHWClXe9mQ7XkTPCdPo4B/tZ6Z9c6zD8JUHT76ddyHivixFLowMnA8PxMU6kCMAiNw==", "dev": true, - "license": "MIT", "dependencies": { "@storybook/global": "^5.0.0" }, @@ -3737,7 +3582,7 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.18" + "storybook": "^8.4.7" } }, "node_modules/@storybook/addon-interactions": { @@ -3761,11 +3606,10 @@ } }, "node_modules/@storybook/addon-measure": { - "version": "8.6.18", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.6.18.tgz", - "integrity": "sha512-fMEOJXgPrTm6qHlWoRM+WTLE7Mr1QBIf2ei+pujBQFcWkD6Gjc2pV8zKzvh93d+EA13wD8AmwOq1DEw9J+XH+g==", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.4.7.tgz", + "integrity": "sha512-QfvqYWDSI5F68mKvafEmZic3SMiK7zZM8VA0kTXx55hF/+vx61Mm0HccApUT96xCXIgmwQwDvn9gS4TkX81Dmw==", "dev": true, - "license": "MIT", "dependencies": { "@storybook/global": "^5.0.0", "tiny-invariant": "^1.3.1" @@ -3775,15 +3619,14 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.18" + "storybook": "^8.4.7" } }, "node_modules/@storybook/addon-outline": { - "version": "8.6.18", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.6.18.tgz", - "integrity": "sha512-TErFqfCtlV2xt9B6/kskROt69TPjr6AXdHpMselaRrN1X4WEjcMk9GT9PcNP7FXqL88/VYqUb3uNMiAmpDmS/g==", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.4.7.tgz", + "integrity": "sha512-6LYRqUZxSodmAIl8icr585Oi8pmzbZ90aloZJIpve+dBAzo7ydYrSQxxoQEVltXbKf3VeVcrs64ouAYqjisMYA==", "dev": true, - "license": "MIT", "dependencies": { "@storybook/global": "^5.0.0", "ts-dedent": "^2.0.0" @@ -3793,29 +3636,27 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.18" + "storybook": "^8.4.7" } }, "node_modules/@storybook/addon-toolbars": { - "version": "8.6.18", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.6.18.tgz", - "integrity": "sha512-x037KXCEcNfPISGX485DtiP+8Bw/cOT45plcQa8eiAQVrVcUwYaDoLubE9YV5b5CsSAjX8sDviGTme6ALfq7+w==", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.4.7.tgz", + "integrity": "sha512-OSfdv5UZs+NdGB+nZmbafGUWimiweJ/56gShlw8Neo/4jOJl1R3rnRqqY7MYx8E4GwoX+i3GF5C3iWFNQqlDcw==", "dev": true, - "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.18" + "storybook": "^8.4.7" } }, "node_modules/@storybook/addon-viewport": { - "version": "8.6.18", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.6.18.tgz", - "integrity": "sha512-z9sDJSkuWQb4BP+Z1+H+y/Q0rFbPSDcw+OBBEhMfRcJPPXavdC2pNQ0GdQNVw+tDwhAXj+U7jehKnMDKaP7TyA==", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.4.7.tgz", + "integrity": "sha512-hvczh/jjuXXcOogih09a663sRDDSATXwbE866al1DXgbDFraYD/LxX/QDb38W9hdjU9+Qhx8VFIcNWoMQns5HQ==", "dev": true, - "license": "MIT", "dependencies": { "memoizerific": "^1.11.3" }, @@ -3824,7 +3665,7 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.6.18" + "storybook": "^8.4.7" } }, "node_modules/@storybook/addons": { @@ -3911,12 +3752,12 @@ } }, "node_modules/@storybook/blocks": { - "version": "8.6.18", - "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.6.18.tgz", - "integrity": "sha512-esZv4msPQ9LxgTb8YUIZhhxVMuI6BPi5bkXtk8c7w7sWuAsqsCe/RnVInn7ooUry2gjnD4hd9+8Eqj0b8oTVoA==", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.4.7.tgz", + "integrity": "sha512-+QH7+JwXXXIyP3fRCxz/7E2VZepAanXJM7G8nbR3wWsqWgrRp4Wra6MvybxAYCxU7aNfJX5c+RW84SNikFpcIA==", "dev": true, - "license": "MIT", "dependencies": { + "@storybook/csf": "^0.1.11", "@storybook/icons": "^1.2.12", "ts-dedent": "^2.0.0" }, @@ -3925,9 +3766,9 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "storybook": "^8.6.18" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.4.7" }, "peerDependenciesMeta": { "react": { @@ -4000,12 +3841,12 @@ } }, "node_modules/@storybook/core": { - "version": "8.6.18", - "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.6.18.tgz", - "integrity": "sha512-dRBP2TnX6fGdS0T2mXBHjkS/3Nlu1ra1huovZVFuM67CYMzrhM/3hX/zru1vWSC5rqY93ZaAhjMciPW4pK5mMQ==", + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.6.14.tgz", + "integrity": "sha512-1P/w4FSNRqP8j3JQBOi3yGt8PVOgSRbP66Ok520T78eJBeqx9ukCfl912PQZ7SPbW3TIunBwLXMZOjZwBB/JmA==", "license": "MIT", "dependencies": { - "@storybook/theming": "8.6.18", + "@storybook/theming": "8.6.14", "better-opn": "^3.0.2", "browser-assert": "^1.2.1", "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0", @@ -4043,9 +3884,9 @@ } }, "node_modules/@storybook/core/node_modules/semver": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", - "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -4323,10 +4164,9 @@ "dev": true }, "node_modules/@storybook/theming": { - "version": "8.6.18", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.6.18.tgz", - "integrity": "sha512-n6OEjEtHupa2PdTwWzRepr7cO8NkDd4rgF6BKLitRbujOspLxzMBEqdphs+QLcuiCIgf33SqmEA64QWnbSMhPw==", - "license": "MIT", + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.6.14.tgz", + "integrity": "sha512-r4y+LsiB37V5hzpQo+BM10PaCsp7YlZ0YcZzQP1OCkPlYXmUAFy2VvDKaFRpD8IeNPKug2u4iFm/laDEbs03dg==", "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" @@ -4379,6 +4219,7 @@ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, + "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -4463,7 +4304,6 @@ "resolved": "https://registry.npmjs.org/@turf/area/-/area-7.2.0.tgz", "integrity": "sha512-zuTTdQ4eoTI9nSSjerIy4QwgvxqwJVciQJ8tOPuMHbXJ9N/dNjI7bU8tasjhxas/Cx3NE9NxVHtNpYHL0FSzoA==", "dev": true, - "peer": true, "dependencies": { "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", @@ -4479,7 +4319,6 @@ "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-7.2.0.tgz", "integrity": "sha512-wzHEjCXlYZiDludDbXkpBSmv8Zu6tPGLmJ1sXQ6qDwpLE1Ew3mcWqt8AaxfTP5QwDNQa3sf2vvgTEzNbPQkCiA==", "dev": true, - "peer": true, "dependencies": { "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", @@ -4495,7 +4334,6 @@ "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-7.2.0.tgz", "integrity": "sha512-yJqDSw25T7P48au5KjvYqbDVZ7qVnipziVfZ9aSo7P2/jTE7d4BP21w0/XLi3T/9bry/t9PR1GDDDQljN4KfDw==", "dev": true, - "peer": true, "dependencies": { "@turf/helpers": "^7.2.0", "@turf/meta": "^7.2.0", @@ -4511,7 +4349,6 @@ "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.2.0.tgz", "integrity": "sha512-cXo7bKNZoa7aC7ydLmUR02oB3IgDe7MxiPuRz3cCtYQHn+BJ6h1tihmamYDWWUlPHgSNF0i3ATc4WmDECZafKw==", "dev": true, - "peer": true, "dependencies": { "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" @@ -4525,7 +4362,6 @@ "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-7.2.0.tgz", "integrity": "sha512-igzTdHsQc8TV1RhPuOLVo74Px/hyPrVgVOTgjWQZzt3J9BVseCdpfY/0cJBdlSRI4S/yTmmHl7gAqjhpYH5Yaw==", "dev": true, - "peer": true, "dependencies": { "@turf/helpers": "^7.2.0", "@types/geojson": "^7946.0.10" @@ -4545,8 +4381,7 @@ "version": "1.0.38", "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/aria-query": { "version": "5.0.4", @@ -4605,7 +4440,6 @@ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, - "license": "MIT", "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" @@ -4721,8 +4555,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/doctrine": { "version": "0.0.9", @@ -4730,10 +4563,30 @@ "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==", "dev": true }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, @@ -4769,7 +4622,6 @@ "resolved": "https://registry.npmjs.org/@types/geojson-vt/-/geojson-vt-3.2.5.tgz", "integrity": "sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g==", "dev": true, - "peer": true, "dependencies": { "@types/geojson": "*" } @@ -4783,8 +4635,7 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/lodash": { "version": "4.17.23", @@ -4796,15 +4647,13 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.4.tgz", "integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@types/mapbox__vector-tile": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.4.tgz", "integrity": "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==", "dev": true, - "peer": true, "dependencies": { "@types/geojson": "*", "@types/mapbox__point-geometry": "*", @@ -4812,11 +4661,10 @@ } }, "node_modules/@types/mdx": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.14.tgz", - "integrity": "sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==", - "dev": true, - "license": "MIT" + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "dev": true }, "node_modules/@types/mime": { "version": "1.3.5", @@ -4835,8 +4683,7 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz", "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@types/plotly.js": { "version": "2.35.1", @@ -4929,7 +4776,6 @@ "resolved": "https://registry.npmjs.org/@types/supercluster/-/supercluster-7.1.3.tgz", "integrity": "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==", "dev": true, - "peer": true, "dependencies": { "@types/geojson": "*" } @@ -4960,8 +4806,7 @@ "version": "9.0.8", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/webxr": { "version": "0.5.22", @@ -5019,6 +4864,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.1.tgz", "integrity": "sha512-rBnTWHCdbYM2lh7hjyXqxk70wvon3p2FyaniZuey5TrcGBpfhVp0OxOa6gxr9Q9YhZFKyfbEnxc24ZnVbbUkCA==", "dev": true, + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.18.1", "@typescript-eslint/types": "8.18.1", @@ -5118,9 +4964,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", - "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5128,13 +4974,12 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.2" + "brace-expansion": "^2.0.1" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -5771,13 +5616,12 @@ } }, "node_modules/@vitest/mocker": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.8.tgz", - "integrity": "sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz", + "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==", "dev": true, - "license": "MIT", "dependencies": { - "@vitest/spy": "4.1.8", + "@vitest/spy": "4.0.18", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -5786,7 +5630,7 @@ }, "peerDependencies": { "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + "vite": "^6.0.0 || ^7.0.0-0" }, "peerDependenciesMeta": { "msw": { @@ -5798,11 +5642,10 @@ } }, "node_modules/@vitest/mocker/node_modules/@vitest/spy": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.8.tgz", - "integrity": "sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz", + "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==", "dev": true, - "license": "MIT", "funding": { "url": "https://opencollective.com/vitest" } @@ -5812,7 +5655,6 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -5830,13 +5672,12 @@ } }, "node_modules/@vitest/runner": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.8.tgz", - "integrity": "sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.18.tgz", + "integrity": "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==", "dev": true, - "license": "MIT", "dependencies": { - "@vitest/utils": "4.1.8", + "@vitest/utils": "4.0.18", "pathe": "^2.0.3" }, "funding": { @@ -5844,52 +5685,46 @@ } }, "node_modules/@vitest/runner/node_modules/@vitest/pretty-format": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.8.tgz", - "integrity": "sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", + "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==", "dev": true, - "license": "MIT", "dependencies": { - "tinyrainbow": "^3.1.0" + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/runner/node_modules/@vitest/utils": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.8.tgz", - "integrity": "sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz", + "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==", "dev": true, - "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.8", - "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.1.0" + "@vitest/pretty-format": "4.0.18", + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/runner/node_modules/tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/@vitest/snapshot": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.8.tgz", - "integrity": "sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.18.tgz", + "integrity": "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==", "dev": true, - "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.8", - "@vitest/utils": "4.1.8", + "@vitest/pretty-format": "4.0.18", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -5898,39 +5733,22 @@ } }, "node_modules/@vitest/snapshot/node_modules/@vitest/pretty-format": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.8.tgz", - "integrity": "sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", + "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==", "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot/node_modules/@vitest/utils": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.8.tgz", - "integrity": "sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==", - "dev": true, - "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.8", - "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.1.0" + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/snapshot/node_modules/tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -6045,9 +5863,9 @@ } }, "node_modules/@vue/language-core/node_modules/brace-expansion": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", - "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6055,13 +5873,12 @@ } }, "node_modules/@vue/language-core/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.2" + "brace-expansion": "^2.0.1" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -6081,7 +5898,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, - "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" @@ -6091,29 +5907,25 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, - "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", @@ -6124,15 +5936,13 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -6145,7 +5955,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, - "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -6155,7 +5964,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, - "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -6164,15 +5972,13 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -6189,7 +5995,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", @@ -6203,7 +6008,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -6216,7 +6020,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", @@ -6231,7 +6034,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" @@ -6248,29 +6050,26 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/abs-svg-path": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz", "integrity": "sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, - "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -6278,26 +6077,11 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -6312,11 +6096,11 @@ } }, "node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -6329,11 +6113,10 @@ } }, "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -6347,11 +6130,10 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -6367,8 +6149,16 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, - "license": "MIT" + "peerDependencies": { + "ajv": "^6.9.1" + } }, "node_modules/alien-signals": { "version": "0.4.14", @@ -6380,8 +6170,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/almost-equal/-/almost-equal-1.1.0.tgz", "integrity": "sha512-0V/PkoculFl5+0Lp47JoxUcO0xSxhIBvm+BxHdD/OgXNmdRpRHCFnKVuUoWyS9EzQP+otSGv0m9Lb4yVkQBn2A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/ansi-escapes": { "version": "4.3.2", @@ -6461,8 +6250,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" + "dev": true }, "node_modules/aria-hidden": { "version": "1.2.6", @@ -6489,15 +6277,13 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-bounds/-/array-bounds-1.0.1.tgz", "integrity": "sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -6507,7 +6293,6 @@ "resolved": "https://registry.npmjs.org/array-normalize/-/array-normalize-1.1.4.tgz", "integrity": "sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg==", "dev": true, - "peer": true, "dependencies": { "array-bounds": "^1.0.0" } @@ -6516,15 +6301,13 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-range/-/array-range-1.0.1.tgz", "integrity": "sha512-shdaI1zT3CVNL2hnx9c0JMc0ZogGaxDs5e85akgHWKYa0yVbIyp06Ind3dVkTj/uuFrzaHBOyqFzo+VV6aXgtA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/array-rearrange": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/array-rearrange/-/array-rearrange-2.2.2.tgz", "integrity": "sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w==", - "dev": true, - "peer": true + "dev": true }, "node_modules/array-union": { "version": "2.1.0", @@ -6566,8 +6349,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/autoprefixer": { "version": "10.4.20", @@ -6622,43 +6404,15 @@ } }, "node_modules/axios": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.17.0.tgz", - "integrity": "sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw==", - "dev": true, - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", - "https-proxy-agent": "^5.0.1", - "proxy-from-env": "^2.1.0" - } - }, - "node_modules/axios/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/axios/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", + "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/balanced-match": { @@ -6671,24 +6425,10 @@ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", "dev": true, - "peer": true, "engines": { "node": ">= 0.6.0" } }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.35", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.35.tgz", - "integrity": "sha512-honAfLBde0HAFLdNyBEfuuENkF6zR+ozxqxa/2zJKHBe1qzLqyTSeRKpdPEHAP03rlDGyQOPnCSxnVpVqQo9Mg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/better-opn": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", @@ -6725,38 +6465,34 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz", "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/bit-twiddle": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz", "integrity": "sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/bitmap-sdf": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/bitmap-sdf/-/bitmap-sdf-1.0.4.tgz", "integrity": "sha512-1G3U4n5JE6RAiALMxu0p1XmeZkTeCwGKykzsLTCqVzfSDaN6S7fKnkIkfejogz+iwqBWc0UYAIKnKHNN7pSfDg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/bl": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", "dev": true, - "peer": true, "dependencies": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" } }, "node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -6781,9 +6517,9 @@ "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==" }, "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", "dev": true, "funding": [ { @@ -6799,13 +6535,12 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", + "peer": true, "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -6818,31 +6553,17 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "peer": true - }, - "node_modules/buffer-image-size": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/buffer-image-size/-/buffer-image-size-0.6.4.tgz", - "integrity": "sha512-nEh+kZOPY1w+gcCMobZ6ETUp9WfibndnosbpwB1iJk/8Gt5ZF2bhS6+B6bPYz424KtwsR6Rflc3tCz1/ghX2dQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - }, - "engines": { - "node": ">=4.0" - } + "dev": true }, "node_modules/call-bind": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", - "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "get-intrinsic": "^1.3.0", + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" }, "engines": { @@ -6886,7 +6607,6 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -6900,9 +6620,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001797", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001797.tgz", - "integrity": "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w==", + "version": "1.0.30001690", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", + "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", "dev": true, "funding": [ { @@ -6917,15 +6637,13 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/canvas-fit": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/canvas-fit/-/canvas-fit-1.5.0.tgz", "integrity": "sha512-onIcjRpz69/Hx5bB5HGbYKUF2uC6QT6Gp+pfpGm3A7mPfcluSLV5v4Zu+oflDUwLdUw0rLIBhUbi0v8hM4FJQQ==", "dev": true, - "peer": true, "dependencies": { "element-size": "^1.1.1" } @@ -7010,7 +6728,6 @@ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, - "peer": true, "engines": { "node": ">=6.0" } @@ -7019,8 +6736,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz", "integrity": "sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/class-variance-authority": { "version": "0.7.1", @@ -7134,7 +6850,6 @@ "resolved": "https://registry.npmjs.org/color-alpha/-/color-alpha-1.0.4.tgz", "integrity": "sha512-lr8/t5NPozTSqli+duAN+x+no/2WaKTeWvxhHGN+aXT6AJ8vPlzLa7UriyjWak0pSC2jHol9JgjBYnnHsGha9A==", "dev": true, - "peer": true, "dependencies": { "color-parse": "^1.3.8" } @@ -7144,7 +6859,6 @@ "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.3.tgz", "integrity": "sha512-BADfVl/FHkQkyo8sRBwMYBqemqsgnu7JZAwUgvBvuwwuNUZAhSvLTbsEErS5bQXzOjDR0dWzJ4vXN2Q+QoPx0A==", "dev": true, - "peer": true, "dependencies": { "color-name": "^1.0.0" } @@ -7165,7 +6879,6 @@ "resolved": "https://registry.npmjs.org/color-id/-/color-id-1.1.0.tgz", "integrity": "sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g==", "dev": true, - "peer": true, "dependencies": { "clamp": "^1.0.1" } @@ -7180,7 +6893,6 @@ "resolved": "https://registry.npmjs.org/color-normalize/-/color-normalize-1.5.0.tgz", "integrity": "sha512-rUT/HDXMr6RFffrR53oX3HGWkDOP9goSAQGBkUaAYKjOE2JxozccdGyufageWDlInRAjm/jYPrf/Y38oa+7obw==", "dev": true, - "peer": true, "dependencies": { "clamp": "^1.0.1", "color-rgba": "^2.1.1", @@ -7192,7 +6904,6 @@ "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-2.0.0.tgz", "integrity": "sha512-g2Z+QnWsdHLppAbrpcFWo629kLOnOPtpxYV69GCqm92gqSgyXbzlfyN3MXs0412fPBkFmiuS+rXposgBgBa6Kg==", "dev": true, - "peer": true, "dependencies": { "color-name": "^1.0.0" } @@ -7202,7 +6913,6 @@ "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-2.1.1.tgz", "integrity": "sha512-VaX97wsqrMwLSOR6H7rU1Doa2zyVdmShabKrPEIFywLlHoibgD3QW9Dw6fSqM4+H/LfjprDNAUUW31qEQcGzNw==", "dev": true, - "peer": true, "dependencies": { "clamp": "^1.0.1", "color-parse": "^1.3.8", @@ -7214,7 +6924,6 @@ "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.3.tgz", "integrity": "sha512-BADfVl/FHkQkyo8sRBwMYBqemqsgnu7JZAwUgvBvuwwuNUZAhSvLTbsEErS5bQXzOjDR0dWzJ4vXN2Q+QoPx0A==", "dev": true, - "peer": true, "dependencies": { "color-name": "^1.0.0" } @@ -7224,7 +6933,6 @@ "resolved": "https://registry.npmjs.org/color-space/-/color-space-1.16.0.tgz", "integrity": "sha512-A6WMiFzunQ8KEPFmj02OnnoUnqhmSaHaZ/0LVFcPTdlvm8+3aMJ5x1HRHy3bDHPkovkf4sS0f4wsVvwk71fKkg==", "dev": true, - "peer": true, "dependencies": { "hsluv": "^0.0.3", "mumath": "^3.3.4" @@ -7235,7 +6943,6 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, - "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -7277,7 +6984,6 @@ "engines": [ "node >= 0.8" ], - "peer": true, "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -7310,15 +7016,13 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/country-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/country-regex/-/country-regex-1.1.0.tgz", "integrity": "sha512-iSPlClZP8vX7MC3/u6s3lrDuoQyhQukh5LyABJ3hvfzbQ3Yyayd4fp04zjLnfi267B/B2FkumcWWgrbban7sSA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/cross-spawn": { "version": "7.0.6", @@ -7338,7 +7042,6 @@ "resolved": "https://registry.npmjs.org/css-font/-/css-font-1.2.0.tgz", "integrity": "sha512-V4U4Wps4dPDACJ4WpgofJ2RT5Yqwe1lEH6wlOOaIxMi0gTjdIijsc5FmxQlZ7ZZyKQkkutqqvULOp07l9c7ssA==", "dev": true, - "peer": true, "dependencies": { "css-font-size-keywords": "^1.0.0", "css-font-stretch-keywords": "^1.0.1", @@ -7355,43 +7058,37 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz", "integrity": "sha512-Q+svMDbMlelgCfH/RVDKtTDaf5021O486ZThQPIpahnIjUkMUslC+WuOQSWTgGSrNCH08Y7tYNEmmy0hkfMI8Q==", - "dev": true, - "peer": true + "dev": true }, "node_modules/css-font-stretch-keywords": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz", "integrity": "sha512-KmugPO2BNqoyp9zmBIUGwt58UQSfyk1X5DbOlkb2pckDXFSAfjsD5wenb88fNrD6fvS+vu90a/tsPpb9vb0SLg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/css-font-style-keywords": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz", "integrity": "sha512-0Fn0aTpcDktnR1RzaBYorIxQily85M2KXRpzmxQPgh8pxUN9Fcn00I8u9I3grNr1QXVgCl9T5Imx0ZwKU973Vg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/css-font-weight-keywords": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz", "integrity": "sha512-5So8/NH+oDD+EzsnF4iaG4ZFHQ3vaViePkL1ZbZ5iC/KrsCY+WHq/lvOgrtmuOQ9pBBZ1ADGpaf+A4lj1Z9eYA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/css-global-keywords": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/css-global-keywords/-/css-global-keywords-1.0.1.tgz", "integrity": "sha512-X1xgQhkZ9n94WDwntqst5D/FKkmiU0GlJSFZSV3kLvyJ1WC5VeyoXDOuleUD+SIuH9C7W05is++0Woh0CGfKjQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/css-loader": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", "dev": true, - "peer": true, "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", @@ -7427,7 +7124,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -7439,8 +7135,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz", "integrity": "sha512-1umTtVd/fXS25ftfjB71eASCrYhilmEsvDEI6wG/QplnmlfmVM5HkZ/ZX46DT5K3eblFPgLUHt5BRCb0YXkSFA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/css-tree": { "version": "3.2.1", @@ -7465,8 +7160,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==", - "dev": true, - "peer": true + "dev": true }, "node_modules/cssesc": { "version": "3.0.0", @@ -7513,7 +7207,6 @@ "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", "dev": true, - "peer": true, "dependencies": { "es5-ext": "^0.10.64", "type": "^2.7.2" @@ -7526,15 +7219,13 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/d3-collection": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/d3-color": { "version": "3.1.0", @@ -7560,15 +7251,13 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/d3-force": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", "dev": true, - "peer": true, "dependencies": { "d3-collection": "1", "d3-dispatch": "1", @@ -7586,7 +7275,6 @@ "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", "dev": true, - "peer": true, "dependencies": { "d3-array": "1" } @@ -7596,7 +7284,6 @@ "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-2.9.0.tgz", "integrity": "sha512-ZULvK/zBn87of5rWAfFMc9mJOipeSo57O+BBitsKIXmU4rTVAnX1kSsJkE0R+TxY8pGNoM1nbyRRE7GYHhdOEQ==", "dev": true, - "peer": true, "dependencies": { "commander": "2", "d3-array": "1", @@ -7615,15 +7302,13 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/d3-hierarchy": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/d3-interpolate": { "version": "3.0.1", @@ -7655,8 +7340,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/d3-random": { "version": "2.2.2", @@ -7733,8 +7417,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/d3-voronoi": { "version": "1.1.4", @@ -7834,7 +7517,6 @@ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", "dev": true, - "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7853,7 +7535,6 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -7870,8 +7551,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-kerning/-/detect-kerning-2.1.2.tgz", "integrity": "sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/detect-node-es": { "version": "1.1.0", @@ -7884,16 +7564,6 @@ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, - "node_modules/diff": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", - "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -7934,7 +7604,6 @@ "resolved": "https://registry.npmjs.org/draw-svg-path/-/draw-svg-path-1.0.0.tgz", "integrity": "sha512-P8j3IHxcgRMcY6sDzr0QvJDLzBnJJqpTG33UZ2Pvp8rw0apCHhJCWqYprqrXjrgHnJ6tuhP1iTJSAodPDHxwkg==", "dev": true, - "peer": true, "dependencies": { "abs-svg-path": "~0.1.1", "normalize-svg-path": "~0.1.0" @@ -7945,7 +7614,6 @@ "resolved": "https://registry.npmjs.org/dtype/-/dtype-2.0.0.tgz", "integrity": "sha512-s2YVcLKdFGS0hpFqJaTwscsyt0E8nNFdmo73Ocd81xNPj4URI4rj6D60A+vFMIw7BXWlb4yRkEwfBqcZzPGiZg==", "dev": true, - "peer": true, "engines": { "node": ">= 0.8.0" } @@ -7967,15 +7635,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/dup/-/dup-1.0.0.tgz", "integrity": "sha512-Bz5jxMMC0wgp23Zm15ip1x8IhYRqJvF3nFC0UInJUDkN1z4uNPk9jTnfCUJXbOGiQ1JbXLQsiV41Fb+HXcj5BA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, - "peer": true, "dependencies": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -7987,8 +7653,7 @@ "version": "2.2.4", "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/eastasianwidth": { "version": "0.2.0", @@ -7996,25 +7661,22 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "node_modules/electron-to-chromium": { - "version": "1.5.371", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.371.tgz", - "integrity": "sha512-e9htk9mAYL6AzmkEhSvVVw7IWGSBJ/Bqdn2eRyRLrj1g6sncN4WbFt5qnILYoCktktr45pyjIrOiRvBThQ808w==", - "dev": true, - "license": "ISC" + "version": "1.5.75", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.75.tgz", + "integrity": "sha512-Lf3++DumRE/QmweGjU+ZcKqQ+3bKkU/qjaKYhIJKEOhgIO9Xs6IiAQFkfFoj+RhgDk4LUeNsLo6plExHqSyu6Q==", + "dev": true }, "node_modules/element-size": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/element-size/-/element-size-1.1.1.tgz", "integrity": "sha512-eaN+GMOq/Q+BIWy0ybsgpcYImjGIdNLyjLFJU4XsLHXYQao5jCNb36GyN6C2qwmDDYSfIBmKpPpr4VnBdLCsPQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/elementary-circuits-directed-graph": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/elementary-circuits-directed-graph/-/elementary-circuits-directed-graph-1.3.1.tgz", "integrity": "sha512-ZEiB5qkn2adYmpXGnJKkxT8uJHlW/mxmBpmeqawEHzPxh9HkLD4/1mFYX5l0On+f6rcPIt8/EWlRU2Vo3fX6dQ==", "dev": true, - "peer": true, "dependencies": { "strongly-connected-components": "^1.0.1" } @@ -8035,21 +7697,18 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, - "peer": true, "dependencies": { "once": "^1.4.0" } }, "node_modules/enhanced-resolve": { - "version": "5.23.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.23.0.tgz", - "integrity": "sha512-yJN/BOOLxcOW2aQgeif9mSnaUB8KtvmMMp56oA1kx1CRfBKbhZm2pJ+NBY+3eOboHxix8lfjWpHE0Ei5U8RbSA==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", + "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.3.3" + "tapable": "^2.2.0" }, "engines": { "node": ">=10.13.0" @@ -8084,11 +7743,10 @@ } }, "node_modules/es-module-lexer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", - "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", - "dev": true, - "license": "MIT" + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true }, "node_modules/es-object-atoms": { "version": "1.1.1", @@ -8102,29 +7760,12 @@ "node": ">= 0.4" } }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es5-ext": { "version": "0.10.64", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", "dev": true, "hasInstallScript": true, - "peer": true, "dependencies": { "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.3", @@ -8140,7 +7781,6 @@ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", "dev": true, - "peer": true, "dependencies": { "d": "1", "es5-ext": "^0.10.35", @@ -8152,7 +7792,6 @@ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", "dev": true, - "peer": true, "dependencies": { "d": "^1.0.2", "ext": "^1.7.0" @@ -8166,7 +7805,6 @@ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", "dev": true, - "peer": true, "dependencies": { "d": "1", "es5-ext": "^0.10.46", @@ -8180,6 +7818,7 @@ "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -8252,7 +7891,6 @@ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, - "peer": true, "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", @@ -8270,32 +7908,32 @@ } }, "node_modules/eslint": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", - "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz", + "integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.2", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.5", - "@eslint/js": "9.39.4", - "@eslint/plugin-kit": "^0.4.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.9.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.17.0", + "@eslint/plugin-kit": "^0.2.3", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", + "@humanwhocodes/retry": "^0.4.1", "@types/estree": "^1.0.6", - "ajv": "^6.14.0", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -8307,7 +7945,7 @@ "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.1.5", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -8384,11 +8022,10 @@ } }, "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -8401,11 +8038,10 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -8413,25 +8049,11 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/esniff": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", "dev": true, - "peer": true, "dependencies": { "d": "^1.0.1", "es5-ext": "^0.10.62", @@ -8443,15 +8065,14 @@ } }, "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "eslint-visitor-keys": "^4.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8525,7 +8146,6 @@ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", "dev": true, - "peer": true, "dependencies": { "d": "1", "es5-ext": "~0.10.14" @@ -8536,7 +8156,6 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, - "peer": true, "engines": { "node": ">=0.8.x" } @@ -8555,7 +8174,6 @@ "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", "dev": true, - "peer": true, "dependencies": { "type": "^2.7.2" } @@ -8565,7 +8183,6 @@ "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz", "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==", "dev": true, - "peer": true, "dependencies": { "acorn": "^7.1.1", "isarray": "^2.0.1" @@ -8579,7 +8196,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -8624,7 +8240,6 @@ "resolved": "https://registry.npmjs.org/fast-isnumeric/-/fast-isnumeric-1.1.4.tgz", "integrity": "sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw==", "dev": true, - "peer": true, "dependencies": { "is-string-blank": "^1.0.1" } @@ -8642,9 +8257,9 @@ "dev": true }, "node_modules/fast-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", - "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.5.tgz", + "integrity": "sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==", "dev": true, "funding": [ { @@ -8655,8 +8270,7 @@ "type": "opencollective", "url": "https://opencollective.com/fastify" } - ], - "license": "BSD-3-Clause" + ] }, "node_modules/fastq": { "version": "1.18.0", @@ -8800,26 +8414,24 @@ } }, "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", - "dev": true, - "license": "ISC" + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true }, "node_modules/flatten-vertex-data": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz", "integrity": "sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw==", "dev": true, - "peer": true, "dependencies": { "dtype": "^2.0.0" } }, "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "dev": true, "funding": [ { @@ -8827,7 +8439,6 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -8842,7 +8453,6 @@ "resolved": "https://registry.npmjs.org/font-atlas/-/font-atlas-2.1.0.tgz", "integrity": "sha512-kP3AmvX+HJpW4w3d+PiPR2X6E1yvsBXt2yhuCw+yReO9F1WYhvZwx3c95DGZGwg9xYzDGrgJYa885xmVA+28Cg==", "dev": true, - "peer": true, "dependencies": { "css-font": "^1.0.0" } @@ -8852,7 +8462,6 @@ "resolved": "https://registry.npmjs.org/font-measure/-/font-measure-1.2.2.tgz", "integrity": "sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA==", "dev": true, - "peer": true, "dependencies": { "css-font": "^1.2.0" } @@ -8888,16 +8497,13 @@ } }, "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "dev": true, - "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -8922,7 +8528,6 @@ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", "dev": true, - "peer": true, "dependencies": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" @@ -8963,15 +8568,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -8985,8 +8581,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz", "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/get-caller-file": { "version": "2.0.5", @@ -9001,8 +8596,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", "integrity": "sha512-LnpfLf/TNzr9zVOGiIY6aKCz8EKuXmlYNV7CM2pUjBa/B+c2I15tS7KLySep75+FuerJdmArvJLcsAXWEy2H0A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/get-intrinsic": { "version": "1.3.0", @@ -9054,7 +8648,6 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "peer": true, "engines": { "node": ">=10" }, @@ -9097,22 +8690,19 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gl-mat4/-/gl-mat4-1.2.0.tgz", "integrity": "sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/gl-matrix": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/gl-text": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/gl-text/-/gl-text-1.4.0.tgz", "integrity": "sha512-o47+XBqLCj1efmuNyCHt7/UEJmB9l66ql7pnobD6p+sgmBUdzfMZXIF0zD2+KRfpd99DJN+QXdvTFAGCKCVSmQ==", "dev": true, - "peer": true, "dependencies": { "bit-twiddle": "^1.0.2", "color-normalize": "^1.5.0", @@ -9138,7 +8728,6 @@ "resolved": "https://registry.npmjs.org/gl-util/-/gl-util-3.1.3.tgz", "integrity": "sha512-dvRTggw5MSkJnCbh74jZzSoTOGnVYK+Bt+Ckqm39CVcl6+zSsxqWk4lr5NKhkqXHL6qvZAU9h17ZF8mIskY9mA==", "dev": true, - "peer": true, "dependencies": { "is-browser": "^2.0.1", "is-firefox": "^1.0.3", @@ -9150,11 +8739,9 @@ } }, "node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -9185,26 +8772,23 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true + "dev": true }, "node_modules/glob/node_modules/brace-expansion": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", - "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/glob/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "license": "ISC", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dependencies": { - "brace-expansion": "^2.0.2" + "brace-expansion": "^2.0.1" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -9218,7 +8802,6 @@ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-4.0.0.tgz", "integrity": "sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==", "dev": true, - "peer": true, "dependencies": { "ini": "^4.1.3", "kind-of": "^6.0.3", @@ -9233,7 +8816,6 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, - "peer": true, "engines": { "node": ">=16" } @@ -9243,7 +8825,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, - "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -9297,7 +8878,6 @@ "resolved": "https://registry.npmjs.org/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz", "integrity": "sha512-W49jIhuDtF6w+7wCMcClk27a2hq8znvHtlGnrYkSWEr8tHe9eA2dcnohlcAmxLYBSpSSdzOkRdyPTrx9fw49+A==", "dev": true, - "peer": true, "dependencies": { "glsl-token-inject-block": "^1.0.0", "glsl-token-string": "^1.0.1", @@ -9309,7 +8889,6 @@ "resolved": "https://registry.npmjs.org/glsl-resolve/-/glsl-resolve-0.0.1.tgz", "integrity": "sha512-xxFNsfnhZTK9NBhzJjSBGX6IOqYpvBHxxmo+4vapiljyGNCY0Bekzn0firQkQrazK59c1hYxMDxYS8MDlhw4gA==", "dev": true, - "peer": true, "dependencies": { "resolve": "^0.6.1", "xtend": "^2.1.2" @@ -9319,15 +8898,13 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", "integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/glsl-resolve/node_modules/xtend": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==", "dev": true, - "peer": true, "engines": { "node": ">=0.4" } @@ -9336,15 +8913,13 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz", "integrity": "sha512-OwXrxixCyHzzA0U2g4btSNAyB2Dx8XrztY5aVUCjRSh4/D0WoJn8Qdps7Xub3sz6zE73W3szLrmWtQ7QMpeHEQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/glsl-token-defines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz", "integrity": "sha512-Vb5QMVeLjmOwvvOJuPNg3vnRlffscq2/qvIuTpMzuO/7s5kT+63iL6Dfo2FYLWbzuiycWpbC0/KV0biqFwHxaQ==", "dev": true, - "peer": true, "dependencies": { "glsl-tokenizer": "^2.0.0" } @@ -9353,15 +8928,13 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz", "integrity": "sha512-eQnIBLc7vFf8axF9aoi/xW37LSWd2hCQr/3sZui8aBJnksq9C7zMeUYHVJWMhFzXrBU7fgIqni4EhXVW4/krpg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/glsl-token-descope": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz", "integrity": "sha512-kS2PTWkvi/YOeicVjXGgX5j7+8N7e56srNDEHDTVZ1dcESmbmpmgrnpjPcjxJjMxh56mSXYoFdZqb90gXkGjQw==", "dev": true, - "peer": true, "dependencies": { "glsl-token-assignments": "^2.0.0", "glsl-token-depth": "^1.1.0", @@ -9373,43 +8946,37 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz", "integrity": "sha512-q/m+ukdUBuHCOtLhSr0uFb/qYQr4/oKrPSdIK2C4TD+qLaJvqM9wfXIF/OOBjuSA3pUoYHurVRNao6LTVVUPWA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/glsl-token-properties": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz", "integrity": "sha512-dSeW1cOIzbuUoYH0y+nxzwK9S9O3wsjttkq5ij9ZGw0OS41BirKJzzH48VLm8qLg+au6b0sINxGC0IrGwtQUcA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/glsl-token-scope": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz", "integrity": "sha512-YKyOMk1B/tz9BwYUdfDoHvMIYTGtVv2vbDSLh94PT4+f87z21FVdou1KNKgF+nECBTo0fJ20dpm0B1vZB1Q03A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/glsl-token-string": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz", "integrity": "sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/glsl-token-whitespace-trim": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz", "integrity": "sha512-ZJtsPut/aDaUdLUNtmBYhaCmhIjpKNg7IgZSfX5wFReMc2vnj8zok+gB/3Quqs0TsBSX/fGnqUUYZDqyuc2xLQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/glsl-tokenizer": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz", "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==", "dev": true, - "peer": true, "dependencies": { "through2": "^0.6.3" } @@ -9418,15 +8985,13 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/glsl-tokenizer/node_modules/readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dev": true, - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -9438,15 +9003,13 @@ "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/glsl-tokenizer/node_modules/through2": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", "dev": true, - "peer": true, "dependencies": { "readable-stream": ">=1.0.33-1 <1.1.0-0", "xtend": ">=4.0.0 <4.1.0-0" @@ -9457,7 +9020,6 @@ "resolved": "https://registry.npmjs.org/glslify/-/glslify-7.1.1.tgz", "integrity": "sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog==", "dev": true, - "peer": true, "dependencies": { "bl": "^2.2.1", "concat-stream": "^1.5.2", @@ -9484,7 +9046,6 @@ "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.1.1.tgz", "integrity": "sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==", "dev": true, - "peer": true, "dependencies": { "glsl-inject-defines": "^1.0.1", "glsl-token-defines": "^1.0.0", @@ -9503,7 +9064,6 @@ "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.2.tgz", "integrity": "sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==", "dev": true, - "peer": true, "dependencies": { "@choojs/findup": "^0.2.0", "events": "^3.2.0", @@ -9550,23 +9110,20 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz", "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/happy-dom": { - "version": "20.10.2", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-20.10.2.tgz", - "integrity": "sha512-5p9Sxis3eowDJKqx90QCsgbNA02XXqJ59NOHvD4V6cxp+rP4d/xOyVx7uY3hS8hiUbY1VeiFH8lbJ81AyuDVLQ==", + "version": "20.8.3", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-20.8.3.tgz", + "integrity": "sha512-lMHQRRwIPyJ70HV0kkFT7jH/gXzSI7yDkQFe07E2flwmNDFoWUTRMKpW2sglsnpeA7b6S2TJPp98EbQxai8eaQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": ">=20.0.0", "@types/whatwg-mimetype": "^3.0.2", "@types/ws": "^8.18.1", - "buffer-image-size": "^0.6.4", "entities": "^7.0.1", "whatwg-mimetype": "^3.0.0", - "ws": "^8.21.0" + "ws": "^8.18.3" }, "engines": { "node": ">=20.0.0" @@ -9607,7 +9164,6 @@ "resolved": "https://registry.npmjs.org/has-hover/-/has-hover-1.0.1.tgz", "integrity": "sha512-0G6w7LnlcpyDzpeGUTuT0CEw05+QlMuGVk1IHNAlHrGJITGodjZu3x8BNDUMfKJSZXNB2ZAclqc1bvrd+uUpfg==", "dev": true, - "peer": true, "dependencies": { "is-browser": "^2.0.1" } @@ -9617,7 +9173,6 @@ "resolved": "https://registry.npmjs.org/has-passive-events/-/has-passive-events-1.0.0.tgz", "integrity": "sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw==", "dev": true, - "peer": true, "dependencies": { "is-browser": "^2.0.1" } @@ -9690,8 +9245,7 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/hsluv/-/hsluv-0.0.3.tgz", "integrity": "sha512-08iL2VyCRbkQKBySkSh6m8zMUa3sADAxGVWs3Z1aPcUkTJeK0ETG4Fc27tEmQBGUAXZjIsXOZqBvacuVNSC/fQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/html-encoding-sniffer": { "version": "6.0.0", @@ -9731,28 +9285,11 @@ "node": ">= 14" } }, - "node_modules/husky": { - "version": "9.1.7", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", - "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", - "dev": true, - "license": "MIT", - "bin": { - "husky": "bin.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -9765,7 +9302,6 @@ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, - "peer": true, "engines": { "node": "^10 || ^12 || >= 14" }, @@ -9791,8 +9327,7 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "peer": true + ] }, "node_modules/ignore": { "version": "5.3.2", @@ -9804,11 +9339,10 @@ } }, "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -9825,7 +9359,6 @@ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -9858,7 +9391,6 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", "dev": true, - "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -9903,8 +9435,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-browser/-/is-browser-2.1.0.tgz", "integrity": "sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/is-callable": { "version": "1.2.7", @@ -9960,7 +9491,6 @@ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" }, @@ -9973,7 +9503,6 @@ "resolved": "https://registry.npmjs.org/is-firefox/-/is-firefox-1.0.3.tgz", "integrity": "sha512-6Q9ITjvWIm0Xdqv+5U12wgOKEM2KoBw4Y926m0OFkvlCxnbG94HKAsVz8w3fWcfAS5YA2fJORXX1dLrkprCCxA==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -9987,14 +9516,13 @@ } }, "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" }, @@ -10021,7 +9549,6 @@ "resolved": "https://registry.npmjs.org/is-iexplorer/-/is-iexplorer-1.0.0.tgz", "integrity": "sha512-YeLzceuwg3K6O0MLM3UyUUjKAlyULetwryFp1mHy1I5PfArK0AEqlfa+MR4gkJjcbuJXoDJCvXbyqZVf5CR2Sg==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -10030,8 +9557,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-4.0.0.tgz", "integrity": "sha512-mlcHZA84t1qLSuWkt2v0I2l61PYdyQDt4aG1mLIXF5FDMm4+haBCxCPYSr/uwqQNRk1MiTizn0ypEuRAOLRAew==", - "dev": true, - "peer": true + "dev": true }, "node_modules/is-node-process": { "version": "1.2.0", @@ -10052,7 +9578,6 @@ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -10062,7 +9587,6 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -10095,15 +9619,13 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-string-blank/-/is-string-blank-1.0.1.tgz", "integrity": "sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/is-svg-path": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-svg-path/-/is-svg-path-1.0.2.tgz", "integrity": "sha512-Lj4vePmqpPR1ZnRctHv8ltSh1OrSxHkhUkd7wi+VQdcdP15/KvQFyk7LhNuM7ZW0EVbJz8kZLVmL9quLrfq4Kg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/is-typed-array": { "version": "1.1.15", @@ -10136,8 +9658,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/isexe": { "version": "2.0.0", @@ -10163,8 +9684,6 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -10179,8 +9698,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -10203,8 +9720,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/js-tokens": { "version": "4.0.0", @@ -10212,21 +9728,10 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", - "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/nodeca" - } - ], - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -10235,9 +9740,9 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.8.0.tgz", - "integrity": "sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", + "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", "license": "MIT", "engines": { "node": ">=12.0.0" @@ -10313,6 +9818,12 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -10329,8 +9840,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==", - "dev": true, - "peer": true + "dev": true }, "node_modules/json5": { "version": "2.2.3", @@ -10359,8 +9869,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz", "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/keyv": { "version": "4.5.4", @@ -10376,7 +9885,6 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -10417,18 +9925,12 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/loader-runner": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", - "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, - "license": "MIT", - "peer": true, "engines": { "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" } }, "node_modules/local-pkg": { @@ -10463,10 +9965,9 @@ } }, "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "license": "MIT" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.merge": { "version": "4.6.2", @@ -10547,7 +10048,6 @@ "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz", "integrity": "sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==", "dev": true, - "peer": true, "dependencies": { "once": "~1.3.0" } @@ -10557,7 +10057,6 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", "dev": true, - "peer": true, "dependencies": { "wrappy": "1" } @@ -10606,7 +10105,6 @@ "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-4.7.1.tgz", "integrity": "sha512-lgL7XpIwsgICiL82ITplfS7IGwrB1OJIw/pCvprDp2dhmSSEBgmPzYRvwYYYvJGJD7fxUv1Tvpih4nZ6VrLuaA==", "dev": true, - "peer": true, "dependencies": { "@mapbox/geojson-rewind": "^0.5.2", "@mapbox/jsonlint-lines-primitives": "^2.0.2", @@ -10647,50 +10145,43 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.6.tgz", "integrity": "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/maplibre-gl/node_modules/@mapbox/unitbezier": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/maplibre-gl/node_modules/earcut": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.1.tgz", "integrity": "sha512-0l1/0gOjESMeQyYaK5IDiPNvFeu93Z/cO0TjZh9eZ1vyCtZnA7KMZ8rQggpsJHIbGSdrqYq9OhuveadOVHCshw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/maplibre-gl/node_modules/geojson-vt": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-4.0.2.tgz", "integrity": "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/maplibre-gl/node_modules/potpack": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.0.0.tgz", "integrity": "sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/maplibre-gl/node_modules/quickselect": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==", - "dev": true, - "peer": true + "dev": true }, "node_modules/maplibre-gl/node_modules/supercluster": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz", "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==", "dev": true, - "peer": true, "dependencies": { "kdbush": "^4.0.2" } @@ -10699,8 +10190,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", - "dev": true, - "peer": true + "dev": true }, "node_modules/math-expression-evaluator": { "version": "1.4.0", @@ -10721,7 +10211,6 @@ "resolved": "https://registry.npmjs.org/math-log2/-/math-log2-1.0.1.tgz", "integrity": "sha512-9W0yGtkaMAkf74XGYVy4Dqw3YUMnTNB2eeiw9aQbUl4A3KmuCEHTt2DgAB07ENzOYAjsYSAYufkAq0Zd+jU7zA==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -10744,9 +10233,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT", - "peer": true + "dev": true }, "node_modules/merge2": { "version": "1.4.1", @@ -10806,42 +10293,15 @@ } }, "node_modules/minimatch": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.3.tgz", - "integrity": "sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimatch/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/minimatch/node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "MIT", "dependencies": { - "balanced-match": "^4.0.2" + "brace-expansion": "^1.1.7" }, "engines": { - "node": "18 || 20 || >=22" + "node": "*" } }, "node_modules/minimist": { @@ -10884,7 +10344,6 @@ "resolved": "https://registry.npmjs.org/mouse-change/-/mouse-change-1.4.0.tgz", "integrity": "sha512-vpN0s+zLL2ykyyUDh+fayu9Xkor5v/zRD9jhSqjRS1cJTGS0+oakVZzNm5n19JvvEj0you+MXlYTpNxUDQUjkQ==", "dev": true, - "peer": true, "dependencies": { "mouse-event": "^1.0.0" } @@ -10893,22 +10352,19 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/mouse-event/-/mouse-event-1.0.5.tgz", "integrity": "sha512-ItUxtL2IkeSKSp9cyaX2JLUuKk2uMoxBg4bbOWVd29+CskYJR9BGsUqtXenNzKbnDshvupjUewDIYVrOB6NmGw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/mouse-event-offset": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz", "integrity": "sha512-s9sqOs5B1Ykox3Xo8b3Ss2IQju4UwlW6LSR+Q5FXWpprJ5fzMLefIIItr3PH8RwzfGy6gxs/4GAmiNuZScE25w==", - "dev": true, - "peer": true + "dev": true }, "node_modules/mouse-wheel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mouse-wheel/-/mouse-wheel-1.2.0.tgz", "integrity": "sha512-+OfYBiUOCTWcTECES49neZwL5AoGkXE+lFjIvzwNCnYRlso+EnfvovcBxGoyQ0yQt806eSPjS675K0EwWknXmw==", "dev": true, - "peer": true, "dependencies": { "right-now": "^1.0.0", "signum": "^1.0.0", @@ -10926,6 +10382,7 @@ "integrity": "sha512-GLU8gx0o7RBG/3x/eTnnLd5S5ZInxXRRRMN8GJwaPZ4jpJTxzQfWGvwr90e8L5dkKJnz+gT4gQYCprLy/c4kVw==", "dev": true, "hasInstallScript": true, + "peer": true, "dependencies": { "@bundled-es-modules/cookie": "^2.0.1", "@bundled-es-modules/statuses": "^1.0.1", @@ -11000,7 +10457,6 @@ "integrity": "sha512-VAFIOG6rsxoc7q/IaY3jdjmrsuX9f15KlRLYTHmixASBZkZEKC1IFqE2BC5CdhXmK6WLM1Re33z//AGmeRI6FA==", "deprecated": "Redundant dependency in your project.", "dev": true, - "peer": true, "dependencies": { "almost-equal": "^1.1.0" } @@ -11009,8 +10465,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/mute-stream": { "version": "2.0.0", @@ -11032,9 +10487,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", @@ -11053,8 +10508,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", "integrity": "sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/natural-compare": { "version": "1.4.0", @@ -11067,7 +10521,6 @@ "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", "dev": true, - "peer": true, "dependencies": { "debug": "^3.2.6", "iconv-lite": "^0.4.4", @@ -11085,7 +10538,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -11094,25 +10546,19 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/node-releases": { - "version": "2.0.47", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", - "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true }, "node_modules/normalize-path": { "version": "3.0.0", @@ -11135,15 +10581,13 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz", "integrity": "sha512-1/kmYej2iedi5+ROxkRESL/pI02pkg0OBnaR4hJkSIX6+ORzepwbuUXfrdZaPjysTsJInj0Rj5NuX027+dMBvA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/number-is-integer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-integer/-/number-is-integer-1.0.1.tgz", "integrity": "sha512-Dq3iuiFBkrbmuQjGFFF3zckXNCQoSD37/SdSbgcBailUx6knDvDwb5CympBgcoWHy36sfS12u74MHYkXyHq6bg==", "dev": true, - "peer": true, "dependencies": { "is-finite": "^1.0.1" }, @@ -11193,7 +10637,6 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "peer": true, "dependencies": { "wrappy": "1" } @@ -11287,7 +10730,6 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -11299,15 +10741,13 @@ "version": "3.1.8", "resolved": "https://registry.npmjs.org/parenthesis/-/parenthesis-3.1.8.tgz", "integrity": "sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/parse-rect": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/parse-rect/-/parse-rect-1.2.0.tgz", "integrity": "sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA==", "dev": true, - "peer": true, "dependencies": { "pick-by-alias": "^1.2.0" } @@ -11316,15 +10756,13 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz", "integrity": "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/parse-unit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz", "integrity": "sha512-hrqldJHokR3Qj88EIlV/kAyAi/G5R2+R56TBANxNMy0uPlYcttx0jnMW6Yx5KsKPSbC3KddM/7qQm3+0wEXKxg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/parse5": { "version": "8.0.0", @@ -11433,7 +10871,6 @@ "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.3.0.tgz", "integrity": "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==", "dev": true, - "peer": true, "dependencies": { "ieee754": "^1.1.12", "resolve-protobuf-schema": "^2.1.0" @@ -11446,15 +10883,13 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true, - "peer": true + "dev": true }, "node_modules/pick-by-alias": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pick-by-alias/-/pick-by-alias-1.2.0.tgz", "integrity": "sha512-ESj2+eBxhGrcA1azgHs7lARG5+5iLakc/6nlfbpjcLl00HuuUOIuORhYXN4D1HfvMSKuVtFQjAlnwi1JHEeDIw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/picocolors": { "version": "1.1.1", @@ -11462,10 +10897,9 @@ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "license": "MIT", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { "node": ">=8.6" }, @@ -11629,8 +11063,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/point-in-polygon/-/point-in-polygon-1.1.0.tgz", "integrity": "sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/polished": { "version": "4.3.1", @@ -11648,8 +11081,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/polybooljs/-/polybooljs-1.2.2.tgz", "integrity": "sha512-ziHW/02J0XuNuUtmidBc6GXE8YohYydp3DWPWXYsd7O721TjcmN+k6ezjdwkDqep+gnWnFY+yqZHvzElra2oCg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/possible-typed-array-names": { "version": "1.1.0", @@ -11661,9 +11093,9 @@ } }, "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "funding": [ { "type": "opencollective", @@ -11679,8 +11111,9 @@ } ], "license": "MIT", + "peer": true, "dependencies": { - "nanoid": "^3.3.12", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -11761,7 +11194,6 @@ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, - "peer": true, "engines": { "node": "^10 || ^12 || >= 14" }, @@ -11774,7 +11206,6 @@ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", "dev": true, - "peer": true, "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^7.0.0", @@ -11792,7 +11223,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", "dev": true, - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -11806,7 +11236,6 @@ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", "dev": true, - "peer": true, "dependencies": { "postcss-selector-parser": "^7.0.0" }, @@ -11822,7 +11251,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", "dev": true, - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -11836,7 +11264,6 @@ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, - "peer": true, "dependencies": { "icss-utils": "^5.0.0" }, @@ -11892,8 +11319,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/prelude-ls": { "version": "1.2.1", @@ -11910,6 +11336,7 @@ "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", "devOptional": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -11960,7 +11387,6 @@ "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz", "integrity": "sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==", "dev": true, - "peer": true, "dependencies": { "lodash.merge": "^4.6.2", "needle": "^2.5.2", @@ -11980,8 +11406,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "peer": true + "dev": true }, "node_modules/prop-types": { "version": "15.8.1", @@ -11999,22 +11424,16 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/protocol-buffers-schema": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.1.tgz", - "integrity": "sha512-VG2K63Igkiv9p76tk1lilczEK1cT+kCjKtkdhw1dQZV3k3IXJbd3o6Ho8b9zJZaHSnT2hKe4I+ObmX9w6m5SmQ==", - "dev": true, - "license": "MIT", - "peer": true + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", + "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==", + "dev": true }, "node_modules/proxy-from-env": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", - "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true }, "node_modules/psl": { "version": "1.15.0", @@ -12038,10 +11457,9 @@ } }, "node_modules/qs": { - "version": "6.15.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", - "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", - "license": "BSD-3-Clause", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "dependencies": { "side-channel": "^1.1.0" }, @@ -12081,15 +11499,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/raf": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", "dev": true, - "peer": true, "dependencies": { "performance-now": "^2.1.0" } @@ -12103,10 +11519,20 @@ "url": "https://opencollective.com/ramda" } }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -12163,6 +11589,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -12247,11 +11674,10 @@ } }, "node_modules/react-router": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.17.0.tgz", - "integrity": "sha512-FDELK7rTMlCHO5+reyXsPlmfr7N1F91lPHsWYfMEGQm/KQ+F4JFM8jGoeQDmDvdTs93Fw9aSilH+uKRb4/jXvQ==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.14.1.tgz", + "integrity": "sha512-5BCvFskyAAVumqhEKh/iPhLOIkfxcEUz8WqFIARCkMg8hZZzDYX9CtwxXA0e+qT8zAxmMC0x3Ckb9iMONwc5jg==", "license": "MIT", - "peer": true, "dependencies": { "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0" @@ -12270,13 +11696,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.30.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.4.tgz", - "integrity": "sha512-q4HvNl+mmDdkS0g+MqiBZNteQJCuimWoOyHMy4T/RQLAn9Z29+E91QXRaxOujeMl2HTzRSS0KFPd7lxX3PjV0Q==", - "license": "MIT", + "version": "6.30.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.0.tgz", + "integrity": "sha512-x30B78HV5tFk8ex0ITwzC9TTZMua4jGyA9IUlH1JLQYQTFyxr/ZxwOJq7evg1JX1qGVUcvhsmQSKdPncQrjTgA==", "dependencies": { - "@remix-run/router": "1.23.3", - "react-router": "6.30.4" + "@remix-run/router": "1.23.0", + "react-router": "6.30.0" }, "engines": { "node": ">=14.0.0" @@ -12287,12 +11712,12 @@ } }, "node_modules/react-router-dom/node_modules/react-router": { - "version": "6.30.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.4.tgz", - "integrity": "sha512-SVUsDe+DybHM/WmYKIVYhZh1o5Dcuf16yM6WjG02Q9XVFMZIJyHYhwrr6bFBXZkVP6z69kNkMyBCujt8FaFLJA==", + "version": "6.30.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.0.tgz", + "integrity": "sha512-D3X8FyH9nBcTSHGdEKurK7r8OYE1kKFn3d/CF+CoxbSHkxU7o37+Uh7eAHRXr6k2tSExXYO++07PeXJtA/dEhQ==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.23.3" + "@remix-run/router": "1.23.0" }, "engines": { "node": ">=14.0.0" @@ -12306,7 +11731,6 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -12379,7 +11803,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -12394,15 +11817,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "peer": true + "dev": true }, "node_modules/readdirp": { "version": "3.6.0", @@ -12487,15 +11908,13 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/@plotly/regl/-/regl-2.1.2.tgz", "integrity": "sha512-Mdk+vUACbQvjd0m/1JJjOOafmkp/EpmHjISsopEz5Av44CBq7rPC05HHNbYGKVyNUF2zmEoBS/TT0pd0SPFFyw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/regl-error2d": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/regl-error2d/-/regl-error2d-2.0.12.tgz", "integrity": "sha512-r7BUprZoPO9AbyqM5qlJesrSRkl+hZnVKWKsVp7YhOl/3RIpi4UDGASGJY0puQ96u5fBYw/OlqV24IGcgJ0McA==", "dev": true, - "peer": true, "dependencies": { "array-bounds": "^1.0.1", "color-normalize": "^1.5.0", @@ -12511,7 +11930,6 @@ "resolved": "https://registry.npmjs.org/regl-line2d/-/regl-line2d-3.1.3.tgz", "integrity": "sha512-fkgzW+tTn4QUQLpFKsUIE0sgWdCmXAM3ctXcCgoGBZTSX5FE2A0M7aynz7nrZT5baaftLrk9te54B+MEq4QcSA==", "dev": true, - "peer": true, "dependencies": { "array-bounds": "^1.0.1", "array-find-index": "^1.0.2", @@ -12531,7 +11949,6 @@ "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.3.1.tgz", "integrity": "sha512-seOmMIVwaCwemSYz/y4WE0dbSO9svNFSqtTh5RE57I7PjGo3tcUYKtH0MTSoshcAsreoqN8HoCtnn8wfHXXfKQ==", "dev": true, - "peer": true, "dependencies": { "@plotly/point-cluster": "^3.1.9", "array-range": "^1.0.1", @@ -12555,7 +11972,6 @@ "resolved": "https://registry.npmjs.org/regl-splom/-/regl-splom-1.0.14.tgz", "integrity": "sha512-OiLqjmPRYbd7kDlHC6/zDf6L8lxgDC65BhC8JirhP4ykrK4x22ZyS+BnY8EUinXKDeMgmpRwCvUmk7BK4Nweuw==", "dev": true, - "peer": true, "dependencies": { "array-bounds": "^1.0.1", "array-range": "^1.0.1", @@ -12615,7 +12031,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -12625,7 +12040,6 @@ "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", "dev": true, - "peer": true, "dependencies": { "protocol-buffers-schema": "^3.3.1" } @@ -12643,8 +12057,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", "integrity": "sha512-DA8+YS+sMIVpbsuKgy+Z67L9Lxb1p05mNxRpDPNksPDEFir4vmBlUtuN9jkTGn9YMMdlBuK7XQgFiz6ws+yhSg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/robust-predicates": { "version": "3.0.2", @@ -12653,13 +12066,14 @@ "license": "Unlicense" }, "node_modules/rollup": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.61.1.tgz", - "integrity": "sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.1.tgz", + "integrity": "sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@types/estree": "1.0.9" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -12669,31 +12083,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.61.1", - "@rollup/rollup-android-arm64": "4.61.1", - "@rollup/rollup-darwin-arm64": "4.61.1", - "@rollup/rollup-darwin-x64": "4.61.1", - "@rollup/rollup-freebsd-arm64": "4.61.1", - "@rollup/rollup-freebsd-x64": "4.61.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.61.1", - "@rollup/rollup-linux-arm-musleabihf": "4.61.1", - "@rollup/rollup-linux-arm64-gnu": "4.61.1", - "@rollup/rollup-linux-arm64-musl": "4.61.1", - "@rollup/rollup-linux-loong64-gnu": "4.61.1", - "@rollup/rollup-linux-loong64-musl": "4.61.1", - "@rollup/rollup-linux-ppc64-gnu": "4.61.1", - "@rollup/rollup-linux-ppc64-musl": "4.61.1", - "@rollup/rollup-linux-riscv64-gnu": "4.61.1", - "@rollup/rollup-linux-riscv64-musl": "4.61.1", - "@rollup/rollup-linux-s390x-gnu": "4.61.1", - "@rollup/rollup-linux-x64-gnu": "4.61.1", - "@rollup/rollup-linux-x64-musl": "4.61.1", - "@rollup/rollup-openbsd-x64": "4.61.1", - "@rollup/rollup-openharmony-arm64": "4.61.1", - "@rollup/rollup-win32-arm64-msvc": "4.61.1", - "@rollup/rollup-win32-ia32-msvc": "4.61.1", - "@rollup/rollup-win32-x64-gnu": "4.61.1", - "@rollup/rollup-win32-x64-msvc": "4.61.1", + "@rollup/rollup-android-arm-eabi": "4.44.1", + "@rollup/rollup-android-arm64": "4.44.1", + "@rollup/rollup-darwin-arm64": "4.44.1", + "@rollup/rollup-darwin-x64": "4.44.1", + "@rollup/rollup-freebsd-arm64": "4.44.1", + "@rollup/rollup-freebsd-x64": "4.44.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.44.1", + "@rollup/rollup-linux-arm-musleabihf": "4.44.1", + "@rollup/rollup-linux-arm64-gnu": "4.44.1", + "@rollup/rollup-linux-arm64-musl": "4.44.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.44.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.44.1", + "@rollup/rollup-linux-riscv64-gnu": "4.44.1", + "@rollup/rollup-linux-riscv64-musl": "4.44.1", + "@rollup/rollup-linux-s390x-gnu": "4.44.1", + "@rollup/rollup-linux-x64-gnu": "4.44.1", + "@rollup/rollup-linux-x64-musl": "4.44.1", + "@rollup/rollup-win32-arm64-msvc": "4.44.1", + "@rollup/rollup-win32-ia32-msvc": "4.44.1", + "@rollup/rollup-win32-x64-msvc": "4.44.1", "fsevents": "~2.3.2" } }, @@ -12723,8 +12132,7 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/safe-buffer": { "version": "5.2.1", @@ -12744,8 +12152,7 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "peer": true + ] }, "node_modules/safe-regex-test": { "version": "1.1.0", @@ -12768,15 +12175,13 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/sax": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/saxes": { "version": "6.0.0", @@ -12799,17 +12204,14 @@ } }, "node_modules/schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { "node": ">= 10.13.0" @@ -12819,65 +12221,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -12887,12 +12230,20 @@ "semver": "bin/semver.js" } }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/set-cookie-parser": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/set-function-length": { "version": "1.2.2", @@ -12915,8 +12266,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/shebang-command": { "version": "2.0.0", @@ -13026,8 +12376,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/signum/-/signum-1.0.0.tgz", "integrity": "sha512-yodFGwcyt59XRh7w5W3jPcIQb3Bwi21suEfT7MAWnBX3iCdklJpgDgvGT9o04UonglZN5SNMfJFkHIR/jO8GHw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/slash": { "version": "3.0.0", @@ -13059,7 +12408,6 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, - "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -13069,15 +12417,13 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/stack-trace": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", "integrity": "sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ==", "dev": true, - "peer": true, "engines": { "node": "*" } @@ -13093,7 +12439,6 @@ "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.1.tgz", "integrity": "sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==", "dev": true, - "peer": true, "dependencies": { "escodegen": "^2.1.0" } @@ -13108,11 +12453,10 @@ } }, "node_modules/std-env": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", - "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", - "dev": true, - "license": "MIT" + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true }, "node_modules/store2": { "version": "2.14.4", @@ -13120,12 +12464,13 @@ "integrity": "sha512-srTItn1GOvyvOycgxjAnPA63FZNwy0PTyUBFMHRM+hVFltAeoh0LmNBz9SZqUS9mMqGk8rfyWyXn3GH5ReJ8Zw==" }, "node_modules/storybook": { - "version": "8.6.18", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.6.18.tgz", - "integrity": "sha512-p8seiSI6FiVY6P3V0pG+5v7c8pDMehMAFRWEhG5XqIBSQszzOjDnW2rNvm3odoLKfo3V3P6Cs6Hv9ILzymULyQ==", + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.6.14.tgz", + "integrity": "sha512-sVKbCj/OTx67jhmauhxc2dcr1P+yOgz/x3h0krwjyMgdc5Oubvxyg4NYDZmzAw+ym36g/lzH8N0Ccp4dwtdfxw==", "license": "MIT", + "peer": true, "dependencies": { - "@storybook/core": "8.6.18" + "@storybook/core": "8.6.14" }, "bin": { "getstorybook": "bin/index.cjs", @@ -13150,7 +12495,6 @@ "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==", "dev": true, - "peer": true, "dependencies": { "debug": "2" } @@ -13160,7 +12504,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -13169,15 +12512,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/stream-shift": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/strict-event-emitter": { "version": "0.5.1", @@ -13190,7 +12531,6 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -13199,15 +12539,13 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "peer": true + "dev": true }, "node_modules/string-argv": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.6.19" } @@ -13217,7 +12555,6 @@ "resolved": "https://registry.npmjs.org/string-split-by/-/string-split-by-1.0.0.tgz", "integrity": "sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==", "dev": true, - "peer": true, "dependencies": { "parenthesis": "^3.1.5" } @@ -13371,15 +12708,13 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz", "integrity": "sha512-i0TFx4wPcO0FwX+4RkLJi1MxmcTv90jNZgxMu9XRnMXMeFUY1VJlIoXpZunPUvUUqbCT1pg5PEkFqqpcaElNaA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/style-loader": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", "dev": true, - "peer": true, "engines": { "node": ">= 18.12.0" }, @@ -13417,7 +12752,6 @@ "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.5.tgz", "integrity": "sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==", "dev": true, - "peer": true, "dependencies": { "kdbush": "^3.0.0" } @@ -13426,15 +12760,13 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==", - "dev": true, - "peer": true + "dev": true }, "node_modules/superscript-text": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/superscript-text/-/superscript-text-1.0.0.tgz", "integrity": "sha512-gwu8l5MtRZ6koO0icVTlmN5pm7Dhh1+Xpe9O4x6ObMAsW+3jPbW14d1DsBq1F4wiI+WOFjXF35pslgec/G8yCQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/supports-color": { "version": "7.2.0", @@ -13463,15 +12795,13 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz", "integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==", - "dev": true, - "peer": true + "dev": true }, "node_modules/svg-path-bounds": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/svg-path-bounds/-/svg-path-bounds-1.0.2.tgz", "integrity": "sha512-H4/uAgLWrppIC0kHsb2/dWUYSmb4GE5UqH06uqWBcg6LBjX2fu0A8+JrO2/FJPZiSsNOKZAhyFFgsLTdYUvSqQ==", "dev": true, - "peer": true, "dependencies": { "abs-svg-path": "^0.1.1", "is-svg-path": "^1.0.1", @@ -13484,7 +12814,6 @@ "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz", "integrity": "sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==", "dev": true, - "peer": true, "dependencies": { "svg-arc-to-cubic-bezier": "^3.0.0" } @@ -13494,7 +12823,6 @@ "resolved": "https://registry.npmjs.org/svg-path-sdf/-/svg-path-sdf-1.1.3.tgz", "integrity": "sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg==", "dev": true, - "peer": true, "dependencies": { "bitmap-sdf": "^1.0.0", "draw-svg-path": "^1.0.0", @@ -13528,6 +12856,7 @@ "version": "3.4.17", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -13570,18 +12899,12 @@ } }, "node_modules/tapable": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", - "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, - "license": "MIT", - "peer": true, "engines": { "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" } }, "node_modules/telejson": { @@ -13597,7 +12920,6 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "dev": true, - "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -13612,16 +12934,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz", - "integrity": "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==", + "version": "5.3.11", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", + "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "engines": { @@ -13635,50 +12956,76 @@ "webpack": "^5.1.0" }, "peerDependenciesMeta": { - "@minify-html/node": { - "optional": true - }, "@swc/core": { "optional": true }, - "@swc/css": { - "optional": true - }, - "@swc/html": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "cssnano": { - "optional": true - }, - "csso": { - "optional": true - }, "esbuild": { "optional": true }, - "html-minifier-terser": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "postcss": { - "optional": true - }, "uglify-js": { "optional": true } } }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/thenify": { "version": "3.3.1", @@ -13710,7 +13057,6 @@ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, - "peer": true, "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -13731,8 +13077,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/tinyexec": { "version": "1.0.2", @@ -13777,11 +13122,11 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, - "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -13793,8 +13138,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/tinyrainbow": { "version": "1.2.0", @@ -13836,15 +13180,13 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/to-float32/-/to-float32-1.1.0.tgz", "integrity": "sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/to-px": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-px/-/to-px-1.0.1.tgz", "integrity": "sha512-2y3LjBeIZYL19e5gczp14/uRWFDtDUErJPVN3VU9a7SJO+RjGRtYR47aMN2bZgGlxvW4ZcEz2ddUPVHXcMfuXw==", "dev": true, - "peer": true, "dependencies": { "parse-unit": "^1.0.1" } @@ -13865,7 +13207,6 @@ "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", "dev": true, - "peer": true, "dependencies": { "commander": "2" }, @@ -13879,8 +13220,7 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/tough-cookie": { "version": "4.1.4", @@ -14013,8 +13353,7 @@ "version": "2.7.3", "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/type-check": { "version": "0.4.0", @@ -14043,15 +13382,13 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/typedarray-pool": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/typedarray-pool/-/typedarray-pool-1.2.0.tgz", "integrity": "sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ==", "dev": true, - "peer": true, "dependencies": { "bit-twiddle": "^1.0.0", "dup": "^1.0.0" @@ -14062,6 +13399,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "dev": true, + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -14099,11 +13437,10 @@ "dev": true }, "node_modules/undici": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.27.2.tgz", - "integrity": "sha512-uZsKNuzQxDMUY6M3pIMvy5tvlGmtq8XJ2oLAkfRKGNu+1VQAIvLy2xIVG5ATZl5wDXl/tddByAWCizRbOme+TA==", + "version": "7.22.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.22.0.tgz", + "integrity": "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==", "dev": true, - "license": "MIT", "engines": { "node": ">=20.18.1" } @@ -14138,13 +13475,12 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -14160,10 +13496,9 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.1" + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -14176,8 +13511,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/update-diff/-/update-diff-1.1.0.tgz", "integrity": "sha512-rCiBPiHxZwT4+sBhEbChzpO5hYHjm91kScWgdHf4Qeafs6Ba7MBl+d9GlGv72bcTZQO0sLmtQS1pHSWoCLtN/A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/uri-js": { "version": "4.4.1", @@ -14263,23 +13597,22 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "dev": true, "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], - "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/vite": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", - "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -14410,11 +13743,12 @@ } }, "node_modules/vite/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -14423,31 +13757,30 @@ } }, "node_modules/vitest": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.8.tgz", - "integrity": "sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.1.8", - "@vitest/mocker": "4.1.8", - "@vitest/pretty-format": "4.1.8", - "@vitest/runner": "4.1.8", - "@vitest/snapshot": "4.1.8", - "@vitest/spy": "4.1.8", - "@vitest/utils": "4.1.8", - "es-module-lexer": "^2.0.0", - "expect-type": "^1.3.0", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz", + "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", + "dev": true, + "dependencies": { + "@vitest/expect": "4.0.18", + "@vitest/mocker": "4.0.18", + "@vitest/pretty-format": "4.0.18", + "@vitest/runner": "4.0.18", + "@vitest/snapshot": "4.0.18", + "@vitest/spy": "4.0.18", + "@vitest/utils": "4.0.18", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", - "std-env": "^4.0.0-rc.1", + "std-env": "^3.10.0", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.1.0", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", "why-is-node-running": "^2.3.0" }, "bin": { @@ -14463,15 +13796,12 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.8", - "@vitest/browser-preview": "4.1.8", - "@vitest/browser-webdriverio": "4.1.8", - "@vitest/coverage-istanbul": "4.1.8", - "@vitest/coverage-v8": "4.1.8", - "@vitest/ui": "4.1.8", + "@vitest/browser-playwright": "4.0.18", + "@vitest/browser-preview": "4.0.18", + "@vitest/browser-webdriverio": "4.0.18", + "@vitest/ui": "4.0.18", "happy-dom": "*", - "jsdom": "*", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + "jsdom": "*" }, "peerDependenciesMeta": { "@edge-runtime/vm": { @@ -14492,12 +13822,6 @@ "@vitest/browser-webdriverio": { "optional": true }, - "@vitest/coverage-istanbul": { - "optional": true - }, - "@vitest/coverage-v8": { - "optional": true - }, "@vitest/ui": { "optional": true }, @@ -14506,63 +13830,55 @@ }, "jsdom": { "optional": true - }, - "vite": { - "optional": false } } }, "node_modules/vitest/node_modules/@vitest/expect": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.8.tgz", - "integrity": "sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.18.tgz", + "integrity": "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==", "dev": true, - "license": "MIT", "dependencies": { - "@standard-schema/spec": "^1.1.0", + "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.8", - "@vitest/utils": "4.1.8", - "chai": "^6.2.2", - "tinyrainbow": "^3.1.0" + "@vitest/spy": "4.0.18", + "@vitest/utils": "4.0.18", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/vitest/node_modules/@vitest/pretty-format": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.8.tgz", - "integrity": "sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", + "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==", "dev": true, - "license": "MIT", "dependencies": { - "tinyrainbow": "^3.1.0" + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/vitest/node_modules/@vitest/spy": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.8.tgz", - "integrity": "sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz", + "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==", "dev": true, - "license": "MIT", "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/vitest/node_modules/@vitest/utils": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.8.tgz", - "integrity": "sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==", + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz", + "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==", "dev": true, - "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.8", - "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.1.0" + "@vitest/pretty-format": "4.0.18", + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" @@ -14573,17 +13889,15 @@ "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -14592,11 +13906,10 @@ } }, "node_modules/vitest/node_modules/tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -14612,7 +13925,6 @@ "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", "dev": true, - "peer": true, "dependencies": { "@mapbox/point-geometry": "0.1.0", "@mapbox/vector-tile": "^1.3.1", @@ -14632,12 +13944,10 @@ } }, "node_modules/watchpack": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", - "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -14650,15 +13960,13 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.8.tgz", "integrity": "sha512-lNR9aAefbGPpHO7AEnY0hCFjz1eTkWCXYvkTRrTHs9qv8zJp+SkVYpzfLIFXQQiG3tVvbNFQgVg2bQS8YGgxyw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/webgl-context": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/webgl-context/-/webgl-context-2.2.0.tgz", "integrity": "sha512-q/fGIivtqTT7PEoF07axFIlHNk/XCPaYpq64btnepopSWvKNFkoORlQYgqDigBIuGA1ExnFd/GnSUnBNEPQY7Q==", "dev": true, - "peer": true, "dependencies": { "get-canvas-context": "^1.0.1" } @@ -14673,36 +13981,35 @@ } }, "node_modules/webpack": { - "version": "5.107.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.107.2.tgz", - "integrity": "sha512-v7RhXaJbpMlV0D7hC7lb2EbnxkoeUqf9qhKr6lozx3Q48pmFrqqNRmZFUEGmi7pSwm6fCQ2H1IjvCkHqdpVdjQ==", + "version": "5.97.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", + "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "@types/estree": "^1.0.8", - "@types/json-schema": "^7.0.15", + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.16.0", - "acorn-import-phases": "^1.0.3", - "browserslist": "^4.28.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.22.0", - "es-module-lexer": "^2.1.0", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", - "loader-runner": "^4.3.2", - "mime-db": "^1.54.0", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^4.3.3", - "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.5.0", - "watchpack": "^2.5.1", - "webpack-sources": "^3.5.0" + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" }, "bin": { "webpack": "bin/webpack.js" @@ -14721,12 +14028,10 @@ } }, "node_modules/webpack-sources": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.0.tgz", - "integrity": "sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, - "license": "MIT", - "peer": true, "engines": { "node": ">=10.13.0" } @@ -14742,7 +14047,6 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, - "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -14756,22 +14060,10 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "peer": true, "engines": { "node": ">=4.0" } }, - "node_modules/webpack/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/whatwg-mimetype": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", @@ -14810,13 +14102,13 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.22", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", - "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.9", + "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", @@ -14860,7 +14152,6 @@ "resolved": "https://registry.npmjs.org/world-calendars/-/world-calendars-1.0.3.tgz", "integrity": "sha512-sAjLZkBnsbHkHWVhrsCU5Sa/EVuf9QqgvrN8zyJ2L/F9FR9Oc6CvVK0674+PGAtmmmYQMH98tCUSO4QLQv3/TQ==", "dev": true, - "peer": true, "dependencies": { "object-assign": "^4.1.0" } @@ -14950,13 +14241,12 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/ws": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", - "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -14994,7 +14284,6 @@ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true, - "peer": true, "engines": { "node": ">=0.4" } @@ -15015,18 +14304,14 @@ "dev": true }, "node_modules/yaml": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", - "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", - "license": "ISC", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", "bin": { "yaml": "bin.mjs" }, "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" + "node": ">= 14" } }, "node_modules/yargs": { diff --git a/public/mockServiceWorker.js b/public/mockServiceWorker.js index 0bf12188..0c8e0df6 100644 --- a/public/mockServiceWorker.js +++ b/public/mockServiceWorker.js @@ -5,23 +5,24 @@ * Mock Service Worker. * @see https://github.com/mswjs/msw * - Please do NOT modify this file. + * - Please do NOT serve this file on production. */ -const PACKAGE_VERSION = '2.10.3' -const INTEGRITY_CHECKSUM = 'f5825c521429caf22a4dd13b66e243af' +const PACKAGE_VERSION = '2.8.4' +const INTEGRITY_CHECKSUM = '00729d72e3b82faf54ca8b9621dbb96f' const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') const activeClientIds = new Set() -addEventListener('install', function () { +self.addEventListener('install', function () { self.skipWaiting() }) -addEventListener('activate', function (event) { +self.addEventListener('activate', function (event) { event.waitUntil(self.clients.claim()) }) -addEventListener('message', async function (event) { - const clientId = Reflect.get(event.source || {}, 'id') +self.addEventListener('message', async function (event) { + const clientId = event.source.id if (!clientId || !self.clients) { return @@ -93,18 +94,17 @@ addEventListener('message', async function (event) { } }) -addEventListener('fetch', function (event) { +self.addEventListener('fetch', function (event) { + const { request } = event + // Bypass navigation requests. - if (event.request.mode === 'navigate') { + if (request.mode === 'navigate') { return } // Opening the DevTools triggers the "only-if-cached" request // that cannot be handled by the worker. Bypass such requests. - if ( - event.request.cache === 'only-if-cached' && - event.request.mode !== 'same-origin' - ) { + if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') { return } @@ -115,62 +115,48 @@ addEventListener('fetch', function (event) { return } + // Generate unique request ID. const requestId = crypto.randomUUID() event.respondWith(handleRequest(event, requestId)) }) -/** - * @param {FetchEvent} event - * @param {string} requestId - */ async function handleRequest(event, requestId) { const client = await resolveMainClient(event) - const requestCloneForEvents = event.request.clone() const response = await getResponse(event, client, requestId) // Send back the response clone for the "response:*" life-cycle events. // Ensure MSW is active and ready to handle the message, otherwise // this message will pend indefinitely. if (client && activeClientIds.has(client.id)) { - const serializedRequest = await serializeRequest(requestCloneForEvents) - - // Clone the response so both the client and the library could consume it. - const responseClone = response.clone() - - sendToClient( - client, - { - type: 'RESPONSE', - payload: { - isMockedResponse: IS_MOCKED_RESPONSE in response, - request: { - id: requestId, - ...serializedRequest, - }, - response: { + ;(async function () { + const responseClone = response.clone() + + sendToClient( + client, + { + type: 'RESPONSE', + payload: { + requestId, + isMockedResponse: IS_MOCKED_RESPONSE in response, type: responseClone.type, status: responseClone.status, statusText: responseClone.statusText, - headers: Object.fromEntries(responseClone.headers.entries()), body: responseClone.body, + headers: Object.fromEntries(responseClone.headers.entries()), }, }, - }, - responseClone.body ? [serializedRequest.body, responseClone.body] : [], - ) + [responseClone.body], + ) + })() } return response } -/** - * Resolve the main client for the given event. - * Client that issues a request doesn't necessarily equal the client - * that registered the worker. It's with the latter the worker should - * communicate with during the response resolving phase. - * @param {FetchEvent} event - * @returns {Promise} - */ +// Resolve the main client for the given event. +// Client that issues a request doesn't necessarily equal the client +// that registered the worker. It's with the latter the worker should +// communicate with during the response resolving phase. async function resolveMainClient(event) { const client = await self.clients.get(event.clientId) @@ -198,16 +184,12 @@ async function resolveMainClient(event) { }) } -/** - * @param {FetchEvent} event - * @param {Client | undefined} client - * @param {string} requestId - * @returns {Promise} - */ async function getResponse(event, client, requestId) { + const { request } = event + // Clone the request because it might've been already used // (i.e. its body has been read and sent to the client). - const requestClone = event.request.clone() + const requestClone = request.clone() function passthrough() { // Cast the request headers to a new Headers instance @@ -248,17 +230,29 @@ async function getResponse(event, client, requestId) { } // Notify the client that a request has been intercepted. - const serializedRequest = await serializeRequest(event.request) + const requestBuffer = await request.arrayBuffer() const clientMessage = await sendToClient( client, { type: 'REQUEST', payload: { id: requestId, - ...serializedRequest, + url: request.url, + mode: request.mode, + method: request.method, + headers: Object.fromEntries(request.headers.entries()), + cache: request.cache, + credentials: request.credentials, + destination: request.destination, + integrity: request.integrity, + redirect: request.redirect, + referrer: request.referrer, + referrerPolicy: request.referrerPolicy, + body: requestBuffer, + keepalive: request.keepalive, }, }, - [serializedRequest.body], + [requestBuffer], ) switch (clientMessage.type) { @@ -274,12 +268,6 @@ async function getResponse(event, client, requestId) { return passthrough() } -/** - * @param {Client} client - * @param {any} message - * @param {Array} transferrables - * @returns {Promise} - */ function sendToClient(client, message, transferrables = []) { return new Promise((resolve, reject) => { const channel = new MessageChannel() @@ -292,18 +280,14 @@ function sendToClient(client, message, transferrables = []) { resolve(event.data) } - client.postMessage(message, [ - channel.port2, - ...transferrables.filter(Boolean), - ]) + client.postMessage( + message, + [channel.port2].concat(transferrables.filter(Boolean)), + ) }) } -/** - * @param {Response} response - * @returns {Response} - */ -function respondWithMock(response) { +async function respondWithMock(response) { // Setting response status code to 0 is a no-op. // However, when responding with a "Response.error()", the produced Response // instance will have status code set to 0. Since it's not possible to create @@ -321,24 +305,3 @@ function respondWithMock(response) { return mockedResponse } - -/** - * @param {Request} request - */ -async function serializeRequest(request) { - return { - url: request.url, - mode: request.mode, - method: request.method, - headers: Object.fromEntries(request.headers.entries()), - cache: request.cache, - credentials: request.credentials, - destination: request.destination, - integrity: request.integrity, - redirect: request.redirect, - referrer: request.referrer, - referrerPolicy: request.referrerPolicy, - body: await request.arrayBuffer(), - keepalive: request.keepalive, - } -} diff --git a/src/api/ophyd/useOphydDeviceSocket.ts b/src/api/ophyd/useOphydDeviceSocket.ts index 9015383c..04824419 100644 --- a/src/api/ophyd/useOphydDeviceSocket.ts +++ b/src/api/ophyd/useOphydDeviceSocket.ts @@ -1,51 +1,23 @@ -import { useState, useRef, useEffect, useCallback, useMemo } from 'react'; -import { OphydDevices } from 'src/types/deviceControllerTypes'; -import { useOphydApiUrls } from '@/utils/apiUtils'; -import { - MessageResponse, - ErrorResponse, - ValueUpdateResponse, - MetaUpdateResponse, -} from '@/api/ophyd/ophydDeviceSocketTypes'; +import { useState, useEffect, useCallback, useMemo, useRef } from 'react'; +import type { OphydDevices } from '@/types/deviceControllerTypes'; +import { useOphydDeviceTransport } from './OphydTransportProvider'; +import type { OphydDeviceTransport } from './transport/deviceTypes'; /** - * Custom hook for managing WebSocket connections to Ophyd devices. - * Provides real-time device state management and control functions. + * Device-socket counterpart of {@link useOphydPVSocket}. Uses the + * device-channel protocol where messages key on `device` instead of `pv`. * - * @param deviceNameList - Array of Ophyd device names to subscribe to - * @param wsUrl - Optional WebSocket URL. If not provided, will use environment variables or default to localhost:8001 - * @returns Object containing device states and control functions + * See OphydTransportProvider for the transport context. When no provider is + * mounted, a fallback WebSocket transport is constructed lazily. */ export default function useOphydDeviceSocket(deviceNameList: string[], wsUrl?: string) { - const configWsUrl = useOphydApiUrls().getWsUrl('device-socket'); - const apiUrl: string = wsUrl ?? configWsUrl; - const [devices, setDevices] = useState(() => { - const initialDevices: OphydDevices = {}; - deviceNameList.forEach((deviceName) => { - initialDevices[deviceName] = { - name: deviceName, - value: '', - connected: false, - locked: false, - timestamp: 0, - expanded: false, - device: deviceName, - read_access: false, - write_access: false, - }; - }); - return initialDevices; - }); // eslint-disable-next-line react-hooks/exhaustive-deps - const memoizedDeviceNames = useMemo(() => deviceNameList, [JSON.stringify(deviceNameList)]); //device updates can retrigger the hook if inputs aren't memoized - const wsRef = useRef(null); + const memoizedDeviceNames = useMemo(() => deviceNameList, [JSON.stringify(deviceNameList)]); + const transport: OphydDeviceTransport = useOphydDeviceTransport(wsUrl); + + const [devices, setDevices] = useState(() => initialDevices(memoizedDeviceNames)); const hasRenderedOnlyOnce = useRef(false); - /** - * Toggles the lock state of a device between locked and unlocked. - * When locked, the device UI will typically be disabled or read-only. - * @param deviceName - The name/identifier of the device to toggle - */ const toggleDeviceLock = useCallback((deviceName: string) => { setDevices((prevDevices) => ({ ...prevDevices, @@ -56,30 +28,13 @@ export default function useOphydDeviceSocket(deviceNameList: string[], wsUrl?: s })); }, []); - /** - * Sends a device value update request through the WebSocket connection. - * @param deviceName - The name/identifier of the device to update - * @param value - The new value to set for the device (string, number, or boolean) - */ const handleSetValueRequest = useCallback( (deviceName: string, value: string | number | boolean) => { - if (wsRef.current) { - const setValueMessage = { - action: 'set', - device: deviceName, - value: value, - }; - wsRef.current.send(JSON.stringify(setValueMessage)); - } + transport.send({ action: 'set', device: deviceName, value }); }, - [], + [transport], ); - /** - * Toggles the expanded state of a device in the UI. - * Used to show/hide additional device details or controls. - * @param deviceName - The name/identifier of the device to expand/collapse - */ const toggleExpand = useCallback((deviceName: string) => { setDevices((prevDevices) => ({ ...prevDevices, @@ -92,114 +47,62 @@ export default function useOphydDeviceSocket(deviceNameList: string[], wsUrl?: s useEffect(() => { if (hasRenderedOnlyOnce.current) { - //after the initial render, if the deviceNameList changes, reset the entire devices state - const initialDevices: OphydDevices = {}; - memoizedDeviceNames.forEach((deviceName) => { - initialDevices[deviceName] = { - name: deviceName, - value: '', - connected: false, - locked: false, - timestamp: 0, - expanded: false, - device: deviceName, - read_access: false, - write_access: false, - }; - }); - setDevices(initialDevices); + setDevices(initialDevices(memoizedDeviceNames)); } else { hasRenderedOnlyOnce.current = true; } }, [memoizedDeviceNames]); - // Initialize WebSocket connection useEffect(() => { - // Don't connect if no devices to subscribe to - if (memoizedDeviceNames.length === 0) { - // Close existing connection if devices list becomes empty - if (wsRef.current) { - wsRef.current.close(); - wsRef.current = null; - } - return; - } - - console.log('initializing WebSocket connection to', apiUrl); - const ws = new WebSocket(apiUrl); - wsRef.current = ws; - - // Open WebSocket connection and subscribe to devices - ws.onopen = () => { - console.log('WebSocket connection opened'); - memoizedDeviceNames.forEach((deviceName) => { - const subscribeMessage = { - action: 'subscribe', - device: deviceName, - }; - ws.send(JSON.stringify(subscribeMessage)); - }); - }; - - // Handle incoming WebSocket messages - ws.onmessage = (event) => { - try { - const message: - | MessageResponse - | ErrorResponse - | ValueUpdateResponse - | MetaUpdateResponse = JSON.parse(event.data); + if (memoizedDeviceNames.length === 0) return; - if ('sub_type' in message && message.sub_type === 'meta') { - //meta updates occur when we first subscribe to a device, or if the connection changes (lost or regained EPICS connection) - setDevices((prevDevices) => ({ - ...prevDevices, - [message.device]: { - ...prevDevices[message.device], - ...message, - //connected: message.connected, - //units: message.units, - min: message.lower_ctrl_limit, - max: message.upper_ctrl_limit, - }, - })); - } else if ('device' in message) { - //device is in the message on regular updates to the device value - const deviceName = message.device; - setDevices((prevDevices) => ({ - ...prevDevices, - [deviceName]: { - ...prevDevices[deviceName], - ...message, - }, - })); - } - if ('error' in message) { - console.error('WebSocket error message:', message.error); - } - } catch (error) { - console.error('Error parsing WebSocket message:', error); + // Register the listener before sending subscribe — the sim transport + // emits the initial meta+value synchronously, so a listener attached + // afterward would miss it. + const unsubscribeMessages = transport.onMessage((message) => { + if ('sub_type' in message && message.sub_type === 'meta') { + setDevices((prevDevices) => + prevDevices[message.device] + ? { + ...prevDevices, + [message.device]: { + ...prevDevices[message.device], + ...message, + min: message.lower_ctrl_limit, + max: message.upper_ctrl_limit, + }, + } + : prevDevices, + ); + } else if ('device' in message) { + const deviceName = message.device; + setDevices((prevDevices) => + prevDevices[deviceName] + ? { + ...prevDevices, + [deviceName]: { + ...prevDevices[deviceName], + ...message, + }, + } + : prevDevices, + ); + } else if ('error' in message) { + console.error('Ophyd device socket error:', message.error); } - }; - - // Handle WebSocket errors - ws.onerror = (error) => { - console.error('WebSocket error:', error); - }; + }); - // Handle WebSocket closure - ws.onclose = () => { - console.log('WebSocket connection closed'); - }; + for (const deviceName of memoizedDeviceNames) { + transport.send({ action: 'subscribe', device: deviceName }); + } - // Cleanup WebSocket connection on unmount return () => { - if (wsRef.current) { - wsRef.current.close(); - wsRef.current = null; + unsubscribeMessages(); + for (const deviceName of memoizedDeviceNames) { + transport.send({ action: 'unsubscribe', device: deviceName }); } }; - }, [wsUrl, memoizedDeviceNames, apiUrl]); + }, [transport, memoizedDeviceNames]); return { devices, @@ -208,3 +111,21 @@ export default function useOphydDeviceSocket(deviceNameList: string[], wsUrl?: s toggleExpand, }; } + +function initialDevices(names: string[]): OphydDevices { + const map: OphydDevices = {}; + for (const deviceName of names) { + map[deviceName] = { + name: deviceName, + value: '', + connected: false, + locked: false, + timestamp: 0, + expanded: false, + device: deviceName, + read_access: false, + write_access: false, + }; + } + return map; +} diff --git a/src/api/ophyd/useOphydPVSocket.tsx b/src/api/ophyd/useOphydPVSocket.tsx index ba62e5bd..88d519bb 100644 --- a/src/api/ophyd/useOphydPVSocket.tsx +++ b/src/api/ophyd/useOphydPVSocket.tsx @@ -1,51 +1,32 @@ -import { useState, useRef, useEffect, useCallback, useMemo } from 'react'; -import { Devices } from 'src/types/deviceControllerTypes'; -import { useOphydApiUrls } from '@/utils/apiUtils'; -import { - MessageResponse, - ErrorResponse, - ValueUpdateResponse, - MetaUpdateResponse, -} from '@/api/ophyd/ophydPVSocketTypes'; +import { useState, useEffect, useCallback, useMemo, useRef } from 'react'; +import type { Devices } from '@/types/deviceControllerTypes'; +import { useOphydPVTransport } from './OphydTransportProvider'; +import type { OphydPVTransport } from './transport/types'; /** - * Custom hook for managing WebSocket connections to Ophyd devices. - * Provides real-time device state management and control functions. + * Manage subscriptions to a set of EPICS PVs and surface their values as a + * Devices map. * - * @param deviceNameList - Array of EPICS PVs to subscribe to - * @param wsUrl - Optional WebSocket URL. If not provided, will use environment variables or default to localhost:8001 - * @returns Object containing device states and control functions + * Connection lifecycle is delegated to a transport read from + * OphydTransportProvider — see [src/api/ophyd/OphydTransportProvider.tsx]. + * When no provider is mounted, a fallback transport pointed at the + * configured ophyd-websocket backend is created lazily (one per + * consumer-URL pair). To make two hook calls observe the same state, wrap + * the tree in an OphydTransportProvider with a shared transport. + * + * @param deviceNameList - EPICS PVs to subscribe to. + * @param wsUrl - Optional URL override that builds an ad-hoc WebSocket + * transport for this consumer only. Ignored when an OphydTransportProvider + * supplies a transport. */ export default function useOphydPVSocket(deviceNameList: string[], wsUrl?: string) { // eslint-disable-next-line react-hooks/exhaustive-deps - const memoizedDeviceNames = useMemo(() => deviceNameList, [JSON.stringify(deviceNameList)]); //device updates can retrigger the hook if inputs aren't memoized - const configWsUrl = useOphydApiUrls().getWsUrl('pv-socket'); - const apiUrl: string = wsUrl ?? configWsUrl; - const [devices, setDevices] = useState(() => { - const initialDevices: Devices = {}; - memoizedDeviceNames.forEach((deviceName) => { - initialDevices[deviceName] = { - name: deviceName, - value: '', - connected: false, - locked: false, - timestamp: 0, - expanded: false, - pv: deviceName, - read_access: false, - write_access: false, - }; - }); - return initialDevices; - }); - const wsRef = useRef(null); + const memoizedDeviceNames = useMemo(() => deviceNameList, [JSON.stringify(deviceNameList)]); + const transport: OphydPVTransport = useOphydPVTransport(wsUrl); + + const [devices, setDevices] = useState(() => initialDevices(memoizedDeviceNames)); const hasRenderedOnlyOnce = useRef(false); - /** - * Toggles the lock state of a device between locked and unlocked. - * When locked, the device UI will typically be disabled or read-only. - * @param deviceName - The name/identifier of the device to toggle - */ const toggleDeviceLock = useCallback((deviceName: string) => { setDevices((prevDevices) => ({ ...prevDevices, @@ -56,30 +37,13 @@ export default function useOphydPVSocket(deviceNameList: string[], wsUrl?: strin })); }, []); - /** - * Sends a device value update request through the WebSocket connection. - * @param deviceName - The name/identifier of the device to update - * @param value - The new value to set for the device (string, number, or boolean) - */ const handleSetValueRequest = useCallback( (deviceName: string, value: string | number | boolean) => { - if (wsRef.current) { - const setValueMessage = { - action: 'set', - pv: deviceName, - value: value, - }; - wsRef.current.send(JSON.stringify(setValueMessage)); - } + transport.send({ action: 'set', pv: deviceName, value }); }, - [], + [transport], ); - /** - * Toggles the expanded state of a device in the UI. - * Used to show/hide additional device details or controls. - * @param deviceName - The name/identifier of the device to expand/collapse - */ const toggleExpand = useCallback((deviceName: string) => { setDevices((prevDevices) => ({ ...prevDevices, @@ -92,113 +56,62 @@ export default function useOphydPVSocket(deviceNameList: string[], wsUrl?: strin useEffect(() => { if (hasRenderedOnlyOnce.current) { - //after the initial render, if the deviceNameList changes, reset the entire devices state - const initialDevices: Devices = {}; - memoizedDeviceNames.forEach((deviceName) => { - initialDevices[deviceName] = { - name: deviceName, - value: '', - connected: false, - locked: false, - timestamp: 0, - expanded: false, - pv: deviceName, - read_access: false, - write_access: false, - }; - }); - setDevices(initialDevices); + setDevices(initialDevices(memoizedDeviceNames)); } else { hasRenderedOnlyOnce.current = true; } }, [memoizedDeviceNames]); - // Initialize WebSocket connection useEffect(() => { - // Don't connect if no devices to subscribe to - if (memoizedDeviceNames.length === 0) { - // Close existing connection if devices list becomes empty - if (wsRef.current) { - wsRef.current.close(); - wsRef.current = null; - } - return; - } - - //console.log('initializing WebSocket connection to', apiUrl); - const ws = new WebSocket(apiUrl); - wsRef.current = ws; - - // Open WebSocket connection and subscribe to devices - ws.onopen = () => { - //console.log('WebSocket connection opened'); - memoizedDeviceNames.forEach((deviceName) => { - const subscribeMessage = { - action: 'subscribe', - pv: deviceName, - }; - ws.send(JSON.stringify(subscribeMessage)); - }); - }; + if (memoizedDeviceNames.length === 0) return; - // Handle incoming WebSocket messages - ws.onmessage = (event) => { - try { - const message: - | MessageResponse - | ErrorResponse - | ValueUpdateResponse - | MetaUpdateResponse = JSON.parse(event.data); - if ('sub_type' in message && message.sub_type === 'meta') { - //meta updates occur when we first subscribe to a device, or if the connection changes (lost or regained EPICS connection) - setDevices((prevDevices) => ({ - ...prevDevices, - [message.pv]: { - ...prevDevices[message.pv], - ...message, - //connected: message.connected, - //units: message.units, - min: message.lower_ctrl_limit, - max: message.upper_ctrl_limit, - }, - })); - } else if ('pv' in message) { - //pv is in the message on regular updates to the device value - const deviceName = message.pv; - setDevices((prevDevices) => ({ - ...prevDevices, - [deviceName]: { - ...prevDevices[deviceName], - ...message, - }, - })); - } - if ('error' in message) { - console.error('WebSocket error message:', message.error); - } - } catch (error) { - console.error('Error parsing WebSocket message:', error); + // Register the message listener before sending subscribe — the sim + // transport replays the initial meta+value synchronously inside + // send(subscribe), so a listener attached afterward would miss it. + const unsubscribeMessages = transport.onMessage((message) => { + if ('sub_type' in message && message.sub_type === 'meta') { + setDevices((prevDevices) => + prevDevices[message.pv] + ? { + ...prevDevices, + [message.pv]: { + ...prevDevices[message.pv], + ...message, + min: message.lower_ctrl_limit, + max: message.upper_ctrl_limit, + }, + } + : prevDevices, + ); + } else if ('pv' in message) { + const deviceName = message.pv; + setDevices((prevDevices) => + prevDevices[deviceName] + ? { + ...prevDevices, + [deviceName]: { + ...prevDevices[deviceName], + ...message, + }, + } + : prevDevices, + ); + } else if ('error' in message) { + console.error('Ophyd PV socket error:', message.error); } - }; - - // Handle WebSocket errors - ws.onerror = (error) => { - console.error('WebSocket error:', error); - }; + }); - // Handle WebSocket closure - ws.onclose = () => { - //console.log('WebSocket connection closed'); - }; + for (const deviceName of memoizedDeviceNames) { + transport.send({ action: 'subscribe', pv: deviceName }); + } - // Cleanup WebSocket connection on unmount return () => { - if (wsRef.current) { - wsRef.current.close(); - wsRef.current = null; + unsubscribeMessages(); + for (const deviceName of memoizedDeviceNames) { + transport.send({ action: 'unsubscribe', pv: deviceName }); } }; - }, [wsUrl, memoizedDeviceNames, apiUrl]); + }, [transport, memoizedDeviceNames]); return { devices, @@ -207,3 +120,21 @@ export default function useOphydPVSocket(deviceNameList: string[], wsUrl?: strin toggleExpand, }; } + +function initialDevices(names: string[]): Devices { + const map: Devices = {}; + for (const deviceName of names) { + map[deviceName] = { + name: deviceName, + value: '', + connected: false, + locked: false, + timestamp: 0, + expanded: false, + pv: deviceName, + read_access: false, + write_access: false, + }; + } + return map; +} diff --git a/src/app/pages/TestPage.tsx b/src/app/pages/TestPage.tsx index 14e07d61..07357dfb 100644 --- a/src/app/pages/TestPage.tsx +++ b/src/app/pages/TestPage.tsx @@ -1,13 +1,24 @@ import DeviceControllerBox from '@/components/DeviceControllerBox'; import SignalMonitorPlotDevice from '@/components/SignalMonitorPlotDevice'; import useOphydPVSocket from '@/api/ophyd/useOphydPVSocket'; -export default function TestPage() { +import OphydSocketViewer from '@/components/OphydSocketViewer/OphydSocketViewer'; +import { OphydTransportProvider } from '@/api/ophyd/OphydTransportProvider'; +import { OphydSimProvider, createOphydSimTransport, defaultBeamline } from '@/lib/ophyd-sim'; +import { useMemo } from 'react'; + +function TestPageBody() { const { devices, handleSetValueRequest, toggleDeviceLock } = useOphydPVSocket([ 'IOC:m1', 'IOC:m1.RBV', ]); + + // A second hook call against the same provider — proves both consumers + // observe the same motion. + const { devices: devices2 } = useOphydPVSocket(['IOC:m1.RBV']); + return (
+ +
); } + +export default function TestPage() { + const transport = useMemo(() => createOphydSimTransport(defaultBeamline), []); + return ( + + + + + + ); +} From 7ee74755c30b07258177bebc34f0577d0c3cedab Mon Sep 17 00:00:00 2001 From: Prinstar Date: Mon, 8 Jun 2026 15:15:07 -0700 Subject: [PATCH 02/12] add more files --- Repo Instructions.txt | 450 ++++++++++++++++++ src/api/ophyd/OphydTransportProvider.tsx | 83 ++++ .../createWebSocketDeviceTransport.ts | 98 ++++ .../transport/createWebSocketTransport.ts | 101 ++++ src/api/ophyd/transport/deviceTypes.ts | 32 ++ src/api/ophyd/transport/types.ts | 43 ++ .../OphydSocketViewer/OphydSocketViewer.tsx | 8 + .../OphydSocketViewer/useOphydSocketViewer.ts | 221 +++++++++ src/lib/ophyd-sim/core/createOphydSim.ts | 170 +++++++ src/lib/ophyd-sim/core/dependencyGraph.ts | 84 ++++ src/lib/ophyd-sim/core/scheduler.ts | 104 ++++ src/lib/ophyd-sim/core/state.ts | 92 ++++ src/lib/ophyd-sim/core/types.ts | 103 ++++ src/lib/ophyd-sim/devices/motor.ts | 110 +++++ src/lib/ophyd-sim/devices/signal.ts | 94 ++++ src/lib/ophyd-sim/generators/gaussian.ts | 28 ++ src/lib/ophyd-sim/generators/index.ts | 4 + src/lib/ophyd-sim/generators/noise.ts | 44 ++ src/lib/ophyd-sim/index.ts | 50 ++ src/lib/ophyd-sim/react/OphydSimProvider.tsx | 34 ++ src/lib/ophyd-sim/react/hooks.ts | 27 ++ src/lib/ophyd-sim/react/index.ts | 3 + .../ophyd-sim/scenarios/defaultBeamline.ts | 43 ++ src/lib/ophyd-sim/storybook/decorator.tsx | 26 + .../transport/createOphydSimTransport.ts | 175 +++++++ src/stories/DeviceControllerBox.stories.tsx | 53 +++ .../tests/ophyd-sim/dependencyGraph.test.ts | 39 ++ src/testing/tests/ophyd-sim/motor.test.ts | 69 +++ src/testing/tests/ophyd-sim/signal.test.ts | 55 +++ src/testing/tests/ophyd-sim/state.test.ts | 69 +++ src/testing/tests/ophyd-sim/transport.test.ts | 93 ++++ .../useOphydPVSocket.integration.test.tsx | 61 +++ 32 files changed, 2666 insertions(+) create mode 100644 Repo Instructions.txt create mode 100644 src/api/ophyd/OphydTransportProvider.tsx create mode 100644 src/api/ophyd/transport/createWebSocketDeviceTransport.ts create mode 100644 src/api/ophyd/transport/createWebSocketTransport.ts create mode 100644 src/api/ophyd/transport/deviceTypes.ts create mode 100644 src/api/ophyd/transport/types.ts create mode 100644 src/components/OphydSocketViewer/OphydSocketViewer.tsx create mode 100644 src/components/OphydSocketViewer/useOphydSocketViewer.ts create mode 100644 src/lib/ophyd-sim/core/createOphydSim.ts create mode 100644 src/lib/ophyd-sim/core/dependencyGraph.ts create mode 100644 src/lib/ophyd-sim/core/scheduler.ts create mode 100644 src/lib/ophyd-sim/core/state.ts create mode 100644 src/lib/ophyd-sim/core/types.ts create mode 100644 src/lib/ophyd-sim/devices/motor.ts create mode 100644 src/lib/ophyd-sim/devices/signal.ts create mode 100644 src/lib/ophyd-sim/generators/gaussian.ts create mode 100644 src/lib/ophyd-sim/generators/index.ts create mode 100644 src/lib/ophyd-sim/generators/noise.ts create mode 100644 src/lib/ophyd-sim/index.ts create mode 100644 src/lib/ophyd-sim/react/OphydSimProvider.tsx create mode 100644 src/lib/ophyd-sim/react/hooks.ts create mode 100644 src/lib/ophyd-sim/react/index.ts create mode 100644 src/lib/ophyd-sim/scenarios/defaultBeamline.ts create mode 100644 src/lib/ophyd-sim/storybook/decorator.tsx create mode 100644 src/lib/ophyd-sim/transport/createOphydSimTransport.ts create mode 100644 src/stories/DeviceControllerBox.stories.tsx create mode 100644 src/testing/tests/ophyd-sim/dependencyGraph.test.ts create mode 100644 src/testing/tests/ophyd-sim/motor.test.ts create mode 100644 src/testing/tests/ophyd-sim/signal.test.ts create mode 100644 src/testing/tests/ophyd-sim/state.test.ts create mode 100644 src/testing/tests/ophyd-sim/transport.test.ts create mode 100644 src/testing/tests/ophyd-sim/useOphydPVSocket.integration.test.tsx diff --git a/Repo Instructions.txt b/Repo Instructions.txt new file mode 100644 index 00000000..81bc0534 --- /dev/null +++ b/Repo Instructions.txt @@ -0,0 +1,450 @@ +Finch Repository Instructions +============================= + +Project purpose +--------------- +Finch is a Vite + React + TypeScript component library for Bluesky beamline +applications. It provides reusable UI components, beamline-specific controls, +data visualization widgets, queue-server tools, Ophyd WebSocket hooks, Tiled +data-browser wrappers, Storybook documentation, and a local development app. + +The npm package name is `@blueskyproject/finch`. The library build is generated +from `src/index.ts`, while the local demo application starts from +`src/main.tsx` and `src/app/App.tsx`. + + +Top-level structure +------------------- +`.github/workflows/` + GitHub Actions pipelines for tests, Storybook publishing, and npm + publishing. + +`.storybook/` + Storybook configuration. Storybook uses the React/Vite framework, imports + Tailwind styles, serves files from `public/`, and injects the Finch package + version as `STORYBOOK_FINCH_VERSION`. + +`public/` + Static assets used by the demo app and Storybook, including Finch images, + icons, `finch.config.json`, and `mockServiceWorker.js` for MSW-backed + Storybook or test mocks. + +`src/` + Main source tree for the library, demo app, API hooks, components, features, + tests, stories, types, utilities, and assets. + +`index.html` + Vite HTML entry point for the local development app. + +`package.json` + Defines package metadata, npm exports, scripts, dependencies, peer + dependencies, and publishing information. + +`vite.config.ts` + Configures Vite for local development, library builds, declaration-file + generation, backend proxies, path aliases, and Vitest. + +`tailwind.config.js`, `tailwind.css`, `postcss.config.js` + Tailwind and PostCSS setup used by the library, demo app, and Storybook. + +`tsconfig*.json` + TypeScript configuration for app code, node-side config files, and the + overall project. + +`eslint.config.js`, `.prettierrc` + Linting and formatting rules. + +`README.md` + User-facing installation and app setup guide. + +`CONTRIBUTING.md` + Developer setup, environment variable notes, and publish guidance. + + +Source tree structure +--------------------- +`src/index.ts` + Public library entry point. This file imports Finch CSS and re-exports the + components, hooks, helper types, and API utilities that package consumers can + import from `@blueskyproject/finch`. + +`src/main.tsx` + Local Vite app entry point. It renders `src/app/App.tsx` inside + `BrowserRouter`. + +`src/app/` + Local development app and global app styles. + + `App.tsx` + Creates a demo `HubAppLayout` with routes for About, component review, + test content, and documentation. It wraps the app in + `FinchConfigProvider` and `QueryClientProvider`. + + `FinchConfigProvider.tsx` + Defines the shared runtime config context. It accepts optional backend + URLs/API keys, cleans URL values, supplies defaults through helper hooks, + and exposes `useFinchConfig()` / `useOptionalFinchConfig()`. + + `pages/` + Demo-app pages used by `App.tsx`. + +`src/api/` + Backend-facing API clients and hooks. + + `qServer/` + Queue Server REST client, request functions, React Query hooks, types, + and examples. `createQServerApiClient()` creates an Axios instance with + an `ApiKey` authorization header. Request functions call queue, history, + status, plan, device, environment, queue-item, and RunEngine endpoints. + Hooks wrap those calls with TanStack Query queries/mutations and + invalidate related cache keys after mutations. + + `ophyd/` + Ophyd WebSocket hooks and message types. Hooks connect to configured + WebSocket endpoints, subscribe to PVs or devices, process value/meta + updates, expose local device state, and provide setters for write + requests. `useOphydSocket()` is kept for backward compatibility and + delegates to `useOphydPVSocket()`. + +`src/components/` + Reusable UI and beamline components. Important groups include: + + General UI: + Button variants, inputs, sliders, dropdowns, tabs, table, popover, + layout primitives, plots, cards/paper, copy-to-clipboard, iframe, and + Google Doc wrappers. + + App layout: + `HubAppLayout`, `HubHeader`, `HubSidebar`, and `HubMainContent`. The + layout expects route definitions and renders a sidebar, header, and + routed content area. + + Beamline/device controls: + BeamEnergy, Hexapod, Histogram, Shutter, camera components, device + controller boxes, signal monitor plots, relative/absolute move controls, + BeamVis 3D synoptic tools, and ReactEDM. + + QServer: + Queue Server UI container, queue lists, plan submission form, console, + settings panels, popups, hooks, and CSS. `ContainerQServer` composes the + main UI: side panel, running worker, queue/history lists, plan-add panel, + console panel, and settings panel. + + Tiled: + Wrapper components around `@blueskyproject/tiled`, custom scatter and + heatmap components, and hooks such as `useTiledMostRecentDetImage()`. + The wrapper pulls Tiled URL/API key values from Finch config when props + are not passed directly. + + ReactEDM: + Runtime rendering for ADL/BOB-style UI definitions, parsers, mock + context, widgets, style rendering, scalable canvas, and included ADL/BOB + assets. + +`src/features/` + Higher-level feature components that compose lower-level components, such as + `ComponentViewer`, `QServerPlanMonitor`, `TiledHeatmapSelector`, Beamstop, + and Bolt control. + +`src/hooks/` + Shared React hooks, including device message helpers and resize observation. + +`src/utils/` + Shared utilities. `apiUtils.ts` centralizes default backend URLs and config + lookup for Ophyd, Queue Server, and Tiled. Other files handle errors, URL + conversion, and plot processing/generation. + +`src/types/` + Shared TypeScript types for device controllers, navigation route items, and + plots. + +`src/testing/` + Vitest setup and component test suites. Tests use Testing Library and + jsdom/happy-dom-related tooling depending on configuration and dependencies. + +`src/stories/` + Storybook stories and docs. Includes MD/MDX documentation, component + examples, Storybook-specific assets, and ReactEDM documentation. + +`src/assets/` + Shared icons and image assets used by components and the demo app. + +`src/lib/` + Small shared helpers, including `cn()` for class-name merging. + + +Runtime architecture +-------------------- +1. Local development starts with `npm run dev`. +2. Vite serves `index.html`. +3. `src/main.tsx` mounts React into the page and wraps the demo app in + `BrowserRouter`. +4. `src/app/App.tsx` creates route definitions and wraps `HubAppLayout` with: + - `FinchConfigProvider` + - `QueryClientProvider` +5. `FinchConfigProvider` receives environment-driven config values such as + Tiled, Ophyd, Queue Server, and Finch backend URLs. It normalizes the URLs and + makes them available through context. +6. Components and hooks use helpers from `src/utils/apiUtils.ts` to resolve + backend URLs. If no config is provided, they fall back to local defaults: + - Tiled: `http://:8000/api/v1` + - Ophyd: `http://:8001/api/v1` + - Queue Server: `http://:60610/api` + - Queue Server API key: `test` +7. Routed pages render Finch components. Data-oriented components use React + Query, fetch, Axios, or WebSocket hooks to communicate with services. + + +Backend/data flow +----------------- +Queue Server flow: +1. A component calls a hook from `src/api/qServer/hooks.ts`. +2. The hook reads Queue Server URL/API key values through `useQueueServerApiUrls()`. +3. The hook creates an Axios client with `createQServerApiClient()`. +4. Query hooks call request helpers such as `getQueue()`, `getStatus()`, + `getPlansAllowed()`, and `getRunsActive()`. +5. Mutation hooks call request helpers such as `addQueueItem()`, + `executeQueueItem()`, `removeQueueItem()`, `openEnvironment()`, `startRE()`, + `pauseRE()`, `resumeRE()`, and `abortRE()`. +6. Successful mutations invalidate relevant React Query cache keys so queue, + history, status, and run data refresh. + +Ophyd WebSocket flow: +1. A component calls an Ophyd hook with a list of device names or PV names. +2. The hook resolves a WebSocket URL from Finch config or local defaults. +3. On WebSocket open, the hook sends subscription messages for each device/PV. +4. Incoming messages are parsed as JSON and merged into React state. +5. Setter functions send JSON messages back through the socket when users change + device values. +6. Cleanup closes the socket when the component unmounts or subscriptions change. + +Tiled flow: +1. Tiled components read `tiledApiUrl` and `tiledApiKey` from Finch config. +2. `src/components/Tiled/Tiled.tsx` wraps `@blueskyproject/tiled` so Finch + consumers get the Tiled styles and default config automatically. +3. Custom hooks such as `useTiledMostRecentDetImage()` poll Tiled search and + metadata endpoints to find recent detector image runs. +4. Plot components render heatmaps/scatter plots from Tiled or local data. + +Camera/TIFF flow: +1. Camera components use Ophyd-derived WebSocket URLs or explicit props. +2. Hooks manage streaming state, control-panel state, canvas drawing, and TIFF + display. +3. Vite dev proxies can forward local `/api/camera` and `/api/tiff` WebSocket + paths to configured backend socket endpoints. + + +Development commands +-------------------- +Install dependencies: + npm install + +Run the local demo app: + npm run dev + +Run Storybook: + npm run storybook + +Build the library: + npm run build + +Preview a production build: + npm run preview + +Run lint: + npm run lint + +Auto-fix lint issues: + npm run lint:fix + +Check formatting: + npm run format + +Apply formatting: + npm run format:fix + +Run tests in watch mode: + npm test + +Run tests once: + npm run test:run + +Build Storybook: + npm run build-storybook + +Deploy Storybook manually: + npm run deploy-storybook + + +Build and package pipeline +-------------------------- +The library build is configured in `vite.config.ts`. + +1. `npm run build` runs `tsc && vite build`. +2. TypeScript checks the project. +3. Vite builds library output from `src/index.ts`. +4. `vite-plugin-dts` generates declaration files from `src/`. +5. Rollup outputs ES module and UMD bundles: + - `dist/finch.es.js` + - `dist/finch.umd.js` + - `dist/index.d.ts` + - `dist/finch.css` +6. Peer dependencies from `package.json` are externalized so consumers provide + React, React DOM, and React Router. +7. `package.json` exports the root package and CSS entry: + - `@blueskyproject/finch` + - `@blueskyproject/finch/style.css` + + +Vite dev-server proxies +----------------------- +`vite.config.ts` defines local proxy routes for development: + +`/api/qserver` + Proxies REST calls to `VITE_QSERVER_REST` or `http://localhost:60610`. + +`/api/qserver/console` + Proxies WebSocket traffic to `VITE_QSERVER_WS` or the default Queue Server + console socket URL. + +`/api/camera` + Proxies WebSocket traffic to `VITE_CAMERA_WS`. + +`/api/tiff` + Proxies WebSocket traffic to `VITE_TIFF_WS`. + +These proxies help the demo app talk to local services without hard-coding +backend addresses into component code. + + +Environment configuration +------------------------- +Finch commonly uses Vite environment variables in `.env` files. Examples: + + VITE_TILED_API_URL=http://localhost:8000/api/v1 + VITE_TILED_API_KEY=your-tiled-key + VITE_OPHYD_API_URL=http://localhost:8001/api/v1 + VITE_QSERVER_API_URL=http://localhost:60610/api + VITE_QSERVER_API_KEY=test + VITE_FINCH_API_URL=http://localhost:8003/api + +The Vite proxy layer also reads: + + VITE_QSERVER_REST=http://localhost:60610 + VITE_QSERVER_WS=ws://localhost:8001/api/v1/qs-console-socket + VITE_CAMERA_WS=ws://localhost:8001/api/v1/camera-socket + VITE_TIFF_WS=ws://localhost:8002/tiff-socket + +When adding new backend-aware components, prefer reading service addresses +through `FinchConfigProvider` and `src/utils/apiUtils.ts` instead of hard-coding +URLs. + + +Testing pipeline +---------------- +Tests live in `src/testing/tests/` and use Vitest with Testing Library. + +Local one-shot test command: + npm run test:run + +CI test workflow: +1. Runs on pull requests to `main` and `staging`, and pushes to `staging`. +2. Uses Node.js 20.x. +3. Installs dependencies with `npm ci`. +4. Runs lint and formatting checks, capturing output artifacts. +5. Runs the TypeScript/library build. +6. Runs listed component test suites individually for clearer CI output. +7. Uploads test artifacts. +8. On pull requests, posts a test summary comment with lint, format, build, and + test status. + + +Storybook pipeline +------------------ +Storybook source lives in `src/stories/` plus component-adjacent MDX/stories +matched by `.storybook/main.ts`. + +Local Storybook: + npm run storybook + +Build Storybook: + npm run build-storybook + +Publish Storybook: +1. The `Publish Storybook` GitHub Action runs on manual dispatch or push to + `main`. +2. It installs dependencies with `npm ci`. +3. It configures a GitHub Actions git identity and authenticated remote. +4. It runs `npm run deploy-storybook`. +5. The deploy script builds Storybook and publishes `storybook-static` to the + `gh-pages` branch. +6. The public docs site is served at `https://blueskyproject.io/finch/`. + + +npm publishing pipeline +----------------------- +Manual publishing guidance is in `CONTRIBUTING.md`, and automated release +publishing is configured in `.github/workflows/publish-npm.yml`. + +Automated workflow: +1. Runs on manual dispatch and published GitHub releases. +2. Installs dependencies with `npm ci`. +3. Runs lint, tests, and build when present. +4. Runs `npm pack --dry-run` to preview package contents. +5. Uploads `dist/` as an artifact. +6. On published releases, downloads `dist/`, installs dependencies, pins npm to + a known version, and publishes with provenance: + npm publish --access public --provenance + +Manual workflow: +1. Ensure the working tree is clean. +2. Increment the version, for example: + npm version patch +3. Build: + npm run build +4. Publish: + npm publish + + +How to add or change functionality +---------------------------------- +Adding a public component: +1. Add the component under `src/components/` or a domain-specific subfolder. +2. Add props/types near the component or in `src/types/` if shared. +3. Add or update tests in `src/testing/tests/`. +4. Add a Storybook story or docs page in `src/stories/` when useful. +5. Export the component and public types from `src/index.ts`. + +Adding backend functionality: +1. Put raw API calls in `src/api//requests.ts` or a similar service + module. +2. Put shared service types in `src/api//types.ts`. +3. Wrap calls in hooks when React state, caching, or mutations are needed. +4. Use `src/utils/apiUtils.ts` and `FinchConfigProvider` for URLs/API keys. +5. Invalidate React Query keys after mutations that change backend state. + +Adding a demo page: +1. Create a page under `src/app/pages/`. +2. Import it in `src/app/App.tsx`. +3. Add a `RouteItem` entry with path, label, element, and optional icon. + +Adding Storybook docs: +1. Add `.stories.tsx`, `.stories.ts`, `.md`, or `.mdx` files under `src/stories/` + or another `src/` location matched by Storybook. +2. Use `npm run storybook` to verify locally. +3. Use `npm run build-storybook` before publishing or opening a docs PR. + + +Important conventions +--------------------- +- Use TypeScript for source files. +- Keep public exports centralized in `src/index.ts`. +- Use the `@/` alias for imports rooted at `src/` when it matches existing + style. +- Prefer shared URL helpers in `src/utils/apiUtils.ts`. +- Keep backend-aware components configurable through props and + `FinchConfigProvider`. +- Import `@blueskyproject/finch/style.css` once in consumer apps. +- Keep tests focused on public behavior. +- Do not rely on generated `dist/` files during local development; source files + under `src/` are the source of truth. diff --git a/src/api/ophyd/OphydTransportProvider.tsx b/src/api/ophyd/OphydTransportProvider.tsx new file mode 100644 index 00000000..472e65be --- /dev/null +++ b/src/api/ophyd/OphydTransportProvider.tsx @@ -0,0 +1,83 @@ +import { createContext, useContext, useMemo, type ReactNode } from 'react'; +import { useOphydApiUrls } from '@/utils/apiUtils'; +import { createWebSocketTransport } from './transport/createWebSocketTransport'; +import { createWebSocketDeviceTransport } from './transport/createWebSocketDeviceTransport'; +import type { OphydPVTransport } from './transport/types'; +import type { OphydDeviceTransport } from './transport/deviceTypes'; + +const PVTransportContext = createContext(null); +const DeviceTransportContext = createContext(null); + +export interface OphydTransportProviderProps { + /** Override the PV-socket transport (e.g. a simulator). */ + transport?: OphydPVTransport; + /** Override the device-socket transport. */ + deviceTransport?: OphydDeviceTransport; + children: ReactNode; +} + +/** + * Provides PV- and device-socket transports to descendant hooks. When no + * override is supplied, hooks fall back to lazily-constructed real + * WebSocket transports via `useOphydPVTransport` / `useOphydDeviceTransport`, + * preserving the pre-refactor behavior for callers that never wrap in a + * provider. + */ +export function OphydTransportProvider({ + transport, + deviceTransport, + children, +}: OphydTransportProviderProps) { + return ( + + + {children} + + + ); +} + +/** + * Read the PV-socket transport from context, or construct a default + * WebSocket transport pointed at the configured ophyd backend. + * + * The fallback transport is memoized per URL so re-renders of consumers + * don't churn connections. + */ +export function useOphydPVTransport(overrideUrl?: string): OphydPVTransport { + const fromContext = useContext(PVTransportContext); + const configWsUrl = useOphydApiUrls().getWsUrl('pv-socket'); + const url = overrideUrl ?? configWsUrl; + + // Construct fallback transports on demand. useMemo keyed on url means we + // get one transport per (url) per consumer that lacks a provider. This + // matches the prior per-hook WebSocket behavior — see plan for the + // shared-state caveat that motivated the refactor. + const fallback = useMemo(() => { + if (fromContext) return null; + return createWebSocketTransport({ url }); + }, [fromContext, url]); + + if (fromContext) return fromContext; + if (!fallback) { + throw new Error('useOphydPVTransport: no transport available'); + } + return fallback; +} + +export function useOphydDeviceTransport(overrideUrl?: string): OphydDeviceTransport { + const fromContext = useContext(DeviceTransportContext); + const configWsUrl = useOphydApiUrls().getWsUrl('device-socket'); + const url = overrideUrl ?? configWsUrl; + + const fallback = useMemo(() => { + if (fromContext) return null; + return createWebSocketDeviceTransport({ url }); + }, [fromContext, url]); + + if (fromContext) return fromContext; + if (!fallback) { + throw new Error('useOphydDeviceTransport: no transport available'); + } + return fallback; +} diff --git a/src/api/ophyd/transport/createWebSocketDeviceTransport.ts b/src/api/ophyd/transport/createWebSocketDeviceTransport.ts new file mode 100644 index 00000000..fff9674b --- /dev/null +++ b/src/api/ophyd/transport/createWebSocketDeviceTransport.ts @@ -0,0 +1,98 @@ +import type { + OphydDeviceIncomingMessage, + OphydDeviceMessageListener, + OphydDeviceOutgoingMessage, + OphydDeviceTransport, +} from './deviceTypes'; +import type { OphydTransportStatus, OphydTransportStatusListener } from './types'; + +export interface CreateWebSocketDeviceTransportOptions { + url: string; +} + +/** + * WebSocket-backed implementation of OphydDeviceTransport. Mirrors + * createWebSocketTransport but speaks the device-socket protocol (messages + * use `device` instead of `pv`). + */ +export function createWebSocketDeviceTransport( + options: CreateWebSocketDeviceTransportOptions, +): OphydDeviceTransport { + const messageListeners = new Set(); + const statusListeners = new Set(); + let status: OphydTransportStatus = 'connecting'; + const buffer: OphydDeviceOutgoingMessage[] = []; + let closedByUser = false; + + const ws = new WebSocket(options.url); + + const setStatus = (next: OphydTransportStatus): void => { + status = next; + for (const l of statusListeners) { + try { + l(next); + } catch (err) { + console.error('[ophyd-ws-device-transport] status listener threw:', err); + } + } + }; + + ws.onopen = () => { + setStatus('open'); + while (buffer.length > 0) { + const msg = buffer.shift()!; + ws.send(JSON.stringify(msg)); + } + }; + + ws.onmessage = (event) => { + let parsed: OphydDeviceIncomingMessage; + try { + parsed = JSON.parse(event.data); + } catch (err) { + console.error('[ophyd-ws-device-transport] failed to parse message:', err); + return; + } + for (const listener of messageListeners) { + try { + listener(parsed); + } catch (err) { + console.error('[ophyd-ws-device-transport] message listener threw:', err); + } + } + }; + + ws.onerror = () => { + setStatus('error'); + }; + + ws.onclose = () => { + setStatus('closed'); + }; + + return { + send(message) { + if (closedByUser) return; + if (ws.readyState === WebSocket.OPEN) { + ws.send(JSON.stringify(message)); + } else { + buffer.push(message); + } + }, + onMessage(listener) { + messageListeners.add(listener); + return () => messageListeners.delete(listener); + }, + onStatus(listener) { + statusListeners.add(listener); + listener(status); + return () => statusListeners.delete(listener); + }, + close() { + closedByUser = true; + if (ws.readyState !== WebSocket.CLOSED && ws.readyState !== WebSocket.CLOSING) { + ws.close(); + } + }, + }; +} diff --git a/src/api/ophyd/transport/createWebSocketTransport.ts b/src/api/ophyd/transport/createWebSocketTransport.ts new file mode 100644 index 00000000..aeebe5df --- /dev/null +++ b/src/api/ophyd/transport/createWebSocketTransport.ts @@ -0,0 +1,101 @@ +import type { + OphydPVIncomingMessage, + OphydPVMessageListener, + OphydPVOutgoingMessage, + OphydPVTransport, + OphydTransportStatus, + OphydTransportStatusListener, +} from './types'; + +export interface CreateWebSocketTransportOptions { + url: string; +} + +/** + * WebSocket-backed implementation of OphydPVTransport. One transport owns + * one WebSocket. Outgoing messages are buffered until the connection opens. + * + * Errors and closure are surfaced through the status channel. Reconnect + * logic is not yet implemented — consumers can recreate the transport. + */ +export function createWebSocketTransport( + options: CreateWebSocketTransportOptions, +): OphydPVTransport { + const messageListeners = new Set(); + const statusListeners = new Set(); + let status: OphydTransportStatus = 'connecting'; + const buffer: OphydPVOutgoingMessage[] = []; + let closedByUser = false; + + const ws = new WebSocket(options.url); + + const setStatus = (next: OphydTransportStatus): void => { + status = next; + for (const l of statusListeners) { + try { + l(next); + } catch (err) { + console.error('[ophyd-ws-transport] status listener threw:', err); + } + } + }; + + ws.onopen = () => { + setStatus('open'); + while (buffer.length > 0) { + const msg = buffer.shift()!; + ws.send(JSON.stringify(msg)); + } + }; + + ws.onmessage = (event) => { + let parsed: OphydPVIncomingMessage; + try { + parsed = JSON.parse(event.data); + } catch (err) { + console.error('[ophyd-ws-transport] failed to parse message:', err); + return; + } + for (const listener of messageListeners) { + try { + listener(parsed); + } catch (err) { + console.error('[ophyd-ws-transport] message listener threw:', err); + } + } + }; + + ws.onerror = () => { + setStatus('error'); + }; + + ws.onclose = () => { + setStatus('closed'); + }; + + return { + send(message) { + if (closedByUser) return; + if (ws.readyState === WebSocket.OPEN) { + ws.send(JSON.stringify(message)); + } else { + buffer.push(message); + } + }, + onMessage(listener) { + messageListeners.add(listener); + return () => messageListeners.delete(listener); + }, + onStatus(listener) { + statusListeners.add(listener); + listener(status); + return () => statusListeners.delete(listener); + }, + close() { + closedByUser = true; + if (ws.readyState !== WebSocket.CLOSED && ws.readyState !== WebSocket.CLOSING) { + ws.close(); + } + }, + }; +} diff --git a/src/api/ophyd/transport/deviceTypes.ts b/src/api/ophyd/transport/deviceTypes.ts new file mode 100644 index 00000000..8aa2b445 --- /dev/null +++ b/src/api/ophyd/transport/deviceTypes.ts @@ -0,0 +1,32 @@ +import type { + ActionRequestSubscribe, + ActionRequestUnsubscribe, + ActionRequestSet, + ActionRequestRefresh, + MessageResponse, + ErrorResponse, + ValueUpdateResponse, + MetaUpdateResponse, +} from '@/api/ophyd/ophydDeviceSocketTypes'; +import type { OphydTransportStatus, Unsubscribe } from './types'; + +export type OphydDeviceOutgoingMessage = + | ActionRequestSubscribe + | ActionRequestUnsubscribe + | ActionRequestSet + | ActionRequestRefresh; + +export type OphydDeviceIncomingMessage = + | MessageResponse + | ErrorResponse + | ValueUpdateResponse + | MetaUpdateResponse; + +export type OphydDeviceMessageListener = (message: OphydDeviceIncomingMessage) => void; + +export interface OphydDeviceTransport { + send(message: OphydDeviceOutgoingMessage): void; + onMessage(listener: OphydDeviceMessageListener): Unsubscribe; + onStatus(listener: (status: OphydTransportStatus) => void): Unsubscribe; + close(): void; +} diff --git a/src/api/ophyd/transport/types.ts b/src/api/ophyd/transport/types.ts new file mode 100644 index 00000000..0e2fd225 --- /dev/null +++ b/src/api/ophyd/transport/types.ts @@ -0,0 +1,43 @@ +import type { + ActionRequestSubscribe, + ActionRequestUnsubscribe, + ActionRequestSet, + ActionRequestRefresh, + MessageResponse, + ErrorResponse, + ValueUpdateResponse, + MetaUpdateResponse, +} from '@/api/ophyd/ophydPVSocketTypes'; + +export type OphydPVOutgoingMessage = + | ActionRequestSubscribe + | ActionRequestUnsubscribe + | ActionRequestSet + | ActionRequestRefresh; + +export type OphydPVIncomingMessage = + | MessageResponse + | ErrorResponse + | ValueUpdateResponse + | MetaUpdateResponse; + +export type OphydTransportStatus = 'connecting' | 'open' | 'closed' | 'error'; + +export type OphydPVMessageListener = (message: OphydPVIncomingMessage) => void; +export type OphydTransportStatusListener = (status: OphydTransportStatus) => void; +export type Unsubscribe = () => void; + +/** + * Abstraction over the wire used by useOphydPVSocket. + * + * Implementations route the existing PV-socket message protocol to either a + * real WebSocket backend or an in-process simulator. Hooks consume a transport + * from context; per-call lifecycle (open/close) is owned by the transport, not + * the hook. + */ +export interface OphydPVTransport { + send(message: OphydPVOutgoingMessage): void; + onMessage(listener: OphydPVMessageListener): Unsubscribe; + onStatus(listener: OphydTransportStatusListener): Unsubscribe; + close(): void; +} diff --git a/src/components/OphydSocketViewer/OphydSocketViewer.tsx b/src/components/OphydSocketViewer/OphydSocketViewer.tsx new file mode 100644 index 00000000..88fac108 --- /dev/null +++ b/src/components/OphydSocketViewer/OphydSocketViewer.tsx @@ -0,0 +1,8 @@ +export default function OphydSocketViewer() { + return ( +
+

Ophyd Socket View

+

Print out messages here.

+
+ ) +} \ No newline at end of file diff --git a/src/components/OphydSocketViewer/useOphydSocketViewer.ts b/src/components/OphydSocketViewer/useOphydSocketViewer.ts new file mode 100644 index 00000000..9b9072f5 --- /dev/null +++ b/src/components/OphydSocketViewer/useOphydSocketViewer.ts @@ -0,0 +1,221 @@ +//Instructions + // This here is a copy-paste from useOphydPVSocket.tsx + // This contains alll the code we need to talk to Ophyd Websocket for EPICS pvs. + // Modify this source code so that we return an additional 'messages' state variable + // that can then be dispalyed in 'OphydSocketViewer' + + +// To do: + // Modify this code so that first, it prints out every message going + // out to the websocket, and every message that comes back from the websocket. + + // Once you have that done, the next step is to save each message into a React + // state variable, which is returned from this hook. + //After that's done, you can wire this hook up in TestPage.tsx to replace useOphydPVSocket + +import { useState, useRef, useEffect, useCallback, useMemo } from 'react'; +import { Devices } from 'src/types/deviceControllerTypes'; +import { useOphydApiUrls } from '@/utils/apiUtils'; +import { + MessageResponse, + ErrorResponse, + ValueUpdateResponse, + MetaUpdateResponse, +} from '@/api/ophyd/ophydPVSocketTypes'; +import { BluetoothSlash } from '@phosphor-icons/react'; + +/** + * Custom hook for managing WebSocket connections to Ophyd devices. + * Provides real-time device state management and control functions. + * + * @param deviceNameList - Array of EPICS PVs to subscribe to + * @param wsUrl - Optional WebSocket URL. If not provided, will use environment variables or default to localhost:8001 + * @returns Object containing device states, control functions, and message history + */ +export default function useOphydPVSocket(deviceNameList: string[], wsUrl?: string) { + // eslint-disable-next-line react-hooks/exhaustive-deps + const memoizedDeviceNames = useMemo(() => deviceNameList, [JSON.stringify(deviceNameList)]); + const configWsUrl = useOphydApiUrls().getWsUrl('pv-socket'); + const apiUrl: string = wsUrl ?? configWsUrl; + + const [devices, setDevices] = useState(() => { + const initialDevices: Devices = {}; + memoizedDeviceNames.forEach((deviceName) => { + initialDevices[deviceName] = { + name: deviceName, + value: '', + connected: false, + locked: false, + timestamp: 0, + expanded: false, + pv: deviceName, + read_access: false, + write_access: false, + }; + }); + return initialDevices; + }); + + // --- NEW STATE FOR MESSAGES --- + const [messages, setMessages] = useState<{direction: 'SENT' | 'RCVD'; data: string}[]>([]); + + const wsRef = useRef(null); + const hasRenderedOnlyOnce = useRef(false); + + /** + * Helper to log and store websocket messages + */ + const logMessage = useCallback((direction: 'SENT' | 'RCVD', data: string) => { + console.log(`[WebSocket ${direction}]:`, data); + setMessages((prev) => [...prev, { direction, data }]); + }, []); + + const toggleDeviceLock = useCallback((deviceName: string) => { + setDevices((prevDevices) => ({ + ...prevDevices, + [deviceName]: { + ...prevDevices[deviceName], + locked: !prevDevices[deviceName].locked, + }, + })); + }, []); + + const handleSetValueRequest = useCallback( + (deviceName: string, value: string | number | boolean) => { + if (wsRef.current) { + const setValueMessage = { + action: 'set', + pv: deviceName, + value: value, + }; + const payload = JSON.stringify(setValueMessage); + + // Log outgoing message + logMessage('SENT', payload); + wsRef.current.send(payload); + } + }, + [logMessage], + ); + + const toggleExpand = useCallback((deviceName: string) => { + setDevices((prevDevices) => ({ + ...prevDevices, + [deviceName]: { + ...prevDevices[deviceName], + expanded: !prevDevices[deviceName].expanded, + }, + })); + }, []); + + useEffect(() => { + if (hasRenderedOnlyOnce.current) { + const initialDevices: Devices = {}; + memoizedDeviceNames.forEach((deviceName) => { + initialDevices[deviceName] = { + name: deviceName, + value: '', + connected: false, + locked: false, + timestamp: 0, + expanded: false, + pv: deviceName, + read_access: false, + write_access: false, + }; + }); + setDevices(initialDevices); + } else { + hasRenderedOnlyOnce.current = true; + } + }, [memoizedDeviceNames]); + + useEffect(() => { + if (memoizedDeviceNames.length === 0) { + if (wsRef.current) { + wsRef.current.close(); + wsRef.current = null; + } + return; + } + + const ws = new WebSocket(apiUrl); + wsRef.current = ws; + + ws.onopen = () => { + memoizedDeviceNames.forEach((deviceName) => { + const subscribeMessage = { + action: 'subscribe', + pv: deviceName, + }; + const payload = JSON.stringify(subscribeMessage); + + // Log outgoing subscription messages + logMessage('SENT', payload); + ws.send(payload); + }); + }; + + ws.onmessage = (event) => { + // Log incoming message + logMessage('RCVD', event.data); + + try { + const message: + | MessageResponse + | ErrorResponse + | ValueUpdateResponse + | MetaUpdateResponse = JSON.parse(event.data); + if ('sub_type' in message && message.sub_type === 'meta') { + setDevices((prevDevices) => ({ + ...prevDevices, + [message.pv]: { + ...prevDevices[message.pv], + ...message, + min: message.lower_ctrl_limit, + max: message.upper_ctrl_limit, + }, + })); + } else if ('pv' in message) { + const deviceName = message.pv; + setDevices((prevDevices) => ({ + ...prevDevices, + [deviceName]: { + ...prevDevices[deviceName], + ...message, + }, + })); + } + if ('error' in message) { + console.error('WebSocket error message:', message.error); + } + } catch (error) { + console.error('Error parsing WebSocket message:', error); + } + }; + + ws.onerror = (error) => { + console.error('WebSocket error:', error); + }; + + ws.onclose = () => { + // Optional: log closure to messages state + // logMessage('RCVD', 'Connection Closed'); + }; + + return () => { + if (wsRef.current) { + wsRef.current.close(); + wsRef.current = null; + } + }; + }, [wsUrl, memoizedDeviceNames, apiUrl, logMessage]); + + return { + devices, + messages, // Now returning the history of messages + toggleDeviceLock, + handleSetValueRequest, + toggleExpand, + }; +} \ No newline at end of file diff --git a/src/lib/ophyd-sim/core/createOphydSim.ts b/src/lib/ophyd-sim/core/createOphydSim.ts new file mode 100644 index 00000000..6451abeb --- /dev/null +++ b/src/lib/ophyd-sim/core/createOphydSim.ts @@ -0,0 +1,170 @@ +import { DependencyGraph } from './dependencyGraph'; +import { Scheduler } from './scheduler'; +import { SimState } from './state'; +import type { + CreateOphydSimOptions, + OphydSim, + PVMetadata, + SimListener, + SimRegistration, + SimValue, + SimValueContext, + SimValueFn, + TickHandler, + Unsubscribe, +} from './types'; + +const DEFAULT_TICK_MS = 1000 / 30; + +/** + * Build a simulator instance. Wires up shared state, a dependency graph for + * derived signals, and a tick scheduler for periodic/motor updates. Devices + * register themselves via the factory functions passed in `options.devices`. + * + * The simulator does not start ticking until `start()` is called — typically + * by OphydSimProvider on mount. + */ +export function createOphydSim(options: CreateOphydSimOptions): OphydSim { + const now = options.now ?? Date.now; + const random = options.random ?? Math.random; + const state = new SimState(now); + const graph = new DependencyGraph(); + const scheduler = new Scheduler(options.tickMs ?? DEFAULT_TICK_MS, now); + + const setHandlers = new Map void>>(); + const recomputeFns = new Map void>(); + + const buildContext = (dt: number, time: number): SimValueContext => ({ + time, + dt, + random, + get: { + value: (n) => state.get(n), + number: (n) => { + const v = state.get(n); + return typeof v === 'number' ? v : Number(v ?? 0); + }, + boolean: (n) => { + const v = state.get(n); + return typeof v === 'boolean' ? v : Boolean(v); + }, + string: (n) => { + const v = state.get(n); + return v === undefined ? '' : String(v); + }, + }, + }); + + // `set` cascades: write value → notify subscribers → call onSet handlers → + // recompute downstream derived signals in topological order. Recomputation + // is best-effort: a derived signal that throws logs and is skipped. + const setValue = (name: string, value: SimValue): void => { + const changed = state.set(name, value); + if (!changed) return; + + const handlers = setHandlers.get(name); + if (handlers) { + for (const h of handlers) { + try { + h(value); + } catch (err) { + console.error(`[ophyd-sim] onSet handler for "${name}" threw:`, err); + } + } + } + + for (const dependent of graph.dependentsOf(name)) { + const fn = recomputeFns.get(dependent); + if (fn) { + try { + fn(); + } catch (err) { + console.error(`[ophyd-sim] recompute for "${dependent}" threw:`, err); + } + } + } + }; + + const registration: SimRegistration = { + seed(name, value, metadata) { + state.seed(name, value, metadata); + }, + setMetadata(name, metadata) { + state.setMetadata(name, metadata); + }, + registerDerived(name: string, dependsOn: string[], compute: SimValueFn) { + graph.register(name, dependsOn); + const recompute = (): void => { + const ctx = buildContext(0, now()); + const next = compute(ctx); + setValue(name, next); + }; + recomputeFns.set(name, recompute); + // Seed initial value from compute() so dependents have something + // to read on first subscribe. Compute may legitimately read + // dependencies that aren't seeded yet — guard inside compute. + try { + const ctx = buildContext(0, now()); + state.seed(name, compute(ctx)); + } catch (err) { + console.error( + `[ophyd-sim] initial compute for "${name}" failed (will retry on dep change):`, + err, + ); + } + }, + onTick(handler: TickHandler): Unsubscribe { + return scheduler.onTick(handler); + }, + onSet(name, handler) { + let set = setHandlers.get(name); + if (!set) { + set = new Set(); + setHandlers.set(name, set); + } + set.add(handler); + return () => set!.delete(handler); + }, + get(name) { + return state.get(name); + }, + set: setValue, + metadata(name) { + return state.metadata(name); + }, + random, + now, + context: buildContext, + }; + + for (const factory of options.devices) { + factory(registration); + } + + const sim: OphydSim = { + subscribe(name, listener: SimListener) { + return state.subscribe(name, listener); + }, + set: setValue, + get(name) { + return state.get(name); + }, + metadata(name): PVMetadata | undefined { + return state.metadata(name); + }, + names() { + return state.names(); + }, + start() { + scheduler.start(); + }, + stop() { + scheduler.stop(); + }, + advance(deltaMs) { + scheduler.advance(deltaMs); + }, + }; + + return sim; +} diff --git a/src/lib/ophyd-sim/core/dependencyGraph.ts b/src/lib/ophyd-sim/core/dependencyGraph.ts new file mode 100644 index 00000000..f41a6be7 --- /dev/null +++ b/src/lib/ophyd-sim/core/dependencyGraph.ts @@ -0,0 +1,84 @@ +/** + * Forward-edge dependency map: when a source PV changes, walk its dependents + * and recompute them in topological order. + * + * Cycles throw at registration time — derived signals must form a DAG. + */ +export class DependencyGraph { + private readonly dependents = new Map>(); + private readonly dependencies = new Map>(); + + /** Declare that `name` depends on every PV in `dependsOn`. */ + register(name: string, dependsOn: string[]): void { + const deps = this.dependencies.get(name) ?? new Set(); + for (const source of dependsOn) { + deps.add(source); + const fwd = this.dependents.get(source) ?? new Set(); + fwd.add(name); + this.dependents.set(source, fwd); + } + this.dependencies.set(name, deps); + + if (this.hasCycle()) { + throw new Error( + `[ophyd-sim] dependency cycle detected involving "${name}" (depends on: ${dependsOn.join( + ', ', + )})`, + ); + } + } + + /** + * Return dependents of `name` in topological order — every dependent + * appears after each of its own (transitive) dependencies in this list. + * Useful for cascading recomputation after a source value changes. + */ + dependentsOf(name: string): string[] { + const visited = new Set(); + const order: string[] = []; + + const visit = (node: string): void => { + if (visited.has(node)) return; + visited.add(node); + const fwd = this.dependents.get(node); + if (fwd) { + for (const next of fwd) visit(next); + } + order.push(node); + }; + + const direct = this.dependents.get(name); + if (!direct) return []; + for (const d of direct) visit(d); + // visit() pushes in post-order; reverse so dependencies precede dependents. + return order.reverse(); + } + + private hasCycle(): boolean { + const WHITE = 0; + const GRAY = 1; + const BLACK = 2; + const color = new Map(); + + const dfs = (node: string): boolean => { + color.set(node, GRAY); + const fwd = this.dependents.get(node); + if (fwd) { + for (const next of fwd) { + const c = color.get(next) ?? WHITE; + if (c === GRAY) return true; + if (c === WHITE && dfs(next)) return true; + } + } + color.set(node, BLACK); + return false; + }; + + for (const node of this.dependencies.keys()) { + if ((color.get(node) ?? WHITE) === WHITE) { + if (dfs(node)) return true; + } + } + return false; + } +} diff --git a/src/lib/ophyd-sim/core/scheduler.ts b/src/lib/ophyd-sim/core/scheduler.ts new file mode 100644 index 00000000..5a26048f --- /dev/null +++ b/src/lib/ophyd-sim/core/scheduler.ts @@ -0,0 +1,104 @@ +import type { TickHandler, TickHandlerContext, Unsubscribe } from './types'; + +/** + * Drives per-tick work for motors and periodic signals. + * + * Prefers requestAnimationFrame in the browser for smoothness; falls back to + * setInterval (e.g. for tests in jsdom, where rAF may run synchronously). + * + * Time is monotonic across pause/resume — devices see dt measured against the + * previous tick, not wall-clock. + */ +export class Scheduler { + private handlers = new Set(); + private running = false; + private rafHandle: number | null = null; + private intervalHandle: ReturnType | null = null; + private lastTickMs: number | null = null; + private readonly tickMs: number; + private readonly now: () => number; + + constructor(tickMs: number, now: () => number) { + this.tickMs = tickMs; + this.now = now; + } + + onTick(handler: TickHandler): Unsubscribe { + this.handlers.add(handler); + return () => { + this.handlers.delete(handler); + }; + } + + start(): void { + if (this.running) return; + this.running = true; + this.lastTickMs = this.now(); + + const useRaf = + typeof globalThis !== 'undefined' && + typeof (globalThis as { requestAnimationFrame?: unknown }).requestAnimationFrame === + 'function'; + + if (useRaf) { + const loop = (): void => { + if (!this.running) return; + this.tick(); + this.rafHandle = ( + globalThis as { requestAnimationFrame: (cb: FrameRequestCallback) => number } + ).requestAnimationFrame(loop); + }; + this.rafHandle = ( + globalThis as { requestAnimationFrame: (cb: FrameRequestCallback) => number } + ).requestAnimationFrame(loop); + } else { + this.intervalHandle = setInterval(() => this.tick(), this.tickMs); + } + } + + stop(): void { + if (!this.running) return; + this.running = false; + if (this.rafHandle !== null) { + const cancel = (globalThis as { cancelAnimationFrame?: (h: number) => void }) + .cancelAnimationFrame; + if (cancel) cancel(this.rafHandle); + this.rafHandle = null; + } + if (this.intervalHandle !== null) { + clearInterval(this.intervalHandle); + this.intervalHandle = null; + } + this.lastTickMs = null; + } + + /** + * Run one synthetic tick. Useful for tests that want to advance time + * without running a real animation loop. + */ + advance(deltaMs: number): void { + const time = this.lastTickMs ?? this.now(); + const dt = deltaMs / 1000; + const ctx: TickHandlerContext = { time, dt }; + this.runHandlers(ctx); + this.lastTickMs = time + deltaMs; + } + + private tick(): void { + const time = this.now(); + const last = this.lastTickMs ?? time; + const dt = Math.max(0, (time - last) / 1000); + this.lastTickMs = time; + this.runHandlers({ time, dt }); + } + + private runHandlers(ctx: TickHandlerContext): void { + for (const handler of this.handlers) { + try { + handler(ctx); + } catch (err) { + console.error('[ophyd-sim] tick handler threw:', err); + } + } + } +} diff --git a/src/lib/ophyd-sim/core/state.ts b/src/lib/ophyd-sim/core/state.ts new file mode 100644 index 00000000..a69401d3 --- /dev/null +++ b/src/lib/ophyd-sim/core/state.ts @@ -0,0 +1,92 @@ +import type { PVMetadata, SimEvent, SimListener, SimValue, Unsubscribe } from './types'; + +interface PVEntry { + value: SimValue | undefined; + metadata: PVMetadata; + listeners: Set; +} + +/** + * Shared state map: PV name → value + metadata + subscribers. + * + * Subscribers receive the latest known value immediately on subscribe if one + * exists. `set` only emits when the value actually changed (reference or + * primitive equality), so static signals don't generate update storms. + */ +export class SimState { + private readonly entries = new Map(); + private readonly now: () => number; + + constructor(now: () => number) { + this.now = now; + } + + private entry(name: string): PVEntry { + let e = this.entries.get(name); + if (!e) { + e = { value: undefined, metadata: {}, listeners: new Set() }; + this.entries.set(name, e); + } + return e; + } + + seed(name: string, value: SimValue, metadata: PVMetadata = {}): void { + const e = this.entry(name); + e.value = value; + e.metadata = { ...e.metadata, ...metadata }; + } + + setMetadata(name: string, metadata: PVMetadata): void { + const e = this.entry(name); + e.metadata = { ...e.metadata, ...metadata }; + } + + metadata(name: string): PVMetadata | undefined { + return this.entries.get(name)?.metadata; + } + + get(name: string): SimValue | undefined { + return this.entries.get(name)?.value; + } + + has(name: string): boolean { + return this.entries.has(name); + } + + names(): string[] { + return Array.from(this.entries.keys()); + } + + /** + * Set a value. Returns true if it changed (and listeners were notified). + */ + set(name: string, value: SimValue): boolean { + const e = this.entry(name); + if (e.value === value) return false; + e.value = value; + const event: SimEvent = { name, value, timestamp: this.now() }; + for (const listener of e.listeners) { + try { + listener(event); + } catch (err) { + console.error('[ophyd-sim] subscriber threw:', err); + } + } + return true; + } + + subscribe(name: string, listener: SimListener): Unsubscribe { + const e = this.entry(name); + e.listeners.add(listener); + if (e.value !== undefined) { + try { + listener({ name, value: e.value, timestamp: this.now() }); + } catch (err) { + console.error('[ophyd-sim] subscriber threw on replay:', err); + } + } + return () => { + e.listeners.delete(listener); + }; + } +} diff --git a/src/lib/ophyd-sim/core/types.ts b/src/lib/ophyd-sim/core/types.ts new file mode 100644 index 00000000..b7621713 --- /dev/null +++ b/src/lib/ophyd-sim/core/types.ts @@ -0,0 +1,103 @@ +export type SimValue = string | number | boolean; + +export interface PVMetadata { + units?: string; + lower_ctrl_limit?: number | null; + upper_ctrl_limit?: number | null; + precision?: number; + enum_strs?: string[] | null; + write_access?: boolean; + read_access?: boolean; +} + +export interface SimEvent { + name: string; + value: SimValue; + timestamp: number; +} + +export type SimListener = (event: SimEvent) => void; +export type Unsubscribe = () => void; + +export interface SimValueContext { + get: { + value(name: string): SimValue | undefined; + number(name: string): number; + boolean(name: string): boolean; + string(name: string): string; + }; + time: number; + dt: number; + random: () => number; +} + +export type SimValueFn = (ctx: SimValueContext) => SimValue; + +export interface TickHandlerContext { + time: number; + dt: number; +} + +export type TickHandler = (ctx: TickHandlerContext) => void; + +/** + * Internal handle a device factory uses to wire itself into the simulator. + * + * The factory receives this from `createOphydSim` at registration time and is + * free to seed initial state, declare derived signals, and register tick or + * set handlers. Devices do not see other devices directly — they read shared + * state via the same `get`/`set` API user code uses. + */ +export interface SimRegistration { + seed(name: string, value: SimValue, metadata?: PVMetadata): void; + setMetadata(name: string, metadata: PVMetadata): void; + /** + * Declare a derived signal. `compute` is invoked with a value context any + * time one of `dependsOn` changes (and once at registration time to seed + * the initial value). + */ + registerDerived(name: string, dependsOn: string[], compute: SimValueFn): void; + onTick(handler: TickHandler): Unsubscribe; + onSet(name: string, handler: (value: SimValue) => void): Unsubscribe; + get(name: string): SimValue | undefined; + set(name: string, value: SimValue): void; + metadata(name: string): PVMetadata | undefined; + random(): number; + now(): number; + /** Build a SimValueContext for use in tick callbacks. */ + context(dt: number, time: number): SimValueContext; +} + +export type DeviceFactory = (registration: SimRegistration) => void; + +export interface OphydSim { + /** Subscribe to value updates for a PV. Replays the latest value synchronously if known. */ + subscribe(name: string, listener: SimListener): Unsubscribe; + /** Write to a PV. Triggers dependent recomputation and notifies subscribers if value changed. */ + set(name: string, value: SimValue): void; + /** Read the latest value for a PV. */ + get(name: string): SimValue | undefined; + /** Read metadata (units, limits, access) for a PV if known. */ + metadata(name: string): PVMetadata | undefined; + /** Names of every PV currently registered. */ + names(): string[]; + /** Begin the tick loop. Idempotent. */ + start(): void; + /** Stop the tick loop. Idempotent. */ + stop(): void; + /** + * Run a single synthetic tick of `deltaMs`. Useful in tests to drive + * motor motion and periodic recompute without spinning the real loop. + */ + advance(deltaMs: number): void; +} + +export interface CreateOphydSimOptions { + devices: DeviceFactory[]; + /** Global tick interval in ms. Defaults to ~33ms (≈30 Hz). */ + tickMs?: number; + /** Random source. Defaults to Math.random. Override for deterministic tests. */ + random?: () => number; + /** Override the clock. Defaults to Date.now. */ + now?: () => number; +} diff --git a/src/lib/ophyd-sim/devices/motor.ts b/src/lib/ophyd-sim/devices/motor.ts new file mode 100644 index 00000000..ea95c60c --- /dev/null +++ b/src/lib/ophyd-sim/devices/motor.ts @@ -0,0 +1,110 @@ +import type { DeviceFactory, PVMetadata } from '../core/types'; + +export interface MotorOptions { + /** Setpoint PV name (e.g. "IOC:m1"). */ + name: string; + /** Readback PV name. Defaults to `${name}.RBV`. */ + readbackName?: string; + /** Moving-flag PV name (1 while in motion, 0 otherwise). Defaults to `${name}.MOVN`. */ + movingName?: string; + initialPosition?: number; + /** Velocity in units/second. */ + velocity?: number; + /** Soft control limits applied to setpoint writes. */ + limits?: [number, number]; + units?: string; + /** Within how close (units) the readback must be to the setpoint to settle. */ + epsilon?: number; +} + +/** + * Linear-velocity motor. + * + * Exposes three PVs sharing one motion state: + * - `name` — setpoint (writable; clamps to limits) + * - `name.RBV` (default) — readback, animates toward setpoint + * - `name.MOVN` (default) — 1 while moving, 0 otherwise + * + * Writes to the setpoint clamp into `[low, high]`, set MOVN=1, and start the + * readback advancing by `velocity * dt` per tick toward the target. When + * within `epsilon`, readback snaps to setpoint and MOVN clears. + */ +export function motor(opts: MotorOptions): DeviceFactory { + return (reg) => { + const setpointName = opts.name; + const readbackName = opts.readbackName ?? `${opts.name}.RBV`; + const movingName = opts.movingName ?? `${opts.name}.MOVN`; + + const velocity = opts.velocity ?? 1; + const epsilon = opts.epsilon ?? 1e-4; + const lower = opts.limits ? opts.limits[0] : null; + const upper = opts.limits ? opts.limits[1] : null; + const initial = opts.initialPosition ?? 0; + + const setpointMetadata: PVMetadata = { + units: opts.units, + lower_ctrl_limit: lower, + upper_ctrl_limit: upper, + read_access: true, + write_access: true, + precision: 4, + }; + const readbackMetadata: PVMetadata = { + units: opts.units, + lower_ctrl_limit: lower, + upper_ctrl_limit: upper, + read_access: true, + write_access: false, + precision: 4, + }; + const movingMetadata: PVMetadata = { + read_access: true, + write_access: false, + enum_strs: ['Done', 'Moving'], + }; + + reg.seed(setpointName, initial, setpointMetadata); + reg.seed(readbackName, initial, readbackMetadata); + reg.seed(movingName, 0, movingMetadata); + + // Clamp setpoint writes to limits. Motor motion handler reads target + // back via reg.get, so clamping has to update the stored value. + reg.onSet(setpointName, (value) => { + if (typeof value !== 'number') return; + const clamped = + lower !== null && upper !== null + ? Math.min(upper, Math.max(lower, value)) + : lower !== null + ? Math.max(lower, value) + : upper !== null + ? Math.min(upper, value) + : value; + if (clamped !== value) { + // Re-issue the clamped value; onSet won't recurse because + // state.set early-returns on equality. + reg.set(setpointName, clamped); + } + }); + + reg.onTick(({ dt }) => { + const targetRaw = reg.get(setpointName); + const positionRaw = reg.get(readbackName); + if (typeof targetRaw !== 'number' || typeof positionRaw !== 'number') return; + + const distance = targetRaw - positionRaw; + const absDistance = Math.abs(distance); + + if (absDistance < epsilon) { + if (positionRaw !== targetRaw) reg.set(readbackName, targetRaw); + if (reg.get(movingName) !== 0) reg.set(movingName, 0); + return; + } + + if (reg.get(movingName) !== 1) reg.set(movingName, 1); + + const step = Math.min(absDistance, velocity * dt); + const nextPosition = positionRaw + Math.sign(distance) * step; + reg.set(readbackName, nextPosition); + }); + }; +} diff --git a/src/lib/ophyd-sim/devices/signal.ts b/src/lib/ophyd-sim/devices/signal.ts new file mode 100644 index 00000000..59c35a47 --- /dev/null +++ b/src/lib/ophyd-sim/devices/signal.ts @@ -0,0 +1,94 @@ +import type { + DeviceFactory, + PVMetadata, + SimValue, + SimValueContext, + SimValueFn, +} from '../core/types'; + +export interface SignalOptions { + name: string; + /** Initial value seeded immediately. Required unless `value` is a function. */ + initialValue?: SimValue; + /** Static literal, or a function evaluated periodically and/or on dep change. */ + value?: SimValue | SimValueFn; + /** Other PVs this signal depends on. Triggers recompute on their changes. */ + dependsOn?: string[]; + /** Recompute every `periodMs` regardless of dependency changes. */ + periodMs?: number; + units?: string; + /** EPICS-style control limits. */ + limits?: [number, number]; + /** Defaults to false — signals are read-only by default. */ + writeAccess?: boolean; + precision?: number; + enumStrs?: string[]; +} + +/** + * Scalar signal: static literal, dynamic function, derived from other PVs, + * or any combination. + * + * Resolution order at registration: + * 1. If `value` is a function and `dependsOn` is non-empty → derived signal + * (recomputes on any dep change AND optionally on `periodMs`). + * 2. If `value` is a function and no deps → periodic-only signal. + * 3. Otherwise → static signal seeded from `initialValue` or `value`. + */ +export function signal(opts: SignalOptions): DeviceFactory { + return (reg) => { + const metadata: PVMetadata = { + units: opts.units, + lower_ctrl_limit: opts.limits ? opts.limits[0] : null, + upper_ctrl_limit: opts.limits ? opts.limits[1] : null, + precision: opts.precision, + enum_strs: opts.enumStrs ?? null, + read_access: true, + write_access: opts.writeAccess ?? false, + }; + + const isFn = typeof opts.value === 'function'; + const valueFn = isFn ? (opts.value as SimValueFn) : null; + const deps = opts.dependsOn ?? []; + + if (valueFn && deps.length > 0) { + reg.setMetadata(opts.name, metadata); + reg.registerDerived(opts.name, deps, valueFn); + } else { + const seed: SimValue = + opts.initialValue !== undefined + ? opts.initialValue + : valueFn + ? safeInitial(valueFn, reg.context(0, reg.now())) + : ((opts.value as SimValue) ?? 0); + reg.seed(opts.name, seed, metadata); + } + + if (valueFn && opts.periodMs && opts.periodMs > 0) { + let accumMs = 0; + const periodMs = opts.periodMs; + reg.onTick(({ dt, time }) => { + accumMs += dt * 1000; + if (accumMs < periodMs) return; + accumMs = 0; + const ctx = reg.context(dt, time); + try { + reg.set(opts.name, valueFn(ctx)); + } catch (err) { + console.error( + `[ophyd-sim] periodic recompute for signal "${opts.name}" threw:`, + err, + ); + } + }); + } + }; +} + +function safeInitial(fn: SimValueFn, ctx: SimValueContext): SimValue { + try { + return fn(ctx); + } catch { + return 0; + } +} diff --git a/src/lib/ophyd-sim/generators/gaussian.ts b/src/lib/ophyd-sim/generators/gaussian.ts new file mode 100644 index 00000000..e57093bc --- /dev/null +++ b/src/lib/ophyd-sim/generators/gaussian.ts @@ -0,0 +1,28 @@ +export interface GaussianOptions { + x: number; + center: number; + sigma: number; +} + +/** 1D Gaussian, peak value 1 at x = center. */ +export function gaussian({ x, center, sigma }: GaussianOptions): number { + if (sigma === 0) return x === center ? 1 : 0; + const z = (x - center) / sigma; + return Math.exp(-0.5 * z * z); +} + +export interface Gaussian2dOptions { + x: number; + y: number; + centerX: number; + centerY: number; + sigmaX: number; + sigmaY: number; +} + +/** 2D Gaussian, peak value 1 at (centerX, centerY). */ +export function gaussian2d({ x, y, centerX, centerY, sigmaX, sigmaY }: Gaussian2dOptions): number { + const zx = sigmaX === 0 ? (x === centerX ? 0 : Infinity) : (x - centerX) / sigmaX; + const zy = sigmaY === 0 ? (y === centerY ? 0 : Infinity) : (y - centerY) / sigmaY; + return Math.exp(-0.5 * (zx * zx + zy * zy)); +} diff --git a/src/lib/ophyd-sim/generators/index.ts b/src/lib/ophyd-sim/generators/index.ts new file mode 100644 index 00000000..93b9a9b9 --- /dev/null +++ b/src/lib/ophyd-sim/generators/index.ts @@ -0,0 +1,4 @@ +export { gaussian, gaussian2d } from './gaussian'; +export type { GaussianOptions, Gaussian2dOptions } from './gaussian'; +export { randomNoise, randomWalk } from './noise'; +export type { RandomNoiseOptions, RandomWalkOptions } from './noise'; diff --git a/src/lib/ophyd-sim/generators/noise.ts b/src/lib/ophyd-sim/generators/noise.ts new file mode 100644 index 00000000..afb1033e --- /dev/null +++ b/src/lib/ophyd-sim/generators/noise.ts @@ -0,0 +1,44 @@ +export interface RandomNoiseOptions { + random: () => number; + sigma: number; + mean?: number; +} + +/** + * Sample a single value from N(mean, sigma) using the Box-Muller transform. + * `random` must return [0, 1). Pass a seeded PRNG for deterministic tests. + */ +export function randomNoise({ random, sigma, mean = 0 }: RandomNoiseOptions): number { + // Box-Muller: avoid u1 = 0 because log(0) = -Infinity. + const u1 = Math.max(random(), Number.EPSILON); + const u2 = random(); + const z = Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2); + return mean + sigma * z; +} + +export interface RandomWalkOptions { + initial: number; + sigma: number; + min?: number; + max?: number; +} + +/** + * Build a stateful random-walk step function. Each call advances by a + * gaussian step of stddev `sigma` and clips into `[min, max]` if set. + * + * Use as the `value` of a periodic signal: + * const walk = randomWalk({ initial: 400, sigma: 0.25, min: 390, max: 410 }); + * signal({ name: 'ring_current', periodMs: 500, value: ({random}) => walk(random) }) + */ +export function randomWalk(opts: RandomWalkOptions): (random: () => number) => number { + let current = opts.initial; + return (random) => { + const step = randomNoise({ random, sigma: opts.sigma }); + let next = current + step; + if (opts.min !== undefined) next = Math.max(opts.min, next); + if (opts.max !== undefined) next = Math.min(opts.max, next); + current = next; + return next; + }; +} diff --git a/src/lib/ophyd-sim/index.ts b/src/lib/ophyd-sim/index.ts new file mode 100644 index 00000000..f658e16b --- /dev/null +++ b/src/lib/ophyd-sim/index.ts @@ -0,0 +1,50 @@ +// Core +export { createOphydSim } from './core/createOphydSim'; +export type { + OphydSim, + CreateOphydSimOptions, + DeviceFactory, + SimRegistration, + SimValue, + SimValueContext, + SimValueFn, + SimEvent, + SimListener, + PVMetadata, + TickHandler, + Unsubscribe, +} from './core/types'; + +// Devices +export { signal } from './devices/signal'; +export type { SignalOptions } from './devices/signal'; +export { motor } from './devices/motor'; +export type { MotorOptions } from './devices/motor'; + +// Generators +export { gaussian, gaussian2d, randomNoise, randomWalk } from './generators'; +export type { + GaussianOptions, + Gaussian2dOptions, + RandomNoiseOptions, + RandomWalkOptions, +} from './generators'; + +// Transport +export { createOphydSimTransport } from './transport/createOphydSimTransport'; + +// React +export { + OphydSimProvider, + useOphydSim, + useOphydSimOptional, + useSimSignal, + useSimSet, +} from './react'; +export type { OphydSimProviderProps } from './react'; + +// Storybook +export { withOphydSim } from './storybook/decorator'; + +// Scenarios +export { defaultBeamline } from './scenarios/defaultBeamline'; diff --git a/src/lib/ophyd-sim/react/OphydSimProvider.tsx b/src/lib/ophyd-sim/react/OphydSimProvider.tsx new file mode 100644 index 00000000..37c81e6a --- /dev/null +++ b/src/lib/ophyd-sim/react/OphydSimProvider.tsx @@ -0,0 +1,34 @@ +import { createContext, useContext, useEffect, type ReactNode } from 'react'; +import type { OphydSim } from '../core/types'; + +const OphydSimContext = createContext(null); + +export interface OphydSimProviderProps { + /** + * The simulator instance. Must be stable across renders — wrap creation + * in useMemo or define at module scope to avoid resetting on each render. + */ + sim: OphydSim; + children: ReactNode; +} + +export function OphydSimProvider({ sim, children }: OphydSimProviderProps) { + useEffect(() => { + sim.start(); + return () => sim.stop(); + }, [sim]); + + return {children}; +} + +export function useOphydSim(): OphydSim { + const sim = useContext(OphydSimContext); + if (!sim) { + throw new Error('useOphydSim called outside '); + } + return sim; +} + +export function useOphydSimOptional(): OphydSim | null { + return useContext(OphydSimContext); +} diff --git a/src/lib/ophyd-sim/react/hooks.ts b/src/lib/ophyd-sim/react/hooks.ts new file mode 100644 index 00000000..f2eec593 --- /dev/null +++ b/src/lib/ophyd-sim/react/hooks.ts @@ -0,0 +1,27 @@ +import { useEffect, useState, useCallback } from 'react'; +import type { SimValue } from '../core/types'; +import { useOphydSim } from './OphydSimProvider'; + +/** + * Subscribe to a single PV's value. Re-renders when it changes; returns the + * latest known value (or undefined if never set). + */ +export function useSimSignal(name: string): T | undefined { + const sim = useOphydSim(); + const [value, setValue] = useState(() => sim.get(name) as T | undefined); + + useEffect(() => { + const unsub = sim.subscribe(name, (event) => setValue(event.value as T)); + return unsub; + }, [sim, name]); + + return value; +} + +/** + * Return a stable `set(name, value)` writer bound to the current simulator. + */ +export function useSimSet(): (name: string, value: SimValue) => void { + const sim = useOphydSim(); + return useCallback((name: string, value: SimValue) => sim.set(name, value), [sim]); +} diff --git a/src/lib/ophyd-sim/react/index.ts b/src/lib/ophyd-sim/react/index.ts new file mode 100644 index 00000000..819af006 --- /dev/null +++ b/src/lib/ophyd-sim/react/index.ts @@ -0,0 +1,3 @@ +export { OphydSimProvider, useOphydSim, useOphydSimOptional } from './OphydSimProvider'; +export type { OphydSimProviderProps } from './OphydSimProvider'; +export { useSimSignal, useSimSet } from './hooks'; diff --git a/src/lib/ophyd-sim/scenarios/defaultBeamline.ts b/src/lib/ophyd-sim/scenarios/defaultBeamline.ts new file mode 100644 index 00000000..66a0d4e9 --- /dev/null +++ b/src/lib/ophyd-sim/scenarios/defaultBeamline.ts @@ -0,0 +1,43 @@ +import { createOphydSim } from '../core/createOphydSim'; +import { motor } from '../devices/motor'; +import { signal } from '../devices/signal'; +import { gaussian } from '../generators/gaussian'; +import { randomNoise } from '../generators/noise'; + +/** + * A default beamline scenario used by Storybook and TestPage when no + * specific scenario is provided. Mirrors the PV names finch components + * already reference (IOC:m1 / IOC:m1.RBV) so existing stories work without + * code changes. + * + * Devices: + * - IOC:m1 — motor setpoint (limits -10..10, velocity 1) + * - IOC:m1.RBV — readback, animates toward setpoint + * - IOC:m1.MOVN — moving flag + * - I0 — derived scalar peaked near readback=2 with noise + */ +export const defaultBeamline = createOphydSim({ + devices: [ + motor({ + name: 'IOC:m1', + initialPosition: 0, + velocity: 1, + limits: [-10, 10], + units: 'mm', + }), + signal({ + name: 'I0', + units: 'arb.', + periodMs: 100, + dependsOn: ['IOC:m1.RBV'], + value: ({ get, random }) => + 1000 * + gaussian({ + x: get.number('IOC:m1.RBV'), + center: 2, + sigma: 0.5, + }) + + randomNoise({ random, sigma: 5 }), + }), + ], +}); diff --git a/src/lib/ophyd-sim/storybook/decorator.tsx b/src/lib/ophyd-sim/storybook/decorator.tsx new file mode 100644 index 00000000..fa402028 --- /dev/null +++ b/src/lib/ophyd-sim/storybook/decorator.tsx @@ -0,0 +1,26 @@ +import type { ReactNode } from 'react'; +import type { OphydSim } from '../core/types'; +import { OphydSimProvider } from '../react/OphydSimProvider'; +import { OphydTransportProvider } from '@/api/ophyd/OphydTransportProvider'; +import { createOphydSimTransport } from '../transport/createOphydSimTransport'; + +/** + * Build a Storybook decorator that wraps stories in a shared simulator + * provider + a transport provider. Apply globally in .storybook/preview.ts + * or per-story for scenario-specific simulators. + * + * Usage: + * export const decorators = [withOphydSim(defaultBeamline)]; + */ +export function withOphydSim(sim: OphydSim) { + const transport = createOphydSimTransport(sim); + return function OphydSimDecorator(Story: () => ReactNode): ReactNode { + return ( + + + + + + ); + }; +} diff --git a/src/lib/ophyd-sim/transport/createOphydSimTransport.ts b/src/lib/ophyd-sim/transport/createOphydSimTransport.ts new file mode 100644 index 00000000..764fcfa4 --- /dev/null +++ b/src/lib/ophyd-sim/transport/createOphydSimTransport.ts @@ -0,0 +1,175 @@ +import type { + OphydPVIncomingMessage, + OphydPVMessageListener, + OphydPVOutgoingMessage, + OphydPVTransport, + OphydTransportStatusListener, + Unsubscribe, +} from '@/api/ophyd/transport/types'; +import type { MetaUpdateResponse } from '@/api/ophyd/ophydPVSocketTypes'; +import type { OphydSim, SimValue, PVMetadata } from '../core/types'; + +/** + * Adapt an OphydSim instance to the OphydPVTransport interface, speaking the + * existing PV-socket wire protocol. + * + * On `subscribe`, immediately emits a synthesized `meta` message so finch + * shows the device as connected, then forwards every value change as a + * value-update message. `set` writes to the sim. `unsubscribe` drops the + * subscription. The transport reports `'open'` synchronously on first status + * listener attach — there's no real handshake to wait for. + * + * Multiple subscribe messages for the same PV install independent listeners + * (each gets its own value stream); unsubscribe drops the most recent + * listener for that PV, matching how the existing hook expects to operate. + */ +export function createOphydSimTransport(sim: OphydSim): OphydPVTransport { + const messageListeners = new Set(); + const statusListeners = new Set(); + const pvSubscriptions = new Map(); + let closed = false; + + const emit = (message: OphydPVIncomingMessage): void => { + for (const listener of messageListeners) { + try { + listener(message); + } catch (err) { + console.error('[ophyd-sim] transport message listener threw:', err); + } + } + }; + + const send = (message: OphydPVOutgoingMessage): void => { + if (closed) return; + switch (message.action) { + case 'subscribe': + case 'subscribeSafely': + case 'subscribeReadOnly': { + const pv = message.pv; + emit(buildMetaMessage(pv, sim)); + const unsub = sim.subscribe(pv, (event) => { + emit(buildValueMessage(pv, event.value, event.timestamp, sim)); + }); + const list = pvSubscriptions.get(pv) ?? []; + list.push(unsub); + pvSubscriptions.set(pv, list); + break; + } + case 'unsubscribe': { + const pv = message.pv; + const list = pvSubscriptions.get(pv); + const popped = list?.pop(); + if (popped) popped(); + if (list && list.length === 0) pvSubscriptions.delete(pv); + break; + } + case 'set': { + sim.set(message.pv, message.value); + break; + } + case 'refresh': { + // Replay every active subscription's latest value. + for (const pv of pvSubscriptions.keys()) { + const v = sim.get(pv); + if (v !== undefined) { + emit(buildValueMessage(pv, v, Date.now(), sim)); + } + } + break; + } + } + }; + + return { + send, + onMessage(listener) { + messageListeners.add(listener); + return () => messageListeners.delete(listener); + }, + onStatus(listener) { + statusListeners.add(listener); + // Sim transport is always open from the consumer's perspective — + // emit synchronously so hook subscribers see the connection. + listener(closed ? 'closed' : 'open'); + return () => statusListeners.delete(listener); + }, + close() { + if (closed) return; + closed = true; + for (const list of pvSubscriptions.values()) { + for (const u of list) u(); + } + pvSubscriptions.clear(); + for (const l of statusListeners) { + try { + l('closed'); + } catch (err) { + console.error('[ophyd-sim] status listener threw on close:', err); + } + } + }, + }; +} + +function metadataToFields(metadata: PVMetadata | undefined): { + units: string; + lower_ctrl_limit: number | null; + upper_ctrl_limit: number | null; + precision: number; + enum_strs: null | string[]; + read_access: boolean; + write_access: boolean; +} { + return { + units: metadata?.units ?? '', + lower_ctrl_limit: metadata?.lower_ctrl_limit ?? null, + upper_ctrl_limit: metadata?.upper_ctrl_limit ?? null, + precision: metadata?.precision ?? 0, + enum_strs: metadata?.enum_strs ?? null, + read_access: metadata?.read_access ?? true, + write_access: metadata?.write_access ?? false, + }; +} + +function buildMetaMessage(pv: string, sim: OphydSim): MetaUpdateResponse { + const value = sim.get(pv); + const meta = metadataToFields(sim.metadata(pv)); + return { + sub_type: 'meta', + pv, + value: (value ?? 0) as SimValue, + timestamp: Date.now(), + connected: value !== undefined, + status: 0, + severity: 0, + setpoint_timestamp: null, + setpoint_status: null, + setpoint_severity: null, + setpoint_precision: null, + ...meta, + }; +} + +function buildValueMessage( + pv: string, + value: SimValue, + timestamp: number, + sim: OphydSim, +): { + pv: string; + value: SimValue; + timestamp: number; + connected: boolean; + read_access: boolean; + write_access: boolean; +} { + const meta = sim.metadata(pv); + return { + pv, + value, + timestamp, + connected: true, + read_access: meta?.read_access ?? true, + write_access: meta?.write_access ?? false, + }; +} diff --git a/src/stories/DeviceControllerBox.stories.tsx b/src/stories/DeviceControllerBox.stories.tsx new file mode 100644 index 00000000..344d1de3 --- /dev/null +++ b/src/stories/DeviceControllerBox.stories.tsx @@ -0,0 +1,53 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import DeviceControllerBox from '../components/DeviceControllerBox'; +import useOphydPVSocket from '../api/ophyd/useOphydPVSocket'; + +/** + * Story that proves shared-state behavior of the ophyd-sim transport. + * + * The Storybook global decorator (configured in .storybook/preview.ts) wraps + * every story in an OphydSimProvider + OphydTransportProvider bound to a + * single simulator instance. Two DeviceControllerBox instances below each + * call useOphydPVSocket independently for IOC:m1; moving via one updates + * the readback on both because they share the same simulator. + */ +const meta = { + title: 'Bluesky Components/DeviceControllerBox', + component: DeviceControllerBox, + tags: ['autodocs'], + parameters: { + layout: 'centered', + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +function ConnectedBox() { + const { devices, handleSetValueRequest, toggleDeviceLock } = useOphydPVSocket([ + 'IOC:m1', + 'IOC:m1.RBV', + ]); + return ( + + ); +} + +export const Default: Story = { + render: () => , +}; + +export const SharedStateWithTwoConsumers: Story = { + name: 'Shared state across two consumers', + render: () => ( +
+ + +
+ ), +}; diff --git a/src/testing/tests/ophyd-sim/dependencyGraph.test.ts b/src/testing/tests/ophyd-sim/dependencyGraph.test.ts new file mode 100644 index 00000000..f529eebc --- /dev/null +++ b/src/testing/tests/ophyd-sim/dependencyGraph.test.ts @@ -0,0 +1,39 @@ +import { describe, it, expect } from 'vitest'; +import { DependencyGraph } from '../../../lib/ophyd-sim/core/dependencyGraph'; + +describe('DependencyGraph', () => { + it('returns direct dependents in topological order', () => { + const g = new DependencyGraph(); + g.register('I0', ['x']); + g.register('I1', ['x']); + // Both I0 and I1 should appear (no order constraint between them). + const order = g.dependentsOf('x'); + expect(order.sort()).toEqual(['I0', 'I1']); + }); + + it('returns transitive dependents with dependencies before dependents', () => { + const g = new DependencyGraph(); + g.register('mid', ['x']); + g.register('leaf', ['mid']); + const order = g.dependentsOf('x'); + expect(order).toEqual(['mid', 'leaf']); + }); + + it('throws on direct cycle', () => { + const g = new DependencyGraph(); + g.register('a', ['b']); + expect(() => g.register('b', ['a'])).toThrow(/cycle/); + }); + + it('throws on indirect cycle', () => { + const g = new DependencyGraph(); + g.register('a', ['b']); + g.register('b', ['c']); + expect(() => g.register('c', ['a'])).toThrow(/cycle/); + }); + + it('returns empty list for a source with no dependents', () => { + const g = new DependencyGraph(); + expect(g.dependentsOf('orphan')).toEqual([]); + }); +}); diff --git a/src/testing/tests/ophyd-sim/motor.test.ts b/src/testing/tests/ophyd-sim/motor.test.ts new file mode 100644 index 00000000..ba63e9e8 --- /dev/null +++ b/src/testing/tests/ophyd-sim/motor.test.ts @@ -0,0 +1,69 @@ +import { describe, it, expect } from 'vitest'; +import { createOphydSim } from '../../../lib/ophyd-sim/core/createOphydSim'; +import { motor } from '../../../lib/ophyd-sim/devices/motor'; + +describe('motor', () => { + it('clamps setpoint writes into the configured limits', () => { + const sim = createOphydSim({ + devices: [motor({ name: 'IOC:m1', limits: [-1, 1], velocity: 10 })], + }); + + sim.set('IOC:m1', 100); + expect(sim.get('IOC:m1')).toBe(1); + + sim.set('IOC:m1', -100); + expect(sim.get('IOC:m1')).toBe(-1); + }); + + it('seeds readback and moving flag from initialPosition', () => { + const sim = createOphydSim({ + devices: [motor({ name: 'IOC:m1', initialPosition: 3 })], + }); + + expect(sim.get('IOC:m1')).toBe(3); + expect(sim.get('IOC:m1.RBV')).toBe(3); + expect(sim.get('IOC:m1.MOVN')).toBe(0); + }); + + it('advances readback toward setpoint and clears the moving flag at target', () => { + const sim = createOphydSim({ + devices: [ + motor({ + name: 'IOC:m1', + initialPosition: 0, + velocity: 1, // 1 unit / second + limits: [-10, 10], + }), + ], + }); + + sim.set('IOC:m1', 5); + + // 1s @ 1 unit/s → readback should reach 1, moving flag set. + sim.advance(1000); + expect(sim.get('IOC:m1.RBV')).toBeCloseTo(1, 4); + expect(sim.get('IOC:m1.MOVN')).toBe(1); + + // 4 more seconds → readback should land at the setpoint. + sim.advance(4000); + expect(sim.get('IOC:m1.RBV')).toBeCloseTo(5, 4); + + // One more tick to settle: readback equals setpoint, MOVN clears. + sim.advance(16); + expect(sim.get('IOC:m1.RBV')).toBe(5); + expect(sim.get('IOC:m1.MOVN')).toBe(0); + }); + + it('reverses direction when setpoint moves past current readback', () => { + const sim = createOphydSim({ + devices: [motor({ name: 'IOC:m1', initialPosition: 0, velocity: 1 })], + }); + + sim.set('IOC:m1', 5); + sim.advance(2000); // readback ≈ 2 + sim.set('IOC:m1', -3); + sim.advance(1000); + // Was around 2, now moving toward -3 at 1 unit/s → ~ 1 after 1s + expect(sim.get('IOC:m1.RBV')).toBeLessThan(2); + }); +}); diff --git a/src/testing/tests/ophyd-sim/signal.test.ts b/src/testing/tests/ophyd-sim/signal.test.ts new file mode 100644 index 00000000..fa728b39 --- /dev/null +++ b/src/testing/tests/ophyd-sim/signal.test.ts @@ -0,0 +1,55 @@ +import { describe, it, expect, vi } from 'vitest'; +import { createOphydSim } from '../../../lib/ophyd-sim/core/createOphydSim'; +import { signal } from '../../../lib/ophyd-sim/devices/signal'; + +describe('signal', () => { + it('seeds a static initial value', () => { + const sim = createOphydSim({ + devices: [signal({ name: 'ring_current', initialValue: 400, units: 'mA' })], + }); + + expect(sim.get('ring_current')).toBe(400); + expect(sim.metadata('ring_current')?.units).toBe('mA'); + }); + + it('recomputes a derived signal when a dependency changes', () => { + const sim = createOphydSim({ + devices: [ + signal({ name: 'x', initialValue: 0, writeAccess: true }), + signal({ + name: 'I0', + dependsOn: ['x'], + value: ({ get }) => get.number('x') * 2, + }), + ], + }); + + expect(sim.get('I0')).toBe(0); + + sim.set('x', 5); + expect(sim.get('I0')).toBe(10); + + sim.set('x', -3); + expect(sim.get('I0')).toBe(-6); + }); + + it('notifies subscribers of a derived signal when its dependency changes', () => { + const sim = createOphydSim({ + devices: [ + signal({ name: 'x', initialValue: 0, writeAccess: true }), + signal({ + name: 'y', + dependsOn: ['x'], + value: ({ get }) => get.number('x') + 1, + }), + ], + }); + + const listener = vi.fn(); + sim.subscribe('y', listener); + listener.mockClear(); + + sim.set('x', 10); + expect(listener).toHaveBeenCalledWith(expect.objectContaining({ name: 'y', value: 11 })); + }); +}); diff --git a/src/testing/tests/ophyd-sim/state.test.ts b/src/testing/tests/ophyd-sim/state.test.ts new file mode 100644 index 00000000..f3db3192 --- /dev/null +++ b/src/testing/tests/ophyd-sim/state.test.ts @@ -0,0 +1,69 @@ +import { describe, it, expect, vi } from 'vitest'; +import { SimState } from '../../../lib/ophyd-sim/core/state'; + +describe('SimState', () => { + it('subscribe-then-set delivers the new value', () => { + const state = new SimState(() => 1000); + const listener = vi.fn(); + state.subscribe('IOC:m1', listener); + listener.mockClear(); + + state.set('IOC:m1', 5); + expect(listener).toHaveBeenCalledWith({ + name: 'IOC:m1', + value: 5, + timestamp: 1000, + }); + }); + + it('subscribing after seed replays the latest value synchronously', () => { + const state = new SimState(() => 1000); + state.seed('IOC:m1', 42); + + const listener = vi.fn(); + state.subscribe('IOC:m1', listener); + + expect(listener).toHaveBeenCalledWith({ + name: 'IOC:m1', + value: 42, + timestamp: 1000, + }); + }); + + it('set returns false and does not notify when value is unchanged', () => { + const state = new SimState(() => 0); + state.seed('IOC:m1', 5); + const listener = vi.fn(); + state.subscribe('IOC:m1', listener); + listener.mockClear(); + + const changed = state.set('IOC:m1', 5); + expect(changed).toBe(false); + expect(listener).not.toHaveBeenCalled(); + }); + + it('unsubscribe stops further notifications', () => { + const state = new SimState(() => 0); + const listener = vi.fn(); + const unsub = state.subscribe('IOC:m1', listener); + unsub(); + listener.mockClear(); + + state.set('IOC:m1', 5); + expect(listener).not.toHaveBeenCalled(); + }); + + it('one subscriber throwing does not stop others', () => { + const state = new SimState(() => 0); + const errSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); + const ok = vi.fn(); + state.subscribe('IOC:m1', () => { + throw new Error('boom'); + }); + state.subscribe('IOC:m1', ok); + + state.set('IOC:m1', 5); + expect(ok).toHaveBeenCalled(); + errSpy.mockRestore(); + }); +}); diff --git a/src/testing/tests/ophyd-sim/transport.test.ts b/src/testing/tests/ophyd-sim/transport.test.ts new file mode 100644 index 00000000..19f0aeb6 --- /dev/null +++ b/src/testing/tests/ophyd-sim/transport.test.ts @@ -0,0 +1,93 @@ +import { describe, it, expect, vi } from 'vitest'; +import { createOphydSim } from '../../../lib/ophyd-sim/core/createOphydSim'; +import { signal } from '../../../lib/ophyd-sim/devices/signal'; +import { motor } from '../../../lib/ophyd-sim/devices/motor'; +import { createOphydSimTransport } from '../../../lib/ophyd-sim/transport/createOphydSimTransport'; +import type { OphydPVIncomingMessage } from '../../../api/ophyd/transport/types'; + +describe('createOphydSimTransport', () => { + it('emits a meta message immediately on subscribe', () => { + const sim = createOphydSim({ + devices: [signal({ name: 'I0', initialValue: 42, units: 'arb.' })], + }); + const transport = createOphydSimTransport(sim); + + const received: OphydPVIncomingMessage[] = []; + transport.onMessage((m) => received.push(m)); + + transport.send({ action: 'subscribe', pv: 'I0' }); + + // First message must be the meta + initial value (subscribe replays the + // latest known value synchronously). + expect(received.length).toBeGreaterThanOrEqual(2); + expect(received[0]).toMatchObject({ + sub_type: 'meta', + pv: 'I0', + value: 42, + units: 'arb.', + connected: true, + }); + expect(received[1]).toMatchObject({ pv: 'I0', value: 42 }); + }); + + it('forwards value updates after subscribe', () => { + const sim = createOphydSim({ + devices: [signal({ name: 'x', initialValue: 0, writeAccess: true })], + }); + const transport = createOphydSimTransport(sim); + + const received: OphydPVIncomingMessage[] = []; + transport.onMessage((m) => received.push(m)); + transport.send({ action: 'subscribe', pv: 'x' }); + received.length = 0; + + sim.set('x', 7); + expect(received[0]).toMatchObject({ pv: 'x', value: 7 }); + }); + + it('routes set messages to the simulator', () => { + const sim = createOphydSim({ + devices: [motor({ name: 'IOC:m1', limits: [-10, 10], velocity: 5 })], + }); + const transport = createOphydSimTransport(sim); + + transport.send({ action: 'set', pv: 'IOC:m1', value: 3 }); + expect(sim.get('IOC:m1')).toBe(3); + }); + + it('reports open status synchronously when a status listener attaches', () => { + const sim = createOphydSim({ devices: [] }); + const transport = createOphydSimTransport(sim); + + const listener = vi.fn(); + transport.onStatus(listener); + expect(listener).toHaveBeenCalledWith('open'); + }); + + it('reports closed after close()', () => { + const sim = createOphydSim({ devices: [] }); + const transport = createOphydSimTransport(sim); + const listener = vi.fn(); + transport.onStatus(listener); + listener.mockClear(); + + transport.close(); + expect(listener).toHaveBeenCalledWith('closed'); + }); + + it('unsubscribe stops further value messages for that PV', () => { + const sim = createOphydSim({ + devices: [signal({ name: 'x', initialValue: 0, writeAccess: true })], + }); + const transport = createOphydSimTransport(sim); + + const received: OphydPVIncomingMessage[] = []; + transport.onMessage((m) => received.push(m)); + transport.send({ action: 'subscribe', pv: 'x' }); + transport.send({ action: 'unsubscribe', pv: 'x' }); + received.length = 0; + + sim.set('x', 1); + expect(received).toHaveLength(0); + }); +}); diff --git a/src/testing/tests/ophyd-sim/useOphydPVSocket.integration.test.tsx b/src/testing/tests/ophyd-sim/useOphydPVSocket.integration.test.tsx new file mode 100644 index 00000000..fce68f64 --- /dev/null +++ b/src/testing/tests/ophyd-sim/useOphydPVSocket.integration.test.tsx @@ -0,0 +1,61 @@ +import { describe, it, expect } from 'vitest'; +import { render, act, screen } from '@testing-library/react'; +import { createOphydSim } from '../../../lib/ophyd-sim/core/createOphydSim'; +import { motor } from '../../../lib/ophyd-sim/devices/motor'; +import { createOphydSimTransport } from '../../../lib/ophyd-sim/transport/createOphydSimTransport'; +import { OphydTransportProvider } from '../../../api/ophyd/OphydTransportProvider'; +import useOphydPVSocket from '../../../api/ophyd/useOphydPVSocket'; + +function MotorReadout({ label }: { label: string }) { + const { devices } = useOphydPVSocket(['IOC:m1.RBV']); + const value = devices['IOC:m1.RBV']?.value; + return ( +
+ {String(value)} +
+ ); +} + +function MotorControl({ initialTarget }: { initialTarget: number }) { + const { devices, handleSetValueRequest } = useOphydPVSocket(['IOC:m1', 'IOC:m1.RBV']); + return ( +
+ {String(devices['IOC:m1.RBV']?.value)} + +
+ ); +} + +describe('useOphydPVSocket + ophyd-sim integration', () => { + it('two hooks subscribed to the same PV observe the same motion', async () => { + const sim = createOphydSim({ + devices: [motor({ name: 'IOC:m1', velocity: 1, limits: [-10, 10] })], + }); + const transport = createOphydSimTransport(sim); + + render( + + + + , + ); + + // Both consumers start at 0. + expect(screen.getByTestId('control-rbv').textContent).toBe('0'); + expect(screen.getByTestId('readout-rbv').textContent).toBe('0'); + + // Trigger a move via one hook. + act(() => { + screen.getByText('move').click(); + }); + + // Advance the simulator past the time it needs to reach the target. + act(() => { + sim.advance(5000); + sim.advance(16); + }); + + expect(Number(screen.getByTestId('control-rbv').textContent)).toBeCloseTo(3, 4); + expect(Number(screen.getByTestId('readout-rbv').textContent)).toBeCloseTo(3, 4); + }); +}); From e75e6ee1f998c5a54be64cbc9ec5b9e8c0a2515f Mon Sep 17 00:00:00 2001 From: Prinstar Date: Mon, 29 Jun 2026 11:08:06 -0700 Subject: [PATCH 03/12] Add ophyd-sim with sim motors, signals and detectors --- src/api/ophyd/OphydTransportProvider.tsx | 70 +++++++- .../transport/createFallbackTransport.ts | 164 ++++++++++++++++++ src/app/pages/TestPage.tsx | 57 +++--- src/components/Camera/CameraCanvas.tsx | 55 ++++-- .../Camera/hooks/useCameraCanvas.ts | 20 +-- src/components/EnergyVsCurrentPlotPV.tsx | 135 ++++++++++++++ src/features/Beamstop.tsx | 63 ++++++- src/lib/ophyd-sim/camera/SimCameraSocket.ts | 161 +++++++++++++++++ .../createSimDetectorCameraSocketFactory.ts | 110 ++++++++++++ src/lib/ophyd-sim/camera/types.ts | 31 ++++ src/lib/ophyd-sim/devices/detector.ts | 118 +++++++++++++ src/lib/ophyd-sim/generators/bragg.ts | 29 ++++ src/lib/ophyd-sim/generators/gaussian.ts | 19 +- src/lib/ophyd-sim/generators/index.ts | 2 + src/lib/ophyd-sim/index.ts | 40 ++++- .../ophyd-sim/scenarios/beamstopBeamline.ts | 80 +++++++++ src/lib/ophyd-sim/scenarios/beamstopModel.ts | 77 ++++++++ .../ophyd-sim/scenarios/defaultBeamline.ts | 26 ++- src/lib/ophyd-sim/scenarios/simDetector.json | 17 ++ src/testing/tests/beamstopModel.test.ts | 83 +++++++++ .../tests/createFallbackTransport.test.ts | 119 +++++++++++++ src/testing/tests/ophyd-sim/detector.test.ts | 101 +++++++++++ src/testing/tests/simCameraSocket.test.ts | 102 +++++++++++ src/utils/plotGenerators.ts | 16 ++ tsconfig.app.json | 1 + 25 files changed, 1626 insertions(+), 70 deletions(-) create mode 100644 src/api/ophyd/transport/createFallbackTransport.ts create mode 100644 src/components/EnergyVsCurrentPlotPV.tsx create mode 100644 src/lib/ophyd-sim/camera/SimCameraSocket.ts create mode 100644 src/lib/ophyd-sim/camera/createSimDetectorCameraSocketFactory.ts create mode 100644 src/lib/ophyd-sim/camera/types.ts create mode 100644 src/lib/ophyd-sim/devices/detector.ts create mode 100644 src/lib/ophyd-sim/generators/bragg.ts create mode 100644 src/lib/ophyd-sim/scenarios/beamstopBeamline.ts create mode 100644 src/lib/ophyd-sim/scenarios/beamstopModel.ts create mode 100644 src/lib/ophyd-sim/scenarios/simDetector.json create mode 100644 src/testing/tests/beamstopModel.test.ts create mode 100644 src/testing/tests/createFallbackTransport.test.ts create mode 100644 src/testing/tests/ophyd-sim/detector.test.ts create mode 100644 src/testing/tests/simCameraSocket.test.ts diff --git a/src/api/ophyd/OphydTransportProvider.tsx b/src/api/ophyd/OphydTransportProvider.tsx index 472e65be..e15f7d9d 100644 --- a/src/api/ophyd/OphydTransportProvider.tsx +++ b/src/api/ophyd/OphydTransportProvider.tsx @@ -2,17 +2,44 @@ import { createContext, useContext, useMemo, type ReactNode } from 'react'; import { useOphydApiUrls } from '@/utils/apiUtils'; import { createWebSocketTransport } from './transport/createWebSocketTransport'; import { createWebSocketDeviceTransport } from './transport/createWebSocketDeviceTransport'; +import { createFallbackTransport } from './transport/createFallbackTransport'; import type { OphydPVTransport } from './transport/types'; import type { OphydDeviceTransport } from './transport/deviceTypes'; +import type { CameraSocketFactory, CameraSocketLike } from '@/lib/ophyd-sim'; const PVTransportContext = createContext(null); const DeviceTransportContext = createContext(null); +const CameraSocketFactoryContext = createContext(null); + +/** + * Default camera socket: a thin wrapper over the real browser `WebSocket`. The + * real socket's surface is wider than {@link CameraSocketLike} (its `onmessage` + * carries a full `MessageEvent`), so we cast — consumers only touch the subset + * the interface declares. + */ +const defaultCameraSocketFactory: CameraSocketFactory = (url) => + new WebSocket(url) as unknown as CameraSocketLike; export interface OphydTransportProviderProps { /** Override the PV-socket transport (e.g. a simulator). */ transport?: OphydPVTransport; /** Override the device-socket transport. */ deviceTransport?: OphydDeviceTransport; + /** + * When true, the provided override transports are wrapped so that, if they + * report `'error'` or `'closed'`, descendants seamlessly switch to the real + * WebSocket backend (URLs from config). No-op when no override is supplied. + * Defaults to false, preserving the prior pass-through behavior. + */ + fallbackToReal?: boolean; + /** + * Override how the camera image socket is created (e.g. a simulator from + * `createSimCameraSocketFactory()`). Descendant `CameraCanvas`es read this + * via {@link useCameraSocketFactory}; when omitted they default to the real + * `WebSocket`. This is the seam that lets a subtree run a mock camera + * without prop-drilling a factory through every intermediate component. + */ + cameraSocketFactory?: CameraSocketFactory; children: ReactNode; } @@ -22,16 +49,44 @@ export interface OphydTransportProviderProps { * WebSocket transports via `useOphydPVTransport` / `useOphydDeviceTransport`, * preserving the pre-refactor behavior for callers that never wrap in a * provider. + * + * With `fallbackToReal`, an override transport (e.g. a simulator) becomes the + * primary and the real WebSocket backend becomes a live fallback — see + * {@link createFallbackTransport}. */ export function OphydTransportProvider({ transport, deviceTransport, + fallbackToReal = false, + cameraSocketFactory, children, }: OphydTransportProviderProps) { + const apiUrls = useOphydApiUrls(); + const pvUrl = apiUrls.getWsUrl('pv-socket'); + const deviceUrl = apiUrls.getWsUrl('device-socket'); + + const pvValue = useMemo(() => { + if (!transport) return null; + if (!fallbackToReal) return transport; + return createFallbackTransport(transport, () => + createWebSocketTransport({ url: pvUrl }), + ); + }, [transport, fallbackToReal, pvUrl]); + + const deviceValue = useMemo(() => { + if (!deviceTransport) return null; + if (!fallbackToReal) return deviceTransport; + return createFallbackTransport(deviceTransport, () => + createWebSocketDeviceTransport({ url: deviceUrl }), + ); + }, [deviceTransport, fallbackToReal, deviceUrl]); + return ( - - - {children} + + + + {children} + ); @@ -81,3 +136,12 @@ export function useOphydDeviceTransport(overrideUrl?: string): OphydDeviceTransp } return fallback; } + +/** + * Read the camera socket factory from context, or fall back to one that wraps + * the real browser `WebSocket`. Unlike the transport hooks this never throws — + * a default always exists, so cameras work with no provider present. + */ +export function useCameraSocketFactory(): CameraSocketFactory { + return useContext(CameraSocketFactoryContext) ?? defaultCameraSocketFactory; +} diff --git a/src/api/ophyd/transport/createFallbackTransport.ts b/src/api/ophyd/transport/createFallbackTransport.ts new file mode 100644 index 00000000..43419534 --- /dev/null +++ b/src/api/ophyd/transport/createFallbackTransport.ts @@ -0,0 +1,164 @@ +import type { OphydTransportStatus, Unsubscribe } from './types'; + +/** + * Structural shape shared by {@link OphydPVTransport} and + * {@link OphydDeviceTransport}. Both differ only in their message types, so the + * fallback wrapper is written once against this generic interface. + */ +interface GenericTransport { + send(message: TOut): void; + onMessage(listener: (message: TIn) => void): Unsubscribe; + onStatus(listener: (status: OphydTransportStatus) => void): Unsubscribe; + close(): void; +} + +/** Outgoing messages carry an `action`; subscriptions also carry a key field. */ +type SubscribeAction = 'subscribe' | 'subscribeSafely' | 'subscribeReadOnly'; +interface ActionMessage { + action: string; + pv?: string; + device?: string; +} + +const SUBSCRIBE_ACTIONS: ReadonlySet = new Set([ + 'subscribe', + 'subscribeSafely', + 'subscribeReadOnly', +]); + +/** Default key extraction for the PV/device protocols: prefer `pv`, then `device`. */ +function defaultSubKey(message: ActionMessage): string { + return message.pv ?? message.device ?? ''; +} + +export interface CreateFallbackTransportOptions { + /** + * Extract the subscription key from an outgoing message so it can be + * replayed onto the fallback after a switch. Defaults to `pv ?? device`. + */ + getSubKey?: (message: TOut) => string; +} + +/** + * Wrap a `primary` transport so that, if it reports `'error'` or `'closed'`, + * the wrapper seamlessly switches to a freshly-constructed fallback transport + * (typically the real WebSocket backend) without changing its own object + * identity. + * + * Identity stability is the whole point: hooks key their subscribe effect on + * the transport object, so swapping the underlying transport here — rather than + * swapping the context value — means consumers never tear down and re-subscribe. + * The wrapper replays active subscriptions onto the fallback and forwards its + * messages to the listeners the hooks already registered. + * + * Trigger is status-only: a `'connecting'` -> `'open'` primary stays primary. + * The primary's terminal `'error'`/`'closed'` is suppressed from consumers; the + * fallback's status supersedes it from the switch onward. + */ +export function createFallbackTransport( + primary: GenericTransport, + makeFallback: () => GenericTransport, + options: CreateFallbackTransportOptions = {}, +): GenericTransport { + const getSubKey = + options.getSubKey ?? ((m: TOut) => defaultSubKey(m as unknown as ActionMessage)); + + const messageListeners = new Set<(message: TIn) => void>(); + const statusListeners = new Set<(status: OphydTransportStatus) => void>(); + // Last subscribe message per key, so we can replay them onto the fallback. + const activeSubs = new Map(); + + let active: GenericTransport = primary; + let status: OphydTransportStatus = 'connecting'; + let switched = false; + let closedByUser = false; + + let detachPrimaryMessage: Unsubscribe | undefined; + let detachPrimaryStatus: Unsubscribe | undefined; + + const forwardMessage = (message: TIn): void => { + for (const listener of messageListeners) { + try { + listener(message); + } catch (err) { + console.error('[ophyd-fallback-transport] message listener threw:', err); + } + } + }; + + const setStatus = (next: OphydTransportStatus): void => { + status = next; + for (const listener of statusListeners) { + try { + listener(next); + } catch (err) { + console.error('[ophyd-fallback-transport] status listener threw:', err); + } + } + }; + + const switchToFallback = (): void => { + switched = true; + + // Detach from the primary and tear it down so it stops emitting. + detachPrimaryMessage?.(); + detachPrimaryStatus?.(); + try { + primary.close(); + } catch (err) { + console.error('[ophyd-fallback-transport] primary close threw:', err); + } + + active = makeFallback(); + active.onMessage(forwardMessage); + active.onStatus(setStatus); + + // Replay active subscriptions so the fallback backend re-emits meta/value + // to the listeners the hooks already registered. + for (const message of activeSubs.values()) { + active.send(message); + } + }; + + const onPrimaryStatus = (next: OphydTransportStatus): void => { + if (!switched && !closedByUser && (next === 'error' || next === 'closed')) { + switchToFallback(); + return; + } + // Pass through non-terminal primary status (e.g. connecting -> open). + if (!switched) setStatus(next); + }; + + detachPrimaryMessage = primary.onMessage(forwardMessage); + detachPrimaryStatus = primary.onStatus(onPrimaryStatus); + + return { + send(message) { + if (closedByUser) return; + const m = message as unknown as ActionMessage; + if (SUBSCRIBE_ACTIONS.has(m.action)) { + activeSubs.set(getSubKey(message), message); + } else if (m.action === 'unsubscribe') { + activeSubs.delete(getSubKey(message)); + } + active.send(message); + }, + onMessage(listener) { + messageListeners.add(listener); + return () => messageListeners.delete(listener); + }, + onStatus(listener) { + statusListeners.add(listener); + listener(status); + return () => statusListeners.delete(listener); + }, + close() { + closedByUser = true; + try { + active.close(); + } catch (err) { + console.error('[ophyd-fallback-transport] active close threw:', err); + } + }, + }; +} diff --git a/src/app/pages/TestPage.tsx b/src/app/pages/TestPage.tsx index 07357dfb..456ad9d0 100644 --- a/src/app/pages/TestPage.tsx +++ b/src/app/pages/TestPage.tsx @@ -1,41 +1,46 @@ -import DeviceControllerBox from '@/components/DeviceControllerBox'; -import SignalMonitorPlotDevice from '@/components/SignalMonitorPlotDevice'; -import useOphydPVSocket from '@/api/ophyd/useOphydPVSocket'; -import OphydSocketViewer from '@/components/OphydSocketViewer/OphydSocketViewer'; import { OphydTransportProvider } from '@/api/ophyd/OphydTransportProvider'; -import { OphydSimProvider, createOphydSimTransport, defaultBeamline } from '@/lib/ophyd-sim'; +import { + OphydSimProvider, + createOphydSimTransport, + beamstopBeamline, + simDetectorConfig, + createSimDetectorCameraSocketFactory, +} from '@/lib/ophyd-sim'; import { useMemo } from 'react'; +import Beamstop from '@/features/Beamstop'; +import CameraCanvas from '@/components/Camera/CameraCanvas'; function TestPageBody() { - const { devices, handleSetValueRequest, toggleDeviceLock } = useOphydPVSocket([ - 'IOC:m1', - 'IOC:m1.RBV', - ]); - - // A second hook call against the same provider — proves both consumers - // observe the same motion. - const { devices: devices2 } = useOphydPVSocket(['IOC:m1.RBV']); - return ( -
- - + - - + {/* No socketFactory prop — the sim factory is supplied via context below. */} +
); } export default function TestPage() { - const transport = useMemo(() => createOphydSimTransport(defaultBeamline), []); + const transport = useMemo(() => createOphydSimTransport(beamstopBeamline), []); + // Camera frames are driven by the '13SIM1' detector in the same sim, so the + // Beamstop energy control modulates the image opacity live. + const cameraSocketFactory = useMemo( + () => createSimDetectorCameraSocketFactory(beamstopBeamline, simDetectorConfig), + [], + ); return ( - - + + diff --git a/src/components/Camera/CameraCanvas.tsx b/src/components/Camera/CameraCanvas.tsx index 3f69b04e..d7a88736 100644 --- a/src/components/Camera/CameraCanvas.tsx +++ b/src/components/Camera/CameraCanvas.tsx @@ -31,21 +31,25 @@ export default function CameraCanvas(props: CameraCanvasProps) { const { canvasSize = 'medium' } = props; + // `socketStatus` is `'Open'` while streaming and `'closed'` otherwise. + const isAcquiring = socketStatus !== 'closed'; + return ( -
- {/* Canvas Element - background*/} - +
+
+ {/* Canvas Element - background*/} + - {/* FPS counter - top left */} -

{fps} fps

+ {/* FPS counter - top left */} +

{fps} fps

- - {/* Overlay when disconnected */} + {/* Overlay on connection error (clean paused/idle state uses the Acquire button instead) */}
@@ -88,6 +92,29 @@ export default function CameraCanvas(props: CameraCanvasProps) {
+
+
+ + {/* Acquire / Pause - start and stop the image stream, below the image */} +
+ +
); diff --git a/src/components/Camera/hooks/useCameraCanvas.ts b/src/components/Camera/hooks/useCameraCanvas.ts index 683b5a93..52b94848 100644 --- a/src/components/Camera/hooks/useCameraCanvas.ts +++ b/src/components/Camera/hooks/useCameraCanvas.ts @@ -1,8 +1,10 @@ import { useState, useRef, useEffect, useCallback, useMemo } from 'react'; import { useOphydApiUrls } from '@/utils/apiUtils'; import { ophydSocketCameraPath } from '@/api/ophyd/socketPaths'; +import { useCameraSocketFactory } from '@/api/ophyd/OphydTransportProvider'; import { CanvasSizes } from '../CameraCanvas'; import { getErrorMessage } from '@/utils/errorHandling'; +import type { CameraSocketLike } from '@/lib/ophyd-sim'; export type UseCameraCanvasProps = { imageArrayPV?: string; @@ -19,15 +21,15 @@ export function useCameraCanvas({ prefix = '', wsUrl, }: UseCameraCanvasProps) { + const socketFactory = useCameraSocketFactory(); const canvasRef = useRef(null); const [fps, setFps] = useState('0'); const [socketStatus, setSocketStatus] = useState('closed'); const [isImageLogScale, setIsImageLogScale] = useState(true); const [socketError, setSocketError] = useState(null); - const ws = useRef(null); + const ws = useRef(null); const frameCount = useRef(null); const startTime = useRef(null); - const isInitialized = useRef(false); const configWsUrl = useOphydApiUrls().getWsUrl(ophydSocketCameraPath); const resolvedWsUrl = wsUrl ?? configWsUrl; @@ -167,7 +169,7 @@ export function useCameraCanvas({ try { const url = resolvedWsUrl; - ws.current = new WebSocket(url); + ws.current = socketFactory(url); } catch (error) { //This catch block only handles synchronous errors thrown during the WebSocket constructor call (invalid url, protocol), most other errors will be in the ws.onerror callback console.log({ error }); @@ -258,20 +260,18 @@ export function useCameraCanvas({ setSocketStatus('closed'); frameCount.current = 0; }; - }, [resolvedWsUrl, getImageArrayPV, getSizePVs, canvasSize]); + }, [resolvedWsUrl, getImageArrayPV, getSizePVs, canvasSize, socketFactory]); useEffect(() => { - if (!isInitialized.current) { - isInitialized.current = true; - startWebSocket(); - } + // The stream starts paused — the user begins acquisition via the + // Acquire button (startWebSocket). We only register the unmount cleanup + // so a socket opened during this mount is torn down on unmount. return () => { if (ws.current) { ws.current.close(); } }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); // Empty dependency array for initialization only + }, []); // Empty dependency array — cleanup only; acquisition is user-driven return { canvasRef, diff --git a/src/components/EnergyVsCurrentPlotPV.tsx b/src/components/EnergyVsCurrentPlotPV.tsx new file mode 100644 index 00000000..2ecc7ef9 --- /dev/null +++ b/src/components/EnergyVsCurrentPlotPV.tsx @@ -0,0 +1,135 @@ +import { useEffect, useMemo, useRef, useState } from 'react'; +import PlotlyScatter from './PlotlyScatter'; +import useOphydPVSocket from '@/api/ophyd/useOphydPVSocket'; +import { + beamstopCurrentModel, + ENERGY_MIN_EV, + ENERGY_MAX_EV, +} from '@/lib/ophyd-sim'; +import { recencyOpacities } from '@/utils/plotGenerators'; +import { cn } from '@/lib/utils'; + +export type EnergyVsCurrentPlotPVProps = { + /** Writable beam-energy PV (x-axis of the plot). */ + energyPv: string; + /** Beamstop diode current PV (y-axis of the plot). */ + currentPv: string; + /** Beamstop X motor readback PV — positions the expected curve. */ + beamstopXRbvPv: string; + /** Beamstop Y motor readback PV — positions the expected curve. */ + beamstopYRbvPv: string; + /** Max measured points retained before the oldest is dropped. Defaults to 60. */ + numVisiblePoints?: number; + /** Interval in ms between measured samples. Defaults to 500. */ + pollingIntervalMs?: number; + /** Number of points in the theoretical expected curve. Defaults to 100. */ + expectedCurvePoints?: number; + className?: string; +}; + +type Pair = { energy: number; current: number }; + +/** + * Live "Beam Energy vs Beamstop Current" plot. + * + * Overlays two traces, mirroring the reference diagram: + * - Measured: live (energy, current) samples accumulating as the user sweeps + * energy, kept in a rolling window (markers). + * - Expected: the noise-free `beamstopCurrentModel` swept across the energy + * range at the *current* beamstop position (dashed line). It re-shapes when + * the beamstop moves. + */ +export default function EnergyVsCurrentPlotPV({ + energyPv, + currentPv, + beamstopXRbvPv, + beamstopYRbvPv, + numVisiblePoints = 60, + pollingIntervalMs = 500, + expectedCurvePoints = 100, + className, +}: EnergyVsCurrentPlotPVProps) { + const { devices } = useOphydPVSocket([ + energyPv, + currentPv, + beamstopXRbvPv, + beamstopYRbvPv, + ]); + + const [measured, setMeasured] = useState([]); + + // Refs so the sampling interval reads the latest values without resetting. + const energyRef = useRef(null); + const currentRef = useRef(null); + const energyValue = devices[energyPv]?.value; + const currentValue = devices[currentPv]?.value; + energyRef.current = typeof energyValue === 'number' ? energyValue : null; + currentRef.current = typeof currentValue === 'number' ? currentValue : null; + + useEffect(() => { + const interval = setInterval(() => { + const energy = energyRef.current; + const current = currentRef.current; + if (energy === null || current === null) return; + setMeasured((prev) => { + const next = [...prev, { energy, current }]; + if (next.length > numVisiblePoints) next.shift(); + return next; + }); + }, pollingIntervalMs); + return () => clearInterval(interval); + }, [numVisiblePoints, pollingIntervalMs]); + + const beamstopX = devices[beamstopXRbvPv]?.value; + const beamstopY = devices[beamstopYRbvPv]?.value; + + // Expected curve at the current beamstop position, swept across energy. + const expected = useMemo(() => { + const x = typeof beamstopX === 'number' ? beamstopX : 0; + const y = typeof beamstopY === 'number' ? beamstopY : 0; + const xs: number[] = []; + const ys: number[] = []; + const steps = Math.max(2, expectedCurvePoints); + for (let i = 0; i < steps; i++) { + const energyEV = + ENERGY_MIN_EV + ((ENERGY_MAX_EV - ENERGY_MIN_EV) * i) / (steps - 1); + xs.push(energyEV); + ys.push(beamstopCurrentModel({ x, y, energyEV })); + } + return { xs, ys }; + }, [beamstopX, beamstopY, expectedCurvePoints]); + + const data = useMemo( + () => [ + { + x: expected.xs, + y: expected.ys, + type: 'scatter' as const, + mode: 'lines' as const, + name: 'Expected', + line: { color: '#082f49', dash: 'dash' as const }, + }, + { + x: measured.map((p) => p.energy), + y: measured.map((p) => p.current), + type: 'scatter' as const, + mode: 'markers' as const, + name: 'Measured', + // Fade older samples so the newest reading stands out. + marker: { color: '#0e7490', size: 7, opacity: recencyOpacities(measured.length) }, + }, + ], + [expected, measured], + ); + + return ( + + ); +} diff --git a/src/features/Beamstop.tsx b/src/features/Beamstop.tsx index 4baa5927..95195854 100644 --- a/src/features/Beamstop.tsx +++ b/src/features/Beamstop.tsx @@ -2,6 +2,7 @@ import { useState, useMemo, useEffect } from 'react'; import SignalMonitorPlotPV from '@/components/SignalMonitorPlotPV'; import DeviceControllerBox from '@/components/DeviceControllerBox'; +import EnergyVsCurrentPlotPV from '@/components/EnergyVsCurrentPlotPV'; import useOphydPVSocket from '@/api/ophyd/useOphydPVSocket'; import Button from '@/components/Button'; @@ -11,10 +12,17 @@ export type BeamstopProps = { beamstopXName: string; beamstopYName: string; beamstopCurrentName: string; + /** + * Optional writable beam-energy PV. When provided, an energy control and a + * live Energy-vs-Current plot are rendered. Selecting an energy shifts the + * beam (via the DCM Bragg angle), changing the diode current. + */ + beamstopEnergyName?: string; beamstopXIcon?: JSX.Element; beamstopYIcon?: JSX.Element; beamstopXTitle?: string; beamstopYTitle?: string; + beamstopEnergyTitle?: string; enableBestOption?: boolean; stackVertical?: boolean; }; @@ -23,15 +31,18 @@ export default function Beamstop({ beamstopXName, beamstopYName, beamstopCurrentName, + beamstopEnergyName, beamstopXIcon = deviceIcons.beamstopX, beamstopYIcon = deviceIcons.beamstopY, beamstopXTitle, beamstopYTitle, + beamstopEnergyTitle = 'Beam Energy', enableBestOption, stackVertical = true, }: BeamstopProps) { const beamstopXNameRBV = useMemo(() => beamstopXName + '.RBV', [beamstopXName]); const beamstopYNameRBV = useMemo(() => beamstopYName + '.RBV', [beamstopYName]); + const beamstopEnergyRBV = useMemo(() => beamstopEnergyName ? beamstopEnergyName + '.RBV' : undefined, [beamstopEnergyName]); const deviceNameList = useMemo( () => [ beamstopXName, @@ -39,8 +50,16 @@ export default function Beamstop({ beamstopXNameRBV, beamstopYNameRBV, beamstopCurrentName, + ...((beamstopEnergyName && beamstopEnergyRBV) ? [beamstopEnergyName, beamstopEnergyRBV] : []), + ], + [ + beamstopXName, + beamstopYName, + beamstopXNameRBV, + beamstopYNameRBV, + beamstopCurrentName, + beamstopEnergyName, ], - [beamstopXName, beamstopYName, beamstopXNameRBV, beamstopYNameRBV, beamstopCurrentName], ); const { devices, handleSetValueRequest, toggleDeviceLock } = useOphydPVSocket(deviceNameList); const [bestCurrent, setBestCurrent] = useState(null); @@ -84,15 +103,19 @@ export default function Beamstop({
-

- Beamstop Current:{' '} - {devices[beamstopCurrentName] && devices[beamstopCurrentName].value}{' '} - {devices[beamstopCurrentName] && - devices[beamstopCurrentName].units?.slice(0, 3)} -

+ +

Beamstop Current:{' '}

+ +

+ {devices[beamstopCurrentName] && Number(devices[beamstopCurrentName].value).toPrecision(4)}{' '} + {devices[beamstopCurrentName] && + devices[beamstopCurrentName].units?.slice(0, 3)} +

+ +
@@ -118,7 +141,7 @@ export default function Beamstop({ )}
+ {beamstopEnergyName && ( + + )}
+ {beamstopEnergyName && ( +
+ +
+ )} ); } diff --git a/src/lib/ophyd-sim/camera/SimCameraSocket.ts b/src/lib/ophyd-sim/camera/SimCameraSocket.ts new file mode 100644 index 00000000..8d21b9a3 --- /dev/null +++ b/src/lib/ophyd-sim/camera/SimCameraSocket.ts @@ -0,0 +1,161 @@ +import type { CameraSocketFactory, CameraSocketLike, CameraSocketMessageEvent } from './types'; + +/** Payload a frame generator may return. `null` skips the frame. */ +export type CameraFramePayload = Blob | ArrayBuffer | null; + +export interface SimCameraSocketOptions { + /** Frames per second to emit. Defaults to 30. */ + fps?: number; + /** Generated frame width in pixels. Defaults to 512. */ + width?: number; + /** Generated frame height in pixels. Defaults to 512. */ + height?: number; + /** + * Produce one frame. Defaults to a grayscale random-noise JPEG. Override in + * tests (or to swap in structured imagery) to avoid touching canvas APIs. + */ + generateFrame?: (size: { + width: number; + height: number; + }) => Promise | CameraFramePayload; +} + +const OPEN = 1; +const CLOSED = 3; + +/** + * Draw uncorrelated grayscale noise and JPEG-encode it, mirroring what the real + * Python camera server puts on the wire (the frontend only ever sees JPEG + * frames). Returns `null` when `OffscreenCanvas` is unavailable so callers can + * simply skip the frame rather than crash. + */ +async function generateNoiseJpeg({ + width, + height, +}: { + width: number; + height: number; +}): Promise { + if (typeof OffscreenCanvas === 'undefined') return null; + const canvas = new OffscreenCanvas(width, height); + const context = canvas.getContext('2d'); + if (!context) return null; + + const image = context.createImageData(width, height); + const data = image.data; + for (let i = 0; i < data.length; i += 4) { + const v = Math.floor(Math.random() * 256); + data[i] = v; // R + data[i + 1] = v; // G + data[i + 2] = v; // B + data[i + 3] = 255; // A + } + context.putImageData(image, 0, 0); + return canvas.convertToBlob({ type: 'image/jpeg', quality: 0.6 }); +} + +/** + * A `WebSocket`-shaped fake that stands in for the real camera stream. After an + * async "connection", it emits binary JPEG frames at `fps`, replicating the + * server protocol {@link useCameraCanvas} expects: an initial `{ x, y }` + * dimensions message, JPEG frame blobs, and a `{ logNormalization }` echo in + * response to `toggleLogNormalization`. The image content (random noise by + * default) carries no real data — it exists to drive the UI without a backend. + */ +export class SimCameraSocket implements CameraSocketLike { + readyState = 0; // CONNECTING + + onopen: ((event: Event) => void) | null = null; + onmessage: ((event: CameraSocketMessageEvent) => void) | null = null; + onerror: ((event: Event) => void) | null = null; + onclose: ((event: Event) => void) | null = null; + + private readonly fps: number; + private readonly width: number; + private readonly height: number; + private readonly generateFrame: NonNullable; + private timer: ReturnType | null = null; + private logNormalization = true; + private emittingFrame = false; + + constructor(options: SimCameraSocketOptions = {}) { + this.fps = options.fps ?? 30; + this.width = options.width ?? 512; + this.height = options.height ?? 512; + this.generateFrame = options.generateFrame ?? generateNoiseJpeg; + // Defer "open" like a real socket so listeners assigned after + // construction still fire. + setTimeout(() => this.open(), 0); + } + + private open(): void { + if (this.readyState === CLOSED) return; + this.readyState = OPEN; + this.onopen?.(new Event('open')); + // Seed canvas dimensions for consumers using `canvasSize: 'automatic'`. + this.onmessage?.({ data: JSON.stringify({ x: this.width, y: this.height }) }); + this.startFrames(); + } + + private startFrames(): void { + const intervalMs = Math.max(1, Math.round(1000 / this.fps)); + this.timer = setInterval(() => { + void this.emitFrame(); + }, intervalMs); + } + + private async emitFrame(): Promise { + // Skip if a prior frame is still encoding so slow envs don't pile up work. + if (this.emittingFrame || this.readyState !== OPEN) return; + this.emittingFrame = true; + try { + const frame = await this.generateFrame({ width: this.width, height: this.height }); + if (frame && this.readyState === OPEN) { + this.onmessage?.({ data: frame }); + } + } finally { + this.emittingFrame = false; + } + } + + send(data: string): void { + if (this.readyState !== OPEN) return; + let message: unknown; + try { + message = JSON.parse(data); + } catch { + return; // Ignore non-JSON control messages. + } + if (message && typeof message === 'object' && 'toggleLogNormalization' in message) { + this.logNormalization = Boolean( + (message as { toggleLogNormalization: unknown }).toggleLogNormalization, + ); + this.onmessage?.({ + data: JSON.stringify({ logNormalization: this.logNormalization }), + }); + } + // The initial config message (image/size PV names) needs no response — + // the sim renders fixed-size noise regardless. + } + + close(): void { + if (this.readyState === CLOSED) return; + this.readyState = CLOSED; + if (this.timer !== null) { + clearInterval(this.timer); + this.timer = null; + } + this.onclose?.(new Event('close')); + } +} + +/** + * Factory that produces {@link SimCameraSocket}s, suitable for the hook's + * `socketFactory` seam. The `url` is accepted for signature compatibility and + * ignored — there is no backend to connect to. + */ +export function createSimCameraSocketFactory( + options: SimCameraSocketOptions = {}, +): CameraSocketFactory { + return (_url: string) => new SimCameraSocket(options); +} diff --git a/src/lib/ophyd-sim/camera/createSimDetectorCameraSocketFactory.ts b/src/lib/ophyd-sim/camera/createSimDetectorCameraSocketFactory.ts new file mode 100644 index 00000000..bea23496 --- /dev/null +++ b/src/lib/ophyd-sim/camera/createSimDetectorCameraSocketFactory.ts @@ -0,0 +1,110 @@ +import type { OphydSim } from '../core/types'; +import type { DetectorConfig } from '../devices/detector'; +import { MODE_SUFFIX, OPACITY_SUFFIX } from '../devices/detector'; +import type { CameraFramePayload } from './SimCameraSocket'; +import { SimCameraSocket } from './SimCameraSocket'; +import type { CameraSocketFactory } from './types'; + +export interface SimDetectorCameraOptions { + /** Frames per second to emit. Defaults to 30. */ + fps?: number; +} + +/** Lazily load and cache an image as an ImageBitmap (keyed per URL). */ +const bitmapCache = new Map>(); + +function loadImageBitmap(url: string): Promise { + let pending = bitmapCache.get(url); + if (!pending) { + pending = (async () => { + try { + const response = await fetch(url); + const blob = await response.blob(); + return await createImageBitmap(blob); + } catch (err) { + console.error('[ophyd-sim] failed to load detector image', url, err); + return null; + } + })(); + bitmapCache.set(url, pending); + } + return pending; +} + +/** + * Render one detector frame to a JPEG blob, dimmed by `opacity`. + * + * `noisy` scales each grayscale sample by `opacity` (lower energy → darker + * noise). `image_file` draws the cached bitmap at `globalAlpha = opacity` over a + * black background (JPEG has no alpha, so compositing over black is what reads + * as "darker"). Returns `null` when canvas APIs are unavailable (e.g. jsdom). + */ +export async function renderDetectorFrame(params: { + width: number; + height: number; + mode: 'noisy' | 'image_file'; + opacity: number; + file?: string; +}): Promise { + const { width, height, mode, opacity, file } = params; + if (typeof OffscreenCanvas === 'undefined') return null; + const canvas = new OffscreenCanvas(width, height); + const context = canvas.getContext('2d'); + if (!context) return null; + + // Black background so dimming reads as darker. + context.fillStyle = 'black'; + context.fillRect(0, 0, width, height); + + if (mode === 'image_file' && file) { + const bitmap = await loadImageBitmap(file); + if (bitmap) { + context.globalAlpha = opacity; + context.drawImage(bitmap, 0, 0, width, height); + context.globalAlpha = 1; + } + } else { + const frame = context.createImageData(width, height); + const data = frame.data; + for (let i = 0; i < data.length; i += 4) { + const v = Math.floor(Math.random() * 256 * opacity); + data[i] = v; // R + data[i + 1] = v; // G + data[i + 2] = v; // B + data[i + 3] = 255; // A + } + context.putImageData(frame, 0, 0); + } + + return canvas.convertToBlob({ type: 'image/jpeg', quality: 0.6 }); +} + +/** + * Build a camera socket factory whose frames are driven by a detector in a live + * `OphydSim`. Each frame reads the detector's current `image1:Opacity` (set by + * modulating devices such as beam energy) and `image1:Mode`, so changing those + * PVs visibly changes the stream. + */ +export function createSimDetectorCameraSocketFactory( + sim: OphydSim, + config: DetectorConfig, + options: SimDetectorCameraOptions = {}, +): CameraSocketFactory { + const { prefix, image } = config; + const opacityPV = `${prefix}:${OPACITY_SUFFIX}`; + const modePV = `${prefix}:${MODE_SUFFIX}`; + + return (_url: string) => + new SimCameraSocket({ + fps: options.fps, + width: image.sizeX, + height: image.sizeY, + generateFrame: ({ width, height }) => { + const rawOpacity = sim.get(opacityPV); + const opacity = typeof rawOpacity === 'number' ? rawOpacity : 1; + const rawMode = sim.get(modePV); + const mode = rawMode === 'image_file' ? 'image_file' : 'noisy'; + return renderDetectorFrame({ width, height, mode, opacity, file: image.file }); + }, + }); +} diff --git a/src/lib/ophyd-sim/camera/types.ts b/src/lib/ophyd-sim/camera/types.ts new file mode 100644 index 00000000..389ca050 --- /dev/null +++ b/src/lib/ophyd-sim/camera/types.ts @@ -0,0 +1,31 @@ +/** + * The minimal slice of the browser `WebSocket` API that {@link useCameraCanvas} + * actually consumes. A simulator only has to implement this surface — not the + * full `WebSocket` interface — to stand in for the real camera stream. + * + * The real `WebSocket` is structurally wider than this (its `onmessage` carries + * a full `MessageEvent`), so the default factory casts it to this shape; see + * `defaultCameraSocketFactory` in the hook. + */ +export interface CameraSocketMessageEvent { + /** JSON string for control messages, or a binary JPEG frame. */ + data: string | ArrayBuffer | Blob; +} + +export interface CameraSocketLike { + /** Mirrors `WebSocket.readyState` (`1` === OPEN). */ + readyState: number; + onopen: ((event: Event) => void) | null; + onmessage: ((event: CameraSocketMessageEvent) => void) | null; + onerror: ((event: Event) => void) | null; + onclose: ((event: Event) => void) | null; + /** Outgoing control messages are always JSON strings. */ + send(data: string): void; + close(): void; +} + +/** + * Constructs a camera socket for a given URL. The hook defaults to one that + * wraps the real `WebSocket`; pass a sim factory to render mock frames instead. + */ +export type CameraSocketFactory = (url: string) => CameraSocketLike; diff --git a/src/lib/ophyd-sim/devices/detector.ts b/src/lib/ophyd-sim/devices/detector.ts new file mode 100644 index 00000000..6b6d0594 --- /dev/null +++ b/src/lib/ophyd-sim/devices/detector.ts @@ -0,0 +1,118 @@ +import type { DeviceFactory, PVMetadata } from '../core/types'; + +/** A point mapping an input value (e.g. an energy in eV) to an output (e.g. opacity). */ +export interface ModulationPoint { + in: number; + out: number; +} + +/** + * Declarative rule by which another device's PV adjusts the detector image. + * For now the only `effect` is `'opacity'`. The output is a linear interpolation + * from `from` to `to`, clamped to that output range. + */ +export interface DetectorModulation { + /** PV name whose value drives this effect (e.g. the beam-energy PV). */ + source: string; + effect: 'opacity'; + from: ModulationPoint; + to: ModulationPoint; +} + +export interface DetectorImageConfig { + /** Image source: random noise, or a static image file. */ + mode: 'noisy' | 'image_file'; + sizeX: number; + sizeY: number; + /** URL of the image to render when `mode === 'image_file'`. */ + file?: string; +} + +/** + * A detector defined declaratively (typically loaded from a JSON file). The + * `prefix` becomes the PV prefix (e.g. `'13SIM1'`) under which the standard + * Area-Detector PVs are seeded. + */ +export interface DetectorConfig { + prefix: string; + image: DetectorImageConfig; + modulations?: DetectorModulation[]; +} + +/** PV suffix carrying the derived image opacity (0–1), under `:`. */ +export const OPACITY_SUFFIX = 'image1:Opacity'; +/** PV suffix carrying the image value mode (`'noisy' | 'image_file'`). */ +export const MODE_SUFFIX = 'image1:Mode'; + +/** + * Linearly map `value` from `from.in→to.in` onto `from.out→to.out`, clamping + * the normalized position to [0, 1] so the result never leaves the output range. + */ +export function mapLinearClamped(value: number, from: ModulationPoint, to: ModulationPoint): number { + const span = to.in - from.in; + const t = span === 0 ? 0 : (value - from.in) / span; + const clamped = Math.max(0, Math.min(1, t)); + return from.out + clamped * (to.out - from.out); +} + +/** + * Simulated area detector. + * + * Unlike `motor`/`signal` (single-value devices), a detector seeds a *cluster* + * of PVs from one `prefix` so a caller passing `'13SIM1'` can immediately read + * the standard camera PVs (`cam1:SizeX`, `cam1:SizeY`, `cam1:MinX`, `cam1:MinY`, + * `cam1:ColorMode`, `cam1:DataType`, `cam1:Acquire`) plus the image `value` mode + * (`image1:Mode`). + * + * The image itself is not a PV (it streams over the camera socket), but its + * scalar parameters are. Each `modulation` registers a derived PV that other + * devices drive — e.g. beam energy → `image1:Opacity` — which the camera socket + * reads per frame to dim the rendered image. + */ +export function detector(config: DetectorConfig): DeviceFactory { + return (reg) => { + const { prefix, image } = config; + const pv = (suffix: string): string => `${prefix}:${suffix}`; + + const pixelMeta: PVMetadata = { + units: 'px', + read_access: true, + write_access: true, + precision: 0, + }; + + reg.seed(pv('cam1:SizeX'), image.sizeX, pixelMeta); + reg.seed(pv('cam1:SizeY'), image.sizeY, pixelMeta); + reg.seed(pv('cam1:MinX'), 0, pixelMeta); + reg.seed(pv('cam1:MinY'), 0, pixelMeta); + reg.seed(pv('cam1:ColorMode'), 0, { + read_access: true, + write_access: true, + enum_strs: ['Mono', 'RGB1'], + }); + reg.seed(pv('cam1:DataType'), 1, { + read_access: true, + write_access: true, + enum_strs: ['Int8', 'UInt8', 'Int16', 'UInt16', 'Int32', 'UInt32', 'Float32', 'Float64'], + }); + reg.seed(pv('cam1:Acquire'), 0, { + read_access: true, + write_access: true, + enum_strs: ['Done', 'Acquire'], + }); + reg.seed(pv(MODE_SUFFIX), image.mode, { + read_access: true, + write_access: true, + enum_strs: ['noisy', 'image_file'], + }); + + for (const mod of config.modulations ?? []) { + if (mod.effect === 'opacity') { + const { from, to } = mod; + reg.registerDerived(pv(OPACITY_SUFFIX), [mod.source], ({ get }) => + mapLinearClamped(get.number(mod.source), from, to), + ); + } + } + }; +} diff --git a/src/lib/ophyd-sim/generators/bragg.ts b/src/lib/ophyd-sim/generators/bragg.ts new file mode 100644 index 00000000..da24c6bb --- /dev/null +++ b/src/lib/ophyd-sim/generators/bragg.ts @@ -0,0 +1,29 @@ +export interface BraggAngleOptions { + /** Photon energy in electron-volts. */ + energyEV: number; + /** + * Crystal 2d-spacing in Ångström. Defaults to Si(111) ≈ 6.271 Å, the most + * common monochromator crystal. + */ + twoD?: number; +} + +/** Photon energy × wavelength product, hc, in eV·Å. */ +const HC_EV_ANGSTROM = 12398.42; + +/** + * Bragg angle for a double-crystal monochromator selecting `energyEV`. + * + * From Bragg's law (nλ = 2d·sinθ, n = 1) and E = hc/λ: + * sinθ = hc / (2d · E) + * Higher energy → smaller angle. The sin argument is clamped to [-1, 1] so + * energies outside the physically reachable range saturate at θ = π/2 instead + * of returning NaN. + * + * @returns the Bragg angle θ in radians, within (0, π/2]. + */ +export function braggAngle({ energyEV, twoD = 6.271 }: BraggAngleOptions): number { + const sinTheta = HC_EV_ANGSTROM / (twoD * energyEV); + const clamped = Math.min(1, Math.max(-1, sinTheta)); + return Math.asin(clamped); +} diff --git a/src/lib/ophyd-sim/generators/gaussian.ts b/src/lib/ophyd-sim/generators/gaussian.ts index e57093bc..28f355c9 100644 --- a/src/lib/ophyd-sim/generators/gaussian.ts +++ b/src/lib/ophyd-sim/generators/gaussian.ts @@ -11,16 +11,33 @@ export function gaussian({ x, center, sigma }: GaussianOptions): number { return Math.exp(-0.5 * z * z); } +/** Inputs for evaluating a 2D Gaussian at a single point. */ export interface Gaussian2dOptions { + /** X coordinate at which to evaluate the Gaussian. */ x: number; + /** Y coordinate at which to evaluate the Gaussian. */ y: number; + /** X coordinate of the Gaussian's peak. */ centerX: number; + /** Y coordinate of the Gaussian's peak. */ centerY: number; + /** Standard deviation along the X axis (controls horizontal spread). */ sigmaX: number; + /** Standard deviation along the Y axis (controls vertical spread). */ sigmaY: number; } -/** 2D Gaussian, peak value 1 at (centerX, centerY). */ +/** + * Evaluates a separable 2D Gaussian at a single point, with a peak value of 1 + * at the center `(centerX, centerY)`. + * + * The X and Y axes are independent (no covariance term), so the result is the + * product of two 1D Gaussians. A sigma of 0 collapses that axis to a spike: + * the contribution is 1 exactly on the center coordinate and 0 elsewhere. + * + * @param options - Point to evaluate, peak center, and per-axis spreads. + * @returns The Gaussian amplitude in the range [0, 1]. + */ export function gaussian2d({ x, y, centerX, centerY, sigmaX, sigmaY }: Gaussian2dOptions): number { const zx = sigmaX === 0 ? (x === centerX ? 0 : Infinity) : (x - centerX) / sigmaX; const zy = sigmaY === 0 ? (y === centerY ? 0 : Infinity) : (y - centerY) / sigmaY; diff --git a/src/lib/ophyd-sim/generators/index.ts b/src/lib/ophyd-sim/generators/index.ts index 93b9a9b9..c826c1c8 100644 --- a/src/lib/ophyd-sim/generators/index.ts +++ b/src/lib/ophyd-sim/generators/index.ts @@ -2,3 +2,5 @@ export { gaussian, gaussian2d } from './gaussian'; export type { GaussianOptions, Gaussian2dOptions } from './gaussian'; export { randomNoise, randomWalk } from './noise'; export type { RandomNoiseOptions, RandomWalkOptions } from './noise'; +export { braggAngle } from './bragg'; +export type { BraggAngleOptions } from './bragg'; diff --git a/src/lib/ophyd-sim/index.ts b/src/lib/ophyd-sim/index.ts index f658e16b..dca68c81 100644 --- a/src/lib/ophyd-sim/index.ts +++ b/src/lib/ophyd-sim/index.ts @@ -20,19 +20,41 @@ export { signal } from './devices/signal'; export type { SignalOptions } from './devices/signal'; export { motor } from './devices/motor'; export type { MotorOptions } from './devices/motor'; +export { detector, mapLinearClamped, OPACITY_SUFFIX, MODE_SUFFIX } from './devices/detector'; +export type { + DetectorConfig, + DetectorImageConfig, + DetectorModulation, + ModulationPoint, +} from './devices/detector'; // Generators -export { gaussian, gaussian2d, randomNoise, randomWalk } from './generators'; +export { gaussian, gaussian2d, randomNoise, randomWalk, braggAngle } from './generators'; export type { GaussianOptions, Gaussian2dOptions, RandomNoiseOptions, RandomWalkOptions, + BraggAngleOptions, } from './generators'; // Transport export { createOphydSimTransport } from './transport/createOphydSimTransport'; +// Camera +export { SimCameraSocket, createSimCameraSocketFactory } from './camera/SimCameraSocket'; +export type { SimCameraSocketOptions, CameraFramePayload } from './camera/SimCameraSocket'; +export { + createSimDetectorCameraSocketFactory, + renderDetectorFrame, +} from './camera/createSimDetectorCameraSocketFactory'; +export type { SimDetectorCameraOptions } from './camera/createSimDetectorCameraSocketFactory'; +export type { + CameraSocketLike, + CameraSocketFactory, + CameraSocketMessageEvent, +} from './camera/types'; + // React export { OphydSimProvider, @@ -48,3 +70,19 @@ export { withOphydSim } from './storybook/decorator'; // Scenarios export { defaultBeamline } from './scenarios/defaultBeamline'; +export { beamstopBeamline, simDetectorConfig } from './scenarios/beamstopBeamline'; +export { + beamstopCurrentModel, + beamYAtEnergy, + ENERGY_PV, + ENERGY_MIN_EV, + ENERGY_MAX_EV, + ENERGY_REF_EV, + CENTER_X, + CENTER_Y, + SIGMA_X, + SIGMA_Y, + PEAK_CURRENT, + BEAM_SHIFT_AMPLITUDE_MM, +} from './scenarios/beamstopModel'; +export type { BeamstopCurrentModelOptions } from './scenarios/beamstopModel'; diff --git a/src/lib/ophyd-sim/scenarios/beamstopBeamline.ts b/src/lib/ophyd-sim/scenarios/beamstopBeamline.ts new file mode 100644 index 00000000..8d919ca4 --- /dev/null +++ b/src/lib/ophyd-sim/scenarios/beamstopBeamline.ts @@ -0,0 +1,80 @@ +import { createOphydSim } from '../core/createOphydSim'; +import { motor } from '../devices/motor'; +import { signal } from '../devices/signal'; +import { detector, type DetectorConfig } from '../devices/detector'; +import { randomNoise } from '../generators/noise'; +import { + beamstopCurrentModel, + ENERGY_PV, + ENERGY_REF_EV, + ENERGY_MIN_EV, + ENERGY_MAX_EV, +} from './beamstopModel'; +import rawSimDetectorConfig from './simDetector.json'; + +/** The detector defined in `simDetector.json` (prefix '13SIM1'). */ +export const simDetectorConfig = rawSimDetectorConfig as DetectorConfig; + +/** + * Beamstop scenario backing the feature. Provides the exact PV + * names that component references on TestPage: + * + * Devices: + * - bl531_xps2:beamstop_x_mm — X motor setpoint (+ .RBV / .MOVN) + * - bl531_xps2:beamstop_y_mm — Y motor setpoint (+ .RBV / .MOVN) + * - bl531:mono_energy_eV — writable beam energy. Selecting an energy + * sets the DCM Bragg angle, which shifts the + * beam vertically and therefore changes the + * current at a fixed beamstop position. + * - bl201-beamstop:current — beamstop diode current, derived from the + * two readbacks AND the energy via the shared + * beamstopCurrentModel. Peaks when the stop is + * centered on the (energy-dependent) beam, + * which is what the "best option" logic hunts. + * + * Motors start off the optimum so "Go To Best" has somewhere to move to. + */ +export const beamstopBeamline = createOphydSim({ + devices: [ + motor({ + name: 'bl531_xps2:beamstop_x_mm', + initialPosition: -5, + velocity: 2, + limits: [-10, 10], + units: 'mm', + }), + motor({ + name: 'bl531_xps2:beamstop_y_mm', + initialPosition: 5, + velocity: 2, + limits: [-10, 10], + units: 'mm', + }), + motor({ + name: ENERGY_PV, + initialPosition: ENERGY_REF_EV, + velocity: 100, + units: 'eV', + limits: [ENERGY_MIN_EV, ENERGY_MAX_EV], + }), + signal({ + name: 'bl201-beamstop:current', + units: 'A', + periodMs: 100, + dependsOn: ['bl531_xps2:beamstop_x_mm.RBV', 'bl531_xps2:beamstop_y_mm.RBV', ENERGY_PV], + value: ({ get, random }) => { + const current = beamstopCurrentModel({ + x: get.number('bl531_xps2:beamstop_x_mm.RBV'), + y: get.number('bl531_xps2:beamstop_y_mm.RBV'), + energyEV: get.number(ENERGY_PV), + }); + return current + randomNoise({ random, sigma: 2e-8 }); + }, + }), + + // Detector defined from a JSON file (prefix '13SIM1'). Placed after the + // energy signal so its derived image1:Opacity computes from a seeded + // energy at registration; opacity then tracks energy on every change. + detector(simDetectorConfig), + ], +}); diff --git a/src/lib/ophyd-sim/scenarios/beamstopModel.ts b/src/lib/ophyd-sim/scenarios/beamstopModel.ts new file mode 100644 index 00000000..b7b2ec55 --- /dev/null +++ b/src/lib/ophyd-sim/scenarios/beamstopModel.ts @@ -0,0 +1,77 @@ +import { gaussian2d } from '../generators/gaussian'; +import { braggAngle } from '../generators/bragg'; + +/** + * Shared, noise-free physics model for the beamstop diode current. + * + * Pulled out of `beamstopBeamline.ts` so two consumers stay in sync: + * - the simulator scenario, which adds measurement noise on top, and + * - the Energy-vs-Current plot, which draws this as the "expected" curve. + * + * Coupling chain (see the "Physical Beam Shift vs DCM Angle" reference plot): + * energy → DCM Bragg angle θ → beam vertical position shifts as cos(θ) + * → the 2D-Gaussian intercept of beam and beamstop → diode current. + */ + +/** Writable PV the user sets to choose photon energy. */ +export const ENERGY_PV = 'bl531:mono_energy_eV'; + +// Energy sweep range (eV). Chosen so the Si(111) Bragg angle lands in a +// realistic spread and the resulting beam shift stays within motor travel. +export const ENERGY_MIN_EV = 2000; +export const ENERGY_MAX_EV = 7000; +/** Reference energy at which the beam sits exactly at CENTER_Y. */ +export const ENERGY_REF_EV = 4500; + +// Beam position (the magnitude of the current peaks when the stop sits here). +export const CENTER_X = 2.5; +export const CENTER_Y = 1.5; +export const SIGMA_X = 2; +export const SIGMA_Y = 4; +/** Full-strength beamstop current. */ +export const PEAK_CURRENT = 100; + +/** + * How far (mm) the beam center travels vertically across the energy range. + * Kept small enough that the swept beam center stays comfortably inside the + * motors' [-10, 10] mm travel, so "Go To Best" can always reach the peak. + */ +export const BEAM_SHIFT_AMPLITUDE_MM = 4; + +const COS_THETA_REF = Math.cos(braggAngle({ energyEV: ENERGY_REF_EV })); + +/** + * Vertical beam position (mm) for a given energy. Equals CENTER_Y at the + * reference energy and shifts by cos(θ) — the cosine relationship from the + * reference diagram — as energy moves away from it. + */ +export function beamYAtEnergy(energyEV: number): number { + const cosTheta = Math.cos(braggAngle({ energyEV })); + return CENTER_Y + BEAM_SHIFT_AMPLITUDE_MM * (cosTheta - COS_THETA_REF); +} + +export interface BeamstopCurrentModelOptions { + /** Beamstop X position (mm). */ + x: number; + /** Beamstop Y position (mm). */ + y: number; + /** Photon energy (eV). */ + energyEV: number; +} + +/** + * Deterministic beamstop diode current for a given stop position and energy. + * Peaks at PEAK_CURRENT when the stop sits at (CENTER_X, beamYAtEnergy) and + * falls off as a 2D Gaussian away from it. + */ +export function beamstopCurrentModel({ x, y, energyEV }: BeamstopCurrentModelOptions): number { + const intercept = gaussian2d({ + x, + y, + centerX: CENTER_X, + centerY: beamYAtEnergy(energyEV), + sigmaX: SIGMA_X, + sigmaY: SIGMA_Y, + }); + return PEAK_CURRENT * intercept; +} diff --git a/src/lib/ophyd-sim/scenarios/defaultBeamline.ts b/src/lib/ophyd-sim/scenarios/defaultBeamline.ts index 66a0d4e9..a17f6013 100644 --- a/src/lib/ophyd-sim/scenarios/defaultBeamline.ts +++ b/src/lib/ophyd-sim/scenarios/defaultBeamline.ts @@ -14,7 +14,9 @@ import { randomNoise } from '../generators/noise'; * - IOC:m1 — motor setpoint (limits -10..10, velocity 1) * - IOC:m1.RBV — readback, animates toward setpoint * - IOC:m1.MOVN — moving flag - * - I0 — derived scalar peaked near readback=2 with noise + * - IOC:bs — beamstop, writable In/Out (defaults to Out) + * - I0 — derived scalar peaked near readback=2 with noise, + * attenuated ~99% while the beamstop is In */ export const defaultBeamline = createOphydSim({ devices: [ @@ -25,19 +27,31 @@ export const defaultBeamline = createOphydSim({ limits: [-10, 10], units: 'mm', }), + // Beamstop: binary In/Out, writable. 0 = Out, 1 = In. Defaults to Out + // so I0 is unchanged unless something deliberately inserts the stop. + signal({ + name: 'IOC:bs', + initialValue: 0, + writeAccess: true, + enumStrs: ['Out', 'In'], + }), signal({ name: 'I0', units: 'arb.', periodMs: 100, - dependsOn: ['IOC:m1.RBV'], - value: ({ get, random }) => - 1000 * + dependsOn: ['IOC:m1.RBV', 'IOC:bs'], + value: ({ get, random }) => { + const beam = + 1000 * gaussian({ x: get.number('IOC:m1.RBV'), center: 2, sigma: 0.5, - }) + - randomNoise({ random, sigma: 5 }), + }); + // Beamstop attenuates the direct beam ~99% when In. + const attenuated = get.boolean('IOC:bs') ? beam * 0.01 : beam; + return attenuated + randomNoise({ random, sigma: 5 }); + }, }), ], }); diff --git a/src/lib/ophyd-sim/scenarios/simDetector.json b/src/lib/ophyd-sim/scenarios/simDetector.json new file mode 100644 index 00000000..8c102f11 --- /dev/null +++ b/src/lib/ophyd-sim/scenarios/simDetector.json @@ -0,0 +1,17 @@ +{ + "prefix": "13SIM1", + "image": { + "mode": "noisy", + "sizeX": 512, + "sizeY": 512, + "file": "/images/als_logo_wheel.png" + }, + "modulations": [ + { + "source": "bl531:mono_energy_eV", + "effect": "opacity", + "from": { "in": 2000, "out": 0.1 }, + "to": { "in": 7000, "out": 1.0 } + } + ] +} diff --git a/src/testing/tests/beamstopModel.test.ts b/src/testing/tests/beamstopModel.test.ts new file mode 100644 index 00000000..d42ec8b6 --- /dev/null +++ b/src/testing/tests/beamstopModel.test.ts @@ -0,0 +1,83 @@ +import { describe, it, expect } from 'vitest'; +import { braggAngle } from '../../lib/ophyd-sim/generators/bragg'; +import { + beamstopCurrentModel, + beamYAtEnergy, + CENTER_X, + CENTER_Y, + PEAK_CURRENT, + ENERGY_MIN_EV, + ENERGY_MAX_EV, + ENERGY_REF_EV, +} from '../../lib/ophyd-sim/scenarios/beamstopModel'; + +describe('braggAngle', () => { + it('returns an angle in (0, π/2] for in-range energies', () => { + const theta = braggAngle({ energyEV: ENERGY_REF_EV }); + expect(theta).toBeGreaterThan(0); + expect(theta).toBeLessThanOrEqual(Math.PI / 2); + }); + + it('decreases as energy increases (higher energy → smaller angle)', () => { + const low = braggAngle({ energyEV: ENERGY_MIN_EV }); + const high = braggAngle({ energyEV: ENERGY_MAX_EV }); + expect(high).toBeLessThan(low); + }); + + it('saturates at π/2 rather than NaN for energies below the crystal cutoff', () => { + const theta = braggAngle({ energyEV: 1 }); + expect(Number.isNaN(theta)).toBe(false); + expect(theta).toBeCloseTo(Math.PI / 2, 5); + }); +}); + +describe('beamYAtEnergy', () => { + it('sits exactly at CENTER_Y at the reference energy', () => { + expect(beamYAtEnergy(ENERGY_REF_EV)).toBeCloseTo(CENTER_Y, 10); + }); + + it('shifts monotonically with energy', () => { + const ys = [ENERGY_MIN_EV, 3000, 4000, 5000, 6000, ENERGY_MAX_EV].map(beamYAtEnergy); + const ascending = ys.every((v, i) => i === 0 || v >= ys[i - 1]); + expect(ascending).toBe(true); + }); + + it('keeps the beam within motor travel [-10, 10] across the range', () => { + for (let e = ENERGY_MIN_EV; e <= ENERGY_MAX_EV; e += 100) { + const y = beamYAtEnergy(e); + expect(y).toBeGreaterThanOrEqual(-10); + expect(y).toBeLessThanOrEqual(10); + } + }); +}); + +describe('beamstopCurrentModel', () => { + it('peaks at PEAK_CURRENT when the stop sits on the energy-dependent beam', () => { + const energyEV = ENERGY_REF_EV; + const peak = beamstopCurrentModel({ + x: CENTER_X, + y: beamYAtEnergy(energyEV), + energyEV, + }); + expect(peak).toBeCloseTo(PEAK_CURRENT, 6); + }); + + it('falls off as the stop moves away from the beam', () => { + const energyEV = ENERGY_REF_EV; + const onBeam = beamstopCurrentModel({ x: CENTER_X, y: beamYAtEnergy(energyEV), energyEV }); + const offBeam = beamstopCurrentModel({ + x: CENTER_X + 5, + y: beamYAtEnergy(energyEV) + 5, + energyEV, + }); + expect(offBeam).toBeLessThan(onBeam); + }); + + it('changes with energy at a fixed beamstop position', () => { + const atRef = beamstopCurrentModel({ x: CENTER_X, y: CENTER_Y, energyEV: ENERGY_REF_EV }); + const atMax = beamstopCurrentModel({ x: CENTER_X, y: CENTER_Y, energyEV: ENERGY_MAX_EV }); + // At the reference energy the beam is at CENTER_Y, so current is maximal; + // shifting energy moves the beam off the stop and lowers the current. + expect(atMax).toBeLessThan(atRef); + }); +}); diff --git a/src/testing/tests/createFallbackTransport.test.ts b/src/testing/tests/createFallbackTransport.test.ts new file mode 100644 index 00000000..d3a657ff --- /dev/null +++ b/src/testing/tests/createFallbackTransport.test.ts @@ -0,0 +1,119 @@ +import { describe, it, expect, vi } from 'vitest'; +import { createFallbackTransport } from '../../api/ophyd/transport/createFallbackTransport'; +import type { OphydTransportStatus, Unsubscribe } from '../../api/ophyd/transport/types'; + +/** + * A controllable fake transport for exercising the fallback wrapper. Records + * everything sent to it and lets the test drive its message/status channels. + */ +function makeFakeTransport() { + const messageListeners = new Set<(m: unknown) => void>(); + const statusListeners = new Set<(s: OphydTransportStatus) => void>(); + let status: OphydTransportStatus = 'connecting'; + const sent: unknown[] = []; + let closed = false; + + return { + sent, + get closed() { + return closed; + }, + emitMessage(m: unknown) { + for (const l of messageListeners) l(m); + }, + emitStatus(s: OphydTransportStatus) { + status = s; + for (const l of statusListeners) l(s); + }, + transport: { + send(m: unknown) { + sent.push(m); + }, + onMessage(listener: (m: unknown) => void): Unsubscribe { + messageListeners.add(listener); + return () => messageListeners.delete(listener); + }, + onStatus(listener: (s: OphydTransportStatus) => void): Unsubscribe { + statusListeners.add(listener); + listener(status); + return () => statusListeners.delete(listener); + }, + close() { + closed = true; + }, + }, + }; +} + +describe('createFallbackTransport', () => { + it('switches to the fallback on primary error and replays active subscriptions', () => { + const primary = makeFakeTransport(); + const fallback = makeFakeTransport(); + + const wrapper = createFallbackTransport( + primary.transport, + () => fallback.transport, + ); + + const received: unknown[] = []; + wrapper.onMessage((m) => received.push(m)); + + // Subscribe through the wrapper; the primary should receive it. + wrapper.send({ action: 'subscribe', pv: 'IOC:m1' } as never); + expect(primary.sent).toEqual([{ action: 'subscribe', pv: 'IOC:m1' }]); + + // Primary fails -> wrapper switches to fallback and replays the subscribe. + primary.emitStatus('error'); + expect(primary.closed).toBe(true); + expect(fallback.sent).toEqual([{ action: 'subscribe', pv: 'IOC:m1' }]); + + // Messages from the fallback reach the original listener... + fallback.emitMessage({ pv: 'IOC:m1', value: 42 }); + expect(received).toContainEqual({ pv: 'IOC:m1', value: 42 }); + + // ...and subsequent sends route to the fallback. + wrapper.send({ action: 'set', pv: 'IOC:m1', value: 1 } as never); + expect(fallback.sent).toContainEqual({ action: 'set', pv: 'IOC:m1', value: 1 }); + }); + + it('never forwards the primary terminal status to consumers', () => { + const primary = makeFakeTransport(); + const fallback = makeFakeTransport(); + const wrapper = createFallbackTransport(primary.transport, () => fallback.transport); + + const statuses: OphydTransportStatus[] = []; + wrapper.onStatus((s) => statuses.push(s)); + + primary.emitStatus('error'); + expect(statuses).not.toContain('error'); + + // The fallback's status supersedes from the switch onward. + fallback.emitStatus('open'); + expect(statuses).toContain('open'); + }); + + it('does not replay subscriptions that were unsubscribed before the switch', () => { + const primary = makeFakeTransport(); + const fallback = makeFakeTransport(); + const wrapper = createFallbackTransport(primary.transport, () => fallback.transport); + + wrapper.send({ action: 'subscribe', pv: 'IOC:m1' } as never); + wrapper.send({ action: 'unsubscribe', pv: 'IOC:m1' } as never); + + primary.emitStatus('closed'); + expect(fallback.sent).toEqual([]); + }); + + it('does not switch when the user closes the wrapper', () => { + const primary = makeFakeTransport(); + const makeFallback = vi.fn(() => makeFakeTransport().transport); + const wrapper = createFallbackTransport(primary.transport, makeFallback); + + wrapper.close(); + expect(primary.closed).toBe(true); + + // A close-driven 'closed' from the primary must not trigger a fallback. + primary.emitStatus('closed'); + expect(makeFallback).not.toHaveBeenCalled(); + }); +}); diff --git a/src/testing/tests/ophyd-sim/detector.test.ts b/src/testing/tests/ophyd-sim/detector.test.ts new file mode 100644 index 00000000..a8f3b471 --- /dev/null +++ b/src/testing/tests/ophyd-sim/detector.test.ts @@ -0,0 +1,101 @@ +import { describe, it, expect } from 'vitest'; +import { createOphydSim } from '../../../lib/ophyd-sim/core/createOphydSim'; +import { signal } from '../../../lib/ophyd-sim/devices/signal'; +import { + detector, + mapLinearClamped, + type DetectorConfig, +} from '../../../lib/ophyd-sim/devices/detector'; +import { ENERGY_PV } from '../../../lib/ophyd-sim/scenarios/beamstopModel'; +import simDetectorConfig from '../../../lib/ophyd-sim/scenarios/simDetector.json'; + +const config: DetectorConfig = { + prefix: '13SIM1', + image: { mode: 'noisy', sizeX: 640, sizeY: 480 }, + modulations: [ + { + source: ENERGY_PV, + effect: 'opacity', + from: { in: 2000, out: 0.1 }, + to: { in: 7000, out: 1.0 }, + }, + ], +}; + +function makeSim(detectorConfig: DetectorConfig = config) { + return createOphydSim({ + devices: [ + signal({ name: ENERGY_PV, initialValue: 4500, writeAccess: true }), + detector(detectorConfig), + ], + }); +} + +describe('detector', () => { + it('seeds the standard camera PVs under the prefix', () => { + const sim = makeSim(); + + expect(sim.get('13SIM1:cam1:SizeX')).toBe(640); + expect(sim.get('13SIM1:cam1:SizeY')).toBe(480); + expect(sim.get('13SIM1:cam1:MinX')).toBe(0); + expect(sim.get('13SIM1:cam1:MinY')).toBe(0); + expect(sim.get('13SIM1:cam1:ColorMode')).toBe(0); + expect(sim.get('13SIM1:cam1:DataType')).toBe(1); + expect(sim.get('13SIM1:cam1:Acquire')).toBe(0); + }); + + it('exposes enum metadata for ColorMode and the Acquire flag', () => { + const sim = makeSim(); + expect(sim.metadata('13SIM1:cam1:ColorMode')?.enum_strs).toEqual(['Mono', 'RGB1']); + expect(sim.metadata('13SIM1:cam1:Acquire')?.enum_strs).toEqual(['Done', 'Acquire']); + expect(sim.metadata('13SIM1:cam1:SizeX')?.units).toBe('px'); + }); + + it('seeds the image value mode from config', () => { + expect(makeSim().get('13SIM1:image1:Mode')).toBe('noisy'); + const imageSim = makeSim({ ...config, image: { ...config.image, mode: 'image_file' } }); + expect(imageSim.get('13SIM1:image1:Mode')).toBe('image_file'); + }); + + it('derives image opacity from the energy modulation and tracks changes', () => { + const sim = makeSim(); + + // Initial energy 4500 → halfway → 0.1 + 0.5 * 0.9 = 0.55. + expect(sim.get('13SIM1:image1:Opacity')).toBeCloseTo(0.55, 6); + + sim.set(ENERGY_PV, 7000); + expect(sim.get('13SIM1:image1:Opacity')).toBeCloseTo(1.0, 6); + + sim.set(ENERGY_PV, 2000); + expect(sim.get('13SIM1:image1:Opacity')).toBeCloseTo(0.1, 6); + }); + + it('clamps opacity outside the modulation input range', () => { + const sim = makeSim(); + + sim.set(ENERGY_PV, 100000); + expect(sim.get('13SIM1:image1:Opacity')).toBeCloseTo(1.0, 6); + + sim.set(ENERGY_PV, 0); + expect(sim.get('13SIM1:image1:Opacity')).toBeCloseTo(0.1, 6); + }); + + it('omits the opacity PV when there are no modulations', () => { + const sim = makeSim({ ...config, modulations: [] }); + expect(sim.get('13SIM1:image1:Opacity')).toBeUndefined(); + }); +}); + +describe('simDetector.json', () => { + it('modulation source matches the sim energy PV', () => { + const json = simDetectorConfig as DetectorConfig; + expect(json.modulations?.[0]?.source).toBe(ENERGY_PV); + }); + + it('maps the documented energy → opacity endpoints', () => { + const json = simDetectorConfig as DetectorConfig; + const mod = json.modulations![0]; + expect(mapLinearClamped(7000, mod.from, mod.to)).toBeCloseTo(1.0, 6); + expect(mapLinearClamped(2000, mod.from, mod.to)).toBeCloseTo(0.1, 6); + }); +}); diff --git a/src/testing/tests/simCameraSocket.test.ts b/src/testing/tests/simCameraSocket.test.ts new file mode 100644 index 00000000..4b06cf64 --- /dev/null +++ b/src/testing/tests/simCameraSocket.test.ts @@ -0,0 +1,102 @@ +import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; +import { + SimCameraSocket, + type CameraFramePayload, + type CameraSocketMessageEvent, +} from '../../lib/ophyd-sim'; + +/** + * Drive the sim socket with a synchronous stub frame generator so frame + * delivery is deterministic under fake timers — the real generator depends on + * `OffscreenCanvas`, which jsdom lacks. + */ +function makeSocket(overrides = {}) { + const frame = new ArrayBuffer(8); + const generateFrame = vi.fn((): CameraFramePayload => frame); + const socket = new SimCameraSocket({ fps: 10, generateFrame, ...overrides }); + return { socket, frame, generateFrame }; +} + +describe('SimCameraSocket', () => { + beforeEach(() => vi.useFakeTimers()); + afterEach(() => vi.useRealTimers()); + + it('opens asynchronously and emits an initial dimensions message', async () => { + const { socket } = makeSocket({ width: 320, height: 240 }); + const onopen = vi.fn(); + const messages: CameraSocketMessageEvent['data'][] = []; + socket.onopen = onopen; + socket.onmessage = (e) => messages.push(e.data); + + // Nothing fires until the deferred "connect" timer runs. + expect(onopen).not.toHaveBeenCalled(); + + await vi.advanceTimersByTimeAsync(0); + + expect(onopen).toHaveBeenCalledTimes(1); + expect(socket.readyState).toBe(1); // OPEN + expect(messages).toContainEqual(JSON.stringify({ x: 320, y: 240 })); + }); + + it('emits frames at the configured fps once open', async () => { + const { socket, frame, generateFrame } = makeSocket(); // fps: 10 -> 100ms + const frames: CameraSocketMessageEvent['data'][] = []; + socket.onmessage = (e) => { + if (e.data instanceof ArrayBuffer) frames.push(e.data); + }; + + await vi.advanceTimersByTimeAsync(0); // open + expect(frames).toHaveLength(0); + + await vi.advanceTimersByTimeAsync(350); // ~3 frame intervals + expect(generateFrame).toHaveBeenCalled(); + expect(frames.length).toBeGreaterThanOrEqual(3); + expect(frames[0]).toBe(frame); + }); + + it('echoes logNormalization in response to toggleLogNormalization', async () => { + const { socket } = makeSocket(); + const messages: string[] = []; + socket.onmessage = (e) => { + if (typeof e.data === 'string') messages.push(e.data); + }; + + await vi.advanceTimersByTimeAsync(0); // open + + socket.send(JSON.stringify({ toggleLogNormalization: false })); + expect(messages).toContainEqual(JSON.stringify({ logNormalization: false })); + }); + + it('stops emitting frames and fires onclose after close', async () => { + const { socket } = makeSocket(); + const onclose = vi.fn(); + let frameCount = 0; + socket.onclose = onclose; + socket.onmessage = (e) => { + if (e.data instanceof ArrayBuffer) frameCount += 1; + }; + + await vi.advanceTimersByTimeAsync(0); // open + await vi.advanceTimersByTimeAsync(250); + const beforeClose = frameCount; + expect(beforeClose).toBeGreaterThan(0); + + socket.close(); + expect(onclose).toHaveBeenCalledTimes(1); + expect(socket.readyState).toBe(3); // CLOSED + + await vi.advanceTimersByTimeAsync(500); + expect(frameCount).toBe(beforeClose); // no frames after close + }); + + it('ignores sends and frame ticks before the socket opens', () => { + const { socket } = makeSocket(); + const messages: unknown[] = []; + socket.onmessage = (e) => messages.push(e.data); + + // Still CONNECTING — send is a no-op, nothing emitted. + socket.send(JSON.stringify({ toggleLogNormalization: true })); + expect(messages).toHaveLength(0); + expect(socket.readyState).toBe(0); // CONNECTING + }); +}); diff --git a/src/utils/plotGenerators.ts b/src/utils/plotGenerators.ts index ff78e3b9..2ed06a07 100644 --- a/src/utils/plotGenerators.ts +++ b/src/utils/plotGenerators.ts @@ -23,3 +23,19 @@ export const blankScatterData: PlotlyScatterData = { mode: 'lines+markers', marker: { color: 'grey', size: [] }, }; + +/** + * Per-point marker opacities for a time-ordered series (oldest first, newest + * last). The oldest point gets `minOpacity` and the newest gets 1. Recency is + * raised to `exponent` before interpolating, so `exponent > 1` makes older + * points fade out faster (the curve hugs full opacity near the newest point and + * drops off sooner for older ones). A single point is always fully opaque. + */ +export function recencyOpacities(count: number, minOpacity = 0, exponent = 4): number[] { + if (count <= 0) return []; + if (count === 1) return [1]; + return Array.from({ length: count }, (_, i) => { + const recency = i / (count - 1); + return minOpacity + Math.pow(recency, exponent) * (1 - minOpacity); + }); +} diff --git a/tsconfig.app.json b/tsconfig.app.json index f1bb298f..b88b023a 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -11,6 +11,7 @@ "useDefineForClassFields": true, "lib": ["ES2020", "DOM", "DOM.Iterable"], "module": "ESNext", + "resolveJsonModule": true, "skipLibCheck": true, /* Bundler mode */ From 59bbea613ec69376860243e36badb60e9e849298 Mon Sep 17 00:00:00 2001 From: Prinstar Date: Thu, 9 Jul 2026 11:30:11 -0700 Subject: [PATCH 04/12] Implement EndstationDisplay and shutter control UI --- public/images/det_1m_1.png | Bin 0 -> 267501 bytes public/images/det_1m_2.png | Bin 0 -> 272137 bytes public/images/det_1m_3.png | Bin 0 -> 269383 bytes public/images/det_1m_beamstop.png | Bin 0 -> 4413 bytes src/app/pages/TestPage.tsx | 175 +++++++++++- .../EndstationDisplay/EndstationDisplay.tsx | 62 +++++ .../EndstationDisplay/SampleHolder.tsx | 75 +++++ .../EndstationDisplay/assets/0_base.svg | 17 ++ .../assets/1_light_blocked.svg | 3 + .../assets/1_light_unblocked.svg | 4 + .../assets/2_shutter_moveable.svg | 3 + .../assets/3_beamstop_moveable.svg | 5 + .../assets/4_light_mono_moveable.svg | 3 + .../assets/5_sample_holder.svg | 4 + .../EndstationDisplay/useEndstationDisplay.ts | 107 ++++++++ src/components/FinchHeader.tsx | 15 +- src/components/Shutter.tsx | 256 ++++++++++++------ src/features/SampleStage.tsx | 63 +++++ .../createSimDetectorCameraSocketFactory.ts | 108 ++++++-- src/lib/ophyd-sim/devices/detector.ts | 72 ++++- src/lib/ophyd-sim/devices/shutter.ts | 45 +++ src/lib/ophyd-sim/index.ts | 18 +- .../ophyd-sim/scenarios/beamstopBeamline.ts | 41 ++- src/lib/ophyd-sim/scenarios/simDetector.json | 27 +- src/testing/tests/ophyd-sim/detector.test.ts | 55 ++++ src/testing/tests/ophyd-sim/shutter.test.ts | 56 ++++ 26 files changed, 1089 insertions(+), 125 deletions(-) create mode 100644 public/images/det_1m_1.png create mode 100644 public/images/det_1m_2.png create mode 100644 public/images/det_1m_3.png create mode 100644 public/images/det_1m_beamstop.png create mode 100644 src/components/EndstationDisplay/EndstationDisplay.tsx create mode 100644 src/components/EndstationDisplay/SampleHolder.tsx create mode 100644 src/components/EndstationDisplay/assets/0_base.svg create mode 100644 src/components/EndstationDisplay/assets/1_light_blocked.svg create mode 100644 src/components/EndstationDisplay/assets/1_light_unblocked.svg create mode 100644 src/components/EndstationDisplay/assets/2_shutter_moveable.svg create mode 100644 src/components/EndstationDisplay/assets/3_beamstop_moveable.svg create mode 100644 src/components/EndstationDisplay/assets/4_light_mono_moveable.svg create mode 100644 src/components/EndstationDisplay/assets/5_sample_holder.svg create mode 100644 src/components/EndstationDisplay/useEndstationDisplay.ts create mode 100644 src/features/SampleStage.tsx create mode 100644 src/lib/ophyd-sim/devices/shutter.ts create mode 100644 src/testing/tests/ophyd-sim/shutter.test.ts diff --git a/public/images/det_1m_1.png b/public/images/det_1m_1.png new file mode 100644 index 0000000000000000000000000000000000000000..ed9ac165b96065023871c91844269173fe3a9020 GIT binary patch literal 267501 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ΞQ_y_wH*g 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�adj%K2I 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�^o;9;LSBF{ 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%0ApKJ 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 literal 0 HcmV?d00001 diff --git a/public/images/det_1m_2.png b/public/images/det_1m_2.png new file mode 100644 index 0000000000000000000000000000000000000000..34a153c7f34593d1e2215e5027645a13503bf315 GIT binary patch literal 272137 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 ?$Hz59bc7oMW=bHw!M;aC7Mx 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�cHv^k4Hoqo=c1+@Wb*o(3;pTC@XNpJsJw3bv>jkRHa%8n;0*} zIa=5II}Ze2#2HKXQ3+8P3}(CL|LHub$e1`=lBFeFB&Sm-@^2x-t5Sc63&`J}R3Oat zZ+I?#*X7-nTpDGLZ0#~wc%33J?QNwf(#u*6QM^Y=-3=cqd)?}l_${o{bNGIG;v;>X ziXc#(I>*o*6lg9_QqFh5Jk1AKM!iZ;o&-IC$*9Z)%U-4aevBL$znaST@*n4d%nQ$C zhK3-EGzV_pjzsY8K4O$LblAlB!UiVJI%yFr<>CVG@x5sEI(dcCbFs);)X$H(ucm!$ z z_@V({+uJkQ-e4vLSC9QLPZkAo3JFp8%o;T3!-PXmSdUeKaOi#^AoYs9_Ub`Ixq?%@ z8c)l4_iFRPTYx6^fUO#lq&}FUft1Bcm+gwU4&w*7cJ?Mg$I2tyZvTxim-00qhpY1e zF+InL(p@bXi%iWe;s;O8Y@N3X0GyPAuZdeswudc9MLEPeLwV(YfzzS6T?3)<$UbaF zSH!!0RU2mKI^_-rgZ<2_l4CmdZ+w%Vhrqn z2%=lbW%I=I0XjZ6n1BdC%O0NDs<>4}Fs_Une+9jed`SQ}ne4>cs#qoe!aDwi#XbEO zRu?x8V)6z6koC4BIO_NhaN25!%QrY}o8#2gy==^v_|9PeNY;vO-63!!RoH4NO#0G+ zPQb12J_~6LAL`15nbh`v9GVs~N_T83hFUQBmz?G+^7BQV^`%Rs6%2Ao`r2Zrf za5+IN(UR_*Qwvceu8gElIl3k1+WU?+?Uteqf!X_k9RP7z?M`ZRar5ud43{V1R>5e~ ZM0g*(Nu;d17W@QQ!Y`YZpY!&$jGkU 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 My85}Sb4q9e0EMr}vj6}9 literal 0 HcmV?d00001 diff --git a/src/app/pages/TestPage.tsx b/src/app/pages/TestPage.tsx index 456ad9d0..f018dacb 100644 --- a/src/app/pages/TestPage.tsx +++ b/src/app/pages/TestPage.tsx @@ -3,27 +3,176 @@ import { OphydSimProvider, createOphydSimTransport, beamstopBeamline, + beamstopCurrentModel, simDetectorConfig, createSimDetectorCameraSocketFactory, } from '@/lib/ophyd-sim'; -import { useMemo } from 'react'; -import Beamstop from '@/features/Beamstop'; +import { useEffect, useMemo, useState } from 'react'; +import { createPortal } from 'react-dom'; +import useOphydPVSocket from '@/api/ophyd/useOphydPVSocket'; import CameraCanvas from '@/components/Camera/CameraCanvas'; +import Shutter from '@/components/Shutter'; +import TableDeviceController from '@/components/TableDeviceController'; +import SignalMonitorPlotPV from '@/components/SignalMonitorPlotPV'; +import EnergyVsCurrentPlotPV from '@/components/EnergyVsCurrentPlotPV'; +import Button from '@/components/Button'; +import { HUB_HEADER_RIGHT_SLOT_ID } from '@/components/HubHeader'; +import EndstationDisplay from '@/components/EndstationDisplay/EndstationDisplay'; + +const BEAMSTOP_CURRENT = 'bl201-beamstop:current'; +const BEAMSTOP_X = 'bl531_xps2:beamstop_x_mm'; +const BEAMSTOP_Y = 'bl531_xps2:beamstop_y_mm'; +const BEAMSTOP_ENERGY = 'bl531:mono_energy_eV'; +/** Beamstop motor travel (mm); both axes are symmetric [-LIMIT, +LIMIT]. */ +const BEAMSTOP_LIMIT_MM = 10; + +/** + * Grid-search the noise-free current model for the beamstop X/Y that maximizes + * |diode current| at a given energy — i.e. the beam center. Two passes: a coarse + * sweep across the full travel, then a fine sweep around the coarse winner. + */ +function findPeakPosition(energyEV: number) { + const search = ( + xMin: number, + xMax: number, + yMin: number, + yMax: number, + step: number, + ) => { + let best = { x: 0, y: 0, current: -Infinity }; + for (let x = xMin; x <= xMax + 1e-9; x += step) { + for (let y = yMin; y <= yMax + 1e-9; y += step) { + const current = Math.abs(beamstopCurrentModel({ x, y, energyEV })); + if (current > best.current) best = { x, y, current }; + } + } + return best; + }; + + const L = BEAMSTOP_LIMIT_MM; + const coarse = search(-L, L, -L, L, 0.25); + const clamp = (v: number) => Math.max(-L, Math.min(L, v)); + return search( + clamp(coarse.x - 0.25), + clamp(coarse.x + 0.25), + clamp(coarse.y - 0.25), + clamp(coarse.y + 0.25), + 0.01, + ); +} + +/** + * Beam energy, sample X/Y, and beamstop X/Y — the writable beamline devices, + * driven through the same sim transport that feeds EndstationDisplay and the + * camera, so moves made here update those views live. + */ +const BEAMLINE_DEVICES = [ + 'bl531:mono_energy_eV', + 'bl531:sample_x_mm', + 'bl531:sample_y_mm', + 'bl531_xps2:beamstop_x_mm', + 'bl531_xps2:beamstop_y_mm', +]; + +function BeamlineDeviceTable() { + const { devices, handleSetValueRequest, toggleDeviceLock, toggleExpand } = + useOphydPVSocket(BEAMLINE_DEVICES); + return ( + + ); +} + +/** + * Computes the beamstop X/Y that maximizes the diode current for the current + * beam energy (the beam center), and drives the beamstop there on demand. + * The optimum is recomputed whenever the energy changes, since the beam's + * vertical position tracks energy. + */ +function BeamstopBestOption() { + const deviceList = useMemo( + () => [BEAMSTOP_CURRENT, BEAMSTOP_X, BEAMSTOP_Y, BEAMSTOP_ENERGY], + [], + ); + const { devices, handleSetValueRequest } = useOphydPVSocket(deviceList); + + const energyEV = + typeof devices[BEAMSTOP_ENERGY]?.value === 'number' + ? (devices[BEAMSTOP_ENERGY].value as number) + : null; + + const peak = useMemo(() => (energyEV === null ? null : findPeakPosition(energyEV)), [energyEV]); + + const goToBest = () => { + if (!peak) return; + handleSetValueRequest(BEAMSTOP_X, Number(peak.x.toFixed(3))); + handleSetValueRequest(BEAMSTOP_Y, Number(peak.y.toFixed(3))); + }; + + const currentUnits = devices[BEAMSTOP_CURRENT]?.units ?? 'A'; + const xUnits = devices[BEAMSTOP_X]?.units ?? 'mm'; + const yUnits = devices[BEAMSTOP_Y]?.units ?? 'mm'; + + return ( +
+

+ Optimal Beamstop X: {peak ? peak.x.toPrecision(4) : 'N/A'} {xUnits} +

+

+ Optimal Beamstop Y: {peak ? peak.y.toPrecision(4) : 'N/A'} {yUnits} +

+

+ Expected Current: {peak ? peak.current.toPrecision(5) : 'N/A'} {currentUnits} +

+
+ ); +} + +/** + * Renders the shutter control into the app header's right-side slot. It stays + * inside TestPage's Ophyd sim providers (so it keeps driving the simulated + * beamline) while appearing in the global "Finch Dev Mode" header. + */ +function HeaderShutter() { + const [slot, setSlot] = useState(null); + useEffect(() => { + setSlot(document.getElementById(HUB_HEADER_RIGHT_SLOT_ID)); + }, []); + if (!slot) return null; + // Drives bl531:LJT4:1:AO0 in beamstopBeamline; closing it (5 V) zeroes the diode. + return createPortal(, slot); +} function TestPageBody() { return (
- + {/* Layered SVG view of the same beamline; reacts to the shutter + beamstop PVs. */} + + {/* Beam energy, sample X/Y, and beamstop X/Y controls in one table. */} + + {/* Beamstop current over time. */} + + {/* Beamstop current vs. selected beam energy, keyed by beamstop X/Y position. */} + + {/* Tracks the best beamstop position seen and jumps back to it. */} + {/* No socketFactory prop — the sim factory is supplied via context below. */}
@@ -33,7 +182,7 @@ function TestPageBody() { export default function TestPage() { const transport = useMemo(() => createOphydSimTransport(beamstopBeamline), []); // Camera frames are driven by the '13SIM1' detector in the same sim, so the - // Beamstop energy control modulates the image opacity live. + // energy control in the device table modulates the image opacity live. const cameraSocketFactory = useMemo( () => createSimDetectorCameraSocketFactory(beamstopBeamline, simDetectorConfig), [], diff --git a/src/components/EndstationDisplay/EndstationDisplay.tsx b/src/components/EndstationDisplay/EndstationDisplay.tsx new file mode 100644 index 00000000..af0e9d7b --- /dev/null +++ b/src/components/EndstationDisplay/EndstationDisplay.tsx @@ -0,0 +1,62 @@ +import { cn } from '@/lib/utils'; +import useEndstationDisplay, { type UseEndstationDisplayOptions } from './useEndstationDisplay'; +import baseSvg from './assets/0_base.svg'; +import lightBlockedSvg from './assets/1_light_blocked.svg'; +import lightUnblockedSvg from './assets/1_light_unblocked.svg'; +import shutterSvg from './assets/2_shutter_moveable.svg'; +import beamstopSvg from './assets/3_beamstop_moveable.svg'; +import monoLightSvg from './assets/4_light_mono_moveable.svg'; +import SampleHolder from './SampleHolder'; + +type EndstationDisplayProps = UseEndstationDisplayOptions & { + /** Classes applied to the root container — use this to set the background + * color and/or sizing (e.g. `bg-white w-[485px]`). */ + className?: string; +}; + +/** Shared positioning for every full-canvas stacked layer. */ +const LAYER_CLASS = 'pointer-events-none absolute inset-0 h-full w-full select-none'; + +/** + * Layered SVG graphic of the endstation. Stacks the beamline assets and drives + * the light, shutter, and beamstop layers from live ophyd device state via + * [useEndstationDisplay]. Purely presentational — all logic lives in the hook. + */ +export default function EndstationDisplay({ className, ...hookOptions }: EndstationDisplayProps) { + const { lightLayer, monoVisible, shutterTransform, beamstopTransform } = + useEndstationDisplay(hookOptions); + + return ( +
+ {/* z0 — static base diagram */} + Endstation diagram + {/* z1 — beam, blocked or reaching through */} + + {/* z2 — shutter, slides out of the beam when open */} + + {/* z3 — beamstop, tracks its X/Y motor readbacks */} + + {/* z4 — mono light, only while the beam is unblocked */} + {monoVisible && } + {/* z5 — sample holder, tracks its X/Y motor readbacks */} + +
+ ); +} diff --git a/src/components/EndstationDisplay/SampleHolder.tsx b/src/components/EndstationDisplay/SampleHolder.tsx new file mode 100644 index 00000000..90293ebd --- /dev/null +++ b/src/components/EndstationDisplay/SampleHolder.tsx @@ -0,0 +1,75 @@ +import { useMemo } from 'react'; +import { cn } from '@/lib/utils'; +import useOphydPVSocket from '@/api/ophyd/useOphydPVSocket'; +import sampleHolderSvg from './assets/5_sample_holder.svg'; + +/** Intrinsic viewBox of the endstation canvas. X/Y offsets in SVG units convert + * to percentage transforms against these so motion scales with the rendered + * container width rather than the small graphic's own size. Matches the + * constants in [useEndstationDisplay]. */ +const VIEW_W = 485; +const VIEW_H = 215; + +/** Placement of the sample-holder graphic (a small standalone SVG, not a + * full-canvas layer) as percentages of the container. Its authored 33×29 + * viewBox maps to ~6.8% width; left/top seat it on the beam between the mono + * and the beamstop. Nudge these to reposition the resting spot. */ +const SAMPLE_HOLDER_STYLE = { left: '53.2%', top: '50%', width: '6.8%' } as const; + +export type SampleHolderProps = { + /** Sample X readback PV (mm). Defaults to the `beamstopBeamline` motor. */ + sampleXPV?: string; + /** Sample Y readback PV (mm). Defaults to the `beamstopBeamline` motor. */ + sampleYPV?: string; + /** SVG units the holder travels per mm of motor motion. Calibrate visually; + * defaults to 2. */ + pxPerMm?: number; +}; + +/** Convert an (x, y) offset in SVG units to a percentage `translate()` relative + * to the full canvas. Applied to a full-size wrapper so the percentages track + * the container, not the small graphic inside it. */ +function svgTranslate(xSvg: number, ySvg: number): string { + const xPct = (xSvg / VIEW_W) * 100; + const yPct = (ySvg / VIEW_H) * 100; + return `translate(${xPct}%, ${yPct}%)`; +} + +/** + * Sample-holder graphic that tracks its X/Y motor readbacks. Subscribes to the + * sample stage PVs and slides the holder proportionally across the endstation + * canvas. Mirrors the beamstop tracking in [useEndstationDisplay]; render it as + * a stacked layer inside [EndstationDisplay]. + */ +export default function SampleHolder({ + sampleXPV = 'bl531:sample_x_mm.RBV', + sampleYPV = 'bl531:sample_y_mm.RBV', + pxPerMm = 2, +}: SampleHolderProps = {}) { + const deviceList = useMemo(() => [sampleXPV, sampleYPV], [sampleXPV, sampleYPV]); + const { devices } = useOphydPVSocket(deviceList); + + const transform = useMemo(() => { + const xMm = parseFloat(devices[sampleXPV]?.value as string) || 0; + const yMm = parseFloat(devices[sampleYPV]?.value as string) || 0; + // Positive X mm slides right; positive Y mm slides up (negative SVG y). + return svgTranslate(xMm * pxPerMm, -yMm * pxPerMm); + }, [devices, sampleXPV, sampleYPV, pxPerMm]); + + return ( +
+ Sample holder +
+ ); +} diff --git a/src/components/EndstationDisplay/assets/0_base.svg b/src/components/EndstationDisplay/assets/0_base.svg new file mode 100644 index 00000000..ff3b4e86 --- /dev/null +++ b/src/components/EndstationDisplay/assets/0_base.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/components/EndstationDisplay/assets/1_light_blocked.svg b/src/components/EndstationDisplay/assets/1_light_blocked.svg new file mode 100644 index 00000000..ad620bea --- /dev/null +++ b/src/components/EndstationDisplay/assets/1_light_blocked.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/components/EndstationDisplay/assets/1_light_unblocked.svg b/src/components/EndstationDisplay/assets/1_light_unblocked.svg new file mode 100644 index 00000000..9959bea1 --- /dev/null +++ b/src/components/EndstationDisplay/assets/1_light_unblocked.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/components/EndstationDisplay/assets/2_shutter_moveable.svg b/src/components/EndstationDisplay/assets/2_shutter_moveable.svg new file mode 100644 index 00000000..b2243de4 --- /dev/null +++ b/src/components/EndstationDisplay/assets/2_shutter_moveable.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/components/EndstationDisplay/assets/3_beamstop_moveable.svg b/src/components/EndstationDisplay/assets/3_beamstop_moveable.svg new file mode 100644 index 00000000..2b14c7f5 --- /dev/null +++ b/src/components/EndstationDisplay/assets/3_beamstop_moveable.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/components/EndstationDisplay/assets/4_light_mono_moveable.svg b/src/components/EndstationDisplay/assets/4_light_mono_moveable.svg new file mode 100644 index 00000000..c4dd3c50 --- /dev/null +++ b/src/components/EndstationDisplay/assets/4_light_mono_moveable.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/components/EndstationDisplay/assets/5_sample_holder.svg b/src/components/EndstationDisplay/assets/5_sample_holder.svg new file mode 100644 index 00000000..2e2e7610 --- /dev/null +++ b/src/components/EndstationDisplay/assets/5_sample_holder.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/components/EndstationDisplay/useEndstationDisplay.ts b/src/components/EndstationDisplay/useEndstationDisplay.ts new file mode 100644 index 00000000..346a41a9 --- /dev/null +++ b/src/components/EndstationDisplay/useEndstationDisplay.ts @@ -0,0 +1,107 @@ +import { useMemo } from 'react'; +import useOphydPVSocket from '@/api/ophyd/useOphydPVSocket'; + +/** Intrinsic viewBox of every layer SVG. Offsets in SVG units convert to + * percentage transforms against these so motion scales with the rendered + * container width. */ +const VIEW_W = 485; +const VIEW_H = 215; + +/** Constant upward nudge (SVG units) applied to the shutter's resting position. */ +const SHUTTER_BASE_Y = -16; + +/** Constant nudge (SVG units) that seats the beamstop marker on the beam at the + * scenario's resting motor position. Without it the beamstop's authored spot is + * pulled up-left by the default motor offset and the beam overshoots it. */ +const BEAMSTOP_BASE_X = -5; +const BEAMSTOP_BASE_Y = 3; + +/** Which beam graphic to show: blocked stops short of the sample, unblocked + * reaches through. */ +export type LightLayer = 'blocked' | 'unblocked'; + +export type UseEndstationDisplayOptions = { + /** Shutter analog-output PV. Defaults to the `beamstopBeamline` shutter. */ + shutterPV?: string; + /** PV value that means the shutter is open (beam passes). Defaults to 0. */ + shutterOpenValue?: number; + /** Beamstop X readback PV (mm). Defaults to the `beamstopBeamline` motor. */ + beamstopXPV?: string; + /** Beamstop Y readback PV (mm). Defaults to the `beamstopBeamline` motor. */ + beamstopYPV?: string; + /** SVG units the beamstop layer travels per mm of motor motion. Calibrate + * visually; defaults to 2. */ + pxPerMm?: number; + /** SVG units the shutter layer slides out of the beam when open. Calibrate + * visually; defaults to 24. */ + shutterOpenOffset?: number; +}; + +export type EndstationDisplayState = { + /** Beam graphic to render for layer 1. */ + lightLayer: LightLayer; + /** Whether the mono-light layer (layer 4) is visible — only when unblocked. */ + monoVisible: boolean; + /** CSS `transform` for the shutter layer. */ + shutterTransform: string; + /** CSS `transform` for the beamstop layer. */ + beamstopTransform: string; +}; + +/** Convert an (x, y) offset in SVG units to a percentage `translate()` so the + * layer moves proportionally regardless of the rendered size. */ +function svgTranslate(xSvg: number, ySvg: number): string { + const xPct = (xSvg / VIEW_W) * 100; + const yPct = (ySvg / VIEW_H) * 100; + return `translate(${xPct}%, ${yPct}%)`; +} + +/** + * Derive the visual state of the endstation from live ophyd device values. + * + * Subscribes to the shutter and beamstop readback PVs and maps them to the + * layer state consumed by EndstationDisplay. All logic lives here; the + * component only renders. Mirrors the value-parsing pattern in + * [src/components/Shutter.tsx]. + */ +export default function useEndstationDisplay({ + shutterPV = 'bl531:LJT4:1:AO0', + shutterOpenValue = 0, + beamstopXPV = 'bl531_xps2:beamstop_x_mm.RBV', + beamstopYPV = 'bl531_xps2:beamstop_y_mm.RBV', + pxPerMm = 2, + shutterOpenOffset = 24, +}: UseEndstationDisplayOptions = {}): EndstationDisplayState { + const deviceList = useMemo( + () => [shutterPV, beamstopXPV, beamstopYPV], + [shutterPV, beamstopXPV, beamstopYPV], + ); + const { devices } = useOphydPVSocket(deviceList); + + const isOpen = useMemo(() => { + const value = parseFloat(devices[shutterPV]?.value as string); + return value === shutterOpenValue; + }, [devices, shutterPV, shutterOpenValue]); + + const beamstopTransform = useMemo(() => { + const xMm = parseFloat(devices[beamstopXPV]?.value as string) || 0; + const yMm = parseFloat(devices[beamstopYPV]?.value as string) || 0; + // Positive X mm slides right; positive Y mm slides up (negative SVG y). + // The base nudge seats the resting position on the beam. + return svgTranslate(BEAMSTOP_BASE_X + xMm * pxPerMm, BEAMSTOP_BASE_Y - yMm * pxPerMm); + }, [devices, beamstopXPV, beamstopYPV, pxPerMm]); + + // Sit the shutter a little above its authored position, then slide it down + // and out of the beam when open. + const shutterTransform = useMemo( + () => svgTranslate(0, SHUTTER_BASE_Y + (isOpen ? shutterOpenOffset : 0)), + [isOpen, shutterOpenOffset], + ); + + return { + lightLayer: isOpen ? 'unblocked' : 'blocked', + monoVisible: isOpen, + shutterTransform, + beamstopTransform, + }; +} diff --git a/src/components/FinchHeader.tsx b/src/components/FinchHeader.tsx index 6dc5500d..98c821bc 100644 --- a/src/components/FinchHeader.tsx +++ b/src/components/FinchHeader.tsx @@ -1,6 +1,9 @@ import { cn } from '@/lib/utils'; -export type FinchHeaderProps = { +/** DOM id of the header's right-side slot; pages portal controls into this node. */ +export const HUB_HEADER_RIGHT_SLOT_ID = 'hub-header-right-slot'; + +export type HubHeaderProps = { /** Title text displayed in the header. */ title?: string; /** URL of the logo image displayed in the header. Ignored when `logoIcon` is provided. */ @@ -51,7 +54,15 @@ export default function HubHeader({ {title} - {rightSlot} + {/* + * Right-side container. `rightSlot` covers static content passed by the + * layout; the stable id lets pages portal their own controls (e.g. the + * Test page's ) into the header without leaving their own + * provider tree. + */} +
+ {rightSlot} +
); } diff --git a/src/components/Shutter.tsx b/src/components/Shutter.tsx index a123a2e1..07690e25 100644 --- a/src/components/Shutter.tsx +++ b/src/components/Shutter.tsx @@ -1,8 +1,11 @@ -import { useEffect, useMemo, useState, useRef } from 'react'; +import { useEffect, useLayoutEffect, useMemo, useState, useRef } from 'react'; +import { createPortal } from 'react-dom'; import { CaretDown, Check } from '@phosphor-icons/react'; import useOphydPVSocket from '../api/ophyd/useOphydPVSocket'; import { cn } from '@/lib/utils'; +type ShutterState = 'open' | 'closed' | 'unknown' | 'disconnected'; + type ShutterProps = { /** EPICS process variable name for the shutter device. Defaults to 'bl531:LJT4:1:AO0'. */ pv?: string; @@ -12,6 +15,8 @@ type ShutterProps = { valueWhenClosed?: number; /** Additional CSS classes applied to the root container div. */ className?: string; + /** Additional CSS classes applied to the inner content row (e.g. to adjust padding/height). */ + classNameContent?: string; /** Additional CSS classes applied to the dropdown control panel. */ classNameDropdown?: string; /** Additional CSS classes applied to the status circle when the shutter is open. */ @@ -22,11 +27,43 @@ type ShutterProps = { classNameStatusCircleDisconnected?: string; }; +/** Per-state presentation: the status circle, the state pill, and the readable label. */ +const STATE_STYLES: Record< + ShutterState, + { circle: string; pill: string; label: string; status: string } +> = { + open: { + circle: 'bg-green-500 animate-pulse', + pill: 'bg-green-100 text-green-700', + label: 'Open', + status: 'HUTCH SHUTTER OPEN', + }, + closed: { + circle: 'bg-yellow-300', + pill: 'bg-yellow-100 text-yellow-800', + label: 'Closed', + status: 'HUTCH SHUTTER CLOSED', + }, + unknown: { + circle: 'bg-gray-400', + pill: 'bg-gray-100 text-gray-600', + label: 'Unknown', + status: 'HUTCH SHUTTER UNKNOWN', + }, + disconnected: { + circle: 'bg-gray-400', + pill: 'bg-gray-100 text-gray-600', + label: 'Disconnected', + status: 'HUTCH SHUTTER DISCONNECTED', + }, +}; + export default function Shutter({ pv = 'bl531:LJT4:1:AO0', valueWhenOpen = 0, valueWhenClosed = 5, className = '', + classNameContent = '', classNameDropdown = '', classNameStatusCircleOpen = '', classNameStatusCircleClosed = '', @@ -35,13 +72,47 @@ export default function Shutter({ }: ShutterProps) { const [isDropdownOpen, setIsDropdownOpen] = useState(false); const dropdownRef = useRef(null); + const menuRef = useRef(null); + // Screen-space position for the portaled menu (fixed-positioned). + const [menuPos, setMenuPos] = useState<{ top: number; left: number; width: number }>({ + top: 0, + left: 0, + width: 0, + }); const deviceList = useMemo(() => [pv], [pv]); const { devices, handleSetValueRequest } = useOphydPVSocket(deviceList); - // Close dropdown when clicking outside + // The menu is portaled to so it overlays sibling components instead of + // being clipped by an ancestor's overflow/stacking context. That means we must + // position it manually from the trigger's on-screen rect. + useLayoutEffect(() => { + if (!isDropdownOpen) return; + + const updatePosition = () => { + const rect = dropdownRef.current?.getBoundingClientRect(); + if (!rect) return; + setMenuPos({ top: rect.bottom + 4, left: rect.left, width: rect.width }); + }; + + updatePosition(); + window.addEventListener('resize', updatePosition); + window.addEventListener('scroll', updatePosition, true); + return () => { + window.removeEventListener('resize', updatePosition); + window.removeEventListener('scroll', updatePosition, true); + }; + }, [isDropdownOpen]); + + // Close dropdown when clicking outside the trigger or the portaled menu. useEffect(() => { const handleClickOutside = (event: MouseEvent) => { - if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { + const target = event.target as Node; + if ( + dropdownRef.current && + !dropdownRef.current.contains(target) && + menuRef.current && + !menuRef.current.contains(target) + ) { setIsDropdownOpen(false); } }; @@ -63,55 +134,36 @@ export default function Shutter({ [currentValue, valueWhenClosed], ); - const getStatusCircle = () => { - if (shutter?.connected === false) { - // Disconnected state - gray circle, non-flashing - return ( -
- ); - } - if (isOpen) { - return ( -
- ); - } else if (isClosed) { - return ( -
- ); - } else { - // Unknown state - gray circle, non-flashing - return ( -
- ); - } - }; + const state: ShutterState = useMemo(() => { + if (shutter?.connected === false) return 'disconnected'; + if (isOpen) return 'open'; + if (isClosed) return 'closed'; + return 'unknown'; + }, [shutter?.connected, isOpen, isClosed]); - const getStatusText = () => { - if (shutter?.connected === false) return 'HUTCH SHUTTER DISCONNECTED'; - if (isOpen) return 'HUTCH SHUTTER OPEN'; - if (isClosed) return 'HUTCH SHUTTER CLOSED'; - return 'HUTCH SHUTTER UNKNOWN'; - }; + const styles = STATE_STYLES[state]; + + // Circle color is state-driven; the per-state className overrides keep the + // existing customization points working. + const circleOverride = + state === 'open' + ? classNameStatusCircleOpen + : state === 'closed' + ? classNameStatusCircleClosed + : classNameStatusCircleDisconnected; + + // Formatted PV readout. Handles a 0 value (which is falsy) instead of + // dropping to '--', trims pointless trailing decimals, and appends units. + const valueLabel = useMemo(() => { + const raw = shutter?.value; + if (shutter?.connected === false || raw === undefined || raw === null || raw === '') { + return '--'; + } + const num = Number(raw); + if (!Number.isFinite(num)) return String(raw); + const formatted = Number.isInteger(num) ? num.toString() : num.toFixed(2); + return shutter?.units ? `${formatted} ${shutter.units}` : formatted; + }, [shutter?.value, shutter?.connected, shutter?.units]); const handleDropdownToggle = () => { setIsDropdownOpen(!isDropdownOpen); @@ -128,20 +180,41 @@ export default function Shutter({ }; return ( -
-
- {getStatusCircle()} -
- {getStatusText()} +
+
+
+
+
+ {styles.status} + + {styles.label} + +
- {pv}: {shutter.value || '--'} - {shutter?.connected === false && ' (Disconnected)'} + {pv} + · + {valueLabel}
- {/* Dropdown Menu */} - {isDropdownOpen && ( -
- - -
- )} + + +
, + document.body, + )}
); } diff --git a/src/features/SampleStage.tsx b/src/features/SampleStage.tsx new file mode 100644 index 00000000..540872c4 --- /dev/null +++ b/src/features/SampleStage.tsx @@ -0,0 +1,63 @@ +import { useMemo } from 'react'; + +import DeviceControllerBox from '@/components/DeviceControllerBox'; +import useOphydPVSocket from '@/api/ophyd/useOphydPVSocket'; +import { deviceIcons } from '@/assets/icons'; + +export type SampleStageProps = { + /** Sample X motor setpoint PV (mm). */ + sampleXName: string; + /** Sample Y motor setpoint PV (mm). */ + sampleYName: string; + sampleXTitle?: string; + sampleYTitle?: string; + /** Lay the two axis controls out side by side instead of stacked. */ + stackVertical?: boolean; +}; + +/** + * X/Y control for the sample-holder stage. Wires two DeviceControllerBox cards + * to the sample motors and drives the holder graphic in , + * which tracks the same PVs' readbacks. Mirrors the motor wiring in + * [src/features/Beamstop.tsx]. + */ +export default function SampleStage({ + sampleXName, + sampleYName, + sampleXTitle = 'Sample - X', + sampleYTitle = 'Sample - Y', + stackVertical = false, +}: SampleStageProps) { + const sampleXNameRBV = useMemo(() => sampleXName + '.RBV', [sampleXName]); + const sampleYNameRBV = useMemo(() => sampleYName + '.RBV', [sampleYName]); + const deviceNameList = useMemo( + () => [sampleXName, sampleYName, sampleXNameRBV, sampleYNameRBV], + [sampleXName, sampleYName, sampleXNameRBV, sampleYNameRBV], + ); + const { devices, handleSetValueRequest, toggleDeviceLock } = useOphydPVSocket(deviceNameList); + + const xDevice = devices[sampleXName]; + const yDevice = devices[sampleYName]; + if (!xDevice || !yDevice) return null; + + return ( +
+ + +
+ ); +} diff --git a/src/lib/ophyd-sim/camera/createSimDetectorCameraSocketFactory.ts b/src/lib/ophyd-sim/camera/createSimDetectorCameraSocketFactory.ts index bea23496..f4581ea6 100644 --- a/src/lib/ophyd-sim/camera/createSimDetectorCameraSocketFactory.ts +++ b/src/lib/ophyd-sim/camera/createSimDetectorCameraSocketFactory.ts @@ -1,6 +1,11 @@ import type { OphydSim } from '../core/types'; import type { DetectorConfig } from '../devices/detector'; -import { MODE_SUFFIX, OPACITY_SUFFIX } from '../devices/detector'; +import { + MODE_SUFFIX, + OPACITY_SUFFIX, + overlayCenterXSuffix, + overlayCenterYSuffix, +} from '../devices/detector'; import type { CameraFramePayload } from './SimCameraSocket'; import { SimCameraSocket } from './SimCameraSocket'; import type { CameraSocketFactory } from './types'; @@ -31,22 +36,36 @@ function loadImageBitmap(url: string): Promise { return pending; } +/** One image layer to composite, in destination (top-left) pixel coordinates. */ +export interface RenderLayer { + file: string; + /** `globalAlpha` to draw at (0–1). */ + opacity: number; + x: number; + y: number; + width: number; + height: number; +} + /** - * Render one detector frame to a JPEG blob, dimmed by `opacity`. + * Render one detector frame to a JPEG blob over a black background. * - * `noisy` scales each grayscale sample by `opacity` (lower energy → darker - * noise). `image_file` draws the cached bitmap at `globalAlpha = opacity` over a - * black background (JPEG has no alpha, so compositing over black is what reads - * as "darker"). Returns `null` when canvas APIs are unavailable (e.g. jsdom). + * `noisy` fills grayscale noise scaled by `opacity` (lower energy → darker + * noise). `image_file` composites `layers` bottom-first, each drawn at its own + * `globalAlpha` and destination rect (JPEG has no alpha, so compositing over + * black is what reads as "darker"). Returns `null` when canvas APIs are + * unavailable (e.g. jsdom). */ export async function renderDetectorFrame(params: { width: number; height: number; mode: 'noisy' | 'image_file'; - opacity: number; - file?: string; + /** Noise dimming for the `noisy` path. Defaults to 1. */ + opacity?: number; + /** Layers to composite for the `image_file` path, bottom-first. */ + layers?: RenderLayer[]; }): Promise { - const { width, height, mode, opacity, file } = params; + const { width, height, mode, opacity = 1, layers = [] } = params; if (typeof OffscreenCanvas === 'undefined') return null; const canvas = new OffscreenCanvas(width, height); const context = canvas.getContext('2d'); @@ -56,13 +75,14 @@ export async function renderDetectorFrame(params: { context.fillStyle = 'black'; context.fillRect(0, 0, width, height); - if (mode === 'image_file' && file) { - const bitmap = await loadImageBitmap(file); - if (bitmap) { - context.globalAlpha = opacity; - context.drawImage(bitmap, 0, 0, width, height); - context.globalAlpha = 1; + if (mode === 'image_file') { + for (const layer of layers) { + const bitmap = await loadImageBitmap(layer.file); + if (!bitmap) continue; + context.globalAlpha = layer.opacity; + context.drawImage(bitmap, layer.x, layer.y, layer.width, layer.height); } + context.globalAlpha = 1; } else { const frame = context.createImageData(width, height); const data = frame.data; @@ -93,18 +113,62 @@ export function createSimDetectorCameraSocketFactory( const { prefix, image } = config; const opacityPV = `${prefix}:${OPACITY_SUFFIX}`; const modePV = `${prefix}:${MODE_SUFFIX}`; + const overlayPVs = (image.overlays ?? []).map((overlay, i) => ({ + overlay, + xPV: `${prefix}:${overlayCenterXSuffix(i)}`, + yPV: `${prefix}:${overlayCenterYSuffix(i)}`, + })); + + const num = (value: unknown, fallback: number): number => + typeof value === 'number' ? value : fallback; - return (_url: string) => - new SimCameraSocket({ + // Base images to cycle through, one per emitted frame. `files` wins over the + // single `file`; an empty list means no base layer (overlays only). + const baseFiles = + image.files && image.files.length > 0 + ? image.files + : image.file + ? [image.file] + : []; + + return (_url: string) => { + // Per-socket round-robin cursor so each stream advances independently. + let frameIndex = 0; + return new SimCameraSocket({ fps: options.fps, width: image.sizeX, height: image.sizeY, generateFrame: ({ width, height }) => { - const rawOpacity = sim.get(opacityPV); - const opacity = typeof rawOpacity === 'number' ? rawOpacity : 1; - const rawMode = sim.get(modePV); - const mode = rawMode === 'image_file' ? 'image_file' : 'noisy'; - return renderDetectorFrame({ width, height, mode, opacity, file: image.file }); + const opacity = num(sim.get(opacityPV), 1); + const mode = sim.get(modePV) === 'image_file' ? 'image_file' : 'noisy'; + if (mode !== 'image_file') { + return renderDetectorFrame({ width, height, mode, opacity }); + } + + // Base image fills the canvas, dimmed by the energy-driven opacity. + // Cycle to the next base image each frame so the stream animates. + const layers: RenderLayer[] = []; + if (baseFiles.length > 0) { + const file = baseFiles[frameIndex % baseFiles.length]; + frameIndex += 1; + layers.push({ file, opacity, x: 0, y: 0, width, height }); + } + // Overlays composite on top at full opacity, centered on their + // (possibly PV-driven) center coordinate. + for (const { overlay, xPV, yPV } of overlayPVs) { + const centerX = num(sim.get(xPV), overlay.x); + const centerY = num(sim.get(yPV), overlay.y); + layers.push({ + file: overlay.file, + opacity: 1, + x: centerX - overlay.width / 2, + y: centerY - overlay.height / 2, + width: overlay.width, + height: overlay.height, + }); + } + return renderDetectorFrame({ width, height, mode, layers }); }, }); + }; } diff --git a/src/lib/ophyd-sim/devices/detector.ts b/src/lib/ophyd-sim/devices/detector.ts index 6b6d0594..ff789e68 100644 --- a/src/lib/ophyd-sim/devices/detector.ts +++ b/src/lib/ophyd-sim/devices/detector.ts @@ -19,13 +19,55 @@ export interface DetectorModulation { to: ModulationPoint; } +/** + * Live binding of one overlay coordinate (center X or Y, in pixels) to a source + * PV. The source value is linearly mapped from `from.in→to.in` onto the pixel + * range `from.out→to.out`, clamped to that range — identical math to an opacity + * modulation, but the output is a pixel coordinate rather than 0–1. + */ +export interface AxisBinding { + /** PV name whose value drives this coordinate (e.g. a beamstop motor RBV). */ + source: string; + from: ModulationPoint; + to: ModulationPoint; +} + +/** + * An image layer drawn on top of the base image. Positioned by its center so a + * marker (e.g. a beamstop dot) sits where you expect. The center defaults to the + * static `x`/`y`; pass `positionX`/`positionY` to drive it from a live PV. + */ +export interface DetectorOverlay { + /** URL of the overlay image. */ + file: string; + /** Render size in pixels. */ + width: number; + height: number; + /** Center position in pixels (initial value; also the fallback if unbound). */ + x: number; + y: number; + /** Bind the center X to a source PV. */ + positionX?: AxisBinding; + /** Bind the center Y to a source PV. */ + positionY?: AxisBinding; +} + export interface DetectorImageConfig { /** Image source: random noise, or a static image file. */ mode: 'noisy' | 'image_file'; sizeX: number; sizeY: number; - /** URL of the image to render when `mode === 'image_file'`. */ + /** URL of the base (bottom) image to render when `mode === 'image_file'`. */ file?: string; + /** + * URLs of base images to cycle through, one per emitted frame (round-robin), + * when `mode === 'image_file'`. Takes precedence over `file`; use a single + * static base via `file` or a one-element `files`. Lets the stream animate + * through a set of frames (e.g. a captured diffraction sequence). + */ + files?: string[]; + /** Image layers drawn over the base, in order (`image_file` mode only). */ + overlays?: DetectorOverlay[]; } /** @@ -44,6 +86,15 @@ export const OPACITY_SUFFIX = 'image1:Opacity'; /** PV suffix carrying the image value mode (`'noisy' | 'image_file'`). */ export const MODE_SUFFIX = 'image1:Mode'; +/** PV suffix for an overlay's center-X (pixels). `index` is zero-based. */ +export function overlayCenterXSuffix(index: number): string { + return `image1:Overlay${index + 1}:CenterX`; +} +/** PV suffix for an overlay's center-Y (pixels). `index` is zero-based. */ +export function overlayCenterYSuffix(index: number): string { + return `image1:Overlay${index + 1}:CenterY`; +} + /** * Linearly map `value` from `from.in→to.in` onto `from.out→to.out`, clamping * the normalized position to [0, 1] so the result never leaves the output range. @@ -114,5 +165,24 @@ export function detector(config: DetectorConfig): DeviceFactory { ); } } + + // Seed a pixel coordinate PV at `pixelPV`, then — if `binding` is given — + // make it derived so it tracks the source PV (e.g. a beamstop motor). The + // seed runs first so the PV always exists with pixel metadata even when + // unbound; registerDerived overwrites the value but preserves metadata. + const bindAxis = (pixelPV: string, fallback: number, binding?: AxisBinding): void => { + reg.seed(pixelPV, fallback, pixelMeta); + if (binding) { + const { source, from, to } = binding; + reg.registerDerived(pixelPV, [source], ({ get }) => + mapLinearClamped(get.number(source), from, to), + ); + } + }; + + (image.overlays ?? []).forEach((overlay, i) => { + bindAxis(pv(overlayCenterXSuffix(i)), overlay.x, overlay.positionX); + bindAxis(pv(overlayCenterYSuffix(i)), overlay.y, overlay.positionY); + }); }; } diff --git a/src/lib/ophyd-sim/devices/shutter.ts b/src/lib/ophyd-sim/devices/shutter.ts new file mode 100644 index 00000000..54b1aed2 --- /dev/null +++ b/src/lib/ophyd-sim/devices/shutter.ts @@ -0,0 +1,45 @@ +import type { DeviceFactory, PVMetadata } from '../core/types'; + +/** Default analog-output value (volts) that means the shutter is open. */ +export const SHUTTER_OPEN_VALUE = 0; +/** Default analog-output value (volts) that means the shutter is closed. */ +export const SHUTTER_CLOSED_VALUE = 5; + +export interface ShutterOptions { + /** PV name of the shutter analog output (e.g. "bl531:LJT4:1:AO0"). */ + name: string; + /** Value that means open. Defaults to `SHUTTER_OPEN_VALUE` (0). */ + openValue?: number; + /** Value that means closed. Defaults to `SHUTTER_CLOSED_VALUE` (5). */ + closedValue?: number; + /** Initial state. Defaults to 'open'. */ + initial?: 'open' | 'closed'; +} + +/** + * Beam shutter driven through a single analog-output PV, matching the real + * `bl531:LJT4:1:AO0` LabJack channel the `` component controls. + * + * The PV is both command and readback: writing `closedValue` (5 V) blocks the + * beam, `openValue` (0 V) lets it through. Any other value is neither, which + * the UI surfaces as an unknown state. + * + * The shutter holds only its own value — downstream signals gate themselves by + * listing this PV in their `dependsOn` and comparing against `openValue`, + * mirroring how `IOC:bs` gates `I0` in the default beamline. + */ +export function shutter(opts: ShutterOptions): DeviceFactory { + return (reg) => { + const openValue = opts.openValue ?? SHUTTER_OPEN_VALUE; + const closedValue = opts.closedValue ?? SHUTTER_CLOSED_VALUE; + + const metadata: PVMetadata = { + units: 'V', + read_access: true, + write_access: true, + precision: 2, + }; + + reg.seed(opts.name, opts.initial === 'closed' ? closedValue : openValue, metadata); + }; +} diff --git a/src/lib/ophyd-sim/index.ts b/src/lib/ophyd-sim/index.ts index dca68c81..47533862 100644 --- a/src/lib/ophyd-sim/index.ts +++ b/src/lib/ophyd-sim/index.ts @@ -20,11 +20,22 @@ export { signal } from './devices/signal'; export type { SignalOptions } from './devices/signal'; export { motor } from './devices/motor'; export type { MotorOptions } from './devices/motor'; -export { detector, mapLinearClamped, OPACITY_SUFFIX, MODE_SUFFIX } from './devices/detector'; +export { shutter, SHUTTER_OPEN_VALUE, SHUTTER_CLOSED_VALUE } from './devices/shutter'; +export type { ShutterOptions } from './devices/shutter'; +export { + detector, + mapLinearClamped, + OPACITY_SUFFIX, + MODE_SUFFIX, + overlayCenterXSuffix, + overlayCenterYSuffix, +} from './devices/detector'; export type { DetectorConfig, DetectorImageConfig, DetectorModulation, + DetectorOverlay, + AxisBinding, ModulationPoint, } from './devices/detector'; @@ -48,7 +59,10 @@ export { createSimDetectorCameraSocketFactory, renderDetectorFrame, } from './camera/createSimDetectorCameraSocketFactory'; -export type { SimDetectorCameraOptions } from './camera/createSimDetectorCameraSocketFactory'; +export type { + SimDetectorCameraOptions, + RenderLayer, +} from './camera/createSimDetectorCameraSocketFactory'; export type { CameraSocketLike, CameraSocketFactory, diff --git a/src/lib/ophyd-sim/scenarios/beamstopBeamline.ts b/src/lib/ophyd-sim/scenarios/beamstopBeamline.ts index 8d919ca4..80a9f2dc 100644 --- a/src/lib/ophyd-sim/scenarios/beamstopBeamline.ts +++ b/src/lib/ophyd-sim/scenarios/beamstopBeamline.ts @@ -1,6 +1,7 @@ import { createOphydSim } from '../core/createOphydSim'; import { motor } from '../devices/motor'; import { signal } from '../devices/signal'; +import { shutter, SHUTTER_OPEN_VALUE } from '../devices/shutter'; import { detector, type DetectorConfig } from '../devices/detector'; import { randomNoise } from '../generators/noise'; import { @@ -26,14 +27,21 @@ export const simDetectorConfig = rawSimDetectorConfig as DetectorConfig; * sets the DCM Bragg angle, which shifts the * beam vertically and therefore changes the * current at a fixed beamstop position. + * - bl531:LJT4:1:AO0 — beam shutter analog output (writable; the + * PV the component controls). + * 0 V = Open, 5 V = Closed. Defaults to Open. * - bl201-beamstop:current — beamstop diode current, derived from the * two readbacks AND the energy via the shared * beamstopCurrentModel. Peaks when the stop is * centered on the (energy-dependent) beam, * which is what the "best option" logic hunts. + * Reads 0 (plus noise) unless the shutter is + * open, since no beam reaches the diode while + * it is closed. * * Motors start off the optimum so "Go To Best" has somewhere to move to. */ +export const SHUTTER_PV = 'bl531:LJT4:1:AO0'; export const beamstopBeamline = createOphydSim({ devices: [ motor({ @@ -50,6 +58,23 @@ export const beamstopBeamline = createOphydSim({ limits: [-10, 10], units: 'mm', }), + // Sample-holder stage: two independent linear axes that translate the + // sample-holder graphic in . Start centered so the + // holder sits on the beam by default. + motor({ + name: 'bl531:sample_x_mm', + initialPosition: 0, + velocity: 2, + limits: [-10, 10], + units: 'mm', + }), + motor({ + name: 'bl531:sample_y_mm', + initialPosition: 0, + velocity: 2, + limits: [-10, 10], + units: 'mm', + }), motor({ name: ENERGY_PV, initialPosition: ENERGY_REF_EV, @@ -57,12 +82,26 @@ export const beamstopBeamline = createOphydSim({ units: 'eV', limits: [ENERGY_MIN_EV, ENERGY_MAX_EV], }), + // Beam shutter: writable analog output (0 V Open / 5 V Closed). Defaults + // to Open so the diode reads the modelled current unless something + // deliberately blocks the beam. Seeded before the diode so its dependsOn + // resolves at registration. + shutter({ name: SHUTTER_PV, initial: 'open' }), signal({ name: 'bl201-beamstop:current', units: 'A', periodMs: 100, - dependsOn: ['bl531_xps2:beamstop_x_mm.RBV', 'bl531_xps2:beamstop_y_mm.RBV', ENERGY_PV], + dependsOn: [ + 'bl531_xps2:beamstop_x_mm.RBV', + 'bl531_xps2:beamstop_y_mm.RBV', + ENERGY_PV, + SHUTTER_PV, + ], value: ({ get, random }) => { + // Beam reaches the diode only when the shutter is open; any other + // value (closed at 5 V, or mid-transit) reads a clean zero — no + // beam means no signal and no measurement noise. + if (get.number(SHUTTER_PV) !== SHUTTER_OPEN_VALUE) return 0; const current = beamstopCurrentModel({ x: get.number('bl531_xps2:beamstop_x_mm.RBV'), y: get.number('bl531_xps2:beamstop_y_mm.RBV'), diff --git a/src/lib/ophyd-sim/scenarios/simDetector.json b/src/lib/ophyd-sim/scenarios/simDetector.json index 8c102f11..3b0cd7af 100644 --- a/src/lib/ophyd-sim/scenarios/simDetector.json +++ b/src/lib/ophyd-sim/scenarios/simDetector.json @@ -1,10 +1,33 @@ { "prefix": "13SIM1", "image": { - "mode": "noisy", + "mode": "image_file", "sizeX": 512, "sizeY": 512, - "file": "/images/als_logo_wheel.png" + "files": [ + "/images/det_1m_1.png", + "/images/det_1m_2.png", + "/images/det_1m_3.png" + ], + "overlays": [ + { + "file": "/images/det_1m_beamstop.png", + "width": 512, + "height": 512, + "x": 256, + "y": 256, + "positionX": { + "source": "bl531_xps2:beamstop_x_mm.RBV", + "from": { "in": -10, "out": -68 }, + "to": { "in": 10, "out": 450 } + }, + "positionY": { + "source": "bl531_xps2:beamstop_y_mm.RBV", + "from": { "in": -10, "out": 555.4 }, + "to": { "in": 10, "out": 43.4 } + } + } + ] }, "modulations": [ { diff --git a/src/testing/tests/ophyd-sim/detector.test.ts b/src/testing/tests/ophyd-sim/detector.test.ts index a8f3b471..a38447f9 100644 --- a/src/testing/tests/ophyd-sim/detector.test.ts +++ b/src/testing/tests/ophyd-sim/detector.test.ts @@ -84,6 +84,61 @@ describe('detector', () => { const sim = makeSim({ ...config, modulations: [] }); expect(sim.get('13SIM1:image1:Opacity')).toBeUndefined(); }); + + it('seeds overlay center PVs and binds them to a source PV', () => { + const overlayConfig: DetectorConfig = { + prefix: '13SIM1', + image: { + mode: 'image_file', + sizeX: 512, + sizeY: 512, + file: '/base.png', + overlays: [ + { + file: '/dot.png', + width: 48, + height: 48, + x: 256, + y: 256, + positionX: { + source: 'bl531_xps2:beamstop_x_mm.RBV', + from: { in: -10, out: 0 }, + to: { in: 10, out: 512 }, + }, + }, + ], + }, + }; + const sim = createOphydSim({ + devices: [ + signal({ + name: 'bl531_xps2:beamstop_x_mm.RBV', + initialValue: 0, + writeAccess: true, + }), + detector(overlayConfig), + ], + }); + + // Bound X: 0 mm maps to the canvas center; the unbound Y keeps its static seed. + expect(sim.get('13SIM1:image1:Overlay1:CenterX')).toBeCloseTo(256, 6); + expect(sim.get('13SIM1:image1:Overlay1:CenterY')).toBe(256); + + // Moving the source PV drives the bound coordinate (clamped to the px range). + sim.set('bl531_xps2:beamstop_x_mm.RBV', 10); + expect(sim.get('13SIM1:image1:Overlay1:CenterX')).toBeCloseTo(512, 6); + sim.set('bl531_xps2:beamstop_x_mm.RBV', 100); + expect(sim.get('13SIM1:image1:Overlay1:CenterX')).toBeCloseTo(512, 6); + }); +}); + +describe('simDetector.json overlay', () => { + it('ties the overlay center to the beamstop motor readbacks', () => { + const json = simDetectorConfig as DetectorConfig; + const overlay = json.image.overlays?.[0]; + expect(overlay?.positionX?.source).toBe('bl531_xps2:beamstop_x_mm.RBV'); + expect(overlay?.positionY?.source).toBe('bl531_xps2:beamstop_y_mm.RBV'); + }); }); describe('simDetector.json', () => { diff --git a/src/testing/tests/ophyd-sim/shutter.test.ts b/src/testing/tests/ophyd-sim/shutter.test.ts new file mode 100644 index 00000000..ae79190b --- /dev/null +++ b/src/testing/tests/ophyd-sim/shutter.test.ts @@ -0,0 +1,56 @@ +import { describe, it, expect } from 'vitest'; +import { createOphydSim } from '../../../lib/ophyd-sim/core/createOphydSim'; +import { signal } from '../../../lib/ophyd-sim/devices/signal'; +import { + shutter, + SHUTTER_OPEN_VALUE, + SHUTTER_CLOSED_VALUE, +} from '../../../lib/ophyd-sim/devices/shutter'; + +const PV = 'bl531:LJT4:1:AO0'; + +describe('shutter', () => { + it('seeds a writable analog PV, open by default', () => { + const sim = createOphydSim({ devices: [shutter({ name: PV })] }); + + expect(sim.get(PV)).toBe(SHUTTER_OPEN_VALUE); + expect(sim.metadata(PV)?.write_access).toBe(true); + expect(sim.metadata(PV)?.units).toBe('V'); + }); + + it('seeds the closed value when initial is "closed"', () => { + const sim = createOphydSim({ devices: [shutter({ name: PV, initial: 'closed' })] }); + + expect(sim.get(PV)).toBe(SHUTTER_CLOSED_VALUE); + }); + + it('honors custom open/closed values', () => { + const sim = createOphydSim({ + devices: [shutter({ name: PV, openValue: 1, closedValue: 10, initial: 'closed' })], + }); + + expect(sim.get(PV)).toBe(10); + }); + + it('gates a downstream signal off unless the shutter is open', () => { + const sim = createOphydSim({ + devices: [ + shutter({ name: PV, initial: 'open' }), + signal({ + name: 'diode', + dependsOn: [PV], + // Beam reaches the diode only at the open value. + value: ({ get }) => (get.number(PV) === SHUTTER_OPEN_VALUE ? 100 : 0), + }), + ], + }); + + expect(sim.get('diode')).toBe(100); + + sim.set(PV, SHUTTER_CLOSED_VALUE); + expect(sim.get('diode')).toBe(0); + + sim.set(PV, SHUTTER_OPEN_VALUE); + expect(sim.get('diode')).toBe(100); + }); +}); From 46dea116754bba27d1d75c1e380ac72e51fbd5b8 Mon Sep 17 00:00:00 2001 From: Prinstar Date: Mon, 20 Jul 2026 11:26:51 -0700 Subject: [PATCH 05/12] Implement ophyd device simulation --- src/app/pages/AllComponentsPage.tsx | 18 +- src/app/pages/TestPage.tsx | 108 +++++++--- src/components/Camera/CameraCanvas.tsx | 7 + .../Camera/hooks/useCameraCanvas.ts | 40 +++- src/components/TableDeviceController.tsx | 62 ++++-- .../TableDeviceControllerWithRBV.tsx | 192 ++++++++++++++++++ .../ComponentViewerExampleSim.tsx | 4 +- src/lib/ophyd-sim/devices/hexapod.ts | 167 +++++++++++++++ src/lib/ophyd-sim/index.ts | 3 + .../ophyd-sim/scenarios/beamstopBeamline.ts | 4 +- .../ophyd-sim/scenarios/hexapodBeamline.ts | 23 +++ src/lib/ophyd-sim/scenarios/simDetector.json | 8 +- src/testing/tests/ophyd-sim/hexapod.test.ts | 106 ++++++++++ 13 files changed, 686 insertions(+), 56 deletions(-) create mode 100644 src/components/TableDeviceControllerWithRBV.tsx create mode 100644 src/lib/ophyd-sim/devices/hexapod.ts create mode 100644 src/lib/ophyd-sim/scenarios/hexapodBeamline.ts create mode 100644 src/testing/tests/ophyd-sim/hexapod.test.ts diff --git a/src/app/pages/AllComponentsPage.tsx b/src/app/pages/AllComponentsPage.tsx index bfb886cf..ebaaa90d 100644 --- a/src/app/pages/AllComponentsPage.tsx +++ b/src/app/pages/AllComponentsPage.tsx @@ -1,10 +1,16 @@ -import { useState } from 'react'; +import { useMemo, useState } from 'react'; import ComponentViewerExampleReal from '@/features/ComponentViewer/ComponentViewerExampleReal'; import ComponentViewerExampleSim from '@/features/ComponentViewer/ComponentViewerExampleSim'; +import { OphydTransportProvider } from '@/api/ophyd/OphydTransportProvider'; +import { OphydSimProvider, createOphydSimTransport, hexapodBeamline } from '@/lib/ophyd-sim'; import { Cube, CubeTransparent } from '@phosphor-icons/react'; export default function AllComponentsPage() { const [mode, setMode] = useState<'real' | 'sim'>('sim'); + // The sim connects through useOphydSocket, so it needs a sim + // transport in context — otherwise it opens a real WebSocket. Scope the + // providers to the sim view only, so real mode keeps its live backend. + const hexapodTransport = useMemo(() => createOphydSimTransport(hexapodBeamline), []); return (
@@ -38,7 +44,15 @@ export default function AllComponentsPage() {
- {mode === 'real' ? : } + {mode === 'real' ? ( + + ) : ( + + + + + + )} ); } diff --git a/src/app/pages/TestPage.tsx b/src/app/pages/TestPage.tsx index f018dacb..706f52f1 100644 --- a/src/app/pages/TestPage.tsx +++ b/src/app/pages/TestPage.tsx @@ -6,6 +6,7 @@ import { beamstopCurrentModel, simDetectorConfig, createSimDetectorCameraSocketFactory, + SHUTTER_OPEN_VALUE, } from '@/lib/ophyd-sim'; import { useEffect, useMemo, useState } from 'react'; import { createPortal } from 'react-dom'; @@ -18,11 +19,15 @@ import EnergyVsCurrentPlotPV from '@/components/EnergyVsCurrentPlotPV'; import Button from '@/components/Button'; import { HUB_HEADER_RIGHT_SLOT_ID } from '@/components/HubHeader'; import EndstationDisplay from '@/components/EndstationDisplay/EndstationDisplay'; +import TableDeviceControllerWithRBV from '@/components/TableDeviceControllerWithRBV'; const BEAMSTOP_CURRENT = 'bl201-beamstop:current'; const BEAMSTOP_X = 'bl531_xps2:beamstop_x_mm'; const BEAMSTOP_Y = 'bl531_xps2:beamstop_y_mm'; const BEAMSTOP_ENERGY = 'bl531:mono_energy_eV'; +/** Shared height for the device table and the beamstop-current plot beside it, + * so the two panels line up. Sized to fit the table's fixed five rows. */ +const PANEL_HEIGHT = 'h-[280px]'; /** Beamstop motor travel (mm); both axes are symmetric [-LIMIT, +LIMIT]. */ const BEAMSTOP_LIMIT_MM = 10; @@ -67,22 +72,35 @@ function findPeakPosition(energyEV: number) { * camera, so moves made here update those views live. */ const BEAMLINE_DEVICES = [ - 'bl531:mono_energy_eV', - 'bl531:sample_x_mm', - 'bl531:sample_y_mm', 'bl531_xps2:beamstop_x_mm', 'bl531_xps2:beamstop_y_mm', + 'bl531:sample_x_mm', + 'bl531:sample_y_mm', + 'bl531:mono_energy_eV', +]; +const BEAMLINE_DEVICES_RBV = [ + 'bl531_xps2:beamstop_x_mm.RBV', + 'bl531_xps2:beamstop_y_mm.RBV', + 'bl531:sample_x_mm.RBV', + 'bl531:sample_y_mm.RBV', + 'bl531:mono_energy_eV.RBV', ]; function BeamlineDeviceTable() { const { devices, handleSetValueRequest, toggleDeviceLock, toggleExpand } = useOphydPVSocket(BEAMLINE_DEVICES); + + const { devices:devicesRBV} = + useOphydPVSocket(BEAMLINE_DEVICES_RBV); return ( - ); } @@ -133,6 +151,25 @@ function BeamstopBestOption() { ); } +/** Shutter analog-output PV (0 V open / 5 V closed) — matches the default. */ +const SHUTTER_PV = 'bl531:LJT4:1:AO0'; + +/** + * Simulated detector, paused whenever the beam shutter is not open. Subscribes + * to the shutter PV and hands `CameraCanvas` a controlled `paused` flag so the + * stream stops when the shutter closes and resumes when it reopens. + */ +function SimulatedDetector() { + const deviceList = useMemo(() => [SHUTTER_PV], []); + const { devices } = useOphydPVSocket(deviceList); + const shutterOpen = Number(devices[SHUTTER_PV]?.value) === SHUTTER_OPEN_VALUE; + return ( +
+ +
+ ); +} + /** * Renders the shutter control into the app header's right-side slot. It stays * inside TestPage's Ophyd sim providers (so it keeps driving the simulated @@ -150,31 +187,46 @@ function HeaderShutter() { function TestPageBody() { return ( -
+
- {/* Layered SVG view of the same beamline; reacts to the shutter + beamstop PVs. */} - - {/* Beam energy, sample X/Y, and beamstop X/Y controls in one table. */} - - {/* Beamstop current over time. */} - - {/* Beamstop current vs. selected beam energy, keyed by beamstop X/Y position. */} - - {/* Tracks the best beamstop position seen and jumps back to it. */} - - {/* No socketFactory prop — the sim factory is supplied via context below. */} - + {/* Top row: endstation graphic top-left, simulated detector to its + * right, both image panels pinned to the same height (IMAGE_H). The + * graphic's width follows from its 485/215 aspect ratio; the detector + * canvas is scaled to match via the child selector. Wraps on narrow + * screens. */} +
+ {/* Layered view of the beamline; reacts to the shutter + beamstop PVs. */} + + {/* Simulated detector — scaled to the shared height and paused + * while the shutter is closed. No socketFactory prop — the sim + * factory is supplied via context below. */} + +
+ {/* Device table with the live beamstop-current trend to its side. */} +
+ {/* Beam energy, sample X/Y, and beamstop X/Y controls in one table. */} + + {/* Beamstop current over time. */} + +
+ {/* Energy sweep plot and peak-finder. */} +
+ {/* Beamstop current vs. selected beam energy, keyed by beamstop X/Y position. */} + + {/* Finds the peak-current beamstop position and jumps there. */} + +
); } diff --git a/src/components/Camera/CameraCanvas.tsx b/src/components/Camera/CameraCanvas.tsx index d7a88736..5b8bba74 100644 --- a/src/components/Camera/CameraCanvas.tsx +++ b/src/components/Camera/CameraCanvas.tsx @@ -14,6 +14,13 @@ export type CameraCanvasProps = { prefix?: string; /** WebSocket URL for the image stream. Falls back to the application default when omitted. */ wsUrl?: string; + /** Begin acquisition automatically on mount instead of waiting for the Acquire button. */ + autoStart?: boolean; + /** + * Externally control acquisition: pauses the stream when `true`, resumes when + * `false`, on each change. Leave undefined for fully manual control. + */ + paused?: boolean; }; export default function CameraCanvas(props: CameraCanvasProps) { diff --git a/src/components/Camera/hooks/useCameraCanvas.ts b/src/components/Camera/hooks/useCameraCanvas.ts index 52b94848..ce995cd1 100644 --- a/src/components/Camera/hooks/useCameraCanvas.ts +++ b/src/components/Camera/hooks/useCameraCanvas.ts @@ -12,6 +12,14 @@ export type UseCameraCanvasProps = { canvasSize?: CanvasSizes; prefix?: string; wsUrl?: string; + /** Begin acquisition automatically on mount instead of waiting for the Acquire button. */ + autoStart?: boolean; + /** + * Externally control acquisition. When provided, the stream starts on `false` + * and pauses on `true` — each time the value changes. Leave undefined to keep + * acquisition fully manual (Acquire / Pause buttons). + */ + paused?: boolean; }; export function useCameraCanvas({ @@ -20,6 +28,8 @@ export function useCameraCanvas({ canvasSize = 'medium', prefix = '', wsUrl, + autoStart = false, + paused, }: UseCameraCanvasProps) { const socketFactory = useCameraSocketFactory(); const canvasRef = useRef(null); @@ -263,9 +273,9 @@ export function useCameraCanvas({ }, [resolvedWsUrl, getImageArrayPV, getSizePVs, canvasSize, socketFactory]); useEffect(() => { - // The stream starts paused — the user begins acquisition via the - // Acquire button (startWebSocket). We only register the unmount cleanup - // so a socket opened during this mount is torn down on unmount. + // By default the stream starts paused — the user begins acquisition via + // the Acquire button (startWebSocket). We only register the unmount + // cleanup so a socket opened during this mount is torn down on unmount. return () => { if (ws.current) { ws.current.close(); @@ -273,6 +283,30 @@ export function useCameraCanvas({ }; }, []); // Empty dependency array — cleanup only; acquisition is user-driven + // Optionally begin acquisition on mount. Guarded so it fires once and does + // not reconnect if startWebSocket's identity changes. + const hasAutoStarted = useRef(false); + useEffect(() => { + if (autoStart && !hasAutoStarted.current) { + hasAutoStarted.current = true; + startWebSocket(); + } + }, [autoStart, startWebSocket]); + + // Externally-controlled acquisition. Act only on an actual change of `paused` + // so unrelated re-renders (or startWebSocket identity changes) don't churn the + // socket, and manual Acquire/Pause between changes still works. + const prevPaused = useRef(undefined); + useEffect(() => { + if (paused === undefined || prevPaused.current === paused) return; + prevPaused.current = paused; + if (paused) { + closeWebSocket(); + } else { + startWebSocket(); + } + }, [paused, startWebSocket, closeWebSocket]); + return { canvasRef, fps, diff --git a/src/components/TableDeviceController.tsx b/src/components/TableDeviceController.tsx index b16cba55..c1fa383a 100644 --- a/src/components/TableDeviceController.tsx +++ b/src/components/TableDeviceController.tsx @@ -1,6 +1,6 @@ import { useEffect, useState } from 'react'; -import { Lock, LockOpen } from '@phosphor-icons/react'; +import { Lock, LockOpen, CaretDown } from '@phosphor-icons/react'; import { Table, TableHeader, TableHead, TableBody, TableRow, TableCell } from './ui/table'; import ControllerAbsoluteMove from './ControllerAbsoluteMove'; import ControllerRelativeMove from './ControllerRelativeMove'; @@ -16,6 +16,12 @@ export type TableDeviceControllerProps = { toggleDeviceLock: (deviceName: string, locked: boolean) => void; /** Called to toggle the expanded state for a device row, showing or hiding its raw JSON data. */ toggleExpand: (deviceName: string) => void; + /** + * When true, the Relative Move column starts collapsed (hidden on render) and + * the column header becomes a toggle that reveals it. Defaults to false, so + * the relative-move controls are always shown. + */ + collapsibleRelativeMove?: boolean; /** Additional CSS classes applied to the root container. */ className?: string; }; @@ -25,11 +31,15 @@ export default function TableDeviceController({ handleSetValueRequest, toggleDeviceLock, toggleExpand, + collapsibleRelativeMove = false, className, ...props }: TableDeviceControllerProps) { // State to track flashing rows const [flashingRows, setFlashingRows] = useState>({}); + // Relative Move column visibility. When collapsible, it starts hidden; when + // not, it is permanently open (no toggle rendered). + const [isRelativeMoveOpen, setIsRelativeMoveOpen] = useState(!collapsibleRelativeMove); useEffect(() => { const updatedFlashingRows: Record = {}; @@ -68,7 +78,25 @@ export default function TableDeviceController({ Absolute Move - Relative Move + {collapsibleRelativeMove ? ( + + ) : ( + 'Relative Move' + )} @@ -123,19 +151,23 @@ export default function TableDeviceController({ /> - - input !== null && - handleSetValueRequest(deviceName, input) - } - inputLabel={device.units && device.units.slice(0, 3)} - currentValue={ - typeof device.value === 'number' ? device.value : null - } - classNameInput="bg-sky-200 shadow-inner rounded-md" - locked={device.locked} - /> + {isRelativeMoveOpen && ( + + input !== null && + handleSetValueRequest(deviceName, input) + } + inputLabel={device.units && device.units.slice(0, 3)} + currentValue={ + typeof device.value === 'number' + ? device.value + : null + } + classNameInput="bg-sky-200 shadow-inner rounded-md" + locked={device.locked} + /> + )} ); diff --git a/src/components/TableDeviceControllerWithRBV.tsx b/src/components/TableDeviceControllerWithRBV.tsx new file mode 100644 index 00000000..d897ba88 --- /dev/null +++ b/src/components/TableDeviceControllerWithRBV.tsx @@ -0,0 +1,192 @@ +import { useEffect, useState } from 'react'; + +import { Lock, LockOpen, CaretDown } from '@phosphor-icons/react'; +import { Table, TableHeader, TableHead, TableBody, TableRow, TableCell } from './ui/table'; +import ControllerAbsoluteMove from './ControllerAbsoluteMove'; +import ControllerRelativeMove from './ControllerRelativeMove'; +import { Devices, Device } from '@/types/deviceControllerTypes'; +import { cn } from '@/lib/utils'; + +export type TableDeviceControllerWithRBVProps = { + /** Map of device names to their current state objects. Each entry renders as one table row. */ + devices: Devices; + devicesRBV: Devices; + /** Called when the user submits an absolute or relative move value for a device. */ + handleSetValueRequest: (deviceName: string, value: number) => void; + /** Called to toggle the locked state for a device, enabling or disabling its move controls. */ + toggleDeviceLock: (deviceName: string, locked: boolean) => void; + /** Called to toggle the expanded state for a device row, showing or hiding its raw JSON data. */ + toggleExpand: (deviceName: string) => void; + /** + * When true, the Relative Move column starts collapsed (hidden on render) and + * the column header becomes a toggle that reveals it. Defaults to false, so + * the relative-move controls are always shown. + */ + collapsibleRelativeMove?: boolean; + /** Additional CSS classes applied to the root container. */ + className?: string; +}; + +export default function TableDeviceControllerWithRBV({ + devices, + devicesRBV, + handleSetValueRequest, + toggleDeviceLock, + toggleExpand, + collapsibleRelativeMove = false, + className, + ...props +}: TableDeviceControllerWithRBVProps) { + // State to track flashing rows + const [flashingRows, setFlashingRows] = useState>({}); + // Relative Move column visibility. When collapsible, it starts hidden; when + // not, it is permanently open (no toggle rendered). + const [isRelativeMoveOpen, setIsRelativeMoveOpen] = useState(!collapsibleRelativeMove); + + const getFormattedValue = (device: Device) => { + //Returns the formatted valiues of devices RBV, If it exists in device RBV + // Otherwise, just returns that devices formatted value. + if ((device.pv +'.RBV') in devicesRBV){ + const readbackDevice = devicesRBV[(device.pv + '.RBV')] + return `${typeof readbackDevice.value === 'number' ? readbackDevice.value.toPrecision(4) : readbackDevice.value} ${readbackDevice.units ? readbackDevice.units.slice(0, 3) : 'n/a'}` + + }else{ + return `${typeof device.value === 'number' ? device.value.toPrecision(4) : device.value} ${device.units ? device.units.slice(0, 3) : 'n/a'}` + } + } + useEffect(() => { + const updatedFlashingRows: Record = {}; + const currentTime = Date.now() / 1000; // Current time in seconds + + Object.keys(devices).forEach((deviceName) => { + const device = devices[deviceName]; + if (device.timestamp && currentTime - device.timestamp <= 0.03) { + updatedFlashingRows[deviceName] = true; + + // Remove the flash effect after 1 second timeout, this timeout needs to match the animation duration of the tailwind class to avoid flutter effect + setTimeout(() => { + setFlashingRows((prev) => ({ + ...prev, + [deviceName]: false, + })); + }, 500); + } + }); + + setFlashingRows(updatedFlashingRows); + }, [devices]); + return ( +
+ + + + Device Name + + Current Value + + + Absolute Move + + + {collapsibleRelativeMove ? ( + + ) : ( + 'Relative Move' + )} + + + + + {Object.keys(devices).map((deviceName) => { + const device = devices[deviceName]; + return ( + + toggleExpand(deviceName)} + > + <> +
+ +

{deviceName}

+
+ {device.expanded && ( +
+                                                {JSON.stringify(device, null, 2)}
+                                            
+ )} + +
+ + {getFormattedValue(device)} + + + + input !== null && + handleSetValueRequest(deviceName, input) + } + inputLabel={device.units && device.units.slice(0, 3)} + classNameInput="bg-sky-200 shadow-inner rounded-md" + locked={device.locked} + /> + + + {isRelativeMoveOpen && ( + + input !== null && + handleSetValueRequest(deviceName, input) + } + inputLabel={device.units && device.units.slice(0, 3)} + currentValue={ + typeof device.value === 'number' + ? device.value + : null + } + classNameInput="bg-sky-200 shadow-inner rounded-md" + locked={device.locked} + /> + )} + +
+ ); + })} +
+
+
+ ); +} diff --git a/src/features/ComponentViewer/ComponentViewerExampleSim.tsx b/src/features/ComponentViewer/ComponentViewerExampleSim.tsx index bf1db3bc..a6026299 100644 --- a/src/features/ComponentViewer/ComponentViewerExampleSim.tsx +++ b/src/features/ComponentViewer/ComponentViewerExampleSim.tsx @@ -47,8 +47,8 @@ export default function ComponentViewerExampleSim() { }, SimControl4: { name: 'Hexapod Controller', - element: , - info: 'This component accepts a prefix intended for an EPICS hexapod device, and connects via useOphydSocketPV. This display utilizes a demo mode with a simulated device.', + element: , + info: 'This component accepts a prefix intended for an EPICS hexapod device, and connects via useOphydSocketPV. This display is wired to the ophyd-sim hexapod (prefix SYM:HEX01) through the OphydSimProvider on this page.', }, SimMonitor1: { name: 'Signal Monitor Plot', diff --git a/src/lib/ophyd-sim/devices/hexapod.ts b/src/lib/ophyd-sim/devices/hexapod.ts new file mode 100644 index 00000000..1a7d9009 --- /dev/null +++ b/src/lib/ophyd-sim/devices/hexapod.ts @@ -0,0 +1,167 @@ +import type { DeviceFactory, SimValue } from '../core/types'; + +export interface HexapodOptions { + /** Device PV prefix (e.g. 'SYM:HEX01'). Defaults to 'SYM:HEX01'. */ + prefix?: string; + /** Translation-axis velocity in mm/s. Defaults to 4. */ + translationVelocity?: number; + /** Rotation-axis velocity in deg/s. Defaults to 2. */ + rotationVelocity?: number; + /** Translation soft limits (mm). Defaults to [-10, 10]. */ + translationLimits?: [number, number]; + /** Rotation soft limits (deg). Defaults to [-5, 5]. */ + rotationLimits?: [number, number]; + /** Settle tolerance in axis units. Defaults to 1e-4. */ + epsilon?: number; +} + +type Axis = 'tx' | 'ty' | 'tz' | 'rx' | 'ry' | 'rz'; +const TRANSLATION_AXES: Axis[] = ['tx', 'ty', 'tz']; +const ROTATION_AXES: Axis[] = ['rx', 'ry', 'rz']; +const AXES: Axis[] = [...TRANSLATION_AXES, ...ROTATION_AXES]; + +const DEFAULT_PREFIX = 'SYM:HEX01'; + +const clamp = (value: number, [lower, upper]: [number, number]) => + Math.min(upper, Math.max(lower, value)); + +/** + * Symetrie six-axis hexapod, modelled entirely as signals — the device has + * explicit `_RBV` readbacks separate from its setpoints, so it does not map + * cleanly onto the linear `motor()` (one setpoint ⇒ one readback). Instead each + * axis owns a readback that animates toward a captured target, and the move is + * gated by the shared `MOVE_PTP` command PV, mirroring the real controller. + * + * PVs, relative to `prefix` (matching hexapodUtils.ts): + * - `s_uto_{tx,ty,tz}_RBV` — translation readbacks (mm), read-only + * - `s_uto_{rx,ry,rz}_RBV` — rotation readbacks (deg), read-only + * - `MOVE_PTP:{Tx,Ty,Tz,Rx,Ry,Rz}` — per-axis setpoints (writable "goals") + * - `MOVE_PTP` — execute command: write 1 to move all axes to + * their setpoints; auto-returns to 0 + * - `MOVE_PTP:MoveType` — 0 = absolute, 1 = relative + * - `s_hexa:InPosition_RBV` — 1 when settled/stopped, 0 while moving + * - `STOP` — write 1 to halt immediately; auto-returns to 0 + * + * Writing a setpoint alone does nothing; motion only begins on the 0→1 edge of + * `MOVE_PTP`, at which point targets are captured (absolute, or added to the + * current readback when relative) and clamped to the axis limits. + */ +export function hexapod(opts: HexapodOptions = {}): DeviceFactory { + return (reg) => { + const prefix = opts.prefix ?? DEFAULT_PREFIX; + const translationVelocity = opts.translationVelocity ?? 4; + const rotationVelocity = opts.rotationVelocity ?? 2; + const translationLimits = opts.translationLimits ?? [-10, 10]; + const rotationLimits = opts.rotationLimits ?? [-5, 5]; + const epsilon = opts.epsilon ?? 1e-4; + + const pv = (suffix: string) => `${prefix}:${suffix}`; + const rbvPV = (axis: Axis) => pv(`s_uto_${axis}_RBV`); + const setpointPV = (axis: Axis) => pv(`MOVE_PTP:${axis[0].toUpperCase()}${axis[1]}`); + const executeAllPV = pv('MOVE_PTP'); + const inPositionPV = pv('s_hexa:InPosition_RBV'); + const stopPV = pv('STOP'); + const moveTypePV = pv('MOVE_PTP:MoveType'); + + const axisConfig = (axis: Axis) => { + const isRotation = ROTATION_AXES.includes(axis); + return { + units: isRotation ? 'deg' : 'mm', + limits: isRotation ? rotationLimits : translationLimits, + velocity: isRotation ? rotationVelocity : translationVelocity, + }; + }; + + // Seed readbacks + setpoints for every axis. Readbacks are read-only; + // setpoints are writable goals the controller stages before executing. + AXES.forEach((axis) => { + const { units, limits } = axisConfig(axis); + const [lower, upper] = limits; + reg.seed(rbvPV(axis), 0, { + units, + lower_ctrl_limit: lower, + upper_ctrl_limit: upper, + read_access: true, + write_access: false, + precision: 4, + }); + reg.seed(setpointPV(axis), 0, { + units, + lower_ctrl_limit: lower, + upper_ctrl_limit: upper, + read_access: true, + write_access: true, + precision: 4, + }); + }); + + reg.seed(executeAllPV, 0, { read_access: true, write_access: true }); + reg.seed(moveTypePV, 0, { + read_access: true, + write_access: true, + enum_strs: ['Absolute', 'Relative'], + }); + reg.seed(stopPV, 0, { read_access: true, write_access: true }); + // Starts settled (in position) at the all-zero home pose. + reg.seed(inPositionPV, 1, { + read_access: true, + write_access: false, + enum_strs: ['Moving', 'InPosition'], + }); + + // The pose each readback is currently animating toward. Equal to the + // readbacks at rest, so no motion happens until MOVE_PTP captures targets. + const targets: Record = { tx: 0, ty: 0, tz: 0, rx: 0, ry: 0, rz: 0 }; + + const asNumber = (value: SimValue | undefined) => Number(value ?? 0); + + // MOVE_PTP command: on the 0→1 edge, capture per-axis targets from the + // staged setpoints (absolute) or offset from the current readback + // (relative), clamp to limits, and begin moving. Return to 0 so the next + // write re-triggers. + reg.onSet(executeAllPV, (value) => { + if (asNumber(value) !== 1) return; + const relative = asNumber(reg.get(moveTypePV)) === 1; + AXES.forEach((axis) => { + const setpoint = asNumber(reg.get(setpointPV(axis))); + const current = asNumber(reg.get(rbvPV(axis))); + const raw = relative ? current + setpoint : setpoint; + targets[axis] = clamp(raw, axisConfig(axis).limits); + }); + reg.set(inPositionPV, 0); + reg.set(executeAllPV, 0); + }); + + // STOP command: freeze every axis at its current readback and settle. + reg.onSet(stopPV, (value) => { + if (asNumber(value) !== 1) return; + AXES.forEach((axis) => { + targets[axis] = asNumber(reg.get(rbvPV(axis))); + }); + reg.set(inPositionPV, 1); + reg.set(stopPV, 0); + }); + + // Advance each readback toward its target at the axis velocity. When all + // axes are within epsilon, snap and mark the hexapod in position. + reg.onTick(({ dt }) => { + let allSettled = true; + AXES.forEach((axis) => { + const target = targets[axis]; + const position = asNumber(reg.get(rbvPV(axis))); + const distance = target - position; + const absDistance = Math.abs(distance); + if (absDistance < epsilon) { + if (position !== target) reg.set(rbvPV(axis), target); + return; + } + allSettled = false; + const step = Math.min(absDistance, axisConfig(axis).velocity * dt); + reg.set(rbvPV(axis), position + Math.sign(distance) * step); + }); + if (allSettled && asNumber(reg.get(inPositionPV)) !== 1) { + reg.set(inPositionPV, 1); + } + }); + }; +} diff --git a/src/lib/ophyd-sim/index.ts b/src/lib/ophyd-sim/index.ts index 47533862..5a329e78 100644 --- a/src/lib/ophyd-sim/index.ts +++ b/src/lib/ophyd-sim/index.ts @@ -22,6 +22,8 @@ export { motor } from './devices/motor'; export type { MotorOptions } from './devices/motor'; export { shutter, SHUTTER_OPEN_VALUE, SHUTTER_CLOSED_VALUE } from './devices/shutter'; export type { ShutterOptions } from './devices/shutter'; +export { hexapod } from './devices/hexapod'; +export type { HexapodOptions } from './devices/hexapod'; export { detector, mapLinearClamped, @@ -84,6 +86,7 @@ export { withOphydSim } from './storybook/decorator'; // Scenarios export { defaultBeamline } from './scenarios/defaultBeamline'; +export { hexapodBeamline } from './scenarios/hexapodBeamline'; export { beamstopBeamline, simDetectorConfig } from './scenarios/beamstopBeamline'; export { beamstopCurrentModel, diff --git a/src/lib/ophyd-sim/scenarios/beamstopBeamline.ts b/src/lib/ophyd-sim/scenarios/beamstopBeamline.ts index 80a9f2dc..496922b8 100644 --- a/src/lib/ophyd-sim/scenarios/beamstopBeamline.ts +++ b/src/lib/ophyd-sim/scenarios/beamstopBeamline.ts @@ -47,14 +47,14 @@ export const beamstopBeamline = createOphydSim({ motor({ name: 'bl531_xps2:beamstop_x_mm', initialPosition: -5, - velocity: 2, + velocity: 0.8, limits: [-10, 10], units: 'mm', }), motor({ name: 'bl531_xps2:beamstop_y_mm', initialPosition: 5, - velocity: 2, + velocity: 0.8, limits: [-10, 10], units: 'mm', }), diff --git a/src/lib/ophyd-sim/scenarios/hexapodBeamline.ts b/src/lib/ophyd-sim/scenarios/hexapodBeamline.ts new file mode 100644 index 00000000..e0785054 --- /dev/null +++ b/src/lib/ophyd-sim/scenarios/hexapodBeamline.ts @@ -0,0 +1,23 @@ +import { createOphydSim } from '../core/createOphydSim'; +import { hexapod } from '../devices/hexapod'; + +/** + * Standalone scenario backing the feature. Provides the single + * Symetrie hexapod device at the default prefix 'SYM:HEX01', matching the PV + * names hexapodUtils.ts generates when no prefix is supplied. + * + * - Translation axes (tx/ty/tz): [-10, 10] mm + * - Rotation axes (rx/ry/rz): [-5, 5] deg + * + * Starts at the all-zero home pose. See {@link hexapod} for the full PV list + * and move semantics. + */ +export const hexapodBeamline = createOphydSim({ + devices: [ + hexapod({ + prefix: 'SYM:HEX01', + translationLimits: [-10, 10], + rotationLimits: [-5, 5], + }), + ], +}); diff --git a/src/lib/ophyd-sim/scenarios/simDetector.json b/src/lib/ophyd-sim/scenarios/simDetector.json index 3b0cd7af..dbece4e9 100644 --- a/src/lib/ophyd-sim/scenarios/simDetector.json +++ b/src/lib/ophyd-sim/scenarios/simDetector.json @@ -18,13 +18,13 @@ "y": 256, "positionX": { "source": "bl531_xps2:beamstop_x_mm.RBV", - "from": { "in": -10, "out": -68 }, - "to": { "in": 10, "out": 450 } + "from": { "in": -10, "out": 218.5 }, + "to": { "in": 10, "out": 278.5 } }, "positionY": { "source": "bl531_xps2:beamstop_y_mm.RBV", - "from": { "in": -10, "out": 555.4 }, - "to": { "in": 10, "out": 43.4 } + "from": { "in": -10, "out": 290.5 }, + "to": { "in": 10, "out": 230.5 } } } ] diff --git a/src/testing/tests/ophyd-sim/hexapod.test.ts b/src/testing/tests/ophyd-sim/hexapod.test.ts new file mode 100644 index 00000000..144c1ca9 --- /dev/null +++ b/src/testing/tests/ophyd-sim/hexapod.test.ts @@ -0,0 +1,106 @@ +import { describe, it, expect } from 'vitest'; +import { createOphydSim } from '../../../lib/ophyd-sim/core/createOphydSim'; +import { hexapod } from '../../../lib/ophyd-sim/devices/hexapod'; + +const P = 'SYM:HEX01'; +const rbv = (axis: string) => `${P}:s_uto_${axis}_RBV`; +const setpoint = (Axis: string) => `${P}:MOVE_PTP:${Axis}`; +const EXECUTE = `${P}:MOVE_PTP`; +const MOVE_TYPE = `${P}:MOVE_PTP:MoveType`; +const IN_POSITION = `${P}:s_hexa:InPosition_RBV`; +const STOP = `${P}:STOP`; + +const makeSim = () => createOphydSim({ devices: [hexapod({ prefix: P })] }); + +/** Run enough simulated time for any in-range move to settle. */ +const settle = (sim: ReturnType) => { + for (let i = 0; i < 300; i++) sim.advance(50); +}; + +describe('hexapod', () => { + it('seeds all six axes at the zero home pose, in position', () => { + const sim = makeSim(); + for (const axis of ['tx', 'ty', 'tz', 'rx', 'ry', 'rz']) { + expect(sim.get(rbv(axis))).toBe(0); + } + expect(sim.get(IN_POSITION)).toBe(1); + }); + + it('exposes translation axes in mm and rotation axes in deg with their limits', () => { + const sim = makeSim(); + const tx = sim.metadata(rbv('tx')); + expect(tx?.units).toBe('mm'); + expect(tx?.lower_ctrl_limit).toBe(-10); + expect(tx?.upper_ctrl_limit).toBe(10); + + const rx = sim.metadata(rbv('rx')); + expect(rx?.units).toBe('deg'); + expect(rx?.lower_ctrl_limit).toBe(-5); + expect(rx?.upper_ctrl_limit).toBe(5); + }); + + it('does not move until MOVE_PTP is executed', () => { + const sim = makeSim(); + sim.set(setpoint('Tx'), 5); + sim.advance(500); + expect(sim.get(rbv('tx'))).toBe(0); + }); + + it('moves readbacks to the staged setpoints on execute, then settles', () => { + const sim = makeSim(); + sim.set(setpoint('Tx'), 5); + sim.set(setpoint('Rx'), 3); + + sim.set(EXECUTE, 1); + // The command PV is momentary — it returns to 0 so the next write re-triggers. + expect(sim.get(EXECUTE)).toBe(0); + expect(sim.get(IN_POSITION)).toBe(0); + + settle(sim); + expect(sim.get(rbv('tx'))).toBeCloseTo(5, 3); + expect(sim.get(rbv('rx'))).toBeCloseTo(3, 3); + expect(sim.get(IN_POSITION)).toBe(1); + }); + + it('adds to the current readback when MoveType is relative', () => { + const sim = makeSim(); + sim.set(setpoint('Tx'), 4); + sim.set(EXECUTE, 1); + settle(sim); + expect(sim.get(rbv('tx'))).toBeCloseTo(4, 3); + + sim.set(MOVE_TYPE, 1); // relative + sim.set(setpoint('Tx'), 3); + sim.set(EXECUTE, 1); + settle(sim); + expect(sim.get(rbv('tx'))).toBeCloseTo(7, 3); + }); + + it('clamps captured targets to the axis limits', () => { + const sim = makeSim(); + sim.set(setpoint('Tx'), 999); + sim.set(setpoint('Rx'), -999); + sim.set(EXECUTE, 1); + settle(sim); + expect(sim.get(rbv('tx'))).toBeCloseTo(10, 3); + expect(sim.get(rbv('rx'))).toBeCloseTo(-5, 3); + }); + + it('halts motion where it is when STOP is written', () => { + const sim = makeSim(); + sim.set(setpoint('Tx'), 10); + sim.set(EXECUTE, 1); + sim.advance(200); // partial travel: 4 mm/s * 0.2s = 0.8 mm + + const mid = sim.get(rbv('tx')) as number; + expect(mid).toBeGreaterThan(0); + expect(mid).toBeLessThan(10); + + sim.set(STOP, 1); + expect(sim.get(STOP)).toBe(0); // momentary + expect(sim.get(IN_POSITION)).toBe(1); + + settle(sim); + expect(sim.get(rbv('tx'))).toBeCloseTo(mid, 3); + }); +}); From 441b1cb6885dabd3dc8159d2961342cb4accb0ca Mon Sep 17 00:00:00 2001 From: Prinstar Date: Tue, 21 Jul 2026 10:50:10 -0700 Subject: [PATCH 06/12] =?UTF-8?q?Fix=20lint=20errors,=20complete=20HubHead?= =?UTF-8?q?er=E2=86=92FinchHeader=20rename,=20resync=20lockfile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Convert single-assignment let bindings to const in createFallbackTransport - Remove unused imports (TableDeviceController, BluetoothSlash) - Add missing useMemo dependency in Beamstop - Finish Hub→Finch rename: FinchHeader component/props and FINCH_HEADER_RIGHT_SLOT_ID, fix TestPage import path - Resync package-lock.json so `npm ci` passes in CI Co-Authored-By: Claude Opus 4.8 (1M context) --- package-lock.json | 138 ++++++++++++++---- .../transport/createFallbackTransport.ts | 7 +- src/app/pages/TestPage.tsx | 16 +- src/components/FinchHeader.tsx | 8 +- .../OphydSocketViewer/useOphydSocketViewer.ts | 32 ++-- src/features/Beamstop.tsx | 16 +- 6 files changed, 142 insertions(+), 75 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3ada9b0d..5f431fae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,15 @@ { "name": "@blueskyproject/finch", - "version": "0.1.8", + "version": "0.1.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@blueskyproject/finch", - "version": "0.1.8", + "version": "0.1.9", "license": "BSD-3-Clause", "dependencies": { - "@blueskyproject/tiled": "^0.0.28", + "@blueskyproject/tiled": "^0.0.30", "@phosphor-icons/react": "^2.1.7", "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-popover": "^1.1.14", @@ -47,7 +47,7 @@ "@types/three": "^0.178.0", "@vitejs/plugin-react": "^4.3.4", "autoprefixer": "^10.4.20", - "axios": "^1.7.9", + "axios": "^1.16.0", "eslint": "^9.17.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-react-hooks": "^5.0.0", @@ -56,6 +56,7 @@ "gh-pages": "^6.3.0", "globals": "^15.13.0", "happy-dom": "^20.8.3", + "husky": "^9.1.7", "jsdom": "^28.1.0", "msw": "^2.8.4", "msw-storybook-addon": "^2.0.4", @@ -447,12 +448,12 @@ } }, "node_modules/@blueskyproject/tiled": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/@blueskyproject/tiled/-/tiled-0.0.28.tgz", - "integrity": "sha512-VTajcGtdBca4pjfLqy1Q9qmNOS4J2q5BAqRYqlDwKJLJVrxU8jaejLPmOrMicXhpW3mhSjD4ZOUIUpvWuOSD/Q==", + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@blueskyproject/tiled/-/tiled-0.0.30.tgz", + "integrity": "sha512-WpmNbXNQN/XyKkNYhbISb925lVkDBUYjnayQl8Gj8x9UK71Q6jYsWwrjRF8PnmZk2pZAZgep9QNuFpEm+FyQIQ==", "license": "BSD-3-Clause", "dependencies": { - "@phosphor-icons/react": "^2.1.7", + "@phosphor-icons/react": "^2.1.10", "@storybook/addons": "^7.6.17", "@storybook/theming": "^8.6.14", "@visx/curve": "^3.12.0", @@ -1923,9 +1924,10 @@ "dev": true }, "node_modules/@phosphor-icons/react": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@phosphor-icons/react/-/react-2.1.7.tgz", - "integrity": "sha512-g2e2eVAn1XG2a+LI09QU3IORLhnFNAFkNbo2iwbX6NOKSLOwvEMmTa7CgOzEbgNWR47z8i8kwjdvYZ5fkGx1mQ==", + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@phosphor-icons/react/-/react-2.1.10.tgz", + "integrity": "sha512-vt8Tvq8GLjheAZZYa+YG/pW7HDbov8El/MANW8pOAz4eGxrwhnbfrQZq0Cp4q8zBEu8NIhHdnr+r8thnfRSNYA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -6349,7 +6351,8 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/autoprefixer": { "version": "10.4.20", @@ -6404,15 +6407,43 @@ } }, "node_modules/axios": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", - "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.1.tgz", + "integrity": "sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==", "dev": true, "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/axios/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/axios/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" } }, "node_modules/balanced-match": { @@ -6943,6 +6974,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -7535,6 +7567,7 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -7760,6 +7793,22 @@ "node": ">= 0.4" } }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es5-ext": { "version": "0.10.64", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", @@ -8429,9 +8478,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "dev": true, "funding": [ { @@ -8439,6 +8488,7 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -8497,14 +8547,17 @@ } }, "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "dev": true, + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -9216,9 +9269,10 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -9285,6 +9339,22 @@ "node": ">= 14" } }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -11430,10 +11500,14 @@ "dev": true }, "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } }, "node_modules/psl": { "version": "1.15.0", diff --git a/src/api/ophyd/transport/createFallbackTransport.ts b/src/api/ophyd/transport/createFallbackTransport.ts index 43419534..f97951a3 100644 --- a/src/api/ophyd/transport/createFallbackTransport.ts +++ b/src/api/ophyd/transport/createFallbackTransport.ts @@ -73,9 +73,6 @@ export function createFallbackTransport( let switched = false; let closedByUser = false; - let detachPrimaryMessage: Unsubscribe | undefined; - let detachPrimaryStatus: Unsubscribe | undefined; - const forwardMessage = (message: TIn): void => { for (const listener of messageListeners) { try { @@ -129,8 +126,8 @@ export function createFallbackTransport( if (!switched) setStatus(next); }; - detachPrimaryMessage = primary.onMessage(forwardMessage); - detachPrimaryStatus = primary.onStatus(onPrimaryStatus); + const detachPrimaryMessage: Unsubscribe | undefined = primary.onMessage(forwardMessage); + const detachPrimaryStatus: Unsubscribe | undefined = primary.onStatus(onPrimaryStatus); return { send(message) { diff --git a/src/app/pages/TestPage.tsx b/src/app/pages/TestPage.tsx index 706f52f1..75cc956c 100644 --- a/src/app/pages/TestPage.tsx +++ b/src/app/pages/TestPage.tsx @@ -13,11 +13,10 @@ import { createPortal } from 'react-dom'; import useOphydPVSocket from '@/api/ophyd/useOphydPVSocket'; import CameraCanvas from '@/components/Camera/CameraCanvas'; import Shutter from '@/components/Shutter'; -import TableDeviceController from '@/components/TableDeviceController'; import SignalMonitorPlotPV from '@/components/SignalMonitorPlotPV'; import EnergyVsCurrentPlotPV from '@/components/EnergyVsCurrentPlotPV'; import Button from '@/components/Button'; -import { HUB_HEADER_RIGHT_SLOT_ID } from '@/components/HubHeader'; +import { FINCH_HEADER_RIGHT_SLOT_ID } from '@/components/FinchHeader'; import EndstationDisplay from '@/components/EndstationDisplay/EndstationDisplay'; import TableDeviceControllerWithRBV from '@/components/TableDeviceControllerWithRBV'; @@ -37,13 +36,7 @@ const BEAMSTOP_LIMIT_MM = 10; * sweep across the full travel, then a fine sweep around the coarse winner. */ function findPeakPosition(energyEV: number) { - const search = ( - xMin: number, - xMax: number, - yMin: number, - yMax: number, - step: number, - ) => { + const search = (xMin: number, xMax: number, yMin: number, yMax: number, step: number) => { let best = { x: 0, y: 0, current: -Infinity }; for (let x = xMin; x <= xMax + 1e-9; x += step) { for (let y = yMin; y <= yMax + 1e-9; y += step) { @@ -90,8 +83,7 @@ function BeamlineDeviceTable() { const { devices, handleSetValueRequest, toggleDeviceLock, toggleExpand } = useOphydPVSocket(BEAMLINE_DEVICES); - const { devices:devicesRBV} = - useOphydPVSocket(BEAMLINE_DEVICES_RBV); + const { devices: devicesRBV } = useOphydPVSocket(BEAMLINE_DEVICES_RBV); return ( (null); useEffect(() => { - setSlot(document.getElementById(HUB_HEADER_RIGHT_SLOT_ID)); + setSlot(document.getElementById(FINCH_HEADER_RIGHT_SLOT_ID)); }, []); if (!slot) return null; // Drives bl531:LJT4:1:AO0 in beamstopBeamline; closing it (5 V) zeroes the diode. diff --git a/src/components/FinchHeader.tsx b/src/components/FinchHeader.tsx index 98c821bc..ffc29dcf 100644 --- a/src/components/FinchHeader.tsx +++ b/src/components/FinchHeader.tsx @@ -1,9 +1,9 @@ import { cn } from '@/lib/utils'; /** DOM id of the header's right-side slot; pages portal controls into this node. */ -export const HUB_HEADER_RIGHT_SLOT_ID = 'hub-header-right-slot'; +export const FINCH_HEADER_RIGHT_SLOT_ID = 'finch-header-right-slot'; -export type HubHeaderProps = { +export type FinchHeaderProps = { /** Title text displayed in the header. */ title?: string; /** URL of the logo image displayed in the header. Ignored when `logoIcon` is provided. */ @@ -29,7 +29,7 @@ export type HubHeaderProps = { * Pass `logoIcon` to render a custom React element as the logo. * If only `logoUrl` is provided, an `` is rendered instead. */ -export default function HubHeader({ +export default function FinchHeader({ title = 'BEAMLINE APP', logoUrl = 'https://img.icons8.com/?size=100&id=11743&format=png&color=000000', logoIcon, @@ -60,7 +60,7 @@ export default function HubHeader({ * Test page's ) into the header without leaving their own * provider tree. */} -
+
{rightSlot}
diff --git a/src/components/OphydSocketViewer/useOphydSocketViewer.ts b/src/components/OphydSocketViewer/useOphydSocketViewer.ts index 9b9072f5..18b44399 100644 --- a/src/components/OphydSocketViewer/useOphydSocketViewer.ts +++ b/src/components/OphydSocketViewer/useOphydSocketViewer.ts @@ -1,17 +1,16 @@ //Instructions - // This here is a copy-paste from useOphydPVSocket.tsx - // This contains alll the code we need to talk to Ophyd Websocket for EPICS pvs. - // Modify this source code so that we return an additional 'messages' state variable - // that can then be dispalyed in 'OphydSocketViewer' +// This here is a copy-paste from useOphydPVSocket.tsx +// This contains alll the code we need to talk to Ophyd Websocket for EPICS pvs. +// Modify this source code so that we return an additional 'messages' state variable +// that can then be dispalyed in 'OphydSocketViewer' +// To do: +// Modify this code so that first, it prints out every message going +// out to the websocket, and every message that comes back from the websocket. -// To do: - // Modify this code so that first, it prints out every message going - // out to the websocket, and every message that comes back from the websocket. - - // Once you have that done, the next step is to save each message into a React - // state variable, which is returned from this hook. - //After that's done, you can wire this hook up in TestPage.tsx to replace useOphydPVSocket +// Once you have that done, the next step is to save each message into a React +// state variable, which is returned from this hook. +//After that's done, you can wire this hook up in TestPage.tsx to replace useOphydPVSocket import { useState, useRef, useEffect, useCallback, useMemo } from 'react'; import { Devices } from 'src/types/deviceControllerTypes'; @@ -22,7 +21,6 @@ import { ValueUpdateResponse, MetaUpdateResponse, } from '@/api/ophyd/ophydPVSocketTypes'; -import { BluetoothSlash } from '@phosphor-icons/react'; /** * Custom hook for managing WebSocket connections to Ophyd devices. @@ -34,7 +32,7 @@ import { BluetoothSlash } from '@phosphor-icons/react'; */ export default function useOphydPVSocket(deviceNameList: string[], wsUrl?: string) { // eslint-disable-next-line react-hooks/exhaustive-deps - const memoizedDeviceNames = useMemo(() => deviceNameList, [JSON.stringify(deviceNameList)]); + const memoizedDeviceNames = useMemo(() => deviceNameList, [JSON.stringify(deviceNameList)]); const configWsUrl = useOphydApiUrls().getWsUrl('pv-socket'); const apiUrl: string = wsUrl ?? configWsUrl; @@ -57,7 +55,7 @@ export default function useOphydPVSocket(deviceNameList: string[], wsUrl?: strin }); // --- NEW STATE FOR MESSAGES --- - const [messages, setMessages] = useState<{direction: 'SENT' | 'RCVD'; data: string}[]>([]); + const [messages, setMessages] = useState<{ direction: 'SENT' | 'RCVD'; data: string }[]>([]); const wsRef = useRef(null); const hasRenderedOnlyOnce = useRef(false); @@ -89,7 +87,7 @@ export default function useOphydPVSocket(deviceNameList: string[], wsUrl?: strin value: value, }; const payload = JSON.stringify(setValueMessage); - + // Log outgoing message logMessage('SENT', payload); wsRef.current.send(payload); @@ -149,7 +147,7 @@ export default function useOphydPVSocket(deviceNameList: string[], wsUrl?: strin pv: deviceName, }; const payload = JSON.stringify(subscribeMessage); - + // Log outgoing subscription messages logMessage('SENT', payload); ws.send(payload); @@ -218,4 +216,4 @@ export default function useOphydPVSocket(deviceNameList: string[], wsUrl?: strin handleSetValueRequest, toggleExpand, }; -} \ No newline at end of file +} diff --git a/src/features/Beamstop.tsx b/src/features/Beamstop.tsx index 95195854..74ec779a 100644 --- a/src/features/Beamstop.tsx +++ b/src/features/Beamstop.tsx @@ -42,7 +42,10 @@ export default function Beamstop({ }: BeamstopProps) { const beamstopXNameRBV = useMemo(() => beamstopXName + '.RBV', [beamstopXName]); const beamstopYNameRBV = useMemo(() => beamstopYName + '.RBV', [beamstopYName]); - const beamstopEnergyRBV = useMemo(() => beamstopEnergyName ? beamstopEnergyName + '.RBV' : undefined, [beamstopEnergyName]); + const beamstopEnergyRBV = useMemo( + () => (beamstopEnergyName ? beamstopEnergyName + '.RBV' : undefined), + [beamstopEnergyName], + ); const deviceNameList = useMemo( () => [ beamstopXName, @@ -50,7 +53,9 @@ export default function Beamstop({ beamstopXNameRBV, beamstopYNameRBV, beamstopCurrentName, - ...((beamstopEnergyName && beamstopEnergyRBV) ? [beamstopEnergyName, beamstopEnergyRBV] : []), + ...(beamstopEnergyName && beamstopEnergyRBV + ? [beamstopEnergyName, beamstopEnergyRBV] + : []), ], [ beamstopXName, @@ -59,6 +64,7 @@ export default function Beamstop({ beamstopYNameRBV, beamstopCurrentName, beamstopEnergyName, + beamstopEnergyRBV, ], ); const { devices, handleSetValueRequest, toggleDeviceLock } = useOphydPVSocket(deviceNameList); @@ -104,14 +110,14 @@ export default function Beamstop({ className={`${stackVertical ? 'w-full h-1/2' : 'w-1/2 h-full justify-start'} flex flex-col p-8 min-w-96`} > -

Beamstop Current:{' '}

+

Beamstop Current:

- {devices[beamstopCurrentName] && Number(devices[beamstopCurrentName].value).toPrecision(4)}{' '} + {devices[beamstopCurrentName] && + Number(devices[beamstopCurrentName].value).toPrecision(4)}{' '} {devices[beamstopCurrentName] && devices[beamstopCurrentName].units?.slice(0, 3)}

-
Date: Tue, 21 Jul 2026 10:51:37 -0700 Subject: [PATCH 07/12] Apply Prettier formatting to pre-existing files Formatting-only changes surfaced by the format:fix pre-commit hook, which runs across the whole src tree. No behavior changes. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/api/ophyd/OphydTransportProvider.tsx | 4 +- src/components/Camera/CameraCanvas.tsx | 74 +++++++++---------- src/components/EnergyVsCurrentPlotPV.tsx | 16 +--- .../OphydSocketViewer/OphydSocketViewer.tsx | 4 +- .../TableDeviceControllerWithRBV.tsx | 15 ++-- src/features/SampleStage.tsx | 4 +- .../createSimDetectorCameraSocketFactory.ts | 6 +- src/lib/ophyd-sim/devices/detector.ts | 17 ++++- .../tests/createFallbackTransport.test.ts | 5 +- 9 files changed, 70 insertions(+), 75 deletions(-) diff --git a/src/api/ophyd/OphydTransportProvider.tsx b/src/api/ophyd/OphydTransportProvider.tsx index e15f7d9d..e9060297 100644 --- a/src/api/ophyd/OphydTransportProvider.tsx +++ b/src/api/ophyd/OphydTransportProvider.tsx @@ -68,9 +68,7 @@ export function OphydTransportProvider({ const pvValue = useMemo(() => { if (!transport) return null; if (!fallbackToReal) return transport; - return createFallbackTransport(transport, () => - createWebSocketTransport({ url: pvUrl }), - ); + return createFallbackTransport(transport, () => createWebSocketTransport({ url: pvUrl })); }, [transport, fallbackToReal, pvUrl]); const deviceValue = useMemo(() => { diff --git a/src/components/Camera/CameraCanvas.tsx b/src/components/Camera/CameraCanvas.tsx index 5b8bba74..491fbf07 100644 --- a/src/components/Camera/CameraCanvas.tsx +++ b/src/components/Camera/CameraCanvas.tsx @@ -57,49 +57,49 @@ export default function CameraCanvas(props: CameraCanvasProps) {

{fps} fps

+ socketStatus={socketStatus} + isImageLogScale={isImageLogScale} + onToggleConnection={socketStatus === 'closed' ? startWebSocket : closeWebSocket} + onToggleLogScale={toggleLogScale} + canvasSize={sizeDict[canvasSize] ? sizeDict[canvasSize] : 512} + prefix={props.prefix} + /> - {/* Overlay on connection error (clean paused/idle state uses the Acquire button instead) */} -
-
-
-
- {socketError === null && ( -

- Websocket Disconnected -

- )} - {socketError && ( -

- {socketError} -

- )} -
- {phosphorIcons.plugs} + {/* Overlay on connection error (clean paused/idle state uses the Acquire button instead) */} +
+
+
+
+ {socketError === null && ( +

+ Websocket Disconnected +

+ )} + {socketError && ( +

+ {socketError} +

+ )} +
+ {phosphorIcons.plugs} +
-
-
-

- Connect? -

-
- {phosphorIcons.plugsConnected} +
+

+ Connect? +

+
+ {phosphorIcons.plugsConnected} +
-
{/* Acquire / Pause - start and stop the image stream, below the image */} diff --git a/src/components/EnergyVsCurrentPlotPV.tsx b/src/components/EnergyVsCurrentPlotPV.tsx index 2ecc7ef9..a3a74b2d 100644 --- a/src/components/EnergyVsCurrentPlotPV.tsx +++ b/src/components/EnergyVsCurrentPlotPV.tsx @@ -1,11 +1,7 @@ import { useEffect, useMemo, useRef, useState } from 'react'; import PlotlyScatter from './PlotlyScatter'; import useOphydPVSocket from '@/api/ophyd/useOphydPVSocket'; -import { - beamstopCurrentModel, - ENERGY_MIN_EV, - ENERGY_MAX_EV, -} from '@/lib/ophyd-sim'; +import { beamstopCurrentModel, ENERGY_MIN_EV, ENERGY_MAX_EV } from '@/lib/ophyd-sim'; import { recencyOpacities } from '@/utils/plotGenerators'; import { cn } from '@/lib/utils'; @@ -49,12 +45,7 @@ export default function EnergyVsCurrentPlotPV({ expectedCurvePoints = 100, className, }: EnergyVsCurrentPlotPVProps) { - const { devices } = useOphydPVSocket([ - energyPv, - currentPv, - beamstopXRbvPv, - beamstopYRbvPv, - ]); + const { devices } = useOphydPVSocket([energyPv, currentPv, beamstopXRbvPv, beamstopYRbvPv]); const [measured, setMeasured] = useState([]); @@ -91,8 +82,7 @@ export default function EnergyVsCurrentPlotPV({ const ys: number[] = []; const steps = Math.max(2, expectedCurvePoints); for (let i = 0; i < steps; i++) { - const energyEV = - ENERGY_MIN_EV + ((ENERGY_MAX_EV - ENERGY_MIN_EV) * i) / (steps - 1); + const energyEV = ENERGY_MIN_EV + ((ENERGY_MAX_EV - ENERGY_MIN_EV) * i) / (steps - 1); xs.push(energyEV); ys.push(beamstopCurrentModel({ x, y, energyEV })); } diff --git a/src/components/OphydSocketViewer/OphydSocketViewer.tsx b/src/components/OphydSocketViewer/OphydSocketViewer.tsx index 88fac108..787b3881 100644 --- a/src/components/OphydSocketViewer/OphydSocketViewer.tsx +++ b/src/components/OphydSocketViewer/OphydSocketViewer.tsx @@ -4,5 +4,5 @@ export default function OphydSocketViewer() {

Ophyd Socket View

Print out messages here.

- ) -} \ No newline at end of file + ); +} diff --git a/src/components/TableDeviceControllerWithRBV.tsx b/src/components/TableDeviceControllerWithRBV.tsx index d897ba88..bb5c9cea 100644 --- a/src/components/TableDeviceControllerWithRBV.tsx +++ b/src/components/TableDeviceControllerWithRBV.tsx @@ -46,14 +46,13 @@ export default function TableDeviceControllerWithRBV({ const getFormattedValue = (device: Device) => { //Returns the formatted valiues of devices RBV, If it exists in device RBV // Otherwise, just returns that devices formatted value. - if ((device.pv +'.RBV') in devicesRBV){ - const readbackDevice = devicesRBV[(device.pv + '.RBV')] - return `${typeof readbackDevice.value === 'number' ? readbackDevice.value.toPrecision(4) : readbackDevice.value} ${readbackDevice.units ? readbackDevice.units.slice(0, 3) : 'n/a'}` - - }else{ - return `${typeof device.value === 'number' ? device.value.toPrecision(4) : device.value} ${device.units ? device.units.slice(0, 3) : 'n/a'}` + if (device.pv + '.RBV' in devicesRBV) { + const readbackDevice = devicesRBV[device.pv + '.RBV']; + return `${typeof readbackDevice.value === 'number' ? readbackDevice.value.toPrecision(4) : readbackDevice.value} ${readbackDevice.units ? readbackDevice.units.slice(0, 3) : 'n/a'}`; + } else { + return `${typeof device.value === 'number' ? device.value.toPrecision(4) : device.value} ${device.units ? device.units.slice(0, 3) : 'n/a'}`; } - } + }; useEffect(() => { const updatedFlashingRows: Record = {}; const currentTime = Date.now() / 1000; // Current time in seconds @@ -150,7 +149,7 @@ export default function TableDeviceControllerWithRBV({ - {getFormattedValue(device)} + {getFormattedValue(device)} +
0 - ? image.files - : image.file - ? [image.file] - : []; + image.files && image.files.length > 0 ? image.files : image.file ? [image.file] : []; return (_url: string) => { // Per-socket round-robin cursor so each stream advances independently. diff --git a/src/lib/ophyd-sim/devices/detector.ts b/src/lib/ophyd-sim/devices/detector.ts index ff789e68..256c092e 100644 --- a/src/lib/ophyd-sim/devices/detector.ts +++ b/src/lib/ophyd-sim/devices/detector.ts @@ -99,7 +99,11 @@ export function overlayCenterYSuffix(index: number): string { * Linearly map `value` from `from.in→to.in` onto `from.out→to.out`, clamping * the normalized position to [0, 1] so the result never leaves the output range. */ -export function mapLinearClamped(value: number, from: ModulationPoint, to: ModulationPoint): number { +export function mapLinearClamped( + value: number, + from: ModulationPoint, + to: ModulationPoint, +): number { const span = to.in - from.in; const t = span === 0 ? 0 : (value - from.in) / span; const clamped = Math.max(0, Math.min(1, t)); @@ -144,7 +148,16 @@ export function detector(config: DetectorConfig): DeviceFactory { reg.seed(pv('cam1:DataType'), 1, { read_access: true, write_access: true, - enum_strs: ['Int8', 'UInt8', 'Int16', 'UInt16', 'Int32', 'UInt32', 'Float32', 'Float64'], + enum_strs: [ + 'Int8', + 'UInt8', + 'Int16', + 'UInt16', + 'Int32', + 'UInt32', + 'Float32', + 'Float64', + ], }); reg.seed(pv('cam1:Acquire'), 0, { read_access: true, diff --git a/src/testing/tests/createFallbackTransport.test.ts b/src/testing/tests/createFallbackTransport.test.ts index d3a657ff..a524d830 100644 --- a/src/testing/tests/createFallbackTransport.test.ts +++ b/src/testing/tests/createFallbackTransport.test.ts @@ -50,10 +50,7 @@ describe('createFallbackTransport', () => { const primary = makeFakeTransport(); const fallback = makeFakeTransport(); - const wrapper = createFallbackTransport( - primary.transport, - () => fallback.transport, - ); + const wrapper = createFallbackTransport(primary.transport, () => fallback.transport); const received: unknown[] = []; wrapper.onMessage((m) => received.push(m)); From c5a29786f8aca801cb8e2acfc0d57a67d905b86f Mon Sep 17 00:00:00 2001 From: Prinstar Date: Tue, 21 Jul 2026 12:41:17 -0700 Subject: [PATCH 08/12] Limit sim camera to 10 fps --- src/lib/ophyd-sim/camera/SimCameraSocket.ts | 8 ++++++-- .../camera/createSimDetectorCameraSocketFactory.ts | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/lib/ophyd-sim/camera/SimCameraSocket.ts b/src/lib/ophyd-sim/camera/SimCameraSocket.ts index 8d21b9a3..18816686 100644 --- a/src/lib/ophyd-sim/camera/SimCameraSocket.ts +++ b/src/lib/ophyd-sim/camera/SimCameraSocket.ts @@ -4,7 +4,11 @@ import type { CameraSocketFactory, CameraSocketLike, CameraSocketMessageEvent } export type CameraFramePayload = Blob | ArrayBuffer | null; export interface SimCameraSocketOptions { - /** Frames per second to emit. Defaults to 30. */ + /** + * Frames per second to emit. Defaults to 10 — enough for a simulated + * stream to read as live while keeping the browser's per-frame work low + * (e.g. on the documentation site). + */ fps?: number; /** Generated frame width in pixels. Defaults to 512. */ width?: number; @@ -79,7 +83,7 @@ export class SimCameraSocket implements CameraSocketLike { private emittingFrame = false; constructor(options: SimCameraSocketOptions = {}) { - this.fps = options.fps ?? 30; + this.fps = options.fps ?? 10; this.width = options.width ?? 512; this.height = options.height ?? 512; this.generateFrame = options.generateFrame ?? generateNoiseJpeg; diff --git a/src/lib/ophyd-sim/camera/createSimDetectorCameraSocketFactory.ts b/src/lib/ophyd-sim/camera/createSimDetectorCameraSocketFactory.ts index acc58fbe..d341f2fb 100644 --- a/src/lib/ophyd-sim/camera/createSimDetectorCameraSocketFactory.ts +++ b/src/lib/ophyd-sim/camera/createSimDetectorCameraSocketFactory.ts @@ -11,7 +11,7 @@ import { SimCameraSocket } from './SimCameraSocket'; import type { CameraSocketFactory } from './types'; export interface SimDetectorCameraOptions { - /** Frames per second to emit. Defaults to 30. */ + /** Frames per second to emit. Defaults to 10 (see `SimCameraSocket`). */ fps?: number; } From 84ce7a0facf70627b1918e238ef3d8650ae1ec16 Mon Sep 17 00:00:00 2001 From: Prinstar Date: Wed, 22 Jul 2026 13:19:55 -0700 Subject: [PATCH 09/12] Add SimulatedBeamline feature and refactor beamline device table --- .github/workflows/test.yml | 14 + src/api/ophyd/OphydTransportContext.ts | 74 ++++++ src/api/ophyd/OphydTransportProvider.tsx | 76 +----- src/api/ophyd/useOphydDeviceSocket.ts | 2 +- src/api/ophyd/useOphydPVSocket.tsx | 2 +- src/app/pages/TestPage.tsx | 240 +----------------- .../Camera/hooks/useCameraCanvas.ts | 2 +- src/components/FinchHeader.tsx | 13 +- .../TableDeviceControllerWithRBV.tsx | 138 +++++----- src/features/Beamstop.tsx | 2 +- .../EnergyVsCurrentPlotPV.tsx | 2 +- .../SimulatedBeamline/SimulatedBeamline.tsx | 145 +++++++++++ src/lib/ophyd-sim/core/createOphydSim.ts | 2 +- src/lib/ophyd-sim/react/OphydSimContext.ts | 16 ++ src/lib/ophyd-sim/react/OphydSimProvider.tsx | 17 +- src/lib/ophyd-sim/react/hooks.ts | 2 +- src/lib/ophyd-sim/react/index.ts | 3 +- .../tests/EnergyVsCurrentPlotPV.test.tsx | 226 +++++++++++++++++ 18 files changed, 572 insertions(+), 404 deletions(-) create mode 100644 src/api/ophyd/OphydTransportContext.ts rename src/{components => features}/EnergyVsCurrentPlotPV.tsx (98%) create mode 100644 src/features/SimulatedBeamline/SimulatedBeamline.tsx create mode 100644 src/lib/ophyd-sim/react/OphydSimContext.ts create mode 100644 src/testing/tests/EnergyVsCurrentPlotPV.test.tsx diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e42af27f..5914aa00 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -89,6 +89,19 @@ jobs: npm run test:run -- src/testing/tests/TiledComponents.test.tsx npm run test:run -- src/testing/tests/TiledLinePlotMaker.test.tsx npm run test:run -- src/testing/tests/Widget.test.tsx + echo "Running ophyd sim test suites..." + npm run test:run -- src/testing/tests/beamstopModel.test.ts + npm run test:run -- src/testing/tests/createFallbackTransport.test.ts + npm run test:run -- src/testing/tests/simCameraSocket.test.ts + npm run test:run -- src/testing/tests/ophyd-sim/dependencyGraph.test.ts + npm run test:run -- src/testing/tests/ophyd-sim/detector.test.ts + npm run test:run -- src/testing/tests/ophyd-sim/hexapod.test.ts + npm run test:run -- src/testing/tests/ophyd-sim/motor.test.ts + npm run test:run -- src/testing/tests/ophyd-sim/shutter.test.ts + npm run test:run -- src/testing/tests/ophyd-sim/signal.test.ts + npm run test:run -- src/testing/tests/ophyd-sim/state.test.ts + npm run test:run -- src/testing/tests/ophyd-sim/transport.test.ts + npm run test:run -- src/testing/tests/ophyd-sim/useOphydPVSocket.integration.test.tsx env: CI: true @@ -206,6 +219,7 @@ jobs: `- ${testStepStatus} **Devices** - Camera, Shutter, DeviceControllerBox, DeviceControllerBoxSimple, TableDeviceController, ControllerAbsoluteMove, ControllerRelativeMove, Hexapod, BeamEnergy`, `- ${testStepStatus} **Services** - QueueServer, SignalMonitorPlots, Experiment`, `- ${testStepStatus} **Misc** - IFrame, GoogleDoc, SelectDropdown, ComponentViewer, ComponentViewerUtils`, + `- ${testStepStatus} **Ophyd Sim** - beamstopModel, createFallbackTransport, simCameraSocket, dependencyGraph, detector, hexapod, motor, shutter, signal, state, transport, useOphydPVSocket`, ``, `**Test Environment:** Node.js 20.x`, `**Linting:** ${lintStatus} ${lintText}${lintSection}`, diff --git a/src/api/ophyd/OphydTransportContext.ts b/src/api/ophyd/OphydTransportContext.ts new file mode 100644 index 00000000..a72d22c0 --- /dev/null +++ b/src/api/ophyd/OphydTransportContext.ts @@ -0,0 +1,74 @@ +import { createContext, useContext, useMemo } from 'react'; +import { useOphydApiUrls } from '@/utils/apiUtils'; +import { createWebSocketTransport } from './transport/createWebSocketTransport'; +import { createWebSocketDeviceTransport } from './transport/createWebSocketDeviceTransport'; +import type { OphydPVTransport } from './transport/types'; +import type { OphydDeviceTransport } from './transport/deviceTypes'; +import type { CameraSocketFactory, CameraSocketLike } from '@/lib/ophyd-sim'; + +export const PVTransportContext = createContext(null); +export const DeviceTransportContext = createContext(null); +export const CameraSocketFactoryContext = createContext(null); + +/** + * Default camera socket: a thin wrapper over the real browser `WebSocket`. The + * real socket's surface is wider than {@link CameraSocketLike} (its `onmessage` + * carries a full `MessageEvent`), so we cast — consumers only touch the subset + * the interface declares. + */ +const defaultCameraSocketFactory: CameraSocketFactory = (url) => + new WebSocket(url) as unknown as CameraSocketLike; + +/** + * Read the PV-socket transport from context, or construct a default + * WebSocket transport pointed at the configured ophyd backend. + * + * The fallback transport is memoized per URL so re-renders of consumers + * don't churn connections. + */ +export function useOphydPVTransport(overrideUrl?: string): OphydPVTransport { + const fromContext = useContext(PVTransportContext); + const configWsUrl = useOphydApiUrls().getWsUrl('pv-socket'); + const url = overrideUrl ?? configWsUrl; + + // Construct fallback transports on demand. useMemo keyed on url means we + // get one transport per (url) per consumer that lacks a provider. This + // matches the prior per-hook WebSocket behavior — see plan for the + // shared-state caveat that motivated the refactor. + const fallback = useMemo(() => { + if (fromContext) return null; + return createWebSocketTransport({ url }); + }, [fromContext, url]); + + if (fromContext) return fromContext; + if (!fallback) { + throw new Error('useOphydPVTransport: no transport available'); + } + return fallback; +} + +export function useOphydDeviceTransport(overrideUrl?: string): OphydDeviceTransport { + const fromContext = useContext(DeviceTransportContext); + const configWsUrl = useOphydApiUrls().getWsUrl('device-socket'); + const url = overrideUrl ?? configWsUrl; + + const fallback = useMemo(() => { + if (fromContext) return null; + return createWebSocketDeviceTransport({ url }); + }, [fromContext, url]); + + if (fromContext) return fromContext; + if (!fallback) { + throw new Error('useOphydDeviceTransport: no transport available'); + } + return fallback; +} + +/** + * Read the camera socket factory from context, or fall back to one that wraps + * the real browser `WebSocket`. Unlike the transport hooks this never throws — + * a default always exists, so cameras work with no provider present. + */ +export function useCameraSocketFactory(): CameraSocketFactory { + return useContext(CameraSocketFactoryContext) ?? defaultCameraSocketFactory; +} diff --git a/src/api/ophyd/OphydTransportProvider.tsx b/src/api/ophyd/OphydTransportProvider.tsx index e9060297..1c249833 100644 --- a/src/api/ophyd/OphydTransportProvider.tsx +++ b/src/api/ophyd/OphydTransportProvider.tsx @@ -1,24 +1,16 @@ -import { createContext, useContext, useMemo, type ReactNode } from 'react'; +import { useMemo, type ReactNode } from 'react'; import { useOphydApiUrls } from '@/utils/apiUtils'; import { createWebSocketTransport } from './transport/createWebSocketTransport'; import { createWebSocketDeviceTransport } from './transport/createWebSocketDeviceTransport'; import { createFallbackTransport } from './transport/createFallbackTransport'; import type { OphydPVTransport } from './transport/types'; import type { OphydDeviceTransport } from './transport/deviceTypes'; -import type { CameraSocketFactory, CameraSocketLike } from '@/lib/ophyd-sim'; - -const PVTransportContext = createContext(null); -const DeviceTransportContext = createContext(null); -const CameraSocketFactoryContext = createContext(null); - -/** - * Default camera socket: a thin wrapper over the real browser `WebSocket`. The - * real socket's surface is wider than {@link CameraSocketLike} (its `onmessage` - * carries a full `MessageEvent`), so we cast — consumers only touch the subset - * the interface declares. - */ -const defaultCameraSocketFactory: CameraSocketFactory = (url) => - new WebSocket(url) as unknown as CameraSocketLike; +import type { CameraSocketFactory } from '@/lib/ophyd-sim'; +import { + PVTransportContext, + DeviceTransportContext, + CameraSocketFactoryContext, +} from './OphydTransportContext'; export interface OphydTransportProviderProps { /** Override the PV-socket transport (e.g. a simulator). */ @@ -89,57 +81,3 @@ export function OphydTransportProvider({ ); } - -/** - * Read the PV-socket transport from context, or construct a default - * WebSocket transport pointed at the configured ophyd backend. - * - * The fallback transport is memoized per URL so re-renders of consumers - * don't churn connections. - */ -export function useOphydPVTransport(overrideUrl?: string): OphydPVTransport { - const fromContext = useContext(PVTransportContext); - const configWsUrl = useOphydApiUrls().getWsUrl('pv-socket'); - const url = overrideUrl ?? configWsUrl; - - // Construct fallback transports on demand. useMemo keyed on url means we - // get one transport per (url) per consumer that lacks a provider. This - // matches the prior per-hook WebSocket behavior — see plan for the - // shared-state caveat that motivated the refactor. - const fallback = useMemo(() => { - if (fromContext) return null; - return createWebSocketTransport({ url }); - }, [fromContext, url]); - - if (fromContext) return fromContext; - if (!fallback) { - throw new Error('useOphydPVTransport: no transport available'); - } - return fallback; -} - -export function useOphydDeviceTransport(overrideUrl?: string): OphydDeviceTransport { - const fromContext = useContext(DeviceTransportContext); - const configWsUrl = useOphydApiUrls().getWsUrl('device-socket'); - const url = overrideUrl ?? configWsUrl; - - const fallback = useMemo(() => { - if (fromContext) return null; - return createWebSocketDeviceTransport({ url }); - }, [fromContext, url]); - - if (fromContext) return fromContext; - if (!fallback) { - throw new Error('useOphydDeviceTransport: no transport available'); - } - return fallback; -} - -/** - * Read the camera socket factory from context, or fall back to one that wraps - * the real browser `WebSocket`. Unlike the transport hooks this never throws — - * a default always exists, so cameras work with no provider present. - */ -export function useCameraSocketFactory(): CameraSocketFactory { - return useContext(CameraSocketFactoryContext) ?? defaultCameraSocketFactory; -} diff --git a/src/api/ophyd/useOphydDeviceSocket.ts b/src/api/ophyd/useOphydDeviceSocket.ts index 04824419..58ee5b34 100644 --- a/src/api/ophyd/useOphydDeviceSocket.ts +++ b/src/api/ophyd/useOphydDeviceSocket.ts @@ -1,6 +1,6 @@ import { useState, useEffect, useCallback, useMemo, useRef } from 'react'; import type { OphydDevices } from '@/types/deviceControllerTypes'; -import { useOphydDeviceTransport } from './OphydTransportProvider'; +import { useOphydDeviceTransport } from './OphydTransportContext'; import type { OphydDeviceTransport } from './transport/deviceTypes'; /** diff --git a/src/api/ophyd/useOphydPVSocket.tsx b/src/api/ophyd/useOphydPVSocket.tsx index 88d519bb..0adaa937 100644 --- a/src/api/ophyd/useOphydPVSocket.tsx +++ b/src/api/ophyd/useOphydPVSocket.tsx @@ -1,6 +1,6 @@ import { useState, useEffect, useCallback, useMemo, useRef } from 'react'; import type { Devices } from '@/types/deviceControllerTypes'; -import { useOphydPVTransport } from './OphydTransportProvider'; +import { useOphydPVTransport } from './OphydTransportContext'; import type { OphydPVTransport } from './transport/types'; /** diff --git a/src/app/pages/TestPage.tsx b/src/app/pages/TestPage.tsx index 75cc956c..ceddcf8a 100644 --- a/src/app/pages/TestPage.tsx +++ b/src/app/pages/TestPage.tsx @@ -1,241 +1,5 @@ -import { OphydTransportProvider } from '@/api/ophyd/OphydTransportProvider'; -import { - OphydSimProvider, - createOphydSimTransport, - beamstopBeamline, - beamstopCurrentModel, - simDetectorConfig, - createSimDetectorCameraSocketFactory, - SHUTTER_OPEN_VALUE, -} from '@/lib/ophyd-sim'; -import { useEffect, useMemo, useState } from 'react'; -import { createPortal } from 'react-dom'; -import useOphydPVSocket from '@/api/ophyd/useOphydPVSocket'; -import CameraCanvas from '@/components/Camera/CameraCanvas'; -import Shutter from '@/components/Shutter'; -import SignalMonitorPlotPV from '@/components/SignalMonitorPlotPV'; -import EnergyVsCurrentPlotPV from '@/components/EnergyVsCurrentPlotPV'; -import Button from '@/components/Button'; -import { FINCH_HEADER_RIGHT_SLOT_ID } from '@/components/FinchHeader'; -import EndstationDisplay from '@/components/EndstationDisplay/EndstationDisplay'; -import TableDeviceControllerWithRBV from '@/components/TableDeviceControllerWithRBV'; - -const BEAMSTOP_CURRENT = 'bl201-beamstop:current'; -const BEAMSTOP_X = 'bl531_xps2:beamstop_x_mm'; -const BEAMSTOP_Y = 'bl531_xps2:beamstop_y_mm'; -const BEAMSTOP_ENERGY = 'bl531:mono_energy_eV'; -/** Shared height for the device table and the beamstop-current plot beside it, - * so the two panels line up. Sized to fit the table's fixed five rows. */ -const PANEL_HEIGHT = 'h-[280px]'; -/** Beamstop motor travel (mm); both axes are symmetric [-LIMIT, +LIMIT]. */ -const BEAMSTOP_LIMIT_MM = 10; - -/** - * Grid-search the noise-free current model for the beamstop X/Y that maximizes - * |diode current| at a given energy — i.e. the beam center. Two passes: a coarse - * sweep across the full travel, then a fine sweep around the coarse winner. - */ -function findPeakPosition(energyEV: number) { - const search = (xMin: number, xMax: number, yMin: number, yMax: number, step: number) => { - let best = { x: 0, y: 0, current: -Infinity }; - for (let x = xMin; x <= xMax + 1e-9; x += step) { - for (let y = yMin; y <= yMax + 1e-9; y += step) { - const current = Math.abs(beamstopCurrentModel({ x, y, energyEV })); - if (current > best.current) best = { x, y, current }; - } - } - return best; - }; - - const L = BEAMSTOP_LIMIT_MM; - const coarse = search(-L, L, -L, L, 0.25); - const clamp = (v: number) => Math.max(-L, Math.min(L, v)); - return search( - clamp(coarse.x - 0.25), - clamp(coarse.x + 0.25), - clamp(coarse.y - 0.25), - clamp(coarse.y + 0.25), - 0.01, - ); -} - -/** - * Beam energy, sample X/Y, and beamstop X/Y — the writable beamline devices, - * driven through the same sim transport that feeds EndstationDisplay and the - * camera, so moves made here update those views live. - */ -const BEAMLINE_DEVICES = [ - 'bl531_xps2:beamstop_x_mm', - 'bl531_xps2:beamstop_y_mm', - 'bl531:sample_x_mm', - 'bl531:sample_y_mm', - 'bl531:mono_energy_eV', -]; -const BEAMLINE_DEVICES_RBV = [ - 'bl531_xps2:beamstop_x_mm.RBV', - 'bl531_xps2:beamstop_y_mm.RBV', - 'bl531:sample_x_mm.RBV', - 'bl531:sample_y_mm.RBV', - 'bl531:mono_energy_eV.RBV', -]; - -function BeamlineDeviceTable() { - const { devices, handleSetValueRequest, toggleDeviceLock, toggleExpand } = - useOphydPVSocket(BEAMLINE_DEVICES); - - const { devices: devicesRBV } = useOphydPVSocket(BEAMLINE_DEVICES_RBV); - return ( - - ); -} - -/** - * Computes the beamstop X/Y that maximizes the diode current for the current - * beam energy (the beam center), and drives the beamstop there on demand. - * The optimum is recomputed whenever the energy changes, since the beam's - * vertical position tracks energy. - */ -function BeamstopBestOption() { - const deviceList = useMemo( - () => [BEAMSTOP_CURRENT, BEAMSTOP_X, BEAMSTOP_Y, BEAMSTOP_ENERGY], - [], - ); - const { devices, handleSetValueRequest } = useOphydPVSocket(deviceList); - - const energyEV = - typeof devices[BEAMSTOP_ENERGY]?.value === 'number' - ? (devices[BEAMSTOP_ENERGY].value as number) - : null; - - const peak = useMemo(() => (energyEV === null ? null : findPeakPosition(energyEV)), [energyEV]); - - const goToBest = () => { - if (!peak) return; - handleSetValueRequest(BEAMSTOP_X, Number(peak.x.toFixed(3))); - handleSetValueRequest(BEAMSTOP_Y, Number(peak.y.toFixed(3))); - }; - - const currentUnits = devices[BEAMSTOP_CURRENT]?.units ?? 'A'; - const xUnits = devices[BEAMSTOP_X]?.units ?? 'mm'; - const yUnits = devices[BEAMSTOP_Y]?.units ?? 'mm'; - - return ( -
-

- Optimal Beamstop X: {peak ? peak.x.toPrecision(4) : 'N/A'} {xUnits} -

-

- Optimal Beamstop Y: {peak ? peak.y.toPrecision(4) : 'N/A'} {yUnits} -

-

- Expected Current: {peak ? peak.current.toPrecision(5) : 'N/A'} {currentUnits} -

-
- ); -} - -/** Shutter analog-output PV (0 V open / 5 V closed) — matches the default. */ -const SHUTTER_PV = 'bl531:LJT4:1:AO0'; - -/** - * Simulated detector, paused whenever the beam shutter is not open. Subscribes - * to the shutter PV and hands `CameraCanvas` a controlled `paused` flag so the - * stream stops when the shutter closes and resumes when it reopens. - */ -function SimulatedDetector() { - const deviceList = useMemo(() => [SHUTTER_PV], []); - const { devices } = useOphydPVSocket(deviceList); - const shutterOpen = Number(devices[SHUTTER_PV]?.value) === SHUTTER_OPEN_VALUE; - return ( -
- -
- ); -} - -/** - * Renders the shutter control into the app header's right-side slot. It stays - * inside TestPage's Ophyd sim providers (so it keeps driving the simulated - * beamline) while appearing in the global "Finch Dev Mode" header. - */ -function HeaderShutter() { - const [slot, setSlot] = useState(null); - useEffect(() => { - setSlot(document.getElementById(FINCH_HEADER_RIGHT_SLOT_ID)); - }, []); - if (!slot) return null; - // Drives bl531:LJT4:1:AO0 in beamstopBeamline; closing it (5 V) zeroes the diode. - return createPortal(, slot); -} - -function TestPageBody() { - return ( -
- - {/* Top row: endstation graphic top-left, simulated detector to its - * right, both image panels pinned to the same height (IMAGE_H). The - * graphic's width follows from its 485/215 aspect ratio; the detector - * canvas is scaled to match via the child selector. Wraps on narrow - * screens. */} -
- {/* Layered view of the beamline; reacts to the shutter + beamstop PVs. */} - - {/* Simulated detector — scaled to the shared height and paused - * while the shutter is closed. No socketFactory prop — the sim - * factory is supplied via context below. */} - -
- {/* Device table with the live beamstop-current trend to its side. */} -
- {/* Beam energy, sample X/Y, and beamstop X/Y controls in one table. */} - - {/* Beamstop current over time. */} - -
- {/* Energy sweep plot and peak-finder. */} -
- {/* Beamstop current vs. selected beam energy, keyed by beamstop X/Y position. */} - - {/* Finds the peak-current beamstop position and jumps there. */} - -
-
- ); -} +import SimulatedBeamline from '@/features/SimulatedBeamline/SimulatedBeamline'; export default function TestPage() { - const transport = useMemo(() => createOphydSimTransport(beamstopBeamline), []); - // Camera frames are driven by the '13SIM1' detector in the same sim, so the - // energy control in the device table modulates the image opacity live. - const cameraSocketFactory = useMemo( - () => createSimDetectorCameraSocketFactory(beamstopBeamline, simDetectorConfig), - [], - ); - return ( - - - - - - ); + return ; } diff --git a/src/components/Camera/hooks/useCameraCanvas.ts b/src/components/Camera/hooks/useCameraCanvas.ts index ce995cd1..934c02c0 100644 --- a/src/components/Camera/hooks/useCameraCanvas.ts +++ b/src/components/Camera/hooks/useCameraCanvas.ts @@ -1,7 +1,7 @@ import { useState, useRef, useEffect, useCallback, useMemo } from 'react'; import { useOphydApiUrls } from '@/utils/apiUtils'; import { ophydSocketCameraPath } from '@/api/ophyd/socketPaths'; -import { useCameraSocketFactory } from '@/api/ophyd/OphydTransportProvider'; +import { useCameraSocketFactory } from '@/api/ophyd/OphydTransportContext'; import { CanvasSizes } from '../CameraCanvas'; import { getErrorMessage } from '@/utils/errorHandling'; import type { CameraSocketLike } from '@/lib/ophyd-sim'; diff --git a/src/components/FinchHeader.tsx b/src/components/FinchHeader.tsx index ffc29dcf..a058d5c8 100644 --- a/src/components/FinchHeader.tsx +++ b/src/components/FinchHeader.tsx @@ -1,8 +1,5 @@ import { cn } from '@/lib/utils'; -/** DOM id of the header's right-side slot; pages portal controls into this node. */ -export const FINCH_HEADER_RIGHT_SLOT_ID = 'finch-header-right-slot'; - export type FinchHeaderProps = { /** Title text displayed in the header. */ title?: string; @@ -54,15 +51,7 @@ export default function FinchHeader({ {title}
- {/* - * Right-side container. `rightSlot` covers static content passed by the - * layout; the stable id lets pages portal their own controls (e.g. the - * Test page's ) into the header without leaving their own - * provider tree. - */} -
- {rightSlot} -
+ {rightSlot} ); } diff --git a/src/components/TableDeviceControllerWithRBV.tsx b/src/components/TableDeviceControllerWithRBV.tsx index bb5c9cea..b2a6132d 100644 --- a/src/components/TableDeviceControllerWithRBV.tsx +++ b/src/components/TableDeviceControllerWithRBV.tsx @@ -1,12 +1,17 @@ import { useEffect, useState } from 'react'; -import { Lock, LockOpen, CaretDown } from '@phosphor-icons/react'; +import { Lock, LockOpen } from '@phosphor-icons/react'; import { Table, TableHeader, TableHead, TableBody, TableRow, TableCell } from './ui/table'; import ControllerAbsoluteMove from './ControllerAbsoluteMove'; import ControllerRelativeMove from './ControllerRelativeMove'; +import SelectDropdown from './SelectDropdown'; import { Devices, Device } from '@/types/deviceControllerTypes'; import { cn } from '@/lib/utils'; +const ABSOLUTE_MOVE = 'Absolute Move'; +const RELATIVE_MOVE = 'Relative Move'; +type MoveMode = typeof ABSOLUTE_MOVE | typeof RELATIVE_MOVE; + export type TableDeviceControllerWithRBVProps = { /** Map of device names to their current state objects. Each entry renders as one table row. */ devices: Devices; @@ -18,9 +23,10 @@ export type TableDeviceControllerWithRBVProps = { /** Called to toggle the expanded state for a device row, showing or hiding its raw JSON data. */ toggleExpand: (deviceName: string) => void; /** - * When true, the Relative Move column starts collapsed (hidden on render) and - * the column header becomes a toggle that reveals it. Defaults to false, so - * the relative-move controls are always shown. + * When true, the absolute- and relative-move controls share a single "Move" + * column whose header is a dropdown for switching between the two, so the + * relative-move UI never reserves empty space. Defaults to false, which + * renders Absolute Move and Relative Move as two always-visible columns. */ collapsibleRelativeMove?: boolean; /** Additional CSS classes applied to the root container. */ @@ -39,9 +45,8 @@ export default function TableDeviceControllerWithRBV({ }: TableDeviceControllerWithRBVProps) { // State to track flashing rows const [flashingRows, setFlashingRows] = useState>({}); - // Relative Move column visibility. When collapsible, it starts hidden; when - // not, it is permanently open (no toggle rendered). - const [isRelativeMoveOpen, setIsRelativeMoveOpen] = useState(!collapsibleRelativeMove); + // In collapsible mode, which move control the single "Move" column shows. + const [moveMode, setMoveMode] = useState(ABSOLUTE_MOVE); const getFormattedValue = (device: Device) => { //Returns the formatted valiues of devices RBV, If it exists in device RBV @@ -74,9 +79,34 @@ export default function TableDeviceControllerWithRBV({ setFlashingRows(updatedFlashingRows); }, [devices]); + + const renderAbsoluteMove = (deviceName: string, device: Device) => ( + input !== null && handleSetValueRequest(deviceName, input)} + inputLabel={device.units && device.units.slice(0, 3)} + classNameInput="bg-sky-200 shadow-inner rounded-md" + locked={device.locked} + /> + ); + + const renderRelativeMove = (deviceName: string, device: Device) => ( + input !== null && handleSetValueRequest(deviceName, input)} + inputLabel={device.units && device.units.slice(0, 3)} + currentValue={typeof device.value === 'number' ? device.value : null} + classNameInput="bg-sky-200 shadow-inner rounded-md" + resultantTextClassName="hidden" + locked={device.locked} + /> + ); + return (
@@ -86,30 +116,28 @@ export default function TableDeviceControllerWithRBV({ Current Value - - Absolute Move - - - {collapsibleRelativeMove ? ( - - ) : ( - 'Relative Move' - )} - + {collapsibleRelativeMove ? ( + // Single move column: the header dropdown swaps the cell + // controls between absolute and relative, so the unused + // mode never takes up space. + + setMoveMode(value as MoveMode)} + triggerClassName="ml-0 mr-auto" + /> + + ) : ( + <> + + {ABSOLUTE_MOVE} + + + {RELATIVE_MOVE} + + + )} @@ -151,36 +179,22 @@ export default function TableDeviceControllerWithRBV({ {getFormattedValue(device)} - - - input !== null && - handleSetValueRequest(deviceName, input) - } - inputLabel={device.units && device.units.slice(0, 3)} - classNameInput="bg-sky-200 shadow-inner rounded-md" - locked={device.locked} - /> - - - {isRelativeMoveOpen && ( - - input !== null && - handleSetValueRequest(deviceName, input) - } - inputLabel={device.units && device.units.slice(0, 3)} - currentValue={ - typeof device.value === 'number' - ? device.value - : null - } - classNameInput="bg-sky-200 shadow-inner rounded-md" - locked={device.locked} - /> - )} - + {collapsibleRelativeMove ? ( + + {moveMode === ABSOLUTE_MOVE + ? renderAbsoluteMove(deviceName, device) + : renderRelativeMove(deviceName, device)} + + ) : ( + <> + + {renderAbsoluteMove(deviceName, device)} + + + {renderRelativeMove(deviceName, device)} + + + )} ); })} diff --git a/src/features/Beamstop.tsx b/src/features/Beamstop.tsx index 74ec779a..b702f37b 100644 --- a/src/features/Beamstop.tsx +++ b/src/features/Beamstop.tsx @@ -2,7 +2,7 @@ import { useState, useMemo, useEffect } from 'react'; import SignalMonitorPlotPV from '@/components/SignalMonitorPlotPV'; import DeviceControllerBox from '@/components/DeviceControllerBox'; -import EnergyVsCurrentPlotPV from '@/components/EnergyVsCurrentPlotPV'; +import EnergyVsCurrentPlotPV from '@/features/EnergyVsCurrentPlotPV'; import useOphydPVSocket from '@/api/ophyd/useOphydPVSocket'; import Button from '@/components/Button'; diff --git a/src/components/EnergyVsCurrentPlotPV.tsx b/src/features/EnergyVsCurrentPlotPV.tsx similarity index 98% rename from src/components/EnergyVsCurrentPlotPV.tsx rename to src/features/EnergyVsCurrentPlotPV.tsx index a3a74b2d..c00bae13 100644 --- a/src/components/EnergyVsCurrentPlotPV.tsx +++ b/src/features/EnergyVsCurrentPlotPV.tsx @@ -1,5 +1,5 @@ import { useEffect, useMemo, useRef, useState } from 'react'; -import PlotlyScatter from './PlotlyScatter'; +import PlotlyScatter from '@/components/PlotlyScatter'; import useOphydPVSocket from '@/api/ophyd/useOphydPVSocket'; import { beamstopCurrentModel, ENERGY_MIN_EV, ENERGY_MAX_EV } from '@/lib/ophyd-sim'; import { recencyOpacities } from '@/utils/plotGenerators'; diff --git a/src/features/SimulatedBeamline/SimulatedBeamline.tsx b/src/features/SimulatedBeamline/SimulatedBeamline.tsx new file mode 100644 index 00000000..c946c3e5 --- /dev/null +++ b/src/features/SimulatedBeamline/SimulatedBeamline.tsx @@ -0,0 +1,145 @@ +import { OphydTransportProvider } from '@/api/ophyd/OphydTransportProvider'; +import { + OphydSimProvider, + createOphydSimTransport, + beamstopBeamline, + simDetectorConfig, + createSimDetectorCameraSocketFactory, + SHUTTER_OPEN_VALUE, +} from '@/lib/ophyd-sim'; +import { useMemo } from 'react'; +import useOphydPVSocket from '@/api/ophyd/useOphydPVSocket'; +import CameraCanvas from '@/components/Camera/CameraCanvas'; +import Shutter from '@/components/Shutter'; +import SignalMonitorPlotPV from '@/components/SignalMonitorPlotPV'; +import EndstationDisplay from '@/components/EndstationDisplay/EndstationDisplay'; +import TableDeviceControllerWithRBV from '@/components/TableDeviceControllerWithRBV'; +import { cn } from '@/lib/utils'; + +/** Shared height for the device table and the beamstop-current plot beside it, + * so the two panels line up. Sized to fit the table's fixed rows. */ +const PANEL_HEIGHT = 'h-[280px]'; +/** Shared height for the endstation graphic and the detector canvas in the top row. */ +const IMAGE_HEIGHT = 'h-[340px]'; + +/** Beamstop-current PV shown in the trend plot. */ +const BEAMSTOP_CURRENT = 'bl201-beamstop:current'; +/** Shutter analog-output PV (0 V open / 5 V closed) — matches the default. */ +const SHUTTER_PV = 'bl531:LJT4:1:AO0'; + +/** + * Beam energy, sample X/Y, and beamstop X/Y — the writable beamline devices, + * driven through the same sim transport that feeds EndstationDisplay and the + * camera, so moves made here update those views live. + */ +const BEAMLINE_DEVICES = [ + 'bl531_xps2:beamstop_x_mm', + 'bl531_xps2:beamstop_y_mm', + 'bl531:sample_x_mm', + 'bl531:sample_y_mm', + 'bl531:mono_energy_eV', +]; +const BEAMLINE_DEVICES_RBV = [ + 'bl531_xps2:beamstop_x_mm.RBV', + 'bl531_xps2:beamstop_y_mm.RBV', + 'bl531:sample_x_mm.RBV', + 'bl531:sample_y_mm.RBV', + 'bl531:mono_energy_eV.RBV', +]; + +function BeamlineDeviceTable() { + const { devices, handleSetValueRequest, toggleDeviceLock, toggleExpand } = + useOphydPVSocket(BEAMLINE_DEVICES); + + const { devices: devicesRBV } = useOphydPVSocket(BEAMLINE_DEVICES_RBV); + return ( + + ); +} + +/** + * Simulated detector, paused whenever the beam shutter is not open. Subscribes + * to the shutter PV and hands `CameraCanvas` a controlled `paused` flag so the + * stream stops when the shutter closes and resumes when it reopens. + */ +function SimulatedDetector() { + const deviceList = useMemo(() => [SHUTTER_PV], []); + const { devices } = useOphydPVSocket(deviceList); + const shutterOpen = Number(devices[SHUTTER_PV]?.value) === SHUTTER_OPEN_VALUE; + return ( +
+ +
+ ); +} + +/** + * Beam-shutter control floated at the top-right of the viewport. Because it + * lives inside the widget's Ophyd sim providers it drives the simulated beamline + * directly; `fixed` positioning + a high z-index lift it over the header without + * the header having to know anything about it. Drives bl531:LJT4:1:AO0; closing + * it (5 V) pauses the detector and zeroes the diode current. + */ +function FloatingShutter() { + return ; +} + +type SimulatedBeamlineProps = { + /** Additional CSS classes applied to the widget's root container. */ + className?: string; +}; + +/** + * Self-contained simulated-beamline widget: bundles the Ophyd sim providers with + * the endstation graphic, simulated detector, beamline device table, and the + * beamstop-current trend plot — plus the beam-shutter control. Because it carries + * its own sim transport and camera socket factory it can be dropped in anywhere + * without external wiring; every panel reads and writes the same simulated + * beamline, so moves in the table update the graphic, detector, and plot live. + */ +export default function SimulatedBeamline({ className }: SimulatedBeamlineProps) { + const transport = useMemo(() => createOphydSimTransport(beamstopBeamline), []); + // Camera frames are driven by the '13SIM1' detector in the same sim, so the + // energy control in the device table modulates the image live. + const cameraSocketFactory = useMemo( + () => createSimDetectorCameraSocketFactory(beamstopBeamline, simDetectorConfig), + [], + ); + + return ( + + +
+ + {/* Top row: endstation graphic beside the simulated detector, both + * pinned to the same height. Wraps on narrow widths. Closing the + * shutter (5 V) pauses the detector and zeroes the diode current. */} +
+ + +
+ {/* Bottom row: device table beside the live beamstop-current trend. */} +
+ + +
+
+
+
+ ); +} diff --git a/src/lib/ophyd-sim/core/createOphydSim.ts b/src/lib/ophyd-sim/core/createOphydSim.ts index 6451abeb..baa3de56 100644 --- a/src/lib/ophyd-sim/core/createOphydSim.ts +++ b/src/lib/ophyd-sim/core/createOphydSim.ts @@ -14,7 +14,7 @@ import type { Unsubscribe, } from './types'; -const DEFAULT_TICK_MS = 1000 / 30; +const DEFAULT_TICK_MS = 100; /** * Build a simulator instance. Wires up shared state, a dependency graph for diff --git a/src/lib/ophyd-sim/react/OphydSimContext.ts b/src/lib/ophyd-sim/react/OphydSimContext.ts new file mode 100644 index 00000000..b1ed9925 --- /dev/null +++ b/src/lib/ophyd-sim/react/OphydSimContext.ts @@ -0,0 +1,16 @@ +import { createContext, useContext } from 'react'; +import type { OphydSim } from '../core/types'; + +export const OphydSimContext = createContext(null); + +export function useOphydSim(): OphydSim { + const sim = useContext(OphydSimContext); + if (!sim) { + throw new Error('useOphydSim called outside '); + } + return sim; +} + +export function useOphydSimOptional(): OphydSim | null { + return useContext(OphydSimContext); +} diff --git a/src/lib/ophyd-sim/react/OphydSimProvider.tsx b/src/lib/ophyd-sim/react/OphydSimProvider.tsx index 37c81e6a..3dae97c1 100644 --- a/src/lib/ophyd-sim/react/OphydSimProvider.tsx +++ b/src/lib/ophyd-sim/react/OphydSimProvider.tsx @@ -1,7 +1,6 @@ -import { createContext, useContext, useEffect, type ReactNode } from 'react'; +import { useEffect, type ReactNode } from 'react'; import type { OphydSim } from '../core/types'; - -const OphydSimContext = createContext(null); +import { OphydSimContext } from './OphydSimContext'; export interface OphydSimProviderProps { /** @@ -20,15 +19,3 @@ export function OphydSimProvider({ sim, children }: OphydSimProviderProps) { return {children}; } - -export function useOphydSim(): OphydSim { - const sim = useContext(OphydSimContext); - if (!sim) { - throw new Error('useOphydSim called outside '); - } - return sim; -} - -export function useOphydSimOptional(): OphydSim | null { - return useContext(OphydSimContext); -} diff --git a/src/lib/ophyd-sim/react/hooks.ts b/src/lib/ophyd-sim/react/hooks.ts index f2eec593..bd9fb675 100644 --- a/src/lib/ophyd-sim/react/hooks.ts +++ b/src/lib/ophyd-sim/react/hooks.ts @@ -1,6 +1,6 @@ import { useEffect, useState, useCallback } from 'react'; import type { SimValue } from '../core/types'; -import { useOphydSim } from './OphydSimProvider'; +import { useOphydSim } from './OphydSimContext'; /** * Subscribe to a single PV's value. Re-renders when it changes; returns the diff --git a/src/lib/ophyd-sim/react/index.ts b/src/lib/ophyd-sim/react/index.ts index 819af006..10373b93 100644 --- a/src/lib/ophyd-sim/react/index.ts +++ b/src/lib/ophyd-sim/react/index.ts @@ -1,3 +1,4 @@ -export { OphydSimProvider, useOphydSim, useOphydSimOptional } from './OphydSimProvider'; +export { OphydSimProvider } from './OphydSimProvider'; export type { OphydSimProviderProps } from './OphydSimProvider'; +export { useOphydSim, useOphydSimOptional } from './OphydSimContext'; export { useSimSignal, useSimSet } from './hooks'; diff --git a/src/testing/tests/EnergyVsCurrentPlotPV.test.tsx b/src/testing/tests/EnergyVsCurrentPlotPV.test.tsx new file mode 100644 index 00000000..3d5dc0c1 --- /dev/null +++ b/src/testing/tests/EnergyVsCurrentPlotPV.test.tsx @@ -0,0 +1,226 @@ +import { render, screen, act } from '@testing-library/react'; +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import EnergyVsCurrentPlotPV from '../../features/EnergyVsCurrentPlotPV'; +import type { PlotlyScatterProps } from '../../components/PlotlyScatter'; +import { beamstopCurrentModel, ENERGY_MIN_EV, ENERGY_MAX_EV } from '@/lib/ophyd-sim'; + +// Capture props forwarded to PlotlyScatter so we can inspect the traces the +// component builds without rendering real Plotly. +const ScatterMock = vi.fn(({ xAxisTitle, yAxisTitle }: PlotlyScatterProps) => ( +
+)); + +vi.mock('../../components/PlotlyScatter', () => ({ + default: (props: unknown) => ScatterMock(props as PlotlyScatterProps), +})); + +vi.mock('@/api/ophyd/useOphydPVSocket', () => ({ default: vi.fn() })); + +import useOphydPVSocket from '@/api/ophyd/useOphydPVSocket'; + +const ENERGY_PV = 'ENERGY'; +const CURRENT_PV = 'CURRENT'; +const BSX_PV = 'BSX'; +const BSY_PV = 'BSY'; + +type Trace = { x: number[]; y: number[]; name?: string; mode?: string }; + +const makeDevice = (value: number | string, units = 'A') => ({ value, units, connected: true }); + +/** Point PVs at the given values (any subset). Missing PVs stay absent. */ +const setDevices = (values: Partial>) => { + const devices: Record> = {}; + for (const [pv, value] of Object.entries(values)) { + if (value !== undefined) devices[pv] = makeDevice(value); + } + vi.mocked(useOphydPVSocket).mockReturnValue({ devices } as unknown as ReturnType< + typeof useOphydPVSocket + >); +}; + +/** The two traces from the most recent PlotlyScatter render: [expected, measured]. */ +const lastTraces = () => { + const props = ScatterMock.mock.calls[ScatterMock.mock.calls.length - 1][0]; + return props.data as unknown as [Trace, Trace]; +}; + +/** Recompute the expected curve exactly as the component does, for assertions. */ +const computeExpected = (x: number, y: number, steps: number) => { + const xs: number[] = []; + const ys: number[] = []; + for (let i = 0; i < steps; i++) { + const energyEV = ENERGY_MIN_EV + ((ENERGY_MAX_EV - ENERGY_MIN_EV) * i) / (steps - 1); + xs.push(energyEV); + ys.push(beamstopCurrentModel({ x, y, energyEV })); + } + return { xs, ys }; +}; + +const renderPlot = (props: Partial> = {}) => + render( + , + ); + +beforeEach(() => { + ScatterMock.mockClear(); + vi.useFakeTimers(); + setDevices({}); +}); + +afterEach(() => { + vi.useRealTimers(); + vi.restoreAllMocks(); +}); + +describe('EnergyVsCurrentPlotPV', () => { + // ─── Rendering & static props ───────────────────────────────────────────── + + it('renders PlotlyScatter', () => { + renderPlot(); + expect(screen.getByTestId('plotly-scatter')).toBeInTheDocument(); + }); + + it('labels the axes for energy (x) and current (y)', () => { + renderPlot(); + const scatter = screen.getByTestId('plotly-scatter'); + expect(scatter).toHaveAttribute('data-x-title', 'Beam Energy (eV)'); + expect(scatter).toHaveAttribute('data-y-title', 'Beamstop Current (A)'); + }); + + it('pins the x-axis range to the energy bounds', () => { + renderPlot(); + const props = ScatterMock.mock.calls[ScatterMock.mock.calls.length - 1][0]; + expect(props.xAxisRange).toEqual([ENERGY_MIN_EV, ENERGY_MAX_EV]); + }); + + it('forwards className to PlotlyScatter alongside the default height', () => { + renderPlot({ className: 'my-class' }); + const props = ScatterMock.mock.calls[ScatterMock.mock.calls.length - 1][0]; + expect(props.className).toContain('my-class'); + expect(props.className).toContain('h-96'); + }); + + it('renders Expected and Measured traces in that order', () => { + renderPlot(); + const [expected, measured] = lastTraces(); + expect(expected.name).toBe('Expected'); + expect(expected.mode).toBe('lines'); + expect(measured.name).toBe('Measured'); + expect(measured.mode).toBe('markers'); + }); + + // ─── Expected curve ─────────────────────────────────────────────────────── + + it('spans the full energy range with the default number of points', () => { + renderPlot(); + const [expected] = lastTraces(); + expect(expected.x).toHaveLength(100); + expect(expected.x[0]).toBe(ENERGY_MIN_EV); + expect(expected.x[expected.x.length - 1]).toBe(ENERGY_MAX_EV); + }); + + it('respects a custom expectedCurvePoints count', () => { + renderPlot({ expectedCurvePoints: 10 }); + const [expected] = lastTraces(); + expect(expected.x).toHaveLength(10); + }); + + it('defaults the beamstop position to (0,0) when the readback PVs are absent', () => { + renderPlot({ expectedCurvePoints: 5 }); + const [expected] = lastTraces(); + expect(expected.y).toEqual(computeExpected(0, 0, 5).ys); + }); + + it('shapes the expected curve from beamstopCurrentModel at the current beamstop position', () => { + setDevices({ [BSX_PV]: 3, [BSY_PV]: -2 }); + renderPlot({ expectedCurvePoints: 8 }); + const [expected] = lastTraces(); + expect(expected.y).toEqual(computeExpected(3, -2, 8).ys); + }); + + it('reshapes the expected curve when the beamstop moves', () => { + setDevices({ [BSX_PV]: 0, [BSY_PV]: 0 }); + const { rerender } = renderPlot({ expectedCurvePoints: 8 }); + const before = [...lastTraces()[0].y]; + + setDevices({ [BSX_PV]: 5, [BSY_PV]: 5 }); + rerender( + , + ); + const after = lastTraces()[0].y; + expect(after).not.toEqual(before); + expect(after).toEqual(computeExpected(5, 5, 8).ys); + }); + + // ─── Measured samples (polling) ──────────────────────────────────────────── + + it('starts with no measured points', () => { + setDevices({ [ENERGY_PV]: 1000, [CURRENT_PV]: 0.5 }); + renderPlot(); + const [, measured] = lastTraces(); + expect(measured.x).toHaveLength(0); + }); + + it('records an (energy, current) sample on each polling tick', () => { + setDevices({ [ENERGY_PV]: 1000, [CURRENT_PV]: 0.5 }); + renderPlot({ pollingIntervalMs: 100 }); + act(() => { + vi.advanceTimersByTime(100); + }); + const [, measured] = lastTraces(); + expect(measured.x).toEqual([1000]); + expect(measured.y).toEqual([0.5]); + }); + + it('does not record samples while energy or current is non-numeric', () => { + setDevices({ [ENERGY_PV]: 1000, [CURRENT_PV]: 'n/a' }); + renderPlot({ pollingIntervalMs: 100 }); + act(() => { + vi.advanceTimersByTime(500); + }); + const [, measured] = lastTraces(); + expect(measured.x).toHaveLength(0); + }); + + it('caps the measured window at numVisiblePoints, dropping the oldest', () => { + setDevices({ [ENERGY_PV]: 1000, [CURRENT_PV]: 0.5 }); + renderPlot({ pollingIntervalMs: 100, numVisiblePoints: 3 }); + act(() => { + vi.advanceTimersByTime(1000); // ~10 ticks + }); + const [, measured] = lastTraces(); + expect(measured.x).toHaveLength(3); + }); + + it('stops sampling after unmount', () => { + setDevices({ [ENERGY_PV]: 1000, [CURRENT_PV]: 0.5 }); + const { unmount } = renderPlot({ pollingIntervalMs: 100 }); + act(() => { + vi.advanceTimersByTime(100); + }); + unmount(); + // Advancing further must not throw (interval cleared) — a state update + // after unmount would surface here. + expect(() => + act(() => { + vi.advanceTimersByTime(500); + }), + ).not.toThrow(); + }); +}); From 677ab765a7470d5c202693647872531c302cc19f Mon Sep 17 00:00:00 2001 From: Prinstar Date: Fri, 24 Jul 2026 10:18:24 -0700 Subject: [PATCH 10/12] shutter on the top left of the beamline cartoon with absolute positioning --- src/app/pages/TestPage.tsx | 4 +- .../ComponentViewerExampleSim.tsx | 6 ++ .../SimulatedBeamline/SimulatedBeamline.tsx | 22 +++--- src/lib/ophyd-sim/scenarios/skills.md | 78 +++++++++++++++++++ 4 files changed, 98 insertions(+), 12 deletions(-) create mode 100644 src/lib/ophyd-sim/scenarios/skills.md diff --git a/src/app/pages/TestPage.tsx b/src/app/pages/TestPage.tsx index ceddcf8a..d7bcb499 100644 --- a/src/app/pages/TestPage.tsx +++ b/src/app/pages/TestPage.tsx @@ -1,5 +1,3 @@ -import SimulatedBeamline from '@/features/SimulatedBeamline/SimulatedBeamline'; - export default function TestPage() { - return ; + return

Add your test components here in src/app/pages/TestPage.tsx

; } diff --git a/src/features/ComponentViewer/ComponentViewerExampleSim.tsx b/src/features/ComponentViewer/ComponentViewerExampleSim.tsx index a6026299..511c8f71 100644 --- a/src/features/ComponentViewer/ComponentViewerExampleSim.tsx +++ b/src/features/ComponentViewer/ComponentViewerExampleSim.tsx @@ -10,6 +10,7 @@ import Histogram from '@/components/Histogram/Histogram'; import { CubeTransparent } from '@phosphor-icons/react'; import useSimOphydPVSocket from '@/api/ophyd/useSimOphydPVSocket'; +import SimulatedBeamline from '../SimulatedBeamline/SimulatedBeamline'; const SIM_DEVICES = ['sineSignal', 'noisySignal', 'motor1', 'motor2']; export default function ComponentViewerExampleSim() { @@ -67,6 +68,11 @@ export default function ComponentViewerExampleSim() { ), info: 'This component accepts an array PV and an acquire control PV for EPICS systems to display a histogram plot. This display uses a demo mode with simulated histogram data.', }, + OphydSim1: { + name: 'Simulated Beamline', + element: , + info: 'This component accepts an array PV and an acquire control PV for EPICS systems to display a histogram plot. This display uses a demo mode with simulated histogram data.', + }, }; return ; } diff --git a/src/features/SimulatedBeamline/SimulatedBeamline.tsx b/src/features/SimulatedBeamline/SimulatedBeamline.tsx index c946c3e5..112724c8 100644 --- a/src/features/SimulatedBeamline/SimulatedBeamline.tsx +++ b/src/features/SimulatedBeamline/SimulatedBeamline.tsx @@ -82,14 +82,16 @@ function SimulatedDetector() { } /** - * Beam-shutter control floated at the top-right of the viewport. Because it + * Beam-shutter control anchored to the top-left of the beamline cartoon. Because it * lives inside the widget's Ophyd sim providers it drives the simulated beamline - * directly; `fixed` positioning + a high z-index lift it over the header without - * the header having to know anything about it. Drives bl531:LJT4:1:AO0; closing - * it (5 V) pauses the detector and zeroes the diode current. + * directly; `absolute` positioning pins it to the top-left of the endstation graphic's + * `relative` container. Drives bl531:LJT4:1:AO0; closing it (5 V) pauses the detector + * and zeroes the diode current. */ function FloatingShutter() { - return ; + return ( + + ); } type SimulatedBeamlineProps = { @@ -118,14 +120,16 @@ export default function SimulatedBeamline({ className }: SimulatedBeamlineProps)
- {/* Top row: endstation graphic beside the simulated detector, both * pinned to the same height. Wraps on narrow widths. Closing the * shutter (5 V) pauses the detector and zeroes the diode current. */}
- +
+ + +
{/* Bottom row: device table beside the live beamstop-current trend. */} diff --git a/src/lib/ophyd-sim/scenarios/skills.md b/src/lib/ophyd-sim/scenarios/skills.md new file mode 100644 index 00000000..077483a2 --- /dev/null +++ b/src/lib/ophyd-sim/scenarios/skills.md @@ -0,0 +1,78 @@ +# beamstopBeamline + +A self-contained Ophyd simulation scenario that models a beamstop-alignment +beamline: motors, a beam shutter, an energy-dependent diode-current signal, and a +simulated area detector. Defined in [beamstopBeamline.ts](beamstopBeamline.ts), +with the noise-free physics shared through [beamstopModel.ts](beamstopModel.ts). + +It backs the `` feature and the +[SimulatedBeamline](../../../features/SimulatedBeamline/SimulatedBeamline.tsx) +widget — every panel there reads and writes this same sim, so a move in the +device table updates the endstation graphic, detector, and current plot live. + +## Devices & PVs + +| PV | Kind | Range / units | Notes | +| --- | --- | --- | --- | +| `bl531_xps2:beamstop_x_mm` | motor | `[-10, 10]` mm, v=0.8 | Beamstop X. Also `.RBV` / `.MOVN`. Starts at −5. | +| `bl531_xps2:beamstop_y_mm` | motor | `[-10, 10]` mm, v=0.8 | Beamstop Y. Also `.RBV` / `.MOVN`. Starts at +5. | +| `bl531:sample_x_mm` | motor | `[-10, 10]` mm, v=2 | Sample-holder X (translates the graphic). Starts centered. | +| `bl531:sample_y_mm` | motor | `[-10, 10]` mm, v=2 | Sample-holder Y (translates the graphic). Starts centered. | +| `bl531:mono_energy_eV` | motor | `[2000, 7000]` eV, v=100 | Writable photon energy. Starts at 4500 eV (`ENERGY_REF_EV`). | +| `bl531:LJT4:1:AO0` | shutter | 0 V open / 5 V closed | Beam shutter. Driven by ``. Defaults to **open**. | +| `bl201-beamstop:current` | signal | A, 100 ms period | Diode current, derived from the two beamstop RBVs + energy + shutter. | + +Exported constants: `SHUTTER_PV`, `simDetectorConfig` (the `13SIM1` detector from +[simDetector.json](simDetector.json)). + +## Physics model + +The coupling chain (deterministic, noise-free) lives in `beamstopCurrentModel`: + +``` +energy → DCM Bragg angle θ → beam Y shifts as cos(θ) + → 2D-Gaussian intercept of beam and beamstop → diode current +``` + +- The current peaks at `PEAK_CURRENT` (100) when the stop sits at + `(CENTER_X = 2.5, beamYAtEnergy(energy))` and falls off as a 2D Gaussian + (`SIGMA_X = 2`, `SIGMA_Y = 4`) away from it. +- Energy changes shift the beam **vertically**, so the optimal beamstop Y depends + on energy. At `ENERGY_REF_EV` (4500) the beam sits exactly at `CENTER_Y = 1.5`. +- The scenario adds Gaussian measurement noise (`sigma: 2e-8`) on top of the model; + the Energy-vs-Current plot draws the bare model as the "expected" curve. + +Motors start **off** the optimum so the feature's "Go To Best" logic has somewhere +to move to, and `BEAM_SHIFT_AMPLITUDE_MM` (4) is kept inside motor travel so the +peak is always reachable. + +## Shutter coupling + +Beam reaches the diode only when the shutter is open (`SHUTTER_OPEN_VALUE`). Any +other value — closed at 5 V, or mid-transit — makes `bl201-beamstop:current` read a +clean **zero** (no beam ⇒ no signal, no noise). In `SimulatedBeamline`, closing the +shutter also pauses the simulated detector stream. + +## Usage + +```ts +import { createOphydSimTransport } from '@/lib/ophyd-sim'; +import { beamstopBeamline, simDetectorConfig } from '@/lib/ophyd-sim'; + +const transport = createOphydSimTransport(beamstopBeamline); +``` + +The scenario is a plain `createOphydSim({ devices: [...] })` result — pass it to a +transport or `OphydSimProvider` and drive the PVs above through the normal Ophyd +socket hooks. + +## Registration-order gotchas + +Device order in the `devices` array matters because derived values resolve their +`dependsOn` at registration: + +1. The **shutter** is seeded before the diode signal so the signal's `dependsOn` + on `SHUTTER_PV` resolves. +2. The **detector** is placed after the energy motor so its derived + `image1:Opacity` computes from a seeded energy at registration, then tracks + energy on every change. From f276f3ec4a7c1088f62b1088ef811537d3abdd62 Mon Sep 17 00:00:00 2001 From: Prinstar Date: Mon, 27 Jul 2026 11:24:14 -0700 Subject: [PATCH 11/12] Updated skills.md and formatting issues --- .github/workflows/test.yml | 2 +- .../SimulatedBeamline/SimulatedBeamline.tsx | 83 +--------- .../SimulatedBeamlineDetector.tsx | 23 +++ .../SimulatedBeamlineDeviceTable.tsx | 47 ++++++ .../SimulatedBeamlineShutter.tsx | 14 ++ src/lib/ophyd-sim/scenarios/skills.md | 78 --------- src/lib/ophyd-sim/skills.md | 153 ++++++++++++++++++ ...opModel.test.ts => BeamstopModel.test.tsx} | 0 8 files changed, 244 insertions(+), 156 deletions(-) create mode 100644 src/features/SimulatedBeamline/SimulatedBeamlineDetector.tsx create mode 100644 src/features/SimulatedBeamline/SimulatedBeamlineDeviceTable.tsx create mode 100644 src/features/SimulatedBeamline/SimulatedBeamlineShutter.tsx delete mode 100644 src/lib/ophyd-sim/scenarios/skills.md create mode 100644 src/lib/ophyd-sim/skills.md rename src/testing/tests/{beamstopModel.test.ts => BeamstopModel.test.tsx} (100%) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5914aa00..a1a7d415 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -90,7 +90,7 @@ jobs: npm run test:run -- src/testing/tests/TiledLinePlotMaker.test.tsx npm run test:run -- src/testing/tests/Widget.test.tsx echo "Running ophyd sim test suites..." - npm run test:run -- src/testing/tests/beamstopModel.test.ts + npm run test:run -- src/testing/tests/BeamstopModel.test.tsx npm run test:run -- src/testing/tests/createFallbackTransport.test.ts npm run test:run -- src/testing/tests/simCameraSocket.test.ts npm run test:run -- src/testing/tests/ophyd-sim/dependencyGraph.test.ts diff --git a/src/features/SimulatedBeamline/SimulatedBeamline.tsx b/src/features/SimulatedBeamline/SimulatedBeamline.tsx index 112724c8..683b6b98 100644 --- a/src/features/SimulatedBeamline/SimulatedBeamline.tsx +++ b/src/features/SimulatedBeamline/SimulatedBeamline.tsx @@ -5,15 +5,13 @@ import { beamstopBeamline, simDetectorConfig, createSimDetectorCameraSocketFactory, - SHUTTER_OPEN_VALUE, } from '@/lib/ophyd-sim'; import { useMemo } from 'react'; -import useOphydPVSocket from '@/api/ophyd/useOphydPVSocket'; -import CameraCanvas from '@/components/Camera/CameraCanvas'; -import Shutter from '@/components/Shutter'; import SignalMonitorPlotPV from '@/components/SignalMonitorPlotPV'; import EndstationDisplay from '@/components/EndstationDisplay/EndstationDisplay'; -import TableDeviceControllerWithRBV from '@/components/TableDeviceControllerWithRBV'; +import SimulatedBeamlineDeviceTable from './SimulatedBeamlineDeviceTable'; +import SimulatedBeamlineDetector from './SimulatedBeamlineDetector'; +import SimulatedBeamlineShutter from './SimulatedBeamlineShutter'; import { cn } from '@/lib/utils'; /** Shared height for the device table and the beamstop-current plot beside it, @@ -24,75 +22,6 @@ const IMAGE_HEIGHT = 'h-[340px]'; /** Beamstop-current PV shown in the trend plot. */ const BEAMSTOP_CURRENT = 'bl201-beamstop:current'; -/** Shutter analog-output PV (0 V open / 5 V closed) — matches the default. */ -const SHUTTER_PV = 'bl531:LJT4:1:AO0'; - -/** - * Beam energy, sample X/Y, and beamstop X/Y — the writable beamline devices, - * driven through the same sim transport that feeds EndstationDisplay and the - * camera, so moves made here update those views live. - */ -const BEAMLINE_DEVICES = [ - 'bl531_xps2:beamstop_x_mm', - 'bl531_xps2:beamstop_y_mm', - 'bl531:sample_x_mm', - 'bl531:sample_y_mm', - 'bl531:mono_energy_eV', -]; -const BEAMLINE_DEVICES_RBV = [ - 'bl531_xps2:beamstop_x_mm.RBV', - 'bl531_xps2:beamstop_y_mm.RBV', - 'bl531:sample_x_mm.RBV', - 'bl531:sample_y_mm.RBV', - 'bl531:mono_energy_eV.RBV', -]; - -function BeamlineDeviceTable() { - const { devices, handleSetValueRequest, toggleDeviceLock, toggleExpand } = - useOphydPVSocket(BEAMLINE_DEVICES); - - const { devices: devicesRBV } = useOphydPVSocket(BEAMLINE_DEVICES_RBV); - return ( - - ); -} - -/** - * Simulated detector, paused whenever the beam shutter is not open. Subscribes - * to the shutter PV and hands `CameraCanvas` a controlled `paused` flag so the - * stream stops when the shutter closes and resumes when it reopens. - */ -function SimulatedDetector() { - const deviceList = useMemo(() => [SHUTTER_PV], []); - const { devices } = useOphydPVSocket(deviceList); - const shutterOpen = Number(devices[SHUTTER_PV]?.value) === SHUTTER_OPEN_VALUE; - return ( -
- -
- ); -} - -/** - * Beam-shutter control anchored to the top-left of the beamline cartoon. Because it - * lives inside the widget's Ophyd sim providers it drives the simulated beamline - * directly; `absolute` positioning pins it to the top-left of the endstation graphic's - * `relative` container. Drives bl531:LJT4:1:AO0; closing it (5 V) pauses the detector - * and zeroes the diode current. - */ -function FloatingShutter() { - return ( - - ); -} type SimulatedBeamlineProps = { /** Additional CSS classes applied to the widget's root container. */ @@ -125,16 +54,16 @@ export default function SimulatedBeamline({ className }: SimulatedBeamlineProps) * shutter (5 V) pauses the detector and zeroes the diode current. */}
- +
- +
{/* Bottom row: device table beside the live beamstop-current trend. */}
- + default. */ +const SHUTTER_PV = 'bl531:LJT4:1:AO0'; + +/** + * Simulated detector, paused whenever the beam shutter is not open. Subscribes + * to the shutter PV and hands `CameraCanvas` a controlled `paused` flag so the + * stream stops when the shutter closes and resumes when it reopens. + */ +export default function SimulatedBeamlineDetector() { + const deviceList = useMemo(() => [SHUTTER_PV], []); + const { devices } = useOphydPVSocket(deviceList); + const shutterOpen = Number(devices[SHUTTER_PV]?.value) === SHUTTER_OPEN_VALUE; + return ( +
+ +
+ ); +} diff --git a/src/features/SimulatedBeamline/SimulatedBeamlineDeviceTable.tsx b/src/features/SimulatedBeamline/SimulatedBeamlineDeviceTable.tsx new file mode 100644 index 00000000..10222220 --- /dev/null +++ b/src/features/SimulatedBeamline/SimulatedBeamlineDeviceTable.tsx @@ -0,0 +1,47 @@ +import useOphydPVSocket from '@/api/ophyd/useOphydPVSocket'; +import TableDeviceControllerWithRBV from '@/components/TableDeviceControllerWithRBV'; + +/** + * Beam energy, sample X/Y, and beamstop X/Y — the writable beamline devices, + * driven through the same sim transport that feeds EndstationDisplay and the + * camera, so moves made here update those views live. + */ +const BEAMLINE_DEVICES = [ + 'bl531_xps2:beamstop_x_mm', + 'bl531_xps2:beamstop_y_mm', + 'bl531:sample_x_mm', + 'bl531:sample_y_mm', + 'bl531:mono_energy_eV', +]; +const BEAMLINE_DEVICES_RBV = [ + 'bl531_xps2:beamstop_x_mm.RBV', + 'bl531_xps2:beamstop_y_mm.RBV', + 'bl531:sample_x_mm.RBV', + 'bl531:sample_y_mm.RBV', + 'bl531:mono_energy_eV.RBV', +]; + +type SimulatedBeamlineDeviceTableProps = { + /** Additional CSS classes applied to the device table (e.g. a shared panel height). */ + className?: string; +}; + +export default function SimulatedBeamlineDeviceTable({ + className, +}: SimulatedBeamlineDeviceTableProps) { + const { devices, handleSetValueRequest, toggleDeviceLock, toggleExpand } = + useOphydPVSocket(BEAMLINE_DEVICES); + + const { devices: devicesRBV } = useOphydPVSocket(BEAMLINE_DEVICES_RBV); + return ( + + ); +} diff --git a/src/features/SimulatedBeamline/SimulatedBeamlineShutter.tsx b/src/features/SimulatedBeamline/SimulatedBeamlineShutter.tsx new file mode 100644 index 00000000..bbf5c325 --- /dev/null +++ b/src/features/SimulatedBeamline/SimulatedBeamlineShutter.tsx @@ -0,0 +1,14 @@ +import Shutter from '@/components/Shutter'; + +/** + * Beam-shutter control anchored to the top-left of the beamline cartoon. Because it + * lives inside the widget's Ophyd sim providers it drives the simulated beamline + * directly; `absolute` positioning pins it to the top-left of the endstation graphic's + * `relative` container. Drives bl531:LJT4:1:AO0; closing it (5 V) pauses the detector + * and zeroes the diode current. + */ +export default function SimulatedBeamlineShutter() { + return ( + + ); +} diff --git a/src/lib/ophyd-sim/scenarios/skills.md b/src/lib/ophyd-sim/scenarios/skills.md deleted file mode 100644 index 077483a2..00000000 --- a/src/lib/ophyd-sim/scenarios/skills.md +++ /dev/null @@ -1,78 +0,0 @@ -# beamstopBeamline - -A self-contained Ophyd simulation scenario that models a beamstop-alignment -beamline: motors, a beam shutter, an energy-dependent diode-current signal, and a -simulated area detector. Defined in [beamstopBeamline.ts](beamstopBeamline.ts), -with the noise-free physics shared through [beamstopModel.ts](beamstopModel.ts). - -It backs the `` feature and the -[SimulatedBeamline](../../../features/SimulatedBeamline/SimulatedBeamline.tsx) -widget — every panel there reads and writes this same sim, so a move in the -device table updates the endstation graphic, detector, and current plot live. - -## Devices & PVs - -| PV | Kind | Range / units | Notes | -| --- | --- | --- | --- | -| `bl531_xps2:beamstop_x_mm` | motor | `[-10, 10]` mm, v=0.8 | Beamstop X. Also `.RBV` / `.MOVN`. Starts at −5. | -| `bl531_xps2:beamstop_y_mm` | motor | `[-10, 10]` mm, v=0.8 | Beamstop Y. Also `.RBV` / `.MOVN`. Starts at +5. | -| `bl531:sample_x_mm` | motor | `[-10, 10]` mm, v=2 | Sample-holder X (translates the graphic). Starts centered. | -| `bl531:sample_y_mm` | motor | `[-10, 10]` mm, v=2 | Sample-holder Y (translates the graphic). Starts centered. | -| `bl531:mono_energy_eV` | motor | `[2000, 7000]` eV, v=100 | Writable photon energy. Starts at 4500 eV (`ENERGY_REF_EV`). | -| `bl531:LJT4:1:AO0` | shutter | 0 V open / 5 V closed | Beam shutter. Driven by ``. Defaults to **open**. | -| `bl201-beamstop:current` | signal | A, 100 ms period | Diode current, derived from the two beamstop RBVs + energy + shutter. | - -Exported constants: `SHUTTER_PV`, `simDetectorConfig` (the `13SIM1` detector from -[simDetector.json](simDetector.json)). - -## Physics model - -The coupling chain (deterministic, noise-free) lives in `beamstopCurrentModel`: - -``` -energy → DCM Bragg angle θ → beam Y shifts as cos(θ) - → 2D-Gaussian intercept of beam and beamstop → diode current -``` - -- The current peaks at `PEAK_CURRENT` (100) when the stop sits at - `(CENTER_X = 2.5, beamYAtEnergy(energy))` and falls off as a 2D Gaussian - (`SIGMA_X = 2`, `SIGMA_Y = 4`) away from it. -- Energy changes shift the beam **vertically**, so the optimal beamstop Y depends - on energy. At `ENERGY_REF_EV` (4500) the beam sits exactly at `CENTER_Y = 1.5`. -- The scenario adds Gaussian measurement noise (`sigma: 2e-8`) on top of the model; - the Energy-vs-Current plot draws the bare model as the "expected" curve. - -Motors start **off** the optimum so the feature's "Go To Best" logic has somewhere -to move to, and `BEAM_SHIFT_AMPLITUDE_MM` (4) is kept inside motor travel so the -peak is always reachable. - -## Shutter coupling - -Beam reaches the diode only when the shutter is open (`SHUTTER_OPEN_VALUE`). Any -other value — closed at 5 V, or mid-transit — makes `bl201-beamstop:current` read a -clean **zero** (no beam ⇒ no signal, no noise). In `SimulatedBeamline`, closing the -shutter also pauses the simulated detector stream. - -## Usage - -```ts -import { createOphydSimTransport } from '@/lib/ophyd-sim'; -import { beamstopBeamline, simDetectorConfig } from '@/lib/ophyd-sim'; - -const transport = createOphydSimTransport(beamstopBeamline); -``` - -The scenario is a plain `createOphydSim({ devices: [...] })` result — pass it to a -transport or `OphydSimProvider` and drive the PVs above through the normal Ophyd -socket hooks. - -## Registration-order gotchas - -Device order in the `devices` array matters because derived values resolve their -`dependsOn` at registration: - -1. The **shutter** is seeded before the diode signal so the signal's `dependsOn` - on `SHUTTER_PV` resolves. -2. The **detector** is placed after the energy motor so its derived - `image1:Opacity` computes from a seeded energy at registration, then tracks - energy on every change. diff --git a/src/lib/ophyd-sim/skills.md b/src/lib/ophyd-sim/skills.md new file mode 100644 index 00000000..e8f6a351 --- /dev/null +++ b/src/lib/ophyd-sim/skills.md @@ -0,0 +1,153 @@ +# ophyd-sim + +A self-contained, browser-side simulator for [Ophyd](https://blueskyproject.io/ophyd/) +beamline devices. It models EPICS-style PVs — motors, shutters, detectors, and +derived signals — entirely in-process, so the app's normal Ophyd socket hooks +can be driven without a real IOC. It powers Storybook stories, tests, and the +[SimulatedBeamline](../../features/SimulatedBeamline/SimulatedBeamline.tsx) widget. + +Everything is re-exported from the package root ([index.ts](index.ts)); import from +`@/lib/ophyd-sim` rather than reaching into subfolders. + +## Mental model + +A sim is a bag of named PVs over shared state, plus two update mechanisms: + +- **Ticks** — a periodic loop (`tickMs`, default 100 ms) that advances + time-based devices (motor motion, periodic signals). +- **Derived signals** — values declared with a `dependsOn` list that recompute, + in dependency order, whenever an input PV changes. + +Devices are just **factories** that wire themselves into a `SimRegistration` at +build time — they seed PVs, register derived signals, and attach tick/set +handlers. Devices never reference each other directly; they read and write the +same shared state through the same `get`/`set` API user code uses. + +```ts +import { + createOphydSim, + motor, + shutter, + signal, + createOphydSimTransport, +} from '@/lib/ophyd-sim'; + +const sim = createOphydSim({ + devices: [ + motor({ name: 'IOC:m1', limits: [-10, 10], velocity: 2 }), + shutter({ name: 'IOC:shutter' }), + signal({ name: 'IOC:reading', dependsOn: ['IOC:m1.RBV'], compute: (ctx) => ... }), + ], +}); + +const transport = createOphydSimTransport(sim); +// or drive it directly: +sim.start(); +sim.set('IOC:m1', 5); // motor animates its .RBV toward 5, sets .MOVN +sim.get('IOC:m1.RBV'); +``` + +The sim does **not** tick until `start()` is called (usually by `OphydSimProvider` +on mount). In tests, skip the real loop and drive time by hand with +`sim.advance(deltaMs)`. + +## Building blocks + +Each subsystem lives in its own folder; the highlights: + +| Folder | What's there | +| --- | --- | +| [core/](core/) | `createOphydSim`, the `SimState` store, `DependencyGraph` for derived values, the `Scheduler` tick loop, and all shared [types](core/types.ts) (`OphydSim`, `SimRegistration`, `SimValueContext`, …). | +| [devices/](devices/) | Device factories: [`motor`](devices/motor.ts) (setpoint + `.RBV` + `.MOVN`), [`shutter`](devices/shutter.ts) (`SHUTTER_OPEN_VALUE` / `SHUTTER_CLOSED_VALUE`), [`signal`](devices/signal.ts), [`hexapod`](devices/hexapod.ts), and [`detector`](devices/detector.ts) (image opacity/mode/overlay modulation). | +| [generators/](generators/) | Pure value functions for `compute`: `gaussian`, `gaussian2d`, `randomNoise`, `randomWalk`, `braggAngle`. | +| [transport/](transport/) | [`createOphydSimTransport`](transport/createOphydSimTransport.ts) — adapts a sim to the app's Ophyd transport interface so the normal PV socket hooks work against it. | +| [camera/](camera/) | `SimCameraSocket` and `createSimDetectorCameraSocketFactory` — render a detector's derived state to canvas frames over a camera-socket-shaped API. | +| [react/](react/) | `OphydSimProvider` plus hooks (`useOphydSim`, `useOphydSimOptional`, `useSimSignal`, `useSimSet`). | +| [storybook/](storybook/) | `withOphydSim` decorator for stories. | +| [scenarios/](scenarios/) | Prebuilt, ready-to-use sims (see below). | + +## Writing a device or derived signal + +Inside a `compute(ctx)` you get a `SimValueContext`: + +- `ctx.get.number(pv)` / `.boolean(pv)` / `.string(pv)` / `.value(pv)` — read inputs. +- `ctx.time`, `ctx.dt` — current time and elapsed ms. +- `ctx.random()` — the sim's random source (override `random` in + `createOphydSim` for deterministic tests). + +`compute` runs once at registration to seed an initial value, so guard against +inputs that may not be seeded yet. Recomputation is best-effort: a `compute` (or +`onSet` handler) that throws is logged and skipped, not fatal. + +## Scenarios + +Ready-made sims exported from the root, defined in [scenarios/](scenarios/): + +- [`defaultBeamline`](scenarios/defaultBeamline.ts) — a basic motor/signal beamline. +- [`hexapodBeamline`](scenarios/hexapodBeamline.ts) — a hexapod-focused sim. +- [`beamstopBeamline`](scenarios/beamstopBeamline.ts) — the flagship scenario (below). + +### beamstopBeamline + +Models a beamstop-alignment beamline: motors, a beam shutter, an +energy-dependent diode-current signal, and a simulated area detector. Defined in +[beamstopBeamline.ts](scenarios/beamstopBeamline.ts), with the noise-free physics +shared through [beamstopModel.ts](scenarios/beamstopModel.ts). It backs the +`` feature and the +[SimulatedBeamline](../../features/SimulatedBeamline/SimulatedBeamline.tsx) widget — +every panel there reads and writes this same sim, so a move in the device table +updates the endstation graphic, detector, and current plot live. + +#### Devices & PVs + +| PV | Kind | Range / units | Notes | +| --- | --- | --- | --- | +| `bl531_xps2:beamstop_x_mm` | motor | `[-10, 10]` mm, v=0.8 | Beamstop X. Also `.RBV` / `.MOVN`. Starts at −5. | +| `bl531_xps2:beamstop_y_mm` | motor | `[-10, 10]` mm, v=0.8 | Beamstop Y. Also `.RBV` / `.MOVN`. Starts at +5. | +| `bl531:sample_x_mm` | motor | `[-10, 10]` mm, v=2 | Sample-holder X (translates the graphic). Starts centered. | +| `bl531:sample_y_mm` | motor | `[-10, 10]` mm, v=2 | Sample-holder Y (translates the graphic). Starts centered. | +| `bl531:mono_energy_eV` | motor | `[2000, 7000]` eV, v=100 | Writable photon energy. Starts at 4500 eV (`ENERGY_REF_EV`). | +| `bl531:LJT4:1:AO0` | shutter | 0 V open / 5 V closed | Beam shutter. Driven by ``. Defaults to **open**. | +| `bl201-beamstop:current` | signal | A, 100 ms period | Diode current, derived from the two beamstop RBVs + energy + shutter. | + +Also exports `simDetectorConfig` (the `13SIM1` detector from +[simDetector.json](scenarios/simDetector.json)). + +#### Physics model + +The coupling chain (deterministic, noise-free) lives in `beamstopCurrentModel`: + +``` +energy → DCM Bragg angle θ → beam Y shifts as cos(θ) + → 2D-Gaussian intercept of beam and beamstop → diode current +``` + +- The current peaks at `PEAK_CURRENT` (100) when the stop sits at + `(CENTER_X = 2.5, beamYAtEnergy(energy))` and falls off as a 2D Gaussian + (`SIGMA_X = 2`, `SIGMA_Y = 4`) away from it. +- Energy changes shift the beam **vertically**, so the optimal beamstop Y depends + on energy. At `ENERGY_REF_EV` (4500) the beam sits exactly at `CENTER_Y = 1.5`. +- The scenario adds Gaussian measurement noise (`sigma: 2e-8`) on top of the model; + the Energy-vs-Current plot draws the bare model as the "expected" curve. + +Motors start **off** the optimum so the feature's "Go To Best" logic has somewhere +to move to, and `BEAM_SHIFT_AMPLITUDE_MM` (4) is kept inside motor travel so the +peak is always reachable. + +#### Shutter coupling + +Beam reaches the diode only when the shutter is open (`SHUTTER_OPEN_VALUE`). Any +other value — closed at 5 V, or mid-transit — makes `bl201-beamstop:current` read a +clean **zero** (no beam ⇒ no signal, no noise). In `SimulatedBeamline`, closing the +shutter also pauses the simulated detector stream. + +#### Registration-order gotchas + +Device order in the `devices` array matters because derived values resolve their +`dependsOn` at registration: + +1. The **shutter** is seeded before the diode signal so the signal's `dependsOn` + on the shutter PV resolves. +2. The **detector** is placed after the energy motor so its derived + `image1:Opacity` computes from a seeded energy at registration, then tracks + energy on every change. diff --git a/src/testing/tests/beamstopModel.test.ts b/src/testing/tests/BeamstopModel.test.tsx similarity index 100% rename from src/testing/tests/beamstopModel.test.ts rename to src/testing/tests/BeamstopModel.test.tsx From 135fd97b8cd0a2584c4b55f83c929f34071b0a2d Mon Sep 17 00:00:00 2001 From: Prinstar Date: Wed, 29 Jul 2026 12:33:15 -0700 Subject: [PATCH 12/12] added readme.md --- src/lib/ophyd-sim/README.md | 530 ++++++++++++++++++++++++++++++++++++ 1 file changed, 530 insertions(+) create mode 100644 src/lib/ophyd-sim/README.md diff --git a/src/lib/ophyd-sim/README.md b/src/lib/ophyd-sim/README.md new file mode 100644 index 00000000..143ee4a7 --- /dev/null +++ b/src/lib/ophyd-sim/README.md @@ -0,0 +1,530 @@ +# ophyd-sim + +A self-contained, browser-side simulator for [Ophyd](https://blueskyproject.io/ophyd/) +beamline devices. It models EPICS-style PVs — motors, shutters, detectors, and +derived signals — entirely in-process, so finch's normal Ophyd socket hooks can +be driven without a real IOC or WebSocket backend. It powers Storybook stories, +tests, and the [`SimulatedBeamline`](../../features/SimulatedBeamline/SimulatedBeamline.tsx) +widget. + +Everything is re-exported from the package root ([index.ts](index.ts)); import +from `@/lib/ophyd-sim`, never from subfolders. + +> This README is the usage / getting-started guide. For the architecture and the +> internals of the store, scheduler, and dependency graph, see +> [skills.md](skills.md). + +--- + +## Table of contents + +1. [Getting started](#getting-started) — minimal sim + providers + one `DeviceControllerBox` +2. [Device catalog](#device-catalog) — instantiating every device type +3. [Creating connected devices](#creating-connected-devices) — one device driven by another +4. [How ophyd-sim works](#how-ophyd-sim-works) — architecture diagram +5. [When & how ophyd-sim kicks in](#when--how-ophyd-sim-kicks-in) — the transport seam and the hooks that use it + +--- + +## Getting started + +The bare minimum: build a sim, wrap the tree in the two providers, and render a +single [`DeviceControllerBox`](../../components/DeviceControllerBox.tsx) wired to +a simulated motor. Because `DeviceControllerBox` is a plain presentational +component, you connect it to the sim through the ordinary +[`useOphydPVSocket`](../../api/ophyd/useOphydPVSocket.tsx) hook — the exact same +hook used against a real IOC. + +```tsx +import { useMemo } from 'react'; +import { + OphydSimProvider, + createOphydSimTransport, + createOphydSim, + motor, +} from '@/lib/ophyd-sim'; +import { OphydTransportProvider } from '@/api/ophyd/OphydTransportProvider'; +import useOphydPVSocket from '@/api/ophyd/useOphydPVSocket'; +import DeviceControllerBox from '@/components/DeviceControllerBox'; + +// 1. Build a sim. Keep it stable across renders (module scope or useMemo). +const sim = createOphydSim({ + devices: [motor({ name: 'IOC:m1', limits: [-10, 10], velocity: 2, units: 'mm' })], +}); + +// 2. A leaf that talks to the sim through the normal Ophyd PV hook. +function MotorControl() { + const { devices, handleSetValueRequest, toggleDeviceLock } = useOphydPVSocket([ + 'IOC:m1', + 'IOC:m1.RBV', + ]); + + return ( + + ); +} + +// 3. Wrap the tree: OphydSimProvider starts/stops the tick loop; +// OphydTransportProvider routes the PV hooks at the sim instead of a WebSocket. +export function Example() { + const transport = useMemo(() => createOphydSimTransport(sim), []); + return ( + + + + + + ); +} +``` + +Moving the motor from the box animates `IOC:m1.RBV` toward the setpoint and the +readback ticks live — no backend involved. + +**In Storybook**, skip the boilerplate with the `withOphydSim` decorator, which +mounts both providers for you: + +```tsx +import { withOphydSim, defaultBeamline } from '@/lib/ophyd-sim'; + +export const decorators = [withOphydSim(defaultBeamline)]; +``` + +--- + +## Device catalog + +Every device is a **factory** you drop into the `devices` array of +`createOphydSim`. Below is a comprehensive example of each supported type. + +### Signal + +A scalar PV. It can be a static literal, a periodically-recomputed function, a +value derived from other PVs, or any combination. Signals are **read-only by +default** — pass `writeAccess: true` to make them writable. + +```ts +import { createOphydSim, signal, randomNoise } from '@/lib/ophyd-sim'; + +createOphydSim({ + devices: [ + // Static, read-only scalar. + signal({ name: 'IOC:temperature', initialValue: 21.5, units: 'C' }), + + // Writable enum (In / Out), used as a control input for other devices. + signal({ + name: 'IOC:bs', + initialValue: 0, + writeAccess: true, + enumStrs: ['Out', 'In'], + }), + + // Periodic signal: recomputes every 100 ms with fresh noise. + signal({ + name: 'IOC:pressure', + units: 'mbar', + periodMs: 100, + value: ({ random }) => 1000 + randomNoise({ random, sigma: 3 }), + }), + ], +}); +``` + +Key `SignalOptions`: `initialValue`, `value` (literal or `(ctx) => value`), +`dependsOn`, `periodMs`, `units`, `limits`, `writeAccess`, `precision`, +`enumStrs`. (See [signal.ts](devices/signal.ts).) + +### Motor + +A linear-velocity motor. One factory seeds **three PVs** that share a single +motion state: + +| PV | Meaning | +| --- | --- | +| `name` | setpoint (writable; clamps into `limits`) | +| `name.RBV` | readback — animates toward the setpoint at `velocity` units/s | +| `name.MOVN` | moving flag — `1` while moving, `0` once settled | + +```ts +import { createOphydSim, motor } from '@/lib/ophyd-sim'; + +createOphydSim({ + devices: [ + motor({ + name: 'IOC:m1', + initialPosition: 0, + velocity: 2, // units per second + limits: [-10, 10], // soft limits clamp setpoint writes + units: 'mm', + // epsilon: 1e-4, // settle tolerance (optional) + // readbackName: 'IOC:m1.RBV', // override defaults (optional) + // movingName: 'IOC:m1.MOVN', + }), + ], +}); +``` + +Writing the setpoint (`sim.set('IOC:m1', 5)`) sets `MOVN=1` and advances `.RBV` +by `velocity * dt` each tick until it lands within `epsilon`, then snaps and +clears `MOVN`. (See [motor.ts](devices/motor.ts).) + +### Detector + +A simulated area detector. Unlike single-value devices, a detector seeds a +**cluster** of standard Area-Detector PVs from one `prefix` — `cam1:SizeX`, +`cam1:SizeY`, `cam1:MinX`, `cam1:MinY`, `cam1:ColorMode`, `cam1:DataType`, +`cam1:Acquire`, and the image `image1:Mode`. The image pixels themselves are not +a PV; they stream over the [camera socket](#the-camera-socket) — but their scalar +parameters (opacity, overlay positions) are PVs that other devices can drive. + +```ts +import { createOphydSim, detector } from '@/lib/ophyd-sim'; + +createOphydSim({ + devices: [ + detector({ + prefix: '13SIM1', + image: { + mode: 'image_file', // or 'noisy' for random-noise frames + sizeX: 1024, + sizeY: 1024, + file: '/images/diffraction.png', + // files: ['/f0.png', '/f1.png'], // round-robin per frame (optional) + overlays: [ + { + file: '/images/beamstop-dot.png', + width: 32, + height: 32, + x: 512, // center in pixels (fallback if unbound) + y: 512, + }, + ], + }, + // Derived image parameters other devices drive — see next section. + modulations: [], + }), + ], +}); +``` + +Detectors are usually loaded from JSON — see +[simDetector.json](scenarios/simDetector.json) and `simDetectorConfig`. To render +frames to a canvas, pair the detector with +`createSimDetectorCameraSocketFactory` (see [The camera socket](#the-camera-socket)). +(See [detector.ts](devices/detector.ts).) + +### Bonus: shutter & hexapod + +Two higher-level factories cover common beamline hardware: + +```ts +import { createOphydSim, shutter, hexapod } from '@/lib/ophyd-sim'; + +createOphydSim({ + devices: [ + // Beam shutter: one analog-output PV, 0 V open / 5 V closed. Defaults open. + shutter({ name: 'bl531:LJT4:1:AO0' /*, initial: 'closed' */ }), + + // Symetrie six-axis hexapod: seeds *_RBV readbacks, MOVE_PTP setpoints, + // and the MOVE_PTP execute/STOP command PVs under the given prefix. + hexapod({ prefix: 'SYM:HEX01', translationVelocity: 4, rotationVelocity: 2 }), + ], +}); +``` + +See [shutter.ts](devices/shutter.ts) and [hexapod.ts](devices/hexapod.ts) for +the full PV maps and options. + +--- + +## Creating connected devices + +The whole point of the simulator is that one device can react to the **current +value of another**. Devices never reference each other directly — they read and +write the same shared state. A device becomes "connected" by listing the PVs it +cares about in `dependsOn`; its `compute` function then re-runs, in dependency +order, whenever any of those inputs change. + +Inside `compute(ctx)` you get a `SimValueContext`: + +- `ctx.get.number(pv)` / `.boolean(pv)` / `.string(pv)` / `.value(pv)` — read inputs +- `ctx.time`, `ctx.dt` — current time (ms) and elapsed seconds since last tick +- `ctx.random()` — the sim's random source (override `random` in `createOphydSim` + for deterministic tests) + +> `compute` also runs **once at registration** to seed an initial value, so guard +> against inputs that may not be seeded yet. Order matters: a dependency must be +> registered *before* the device that depends on it. A `compute` that throws is +> logged and skipped, not fatal. + +### Example 1 — a signal derived from a motor and a control input + +A diode reading that peaks when a motor's readback is near 2, is attenuated when +a beamstop is inserted, and carries measurement noise: + +```ts +import { createOphydSim, motor, signal, gaussian, randomNoise } from '@/lib/ophyd-sim'; + +createOphydSim({ + devices: [ + motor({ name: 'IOC:m1', limits: [-10, 10], velocity: 1, units: 'mm' }), + signal({ name: 'IOC:bs', initialValue: 0, writeAccess: true, enumStrs: ['Out', 'In'] }), + + // I0 recomputes whenever the motor readback OR the beamstop changes, + // and also every 100 ms so the noise keeps moving. + signal({ + name: 'I0', + units: 'arb.', + periodMs: 100, + dependsOn: ['IOC:m1.RBV', 'IOC:bs'], // <-- the connection + value: ({ get, random }) => { + const beam = 1000 * gaussian({ x: get.number('IOC:m1.RBV'), center: 2, sigma: 0.5 }); + const attenuated = get.boolean('IOC:bs') ? beam * 0.01 : beam; + return attenuated + randomNoise({ random, sigma: 5 }); + }, + }), + ], +}); +``` + +Now `sim.set('IOC:m1', 2)` makes `I0` climb as the readback approaches the peak, +and `sim.set('IOC:bs', 1)` drops it ~99% — all automatically. This is exactly the +[`defaultBeamline`](scenarios/defaultBeamline.ts) scenario. + +### Example 2 — chaining multiple derived signals + +`dependsOn` targets can themselves be derived PVs, so you can build a coupling +chain. Here energy drives a Bragg angle, which drives a beam position: + +```ts +import { createOphydSim, motor, signal, braggAngle } from '@/lib/ophyd-sim'; + +createOphydSim({ + devices: [ + motor({ name: 'bl:mono_energy_eV', limits: [2000, 7000], velocity: 100, initialPosition: 4500 }), + + // θ derived from energy. + signal({ + name: 'bl:bragg_deg', + units: 'deg', + dependsOn: ['bl:mono_energy_eV.RBV'], + value: ({ get }) => braggAngle({ energyEV: get.number('bl:mono_energy_eV.RBV') }), + }), + + // beam Y derived from θ — a second-order dependency. + signal({ + name: 'bl:beam_y_mm', + units: 'mm', + dependsOn: ['bl:bragg_deg'], + value: ({ get }) => 4 * Math.cos((get.number('bl:bragg_deg') * Math.PI) / 180), + }), + ], +}); +``` + +### Example 3 — a detector image driven by another device + +A detector `modulation` is just a derived PV under the hood: it binds an image +parameter (e.g. `image1:Opacity`) to a source PV via a linear-clamped map. Here +beam energy dims the rendered image, and a beamstop motor's readback drives an +overlay marker's position: + +```ts +detector({ + prefix: '13SIM1', + image: { + mode: 'image_file', + sizeX: 1024, + sizeY: 1024, + file: '/images/diffraction.png', + overlays: [ + { + file: '/images/beamstop-dot.png', + width: 32, + height: 32, + x: 512, + y: 512, + // Bind the marker's X to a motor readback: -10..10 mm -> 0..1024 px. + positionX: { + source: 'bl531_xps2:beamstop_x_mm.RBV', + from: { in: -10, out: 0 }, + to: { in: 10, out: 1024 }, + }, + }, + ], + }, + // Energy 2000..7000 eV maps to image opacity 1.0..0.2. + modulations: [ + { + source: 'bl:mono_energy_eV.RBV', + effect: 'opacity', + from: { in: 2000, out: 1.0 }, + to: { in: 7000, out: 0.2 }, + }, + ], +}); +``` + +The flagship [`beamstopBeamline`](scenarios/beamstopBeamline.ts) scenario wires +all of these patterns together (energy → Bragg → beam Y → 2D-Gaussian diode +current, gated by a shutter). It's worth reading as a full worked example — the +physics is documented in [skills.md](skills.md#beamstopbeamline). + +--- + +## How ophyd-sim works + +A sim is a bag of named PVs over shared state, plus two update mechanisms: + +- **Ticks** — a periodic loop (`tickMs`, ~33 ms ≈ 30 Hz) that advances time-based + devices: motor motion, periodic signals. +- **Derived signals** — values with a `dependsOn` list that recompute, in + dependency order, whenever an input PV changes. + +The React app never talks to the sim directly. It uses its ordinary Ophyd PV +hooks, which read a **transport** from context. In production that transport is a +WebSocket to a real IOC; `createOphydSimTransport` swaps in an implementation of +the same interface that reads and writes the in-memory sim instead. + +```mermaid +flowchart TB + subgraph react["React tree"] + comp["Component (e.g. DeviceControllerBox)"] + hook["useOphydPVSocket(['IOC:m1', ...])"] + comp -->|"handleSetValueRequest / devices"| hook + end + + subgraph provider["OphydTransportProvider (context seam)"] + ctx["PVTransportContext"] + end + + hook -->|"reads transport via useOphydPVTransport()"| ctx + + ctx -.->|"production"| ws["WebSocket → real IOC"] + ctx -->|"simulation"| transport["createOphydSimTransport(sim)"] + + subgraph sim["OphydSim instance"] + store["SimState store
(PV values + metadata)"] + depGraph["DependencyGraph
(derived recompute)"] + sched["Scheduler
(tick loop, tickMs)"] + devs["Device factories
motor / signal / detector / …"] + end + + transport -->|"send: subscribe / set / unsubscribe / refresh"| store + store -->|"value change events"| transport + transport -->|"meta + value messages"| hook + + devs -->|"seed / registerDerived / onTick / onSet"| store + store <--> depGraph + sched -->|"advance(dt) each tick"| store + provs["OphydSimProvider"] -->|"start() on mount, stop() on unmount"| sched +``` + +The two providers have distinct jobs: + +- **`OphydSimProvider`** owns the sim's lifecycle — it calls `sim.start()` on + mount and `sim.stop()` on unmount, and exposes the sim to the sim-specific + hooks (`useSimSignal`, `useSimSet`). +- **`OphydTransportProvider`** installs the transport into context so the + *generic* Ophyd hooks resolve to the sim instead of a WebSocket. (It can also + wrap the sim with `fallbackToReal` so descendants fail over to a real backend + if the override reports an error.) + +--- + +## When & how ophyd-sim kicks in + +ophyd-sim engages purely through the **transport seam**. finch's Ophyd hooks +never open a socket themselves — they pull a transport out of React context via +`useOphydPVTransport()`. Whichever transport is in context wins: + +- **No `OphydTransportProvider`, or no override** → the hook lazily constructs a + real WebSocket transport pointed at the configured backend. (Production.) +- **An `OphydTransportProvider` supplies `transport={createOphydSimTransport(sim)}`** + → every descendant PV hook is transparently driven by the sim. Nothing else in + the component changes; the same code runs against sim or IOC. (Storybook, tests, + `SimulatedBeamline`.) + +### What the sim transport speaks + +`createOphydSimTransport` implements the `OphydPVTransport` wire protocol. The +hooks exercise it through these actions ([createOphydSimTransport.ts](transport/createOphydSimTransport.ts)): + +| Action sent by a hook | What the sim transport does | +| --- | --- | +| `subscribe` / `subscribeSafely` / `subscribeReadOnly` | Emits a synthesized `meta` message (so the device shows connected) then streams every value change for that PV | +| `set` | Writes to the sim (`sim.set`), triggering derived recompute + motor motion | +| `unsubscribe` | Drops the most recent listener for that PV | +| `refresh` | Replays the latest value of every active subscription | +| `onStatus` | Reports `'open'` synchronously — there's no real handshake | + +### The Ophyd hooks that use the transport + +These are the specific hooks that resolve their transport from context and are +therefore driven by ophyd-sim when a sim transport is provided: + +- **[`useOphydPVSocket(pvs, wsUrl?)`](../../api/ophyd/useOphydPVSocket.tsx)** — the + primary PV-socket hook. Reads its transport via `useOphydPVTransport()`, sends + `subscribe`/`set`/`unsubscribe`/`refresh`, and returns `{ devices, + handleSetValueRequest, toggleDeviceLock, toggleExpand }`. **This is the hook the + sim is built to serve.** +- **[`useOphydSocket(pvs, wsUrl?)`](../../api/ophyd/useOphydSocket.ts)** — legacy + alias kept for backwards compatibility; delegates to `useOphydPVSocket`, so it + is sim-driven too. + +The React-native sim hooks in [`react/`](react/) talk to the sim **directly** +(not through the transport), and are handy when you're already inside an +`OphydSimProvider` and don't need the full PV-socket abstraction: + +- **`useSimSignal(pv)`** — subscribe to one PV's value; re-renders on change. +- **`useSimSet()`** — returns a stable `(pv, value) => void` writer. +- **`useOphydSim()` / `useOphydSimOptional()`** — grab the sim instance itself. + +### The camera socket + +Detector **image frames** don't travel over the PV transport — they stream over a +separate camera-socket seam. `CameraCanvas` reads its factory from +`useCameraSocketFactory()`, which `OphydTransportProvider` supplies via its +`cameraSocketFactory` prop. Pass +`createSimDetectorCameraSocketFactory(sim, detectorConfig)` there to render a +detector's live derived state (opacity, overlay positions) to canvas frames — see +[`SimulatedBeamline`](../../features/SimulatedBeamline/SimulatedBeamline.tsx) for +the full wiring. + +### Not backed by ophyd-sim + +- **[`useOphydDeviceSocket`](../../api/ophyd/useOphydDeviceSocket.ts)** uses the + separate *device*-socket transport. `createOphydSimTransport` is a *PV* + transport only, so this hook is not driven by ophyd-sim (it falls back to the + real device backend unless you supply a `deviceTransport` override). +- **[`useSimOphydPVSocket`](../../api/ophyd/useSimOphydPVSocket.tsx)** is an older, + standalone mock (`sineSignal` / `noisySignal` keywords) that is **unrelated** to + this package — it doesn't use a transport at all. Prefer `useOphydPVSocket` + + a sim transport for new work. + +### Driving the sim without React + +The transport and providers are optional. You can drive a sim directly — useful +in tests, where you skip the real loop and step time by hand: + +```ts +const sim = createOphydSim({ devices: [motor({ name: 'IOC:m1', velocity: 2 })] }); + +sim.set('IOC:m1', 5); // command a move +sim.advance(1000); // step 1 s of simulated time (no real timers) +sim.get('IOC:m1.RBV'); // => 2 (moved velocity * dt) + +// or run the real loop: +sim.start(); +// ... later ... +sim.stop(); +``` + +`advance(deltaMs)` runs a single synthetic tick, so motor motion and periodic +recompute are fully deterministic when you also override `random` and `now` in +`createOphydSim`.