diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml new file mode 100644 index 0000000..6aa649f --- /dev/null +++ b/.github/workflows/pre-commit.yml @@ -0,0 +1,40 @@ +name: Pre-commit + +on: + pull_request: + branches: [ default-app ] + +jobs: + pre-commit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '24' + + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 10 + + - name: Install dependencies and run frontend linting + run: | + if [ -d "client" ]; then + pnpm install + pnpm exec biome format --write && pnpm exec biome lint + else + echo "No client directory found, skipping frontend linting" + fi + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.12.9' + + # Official pre-commit action handles caching automatically + - uses: pre-commit/action@v3.0.1 + with: + extra_args: --all-files --show-diff-on-failure diff --git a/.gitignore b/.gitignore index 2c4bd69..612b62f 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,11 @@ target/ java/project.properties .admin/ .DS_Store -.vscode/ +**/.env +!client/.env + +# cache +py/__pycache__/ .classpath .project .settings/ \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c37ec35..4bbdd52 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -34,8 +34,32 @@ repos: - id: isort args: ['--profile', 'black'] files: '^py.*\.py$' + - repo: https://github.com/pre-commit/mirrors-mypy + rev: v1.18.2 + hooks: + - id: mypy + files: '\.py$' + args: [ + "--ignore-missing-imports", + "--show-error-codes", + "--explicit-package-bases", + "--allow-untyped-defs", + "--allow-incomplete-defs", + "--allow-untyped-calls", + "--no-strict-optional", + "--disable-error-code=misc", + "--disable-error-code=no-any-return", + "--disable-error-code=name-defined", + "--disable-error-code=attr-defined" + ] + additional_dependencies: [ # Continue to add dependencies here that have mypy extensions, such as pydantic + "types-requests", + "types-toml", + "pandas-stubs", + "numpy" + ] - repo: https://github.com/pamoller/xmlformatter rev: v0.2.8 hooks: - id: xml-formatter - files: '^.*\.xml$' \ No newline at end of file + files: '^.*\.xml$' diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e618422 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,13 @@ +{ + "java.configuration.updateBuildConfiguration": "automatic", + "java.compile.nullAnalysis.mode": "automatic", + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports.biome": "explicit", + "source.fixAll.biome": "explicit" + }, + "[java]": { + "editor.defaultFormatter": null, + "editor.codeActionsOnSave": {} + } +} diff --git a/biome.json b/biome.json index 55ae5a7..2640499 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.2.5/schema.json", + "$schema": "https://biomejs.dev/schemas/2.2.6/schema.json", "vcs": { "enabled": true, "clientKind": "git", diff --git a/client/package.json b/client/package.json index 3df67b6..4a47e07 100644 --- a/client/package.json +++ b/client/package.json @@ -10,21 +10,21 @@ "@emotion/styled": "^11.14.1", "@mui/icons-material": "^7.3.4", "@mui/material": "^7.3.4", - "@mui/x-data-grid": "^8.13.1", - "@mui/x-date-pickers": "^8.12.0", + "@mui/x-data-grid": "^8.14.1", + "@mui/x-date-pickers": "^8.14.1", "@semoss/sdk": "1.0.0-beta.31", "@semoss/sdk-react": "1.0.0-beta.20", "dayjs": "^1.11.18", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-router-dom": "^7.9.3" + "react-router-dom": "^7.9.4" }, "devDependencies": { - "@types/node": "^24.6.2", - "@types/react": "^18.3.25", + "@types/node": "^24.8.1", + "@types/react": "^18.3.26", "@types/react-dom": "^18.3.7", "@vitejs/plugin-react": "^5.0.4", "typescript": "^5.9.3", - "vite": "^7.1.9" + "vite": "^7.1.10" } } diff --git a/client/pnpm-lock.yaml b/client/pnpm-lock.yaml index 32ca198..2bdb6c3 100644 --- a/client/pnpm-lock.yaml +++ b/client/pnpm-lock.yaml @@ -10,22 +10,22 @@ importers: dependencies: '@emotion/react': specifier: ^11.14.0 - version: 11.14.0(@types/react@18.3.25)(react@18.3.1) + version: 11.14.0(@types/react@18.3.26)(react@18.3.1) '@emotion/styled': specifier: ^11.14.1 - version: 11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1) + version: 11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) '@mui/icons-material': specifier: ^7.3.4 - version: 7.3.4(@mui/material@7.3.4(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.25)(react@18.3.1) + version: 7.3.4(@mui/material@7.3.4(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) '@mui/material': specifier: ^7.3.4 - version: 7.3.4(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 7.3.4(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/x-data-grid': - specifier: ^8.13.1 - version: 8.13.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@mui/material@7.3.4(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.3(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^8.14.1 + version: 8.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@mui/material@7.3.4(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.3(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/x-date-pickers': - specifier: ^8.12.0 - version: 8.12.0(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@mui/material@7.3.4(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.3(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(dayjs@1.11.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^8.14.1 + version: 8.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@mui/material@7.3.4(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.3(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(dayjs@1.11.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@semoss/sdk': specifier: 1.0.0-beta.31 version: 1.0.0-beta.31(react@18.3.1) @@ -42,27 +42,27 @@ importers: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) react-router-dom: - specifier: ^7.9.3 - version: 7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^7.9.4 + version: 7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) devDependencies: '@types/node': - specifier: ^24.6.2 - version: 24.6.2 + specifier: ^24.8.1 + version: 24.8.1 '@types/react': - specifier: ^18.3.25 - version: 18.3.25 + specifier: ^18.3.26 + version: 18.3.26 '@types/react-dom': specifier: ^18.3.7 - version: 18.3.7(@types/react@18.3.25) + version: 18.3.7(@types/react@18.3.26) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.9(@types/node@24.6.2)(terser@5.44.0)) + version: 5.0.4(vite@7.1.10(@types/node@24.8.1)(terser@5.44.0)) typescript: specifier: ^5.9.3 version: 5.9.3 vite: - specifier: ^7.1.9 - version: 7.1.9(@types/node@24.6.2)(terser@5.44.0) + specifier: ^7.1.10 + version: 7.1.10(@types/node@24.8.1)(terser@5.44.0) packages: @@ -207,158 +207,158 @@ packages: '@emotion/weak-memoize@0.4.0': resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} - '@esbuild/aix-ppc64@0.25.10': - resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} + '@esbuild/aix-ppc64@0.25.11': + resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.10': - resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} + '@esbuild/android-arm64@0.25.11': + resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.10': - resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} + '@esbuild/android-arm@0.25.11': + resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.10': - resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} + '@esbuild/android-x64@0.25.11': + resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.10': - resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} + '@esbuild/darwin-arm64@0.25.11': + resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.10': - resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} + '@esbuild/darwin-x64@0.25.11': + resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.10': - resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} + '@esbuild/freebsd-arm64@0.25.11': + resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.10': - resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} + '@esbuild/freebsd-x64@0.25.11': + resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.10': - resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} + '@esbuild/linux-arm64@0.25.11': + resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.10': - resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} + '@esbuild/linux-arm@0.25.11': + resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.10': - resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} + '@esbuild/linux-ia32@0.25.11': + resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.10': - resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} + '@esbuild/linux-loong64@0.25.11': + resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.10': - resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} + '@esbuild/linux-mips64el@0.25.11': + resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.10': - resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} + '@esbuild/linux-ppc64@0.25.11': + resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.10': - resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} + '@esbuild/linux-riscv64@0.25.11': + resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.10': - resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} + '@esbuild/linux-s390x@0.25.11': + resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.10': - resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} + '@esbuild/linux-x64@0.25.11': + resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.10': - resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} + '@esbuild/netbsd-arm64@0.25.11': + resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.10': - resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} + '@esbuild/netbsd-x64@0.25.11': + resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.10': - resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} + '@esbuild/openbsd-arm64@0.25.11': + resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.10': - resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} + '@esbuild/openbsd-x64@0.25.11': + resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.10': - resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + '@esbuild/openharmony-arm64@0.25.11': + resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.10': - resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + '@esbuild/sunos-x64@0.25.11': + resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.10': - resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} + '@esbuild/win32-arm64@0.25.11': + resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.10': - resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + '@esbuild/win32-ia32@0.25.11': + resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.10': - resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} + '@esbuild/win32-x64@0.25.11': + resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -473,8 +473,8 @@ packages: '@types/react': optional: true - '@mui/x-data-grid@8.13.1': - resolution: {integrity: sha512-64MlyukMoGEDLT3kqdm6tw+rocgMayChj+h+fdAwqD4+2NMQoD5wZElQE+xTNmU0/DPv710X4ENceBRt2hMuGw==} + '@mui/x-data-grid@8.14.1': + resolution: {integrity: sha512-OY2oi61BSElXROgxZ2MPDFfnXGPyc7UbLc2ZrAryXus50XSQDYSxK0IP0pe0JyBDmZywV+5+GbV6YX7ZnlxRHw==} engines: {node: '>=14.0.0'} peerDependencies: '@emotion/react': ^11.9.0 @@ -489,8 +489,8 @@ packages: '@emotion/styled': optional: true - '@mui/x-date-pickers@8.12.0': - resolution: {integrity: sha512-CDcjdBNwMcTy3flZTCKZqSUS6deBFGKLqy3Vl6bgr5KTo8Vky2v+S+zNi56fv23Qs+P47GwpILcm3QZt/0BP0A==} + '@mui/x-date-pickers@8.14.1': + resolution: {integrity: sha512-NpUt08a0djJA/qnGzvfFoqZu8aumST73wdSgfFpA76Gd20a50NNL8OMk0enDQZG45jKHsgJqEYN9ramB+R/t5A==} engines: {node: '>=14.0.0'} peerDependencies: '@emotion/react': ^11.9.0 @@ -526,20 +526,14 @@ packages: moment-jalaali: optional: true - '@mui/x-internals@8.12.0': - resolution: {integrity: sha512-KCZgFHwuPg0v8I2gpjeC6k3eDRXPPX8RIGSNDXe8zSZ8dAw+p6Q2pzT9kKvctqCXSFK8ct/5YQwqx8Quhs8Ndg==} + '@mui/x-internals@8.14.0': + resolution: {integrity: sha512-esYyl61nuuFXiN631TWuPh2tqdoyTdBI/4UXgwH3rytF8jiWvy6prPBPRHEH1nvW3fgw9FoBI48FlOO+yEI8xg==} engines: {node: '>=14.0.0'} peerDependencies: react: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@mui/x-internals@8.13.1': - resolution: {integrity: sha512-OKQyCJ9uxtMpjBZCOEQGOR5MhgL1f9HjI4qZHuaLxxtDATK5rcBbVjBF67hI8FzXeF1wrcZP2wsjc4AgGpAo9g==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - - '@mui/x-virtualizer@0.2.2': - resolution: {integrity: sha512-+ZcGYh/9ykoEofzcAWcJ3n6TBXzCc2ETvytho30wRkYv1ez+8yps0ezns/QvC4JqXBge/3y+e+QatIYjkTltdw==} + '@mui/x-virtualizer@0.2.4': + resolution: {integrity: sha512-mQ5m/hcbmrSS6ZhxltO1a3nnKGl/sh8Rz9HohyiDlUKS7I/g8+lADzhCXcsDzg9PhQXGn0B5a0VQaK8UwMi6Yw==} engines: {node: '>=14.0.0'} peerDependencies: react: ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -691,8 +685,8 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/node@24.6.2': - resolution: {integrity: sha512-d2L25Y4j+W3ZlNAeMKcy7yDsK425ibcAOO2t7aPTz6gNMH0z2GThtwENCDc0d/Pw9wgyRqE5Px1wkV7naz8ang==} + '@types/node@24.8.1': + resolution: {integrity: sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -710,8 +704,8 @@ packages: peerDependencies: '@types/react': '*' - '@types/react@18.3.25': - resolution: {integrity: sha512-oSVZmGtDPmRZtVDqvdKUi/qgCsWp5IDY29wp8na8Bj4B3cc99hfNzvNhlMkVVxctkAOGUA3Km7MMpBHAnWfcIA==} + '@types/react@18.3.26': + resolution: {integrity: sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==} '@vitejs/plugin-react@5.0.4': resolution: {integrity: sha512-La0KD0vGkVkSk6K+piWDKRUyg8Rl5iAIKRMH0vMJI0Eg47bq1eOxmoObAaQG37WMW9MSyk7Cs8EIWwJC1PtzKA==} @@ -728,8 +722,8 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} - baseline-browser-mapping@2.8.11: - resolution: {integrity: sha512-i+sRXGhz4+QW8aACZ3+r1GAKMt0wlFpeA8M5rOQd0HEYw9zhDrlx9Wc8uQ0IdXakjJRthzglEwfB/yqIjO6iDg==} + baseline-browser-mapping@2.8.17: + resolution: {integrity: sha512-j5zJcx6golJYTG6c05LUZ3Z8Gi+M62zRT/ycz4Xq4iCOdpcxwg7ngEYD4KA0eWZC7U17qh/Smq8bYbACJ0ipBA==} hasBin: true browserslist@4.26.3: @@ -744,8 +738,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001747: - resolution: {integrity: sha512-mzFa2DGIhuc5490Nd/G31xN1pnBnYMadtkyTjefPI7wzypqgCEpeWu9bJr0OnDsyKrW75zA9ZAt7pbQFmwLsQg==} + caniuse-lite@1.0.30001751: + resolution: {integrity: sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==} clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} @@ -786,14 +780,14 @@ packages: dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} - electron-to-chromium@1.5.230: - resolution: {integrity: sha512-A6A6Fd3+gMdaed9wX83CvHYJb4UuapPD5X5SLq72VZJzxHSY0/LUweGXRWmQlh2ln7KV7iw7jnwXK7dlPoOnHQ==} + electron-to-chromium@1.5.237: + resolution: {integrity: sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg==} error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - esbuild@0.25.10: - resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + esbuild@0.25.11: + resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} engines: {node: '>=18'} hasBin: true @@ -881,8 +875,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - node-releases@2.0.21: - resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} + node-releases@2.0.25: + resolution: {integrity: sha512-4auku8B/vw5psvTiiN9j1dAOsXvMoGqJuKJcR+dTdqiXEK20mMTk1UEo3HS16LeGQsVG6+qKTPM9u/qQ2LqATA==} object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -932,15 +926,15 @@ packages: resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} - react-router-dom@7.9.3: - resolution: {integrity: sha512-1QSbA0TGGFKTAc/aWjpfW/zoEukYfU4dc1dLkT/vvf54JoGMkW+fNA+3oyo2gWVW1GM7BxjJVHz5GnPJv40rvg==} + react-router-dom@7.9.4: + resolution: {integrity: sha512-f30P6bIkmYvnHHa5Gcu65deIXoA2+r3Eb6PJIAddvsT9aGlchMatJ51GgpU470aSqRRbFX22T70yQNUGuW3DfA==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' react-dom: '>=18' - react-router@7.9.3: - resolution: {integrity: sha512-4o2iWCFIwhI/eYAIL43+cjORXYn/aRQPgtFRRZb3VzoyQ5Uej0Bmqj7437L97N9NJW4wnicSwLOLS+yCXfAPgg==} + react-router@7.9.4: + resolution: {integrity: sha512-SD3G8HKviFHg9xj7dNODUKDFgpG4xqD5nhyd0mYoB5iISepuZAvzSr8ywxgxKJ52yRzf/HWtVHc9AWwoTbljvA==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' @@ -1022,8 +1016,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - undici-types@7.13.0: - resolution: {integrity: sha512-Ov2Rr9Sx+fRgagJ5AX0qvItZG/JKKoBRAVITs1zk7IqZGTJUwgUr7qoYBpWwakpWilTZFM98rG/AFRocu10iIQ==} + undici-types@7.14.0: + resolution: {integrity: sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==} update-browserslist-db@1.1.3: resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} @@ -1036,8 +1030,8 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - vite@7.1.9: - resolution: {integrity: sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==} + vite@7.1.10: + resolution: {integrity: sha512-CmuvUBzVJ/e3HGxhg6cYk88NGgTnBoOo7ogtfJJ0fefUWAxN/WDSUa50o+oVBxuIhO8FoEZW0j2eW7sfjs5EtA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -1231,7 +1225,7 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1)': + '@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 '@emotion/babel-plugin': 11.13.5 @@ -1243,7 +1237,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.25 + '@types/react': 18.3.26 transitivePeerDependencies: - supports-color @@ -1257,18 +1251,18 @@ snapshots: '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1)': + '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.4.0 - '@emotion/react': 11.14.0(@types/react@18.3.25)(react@18.3.1) + '@emotion/react': 11.14.0(@types/react@18.3.26)(react@18.3.1) '@emotion/serialize': 1.3.3 '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1) '@emotion/utils': 1.4.2 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.25 + '@types/react': 18.3.26 transitivePeerDependencies: - supports-color @@ -1282,82 +1276,82 @@ snapshots: '@emotion/weak-memoize@0.4.0': {} - '@esbuild/aix-ppc64@0.25.10': + '@esbuild/aix-ppc64@0.25.11': optional: true - '@esbuild/android-arm64@0.25.10': + '@esbuild/android-arm64@0.25.11': optional: true - '@esbuild/android-arm@0.25.10': + '@esbuild/android-arm@0.25.11': optional: true - '@esbuild/android-x64@0.25.10': + '@esbuild/android-x64@0.25.11': optional: true - '@esbuild/darwin-arm64@0.25.10': + '@esbuild/darwin-arm64@0.25.11': optional: true - '@esbuild/darwin-x64@0.25.10': + '@esbuild/darwin-x64@0.25.11': optional: true - '@esbuild/freebsd-arm64@0.25.10': + '@esbuild/freebsd-arm64@0.25.11': optional: true - '@esbuild/freebsd-x64@0.25.10': + '@esbuild/freebsd-x64@0.25.11': optional: true - '@esbuild/linux-arm64@0.25.10': + '@esbuild/linux-arm64@0.25.11': optional: true - '@esbuild/linux-arm@0.25.10': + '@esbuild/linux-arm@0.25.11': optional: true - '@esbuild/linux-ia32@0.25.10': + '@esbuild/linux-ia32@0.25.11': optional: true - '@esbuild/linux-loong64@0.25.10': + '@esbuild/linux-loong64@0.25.11': optional: true - '@esbuild/linux-mips64el@0.25.10': + '@esbuild/linux-mips64el@0.25.11': optional: true - '@esbuild/linux-ppc64@0.25.10': + '@esbuild/linux-ppc64@0.25.11': optional: true - '@esbuild/linux-riscv64@0.25.10': + '@esbuild/linux-riscv64@0.25.11': optional: true - '@esbuild/linux-s390x@0.25.10': + '@esbuild/linux-s390x@0.25.11': optional: true - '@esbuild/linux-x64@0.25.10': + '@esbuild/linux-x64@0.25.11': optional: true - '@esbuild/netbsd-arm64@0.25.10': + '@esbuild/netbsd-arm64@0.25.11': optional: true - '@esbuild/netbsd-x64@0.25.10': + '@esbuild/netbsd-x64@0.25.11': optional: true - '@esbuild/openbsd-arm64@0.25.10': + '@esbuild/openbsd-arm64@0.25.11': optional: true - '@esbuild/openbsd-x64@0.25.10': + '@esbuild/openbsd-x64@0.25.11': optional: true - '@esbuild/openharmony-arm64@0.25.10': + '@esbuild/openharmony-arm64@0.25.11': optional: true - '@esbuild/sunos-x64@0.25.10': + '@esbuild/sunos-x64@0.25.11': optional: true - '@esbuild/win32-arm64@0.25.10': + '@esbuild/win32-arm64@0.25.11': optional: true - '@esbuild/win32-ia32@0.25.10': + '@esbuild/win32-ia32@0.25.11': optional: true - '@esbuild/win32-x64@0.25.10': + '@esbuild/win32-x64@0.25.11': optional: true '@jridgewell/gen-mapping@0.3.13': @@ -1387,23 +1381,23 @@ snapshots: '@mui/core-downloads-tracker@7.3.4': {} - '@mui/icons-material@7.3.4(@mui/material@7.3.4(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.25)(react@18.3.1)': + '@mui/icons-material@7.3.4(@mui/material@7.3.4(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.26)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/material': 7.3.4(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 7.3.4(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.25 + '@types/react': 18.3.26 - '@mui/material@7.3.4(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/material@7.3.4(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 '@mui/core-downloads-tracker': 7.3.4 - '@mui/system': 7.3.3(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1) - '@mui/types': 7.4.7(@types/react@18.3.25) - '@mui/utils': 7.3.3(@types/react@18.3.25)(react@18.3.1) + '@mui/system': 7.3.3(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) + '@mui/types': 7.4.7(@types/react@18.3.26) + '@mui/utils': 7.3.3(@types/react@18.3.26)(react@18.3.1) '@popperjs/core': 2.11.8 - '@types/react-transition-group': 4.4.12(@types/react@18.3.25) + '@types/react-transition-group': 4.4.12(@types/react@18.3.26) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 @@ -1412,20 +1406,20 @@ snapshots: react-is: 19.2.0 react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) optionalDependencies: - '@emotion/react': 11.14.0(@types/react@18.3.25)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1) - '@types/react': 18.3.25 + '@emotion/react': 11.14.0(@types/react@18.3.26)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) + '@types/react': 18.3.26 - '@mui/private-theming@7.3.3(@types/react@18.3.25)(react@18.3.1)': + '@mui/private-theming@7.3.3(@types/react@18.3.26)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/utils': 7.3.3(@types/react@18.3.25)(react@18.3.1) + '@mui/utils': 7.3.3(@types/react@18.3.26)(react@18.3.1) prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.25 + '@types/react': 18.3.26 - '@mui/styled-engine@7.3.3(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(react@18.3.1)': + '@mui/styled-engine@7.3.3(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 '@emotion/cache': 11.14.0 @@ -1435,107 +1429,97 @@ snapshots: prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@18.3.25)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1) + '@emotion/react': 11.14.0(@types/react@18.3.26)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) - '@mui/system@7.3.3(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1)': + '@mui/system@7.3.3(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/private-theming': 7.3.3(@types/react@18.3.25)(react@18.3.1) - '@mui/styled-engine': 7.3.3(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(react@18.3.1) - '@mui/types': 7.4.7(@types/react@18.3.25) - '@mui/utils': 7.3.3(@types/react@18.3.25)(react@18.3.1) + '@mui/private-theming': 7.3.3(@types/react@18.3.26)(react@18.3.1) + '@mui/styled-engine': 7.3.3(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(react@18.3.1) + '@mui/types': 7.4.7(@types/react@18.3.26) + '@mui/utils': 7.3.3(@types/react@18.3.26)(react@18.3.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@18.3.25)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1) - '@types/react': 18.3.25 + '@emotion/react': 11.14.0(@types/react@18.3.26)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) + '@types/react': 18.3.26 - '@mui/types@7.4.7(@types/react@18.3.25)': + '@mui/types@7.4.7(@types/react@18.3.26)': dependencies: '@babel/runtime': 7.28.4 optionalDependencies: - '@types/react': 18.3.25 + '@types/react': 18.3.26 - '@mui/utils@7.3.3(@types/react@18.3.25)(react@18.3.1)': + '@mui/utils@7.3.3(@types/react@18.3.26)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/types': 7.4.7(@types/react@18.3.25) + '@mui/types': 7.4.7(@types/react@18.3.26) '@types/prop-types': 15.7.15 clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 react-is: 19.2.0 optionalDependencies: - '@types/react': 18.3.25 + '@types/react': 18.3.26 - '@mui/x-data-grid@8.13.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@mui/material@7.3.4(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.3(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/x-data-grid@8.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@mui/material@7.3.4(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.3(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/material': 7.3.4(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/system': 7.3.3(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1) - '@mui/utils': 7.3.3(@types/react@18.3.25)(react@18.3.1) - '@mui/x-internals': 8.13.1(@types/react@18.3.25)(react@18.3.1) - '@mui/x-virtualizer': 0.2.2(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 7.3.4(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/system': 7.3.3(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) + '@mui/utils': 7.3.3(@types/react@18.3.26)(react@18.3.1) + '@mui/x-internals': 8.14.0(@types/react@18.3.26)(react@18.3.1) + '@mui/x-virtualizer': 0.2.4(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) use-sync-external-store: 1.6.0(react@18.3.1) optionalDependencies: - '@emotion/react': 11.14.0(@types/react@18.3.25)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1) + '@emotion/react': 11.14.0(@types/react@18.3.26)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) transitivePeerDependencies: - '@types/react' - '@mui/x-date-pickers@8.12.0(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@mui/material@7.3.4(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.3(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(dayjs@1.11.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/x-date-pickers@8.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@mui/material@7.3.4(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.3(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(dayjs@1.11.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/material': 7.3.4(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/system': 7.3.3(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1) - '@mui/utils': 7.3.3(@types/react@18.3.25)(react@18.3.1) - '@mui/x-internals': 8.12.0(@types/react@18.3.25)(react@18.3.1) - '@types/react-transition-group': 4.4.12(@types/react@18.3.25) + '@mui/material': 7.3.4(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/system': 7.3.3(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) + '@mui/utils': 7.3.3(@types/react@18.3.26)(react@18.3.1) + '@mui/x-internals': 8.14.0(@types/react@18.3.26)(react@18.3.1) + '@types/react-transition-group': 4.4.12(@types/react@18.3.26) clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) optionalDependencies: - '@emotion/react': 11.14.0(@types/react@18.3.25)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.25)(react@18.3.1))(@types/react@18.3.25)(react@18.3.1) + '@emotion/react': 11.14.0(@types/react@18.3.26)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) dayjs: 1.11.18 transitivePeerDependencies: - '@types/react' - '@mui/x-internals@8.12.0(@types/react@18.3.25)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.28.4 - '@mui/utils': 7.3.3(@types/react@18.3.25)(react@18.3.1) - react: 18.3.1 - reselect: 5.1.1 - use-sync-external-store: 1.6.0(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - '@mui/x-internals@8.13.1(@types/react@18.3.25)(react@18.3.1)': + '@mui/x-internals@8.14.0(@types/react@18.3.26)(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/utils': 7.3.3(@types/react@18.3.25)(react@18.3.1) + '@mui/utils': 7.3.3(@types/react@18.3.26)(react@18.3.1) react: 18.3.1 reselect: 5.1.1 use-sync-external-store: 1.6.0(react@18.3.1) transitivePeerDependencies: - '@types/react' - '@mui/x-virtualizer@0.2.2(@types/react@18.3.25)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/x-virtualizer@0.2.4(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/utils': 7.3.3(@types/react@18.3.25)(react@18.3.1) - '@mui/x-internals': 8.13.1(@types/react@18.3.25)(react@18.3.1) + '@mui/utils': 7.3.3(@types/react@18.3.26)(react@18.3.1) + '@mui/x-internals': 8.14.0(@types/react@18.3.26)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -1644,28 +1628,28 @@ snapshots: '@types/estree@1.0.8': {} - '@types/node@24.6.2': + '@types/node@24.8.1': dependencies: - undici-types: 7.13.0 + undici-types: 7.14.0 '@types/parse-json@4.0.2': {} '@types/prop-types@15.7.15': {} - '@types/react-dom@18.3.7(@types/react@18.3.25)': + '@types/react-dom@18.3.7(@types/react@18.3.26)': dependencies: - '@types/react': 18.3.25 + '@types/react': 18.3.26 - '@types/react-transition-group@4.4.12(@types/react@18.3.25)': + '@types/react-transition-group@4.4.12(@types/react@18.3.26)': dependencies: - '@types/react': 18.3.25 + '@types/react': 18.3.26 - '@types/react@18.3.25': + '@types/react@18.3.26': dependencies: '@types/prop-types': 15.7.15 csstype: 3.1.3 - '@vitejs/plugin-react@5.0.4(vite@7.1.9(@types/node@24.6.2)(terser@5.44.0))': + '@vitejs/plugin-react@5.0.4(vite@7.1.10(@types/node@24.8.1)(terser@5.44.0))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) @@ -1673,7 +1657,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.38 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.1.9(@types/node@24.6.2)(terser@5.44.0) + vite: 7.1.10(@types/node@24.8.1)(terser@5.44.0) transitivePeerDependencies: - supports-color @@ -1686,14 +1670,14 @@ snapshots: cosmiconfig: 7.1.0 resolve: 1.22.10 - baseline-browser-mapping@2.8.11: {} + baseline-browser-mapping@2.8.17: {} browserslist@4.26.3: dependencies: - baseline-browser-mapping: 2.8.11 - caniuse-lite: 1.0.30001747 - electron-to-chromium: 1.5.230 - node-releases: 2.0.21 + baseline-browser-mapping: 2.8.17 + caniuse-lite: 1.0.30001751 + electron-to-chromium: 1.5.237 + node-releases: 2.0.25 update-browserslist-db: 1.1.3(browserslist@4.26.3) buffer-from@1.1.2: @@ -1701,7 +1685,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001747: {} + caniuse-lite@1.0.30001751: {} clsx@2.1.1: {} @@ -1735,40 +1719,40 @@ snapshots: '@babel/runtime': 7.28.4 csstype: 3.1.3 - electron-to-chromium@1.5.230: {} + electron-to-chromium@1.5.237: {} error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 - esbuild@0.25.10: + esbuild@0.25.11: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.10 - '@esbuild/android-arm': 0.25.10 - '@esbuild/android-arm64': 0.25.10 - '@esbuild/android-x64': 0.25.10 - '@esbuild/darwin-arm64': 0.25.10 - '@esbuild/darwin-x64': 0.25.10 - '@esbuild/freebsd-arm64': 0.25.10 - '@esbuild/freebsd-x64': 0.25.10 - '@esbuild/linux-arm': 0.25.10 - '@esbuild/linux-arm64': 0.25.10 - '@esbuild/linux-ia32': 0.25.10 - '@esbuild/linux-loong64': 0.25.10 - '@esbuild/linux-mips64el': 0.25.10 - '@esbuild/linux-ppc64': 0.25.10 - '@esbuild/linux-riscv64': 0.25.10 - '@esbuild/linux-s390x': 0.25.10 - '@esbuild/linux-x64': 0.25.10 - '@esbuild/netbsd-arm64': 0.25.10 - '@esbuild/netbsd-x64': 0.25.10 - '@esbuild/openbsd-arm64': 0.25.10 - '@esbuild/openbsd-x64': 0.25.10 - '@esbuild/openharmony-arm64': 0.25.10 - '@esbuild/sunos-x64': 0.25.10 - '@esbuild/win32-arm64': 0.25.10 - '@esbuild/win32-ia32': 0.25.10 - '@esbuild/win32-x64': 0.25.10 + '@esbuild/aix-ppc64': 0.25.11 + '@esbuild/android-arm': 0.25.11 + '@esbuild/android-arm64': 0.25.11 + '@esbuild/android-x64': 0.25.11 + '@esbuild/darwin-arm64': 0.25.11 + '@esbuild/darwin-x64': 0.25.11 + '@esbuild/freebsd-arm64': 0.25.11 + '@esbuild/freebsd-x64': 0.25.11 + '@esbuild/linux-arm': 0.25.11 + '@esbuild/linux-arm64': 0.25.11 + '@esbuild/linux-ia32': 0.25.11 + '@esbuild/linux-loong64': 0.25.11 + '@esbuild/linux-mips64el': 0.25.11 + '@esbuild/linux-ppc64': 0.25.11 + '@esbuild/linux-riscv64': 0.25.11 + '@esbuild/linux-s390x': 0.25.11 + '@esbuild/linux-x64': 0.25.11 + '@esbuild/netbsd-arm64': 0.25.11 + '@esbuild/netbsd-x64': 0.25.11 + '@esbuild/openbsd-arm64': 0.25.11 + '@esbuild/openbsd-x64': 0.25.11 + '@esbuild/openharmony-arm64': 0.25.11 + '@esbuild/sunos-x64': 0.25.11 + '@esbuild/win32-arm64': 0.25.11 + '@esbuild/win32-ia32': 0.25.11 + '@esbuild/win32-x64': 0.25.11 escalade@3.2.0: {} @@ -1828,7 +1812,7 @@ snapshots: nanoid@3.3.11: {} - node-releases@2.0.21: {} + node-releases@2.0.25: {} object-assign@4.1.1: {} @@ -1875,13 +1859,13 @@ snapshots: react-refresh@0.17.0: {} - react-router-dom@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-router-dom@7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-router: 7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-router: 7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-router@7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: cookie: 1.0.2 react: 18.3.1 @@ -1980,7 +1964,7 @@ snapshots: typescript@5.9.3: {} - undici-types@7.13.0: {} + undici-types@7.14.0: {} update-browserslist-db@1.1.3(browserslist@4.26.3): dependencies: @@ -1992,16 +1976,16 @@ snapshots: dependencies: react: 18.3.1 - vite@7.1.9(@types/node@24.6.2)(terser@5.44.0): + vite@7.1.10(@types/node@24.8.1)(terser@5.44.0): dependencies: - esbuild: 0.25.10 + esbuild: 0.25.11 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 rollup: 4.52.4 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.6.2 + '@types/node': 24.8.1 fsevents: 2.3.3 terser: 5.44.0 diff --git a/client/src/hooks/useLoadingPixel.ts b/client/src/hooks/useLoadingPixel.ts index bad70f0..fca9571 100644 --- a/client/src/hooks/useLoadingPixel.ts +++ b/client/src/hooks/useLoadingPixel.ts @@ -6,16 +6,16 @@ import { useLoadingState } from "./useLoadingState"; * Custom hook to call a reactor, typically for fetching data on page load. * * @template T The expected type of the pixel response. - * @param {string} [pixelString] The pixel to call. + * @param {string | (...args: R[]) => (string | Promise)} [pixelString] The pixel to call. * @param {T} [initialValue] The initial value of the state, before being overwritten by the pixel return. * @param {boolean} [waitToLoad] A flag that prevents the pixel from running until ready. - * @returns {[T, boolean, () => void]} The pixel return, whether the call is loading, and a function to re-fetch. + * @returns {[T, boolean, (...args: R[]) => void]} The pixel return, whether the call is loading, and a function to re-fetch. */ -export const useLoadingPixel = ( - pixelString: string, +export const useLoadingPixel = ( + pixelString: string | ((...args: R[]) => string | Promise), initialValue?: T, - waitToLoad = false, -): [T, boolean, () => void] => { + waitToLoad: boolean = false, +): [T, boolean, (...args: R[]) => void] => { const { runPixel } = useAppContext(); /** @@ -27,18 +27,27 @@ export const useLoadingPixel = ( /** * Functions */ - const fetchPixel = useCallback(() => { - if (waitToLoad) return; - (async () => { - const loadingKey = setIsLoading(true); - try { - const response = await runPixel(pixelString); - setIsLoading(false, loadingKey, () => setResponse(response)); - } catch { - setIsLoading(false, loadingKey); - } - })(); - }, [pixelString, setIsLoading, runPixel, waitToLoad]); + const fetchPixel = useCallback( + (...args: R[]) => { + if (waitToLoad) return; + (async () => { + const loadingKey = setIsLoading(true); + try { + const response = await runPixel( + typeof pixelString === "function" + ? await pixelString(...args) + : pixelString, + ); + setIsLoading(false, loadingKey, () => + setResponse(response), + ); + } catch { + setIsLoading(false, loadingKey); + } + })(); + }, + [pixelString, setIsLoading, runPixel, waitToLoad], + ); /** * Effects diff --git a/client/src/pages/HomePage.tsx b/client/src/pages/HomePage.tsx index c5454f3..00b4bf6 100644 --- a/client/src/pages/HomePage.tsx +++ b/client/src/pages/HomePage.tsx @@ -1,4 +1,5 @@ -import { Stack, Typography } from "@mui/material"; +import { Stack, TextField, Typography } from "@mui/material"; +import { useState } from "react"; import { useLoadingPixel } from "@/hooks"; /** @@ -10,7 +11,18 @@ export const HomePage = () => { /** * State */ - const [data, isLoading] = useLoadingPixel("HelloUser()"); + const [textValue, setTextValue] = useState(""); + + /** + * Library hooks + */ + const [helloUserResponse, isLoadingHelloUser] = + useLoadingPixel("HelloUser()"); + const [callPythonResponse, isLoadingCallPython] = useLoadingPixel( + `CallPython(${Number(textValue)})`, + "", + !Number(textValue) && textValue !== "0", + ); return ( @@ -19,7 +31,7 @@ export const HomePage = () => { Welcome to the SEMOSS Template application! This repository is meant to be a starting point for your own SEMOSS application. - Example pixel call: + Example pixel calls:
  • @@ -28,7 +40,35 @@ export const HomePage = () => {
    • - {isLoading ? "Loading..." : data} + {isLoadingHelloUser + ? "Loading..." + : helloUserResponse} + +
    • +
    +
  • +
  • + + + {"CallPython( numValue ="} + + + setTextValue(e.target.value?.replace(/\D/g, "")) + } + size="small" + /> + + {")"} + + +
      +
    • + + {isLoadingCallPython + ? "Loading..." + : callPythonResponse}
    diff --git a/java/src/reactors/AbstractProjectReactor.java b/java/src/reactors/AbstractProjectReactor.java index 3d46933..d6039f0 100644 --- a/java/src/reactors/AbstractProjectReactor.java +++ b/java/src/reactors/AbstractProjectReactor.java @@ -43,7 +43,8 @@ public abstract class AbstractProjectReactor extends AbstractReactor { /** Project-specific properties and configuration settings. */ protected ProjectProperties projectProperties; - // TODO: intialize protected variables you would like your reactors to have access to + // TODO: Initialize additional protected variables (engines, external services, + // etc.) /** The result of the reactor execution, containing the output data and metadata. */ protected NounMetadata result = null; @@ -72,8 +73,8 @@ public NounMetadata execute() { } else { ex = new ProjectException(ErrorCode.INTERNAL_SERVER_ERROR, e); } - LOGGER.error(String.format("Reactor %s threw an error", this.getClass().getSimpleName()), e); + LOGGER.error(String.format("Reactor %s threw an error", this.getClass().getSimpleName()), e); return new NounMetadata(ex.getAsMap(), PixelDataType.MAP, PixelOperationType.ERROR); } } @@ -96,10 +97,9 @@ protected void preExecute() { projectProperties = ProjectProperties.getInstance(projectId); - // TODO: Update protected variables + // TODO: Initialize additional resources (engines, external services, etc.) user = this.insight.getUser(); - organizeKeys(); } @@ -116,17 +116,19 @@ protected void preExecute() { */ @SuppressWarnings("unchecked") protected Map getMap(String paramName) { - GenRowStruct mapGrs = this.store.getNoun(paramName); + GenRowStruct mapGrs = this.store.getGenRowStruct(paramName); if (mapGrs != null && !mapGrs.isEmpty()) { List mapInputs = mapGrs.getNounsOfType(PixelDataType.MAP); if (mapInputs != null && !mapInputs.isEmpty()) { return (Map) mapInputs.get(0).getValue(); } } + List mapInputs = this.curRow.getNounsOfType(PixelDataType.MAP); if (mapInputs != null && !mapInputs.isEmpty()) { return (Map) mapInputs.get(0).getValue(); } + return null; } diff --git a/java/src/reactors/examples/CallPythonReactor.java b/java/src/reactors/examples/CallPythonReactor.java new file mode 100644 index 0000000..ee92be4 --- /dev/null +++ b/java/src/reactors/examples/CallPythonReactor.java @@ -0,0 +1,109 @@ +package reactors.examples; + +import java.util.ArrayList; +import java.util.List; +import prerna.ds.py.PyTranslator; +import prerna.sablecc2.om.PixelDataType; +import prerna.sablecc2.om.ReactorKeysEnum; +import prerna.sablecc2.om.nounmeta.NounMetadata; +import reactors.AbstractProjectReactor; + +/** + * Reactor implementation that bridges Java reactor execution with an external Python helper + * function. This reactor expects a single numeric input and invokes a Python module function ( + * nthFibonacci) to compute the Nth Fibonacci number, returning the result. + * + *

    Execution flow: + * + *

      + *
    • Validates and retrieves the required numeric input key ({@link + * ReactorKeysEnum#NUMERIC_VALUE}). + *
    • Loads the Python source file (nthFibonacci.py) into a runtime module via + * {@link PyTranslator}. + *
    • Invokes the Python function nthFibonacci with the provided argument list. + *
    • Wraps and returns the Python response inside a {@link NounMetadata} result for downstream + * pixel operations. + *
    + * + *

    This class extends {@link AbstractProjectReactor} and leverages its protected context members + * (such as {@code insight}, {@code user}, and parameter retrieval utilities) to access project and + * execution context seamlessly. + * + * @see {@link AbstractProjectReactor} for base reactor lifecycle and error handling. + * @see {@link #doExecute()} for detailed per-execution business logic. + */ +public class CallPythonReactor extends AbstractProjectReactor { + + // Note: Has access to protected variables defined in AbstractProjectReactor + + /** + * Constructs a new {@link CallPythonReactor} configuring the required input keys for execution. + * The reactor requires one numeric value key which represents the target index (N) for the + * Fibonacci computation. + * + *

    Key configuration details: + * + *

      + *
    • {@link ReactorKeysEnum#NUMERIC_VALUE} - Required (denoted by 1 in {@code keyRequired}). + *
    + * + * @see {@link CallPythonReactor} for overall reactor purpose. + */ + public CallPythonReactor() { + + // list of keys the reactor is expecting + this.keysToGet = new String[] {ReactorKeysEnum.NUMERIC_VALUE.getKey()}; + + // 1 for required keys, 0 for optional + this.keyRequired = new int[] {1}; + } + + /** + * Executes the Python-backed Fibonacci computation and returns the resulting number. This method + * performs all per-invocation logic: extracting the input numeric key, loading the Python module + * file, invoking the target function, and wrapping the response. + * + *

    Processing steps: + * + *

      + *
    • Extract input N from {@link ReactorKeysEnum#NUMERIC_VALUE}. + *
    • Resolve project context ID (fallback to {@code insight.getProjectId()} when necessary). + *
    • Load nthFibonacci.py as a module using {@link PyTranslator}. + *
    • Invoke the Python function nthFibonacci with a single argument list holding + * N. + *
    • Wrap the returned Python object inside {@link NounMetadata} with type {@link + * PixelDataType#CONST_STRING}. + *
    + * + * @return A {@link NounMetadata} representing the computed Fibonacci value as a constant string. + * @see {@link AbstractProjectReactor#doExecute()} for overarching execution contract. + */ + @Override + protected NounMetadata doExecute() { + // grab the input number + int inputNum = Integer.parseInt(this.keyValue.get(ReactorKeysEnum.NUMERIC_VALUE.getKey())); + + // define the file to grab the helper function from + String sourceFile = "nthFibonacci.py"; + + PyTranslator pt = this.insight.getPyTranslator(); + + String projectId = this.insight.getContextProjectId(); + if (projectId == null) { + projectId = this.insight.getProjectId(); + } + + String fibonacciModule = pt.loadPythonModuleFromFile(this.insight, sourceFile, projectId); + + String functionName = "nthFibonacci"; + + // define the arguments to be passed to the function + List argsList = new ArrayList<>(); + argsList.add(inputNum); + + Object pyResponse = + pt.runFunctionFromLoadedModule(this.insight, fibonacciModule, functionName, argsList); + + return new NounMetadata(pyResponse, PixelDataType.CONST_STRING); + } +} diff --git a/java/src/util/Constants.java b/java/src/util/Constants.java index fd889ee..f50bc5c 100644 --- a/java/src/util/Constants.java +++ b/java/src/util/Constants.java @@ -11,9 +11,16 @@ * *

    As a utility class, this class should not be instantiated and all members should be static and * public for easy access throughout the project. + * + * @see {@link HelperMethods} for complementary reusable helper functions operating on constant + * values. + * @see {@link ProjectProperties} for dynamically loaded configuration properties that augment these + * static constants. */ public class Constants { - // TODO add any constants to be referenced in the project + // TODO add any constants to be referenced in the project (add JavaDoc for each + // constant when + // created). } diff --git a/java/src/util/HelperMethods.java b/java/src/util/HelperMethods.java index 2903609..ea31e97 100644 --- a/java/src/util/HelperMethods.java +++ b/java/src/util/HelperMethods.java @@ -10,5 +10,9 @@ * *

    As a utility class, this class should not be instantiated and all methods should be static and * public for easy access throughout the project. + * + * @see {@link Constants} for static configuration values that may be manipulated or referenced by + * future helper methods. + * @see {@link ProjectProperties} for dynamic property values that helper methods may consume. */ public class HelperMethods {} diff --git a/java/src/util/ProjectProperties.java b/java/src/util/ProjectProperties.java index cb41150..33fe2ea 100644 --- a/java/src/util/ProjectProperties.java +++ b/java/src/util/ProjectProperties.java @@ -9,20 +9,36 @@ import prerna.util.Utility; /** - * Loads property values from a project asset at + * Singleton utility class responsible for loading and exposing project-specific configuration + * properties. Properties are sourced from the project asset file located at: * - *

    [proj]/app_root/version/assets/java/project.properties
    + *
    + * [projectId]/app_root/version/assets/java/project.properties
    + * 
    * - * into a static instance. The project used to infer the path is an argument at runtime. + *

    Invocation pattern: * - *

    File format conforms to typical java.util.Properties style load patterns: one property per - * line with white space, {@code '='}, or {@code ':'} separating the key and value. + *

      + *
    • Call {@link #getInstance(String)} once with a valid project identifier to lazily initialize + * and load the backing properties file. + *
    • Subsequent calls to {@link #getInstance()} retrieve the same initialized singleton + * instance. + *
    * - *

    Replace the engineId applicable for your project in a format such as: + *

    File format conforms to standard {@link Properties} loading rules: one property per line with + * supported separators (whitespace, '=' or ':'). Custom project keys (e.g., engineId) + * can be defined following that pattern: * - *

    engineId=fc6a3fab-2425-4987-be93-58ad2efeee24
    + *
    + * engineId=fc6a3fab-2425-4987-be93-58ad2efeee24
    + * 
    * - * @see java.util.Properties#load(java.io.Reader) + *

    Error handling uses {@link ProjectException} wrapping {@link domain.base.ErrorCode} values to + * provide consistent structured failure semantics when initialization or file IO fails. + * + * @see {@link ProjectException} for structured configuration load error reporting. + * @see {@link #getInstance(String)} for initial lazy load of the singleton. + * @see {@link Properties#load(java.io.InputStream)} for supported file parsing rules. */ public class ProjectProperties { @@ -35,19 +51,23 @@ public class ProjectProperties { // TODO: Add var for each property /** - * Private constructor to prevent direct instantiation. This class follows the Singleton pattern - * and should be accessed through {@link #getInstance()} or {@link #getInstance(String)} methods. + * Private constructor to prevent direct instantiation. + * + *

    This class follows the Singleton pattern and should be accessed exclusively through {@link + * #getInstance()} or the lazy-loading {@link #getInstance(String)} initialization variant. */ private ProjectProperties() {} /** - * Returns the singleton instance of ProjectProperties. This method requires that the instance has - * already been initialized with a project ID using {@link #getInstance(String)}. If the instance - * has not been initialized, it throws a {@link ProjectException}. + * Returns the already-initialized singleton instance of {@link ProjectProperties}. * - * @return The singleton ProjectProperties instance - * @throws ProjectException If the instance has not been initialized with a project ID - * @see {@link #getInstance(String)} for initializing the instance + *

    This accessor requires prior initialization through {@link #getInstance(String)}. If the + * instance is still null, a {@link ProjectException} is thrown indicating an improper lifecycle + * usage. + * + * @return The singleton {@link ProjectProperties} instance. + * @throws ProjectException If the singleton has not yet been initialized. + * @see {@link #getInstance(String)} for first-time initialization semantics. */ public static ProjectProperties getInstance() { if (INSTANCE == null) { @@ -58,14 +78,15 @@ public static ProjectProperties getInstance() { } /** - * Returns the singleton instance of ProjectProperties, initializing it if necessary. If this is - * the first call or the instance is null, this method loads the project properties from the - * specified project's configuration file. + * Lazily initializes and returns the singleton instance of {@link ProjectProperties}. If no prior + * instance exists, this method triggers a properties file load using the supplied project + * identifier. * - * @param projectId The project identifier used to locate the project.properties file - * @return The singleton ProjectProperties instance - * @throws ProjectException If there are issues loading the project configuration - * @see {@link #loadProp(String)} for the actual property loading logic + * @param projectId The project identifier used to locate the project.properties + * file. + * @return The singleton {@link ProjectProperties} instance. + * @throws ProjectException If an IO error occurs during property loading. + * @see {@link #loadProp(String)} for internal file parsing and singleton assignment logic. */ public static ProjectProperties getInstance(String projectId) { if (INSTANCE == null) { @@ -75,21 +96,28 @@ public static ProjectProperties getInstance(String projectId) { } /** - * Loads project properties from the project's configuration file and initializes the singleton - * instance. This method reads the project.properties file from the project's assets folder and - * populates the ProjectProperties instance with the loaded configuration values. + * Internal helper that performs the actual loading of project configuration data into the + * singleton instance. The method constructs the properties file path using the resolved assets + * folder and delegates parsing to {@link Properties#load(java.io.InputStream)}. + * + *

    Location pattern: * - *

    The properties file is expected to be located at: + *

    +   * [projectId]/app_root/version/assets/java/project.properties
    +   * 
    * - *
    [projectId]/app_root/version/assets/java/project.properties
    + *

    Lifecycle notes: * - *

    This method uses try-with-resources to ensure proper resource cleanup and handles any IO - * exceptions by converting them to {@link ProjectException} instances. + *

      + *
    • On success, assigns the newly created instance to {@code INSTANCE}. + *
    • On failure (IO issues), resets {@code INSTANCE} to null and throws a {@link + * ProjectException} wrapping {@link domain.base.ErrorCode#INTERNAL_SERVER_ERROR}. + *
    * - * @param projectId The project identifier used to construct the path to the properties file - * @throws ProjectException If there are IO errors reading the properties file - * @see {@link Properties#load(java.io.InputStream)} for property file format requirements - * @see {@link AssetUtility#getProjectAssetsFolder(String)} for asset folder resolution + * @param projectId The project identifier used to build the canonical properties file path. + * @throws ProjectException If an {@link IOException} occurs during file access or parsing. + * @see {@link AssetUtility#getProjectAssetsFolder(String)} for asset folder resolution logic. + * @see {@link Properties#load(java.io.InputStream)} for specification-compliant parsing. */ private static void loadProp(String projectId) { ProjectProperties newInstance = new ProjectProperties(); @@ -101,7 +129,8 @@ private static void loadProp(String projectId) { Properties projectProperties = new Properties(); projectProperties.load(fileIn); - // TODO Add any properties to be read by the properties file and add the corresponding getter + // TODO Add any properties to be read by the properties file and add the + // corresponding getter. INSTANCE = newInstance; } catch (IOException e) { @@ -111,6 +140,7 @@ private static void loadProp(String projectId) { } } - // TODO: Add getters for properties + // TODO: Add getters for properties with appropriate JavaDoc linking to + // individual property keys. } diff --git a/package.json b/package.json index dd4106e..a886de0 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,15 @@ { "private": true, "scripts": { - "fix": "biome format --write && biome lint; pre-commit run --all-files || pre-commit run --all-files", + "fix": "biome format --write && biome lint && pre-commit run --all-files || pre-commit run --all-files", "dev": "pnpm --dir client dev", - "javadoc": "mvn clean javadoc:javadoc; mvn site; pnpm exec http-server target/site/apidocs -p 1227 -a localhost -o" + "javadoc": "mvn clean javadoc:javadoc && mvn site && pnpm exec http-server target/site/apidocs -p 1227 -a localhost -o" }, "devDependencies": { - "@biomejs/biome": "2.2.5", + "@biomejs/biome": "2.2.6", "http-server": "^14.1.1", "husky": "^9.1.7", - "lint-staged": "^16.2.3" + "lint-staged": "^16.2.4" }, "lint-staged": { "**/*.{js,jsx,ts,tsx,json,html,css}": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2b67ba7..25351f6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: devDependencies: '@biomejs/biome': - specifier: 2.2.5 - version: 2.2.5 + specifier: 2.2.6 + version: 2.2.6 http-server: specifier: ^14.1.1 version: 14.1.1 @@ -18,60 +18,60 @@ importers: specifier: ^9.1.7 version: 9.1.7 lint-staged: - specifier: ^16.2.3 - version: 16.2.3 + specifier: ^16.2.4 + version: 16.2.4 packages: - '@biomejs/biome@2.2.5': - resolution: {integrity: sha512-zcIi+163Rc3HtyHbEO7CjeHq8DjQRs40HsGbW6vx2WI0tg8mYQOPouhvHSyEnCBAorfYNnKdR64/IxO7xQ5faw==} + '@biomejs/biome@2.2.6': + resolution: {integrity: sha512-yKTCNGhek0rL5OEW1jbLeZX8LHaM8yk7+3JRGv08my+gkpmtb5dDE+54r2ZjZx0ediFEn1pYBOJSmOdDP9xtFw==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.2.5': - resolution: {integrity: sha512-MYT+nZ38wEIWVcL5xLyOhYQQ7nlWD0b/4mgATW2c8dvq7R4OQjt/XGXFkXrmtWmQofaIM14L7V8qIz/M+bx5QQ==} + '@biomejs/cli-darwin-arm64@2.2.6': + resolution: {integrity: sha512-UZPmn3M45CjTYulgcrFJFZv7YmK3pTxTJDrFYlNElT2FNnkkX4fsxjExTSMeWKQYoZjvekpH5cvrYZZlWu3yfA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.2.5': - resolution: {integrity: sha512-FLIEl73fv0R7dI10EnEiZLw+IMz3mWLnF95ASDI0kbx6DDLJjWxE5JxxBfmG+udz1hIDd3fr5wsuP7nwuTRdAg==} + '@biomejs/cli-darwin-x64@2.2.6': + resolution: {integrity: sha512-HOUIquhHVgh/jvxyClpwlpl/oeMqntlteL89YqjuFDiZ091P0vhHccwz+8muu3nTyHWM5FQslt+4Jdcd67+xWQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.2.5': - resolution: {integrity: sha512-5Ov2wgAFwqDvQiESnu7b9ufD1faRa+40uwrohgBopeY84El2TnBDoMNXx6iuQdreoFGjwW8vH6k68G21EpNERw==} + '@biomejs/cli-linux-arm64-musl@2.2.6': + resolution: {integrity: sha512-TjCenQq3N6g1C+5UT3jE1bIiJb5MWQvulpUngTIpFsL4StVAUXucWD0SL9MCW89Tm6awWfeXBbZBAhJwjyFbRQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-arm64@2.2.5': - resolution: {integrity: sha512-5DjiiDfHqGgR2MS9D+AZ8kOfrzTGqLKywn8hoXpXXlJXIECGQ32t+gt/uiS2XyGBM2XQhR6ztUvbjZWeccFMoQ==} + '@biomejs/cli-linux-arm64@2.2.6': + resolution: {integrity: sha512-BpGtuMJGN+o8pQjvYsUKZ+4JEErxdSmcRD/JG3mXoWc6zrcA7OkuyGFN1mDggO0Q1n7qXxo/PcupHk8gzijt5g==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-x64-musl@2.2.5': - resolution: {integrity: sha512-AVqLCDb/6K7aPNIcxHaTQj01sl1m989CJIQFQEaiQkGr2EQwyOpaATJ473h+nXDUuAcREhccfRpe/tu+0wu0eQ==} + '@biomejs/cli-linux-x64-musl@2.2.6': + resolution: {integrity: sha512-1ZcBux8zVM3JhWN2ZCPaYf0+ogxXG316uaoXJdgoPZcdK/rmRcRY7PqHdAos2ExzvjIdvhQp72UcveI98hgOog==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-linux-x64@2.2.5': - resolution: {integrity: sha512-fq9meKm1AEXeAWan3uCg6XSP5ObA6F/Ovm89TwaMiy1DNIwdgxPkNwxlXJX8iM6oRbFysYeGnT0OG8diCWb9ew==} + '@biomejs/cli-linux-x64@2.2.6': + resolution: {integrity: sha512-1HaM/dpI/1Z68zp8ZdT6EiBq+/O/z97a2AiHMl+VAdv5/ELckFt9EvRb8hDHpk8hUMoz03gXkC7VPXOVtU7faA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-win32-arm64@2.2.5': - resolution: {integrity: sha512-xaOIad4wBambwJa6mdp1FigYSIF9i7PCqRbvBqtIi9y29QtPVQ13sDGtUnsRoe6SjL10auMzQ6YAe+B3RpZXVg==} + '@biomejs/cli-win32-arm64@2.2.6': + resolution: {integrity: sha512-h3A88G8PGM1ryTeZyLlSdfC/gz3e95EJw9BZmA6Po412DRqwqPBa2Y9U+4ZSGUAXCsnSQE00jLV8Pyrh0d+jQw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.2.5': - resolution: {integrity: sha512-F/jhuXCssPFAuciMhHKk00xnCAxJRS/pUzVfXYmOMUp//XW7mO6QeCjsjvnm8L4AO/dG2VOB0O+fJPiJ2uXtIw==} + '@biomejs/cli-win32-x64@2.2.6': + resolution: {integrity: sha512-yx0CqeOhPjYQ5ZXgPfu8QYkgBhVJyvWe36as7jRuPrKPO5ylVDfwVtPQ+K/mooNTADW0IhxOZm3aPu16dP8yNQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -154,8 +154,8 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - emoji-regex@10.5.0: - resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} @@ -257,8 +257,8 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - lint-staged@16.2.3: - resolution: {integrity: sha512-1OnJEESB9zZqsp61XHH2fvpS1es3hRCxMplF/AJUDa8Ho8VrscYDIuxGrj3m8KPXbcWZ8fT9XTMUhEQmOVKpKw==} + lint-staged@16.2.4: + resolution: {integrity: sha512-Pkyr/wd90oAyXk98i/2KwfkIhoYQUMtss769FIT9hFM5ogYZwrk+GRE46yKXSg2ZGhcJ1p38Gf5gmI5Ohjg2yg==} engines: {node: '>=20.17'} hasBin: true @@ -293,8 +293,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nano-spawn@1.0.3: - resolution: {integrity: sha512-jtpsQDetTnvS2Ts1fiRdci5rx0VYws5jGyC+4IYOTnIQ/wwdf6JdomlHBwqC3bJYOvaKu0C2GSZ1A60anrYpaA==} + nano-spawn@2.0.0: + resolution: {integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==} engines: {node: '>=20.17'} object-inspect@1.13.4: @@ -415,39 +415,39 @@ packages: snapshots: - '@biomejs/biome@2.2.5': + '@biomejs/biome@2.2.6': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.2.5 - '@biomejs/cli-darwin-x64': 2.2.5 - '@biomejs/cli-linux-arm64': 2.2.5 - '@biomejs/cli-linux-arm64-musl': 2.2.5 - '@biomejs/cli-linux-x64': 2.2.5 - '@biomejs/cli-linux-x64-musl': 2.2.5 - '@biomejs/cli-win32-arm64': 2.2.5 - '@biomejs/cli-win32-x64': 2.2.5 - - '@biomejs/cli-darwin-arm64@2.2.5': + '@biomejs/cli-darwin-arm64': 2.2.6 + '@biomejs/cli-darwin-x64': 2.2.6 + '@biomejs/cli-linux-arm64': 2.2.6 + '@biomejs/cli-linux-arm64-musl': 2.2.6 + '@biomejs/cli-linux-x64': 2.2.6 + '@biomejs/cli-linux-x64-musl': 2.2.6 + '@biomejs/cli-win32-arm64': 2.2.6 + '@biomejs/cli-win32-x64': 2.2.6 + + '@biomejs/cli-darwin-arm64@2.2.6': optional: true - '@biomejs/cli-darwin-x64@2.2.5': + '@biomejs/cli-darwin-x64@2.2.6': optional: true - '@biomejs/cli-linux-arm64-musl@2.2.5': + '@biomejs/cli-linux-arm64-musl@2.2.6': optional: true - '@biomejs/cli-linux-arm64@2.2.5': + '@biomejs/cli-linux-arm64@2.2.6': optional: true - '@biomejs/cli-linux-x64-musl@2.2.5': + '@biomejs/cli-linux-x64-musl@2.2.6': optional: true - '@biomejs/cli-linux-x64@2.2.5': + '@biomejs/cli-linux-x64@2.2.6': optional: true - '@biomejs/cli-win32-arm64@2.2.5': + '@biomejs/cli-win32-arm64@2.2.6': optional: true - '@biomejs/cli-win32-x64@2.2.5': + '@biomejs/cli-win32-x64@2.2.6': optional: true ansi-escapes@7.1.1: @@ -518,7 +518,7 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - emoji-regex@10.5.0: {} + emoji-regex@10.6.0: {} environment@1.1.0: {} @@ -617,12 +617,12 @@ snapshots: is-number@7.0.0: {} - lint-staged@16.2.3: + lint-staged@16.2.4: dependencies: commander: 14.0.1 listr2: 9.0.4 micromatch: 4.0.8 - nano-spawn: 1.0.3 + nano-spawn: 2.0.0 pidtree: 0.6.0 string-argv: 0.3.2 yaml: 2.8.1 @@ -659,7 +659,7 @@ snapshots: ms@2.1.3: {} - nano-spawn@1.0.3: {} + nano-spawn@2.0.0: {} object-inspect@1.13.4: {} @@ -738,7 +738,7 @@ snapshots: string-width@7.2.0: dependencies: - emoji-regex: 10.5.0 + emoji-regex: 10.6.0 get-east-asian-width: 1.4.0 strip-ansi: 7.1.2 diff --git a/py/nthFibonacci.py b/py/nthFibonacci.py new file mode 100644 index 0000000..f39fca0 --- /dev/null +++ b/py/nthFibonacci.py @@ -0,0 +1,14 @@ +# sample python function that finds the nth fibonacci number +def nthFibonacci(n: int) -> int: + if n <= 1: + return n + + dp = [0] * (n + 1) + + dp[0] = 0 + dp[1] = 1 + + for i in range(2, n + 1): + dp[i] = dp[i - 1] + dp[i - 2] + + return dp[n]