diff --git a/.github/workflows/best-practice-adherence-dev.yaml b/.github/workflows/best-practice-adherence-dev.yaml deleted file mode 100644 index 28784ec..0000000 --- a/.github/workflows/best-practice-adherence-dev.yaml +++ /dev/null @@ -1,94 +0,0 @@ -# This workflow is triggered by pushes the "backend" or "frontend" branch. -# It analyses the content of the "backend" or "frontent" folder, accordingly. - -name: Best Practices Adherence - -on: - push: - branches: - - backend - - frontend - workflow_dispatch: - -jobs: - analyze-and-report: - runs-on: ubuntu-latest - - steps: - # Step 1: Clone the repository - - name: Checkout Code - uses: actions/checkout@v4 - with: - fetch-depth: 0 # Helps SonarQube to calculate "New Code" - - # Step 2: Apply Ruff and store report - - name: Install Ruff - run: pip install ruff - - - name: Run Ruff Linting - env: - # GITHUB_REF_NAME contains the name of the branch that triggered the workflow execution - BRANCH_NAME: ${{ env.GITHUB_REF_NAME }} - run: | - mkdir -p reports - ruff check --no-cache --exit-zero --verbose --output-format json --output-file reports/ruff-report.json $BRANCH_NAME - cat reports/ruff-report.json - continue-on-error: true # The workflow continues even if linting finds issues - - # Step 3: Generate the SonarQube project properties - - name: SonarQube Project properties - env: - # GITHUB_REF_NAME contains the name of the branch that triggered the workflow execution - BRANCH_NAME: ${{ env.GITHUB_REF_NAME }} - run: | - echo "Generating the Sonar project properties file ..." - echo "# Sonar Project Properties" > sonar-project.properties - echo "sonar.projectKey=${{ vars.EOEPCA_SONAR_PROJECT_KEY }}-$BRANCH_NAME" >> sonar-project.properties - echo "sonar.projectName=${{ vars.EOEPCA_SONAR_PROJECT_NAME }} ($BRANCH_NAME)" >> sonar-project.properties - echo "sonar.projectVersion=$GITHUB_SHA" >> sonar-project.properties - echo "sonar.sourceEncoding=UTF-8" >> sonar-project.properties - echo "sonar.projectBaseDir=." >> sonar-project.properties - echo "sonar.sources=$BRANCH_NAME" >> sonar-project.properties - echo "sonar.inclusions=${{ vars.EOEPCA_SONAR_INCLUSIONS }}" >> sonar-project.properties - echo "sonar.exclusions=${{ vars.EOEPCA_SONAR_EXCLUSIONS }}" >> sonar-project.properties - echo "sonar.python.version=3.11" >> sonar-project.properties - # --- Extra reports - echo "sonar.python.ruff.reportPaths=reports/ruff-report.json" >> sonar-project.properties - # --- Custom reports - echo "#sonar.externalIssuesReportPaths=reports/reports/test-report-1.json" >> sonar-project.properties - - cat sonar-project.properties - - # Step 4: Run SonarQube Analysis (using the properties file generated above) - - name: SonarQube Scan - uses: sonarsource/sonarqube-scan-action@master - env: - SONAR_TOKEN: ${{ secrets.EOEPCA_SONAR_TOKEN }} - SONAR_HOST_URL: ${{ vars.EOEPCA_SONAR_HOST_URL }} - - # Step 5: Wait for Quality Gate and Fetch Report - - name: Fetch SonarQube Quality Gate Result - shell: bash - run: | - # The scan action creates a metadata file we use to find the task URL - METADATA_FILE=".scannerwork/report-task.txt" - TASK_URL=$(grep "ceTaskUrl=" $METADATA_FILE | cut -d'=' -f2) - - echo "Waiting for SonarQube background task to finish..." - - # Poll the API until the task is SUCCESS or FAILED - STATUS="PENDING" - while [ "$STATUS" == "PENDING" ] || [ "$STATUS" == "IN_PROGRESS" ]; do - sleep 5 - RESPONSE=$(curl -s -u ${{ secrets.EOEPCA_SONAR_TOKEN }}: "$TASK_URL") - STATUS=$(echo $RESPONSE | jq -r '.task.status') - echo "Current Status: $STATUS" - done - - # Fetch the final status of the Quality Gate - ANALYSIS_ID=$(echo $RESPONSE | jq -r '.task.analysisId') - GATE_URL="${{ vars.EOEPCA_SONAR_HOST_URL }}/api/qualitygates/project_status?analysisId=$ANALYSIS_ID" - - curl -s -u ${{ secrets.EOEPCA_SONAR_TOKEN }}: "$GATE_URL" > reports/sonarqube-gate-report.json - - echo "Final report saved to reports/sonarqube-gate-report.json" \ No newline at end of file diff --git a/.gitignore b/.gitignore index 45a0904..c4e48da 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,11 @@ __pycache__ build dist node_modules + +# Miscellaneous working files +reports +backend/mypy-report +subscriber +coding_best* +run_* +sonar* \ No newline at end of file diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js index 8f5e4cb..63e300c 100644 --- a/frontend/eslint.config.js +++ b/frontend/eslint.config.js @@ -11,6 +11,13 @@ export default [ //...globals.es6, ...globals.node } + }, + // Prevents ESLint to complain about unused vars/args whose name starts with '_' + rules: { + 'no-unused-vars': ['error', { + 'argsIgnorePattern': '^_', + 'varsIgnorePattern': '^_' + }] } }, { diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e7d265b..116b850 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -17,7 +17,8 @@ "vue-json-to-html-table": "^0.0.7", "vue-router": "^4.4.5", "vue3-notify": "^0.1.0", - "vuetify": "^3.7.4" + "vue3-ts-jsoneditor": "^3.4.0", + "vuetify": "^3.12.6" }, "devDependencies": { "@eslint/js": "^9.14.0", @@ -86,6 +87,97 @@ "node": ">=6.9.0" } }, + "node_modules/@codemirror/autocomplete": { + "version": "6.20.2", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.2.tgz", + "integrity": "sha512-G5FPkgIiLjOgZMjqVjvuKQ1rGPtHogLldJr33eFJdVLtmwY+giGrlv/ewljLz6b9BSQLkjxuwBc6g6omDM+YxQ==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/commands": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.3.tgz", + "integrity": "sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.6.0", + "@codemirror/view": "^6.27.0", + "@lezer/common": "^1.1.0" + } + }, + "node_modules/@codemirror/lang-json": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-json/-/lang-json-6.0.2.tgz", + "integrity": "sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@lezer/json": "^1.0.0" + } + }, + "node_modules/@codemirror/language": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.3.tgz", + "integrity": "sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.5.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/lint": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.6.tgz", + "integrity": "sha512-6Kp7r6XfCi/D/5sdXieMfg9pJU1bUEx96WITuLU6ESaKizCz0QHFMjY/TaFSbigDdEAIgi93itLBIUETP4oK+A==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.42.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/search": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.7.0.tgz", + "integrity": "sha512-ZvGm99wc/s2cITtMT15LFdn8aH/aS+V+DqyGq/N5ZlV5vWtH+nILvC2nw0zX7ByNoHHDZ2IxxdW38O0tc5nVHg==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.37.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/state": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.6.0.tgz", + "integrity": "sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==", + "license": "MIT", + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "node_modules/@codemirror/view": { + "version": "6.43.0", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.0.tgz", + "integrity": "sha512-V7ZCLQO3Jus9hzh2jVCCPW3mO4IBMr43O37PqSUYautJSnnJF41YlgLw21x0fLJTYvJ+Vkm6Gp+qKGH9pltgXA==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.6.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, "node_modules/@csstools/color-helpers": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", @@ -713,6 +805,39 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-7.2.0.tgz", + "integrity": "sha512-IpR0bER9FY25p+e7BmFH25MZKEwFHTfRAfhOyJubgiDnoJNsSvJ7nigLraHtp4VOG/cy8D7uiV0dLkHOne5Fhw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-regular-svg-icons": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-7.2.0.tgz", + "integrity": "sha512-iycmlN51EULlQ4D/UU9WZnHiN0CvjJ2TuuCrAh+1MVdzD+4ViKYH2deNAll4XAAYlZa8WAefHR5taSK8hYmSMw==", + "license": "(CC-BY-4.0 AND MIT)", + "dependencies": { + "@fortawesome/fontawesome-common-types": "7.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-7.2.0.tgz", + "integrity": "sha512-YTVITFGN0/24PxzXrwqCgnyd7njDuzp5ZvaCx5nq/jg55kUYd94Nj8UTchBdBofi/L0nwRfjGOg0E41d2u9T1w==", + "license": "(CC-BY-4.0 AND MIT)", + "dependencies": { + "@fortawesome/fontawesome-common-types": "7.2.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -778,11 +903,124 @@ "node": ">=12" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsep-plugin/assignment": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz", + "integrity": "sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==", + "license": "MIT", + "engines": { + "node": ">= 10.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" + } + }, + "node_modules/@jsep-plugin/regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.4.tgz", + "integrity": "sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==", + "license": "MIT", + "engines": { + "node": ">= 10.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" + } + }, + "node_modules/@jsonquerylang/jsonquery": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@jsonquerylang/jsonquery/-/jsonquery-5.1.1.tgz", + "integrity": "sha512-Fj4SoA6Ku09EF+t7OEI8QLipA2A+fJCdEOwnDWG84o5jXMRjkcN5NCMH7kFZb5fP62xz914XV5LBOiDdiUXObg==", + "license": "ISC", + "bin": { + "jsonquery": "bin/cli.js" + } + }, + "node_modules/@lezer/common": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.2.tgz", + "integrity": "sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==", + "license": "MIT" + }, + "node_modules/@lezer/highlight": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz", + "integrity": "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.3.0" + } + }, + "node_modules/@lezer/json": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@lezer/json/-/json-1.0.3.tgz", + "integrity": "sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.10.tgz", + "integrity": "sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", + "license": "MIT" + }, "node_modules/@mdi/font": { "version": "7.4.47", "resolved": "https://registry.npmjs.org/@mdi/font/-/font-7.4.47.tgz", @@ -816,6 +1054,17 @@ "url": "https://opencollective.com/pkgr" } }, + "node_modules/@replit/codemirror-indentation-markers": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/@replit/codemirror-indentation-markers/-/codemirror-indentation-markers-6.5.3.tgz", + "integrity": "sha512-hL5Sfvw3C1vgg7GolLe/uxX5T3tmgOA3ZzqlMv47zjU1ON51pzNWiVbS22oh6crYhtVhv8b3gdXwoYp++2ilHw==", + "license": "MIT", + "peerDependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.53.3", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", @@ -1091,11 +1340,25 @@ "url": "https://github.com/sindresorhus/is?sponsor=1" } }, + "node_modules/@sphinxxxx/color-conversion": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz", + "integrity": "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw==", + "license": "ISC" + }, + "node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.9.tgz", + "integrity": "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" }, "node_modules/@types/json-schema": { "version": "7.0.15", @@ -1103,6 +1366,12 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT" + }, "node_modules/@vitejs/plugin-vue": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.4.tgz", @@ -1387,7 +1656,6 @@ "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -1459,6 +1727,15 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/aria-query": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz", + "integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -1483,6 +1760,15 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1578,6 +1864,26 @@ "node": ">= 16" } }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/codemirror-wrapped-line-indent": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/codemirror-wrapped-line-indent/-/codemirror-wrapped-line-indent-1.0.9.tgz", + "integrity": "sha512-oc976hHLt35u6Ojbhub+IWOxEpapZSqYieLEdGhsgFZ4rtYQtdb5KjxzgjCCyVe3t0yk+a6hmaIOEsjU/tZRxQ==", + "license": "MIT", + "peerDependencies": { + "@codemirror/language": "^6.9.0", + "@codemirror/state": "^6.2.1", + "@codemirror/view": "^6.17.1" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1632,6 +1938,12 @@ "proto-list": "~1.2.1" } }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "license": "MIT" + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -1735,6 +2047,21 @@ "node": ">=0.4.0" } }, + "node_modules/devalue": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.8.1.tgz", + "integrity": "sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==", + "license": "MIT" + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -2020,6 +2347,12 @@ "node": "*" } }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "license": "MIT" + }, "node_modules/espree": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", @@ -2049,6 +2382,23 @@ "node": ">=0.10" } }, + "node_modules/esrap": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.8.tgz", + "integrity": "sha512-MPweq2EvEGj8jwOI7Hgycw/QIHzqA1EbAM8lG7p+FBfZbZq/hQ6h3AMsqnu/djzisH1KVWNzbb7LSgIVtMlPSg==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "peerDependencies": { + "@typescript-eslint/types": "^8.2.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/types": { + "optional": true + } + } + }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -2096,8 +2446,7 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-diff": { "version": "1.3.0", @@ -2117,6 +2466,22 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -2352,6 +2717,12 @@ "node": ">= 4" } }, + "node_modules/immutable-json-patch": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/immutable-json-patch/-/immutable-json-patch-6.0.2.tgz", + "integrity": "sha512-KwCA5DXJiyldda8SPha1zB+6+vbEi5/jRRcYii/6yFXlyu9ZjiSH/wPq8Ri2Hk8iGjjTMcHW3Z21S4MOpl7sOw==", + "license": "ISC" + }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -2419,6 +2790,15 @@ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true }, + "node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2440,6 +2820,15 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/js-beautify": { "version": "1.15.4", "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.4.tgz", @@ -2531,6 +2920,15 @@ "node": ">=18" } }, + "node_modules/jsep": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", + "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", + "license": "MIT", + "engines": { + "node": ">= 10.16.0" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -2543,12 +2941,45 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/json-source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/json-source-map/-/json-source-map-0.6.1.tgz", + "integrity": "sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg==", + "license": "MIT" + }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/jsonpath-plus": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.4.0.tgz", + "integrity": "sha512-T92WWatJXmhBbKsgH/0hl+jxjdXrifi5IKeMY02DWggRxX0UElcbVzPlmgLTbvsPeW1PasQ6xE2Q75stkhGbsA==", + "license": "MIT", + "dependencies": { + "@jsep-plugin/assignment": "^1.3.0", + "@jsep-plugin/regex": "^1.0.4", + "jsep": "^1.4.0" + }, + "bin": { + "jsonpath": "bin/jsonpath-cli.js", + "jsonpath-plus": "bin/jsonpath-cli.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/jsonrepair": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/jsonrepair/-/jsonrepair-3.14.0.tgz", + "integrity": "sha512-tWPGKMZf/8UPim+fcW2EfcQ/d/7aKUrP6IECz9G3Tu6Q5dX0orSleqJ9z6sSw7qrQkjF8/Edo4DvsWBZ8H+HNg==", + "license": "ISC", + "bin": { + "jsonrepair": "bin/cli.js" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -2571,6 +3002,12 @@ "node": ">= 0.8.0" } }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "license": "MIT" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -2592,6 +3029,12 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -2618,6 +3061,12 @@ "@jridgewell/sourcemap-codec": "^1.5.0" } }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -2695,6 +3144,12 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "license": "MIT" + }, "node_modules/nopt": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", @@ -2992,6 +3447,15 @@ "node": ">=6" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", @@ -3249,6 +3713,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/style-mod": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", + "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", + "license": "MIT" + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3261,6 +3731,33 @@ "node": ">=8" } }, + "node_modules/svelte": { + "version": "5.55.7", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.55.7.tgz", + "integrity": "sha512-ymI5ykLPwIHW839E053FQbI1G+jnRFJEw3Kv5Y4njixVWywQBx+NUFpkkKyk5LIb36Fg9DVXSYpqiGekLD0hyw==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/estree": "^1.0.5", + "@types/trusted-types": "^2.0.7", + "acorn": "^8.12.1", + "aria-query": "5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "devalue": "^5.8.1", + "esm-env": "^1.2.1", + "esrap": "^2.2.4", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -3408,6 +3905,71 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "node_modules/vanilla-jsoneditor": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/vanilla-jsoneditor/-/vanilla-jsoneditor-3.12.0.tgz", + "integrity": "sha512-3cLH1jdr2t1+t9XnPkF9EiR394ty8hcVNX/GTj83RjEmkUMZyL/HvQ3e1PvQ3Be8rfH3AKcgySZYLKFfpVnjqQ==", + "license": "ISC", + "dependencies": { + "@codemirror/autocomplete": "^6.18.1", + "@codemirror/commands": "^6.7.1", + "@codemirror/lang-json": "^6.0.1", + "@codemirror/language": "^6.10.3", + "@codemirror/lint": "^6.8.2", + "@codemirror/search": "^6.5.6", + "@codemirror/state": "^6.4.1", + "@codemirror/view": "^6.34.1", + "@fortawesome/free-regular-svg-icons": "^6.6.0 || ^7.0.1", + "@fortawesome/free-solid-svg-icons": "^6.6.0 || ^7.0.1", + "@jsonquerylang/jsonquery": "^3.1.1 || ^4.0.0 || ^5.0.0", + "@lezer/highlight": "^1.2.1", + "@replit/codemirror-indentation-markers": "^6.5.3", + "ajv": "^8.17.1", + "codemirror-wrapped-line-indent": "^1.0.8", + "diff-sequences": "^29.6.3", + "immutable-json-patch": "^6.0.1", + "jmespath": "^0.16.0", + "json-source-map": "^0.6.1", + "jsonpath-plus": "^10.3.0", + "jsonrepair": "^3.0.0", + "lodash-es": "^4.17.23", + "memoize-one": "^6.0.0", + "natural-compare-lite": "^1.4.0", + "svelte": "^5.0.0", + "vanilla-picker": "^2.12.3" + } + }, + "node_modules/vanilla-jsoneditor/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==", + "license": "MIT", + "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/vanilla-jsoneditor/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==", + "license": "MIT" + }, + "node_modules/vanilla-picker": { + "version": "2.12.3", + "resolved": "https://registry.npmjs.org/vanilla-picker/-/vanilla-picker-2.12.3.tgz", + "integrity": "sha512-qVkT1E7yMbUsB2mmJNFmaXMWE2hF8ffqzMMwe9zdAikd8u2VfnsVY2HQcOUi2F38bgbxzlJBEdS1UUhOXdF9GQ==", + "license": "ISC", + "dependencies": { + "@sphinxxxx/color-conversion": "^2.2.2" + } + }, "node_modules/vite": { "version": "5.4.10", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz", @@ -3711,22 +4273,40 @@ "vue": "^3" } }, - "node_modules/vuetify": { - "version": "3.7.12", - "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.7.12.tgz", - "integrity": "sha512-cBxWXKPNl3vWc10/EEpfK4RBrCZERAHEUZCWmrJPd6v+JU0sbm4sEgIpy8IU5d1BzA1kIhknpbgYy2IqiZponA==", + "node_modules/vue3-ts-jsoneditor": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/vue3-ts-jsoneditor/-/vue3-ts-jsoneditor-3.4.0.tgz", + "integrity": "sha512-ZFVidpMMEA2uYNr31LY6l+HWM73RO8tmsPFGxP62jJt0h/Yor44UVkL4jA0yZoA2CyhX9OaYVq59bumqvYuhgA==", + "funding": [ + "https://u24.gov.ua/", + "https://savelife.in.ua/en/" + ], + "license": "MIT", + "dependencies": { + "immutable-json-patch": "^6.0.1", + "vanilla-jsoneditor": "^3.11.0" + }, "engines": { - "node": "^12.20 || >=14.13" + "node": ">=20.19.0" }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vuetify": { + "version": "3.12.6", + "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.12.6.tgz", + "integrity": "sha512-ARfflEJu+pKk+vya059qsUT/xUnYf0K6sIZdJwVh5w+kR6CJCXMQN1MONABb3Jm2kmhN/AXB4W5/MjYiKnVAFg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/johnleider" }, "peerDependencies": { "typescript": ">=4.7", - "vite-plugin-vuetify": ">=1.0.0", - "vue": "^3.3.0", - "webpack-plugin-vuetify": ">=2.0.0" + "vite-plugin-vuetify": ">=2.1.0", + "vue": "^3.5.0", + "webpack-plugin-vuetify": ">=3.1.0" }, "peerDependenciesMeta": { "typescript": { @@ -3740,6 +4320,12 @@ } } }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "license": "MIT" + }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", @@ -3977,6 +4563,12 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zimmerframe": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", + "license": "MIT" } } } diff --git a/frontend/package.json b/frontend/package.json index 9f17f54..2890432 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -20,15 +20,16 @@ }, "dependencies": { "@mdi/font": "^7.4.47", + "@vitejs/plugin-vue": "^5.1.4", "axios": "^1.7.7", "pinia": "^2.2.6", + "vite": "^5.4.10", "vue": "^3.5.12", "vue-json-to-html-table": "^0.0.7", "vue-router": "^4.4.5", - "vuetify": "^3.7.4", "vue3-notify": "^0.1.0", - "vite": "^5.4.10", - "@vitejs/plugin-vue": "^5.1.4" + "vue3-ts-jsoneditor": "^3.4.0", + "vuetify": "^3.12.6" }, "devDependencies": { "@eslint/js": "^9.14.0", diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 5a4de26..c9426ad 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -110,9 +110,10 @@ export default { menuItems: [ { title: 'Home', path: '/', icon: 'mdi-home' }, { title: 'Analysis Tools', path: '/tools', icon: 'mdi-tools' }, - { title: 'Pipelines', path: '/pipelines', icon: 'mdi-pipe' }, - { title: 'Monitoring', path: '/executions', icon: 'mdi-monitor-eye' }, - { title: 'Reports', path: '/reports', icon: 'mdi-note-text-outline' }, + { title: 'Analysis Pipelines', path: '/pipelines', icon: 'mdi-pipe' }, + { title: 'Pipelines Executions', path: '/executions', icon: 'mdi-monitor-eye' }, + { title: 'Execution Reports', path: '/reports', icon: 'mdi-note-text-outline' }, + { title: 'Pipelines Triggers', path: '/triggers', icon: 'mdi-animation-play-outline' }, { title: 'Settings', path: '/settings', icon: 'mdi-cog' }, ], userDetails: null, diff --git a/frontend/src/assets/tools.js b/frontend/src/assets/tools.js index 1698726..09d492c 100644 --- a/frontend/src/assets/tools.js +++ b/frontend/src/assets/tools.js @@ -46,3 +46,15 @@ export function removeTrailingSlashes(str) { } return str.replace(/\/+$/, ''); } + +export function jsonParse(value) { + if (typeof value !== 'string') { + return value; + } + try { + return JSON.parse(value); + } catch (error) { + console.error('Failed to JSON parse value:', error); + return value; // Returns the raw string if parsing fails + } +} \ No newline at end of file diff --git a/frontend/src/components/FilterableList.vue b/frontend/src/components/FilterableList.vue deleted file mode 100644 index ee0a130..0000000 --- a/frontend/src/components/FilterableList.vue +++ /dev/null @@ -1,111 +0,0 @@ - - - diff --git a/frontend/src/components/JSONTableViewer.vue b/frontend/src/components/JSONTableViewer.vue new file mode 100644 index 0000000..2d973a0 --- /dev/null +++ b/frontend/src/components/JSONTableViewer.vue @@ -0,0 +1,178 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/components/JsonToHtmlTable.vue b/frontend/src/components/JsonToHtmlTable.vue deleted file mode 100644 index 2bd24c3..0000000 --- a/frontend/src/components/JsonToHtmlTable.vue +++ /dev/null @@ -1,121 +0,0 @@ - - - - - diff --git a/frontend/src/components/PipelineCreationPanel.vue b/frontend/src/components/PipelineCreationPanel.vue index 70637d9..0f2aaae 100644 --- a/frontend/src/components/PipelineCreationPanel.vue +++ b/frontend/src/components/PipelineCreationPanel.vue @@ -7,7 +7,7 @@ temporary :width="800" > - + New pipeline: {{ pipelineName }} - + + + + + diff --git a/frontend/src/components/PipelineExecutionDialog.vue b/frontend/src/components/PipelineExecutionDialog.vue deleted file mode 100644 index 66453c6..0000000 --- a/frontend/src/components/PipelineExecutionDialog.vue +++ /dev/null @@ -1,208 +0,0 @@ - - - diff --git a/frontend/src/components/PipelineExecutionList.vue b/frontend/src/components/PipelineExecutionList.vue index 49cc057..d232e7e 100644 --- a/frontend/src/components/PipelineExecutionList.vue +++ b/frontend/src/components/PipelineExecutionList.vue @@ -4,9 +4,9 @@ --> - + + + @@ -188,18 +279,22 @@ import { useSettingsStore } from '@/stores/settings'; import { useAuthStore } from '@/stores/auth'; import { useToolStore } from '@/stores/tools'; import { usePipelineStore } from '@/stores/pipelines'; +import { useTriggerStore } from '@/stores/triggers'; import { formatDate } from '@/assets/tools'; -// import JsonToHtmlTable from '@/components/JsonToHtmlTable.vue' +import JSONTableViewer from '@/components/JSONTableViewer.vue'; export default { name: 'PipelineExecutionList', - // components: { - // JsonToHtmlTable - // }, + components: { + JSONTableViewer, + }, data() { return { showDetails: false, + showTriggerEvent: false, + selectedPipeline: null, + selectedTrigger: null, selectedExecution: null, itemsPerPage: 10, sortBy: [{ key: 'start_time', order: 'desc' }], @@ -210,11 +305,12 @@ export default { sortable: true, align: 'start', }, - { - title: 'Version', - key: 'version', - sortable: true, - }, + // { + // title: 'Version', + // key: 'version', + // sortable: true, + // admins_only: true, + // }, { // Only shown to admins using computed property, below title: 'User', @@ -238,8 +334,8 @@ export default { sortable: true, }, { - title: 'Progress', - key: 'progress', + title: 'Quality', + key: 'digest_quality', sortable: true, }, { @@ -256,15 +352,31 @@ export default { lastPollTime: null, errorCount: 0, maxErrors: 3, // Stop polling after 3 consecutive errors + statusColors: { + "failed": "bg-error", + "running": "bg-warning", + "starting": "bg-info", + "active": "bg-warning", + "succeeded": "bg-success", + }, + qualityColors: { + "undefined": "bg-grey", + "unknown": "bg-grey", + "pass_with_comments": "bg-warning", + "pass": "bg-success", + "fail": "bg-error", + "exception": "bg-info", + }, }; }, setup() { const settings = useSettingsStore(); - const store = usePipelineStore(); + const pipelineStore = usePipelineStore(); + const triggerStore = useTriggerStore(); const toolStore = useToolStore(); const authStore = useAuthStore(); - return { settings, store, toolStore, authStore }; + return { settings, pipelineStore, triggerStore, toolStore, authStore }; }, computed: { @@ -283,7 +395,22 @@ export default { }, mounted() { + // Called each time the Pipeline Executions page is navigated to this.refreshTools(); + this.pipelineStore.selectedPipelineId = this.$route.query['pipeline']; + this.triggerStore.selectedTriggerId = this.$route.query['trigger']; + if (this.pipelineStore.selectedPipelineId) { + this.selectedPipeline = this.pipelineStore.pipelineById(); + console.log("Selected pipeline:", this.selectedPipeline); + } else { + this.selectedPipeline = undefined; + } + if (this.pipelineStore.selectedTriggerId) { + this.selectedTrigger = this.triggerStore.triggerById(); + console.log("Selected trigger:", this.selectedTrigger); + } else { + this.selectedTrigger = undefined; + } this.refreshPipelineExecutions(); // this.isPolling = false // this.togglePolling() @@ -292,19 +419,19 @@ export default { methods: { progress(execution) { // console.log("Progress of", execution.id, execution.job_reports_count) - // console.log("Max progress:", this.store.pipelineById(execution.pipeline).tools.length) + // console.log("Max progress:", this.pipelineStore.pipelineById(execution.pipeline).tools.length) return execution.job_reports_count; }, progressMax(execution) { - // console.log("Max progress:", this.store.pipelineById(execution.pipeline).tools.length) - const pipeline = this.store.pipelineById(execution.pipeline); + // console.log("Max progress:", this.pipelineStore.pipelineById(execution.pipeline).tools.length) + const pipeline = this.pipelineStore.pipelineById(execution.pipeline); // Do not include init tools as they don't generate reports - console.log('Pipeline tools:', pipeline.tools); + // console.debug('Pipeline tools:', pipeline.tools); const analysisTools = pipeline.tools.filter( (tool) => !this.toolStore.isInitTool(tool), ); - console.log('Analysis tools:', analysisTools); + // console.debug('Analysis tools:', analysisTools); return analysisTools.length; }, @@ -313,15 +440,28 @@ export default { return value == query; }, + filterOnTriggerId(value, query, item) { + console.info('filterOnTriggerId:', value, query, item); + return value == query; + }, + async refreshTools() { await this.toolStore.fetchTools(); }, async refreshPipelineExecutions() { - console.info('Retrieving pipelines'); - await this.store.fetchPipelines(); - console.info('Retrieving pipeline executions'); - await this.store.fetchPipelineExecutions(this.store.selectedPipelineId); + this.pipelineStore.selectedPipelineId = this.selectedPipeline?.id || this.selectedPipeline; + await this.pipelineStore.fetchPipelines(); + if (this.pipelineStore.selectedPipelineId) { + console.info('Retrieving executions of pipeline', this.pipelineStore.selectedPipelineId); + await this.pipelineStore.fetchPipelineExecutions(this.pipelineStore.selectedPipelineId); + } else if (this.triggerStore.selectedTriggerId) { + console.info('Retrieving executions triggered by', this.triggerStore.selectedTriggerId); + await this.triggerStore.fetchPipelineExecutions(this.triggerStore.selectedTriggerId); + } else { + console.info('Retrieving all pipeline executions'); + await this.pipelineStore.fetchPipelineExecutions(); + } }, isUserInput(key) { @@ -329,9 +469,24 @@ export default { return inputsToKeep.includes(key) || key.includes('.'); }, + hasTriggerAndDigestQuality(execution) { + return execution.trigger_event && execution.digest?.digest_quality; + }, + + renderDigestQuality(execution) { + const quality = execution.digest_quality; + const manual_quality = execution.digest?.manual?.digest_quality; + if (quality != "undefined" && manual_quality != "undefined" && quality != manual_quality) { + // Display the manually set digest quality, if present + return (quality + ' -> ' + manual_quality).replaceAll("_", " "); + } + return quality.replaceAll("_", " "); + }, + prunePipelineExecutionDetails(execution) { const keysToKeep = [ - 'pipeline', + 'pipeline_name', // Pipeline name (inserted in the execution details below) + // 'pipeline', 'start_time', 'completion_time', 'job_reports_count', @@ -339,6 +494,8 @@ export default { 'user', 'started_by', 'usage_report', + 'digest', + 'digest_quality', // 'inputs' are filtered separately below ]; const details = Object.fromEntries( @@ -351,6 +508,9 @@ export default { this.isUserInput(key), ), ); + // Add the pipeline name + details.pipeline_name = this.pipelineStore.pipelineById(execution.pipeline).name; + // Add all inputs values if the user is admin if (this.authStore.isAdmin) { // Display all inputs to admin users details.inputs = execution.inputs; @@ -360,17 +520,61 @@ export default { return details; }, + pruneTriggerEventDetails(execution) { + console.log('pruneTriggerEventDetails for trigger event Id', execution?.trigger_event); + if (execution?.trigger_event == undefined) { + return { 'Status': 'Not trigger event found' }; + } + const event = this.triggerStore.getTriggerEventById(execution.trigger_event); + console.log('Trigger event:', event); + if (event == undefined) { + return { 'Status': 'Loading ...' }; + } + const keysToKeep = [ + 'id', + 'trigger_type_name', + 'pipeline_name', + 'event_time', + 'source', + 'event_type', + 'event_headers', + 'event_body', + ]; + const details = Object.fromEntries( + Object.entries(event).filter(([key]) => keysToKeep.includes(key)), + ); + return details; + }, + + triggerEventDetailsTitle(execution) { + console.log('triggerEventDetailsTitle for trigger event Id', execution?.trigger_event); + if (execution?.trigger_event == undefined) { + return 'No trigger event found'; + } + const event = this.triggerStore.getTriggerEventById(execution.trigger_event); + if (event == undefined) { + return 'Loading ...'; + } + return 'Trigger event: ' + event.trigger_type_name + ' received on ' + formatDate(event.event_time); + }, + viewPipelineExecutionDetails(execution) { console.log('Selected execution:', execution); this.selectedExecution = execution; this.showDetails = true; }, + viewTriggerEventDetails(execution) { + console.log('Selected execution:', execution); + this.selectedExecution = execution; + this.showTriggerEvent = true; + }, + viewPipelineExecutionReports(execution) { console.log('Selected execution:', execution); this.selectedExecution = execution; - this.store.selectedPipelineId = execution.pipeline; - this.store.selectedExecutionId = execution.id; + this.pipelineStore.selectedPipelineId = execution.pipeline; + this.pipelineStore.selectedExecutionId = execution.id; this.$router.push('/reports'); }, @@ -387,6 +591,24 @@ export default { return formatDate(date); }, + async setQualityStatus(execution, status) { + console.log('Set quality status of execution to ', execution, status); + try { + await this.pipelineStore.setExecutionQualityStatus(execution, status); + this.refreshPipelineExecutions(); + this.$notify({ + title: `Successfully changed the quality status to: ${status}`, + type: 'success', + }); + } catch (error) { + this.$notify({ + title: 'Failed to change the quality status:', + text: error, + type: 'error', + }); + } + }, + startPolling() { if (this.isPolling) return; @@ -438,10 +660,6 @@ export default { font-family: monospace; } -.first-letter { - text-transform: capitalize; -} - .nowrap { white-space: nowrap; } @@ -450,4 +668,9 @@ export default { padding: 5px; min-width: 0px; } + +.v-icon { + font-size: 26px; + min-width: 30px; +} diff --git a/frontend/src/components/PipelineExecutionPanel.vue b/frontend/src/components/PipelineExecutionPanel.vue index 9e1c4d6..5e2daa7 100644 --- a/frontend/src/components/PipelineExecutionPanel.vue +++ b/frontend/src/components/PipelineExecutionPanel.vue @@ -6,7 +6,7 @@ temporary :width="800" > - + Execute: {{ pipeline.name }} @@ -18,7 +18,9 @@ /> - + + + + + + + diff --git a/frontend/src/views/ToolsView.vue b/frontend/src/views/ToolsView.vue index c444014..05e8996 100644 --- a/frontend/src/views/ToolsView.vue +++ b/frontend/src/views/ToolsView.vue @@ -2,7 +2,7 @@

- Application Quality Analysis Tools + Analysis Tools

diff --git a/frontend/src/views/TriggersView.vue b/frontend/src/views/TriggersView.vue new file mode 100644 index 0000000..18c841e --- /dev/null +++ b/frontend/src/views/TriggersView.vue @@ -0,0 +1,20 @@ + + +